The unauthenticated welcome screen previously offered only 'Login with
Kimi Code'. It now lists every interactive platform the shell
advertises, matching the official kimi-cli picker:
Kimi Code (OAuth)
Moonshot Open Platform (API key · moonshot.cn)
Moonshot Open Platform (API key · moonshot.ai)
Quit
- Shell: new ACP auth methods moonshot-cn / moonshot-ai (advertised
after kimi-code; the BYOK first-position invariant holds).
authenticate(moonshot-*) reloads keys from env>config, fails with an
actionable message when none is configured, validates the key against
GET {base}/models (401 → 'invalid API key' naming the console), then
swaps the fresh config in, triggers the model sync, and reports
auth_mode api_key so the pager treats it like other API-key logins.
Never session-based; keys never logged.
- Config: save_platform_api_key persists [platforms.<id>].api_key via an
atomic mode-preserving write under the config lock; refuses OAuth
platforms, blank keys, and unparseable files.
- TUI: the Pending welcome renders the picker rows from the advertised
methods (arrows/Enter/mouse; 'l' keeps selecting the OAuth row).
Choosing a Moonshot row opens a masked paste box ('Paste your Moonshot
API key (from platform.moonshot.cn)'); Esc returns to the picker,
Enter persists the key and authenticates in one sequential effect;
failures return to the picker with the error line, success lands on
the normal welcome. Startup eager-auth is unchanged: a key already in
the environment authenticates exactly as before, and single-method
shells keep the historical auto-device-flow.
Gates: workspace check/clippy 0/0; shell 4870 + tui 6620 lib tests
green; headless probe advertises [kimi-code, moonshot-cn, moonshot-ai]
for a fresh user and xai.api_key-first with a key configured.
3.4 KiB
3.4 KiB
Smoke checklist (PRD F9)
F9 carries the grok-build harness capabilities forward unchanged. Each row
names the capability, the automated case that covers it (run with
CARGO_INCREMENTAL=0), and the manual probe when automation cannot reach it.
A release is smoke-clean when every row has at least one passing case.
Legend: auto = covered by the named test target in CI; manual = run the
listed command and check the listed observable.
| # | Capability | Case | How |
|---|---|---|---|
| 1 | Fullscreen TUI (mouse, themes, shortcuts, slash commands) | auto | cargo test -p kigi-tui --lib (welcome/menu/mouse/theme suites, 6.6k tests); manual spot: kigi → welcome moon renders, ctrl+q quits |
| 2 | Headless / script mode | auto | cargo test -p kigi-tui --lib headless; manual: kigi -p "Reply OK" prints the reply and exits 0 |
| 3 | ACP server | manual | printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1,"clientCapabilities":{"fs":{"readTextFile":false,"writeTextFile":false},"terminal":false}}}\n' | kigi acp → one JSON-RPC result line with "protocolVersion":1 |
| 4 | MCP client (stdio/http/oauth) | auto | cargo test -p kigi-mcp --lib, cargo test -p kigi-shell --lib util::config::mcp; manual: kigi mcp add t -- npx -y @modelcontextprotocol/server-everything then kigi mcp doctor t |
| 5 | --mcp-config-file injection |
auto | cargo test -p kigi-shell --lib util::config::mcp::tests::cli_mcp; manual: flag + x.ai/mcp/servers_updated notification lists the injected server |
| 6 | Skills | auto | cargo test -p kigi-agent --lib skills |
| 7 | Plugins (local load) | auto | cargo test -p kigi-agent --lib plugins; manual: kigi plugin list |
| 8 | Hooks | auto | cargo test -p kigi-hooks --lib and cargo test -p kigi-shell --lib hooks |
| 9 | Sandbox | auto | cargo test -p kigi-sandbox --lib |
| 10 | Checkpoint / session persistence | auto | cargo test -p kigi-shell --lib session:: (persistence/rewind suites); manual: kigi sessions lists the last session, kigi -c resumes it |
| 11 | Worktrees | auto | cargo test -p kigi-fast-worktree --lib; manual: kigi worktree list |
| 12 | Mermaid rendering | auto | cargo test -p kigi-mermaid --lib |
| 13 | Crash handling | auto | cargo test -p kigi-crash-handler --lib |
| 14 | Kimi auth (login picker: device flow + Moonshot API key) | auto | cargo test -p kigi-shell --lib auth:: (138 cases incl. live-shape fixtures) + cargo test -p kigi-shell --lib auth_method (moonshot validation); manual: kigi login completes in a browser, token lands in keyring service kigi; welcome picker also accepts a Moonshot API key into [platforms.*] in config.toml |
| 15 | Inference (ChatCompletions Kimi dialect) | auto | cargo test -p kigi-sampler (incl. test_kimi_wire); e2e: scratchpad mock flow (write → run → answer), see AGENTS.md |
| 16 | Model catalog sync (/models) |
auto | cargo test -p kigi-shell --lib models_fetch + cargo test -p kigi-models --lib |
| 17 | Search/fetch tools (OAuth-gated) | auto | cargo test -p kigi-tools --lib web_search and --lib web_fetch (Kimi wire contracts) |
| 18 | Performance budgets | auto | scripts/bench.sh — kigi --version p95 ≤ 50 ms, TUI first frame ≤ 300 ms (CI perf job) |
| 19 | Coexistence with official kimi-cli | manual | both logged in on one machine; kigi never reads/writes ~/.kimi or keyring service kimi-code (F7 import is read-only; §9 requires a 24 h parallel-use pass) |