id = "turbo" name = "Turborepo" homepage = "https://turborepo.dev" description = "Turborepo is the build system for coding agents." icon = "SimpleIcons:turborepo" executables = ["turbo"] [dotfiles] # crates/turborepo-auth/src/lib.rs names the pieces: # TURBO_TOKEN_DIR = "turborepo" # TURBO_TOKEN_FILE = "config.json" # TURBO_AUTH_FILE = "auth.json" # and crates/turborepo-config/src/file.rs joins them onto the config directory: # global_config_path() -> config_dir.join_components(&[TURBO_TOKEN_DIR, TURBO_TOKEN_FILE]) # global_auth_path() -> config_dir.join_components(&[TURBO_TOKEN_DIR, TURBO_AUTH_FILE]) # config_dir is crates/turborepo-dirs/src/lib.rs's wrapper around # dirs_next::config_dir — ~/.config on Linux, ~/Library/Application Support on # macOS, %APPDATA% on Windows, which is `[appData]`. # # turbo.json and .turbo/config.json belong to the repository, not here. paths = ["[appData]/turborepo/config.json"] exclude = [] # auth.json is a map of API URL to remote-cache token and nothing else, so the # whole file is a credential. Both the current directory and the legacy Vercel # CLI one that turbo still falls back to reading are listed — turbo resolves # both through the same config_dir, so both are under `[appData]`. secret = [ "[appData]/turborepo/auth.json", "[appData]/com.vercel.cli/auth.json", ] # Read at the start of a `turbo` run. side_effect = false # The same config.json carries the remote-cache token — `token` in # crates/turborepo-config/src/lib.rs's ConfigurationOptions — beside the team # and API settings that are worth syncing, so the field is lifted rather than # the file withheld. The base directory is one path on every platform, so # there is no second spelling for the rule to miss. [[dotfiles.secret_paths]] file = "[appData]/turborepo/config.json" match = { key_path = ["token"] } [commands] format = 1 label = "Turborepo" description = "Monorepo build system. Forms cover run and prune; remote cache login is left out." quality = "ai-draft" base = "fig:turbo" parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false } [[commands.source]] id = "fig" kind = "completion" url = "https://github.com/withfig/autocomplete/blob/master/src/turbo.ts" license = "MIT" [[commands.subcommand]] path = ["run"] label = "Run tasks" description = "Run tasks across the monorepo." [[commands.subcommand.source]] id = "fig" kind = "completion" url = "https://github.com/withfig/autocomplete/blob/master/src/turbo.ts" license = "MIT" [[commands.subcommand.field]] id = "tasks" label = "Tasks" description = "Task names from turbo.json." type = "string" position = 0 multiple = true min = 1 suggestions = [{ value = "build", label = "build" }, { value = "test", label = "test" }, { value = "lint", label = "lint" }, { value = "dev", label = "dev" }] sources = ["fig"] [[commands.subcommand.field]] id = "scope" label = "Scope package" type = "string" option = ["--scope"] sources = ["fig"] [[commands.subcommand.field]] id = "since" label = "Changed since" type = "string" option = ["--since"] sources = ["fig"] [[commands.subcommand.field]] id = "concurrency" label = "Concurrency" type = "string" option = ["--concurrency"] sources = ["fig"] [[commands.subcommand.field]] id = "continue" label = "Continue on error" type = "boolean" option = ["--continue"] sources = ["fig"] [[commands.subcommand.field]] id = "force" label = "Ignore cache" type = "boolean" option = ["--force"] sources = ["fig"] [[commands.subcommand.field]] id = "no_cache" label = "Do not write cache" type = "boolean" option = ["--no-cache"] sources = ["fig"] [[commands.subcommand.field]] id = "parallel" label = "Parallel" type = "boolean" option = ["--parallel"] sources = ["fig"] [[commands.subcommand.field]] id = "graph" label = "Dot graph" type = "boolean" option = ["--graph"] sources = ["fig"] [[commands.subcommand.field]] id = "output_logs" label = "Output logs" type = "enum" option = ["--output-logs"] choices = [{ value = "new-only", label = "new-only" }, { value = "hash-only", label = "hash-only" }, { value = "full", label = "full" }, { value = "none", label = "none" }] sources = ["fig"] [[commands.subcommand.field]] id = "cache_dir" label = "Cache dir" type = "path" option = ["--cache-dir"] path = { kind = "directory", role = "input" } sources = ["fig"] [[commands.subcommand.field]] id = "no_deps" label = "Exclude dependents" type = "boolean" option = ["--no-deps"] sources = ["fig"] [[commands.subcommand.field]] id = "include_deps" label = "Include dependencies" type = "boolean" option = ["--include-dependencies"] sources = ["fig"] [[commands.subcommand.task]] id = "build" label = "Build" set = { tasks = ["build"] } fields = ["tasks", "scope"] required = ["tasks"] [[commands.subcommand.task]] id = "dev" label = "Dev (parallel, no cache)" set = { tasks = ["dev"], parallel = [true], no_cache = [true] } fields = ["tasks", "scope", "parallel", "no_cache"] required = ["tasks"] [[commands.subcommand.group]] id = "basic" label = "Basic" fields = ["tasks", "scope", "continue", "force", "no_cache", "parallel"] [[commands.subcommand.group]] id = "advanced" label = "Advanced" fields = ["graph", "output_logs", "cache_dir", "no_deps", "include_deps", "since", "concurrency"] [[commands.subcommand]] path = ["prune"] label = "Prune monorepo" description = "Create a subset of the monorepo for one package." [[commands.subcommand.source]] id = "fig" kind = "completion" url = "https://github.com/withfig/autocomplete/blob/master/src/turbo.ts" license = "MIT" [[commands.subcommand.field]] id = "scope" label = "Package" type = "string" option = ["--scope"] min = 1 sources = ["fig"] [[commands.subcommand.field]] id = "docker" label = "Docker layout" type = "boolean" option = ["--docker"] sources = ["fig"] [[commands.subcommand.task]] id = "prune" label = "Prune" fields = ["scope", "docker"] required = ["scope"] [[commands.subcommand.task]] id = "prune-docker" label = "Prune for Docker" set = { docker = [true] } fields = ["scope", "docker"] required = ["scope"] [[commands.subcommand.group]] id = "basic" label = "Basic" fields = ["scope", "docker"]