--- title: "ktx setup" description: "Set up or resume a local ktx project." --- `ktx setup` is the guided configuration flow for a local **ktx** project. It can create or resume `ktx.yaml`, configure LLM and embedding providers, add database and context-source connections, prepare required runtime features, build initial context, and install agent integrations. When you run bare `ktx` in an interactive terminal outside any **ktx** project, the CLI starts this same setup flow. Inside an existing project, `ktx setup` resumes from incomplete setup state or opens the setup menu. ## Command signature ```bash ktx setup [options] ``` ## Visible Options The help output intentionally keeps setup focused on the common interactive flags. Automation flags are accepted by the same command and are documented below. | Flag | Description | Default | |------|-------------|---------| | `--agents` | Install agent configuration and rules only | `false` | | `--target ` | Agent target: `claude-code`, `claude-desktop`, `codex`, `cursor`, `opencode`, or `universal` | - | | `--global` | Install agent integration into the global target scope for `claude-code` or `codex` | `false` | | `--yes` | Accept project creation and runtime install defaults where setup asks for confirmation | `false` | | `--no-input` | Disable interactive terminal input | - | Use the global `--project-dir ` option when setup should target a specific directory. ## Automation Options These flags are useful for repeatable setup in examples, tests, CI fixtures, and scripted project creation. They are not shown in `ktx setup --help`. ### Project Creation Setup resumes an existing `ktx.yaml` when one is present. When no project exists, interactive setup prompts for where to create it. In scripts, pass `--project-dir --no-input --yes` to create the target directory without prompts. ### LLM Provider | Flag | Description | |------|-------------| | `--llm-backend ` | LLM backend: `anthropic`, `vertex`, `claude-code`, or `codex` | | `--llm-backend claude-code` | Use the local Claude Code session for **ktx** LLM calls | | `--llm-backend codex` | Use local Codex authentication for **ktx** LLM calls | | `--llm-model ` | LLM model ID or backend model alias to validate and save | | `--anthropic-api-key-env ` | Environment variable containing the Anthropic API key | | `--anthropic-api-key-file ` | File containing the Anthropic API key | | `--vertex-project ` | Vertex AI project ID, `env:NAME`, or `file:/path` reference | | `--vertex-location ` | Vertex AI location, `env:NAME`, or `file:/path` reference | | `--skip-llm` | Leave LLM setup incomplete | Choose only one Anthropic credential source. Anthropic credential flags are only valid with the Anthropic backend; Vertex flags are only valid with the Vertex backend. The `claude-code` and `codex` backends use local authentication instead of Anthropic API key or Vertex flags. For Claude Code, `--llm-model` accepts `sonnet`, `opus`, `haiku`, or a full Claude model ID. For Codex, `--llm-model` accepts `codex`, `default`, or a `gpt-*` / `codex-*` model ID such as `gpt-5.5`; any other value is rejected before the auth probe. Run `codex` to see the models available to your login, and pick a `gpt-*` / `codex-*` id from that list. Note that `*-codex` API-billing model IDs (for example `gpt-5.3-codex`) are not available to ChatGPT-subscription logins. ### Embeddings | Flag | Description | |------|-------------| | `--embedding-backend ` | Embedding backend: `openai` or `sentence-transformers` | | `--embedding-api-key-env ` | Environment variable containing the embedding provider API key | | `--embedding-api-key-file ` | File containing the embedding provider API key | | `--skip-embeddings` | Leave embedding setup incomplete | `sentence-transformers` uses the **ktx**-managed Python runtime. Choose only one embedding credential source. ### Runtime Setup prepares the managed Python runtime when your selected configuration needs it. In the full setup flow, the runtime step runs after database and context-source setup and before the initial context build. **ktx** prepares the `core` runtime feature when query-history ingest, Looker context-source ingest, database introspection fallback, or daemon-backed context build paths need it. **ktx** prepares the `local-embeddings` runtime feature when you choose managed local `sentence-transformers` embeddings. Existing external daemon URLs, such as `KTX_DAEMON_URL` or `KTX_SQL_ANALYSIS_URL`, satisfy the matching dependency and skip managed runtime installation for that dependency. `ktx setup --agents` doesn't prepare runtime features or build context. It only installs agent configuration and rules. Start MCP with `ktx mcp start` before using HTTP-based agents; MCP startup prepares the runtime it needs. Interactive setup prompts before installing runtime features. Use `--yes` to install them without prompting. Use `--no-input` to fail fast when required runtime features are missing. ### Databases | Flag | Description | |------|-------------| | `--database ` | Database driver to configure; repeatable. Choices: `sqlite`, `postgres`, `mysql`, `clickhouse`, `sqlserver`, `bigquery`, `snowflake` | | `--database-connection-id ` | Existing selected connection id; repeatable. With `--database` or `--database-url`, connection id for the new connection. | | `--database-url ` | URL, `env:NAME`, or `file:/path` for one new URL-style database connection; also used as the SQLite path | | `--database-schema ` | Database schema or dataset to include; repeatable | | `--skip-databases` | Leave database setup incomplete | **ktx** needs at least one database connection before it can build database context. Use `--skip-databases` only when intentionally leaving the project incomplete. `--database-schema` maps to the driver's scope field: `schemas` for PostgreSQL, MySQL, and SQL Server; `schema_names` for Snowflake; `dataset_ids` for BigQuery; and `databases` for ClickHouse. ### Query History | Flag | Description | |------|-------------| | `--enable-query-history` | Enable query-history ingest when the selected database supports it | | `--disable-query-history` | Disable query-history ingest for the selected database | | `--query-history-window-days ` | BigQuery/Snowflake query-history lookback window | | `--query-history-min-executions ` | Minimum executions for a query-history template | | `--query-history-service-account-pattern ` | Query-history service-account regex; repeatable | | `--query-history-redaction-pattern ` | Query-history SQL-literal redaction regex; repeatable | Query history setup is supported for Postgres, BigQuery, and Snowflake. The window flag applies to BigQuery and Snowflake; Postgres reads the current `pg_stat_statements` aggregate data instead of a time-windowed history table. Later `ktx ingest` runs build enriched context and need a configured model and embeddings, including when query history is enabled. When query history is enabled for PostgreSQL, Snowflake, or BigQuery, `ktx setup` runs a non-blocking readiness probe after the connection test passes. A failed probe still writes setup changes, prints the warehouse-specific grant or extension remediation, and skips query-history processing until you fix the prerequisite. If the later schema-context build also fails, interactive setup offers **Disable query history and retry** so you can finish database setup with `connections..context.queryHistory.enabled: false`. After the schema scan completes, setup can derive query-history service-account filters from in-scope history. If **ktx** finds clear operational roles, it prints each proposed exclusion with a reason and writes `connections..context.queryHistory.filters.serviceAccounts` only when you apply the proposal. In non-interactive setup with `--yes`, the proposal is applied automatically. Existing `serviceAccounts` blocks are never overwritten. For BigQuery, the remediation tells you to grant `roles/bigquery.resourceViewer` on the BigQuery project, or grant a custom role that contains `bigquery.jobs.listAll`. ### Context Sources In interactive setup, after you configure a database, choose **Skip context sources** to leave optional context-source setup complete with no sources. This is equivalent to passing `--skip-sources` in scripted setup. | Flag | Description | |------|-------------| | `--source ` | Context-source connector type: `dbt`, `metricflow`, `metabase`, `looker`, `lookml`, or `notion` | | `--source-connection-id ` | Connection id for context-source setup | | `--source-path ` | Local source path for dbt, MetricFlow, or LookML | | `--source-git-url ` | Git URL for dbt, MetricFlow, or LookML | | `--source-branch ` | Git branch for context-source setup | | `--source-subpath ` | Repo subpath for context-source setup | | `--source-auth-token-ref ` | `env:` or `file:` credential reference for source repo auth or Notion integration token | | `--source-url ` | Source service URL for Metabase or Looker | | `--source-api-key-ref ` | `env:` or `file:` API key reference for Metabase | | `--source-client-id ` | Looker client id | | `--source-client-secret-ref ` | `env:` or `file:` Looker client secret reference | | `--source-warehouse-connection-id ` | Warehouse connection id used for context-source mapping | | `--source-project-name ` | dbt project name override | | `--source-profiles-path ` | dbt profiles path | | `--source-target ` | dbt target or context-source-specific mapping target | | `--metabase-database-id ` | Metabase database id to map | | `--notion-crawl-mode ` | Notion crawl mode: `all_accessible` or `selected_roots` | | `--notion-root-page-id ` | Notion root page id; repeatable | | `--skip-sources` | Mark optional context-source setup complete with no sources | Choose only one source location: `--source-path` or `--source-git-url`. ## Examples ```bash # Run the interactive setup wizard ktx setup # Run setup for a specific project directory ktx setup --project-dir ./analytics # Use Claude Code with Opus for ktx LLM calls ktx setup \ --project-dir ./analytics \ --llm-backend claude-code \ --llm-model opus # Configure **ktx** to use local Codex authentication for LLM work ktx setup --llm-backend codex --llm-model gpt-5.5 --no-input ``` When you choose `--llm-backend codex`, setup prints a warning if the public Codex SDK and CLI surface cannot prove full Claude-Code-style isolation. The backend restricts **ktx** runtime MCP tools to each run, but Codex may still load user Codex config and built-in command execution or read-only file capabilities. ```bash # Script a Postgres connection that reads its URL from the environment ktx setup \ --project-dir ./analytics \ --no-input \ --yes \ --skip-llm \ --skip-embeddings \ --database postgres \ --database-connection-id warehouse \ --database-url env:DATABASE_URL \ --database-schema public # Enable Postgres query history while setting up a database ktx setup \ --project-dir ./analytics \ --database postgres \ --database-connection-id warehouse \ --database-url env:DATABASE_URL \ --enable-query-history \ --query-history-min-executions 5 # Add a Metabase source mapped to an existing warehouse connection ktx setup \ --source metabase \ --source-connection-id prod_metabase \ --source-url https://metabase.example.com \ --source-api-key-ref env:METABASE_API_KEY \ --source-warehouse-connection-id warehouse \ --metabase-database-id 1 # Add a Notion source that crawls selected root pages ktx setup \ --source notion \ --source-connection-id notion-main \ --source-auth-token-ref env:NOTION_TOKEN \ --notion-crawl-mode selected_roots \ --notion-root-page-id abc123def456 # Install project-scoped agent integration for Codex ktx setup --agents --target codex ``` ## Output Interactive setup renders prompts and progress messages. Use `ktx status` to check setup and context readiness after setup exits. ```text ktx project: /home/user/analytics Project ready: yes LLM ready: yes (claude-sonnet-4-6) Embeddings ready: yes (text-embedding-3-small) Databases configured: yes (postgres-warehouse) Context sources configured: yes (dbt-main) Runtime ready: yes (core) ktx context built: yes Agent integration ready: yes (codex:project) ``` Use `ktx status` for repeatable readiness checks after setup exits. ## Common errors | Error | Cause | Recovery | |-------|-------|----------| | Setup resumes an unexpected project | `KTX_PROJECT_DIR` or nearest `ktx.yaml` points to another directory | Pass `--project-dir ` explicitly | | Setup cannot run in CI | Required values are missing and `--no-input` disables prompts | Provide the relevant automation flags or create a fixture `ktx.yaml` | | Provider health check fails | Provider key, model id, Vertex project, or Vertex location is invalid | Fix the `env:` or `file:` reference and rerun setup | | Python runtime is missing | The selected setup needs runtime-backed agent, query-history, Looker, or local embedding features | Accept the interactive prompt, rerun with `--yes`, or run the suggested `ktx admin runtime install` command | | `--enable-query-history` is rejected | The selected database driver does not support query history | Use Postgres, BigQuery, or Snowflake, or rerun without query-history flags | | Source setup rejects location flags | Both `--source-path` and `--source-git-url` were supplied | Choose the local path or the Git URL, not both | | Agent integration missing | Setup skipped the agents step | Run `ktx setup --agents --target ` | | Agent setup cannot prompt for a target | Non-TTY `ktx setup --agents` needs a target | Run `ktx setup --agents --target ` or rerun in a TTY | | Global agent install is rejected | `--global` was used with a target other than `claude-code` or `codex` | Omit `--global`, or choose `--target claude-code` or `--target codex` |