The project is organized in several targets that are defined in the Package.swift manifest file:

Diagram that represents the targets architecture

  • TuistKit: It contains the commands and Tuist’s business logic.
  • TuistEnvKit: It contains the commands and the logic to manage multiple Tuist versions in the environment.
  • TuistLoader: Contains models and utilities to load the manifest files from the disk.
  • TuistGenerator: It contains all the business logic to read the project definition and generate Xcode projects.
  • TuistGalaxy: It contains the business logic for Galaxy-specific features.
  • TuistAutomation: It contains the business logic for automation command such as build, test, or lint.
  • TuistCore: Contains the models that are specific to the Tuist domain and protocols to allow doing dependency inversion between the features in the layers above.
  • TuistSupport: Contains support utilities and extensions that are share across the other targets. They are Tuist-agnostic.
  • ProjectManifest: Contains the models that the developers can use to declare their projects in the Project.swift manifest file.
  • tuist: It’s the actual CLI that exposes the commands defined in TuistKit.
  • tuistenv: It’s the CLI of tuistenv. It exposes the commands defined in TuistEnvKit.
Information - Package.swift

The Package.swift file declares the structure of our project (a Swift package) and the Swift Package Manager uses it to generate the Xcode project and provide us with a set of commands to interact with it, like 'swift build'

Information - Tests

The targets have an associated target that contains the tests. Unit tests are located in the test targets prefixed with Tests, while integration tests are in the ones prefixed with IntegrationTests.


All generic utilities live in the TuistSupport framework. This section documents some of the utilities and how to use them.


When printing output for the user, this is the utility that should be used over the global print method. The utility provides formatting that varies depending on the terminal the process is run from, and determines whether the standard output or error should be used based on the type of content being output.

The methods from the public interface take a PrintableString as an input. Printable strings support interpolating formatted strings. For instance, if we want to tell users they need to run a command, we can do the following:

Printer.shared.print("Please run the folling command to setup the environment: \(.command("tuist up"))")
Copy the content