refactor: drop 12 runtimes, keep Claude, Codex, OpenCode, Cursor, ZCode, Antigravity

Removes kilo, kimi, kimi-code, copilot, windsurf, augment, trae, qwen, hermes,
cline, codebuddy and pi end to end: capability descriptors, installer branches
and converters (bin/install.js 14.9k -> 11.2k lines), TypeScript converters,
hook surfaces and runtime homes, review lanes qwen/kimi-code, the two pi
migrations, Kimi payload normalization in the hook guards, dead hostBehaviors
vocabulary, launcher home probes, fixtures, runtime-specific tests and the
prose that presented them as supported.

Installer output for the six kept runtimes is byte-identical to before the
prune. The Kimi tool-vocabulary tests in workflow-guard, read-guard and
read-injection-scanner are left in place pending a decision.
This commit is contained in:
Jakub Zych
2026-10-06 20:02:40 +02:00
parent 12ee75a509
commit 6cfa0c55d2
509 changed files with 1869 additions and 47737 deletions

View File

@@ -48,7 +48,6 @@ const FULL_CONFIG = {
'review.models.opencode': 'O',
'review.models.cursor': 'U',
'review.models.agy': 'A',
'review.models.kimi-code': 'K',
'review.models.ollama': 'M',
'review.models.lm_studio': 'M',
'review.models.llama_cpp': 'M',
@@ -81,7 +80,6 @@ const CLAUDE_NATIVE_TIMEOUT_MS = 1200000;
const CODEX_NATIVE_TIMEOUT_MS = 1200000;
const CODERABBIT_NATIVE_TIMEOUT_MS = 360000;
const OPENCODE_NATIVE_TIMEOUT_MS = 660000;
const QWEN_NATIVE_TIMEOUT_MS = 900000;
const CURSOR_NATIVE_TIMEOUT_MS = 900000;
/**
* Mirrors a PRODUCTION `{{nativeTimeout}}` placeholder default resolved
@@ -89,7 +87,6 @@ const CURSOR_NATIVE_TIMEOUT_MS = 900000;
* it proves the unconfigured default reproduces this exact literal.
*/
const ANTIGRAVITY_NATIVE_TIMEOUT_MS = 600000;
const KIMI_CODE_NATIVE_TIMEOUT_MS = 900000;
/**
* One row per shipped lane: the exact argv its bash leg produced, with a model configured and
@@ -107,12 +104,10 @@ const GOLDEN = [
},
{ slug: 'coderabbit', binary: 'coderabbit', argv: ['review', '--prompt-only'], stdin: false, out: 'stdout', timeout: CODERABBIT_NATIVE_TIMEOUT_MS },
{ slug: 'opencode', binary: 'opencode', argv: ['run', '--model', 'O', '--effort', 'high', '--format', 'json', '-'], stdin: true, out: 'stdout', timeout: OPENCODE_NATIVE_TIMEOUT_MS },
{ slug: 'qwen', binary: 'qwen', argv: ['-'], stdin: true, out: 'stdout', timeout: QWEN_NATIVE_TIMEOUT_MS },
{ slug: 'cursor', binary: 'cursor-agent', argv: ['-p', '--model', 'U', '--mode', 'ask', '--trust', '--output-format', 'text', FILE_REF], stdin: false, out: 'stdout', timeout: CURSOR_NATIVE_TIMEOUT_MS },
// resolveLanePlan fully resolves {{nativeTimeout}} itself (#3274) — this row proves the
// unconfigured default reproduces the original literal exactly.
{ slug: 'antigravity', binary: 'agy', argv: ['--print-timeout', '540s', '--model', 'A', '-p', FILE_REF], stdin: false, out: 'stdout', timeout: ANTIGRAVITY_NATIVE_TIMEOUT_MS },
{ slug: 'kimi-code', binary: 'kimi', argv: ['-m', 'K', '-p', FILE_REF], stdin: false, out: 'stdout', timeout: KIMI_CODE_NATIVE_TIMEOUT_MS },
];
describe('reviewer lane invocation — golden plans (the strangler-fig contract)', () => {
@@ -176,8 +171,7 @@ describe('#3274 — timeoutConfigKey resolves the outer wall-clock cap', () => {
const r = resolve('antigravity', { config: { [AGY_KEY]: 900 } });
// 900_000 here is the arithmetic result of this test's own input (900
// configured seconds * 1000), not a reuse of any lane's *_NATIVE_TIMEOUT_MS
// golden default -- it only coincidentally matches QWEN/CURSOR/
// KIMI_CODE_NATIVE_TIMEOUT_MS (all 900000). antigravity's own native
// golden default -- it only coincidentally matches CURSOR_NATIVE_TIMEOUT_MS. antigravity's own native
// default is ANTIGRAVITY_NATIVE_TIMEOUT_MS (600000), unrelated here.
assert.equal(r.plan.timeoutMs, 900_000);
});
@@ -308,10 +302,10 @@ describe('reviewer lane invocation — model resolution', () => {
});
test('a lane declaring no model key emits no model argument', () => {
for (const slug of ['qwen', 'coderabbit']) {
for (const slug of ['coderabbit']) {
const lane = REVIEWER_LANES.find((l) => l.slug === slug);
assert.equal(lane.modelConfigKey, null, `${slug} should declare no model key`);
const r = resolve(slug, { config: { 'review.models.qwen': 'X' } });
const r = resolve(slug, { config: { 'review.models.coderabbit': 'X' } });
assert.ok(!r.plan.argv.includes('X'));
}
});
@@ -376,7 +370,7 @@ describe('reviewer lane invocation — argv-file-ref anchoring (#2176)', () => {
test('the file-ref prompt names the prompt file AND the absolute repo root', () => {
// Without the root, an argv-fed CLI does not reliably inherit the review cwd and reviews the
// plan text in isolation — exactly what the Review Instructions forbid.
for (const slug of ['cursor', 'antigravity', 'kimi-code']) {
for (const slug of ['cursor', 'antigravity']) {
const r = resolve(slug);
const arg = r.plan.argv[r.plan.argv.length - 1];
assert.ok(arg.includes(`${RUN}/msd-review-prompt.md`), `${slug} must name the prompt file`);