M0: compilable skeleton — Kigi 0.1.0 fork surgery

Hard fork of xai-org/grok-build (Apache-2.0) re-targeted as Kigi, an
unofficial Kimi Code CLI community build.

Rename & identity
- 72 xai-*/xai-grok-* crates -> kigi-* (explicit: xai-grok-pager-bin ->
  kigi-bin [binary `kigi`], xai-grok-pager -> kigi-tui; rest mechanical);
  ptyctl, ptyctl-cli, third_party/ unchanged; proto package
  xai.grok.tools.v1 -> kigi.tools.v1
- Config home ~/.kigi (KIGI_SHARE_DIR override), env prefix GROK_* ->
  KIGI_*, `kigi --version` carries the unofficial-community-build notice
- clap identity, help text, startup banner, prompt templates rebranded
  (templates re-encrypted)

Deletions (PRD removal list #5/#6/#7/#9/#10)
- voice input (xai-grok-voice) and all TUI wiring
- telemetry: Mixpanel client, external OTel stream, Sentry, OTLP layers,
  trace/GCS/S3 upload queues (kigi-file-utils halved), workspace upload
  module & dc_log, heap-profile uploader, auth-diagnostics uploader,
  session-analytics halves of feedback; local zero-egress observability
  preserved in new kigi-log crate (unified log, --debug firehose,
  subsystem file logs, opt-in instrumentation)
- announcements (crate, remote-settings fields, TUI surfaces)
- plugin marketplace (crate, sources/browse/CTA/extensions-modal tab);
  direct plugin install/uninstall/update via kigi-agent git_install kept
- relay/gateway/assets endpoints and features (agent relay, headless
  relay transport, gateway bridge, LeaderEnvUrls); leader IPC socket now
  ~/.kigi/leader.sock + KIGI_LEADER_SOCKET, no ws-url derivation
- functional types rehomed instead of deleted: PermissionMode ->
  kigi-config-types, McpInitStrategy -> kigi-mcp, PrCreationSource ->
  session signals, TerminalDiagnostics -> kigi-pager-render, agent_id ->
  shell util

Endpoints
- kigi-env rewritten: single production KigiEndpoints {coding_api_base_url
  https://api.kimi.com/coding/v1 (KIGI_CODE_BASE_URL), oauth_host
  https://auth.kimi.com (KIGI_OAUTH_HOST), update_base_url (GitHub
  Releases API), upgrade_page_url}; GrokBuildEnvironment enum deleted

Toolchain & workspace hygiene
- Rust 1.97.0 pinned; edition 2024; full cargo update; git2 hoisted to
  workspace at 0.21 (Option->Result API migration), quick-xml 0.41
- Root Cargo.toml hand-maintained (PRD §8.1): version 0.1.0 inherited by
  all members, members sorted, unused deps pruned
- cargo-deny advisories gate (deny.toml with documented transitive
  exceptions); CI workflow (check/clippy/fmt/deny/test, macOS+Linux)
- cross-crate test seams re-gated behind `test-support` cargo feature;
  insta snapshot baselines renamed to the kigi_tui prefix
- clippy --workspace --all-targets: zero warnings; fmt clean

Fixes surfaced by the port
- updater probe/installer divergence (bin/kigi vs bin/grok symlink set)
- idle model-metadata refresh dead under KIGI_CODE_BASE_URL override
  (new is_effective_coding_endpoint_url, loopback+override aware)
- macOS symlinked-TMPDIR fixture canonicalization (foreign_sessions,
  fast-worktree); RSS measurement tests serialized via serial_test

Docs & legal (Apache §4)
- NOTICE added (upstream attribution + change statement); THIRD-PARTY
  notices sustained; kigi-tools ported-code notices extended; README,
  CONTRIBUTING, SECURITY, AGENTS.md rewritten

Out of scope for M0 (tracked): Kimi auth/inference (M1), search/fetch,
command parity, config import (M2), Computer Hub excision & final
brand-token sweep (M2), distribution & self-update rewrite (M3).
This commit is contained in:
2026-07-17 05:31:01 -04:00
commit d6c20fc13f
2612 changed files with 1353757 additions and 0 deletions
@@ -0,0 +1,62 @@
name: mermaid-affordances
description: >
A ```mermaid fence renders inline as Unicode box-drawing art (drawn by the
markdown renderer), with a clickable affordance row beneath it led by a dim
"◇ mermaid" label ([Open Image] [Copy Image Path] [Copy Source]). Rendering of
the full-fidelity PNG is lazy (on click), so no diagram PNG is produced just by
detection. The PNG is NEVER transmitted as an inline image, so the treatment is
identical in every terminal and no Kitty graphics escape is emitted — asserted
against the raw PTY output.
terminal:
rows: 40
cols: 100
mock:
response: |
Here is a flow:
```mermaid
flowchart TD
A --> B
B --> C
```
Done rendering the flow.
steps:
- action: wait_for_text
text: Quit
timeout_ms: 20000
- action: type_text
text: "draw me a diagram"
- action: keys
keys: "<Enter>"
# Mermaid detection runs when the turn finishes, so the affordance row appears
# only after the response is complete. Poll for one of its buttons rather than
# asserting mid-stream.
- action: wait_for_text
text: "[Copy Source]"
timeout_ms: 30000
- action: assert_chat_completion
# The fence is rendered inline as Unicode art by the markdown renderer: a TD
# flowchart routes forward edges through "▼" arrowheads. Asserting the art (not
# the source keyword) confirms the inline diagram replaced the raw source.
- action: assert_contains
text: "▼"
# The full affordance row is plain text: [Open Image] [Copy Image Path] [Copy Source].
- action: assert_contains
text: "[Open Image]"
# The affordance row is led by the dim "◇ mermaid" label.
- action: assert_contains
text: "◇ mermaid"
# Rendering is LAZY: detection alone never dispatches a PNG render, so the row's
# transient "rendering diagram…" hint is absent until an [Open Image]/[Copy
# Image Path] click. This distinguishes lazy from eager without depending on the
# OS clipboard/viewer.
- action: assert_not_contains
text: "rendering diagram"
# The full-fidelity PNG is text + mouse hit-rects only, never an inline image.
- action: assert_no_kitty_graphics
- action: assert_not_contains
text: panicked
- action: screenshot
name: mermaid-affordances
note: Mermaid fence rendered inline as Unicode art with a clickable affordance row.