ktx/packages/cli/src
Andrey Avtomonov 0425160857
fix(cli): clear error when ktx setup has no LLM backend under --no-input (#281)
* 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.
2026-06-09 17:11:39 +00:00
..
commands fix(cli): clear error when ktx setup has no LLM backend under --no-input (#281) 2026-06-09 17:11:39 +00:00
completion feat(cli): shell completion for commands, flags, and entity names (#244) 2026-05-31 23:44:33 +02:00
connectors feat(mysql): implement columnStats using INFORMATION_SCHEMA.STATISTICS (#233) 2026-06-08 12:21:19 +02:00
context fix(cli): ensure git committer identity during ktx setup (#276) 2026-06-09 12:10:02 +02:00
io feat(cli): add Slack community CTA on errors, crashes, setup, and help (#277) 2026-06-09 12:22:56 +02:00
llm feat: add codex llm backend for ktx runtime work (#253) 2026-06-02 13:57:11 +02:00
prompts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
skills feat: trim MCP query response payloads (#240) 2026-05-30 17:54:24 +02:00
star-prompt feat: add GitHub star nudges to CLI build view and docs sidebar (#271) 2026-06-08 16:14:56 +02:00
telemetry fix(cli): classify ktx setup abandonment as aborted, not a blank error (#278) 2026-06-09 12:53:15 +02:00
update-check feat(cli): add channel-aware update notifier (#265) 2026-06-06 10:42:10 +02:00
admin-reindex.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
admin.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
bin.ts rename klo to ktx 2026-05-10 23:51:24 +02:00
clack.ts feat(cli): add channel-aware update notifier (#265) 2026-06-06 10:42:10 +02:00
claude-code-prompt-caching.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
cli-program.ts feat(cli): add Slack community CTA on errors, crashes, setup, and help (#277) 2026-06-09 12:22:56 +02:00
cli-runtime.ts feat(cli): add Slack community CTA on errors, crashes, setup, and help (#277) 2026-06-09 12:22:56 +02:00
command-schemas.ts feat: merge ingest and scan 2026-05-14 01:43:06 +02:00
command-tree.ts feat(cli): shell completion for commands, flags, and entity names (#244) 2026-05-31 23:44:33 +02:00
community-cta.ts feat(cli): add Slack community CTA on errors, crashes, setup, and help (#277) 2026-06-09 12:22:56 +02:00
connection-drivers.ts feat(cli)!: remove fast mode; ktx ingest always builds enriched context (KLO-721) (#237) 2026-05-29 17:41:04 +02:00
connection-recovery.ts feat(cli): consistent connection setup recovery and build-time gate (#257) 2026-06-03 11:08:46 +00:00
connection.ts feat(telemetry): collect PostHog $exception error reports in CLI and daemon (#262) 2026-06-05 19:36:21 +02:00
context-build-view.ts feat: add GitHub star nudges to CLI build view and docs sidebar (#271) 2026-06-08 16:14:56 +02:00
database-tree-picker.ts test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
demo-assets.ts feat(telemetry): anonymous posthog usage telemetry across node cli and python daemon (#205) 2026-05-22 18:18:47 +02:00
demo-metrics.ts fix(ingest): drive work-unit progress from tool calls, not turn counts (#269) 2026-06-08 15:30:35 +02:00
doctor.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
embedding-resolution.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
error-message.ts test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
index.ts fix(cli): resolve embedding provider explicitly and surface lane status in sl search (#192) 2026-05-21 02:21:22 +02:00
ingest-query-executor.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
ingest-report-file.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
ingest.ts fix(ingest): drive work-unit progress from tool calls, not turn counts (#269) 2026-06-08 15:30:35 +02:00
knowledge.ts feat(cli): shell completion for commands, flags, and entity names (#244) 2026-05-31 23:44:33 +02:00
links.ts feat(cli): add Slack community CTA on errors, crashes, setup, and help (#277) 2026-06-09 12:22:56 +02:00
local-adapters.ts feat(query-history): scope mining to modeled schemas by default (#258) 2026-06-03 17:19:42 +02:00
local-scan-connectors.ts test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
managed-local-embeddings.ts test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
managed-mcp-daemon.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
managed-python-command.ts feat(telemetry): anonymous posthog usage telemetry across node cli and python daemon (#205) 2026-05-22 18:18:47 +02:00
managed-python-daemon.ts test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
managed-python-http.ts test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
managed-python-runtime.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
mcp-http-server.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
mcp-server-factory.ts feat(telemetry): anonymous posthog usage telemetry across node cli and python daemon (#205) 2026-05-22 18:18:47 +02:00
mcp-stdio-server.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
memory-flow-hud.tsx fix(ingest): drive work-unit progress from tool calls, not turn counts (#269) 2026-06-08 15:30:35 +02:00
memory-flow-interactive.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
memory-flow-tui.tsx chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
next-steps.ts feat(cli): guide next action at end of ktx setup, not reruns (#256) 2026-06-03 01:00:21 +02:00
notion-page-picker.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
print-command-tree.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
progress-port-adapter.ts feat(cli): stream plain ktx ingest progress to stderr (KLO-726) (#251) 2026-06-01 23:31:31 +02:00
project-resolver.ts rename klo to ktx 2026-05-10 23:51:24 +02:00
prompt-navigation.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
proxy-env.ts fix: sanitize no_proxy for managed embeddings (#153) 2026-05-19 18:18:56 +02:00
public-ingest-copy.ts feat(cli)!: remove fast mode; ktx ingest always builds enriched context (KLO-721) (#237) 2026-05-29 17:41:04 +02:00
public-ingest.ts feat(telemetry): collect PostHog $exception error reports in CLI and daemon (#262) 2026-06-05 19:36:21 +02:00
release-version.ts refactor(release): drop release-policy.json runtime dep and next branch (#180) 2026-05-20 13:53:14 +02:00
reveal-password-prompt.ts feat(setup): wizard prompt tweaks and quieter query-history filter output (#259) 2026-06-04 14:11:08 +02:00
runtime-requirements.ts refactor: remove legacy ktx compatibility shims (#211) 2026-05-24 16:57:23 +02:00
runtime.ts refactor(release): drop release-policy.json runtime dep and next branch (#180) 2026-05-20 13:53:14 +02:00
scan.ts feat(telemetry): collect PostHog $exception error reports in CLI and daemon (#262) 2026-06-05 19:36:21 +02:00
setup-agents.ts feat(cli): add Slack community CTA on errors, crashes, setup, and help (#277) 2026-06-09 12:22:56 +02:00
setup-context.ts feat(cli): consistent connection setup recovery and build-time gate (#257) 2026-06-03 11:08:46 +00:00
setup-databases.ts feat(setup): wizard prompt tweaks and quieter query-history filter output (#259) 2026-06-04 14:11:08 +02:00
setup-demo-tour.ts feat: add GitHub star nudges to CLI build view and docs sidebar (#271) 2026-06-08 16:14:56 +02:00
setup-embeddings.ts feat(setup): wizard prompt tweaks and quieter query-history filter output (#259) 2026-06-04 14:11:08 +02:00
setup-interrupt.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
setup-models.ts fix(cli): clear error when ktx setup has no LLM backend under --no-input (#281) 2026-06-09 17:11:39 +00:00
setup-project.ts fix(cli): preserve project artifacts when ktx setup steps fail (#229) 2026-05-28 15:17:06 +02:00
setup-prompts.ts feat(cli): add Slack community CTA on errors, crashes, setup, and help (#277) 2026-06-09 12:22:56 +02:00
setup-ready-menu.ts feat(cli): guide next action at end of ktx setup, not reruns (#256) 2026-06-03 01:00:21 +02:00
setup-runtime.ts test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
setup-secrets.ts rename klo to ktx 2026-05-10 23:51:24 +02:00
setup-sources.ts feat(setup): wizard prompt tweaks and quieter query-history filter output (#259) 2026-06-04 14:11:08 +02:00
setup.ts fix(cli): classify ktx setup abandonment as aborted, not a blank error (#278) 2026-06-09 12:53:15 +02:00
sl.ts feat(setup): apply per-role LLM model presets, remove --llm-model (#268) 2026-06-08 15:30:48 +02:00
source-mapping.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
sql.ts feat(telemetry): collect PostHog $exception error reports in CLI and daemon (#262) 2026-06-05 19:36:21 +02:00
startup-profile.ts rename klo to ktx 2026-05-10 23:51:24 +02:00
status-project.ts feat: add codex llm backend for ktx runtime work (#253) 2026-06-02 13:57:11 +02:00
text-ingest.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
tree-picker-state.ts feat(cli): skip-context-sources menu + clack-style tree picker UX (#213) 2026-05-24 19:29:37 +02:00
tree-picker-tui.tsx feat(cli): skip-context-sources menu + clack-style tree picker UX (#213) 2026-05-24 19:29:37 +02:00
viz-fallback.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00