[PROPOSAL] Tuist Fastlane Plugin

Tuist version would be in two places. I wonder if eventually there’s at least some warning that we can output when those two mismatch.

The Tuist Fastlane Plugin could check if Tuist is installed locally and print a warning if the plugin version doesn’t match the Tuist binary.

You can run tuist --experimental-dump-help as documented here.

Exactly what I needed, thanks!

Here’s my proposed release plan for the Tuist Fastlane Plugin (keeping it simple for the first iteration):

Tuist release triggers Tuist Fastlane Plugin release

Every Tuist release should trigger a plugin release. Since Tuist’s release process is automated, we’d need to hook into that event.

Options:
1. GitHub Action in Tuist repo: Create an issue in the Tuist Fastlane Plugin repo with release instructions and a RELEASE label.
2. Manual step for the Release Manager: Add a task for them to create a release issue in the plugin repo.

Detecting public API changes

Tuist CLI’s public API doesn’t change often, so let’s simplify how we spot changes:
* Use tuist --experimental-dump-help to generate the API.
* Store the output in .api.json in the repo.
* For each release, compare the file to check for changes. If there are any, update the file and the plugin interface.

Publishing to Rubygems

We can fully automate publishing to Rubygems, triggered by merges to main branch.

This process might feel clunky at first, but we can improve it over time. A plugin interface generator could simplify things a lot.

What do you think?

Would you generate that file at release-time or runtime? I guess it makes sense to do it at release time to avoid latency when invoking the lane, which would otherwise have to invoke the CLI to get its schema.

When we use a dedicated token that has access to multiple repos, we can trigger the release workflow as part of the Tuist CLI release. We can take this one. Steps that need to be done when releasing the Fastlane plugin, such as updating the API based on the CLI, should be defined in a mise task. The release workflow then would call those mise tasks and create a new GitHub release.

For each release, compare the file to check for changes. If there are any, update the file and the plugin interface.

There’s not really a need to check for changes – I think we can always regenerate the API regardless of whether it changed. I don’t expect the generation to take long, so I’d skip the extra complexity to assess whether the API has changed or not.

Yes, I was thinking about generating it at release time. But to be clear, we won’t generate Tuist Fastlane Plugin interface automatically based on this file. This file, or more precisely, comparing this file with the newest Tuist CLI APIs would just help to make manual changes to Tuist Fastlane Plugin if needed.

I was under the impression that we could try to generate the Ruby API based on the --experimental-dump output? Do you think that would be too complex?

Oh, I thought that we want to manually shape the plugin’s public APIs first. Per Pedro:

We can go the extra mile of mapping the CLI schema to a Ruby interface, but we are stepping into code-generation, an schema that might introduce breaking changes… I dunno.

But sure, let me play with the plugin interface generation based on the --experimental-dump output.

Generating or not the interface at the end of the day is deciding between who validates the input arguments, either Fastlane, or the underlying process. Is there any other value of having that information in the Ruby layer?

In my opinion, there’s a lot of value in having a nicer interface in the Ruby layer:

  • Better developer experience (DX)
  • Improved documentation: the lanes are well documented
  • Consistent interfaces between the Tuist CLI and Ruby plugin at implementation time

What I’m working on now is to generate plugin lanes based on the Tuist CLI:

  • Generate a Tuist CLI API JSON file using the --experimental-dump output
  • Take the API JSON file and run a release.rb script to generate the plugin lanes, for example:
# tuist_install_action.rb
tuist_install(
  path: "/path/to/project",   
  update: true
)

# tuist_session_action.rb
tuist_session(
  path: "/path/to/project"
)

# and more 

I believe we’ve discussed that above – the Fastlane plugin makes no sense if we don’t have the interface in Ruby. At that point, you might as well use your preferred way to execute a shell command directly.

What I’m working on now is to generate plugin lanes based on the Tuist CLI: Generate a Tuist CLI API JSON file using the --experimental-dump output
Take the API JSON file and run a release.rb script to generate the plugin lanes, for example:

Yup, that makes sense to me! :raised_hands:

Sorry for bringing this up again for discussion, but I have a hard time making some of the arguments in favor of this concrete:

  • Better developer experience (DX): Are the examples of this?
  • Improved documentation: the lanes are well documented: What’s the experience of interacting with the docs? Is there a central repository where Fastlane generates documentation for all the community lanes? Are we expected to deploy a static site? Is this provided by RubyGems?
  • Consistent interfaces between the Tuist CLI and Ruby plugin at implementation time: If we proxy arguments, we wouldn’t have any inconsistency, no?
  • Better developer experience (DX): Are the examples of this?

You end up writing more idiomatic Ruby code. You also should be able to get documentation right inside your IDE.

Again, there’s no point imho in just passing arguments.

@pepicrft, if we end up generating the Ruby interface and the lane won’t be much of a maintenance burden, what’s the reason you’re pushing so hard against this one? I agree the DX improvements are minor, so I wouldn’t do this if it turned out there’s a lot of maintenance necessary to support this, otherwise, I’m totally fine with it.

My only concern is that we are increasing the surface of things to maintain and be familiar with, hence my insistence on, what’s the simplest thing that we can do that already delivers value.

I don’t think the Ruby gets more idiomatic nor the IDE experience will improve because that requires a configuration in code editors that I’d not expect people to have. Sure, the validation will be done by Fastlane, but the CLI errors are idiomatic already.

So I remain leaning on the side of building a Fastlane lane to process solving the “I don’t know how to run processes in Ruby and I’d rather run a ‘tuist’ lane”.

So I remain leaning on the side of building a Fastlane lane to process solving the “I don’t know how to run processes in Ruby and I’d rather run a ‘tuist’ lane”.

I’m leaning to giving the last call to @mollyIV – what do you think is the best next step here?

I don’t think the Ruby gets more idiomatic nor the IDE experience will improve because that requires a configuration in code editors that I’d not expect people to have.

I disagree that Ruby doesn’t get more idiomatic if you have dedicated arguments:

open = is_true ? "--open" : "--no-open"
Tuist.generate("--no-binary-cache #{open}")
# vs
Tuist.generate(no_binary_cache: true, open: is_true)

And I see the automatic conversion between the Swift ArgumentParser definitions and a Ruby lane as a cool piece of tech that would be interesting outside of Tuist.

As I mentioned previously, if the maintenance burden is too high, then I wouldn’t do it.

We can also initially have the code under @mollyIV before making it official and taking on the responsibility of maintaining it.

If you have this:

module Tuist
  def self.generate(**kwargs)
    # implementation
  end
end

then you can do `Tuist.generate(no_binary_cache: true, open: is_true)

Sounds good! Let’s give it a try

I have been working on Ruby interface generation and got something working:

You can check the generated actions interface here.

And you can check the interface generation script here.

I also prepared a testable demo, but I can’t upload it here. I noticed the GitHub discussions were sunset on Tuist Github. Where I can share a demo with you?

During my testing, I hit this error once:

[08:03:49]: ----------------------------
[08:03:49]: --- Step: tuist_generate ---
[08:03:49]: ----------------------------
[08:03:49]: Using tuist 4.36.0
[08:03:49]: Loading and constructing the graph
[08:03:49]: It might take a while if the cache is empty
[08:03:49]: Couldn't find resource named ProjectDescription
[08:03:49]: Consider creating an issue using the following link: https://github.com/tuist/tuist/issues/new/choose

Any ideas why?

Let me know what you think!

This is amazing, thanks @mollyIV.

Could you try to upload it now? I enabled uploads for the community forum.

The tuist CLI expects ProjectDescription.framework to be in the same directory where the executable is. Is that the case?

Thanks Pedro!

Demo.zip (8.9 KB)

The tuist CLI expects ProjectDescription.framework to be in the same directory where the executable is. Is that the case?

We are installing a Tuist binary via the install.sh script, so I’d assume I don’t need doing extra work, right?

:confused: The link doesn’t work. I need to look into the file-upload/download settings of the forum. Until then, could you send the file over to me via Slack?

@mollyIV file uploads should work fine now, so we can continue sharing the demo here.

I tried the demo, and I think I know why it’s failing. The ext directory only includes the tuist binary, but not the sidecar files like the ProjectDescription.framework:

You can compare that with a Tuist installation:

Good catch! I updated the Tuist downloading script.

gem 'fastlane-plugin-tuist', git: 'https://github.com/mollyIV/fastlane-plugin-tuist.git', ref: '7c4f94a'

image

However there’s a new error:

[09:02:06]: Using tuist 4.36.0
[09:02:06]: Loading and constructing the graph
[09:02:06]: It might take a while if the cache is empty
[09:02:07]: The 'swift' command exited with error code 255 and message:
[09:02:07]: JIT session error: Symbols not found: [ _$s18ProjectDescription13CoreDataModelVMa, _$s18ProjectDescription6SchemeVMa, _$s18ProjectDescription7ProductOMa, _$s18ProjectDescription21OnDemandResourcesTagsVMn, _$s18ProjectDescription7HeadersVMa, _$s18ProjectDescription15SourceFilesListVMn, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZ, _$s18ProjectDescription9InfoPlistO7defaultACvgZ, _$sSh18ProjectDescriptionAA11DestinationORszrlE3iOSShyACGvgZ, _$s18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0O06TargetE8GroupingOMn, _$s18ProjectDescription8SettingsVMa, _$s18ProjectDescription20ResourceFileElementsVMn, _$s18ProjectDescription0A0V7OptionsV12TextSettingsV04textE08usesTabs11indentWidth03tabJ010wrapsLinesAGSbSg_SuSgAnMtFZ, _$s18ProjectDescription0A0V7OptionsVMa, _$s18ProjectDescription14SchemeLanguageVMn, _$s18ProjectDescription16TargetDependencyOMa, _$s18ProjectDescription19ScreenCaptureFormatOMn, _$s18ProjectDescription18FileHeaderTemplateOMn, _$s18ProjectDescription14TestingOptionsVMa, _$s18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0O7enabledyA2G06TargetE8GroupingO_SbAA07TestingC0VAA14SchemeLanguageVSgSSSgAA19ScreenCaptureFormatOSgAoPtcAGmFWC, _$s18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0O06TargetE8GroupingOMa, _$s18ProjectDescription14TestingOptionsVs10SetAlgebraAAMc, _$s18ProjectDescription14SchemeLanguageVMa, _$s18ProjectDescription6TargetVMa, _$s18ProjectDescription9BuildRuleVMa, _$s18ProjectDescription17DeploymentTargetsVMn, _$s18ProjectDescription12TargetScriptVMa, _$s18ProjectDescription16MergedBinaryTypeO8disabledyA2CmFWC, _$s18ProjectDescription20ResourceFileElementsVMa, _$s18ProjectDescription15SourceFilesListV5pathsyACSayAA4PathVGFZ, _$s18ProjectDescription4PathV18relativeToManifestyACSSFZ, _$s18ProjectDescription8SettingsVMn, _$s18ProjectDescription14LaunchArgumentVMa, _$s18ProjectDescription19EnvironmentVariableVMa, _$s18ProjectDescription19ScreenCaptureFormatOMa, _$s18ProjectDescription12EntitlementsOMa, _$s18ProjectDescription0A0V7OptionsV12TextSettingsVMa, _$s18ProjectDescription0A0V4name16organizationName11classPrefix7options8packages8settings7targets7schemes18fileHeaderTemplate15additionalFiles20resourceSynthesizersACSS_SSSgAoC7OptionsVSayAA7PackageOGAA8SettingsVSgSayAA6TargetVGSayAA6SchemeVGAA04FilenO0OSgSayAA0Y7ElementOGSayAA19ResourceSynthesizerVGtcfC, _$s18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0O06TargetE8GroupingO12byNameSuffixyAIShySSG_A2KtcAImFWC, _$s18ProjectDescription4PathVMa, _$s18ProjectDescription9InfoPlistOMa, _$s18ProjectDescription17DeploymentTargetsVMa, _$s18ProjectDescription7HeadersVMn, _$s18ProjectDescription9InfoPlistOMn, _$s18ProjectDescription0A0VMa, _$s18ProjectDescription19EnvironmentVariableVMn, _$s18ProjectDescription12EntitlementsOMn, _$s18ProjectDescription21OnDemandResourcesTagsVMa, _$s18ProjectDescription11FileElementOMa, _$s18ProjectDescription16MergedBinaryTypeOMa, _$sSa18ProjectDescriptionAA19ResourceSynthesizerVRszlE7defaultSayACGvgZ, _$s18ProjectDescription15SourceFilesListVMa, _$s18ProjectDescription14TestingOptionsVMn, _$s18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0OMa, _$s18ProjectDescription7ProductO3appyA2CmFWC, _$s18ProjectDescription7PackageOMa, _$s18ProjectDescription18FileHeaderTemplateOMa, _$s18ProjectDescription0A0V7OptionsV7options016automaticSchemesC019defaultKnownRegions17developmentRegion22disableBundleAccessors0L33ShowEnvironmentVarsInScriptPhases0l19SynthesizedResourceN012textSettings05xcodeA4NameA2E09AutomaticfC0O_SaySSGSgSSSgS3bAE04TextX0VAStFZ ]
[09:02:07]: Failed to materialize symbols: { (main, { _got.$s18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0O06TargetE8GroupingOMn, _got.$s18ProjectDescription9InfoPlistOMn, _$sSS_18ProjectDescription19EnvironmentVariableVtWOc, _$s7Project7project0A11DescriptionAAVvp, _$sSh21_nonEmptyArrayLiteralShyxGSayxG_tcfCSS_Tgmq5, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA15_, _symbolic _____Sg 18ProjectDescription15SourceFilesListV, _$sSa9_getCountSiyFSS_18ProjectDescription19EnvironmentVariableVt_Tgq5, _$sSa29_hoistableIsNativeTypeCheckedSbyFSS_Tgq5, _$s18ProjectDescription15SourceFilesListVSgWOh, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA20_, _$s18ProjectDescription7HeadersVSgWOh, _got.$s18ProjectDescription20ResourceFileElementsVMn, _$sSa15_checkSubscript_20wasNativeTypeCheckeds16_DependenceTokenVSi_SbtFSS_18ProjectDescription19EnvironmentVariableVt_Tgq5, __swift_FORCE_LOAD_$_swiftXPC_$_Project, _symbolic _____Sg 18ProjectDescription8SettingsV, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription13CoreDataModelV_Tgmq5, _got.$s18ProjectDescription7HeadersVMn, _$sSa15_checkSubscript_20wasNativeTypeCheckeds16_DependenceTokenVSi_SbtFSS_Tgq5, _$s18ProjectDescription12EntitlementsOSgMD, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription6SchemeV_Tgmq5, _got.$s18ProjectDescription12EntitlementsOMn, _got.$s18ProjectDescription21OnDemandResourcesTagsVMn, _$sSD17dictionaryLiteralSDyxq_Gx_q_td_tcfCSS_18ProjectDescription19EnvironmentVariableVTgmq5, _got.$s18ProjectDescription14SchemeLanguageVMn, _$s18ProjectDescription0A0V4name16organizationName11classPrefix7options8packages8settings7targets7schemes18fileHeaderTemplate15additionalFiles20resourceSynthesizersACSS_SSSgAoC7OptionsVSayAA7PackageOGAA8SettingsVSgSayAA6TargetVGSayAA6SchemeVGAA04FilenO0OSgSayAA0Y7ElementOGSayAA19ResourceSynthesizerVGtcfcfA9_, _got.$s18ProjectDescription14TestingOptionsVMn, _$s18ProjectDescription9InfoPlistOSgMD, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA16_, _$s18ProjectDescription18FileHeaderTemplateOSgMD, __swift_FORCE_LOAD_$_swiftIOKit_$_Project, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription7PackageO_Tgmq5, _symbolic _____Sg 18ProjectDescription17DeploymentTargetsV, _$s18ProjectDescription9InfoPlistOSgWOh, _symbolic _____Sg 18ProjectDescription21OnDemandResourcesTagsV, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription9BuildRuleV_Tgmq5, _$s18ProjectDescription0A0V4name16organizationName11classPrefix7options8packages8settings7targets7schemes18fileHeaderTemplate15additionalFiles20resourceSynthesizersACSS_SSSgAoC7OptionsVSayAA7PackageOGAA8SettingsVSgSayAA6TargetVGSayAA6SchemeVGAA04FilenO0OSgSayAA0Y7ElementOGSayAA19ResourceSynthesizerVGtcfcfA3_, _$s18ProjectDescription8SettingsVSgWOh, _$s18ProjectDescription12EntitlementsOSgWOh, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription11FileElementO_Tgmq5, _$s18ProjectDescription21OnDemandResourcesTagsVSgWOh, _symbolic _____Sg 18ProjectDescription18FileHeaderTemplateO, _$s18ProjectDescription21OnDemandResourcesTagsVSgMD, _symbolic _____Sg 18ProjectDescription7HeadersV, _$sSa12_endMutationyyFSS_Tgq5, _symbolic Say_____G 18ProjectDescription14TestingOptionsV, _$s18ProjectDescription20ResourceFileElementsVSgWOh, _symbolic _____ySSG s11_SetStorageC, _$ss22__RawDictionaryStorageC4findys10_HashTableV6BucketV6bucket_Sb5foundtxSHRzlFSS_Tgq5, _$ss12_ArrayBufferV19_getElementSlowPathyyXlSiFSS_Tgq5, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription14LaunchArgumentV_Tgmq5, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription14TestingOptionsV_Tgmq5, _symbolic _____Sg 18ProjectDescription12EntitlementsO, _$s18ProjectDescription17DeploymentTargetsVSgWOh, _$sSa5countSivgSS_18ProjectDescription19EnvironmentVariableVt_Tgq5, _got.$s18ProjectDescription19ScreenCaptureFormatOMn, _$ss27_finalizeUninitializedArrayySayxGABnlF, _$ss22__RawDictionaryStorageC4find_9hashValues10_HashTableV6BucketV6bucket_Sb5foundtx_SitSHRzlFSS_Tgq5, _$sSa29_hoistableIsNativeTypeCheckedSbyFSS_18ProjectDescription19EnvironmentVariableVt_Tgq5, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA5_, _$sSa11_getElement_20wasNativeTypeChecked22matchingSubscriptCheckxSi_Sbs16_DependenceTokenVtFSS_18ProjectDescription19EnvironmentVariableVt_Tgq5, __swift_FORCE_LOAD_$_swift_signal_$_Project, _got.$s18ProjectDescription18FileHeaderTemplateOMn, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA17_, _$sSS_18ProjectDescription19EnvironmentVariableVtWOh, __swift_FORCE_LOAD_$_swiftsys_time_$_Project, _got.$ss11_SetStorageCMn, _$ss11_SetStorageCySSGMD, _$ss12_ArrayBufferV19_getElementSlowPathyyXlSiFSS_18ProjectDescription19EnvironmentVariableVt_Tgq5, __swift_FORCE_LOAD_$_swift_math_$_Project, _$sSa12_endMutationyyF, __swift_FORCE_LOAD_$_swift_stdio_$_Project, _$sSay18ProjectDescription14TestingOptionsVGSayxGSTsWl, _got.$s18ProjectDescription19EnvironmentVariableVMn, _$sSa11_getElement_20wasNativeTypeChecked22matchingSubscriptCheckxSi_Sbs16_DependenceTokenVtFSS_Tgq5, _$s18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0O7enabledyA2G06TargetE8GroupingO_SbAA07TestingC0VAA14SchemeLanguageVSgSSSgAA19ScreenCaptureFormatOSgAoPtcAGmFfA_, __swift_FORCE_LOAD_$_swift_time_$_Project, __swift_FORCE_LOAD_$_swiftCoreFoundation_$_Project, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription16TargetDependencyO_Tgmq5, _$s18ProjectDescription7HeadersVSgMD, _$s18ProjectDescription20ResourceFileElementsVSgMD, _got.$s18ProjectDescription15SourceFilesListVMn, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZ18ProjectDescription12TargetScriptV_Tgmq5, _$sSa9_getCountSiyFSS_Tgq5, _$s18ProjectDescription0A0V4name16organizationName11classPrefix7options8packages8settings7targets7schemes18fileHeaderTemplate15additionalFiles20resourceSynthesizersACSS_SSSgAoC7OptionsVSayAA7PackageOGAA8SettingsVSgSayAA6TargetVGSayAA6SchemeVGAA04FilenO0OSgSayAA0Y7ElementOGSayAA19ResourceSynthesizerVGtcfcfA2_, _$s18ProjectDescription15SourceFilesListVSgMD, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA18_, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA11_, _$s18ProjectDescription14TestingOptionsVACs10SetAlgebraAAWl, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA14_, _$s18ProjectDescription0A0V4name16organizationName11classPrefix7options8packages8settings7targets7schemes18fileHeaderTemplate15additionalFiles20resourceSynthesizersACSS_SSSgAoC7OptionsVSayAA7PackageOGAA8SettingsVSgSayAA6TargetVGSayAA6SchemeVGAA04FilenO0OSgSayAA0Y7ElementOGSayAA19ResourceSynthesizerVGtcfcfA8_, ___swift_instantiateConcreteTypeFromMangledNameAbstract, _$sSS12_createEmpty19withInitialCapacitySSSi_tFZ, _$s18ProjectDescription17DeploymentTargetsVSgMD, _$sSa22_allocateUninitializedySayxG_SpyxGtSiFZSS_18ProjectDescription19EnvironmentVariableVt_Tgmq5, ___swift_allocate_value_buffer, _$sSS_18ProjectDescription19EnvironmentVariableVtMD, _symbolic _____ySS_____G s18_DictionaryStorageC 18ProjectDescription19EnvironmentVariableV, __swift_FORCE_LOAD_$_swiftFoundation_$_Project, _symbolic _____Sg 18ProjectDescription20ResourceFileElementsV, _symbolic _____21targetSchemesGrouping_Sb19codeCoverageEnabled_____14testingOptions_____Sg12testLanguageSSSg0I6Region_____Sg0I19ScreenCaptureFormatAG03runJ0AI0oK0t 18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0O06TargetE8GroupingO AA07TestingC0V AA14SchemeLanguageV AA19ScreenCaptureFormatO, _symbolic _____ySSG s23_ContiguousArrayStorageC, _$s18ProjectDescription8SettingsVSgMD, _$ss23_ContiguousArrayStorageCySSGMD, __swift_FORCE_LOAD_$_swift_Builtin_float_$_Project, _$sSa13_adoptStorage_5countSayxG_SpyxGts016_ContiguousArrayB0CyxGn_SitFZSS_Tgmq5, _got.$s18ProjectDescription17DeploymentTargetsVMn, _$sSa5countSivgSS_Tgq5, _$sSay18ProjectDescription14TestingOptionsVGMD, _symbolic SS______t 18ProjectDescription19EnvironmentVariableV, _got.$ss23_ContiguousArrayStorageCMn, _$s18ProjectDescription14TestingOptionsVACs10SetAlgebraAAWL, __swift_FORCE_LOAD_$_swift_errno_$_Project, _got.$ss18_DictionaryStorageCMn, _main, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA19_, __swift_FORCE_LOAD_$_swiftunistd_$_Project, _$s18ProjectDescription0A0V4name16organizationName11classPrefix7options8packages8settings7targets7schemes18fileHeaderTemplate15additionalFiles20resourceSynthesizersACSS_SSSgAoC7OptionsVSayAA7PackageOGAA8SettingsVSgSayAA6TargetVGSayAA6SchemeVGAA04FilenO0OSgSayAA0Y7ElementOGSayAA19ResourceSynthesizerVGtcfcfA6_, ___swift_instantiateConcreteTypeFromMangledName, _$sSay18ProjectDescription14TestingOptionsVGSayxGSTsWL, ___swift_project_value_buffer, _$s18ProjectDescription6TargetV6target4name12destinations7product0G4Name8bundleId17deploymentTargets9infoPlist7sources9resources9copyFiles7headers12entitlements7scripts12dependencies8settings14coreDataModels20environmentVariables15launchArguments010additionalR010buildRules16mergedBinaryType9mergeable21onDemandResourcesTagsACSS_ShyAA11DestinationOGAA7ProductOSSSgSSAA010DeploymentL0VSgAA04InfoN0OSgAA06SourceR4ListVSgAA20ResourceFileElementsVSgSayAA04CopyR6ActionVGSgAA7HeadersVSgAA12EntitlementsOSgSayAA0C6ScriptVGSayAA0C10DependencyOGAA8SettingsVSgSayAA04CoreY5ModelVGSDySSAA19EnvironmentVariableVGSayAA14LaunchArgumentVGSayAA11FileElementOGSayAA9BuildRuleVGAA16MergedBinaryTypeOSbAA21OnDemandResourcesTagsVSgtFZfA12_, __swift_FORCE_LOAD_$_swiftDispatch_$_Project, __swift_FORCE_LOAD_$_swiftObjectiveC_$_Project, _symbolic _____Sg 18ProjectDescription9InfoPlistO, __swift_FORCE_LOAD_$_swiftDarwin_$_Project, _$ss27_finalizeUninitializedArrayySayxGABnlFSS_Tgq5, _$s18ProjectDescription0A0V7OptionsV016AutomaticSchemesC0O06TargetE8GroupingO06targeteG0_Sb19codeCoverageEnabledAA07TestingC0V07testingC0AA14SchemeLanguageVSg04testO0SSSg0P6RegionAA19ScreenCaptureFormatOSg0prsT0AQ03runO0AS0uQ0tMD, _got.$s18ProjectDescription8SettingsVMn, _$ss18_DictionaryStorageCySS18ProjectDescription19EnvironmentVariableVGMD }) }
[09:02:07]: 
[09:02:07]: Consider creating an issue using the following link: https://github.com/tuist/tuist/issues/new/choose
#<Thread:0x000000011300cda0 /Users/daniel/Desktop/Demo/vendor/bundle/ruby/3.0.0/bundler/gems/fastlane-plugin-tuist-7c4f94a5e5db/lib/fastlane/plugin/tuist/helper/tuist_helper.rb:47 run> terminated with exception (report_on_exception is true):
/Users/daniel/Desktop/Demo/vendor/bundle/ruby/3.0.0/bundler/gems/fastlane-plugin-tuist-7c4f94a5e5db/lib/fastlane/plugin/tuist/helper/tuist_helper.rb:48:in `each_line': closed stream (IOError)
        from /Users/daniel/Desktop/Demo/vendor/bundle/ruby/3.0.0/bundler/gems/fastlane-plugin-tuist-7c4f94a5e5db/lib/fastlane/plugin/tuist/helper/tuist_helper.rb:48:in `block (2 levels) in call_tuist_cli'

Any clue?