diff --git a/src/cmd/init.js b/src/cmd/init.js index 73bbc47..f058724 100644 --- a/src/cmd/init.js +++ b/src/cmd/init.js @@ -27,7 +27,7 @@ export default function register(program) { jsonError('agent required', 'run vit init from a coding agent'); return; } - console.error(`${name} init should be run by a coding agent (e.g. claude code, gemini cli).`); + console.error(`${name} init should be run by a coding agent (e.g. claude code, codex, gemini cli, opencode).`); console.error(`open your agent and ask it to run '${name} init' for you.`); process.exitCode = 1; return; diff --git a/src/cmd/learn.js b/src/cmd/learn.js index 30cccbc..a875b74 100644 --- a/src/cmd/learn.js +++ b/src/cmd/learn.js @@ -247,7 +247,7 @@ Examples: jsonError('agent required', 'run vit learn from a coding agent'); return; } - console.error(`${name} learn should be run by a coding agent (e.g. claude code, gemini cli).`); + console.error(`${name} learn should be run by a coding agent (e.g. claude code, codex, gemini cli, opencode).`); console.error(`open your agent and ask it to run '${name} learn' for you.`); process.exitCode = 1; return; diff --git a/src/cmd/remix.js b/src/cmd/remix.js index 744291c..919bb2f 100644 --- a/src/cmd/remix.js +++ b/src/cmd/remix.js @@ -30,7 +30,7 @@ export default function register(program) { jsonError('agent required', 'run vit remix from a coding agent'); return; } - console.error(`${name} remix should be run by a coding agent (e.g. claude code, gemini cli).`); + console.error(`${name} remix should be run by a coding agent (e.g. claude code, codex, gemini cli, opencode).`); console.error(`open your agent and ask it to run '${name} remix' for you.`); process.exitCode = 1; return; diff --git a/src/cmd/ship.js b/src/cmd/ship.js index 627d1e3..1941b6b 100644 --- a/src/cmd/ship.js +++ b/src/cmd/ship.js @@ -143,7 +143,7 @@ async function shipSkill(opts) { jsonError('agent required', 'run vit ship --skill from a coding agent'); return; } - console.error(`${name} ship --skill should be run by a coding agent (e.g. claude code, gemini cli).`); + console.error(`${name} ship --skill should be run by a coding agent (e.g. claude code, codex, gemini cli, opencode).`); console.error(`open your agent and ask it to run '${name} ship --skill' for you.`); process.exitCode = 1; return; @@ -352,7 +352,7 @@ async function shipCap(opts) { jsonError('agent required', 'run vit ship from a coding agent'); return; } - console.error(`${name} ship should be run by a coding agent (e.g. claude code, gemini cli).`); + console.error(`${name} ship should be run by a coding agent (e.g. claude code, codex, gemini cli, opencode).`); console.error(`open your agent and ask it to run '${name} ship' for you.`); console.error(`refer to the using-vit skill (skills/vit/SKILL.md) for a shipping guide.`); process.exitCode = 1; diff --git a/src/cmd/skim.js b/src/cmd/skim.js index 003317e..715f7c3 100644 --- a/src/cmd/skim.js +++ b/src/cmd/skim.js @@ -29,7 +29,7 @@ export default function register(program) { try { const gate = requireAgent(); if (!gate.ok) { - console.error(`${name} skim should be run by a coding agent (e.g. claude code, gemini cli).`); + console.error(`${name} skim should be run by a coding agent (e.g. claude code, codex, gemini cli, opencode).`); console.error(`open your agent and ask it to run '${name} skim' for you.`); process.exitCode = 1; return; diff --git a/src/lib/agent.js b/src/lib/agent.js index 52b8235..a71edb4 100644 --- a/src/lib/agent.js +++ b/src/lib/agent.js @@ -5,6 +5,7 @@ const CODING_AGENTS = { CLAUDECODE: 'claude code', GEMINI_CLI: 'gemini cli', CODEX_CI: 'codex', + OPENCODE: 'opencode', }; export function detectCodingAgent() { diff --git a/test/agent.test.js b/test/agent.test.js index ba6d3f3..3fdc0fc 100644 --- a/test/agent.test.js +++ b/test/agent.test.js @@ -8,14 +8,17 @@ describe('agent', () => { let originalClaudeCode; let originalGeminiCli; let originalCodexCi; + let originalOpencode; beforeEach(() => { originalClaudeCode = process.env.CLAUDECODE; originalGeminiCli = process.env.GEMINI_CLI; originalCodexCi = process.env.CODEX_CI; + originalOpencode = process.env.OPENCODE; delete process.env.CLAUDECODE; delete process.env.GEMINI_CLI; delete process.env.CODEX_CI; + delete process.env.OPENCODE; }); afterEach(() => { @@ -27,6 +30,9 @@ describe('agent', () => { if (originalCodexCi === undefined) delete process.env.CODEX_CI; else process.env.CODEX_CI = originalCodexCi; + + if (originalOpencode === undefined) delete process.env.OPENCODE; + else process.env.OPENCODE = originalOpencode; }); describe('detectCodingAgent', () => { @@ -49,6 +55,11 @@ describe('agent', () => { expect(detectCodingAgent()).toEqual({ name: 'codex', envVar: 'CODEX_CI' }); }); + test('returns opencode when OPENCODE=1', () => { + process.env.OPENCODE = '1'; + expect(detectCodingAgent()).toEqual({ name: 'opencode', envVar: 'OPENCODE' }); + }); + test('returns null when env var is 0', () => { process.env.CLAUDECODE = '0'; expect(detectCodingAgent()).toBe(null); @@ -58,6 +69,11 @@ describe('agent', () => { process.env.CLAUDECODE = ''; expect(detectCodingAgent()).toBe(null); }); + + test('returns null when OPENCODE is not 1', () => { + process.env.OPENCODE = 'true'; + expect(detectCodingAgent()).toBe(null); + }); }); describe('requireAgent', () => { diff --git a/test/helpers.js b/test/helpers.js index 4f0ac9d..1d8b33b 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -5,6 +5,7 @@ import { join } from 'node:path'; import { execSync } from 'node:child_process'; const vitBin = join(import.meta.dir, '..', 'bin', 'vit.js'); +const nonAgentEnv = { CLAUDECODE: '', GEMINI_CLI: '', CODEX_CI: '', OPENCODE: '' }; export function run(args, cwd, env, input) { try { @@ -14,7 +15,7 @@ export function run(args, cwd, env, input) { encoding: 'utf-8', timeout: 30000, stdio: ['pipe', 'pipe', 'pipe'], - env: env ? { ...process.env, ...env } : undefined, + env: { ...process.env, ...nonAgentEnv, ...(env || {}) }, input, }).trim(), exitCode: 0, diff --git a/test/json-output.test.js b/test/json-output.test.js index edcf717..8ed1bdd 100644 --- a/test/json-output.test.js +++ b/test/json-output.test.js @@ -29,7 +29,7 @@ function captureJsonError(input, hintArg) { }; } finally { console.log = originalLog; - process.exitCode = originalExitCode; + process.exitCode = originalExitCode ?? 0; } }