The PRD's first acceptance gate now holds: grep -RinE '\bx\.ai\b|grok' crates/ --include='*.rs' → 0 matches (exempt: NOTICE and third-party license archives, README provenance, and the required 'Based on Grok Build Open Source' attribution, now sourced from version_attribution.txt). Wire-visible renames (both sides in this repo, changed in lockstep): - Auth method id 'grok.com' → 'kimi-code' (AuthMethodKind::KimiCode). - Every x.ai/* and _x.ai/* ACP ext method and meta key → kigi/* / _kigi/* (~200 names; grokShell → kigiShell). Session-file replay keeps a read-side alias for the legacy '_x.ai/session/update' method so existing updates.jsonl histories load; writes emit only the new name (both directions test-pinned). - Agent types grok-build* → kigi* with a documented legacy-prefix alias at resolution time so persisted sessions keep resolving. - ToolNamespace/BuiltinAgentName GrokBuild* → Kigi* (wire snake_case kigi/kigi_concise/kigi_hashline; schema regenerated); grok_build implementation dirs renamed to kigi*. - x-grok-* headers → x-kigi-*, __GROK_* sentinels → __KIGI_*, themes grokday/groknight → kigiday/kiginight (old persisted values fall back to the default theme), web_fetch allowlist xAI hosts → kimi.com + moonshot platforms, changelog CDN → this repo, grok-build changelog archives deleted. - BYOK default endpoint removed: [endpoints] api_base_url is now truly optional with NO default — consumers fail fast with the flag name when unset (no silent x.ai egress). Mock harnesses inject it explicitly. - System-prompt identity fixed: 'released by xAI' → 'an unofficial community CLI for Kimi' (template + regenerated encrypted form). Also repaired pre-existing grok-era test debt found by the sweep: the stale trace_classify default-model pin, the grok-pager UA label test, pty-harness stale-binary reuse and non-hermetic moonshot routing (a PTY test could previously reach the real api.moonshot.cn), and the outdated oauth fixture scope key. Gates: §9 grep 0; fmt clean; workspace check/clippy 0/0 (-D warnings); FULL cargo test --workspace: 234 suites, 21,961 passed, 0 failed; deny advisories ok.
76 lines
2.6 KiB
Rust
76 lines
2.6 KiB
Rust
//! Installed kigi CLI version, lockstepped with shipping binaries.
|
|
|
|
use semver::Version;
|
|
|
|
pub const TEST_VERSION_ENV: &str = "KIGI_TEST_VERSION";
|
|
|
|
pub const VERSION: &str = match option_env!("KIGI_VERSION") {
|
|
Some(v) => v,
|
|
None => env!("CARGO_PKG_VERSION"),
|
|
};
|
|
|
|
/// [`TEST_VERSION_ENV`] override first, then [`VERSION`]. Trimmed so
|
|
/// non-semver-aware callers can pass the result straight into parsing.
|
|
pub fn installed() -> String {
|
|
std::env::var(TEST_VERSION_ENV)
|
|
.map(|v| v.trim().to_string())
|
|
.unwrap_or_else(|_| VERSION.to_string())
|
|
}
|
|
|
|
pub fn installed_semver() -> Result<Version, semver::Error> {
|
|
Version::parse(&installed())
|
|
}
|
|
|
|
/// Format the compiled version with a channel label for user-facing display.
|
|
///
|
|
/// `channel_label` is a pre-formatted suffix such as `" [alpha]"`, `" [stable]"`,
|
|
/// or `""` (empty when no cached pointer is available). Obtain it from
|
|
/// `kigi_update::channel_label()`.
|
|
///
|
|
/// Example: `"0.2.5 [stable]"` or `"0.2.5 [alpha]"`.
|
|
pub fn display_version(channel_label: &str) -> String {
|
|
format!("{}{}", VERSION, channel_label)
|
|
}
|
|
|
|
/// Format a version-with-commit string with a channel label.
|
|
///
|
|
/// Same semantics as [`display_version`] but for the full
|
|
/// `"0.2.5 (abc1234)"` string.
|
|
pub fn display_version_with_commit(version_with_commit: &str, channel_label: &str) -> String {
|
|
format!("{}{}", version_with_commit, channel_label)
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
/// Display formatting invariant matrix — verifies label appending
|
|
/// works correctly across all label states (alpha, stable, empty).
|
|
#[test]
|
|
fn test_display_version_formatting_matrix() {
|
|
let cases: &[(&str, &str, &str)] = &[
|
|
// (version_with_commit, label, expected_suffix)
|
|
("0.2.5 (abc1234)", " [alpha]", "0.2.5 (abc1234) [alpha]"),
|
|
("0.2.5 (abc1234)", " [stable]", "0.2.5 (abc1234) [stable]"),
|
|
("0.2.5 (abc1234)", "", "0.2.5 (abc1234)"),
|
|
(
|
|
"0.1.220-alpha.2 (def0)",
|
|
" [alpha]",
|
|
"0.1.220-alpha.2 (def0) [alpha]",
|
|
),
|
|
];
|
|
for (vwc, label, expected) in cases {
|
|
assert_eq!(
|
|
display_version_with_commit(vwc, label),
|
|
*expected,
|
|
"display_version_with_commit({:?}, {:?})",
|
|
vwc,
|
|
label,
|
|
);
|
|
}
|
|
// display_version uses compiled VERSION — just verify the label appends
|
|
assert_eq!(display_version(""), VERSION);
|
|
assert!(display_version(" [stable]").ends_with("[stable]"));
|
|
}
|
|
}
|