diff --git a/site/harnesses/index.html b/site/harnesses/index.html index 38a7ec5..82d6ab9 100644 --- a/site/harnesses/index.html +++ b/site/harnesses/index.html @@ -136,7 +136,7 @@

Cline

Pass deepseek-v4-flashqwen3.7-plus Credits deepseek-chatqwen3-coder-plus - Judge Composer 2.5 + Judge any runtime, optional

pnpm exec agent-loop run .cursor/loops/my-task --runtime cline-pass --review-gate

Install @cline/sdk. Use --runtime cline for credits.

@@ -154,7 +154,7 @@

OpenCode

Go deepseek-v4-flashqwen3.7-plus BYOK openrouter/… - Judge Cursor or reviewRuntime: opencode + Judge any runtime, optional

pnpm exec agent-loop run .cursor/loops/my-task --runtime opencode --review-gate

Install @opencode-ai/sdk; ensure opencode CLI is on PATH.

@@ -171,7 +171,7 @@

Pi

@earendil-works/pi-coding-agent — OpenRouter by default or another OpenAI-compatible router you configure.

Worker openrouter/deepseek-chatqwen3-coder-plus - Judge Cursor or reviewRuntime: pi + Judge any runtime, optional

pnpm exec agent-loop run .cursor/loops/my-task --runtime pi --review-gate

Install @earendil-works/pi-coding-agent.

@@ -188,7 +188,7 @@

Codex

@openai/codex-sdk and codex CLI — ChatGPT / OpenAI BYO.

Worker gpt-5.6-lunagpt-5.6-terra - Judge Cursor or reviewRuntime: codex (gpt-5.6-sol) + Judge any runtime, optional

pnpm exec agent-loop run .cursor/loops/my-task --runtime codex --review-gate

Install @openai/codex-sdk; ensure codex CLI is on PATH.

diff --git a/site/harnesses/index.md b/site/harnesses/index.md index 16063ed..93afc96 100644 --- a/site/harnesses/index.md +++ b/site/harnesses/index.md @@ -48,7 +48,7 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper` - `cline-pass` worker: `cline-pass/deepseek-v4-flash` → `qwen3.7-plus` - `cline` worker: `deepseek/deepseek-chat` → `qwen/qwen3-coder-plus` -- Judge: Cursor Composer 2.5 (unless `reviewRuntime` is set) +- Judge: any runtime, optional - Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime cline-pass --review-gate` (or `--runtime cline` for credits) ### OpenCode (`--runtime opencode`) @@ -57,7 +57,7 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper` - Go worker: `opencode-go/deepseek-v4-flash` → `qwen3.7-plus` - BYOK: `openrouter/…`, `vercel/…`, `ollama/…` -- Judge: Cursor, or `reviewRuntime: opencode` (DeepSeek V4 Pro) +- Judge: any runtime, optional - Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime opencode --review-gate` ### Pi (`--runtime pi`) @@ -65,7 +65,7 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper` `@earendil-works/pi-coding-agent` — OpenRouter by default, or another OpenAI-compatible router you configure. - Worker: `openrouter/deepseek/deepseek-chat` → `openrouter/qwen/qwen3-coder-plus` -- Judge: Cursor, or `reviewRuntime: pi` +- Judge: any runtime, optional - Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime pi --review-gate` ### Codex (`--runtime codex`) @@ -73,5 +73,5 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper` `@openai/codex-sdk` and `codex` CLI — ChatGPT / OpenAI BYO. - Worker: `gpt-5.6-luna` → `gpt-5.6-terra` -- Judge: Cursor, or `reviewRuntime: codex` (default judge `gpt-5.6-sol`) +- Judge: any runtime, optional - Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime codex --review-gate` diff --git a/src/site/landingAgentReadiness.test.ts b/src/site/landingAgentReadiness.test.ts index 9cd5218..7981a78 100644 --- a/src/site/landingAgentReadiness.test.ts +++ b/src/site/landingAgentReadiness.test.ts @@ -396,6 +396,56 @@ describe('landing agent readiness', () => { expect(md).toContain('looper-bot.png') }) + it('Cline runtime card describes judge as optional, not a Cursor default', () => { + const html = readSite('harnesses/index.html') + const clineCard = + html.match(/
[\s\S]*?<\/article>/)?.[0] ?? '' + expect(clineCard).toMatch(/any runtime/i) + expect(clineCard).toMatch(/optional/i) + expect(clineCard).not.toMatch(/Composer/i) + expect(clineCard).not.toMatch(/Judge Cursor/) + expect(clineCard).not.toMatch(/reviewRuntime:\s*cline/i) + + const md = readSite('harnesses/index.md') + const clineSection = md.slice( + md.indexOf('### Cline'), + md.indexOf('### OpenCode'), + ) + expect(clineSection).toMatch(/any runtime/i) + expect(clineSection).toMatch(/optional/i) + expect(clineSection).not.toMatch(/Composer/i) + expect(clineSection).not.toMatch(/Judge: Cursor/) + expect(clineSection).not.toMatch(/reviewRuntime:\s*cline/i) + }) + + it('OpenCode, Pi, and Codex runtime cards describe judge as optional, not a Cursor default', () => { + const html = readSite('harnesses/index.html') + const md = readSite('harnesses/index.md') + const cases = [ + { id: 'opencode', mdHeading: '### OpenCode', mdEnd: '### Pi' }, + { id: 'pi', mdHeading: '### Pi', mdEnd: '### Codex' }, + { id: 'codex', mdHeading: '### Codex', mdEnd: undefined }, + ] as const + + for (const { id, mdHeading, mdEnd } of cases) { + const card = + html.match( + new RegExp(`
[\\s\\S]*?<\\/article>`), + )?.[0] ?? '' + expect(card, id).toMatch(/any runtime/i) + expect(card, id).toMatch(/optional/i) + expect(card, id).not.toMatch(/Judge Cursor/) + expect(card, id).not.toMatch(new RegExp(`reviewRuntime:\\s*${id}`, 'i')) + + const mdStart = md.indexOf(mdHeading) + const mdSlice = mdEnd ? md.slice(mdStart, md.indexOf(mdEnd)) : md.slice(mdStart) + expect(mdSlice, id).toMatch(/any runtime/i) + expect(mdSlice, id).toMatch(/optional/i) + expect(mdSlice, id).not.toMatch(/Judge: Cursor/) + expect(mdSlice, id).not.toMatch(new RegExp(`reviewRuntime:\\s*${id}`, 'i')) + } + }) + it('help section leads with dep, issues, optional telemetry, and Ko-fi', () => { const html = readSite('index.html') expect(html).toContain('id="help"')