mirror of
https://github.com/Kaelio/ktx.git
synced 2026-06-10 08:05:14 +02:00
* fix(cli): fail clearly when ktx setup has no LLM backend under --no-input Non-interactive `ktx setup` silently defaulted the LLM backend to `anthropic` and then failed with `Missing Anthropic API key: pass --anthropic-api-key-env or --anthropic-api-key-file` — confusing for users who selected a different provider (e.g. `--target claude-code`) and never asked for the Anthropic API backend. That silent default could never succeed: it was reached only when no backend, Anthropic key, or Vertex flag was supplied, and in exactly that case the Anthropic credential resolver always failed (no env fallback in disabled mode). Unlike embeddings, the LLM has no credential-free default (anthropic needs a key, vertex needs gcloud ADC, claude-code/codex need a logged-in local CLI), so there is nothing safe to assume. `chooseBackend` now fails clearly in disabled mode with no backend, naming the (hidden) `--llm-backend` flag and its choices and noting each backend's credential needs. `--llm-backend` stays hidden in `--help`, consistent with the rest of the documented automation surface; the error message is the discovery path. - Add a unit test (no backend, disabled -> clear message) and a CLI/integration test (`--target claude-code --no-input` -> exit 1, clear message, not the Anthropic red herring). - Document the no-default behavior and add a Common-errors row in docs-site ktx-setup.mdx. * refactor(cli): single source of truth for setup LLM backends The set of LLM backends a user can pick during `ktx setup` (claude-code, codex, anthropic, vertex) was hand-enumerated in five places: the `--llm-backend` arg parser, the `KtxSetupLlmBackend` union, the interactive prompt's narrowing, the prompt options, and the missing-backend error. Only some had TypeScript coverage, so adding a backend could silently drift (e.g. a valid value rejected by the parser, or routed to anthropic by the prompt's `? : 'anthropic'` fallback). Collapse them onto one `KTX_SETUP_LLM_BACKENDS` list: - `KtxSetupLlmBackend` is derived from it. - `isKtxSetupLlmBackend` is the shared validator; the arg parser and the prompt both route through it instead of re-listing literals. - The prompt options derive from the list, with a `Record<KtxSetupLlmBackend, string>` label map so a new backend fails to compile until it has a label. - The missing-backend error builds its choice list from the same source. Behavior-preserving: identical accepted values and parse error, identical prompt options (asserted by an existing test), and the prompt's unreachable fallback now cancels rather than silently assuming anthropic.
293 lines
14 KiB
Text
293 lines
14 KiB
Text
---
|
|
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 <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 <path>` 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 <dir> --no-input --yes` to create the target directory without
|
|
prompts.
|
|
|
|
### LLM Provider
|
|
|
|
| Flag | Description |
|
|
|------|-------------|
|
|
| `--llm-backend <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 |
|
|
| `--anthropic-api-key-env <name>` | Environment variable containing the Anthropic API key |
|
|
| `--anthropic-api-key-file <path>` | File containing the Anthropic API key |
|
|
| `--vertex-project <project>` | Vertex AI project ID, `env:NAME`, or `file:/path` reference |
|
|
| `--vertex-location <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. After you choose a backend, `ktx setup`
|
|
writes that backend's per-role model preset to `ktx.yaml`. To change a model,
|
|
edit the matching `llm.models.<role>` value in `ktx.yaml`.
|
|
|
|
With `--no-input`, `ktx setup` does not assume a default LLM provider, because
|
|
every backend needs credentials only you can supply. Pass `--llm-backend`
|
|
explicitly. Note that `--target` selects the agent integration, not the LLM
|
|
provider: `ktx setup --target claude-code --no-input` still needs
|
|
`--llm-backend claude-code` to use your Claude subscription for **ktx** LLM
|
|
calls.
|
|
|
|
### Embeddings
|
|
|
|
| Flag | Description |
|
|
|------|-------------|
|
|
| `--embedding-backend <backend>` | Embedding backend: `openai` or `sentence-transformers` |
|
|
| `--embedding-api-key-env <name>` | Environment variable containing the embedding provider API key |
|
|
| `--embedding-api-key-file <path>` | 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 <driver>` | Database driver to configure; repeatable. Choices: `sqlite`, `postgres`, `mysql`, `clickhouse`, `sqlserver`, `bigquery`, `snowflake` |
|
|
| `--database-connection-id <id>` | Existing selected connection id; repeatable. With `--database` or `--database-url`, connection id for the new connection. |
|
|
| `--database-url <url>` | URL, `env:NAME`, or `file:/path` for one new URL-style database connection; also used as the SQLite path |
|
|
| `--database-schema <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 <number>` | BigQuery/Snowflake query-history lookback window |
|
|
| `--query-history-min-executions <number>` | Minimum executions for a query-history template |
|
|
| `--query-history-service-account-pattern <pattern>` | Query-history service-account regex; repeatable |
|
|
| `--query-history-redaction-pattern <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.<id>.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.<id>.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 <type>` | Context-source connector type: `dbt`, `metricflow`, `metabase`, `looker`, `lookml`, or `notion` |
|
|
| `--source-connection-id <id>` | Connection id for context-source setup |
|
|
| `--source-path <path>` | Local source path for dbt, MetricFlow, or LookML |
|
|
| `--source-git-url <url>` | Git URL for dbt, MetricFlow, or LookML |
|
|
| `--source-branch <branch>` | Git branch for context-source setup |
|
|
| `--source-subpath <path>` | Repo subpath for context-source setup |
|
|
| `--source-auth-token-ref <ref>` | `env:` or `file:` credential reference for source repo auth or Notion integration token |
|
|
| `--source-url <url>` | Source service URL for Metabase or Looker |
|
|
| `--source-api-key-ref <ref>` | `env:` or `file:` API key reference for Metabase |
|
|
| `--source-client-id <id>` | Looker client id |
|
|
| `--source-client-secret-ref <ref>` | `env:` or `file:` Looker client secret reference |
|
|
| `--source-warehouse-connection-id <id>` | Warehouse connection id used for context-source mapping |
|
|
| `--source-project-name <name>` | dbt project name override |
|
|
| `--source-profiles-path <path>` | dbt profiles path |
|
|
| `--source-target <target>` | dbt target or context-source-specific mapping target |
|
|
| `--metabase-database-id <id>` | Metabase database id to map |
|
|
| `--notion-crawl-mode <mode>` | Notion crawl mode: `all_accessible` or `selected_roots` |
|
|
| `--notion-root-page-id <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 for ktx LLM calls
|
|
ktx setup \
|
|
--project-dir ./analytics \
|
|
--llm-backend claude-code
|
|
|
|
# Configure **ktx** to use local Codex authentication for LLM work
|
|
ktx setup --llm-backend codex --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 <path>` 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` |
|
|
| `Missing LLM backend: pass --llm-backend …` | `--no-input` setup ran without an LLM backend; `--target` does not select one | Pass `--llm-backend claude-code`, `codex`, `anthropic`, or `vertex` (with that backend's credential flags) |
|
|
| 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 <target>` |
|
|
| Agent setup cannot prompt for a target | Non-TTY `ktx setup --agents` needs a target | Run `ktx setup --agents --target <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` |
|