Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion site/harnesses/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,11 @@ <h3>DSH</h3>
<p class="harness-card__job">DeepSeek Harness CLI — worker is <code>dsh --profile headless</code>; <code>dsh-agent-looper</code> plugin for <code>dsh web</code>.</p>
<p class="harness-card__chips">
<span class="harness-chip">Worker <code>deepseek-v4-flash</code> → <code>v4-pro</code></span>
<span class="harness-chip">Opt-in <code>deepseek-flash</code> (4.1 Flash)</span>
<span class="harness-chip">Judge <code>deepseek-v4-pro</code></span>
</p>
<p class="harness-card__run"><code>pnpm exec agent-loop run .cursor/loops/my-task --runtime dsh --review-gate</code></p>
<p class="harness-card__note">Ensure <code>dsh</code> is on PATH. See <a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/dsh-plugin.md">docs/dsh-plugin.md</a> and <a href="https://github.com/dancingteeth/agent-looper/tree/main/plugins/dsh-agent-looper">plugins/dsh-agent-looper/</a>.</p>
<p class="harness-card__note">Default worker stays <code>deepseek-official/deepseek-v4-flash</code>; opt in to <code>deepseek-official/deepseek-flash</code> (DeepSeek-V41-Flash, image-capable) per loop in setup. Ensure <code>dsh</code> is on PATH. DSH companion plugin guard blocks accidental foreground grinds. See <a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/dsh-plugin.md">docs/dsh-plugin.md</a> and <a href="https://github.com/dancingteeth/agent-looper/tree/main/plugins/dsh-agent-looper">plugins/dsh-agent-looper/</a>.</p>
</article>

<article class="harness-card" id="cline">
Expand Down
3 changes: 2 additions & 1 deletion site/harnesses/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,10 @@ Export `CURSOR_API_KEY` or run under Doppler. Run `pnpm exec agent-loop-init` on

DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper` plugin for `dsh web`. See [docs/dsh-plugin.md](https://github.com/dancingteeth/agent-looper/blob/main/docs/dsh-plugin.md) and [plugins/dsh-agent-looper/](https://github.com/dancingteeth/agent-looper/tree/main/plugins/dsh-agent-looper).

- Worker: `deepseek-official/deepseek-v4-flash` (escalates to `deepseek-official/deepseek-v4-pro`)
- Worker: `deepseek-official/deepseek-v4-flash` (escalates to `deepseek-official/deepseek-v4-pro`) — default; opt in per loop to `deepseek-official/deepseek-flash` (DeepSeek-V41-Flash, image-capable)
- Judge: `deepseek-official/deepseek-v4-pro` (when `reviewRuntime: dsh`)
- Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime dsh --review-gate`
- DSH companion plugin guard blocks accidental foreground grinds

### Cline (`--runtime cline-pass` · `cline`)

Expand Down
24 changes: 20 additions & 4 deletions site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,15 @@
"name": "How do I start a loop from an idea?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Two paths: (1) If you see your coding agent's logo on this page — type your idea as a normal prompt, and ask it to implement the feature with Agent Looper. It sets up the loop and keeps grinding until the check is green. (2) If you like the terminal — set worker and judge with pnpm exec agent-loop-setup, then use pnpm exec agent-loop-prompt to type your idea and start the run. The check stays the finish line."
"text": "Two paths: (1) If you see your coding agent's logo on this page — type your idea as a normal prompt, and ask it to implement the feature with Agent Looper. It sets up the loop and keeps grinding until the check is green. (2) If you like the terminal — run pnpm exec agent-loop-setup: a one-screen setup wizard shows your recap and the current question, not a scrolling pile. Go back to change one answer without losing the rest. Then use pnpm exec agent-loop-prompt to type your idea and start the run. The check stays the finish line."
}
},
{
"@type": "Question",
"name": "What if verify fails because my environment is broken?",
"acceptedAnswer": {
"@type": "Answer",
"text": "When the check fails because something on your machine is missing or broken — not because the feature is wrong — the loop waits for you instead of sending another worker. Fix the environment, then resume. Real product failures still iterate."
}
},
{
Expand Down Expand Up @@ -209,7 +217,7 @@
]
}
</script>
<link rel="stylesheet" href="styles.css?v=20260904-faqtype">
<link rel="stylesheet" href="styles.css?v=20260911-060">
</head>
<body>
<header class="site-header">
Expand Down Expand Up @@ -375,7 +383,13 @@ <h2>How do I start a loop from an idea?</h2>
<strong>If you see your coding agent's logo on this page</strong> — type your idea as a normal prompt, and ask it to implement the feature <strong>with Agent Looper</strong>. It sets up the loop and keeps grinding until the check is green.
</p>
<p>
<strong>If you like the terminal</strong> — set worker and judge with <code>pnpm exec agent-loop-setup</code>, then use <code>pnpm exec agent-loop-prompt</code> to type your idea and start the run. The check stays the finish line.
<strong>If you like the terminal</strong> — run <code>pnpm exec agent-loop-setup</code>: a one-screen setup wizard shows your recap and the current question, not a scrolling pile. Go back to change one answer without losing the rest. Then use <code>pnpm exec agent-loop-prompt</code> to type your idea and start the run. The check stays the finish line.
</p>
</article>
<article class="tui-answer tui-answer--env">
<h2>What if verify fails because my environment is broken?</h2>
<p>
When the check fails because something on your machine is missing or broken — not because the feature is wrong — the loop waits for you instead of sending another worker. Fix the environment, then resume. Real product failures still iterate.
</p>
</article>
<article class="tui-answer tui-answer--spend">
Expand All @@ -393,7 +407,9 @@ <h2>What do the spend numbers mean?</h2>
<h2>How it works</h2>
<p class="section-intro">
Your agent writes <code>GOAL.md</code> and a deterministic check that the feature really works.
Optional <code>setup.sh</code> (or <code>setup</code> in <code>loop.json</code>) runs once before the first worker — setup failure does not spawn a worker.
A fresh worker loops until that check passes — optional judge / <code>reviewGate</code> only on serious findings.
After each visit the harness restores frozen specs if a worker edited them.
Progress lives in git and files, not chat memory.
</p>
<div class="grid two-col">
Expand All @@ -403,7 +419,7 @@ <h3>Worker</h3>
</div>
<div class="card card--verify">
<h3>Verifier</h3>
<p>A deterministic check. Green is only as good as the check you froze. The model doesn't get to hallucinate done. If something's wrong, the mistake is in the goal or the script.</p>
<p>A deterministic check. Green is only as good as the check you froze. The model doesn't get to hallucinate done. If your machine is broken, the loop waits — it doesn't burn another worker on a missing command. Real product failures still iterate.</p>
</div>
<div class="card card--judge">
<h3>Judge <span class="optional">optional</span></h3>
Expand Down
10 changes: 9 additions & 1 deletion site/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,22 @@ Two paths:

1. **If you see your coding agent's logo on this page** — type your idea as a normal prompt, and ask it to implement the feature **with Agent Looper**. It sets up the loop and keeps grinding until the check is green.

2. **If you like the terminal** — set worker and judge with `pnpm exec agent-loop-setup`, then use `pnpm exec agent-loop-prompt` to type your idea and start the run.
2. **If you like the terminal** — run `pnpm exec agent-loop-setup`: a one-screen setup wizard shows your recap and the current question, not a scrolling pile. Go back to change one answer without losing the rest. Then use `pnpm exec agent-loop-prompt` to type your idea and start the run.

The check stays the finish line.

## What if verify fails because my environment is broken?

When the check fails because something on your machine is missing or broken — not because the feature is wrong — the loop waits for you instead of sending another worker. Fix the environment, then resume. Real product failures still iterate.

## What do the spend numbers mean?

Watch and the report card show two numbers when they differ: **list** (public API rates, including prompt-cache) and **billed** (what the runtime invoice says). `$0` on a subscription quota is billed `$0`, not “free.” Budget caps use billed when you are on PAYG and list when the invoice is `$0`.

## How it works

Your agent writes `GOAL.md` and a deterministic check. Optional `setup.sh` (or `setup` in `loop.json`) runs once before the first worker — setup failure does not spawn a worker. A fresh worker loops until the check passes. After each visit the harness restores frozen specs if a worker edited them.

## How is Agent Looper different from looping in chat?

- Shell verify is the exit, not the LLM grading itself.
Expand Down
2 changes: 1 addition & 1 deletion site/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ When to use Agent Looper: a human wants a feature finished without babysitting C

When not to use Agent Looper: there is no deterministic check (pure taste with no script or vision gate); you need a team-ops factory, shared org cloud, or multi-repo orchestration; you want the model to grade itself as “done.”

How an agent should call it: install `@dancingteeth/agent-looper`, ask the human what they want, then implement the feature with Agent Looper (set up the loop, write GOAL.md and verify.sh, run until green). Or from the terminal: `pnpm exec agent-loop-setup` then `pnpm exec agent-loop-prompt --out .cursor/loops/<task>`, then `pnpm exec agent-loop run .cursor/loops/<task> --runtime <cursor|cline|opencode|pi|codex|dsh|muse|claude>`. Optional `--review-gate` re-opens the loop only on blocking review findings. CLI binaries: `agent-loop`, `agent-loop-prompt`. Current npm: **0.6.0**.
How an agent should call it: install `@dancingteeth/agent-looper`, ask the human what they want, then implement the feature with Agent Looper (set up the loop, write GOAL.md and verify.sh, run until green). Or from the terminal: `pnpm exec agent-loop-setup` (one-screen setup wizard — recap plus current question) then `pnpm exec agent-loop-prompt --out .cursor/loops/<task>`, then `pnpm exec agent-loop run .cursor/loops/<task> --runtime <cursor|cline|opencode|pi|codex|dsh|muse|claude>`. Optional `--review-gate` re-opens the loop only on blocking review findings. If verify fails because the environment is broken, the loop waits instead of burning another worker. CLI binaries: `agent-loop`, `agent-loop-prompt`. Current npm: **0.6.0** (supported line **0.6.x**).

## Developer resources

Expand Down
62 changes: 62 additions & 0 deletions src/site/landingAgentReadiness.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,68 @@ describe('landing agent readiness', () => {
}
})

it('names 0.6.0 setup wizard, env-wait, harness setup, frozen restore, and DSH 4.1 Flash opt-in', () => {
const html = readSite('index.html')
const md = readSite('index.md')
const llms = readSite('llms.txt')
const harnessHtml = readSite('harnesses/index.html')
const harnessMd = readSite('harnesses/index.md')
const graph = jsonLdGraph(html)

const faq = graph.find(
(node) =>
typeof node === 'object' &&
node !== null &&
(node as { '@type'?: string })['@type'] === 'FAQPage',
) as {
mainEntity?: Array<{
name?: string
acceptedAnswer?: { text?: string }
}>
}

const promptQuestion = faq?.mainEntity?.find(
(q) => q.name === 'How do I start a loop from an idea?',
)
const envQuestion = faq?.mainEntity?.find(
(q) => q.name === 'What if verify fails because my environment is broken?',
)

const setupWizardBeat = 'one-screen setup wizard'
const envWaitBeat = 'waits for you instead of sending another worker'
const setupBeat = 'setup.sh'
const frozenBeat = 'restores frozen specs'
const flashOptIn = 'deepseek-flash'
const flashLabel = '4.1 Flash'

for (const surface of [html, md] as const) {
expect(surface).toContain(setupWizardBeat)
expect(surface).toContain(envWaitBeat)
expect(surface).toContain(setupBeat)
expect(surface).toContain(frozenBeat)
expect(surface).not.toContain('0.5.0')
expect(surface).not.toMatch(/\bInk\b/i)
}

expect(llms).toContain('Current npm: **0.6.0**')
expect(llms).toContain('0.6.x')
expect(llms).not.toContain('0.5.0')
expect(llms).toContain(setupWizardBeat)

expect(promptQuestion?.acceptedAnswer?.text).toContain(setupWizardBeat)
expect(envQuestion?.acceptedAnswer?.text).toContain(envWaitBeat)

const dshCard =
harnessHtml.match(
/<article class="harness-card" id="dsh">[\s\S]*?<\/article>/,
)?.[0] ?? ''
expect(dshCard).toContain(flashOptIn)
expect(dshCard).toContain(flashLabel)
expect(dshCard).toContain('deepseek-v4-flash')
expect(harnessMd).toContain(flashOptIn)
expect(harnessMd).toContain('deepseek-v4-flash')
})

it('every HTML page loads analytics.js', () => {
const htmlFiles: string[] = []
function walk(dir: string) {
Expand Down
Loading