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,126 @@
//! `grok completions <shell>` — generate shell completion scripts.
//!
//! Used by the installers and npm postinstall; must stay side-effect free
//! (no network, auth, tracing, or tokio).
use clap::CommandFactory as _;
use clap_complete::{Shell, generate};
use crate::app::PagerArgs;
/// Generate and print the completion script for the given shell.
pub fn run(shell: Shell) {
// Ensure the script always uses the public "grok" name (matches historical
// behavior and what the installers + docs expect).
let mut cmd = PagerArgs::command().name("grok");
if shell != Shell::Zsh {
generate(shell, &mut cmd, "grok", &mut std::io::stdout());
return;
}
// zsh needs post-processing (see fix_zsh_root_prompt_positional).
let mut buf = Vec::new();
generate(shell, &mut cmd, "grok", &mut buf);
match String::from_utf8(buf) {
Ok(script) => print!("{}", fix_zsh_root_prompt_positional(&script)),
// clap_complete output is generated from Rust strings, so this arm is
// unreachable in practice — but the installers run this command, so
// emit the unmodified script rather than panic.
Err(e) => {
use std::io::Write as _;
let _ = std::io::stdout().write_all(e.as_bytes());
}
}
}
/// Work around clap_complete's broken zsh output for an optional free-form
/// positional (`[PROMPT]`) preceding the subcommand slot
/// (<https://github.com/clap-rs/clap/issues/6282>).
///
/// The generated root `_arguments` spec emits a `'::prompt …'` slot before
/// the subcommand slot but dispatches subcommands with `case $line[2]`. zsh
/// assigns the typed subcommand to the *prompt* slot (`$line[1]`), leaves
/// `$line[2]` empty, and the dispatch falls through — so `grok worktree <TAB>`
/// re-offers every top-level command. (`hide = true` on the positional does
/// not change the generated script.)
///
/// Completing an arbitrary prompt string is useless, so drop the prompt slot
/// and shift the root dispatch to `$line[1]`. Nested subcommand dispatch
/// blocks already use `$line[1]` and are untouched; the three rewritten
/// patterns are unique to the root block (pinned by the test below — delete
/// this whole workaround once upstream fixes the generator).
fn fix_zsh_root_prompt_positional(script: &str) -> String {
let mut out = String::with_capacity(script.len());
script
.lines()
// "prompt" is the clap arg id of the root positional.
.filter(|line| !line.starts_with("'::prompt -- "))
.for_each(|line| {
out.push_str(line);
out.push('\n');
});
for (from, to) in [
(
r#"words=($line[2] "${words[@]}")"#,
r#"words=($line[1] "${words[@]}")"#,
),
(
r#"curcontext="${curcontext%:*:*}:grok-command-$line[2]:""#,
r#"curcontext="${curcontext%:*:*}:grok-command-$line[1]:""#,
),
(r#"case $line[2] in"#, r#"case $line[1] in"#),
] {
out = out.replacen(from, to, 1);
}
out
}
#[cfg(test)]
mod tests {
use super::*;
/// Generate the zsh completion script exactly like `run` does.
fn zsh_script() -> String {
let mut cmd = PagerArgs::command().name("grok");
let mut buf = Vec::new();
generate(Shell::Zsh, &mut cmd, "grok", &mut buf);
String::from_utf8(buf).expect("completion script is UTF-8")
}
// The optional `[PROMPT]` positional (app/cli.rs) makes clap_complete emit
// a `::prompt` slot before the subcommand slot and dispatch on `$line[2]`,
// so `grok worktree <TAB>` re-offered every top-level command (upstream
// clap-rs/clap#6282).
#[test]
fn zsh_completions_drop_prompt_slot_and_dispatch_on_line_1() {
let raw = zsh_script();
// Preconditions: the workaround is still needed. If these start
// failing, clap_complete fixed the positional handling — delete
// `fix_zsh_root_prompt_positional` instead of updating the test.
assert!(raw.contains("'::prompt -- "), "raw script has prompt slot");
assert!(
raw.contains("case $line[2] in"),
"raw root dispatch on $line[2]"
);
let fixed = fix_zsh_root_prompt_positional(&raw);
assert!(
!fixed.contains("::prompt"),
"prompt positional must not appear in the emitted zsh script"
);
assert!(
!fixed.contains("$line[2]"),
"root dispatch must be shifted to $line[1]"
);
assert!(
fixed.contains(r#"curcontext="${curcontext%:*:*}:grok-command-$line[1]:""#),
"root dispatch context must use $line[1]"
);
// Subcommand dispatch blocks (already on $line[1]) must survive.
assert!(
fixed.contains("grok-worktree-command-$line[1]"),
"nested subcommand dispatch must be untouched"
);
// The subcommand list itself must still be offered at the root.
assert!(fixed.contains("_grok_commands"), "root command list intact");
}
}