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:
@@ -5759,34 +5759,6 @@ describe('issue #2517: RUNTIME_PROFILE_MAP single source of truth (finding #16)'
|
||||
// Antigravity (which runs on the Gemini backend and carries its own
|
||||
// runtimeTierDefaults); Antigravity's tier resolution is covered elsewhere.
|
||||
|
||||
// ─── Issue #2612: qwen runtime tier resolution ───────────────────────────────
|
||||
describe('issue #2612: runtime "qwen" — Qwen tier resolution', () => {
|
||||
let tmpDir;
|
||||
beforeEach(() => { isolateHome(); tmpDir = createTempProject(); resetRuntimeWarningCaches(); });
|
||||
afterEach(() => { cleanup(tmpDir); restoreHome(); });
|
||||
|
||||
test('opus tier -> qwen3-max-2026-01-23', () => {
|
||||
writeConfig(tmpDir, { runtime: 'qwen', model_profile: 'quality' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-planner'), 'qwen3-max-2026-01-23');
|
||||
});
|
||||
|
||||
test('sonnet tier -> qwen3-coder-plus', () => {
|
||||
writeConfig(tmpDir, { runtime: 'qwen', model_profile: 'balanced' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-roadmapper'), 'qwen3-coder-plus');
|
||||
});
|
||||
|
||||
test('haiku tier -> qwen3-coder-next', () => {
|
||||
writeConfig(tmpDir, { runtime: 'qwen', model_profile: 'budget' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-codebase-mapper'), 'qwen3-coder-next');
|
||||
});
|
||||
|
||||
test('qwen: effort resolves universally but render param is null (no wire param)', () => {
|
||||
writeConfig(tmpDir, { runtime: 'qwen', model_profile: 'quality' });
|
||||
const eff = resolveEffortInternal(tmpDir, 'msd-planner');
|
||||
assert.strictEqual(renderEffortForRuntime('qwen', eff).param, null);
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Issue #2612: opencode runtime tier resolution ───────────────────────────
|
||||
describe('issue #2612: runtime "opencode" — OpenCode tier resolution', () => {
|
||||
let tmpDir;
|
||||
@@ -5815,64 +5787,6 @@ describe('issue #2612: runtime "opencode" — OpenCode tier resolution', () => {
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Issue #2093: kilo runtime tier resolution ───────────────────────────────
|
||||
// Kilo is an OpenCode fork and shares the IDENTICAL built-in tier IDs (UPGRADE 2
|
||||
// / ADR-1239). Kilo moved from Group B (no built-in defaults) to Group A here.
|
||||
describe('issue #2093: runtime "kilo" — Kilo tier resolution', () => {
|
||||
let tmpDir;
|
||||
beforeEach(() => { isolateHome(); tmpDir = createTempProject(); resetRuntimeWarningCaches(); });
|
||||
afterEach(() => { cleanup(tmpDir); restoreHome(); });
|
||||
|
||||
test('opus tier -> anthropic/claude-opus-4-8', () => {
|
||||
writeConfig(tmpDir, { runtime: 'kilo', model_profile: 'quality' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-planner'), 'anthropic/claude-opus-4-8');
|
||||
});
|
||||
|
||||
test('sonnet tier -> anthropic/claude-sonnet-5', () => {
|
||||
writeConfig(tmpDir, { runtime: 'kilo', model_profile: 'balanced' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-roadmapper'), 'anthropic/claude-sonnet-5');
|
||||
});
|
||||
|
||||
test('haiku tier -> anthropic/claude-haiku-4-5', () => {
|
||||
writeConfig(tmpDir, { runtime: 'kilo', model_profile: 'budget' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-codebase-mapper'), 'anthropic/claude-haiku-4-5');
|
||||
});
|
||||
|
||||
test('kilo: effort resolves universally but render param is null (no wire param)', () => {
|
||||
writeConfig(tmpDir, { runtime: 'kilo', model_profile: 'quality' });
|
||||
const eff = resolveEffortInternal(tmpDir, 'msd-planner');
|
||||
assert.strictEqual(renderEffortForRuntime('kilo', eff).param, null);
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Issue #2612: copilot runtime tier resolution ────────────────────────────
|
||||
describe('issue #2612: runtime "copilot" — Copilot tier resolution', () => {
|
||||
let tmpDir;
|
||||
beforeEach(() => { isolateHome(); tmpDir = createTempProject(); resetRuntimeWarningCaches(); });
|
||||
afterEach(() => { cleanup(tmpDir); restoreHome(); });
|
||||
|
||||
test('opus tier -> claude-opus-4-8', () => {
|
||||
writeConfig(tmpDir, { runtime: 'copilot', model_profile: 'quality' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-planner'), 'claude-opus-4-8');
|
||||
});
|
||||
|
||||
test('sonnet tier -> claude-sonnet-5', () => {
|
||||
writeConfig(tmpDir, { runtime: 'copilot', model_profile: 'balanced' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-roadmapper'), 'claude-sonnet-5');
|
||||
});
|
||||
|
||||
test('haiku tier -> claude-haiku-4-5', () => {
|
||||
writeConfig(tmpDir, { runtime: 'copilot', model_profile: 'budget' });
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-codebase-mapper'), 'claude-haiku-4-5');
|
||||
});
|
||||
|
||||
test('copilot: effort resolves universally but render param is null (no wire param)', () => {
|
||||
writeConfig(tmpDir, { runtime: 'copilot', model_profile: 'quality' });
|
||||
const eff = resolveEffortInternal(tmpDir, 'msd-planner');
|
||||
assert.strictEqual(renderEffortForRuntime('copilot', eff).param, null);
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Issue #2612: Group B runtimes fall through (no built-in map) ────────────
|
||||
describe('issue #2612: Group B runtimes — no built-in map, use unknown-runtime fallback', () => {
|
||||
test('cursor is not in RUNTIME_PROFILE_MAP (uses unknown-runtime fallback)', () => {
|
||||
@@ -5921,25 +5835,11 @@ describe('issue #2612: Group B runtimes — no built-in map, use unknown-runtime
|
||||
});
|
||||
|
||||
// ─── Issue #2612: Partial override merge for new runtimes ────────────────────
|
||||
describe('issue #2612: partial override merge for new Group A runtimes', () => {
|
||||
describe('issue #2612: partial override merge for Group A runtimes', () => {
|
||||
let tmpDir;
|
||||
beforeEach(() => { isolateHome(); tmpDir = createTempProject(); resetRuntimeWarningCaches(); });
|
||||
afterEach(() => { cleanup(tmpDir); restoreHome(); });
|
||||
|
||||
test('qwen.opus override wins; sonnet and haiku use built-in defaults', () => {
|
||||
writeConfig(tmpDir, {
|
||||
runtime: 'qwen',
|
||||
model_profile: 'quality',
|
||||
model_profile_overrides: {
|
||||
qwen: { opus: 'qwen3-max-custom' },
|
||||
},
|
||||
});
|
||||
// opus is overridden
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-planner'), 'qwen3-max-custom');
|
||||
// sonnet not overridden — quality -> sonnet for msd-codebase-mapper
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-codebase-mapper'), 'qwen3-coder-plus');
|
||||
});
|
||||
|
||||
test('opencode.sonnet override wins; opus and haiku still use built-in defaults', () => {
|
||||
writeConfig(tmpDir, {
|
||||
runtime: 'opencode',
|
||||
@@ -5956,36 +5856,6 @@ describe('issue #2612: partial override merge for new Group A runtimes', () => {
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-codebase-mapper'), 'anthropic/claude-haiku-4-5');
|
||||
});
|
||||
|
||||
test('copilot.haiku override wins; opus and sonnet still use built-in defaults', () => {
|
||||
writeConfig(tmpDir, {
|
||||
runtime: 'copilot',
|
||||
model_profile: 'budget',
|
||||
model_profile_overrides: {
|
||||
copilot: { haiku: 'claude-haiku-4-6' },
|
||||
},
|
||||
});
|
||||
// msd-codebase-mapper budget -> haiku -> overridden
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-codebase-mapper'), 'claude-haiku-4-6');
|
||||
// msd-planner budget -> sonnet -> built-in default
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-planner'), 'claude-sonnet-5');
|
||||
});
|
||||
|
||||
// #2093: kilo just moved into Group A — same partial-merge coverage as opencode.
|
||||
test('kilo.sonnet override wins; opus and haiku still use built-in defaults', () => {
|
||||
writeConfig(tmpDir, {
|
||||
runtime: 'kilo',
|
||||
model_profile: 'balanced',
|
||||
model_profile_overrides: {
|
||||
kilo: { sonnet: 'anthropic/claude-sonnet-4-7' },
|
||||
},
|
||||
});
|
||||
// msd-planner balanced -> opus -> built-in default
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-planner'), 'anthropic/claude-opus-4-8');
|
||||
// msd-roadmapper balanced -> sonnet -> overridden
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-roadmapper'), 'anthropic/claude-sonnet-4-7');
|
||||
// msd-codebase-mapper balanced -> haiku -> built-in default (haiku not overridden)
|
||||
assert.strictEqual(resolveModelInternal(tmpDir, 'msd-codebase-mapper'), 'anthropic/claude-haiku-4-5');
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user