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
2 changes: 1 addition & 1 deletion site/about/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ <h1>About Agent Looper</h1>
<li><a href="../">Product site</a></li>
<li><a href="https://github.com/dancingteeth/agent-looper">Source</a></li>
<li><a href="https://www.npmjs.com/package/@dancingteeth/agent-looper">npm</a></li>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md">Changelog</a> — 0.6.2</li>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md">Changelog</a> — 0.6.3</li>
<li><a href="https://dancingteeth.net/">Author</a></li>
</ul>
</div>
Expand Down
2 changes: 1 addition & 1 deletion site/about/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ Agent Looper is made by Paul Zgordan (dancingteeth), who also writes at The Vacu
- Product: https://looper.dancingteeth.net/
- Source: https://github.com/dancingteeth/agent-looper
- npm: https://www.npmjs.com/package/@dancingteeth/agent-looper
- Changelog (0.6.2): https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md
- Changelog (0.6.3): https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md
- Author: https://dancingteeth.net/
2 changes: 1 addition & 1 deletion site/docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ <h1>Agent Looper developer resources</h1>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md">Claude runtime</a> — Claude Code CLI</li>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/embed-api.md">Embed API</a> — contract for embedding Agent Looper</li>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/SECURITY.md">Security</a> — reporting vulnerabilities</li>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md">Changelog</a> — 0.6.2</li>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md">Changelog</a> — 0.6.3</li>
<li><a href="../llms.txt">Agent Looper llms.txt</a></li>
<li><a href="../index.md">Agent Looper homepage (markdown)</a></li>
</ul>
Expand Down
2 changes: 1 addition & 1 deletion site/docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Agent Looper is the npm package `@dancingteeth/agent-looper` and the CLI `agent-
- Claude runtime (Claude Code CLI): https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md
- Embed API (contract for embedding Agent Looper): https://github.com/dancingteeth/agent-looper/blob/main/docs/embed-api.md
- Security (reporting vulnerabilities): https://github.com/dancingteeth/agent-looper/blob/main/SECURITY.md
- Changelog (0.6.2): https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md
- Changelog (0.6.3): https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md
- Agent Looper llms.txt: https://looper.dancingteeth.net/llms.txt
- Agent Looper homepage (markdown): https://looper.dancingteeth.net/index.md

Expand Down
2 changes: 1 addition & 1 deletion site/harnesses/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ <h3>DSH</h3>
<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">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. In <code>~/.dsh/.credentials.yaml</code>, use <code>version: "1"</code> (quoted) — a bare YAML integer breaks headless boot; the harness prints a one-line fix. 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>
<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. <code>~/.dsh/.credentials.yaml</code> must be a flat <code>KEY: "string"</code> map — a wrapped store (<code>version</code> / <code>refs</code> / <code>records</code>) or YAML integer fails <code>agent-check dsh</code> and <code>agent-loop run</code> before spawning the worker. Quoting <code>version</code> alone is not enough; the harness does not rewrite that file. 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
2 changes: 1 addition & 1 deletion site/harnesses/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper`
- 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`
- In `~/.dsh/.credentials.yaml`, use `version: "1"` (quoted) — a bare YAML integer breaks headless boot; the harness prints a one-line fix.
- `~/.dsh/.credentials.yaml` must be a flat `KEY: "string"` map — a wrapped store (`version` / `refs` / `records`) or YAML integer fails `agent-check dsh` and `agent-loop run` before spawning the worker. Quoting `version` alone is not enough; the harness does not rewrite that file.
- DSH companion plugin guard blocks accidental foreground grinds

### Cline (`--runtime cline-pass` · `cline`)
Expand Down
2 changes: 1 addition & 1 deletion site/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ This tool is free. We keep building it when the community actually uses it and t
- [llms.txt](https://looper.dancingteeth.net/llms.txt)
- [Harnesses](https://looper.dancingteeth.net/harnesses/)
- [Developer resources](https://looper.dancingteeth.net/docs/)
- [Changelog (0.6.2)](https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md)
- [Changelog (0.6.3)](https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md)
- [Embed API](https://github.com/dancingteeth/agent-looper/blob/main/docs/embed-api.md)
- [Security](https://github.com/dancingteeth/agent-looper/blob/main/SECURITY.md)
- [GitHub](https://github.com/dancingteeth/agent-looper)
Expand Down
4 changes: 2 additions & 2 deletions 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` (one-screen setup wizard — recap plus current question) then `pnpm exec agent-loop-prompt --out .cursor/loops/<task>` — the scaffold judge stops as soon as frozen GOAL.md and verify.sh pass freeze (10-minute wall, not a long grind) — then `pnpm exec agent-loop run .cursor/loops/<task> --runtime <cursor|cline|opencode|pi|codex|dsh|muse|claude>`. On `runtime: cursor`, repo defaults that pin OpenCode Go `escalateModel` are not applied; Composer plus another judge uses `reviewRuntime` / `reviewModel`, not `escalateModel`. DSH headless: in `~/.dsh/.credentials.yaml`, quote `version` as `version: "1"` (a bare YAML integer breaks boot). 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. After each visit the harness restores frozen specs and removes any frozen basename a worker planted (e.g. `setup.sh`) so it cannot persist. OpenCode Go and Cline Pass model lists and list prices come from models.dev; unknown well-formed slugs warn at start and read `$0` until priced — budget caps still reject unpriced worker or escalate models. CLI binaries: `agent-loop`, `agent-loop-prompt`. Current npm: **0.6.2** (supported line **0.6.x**).
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>` — the scaffold judge stops as soon as frozen GOAL.md and verify.sh pass freeze (10-minute wall, not a long grind) — then `pnpm exec agent-loop run .cursor/loops/<task> --runtime <cursor|cline|opencode|pi|codex|dsh|muse|claude>`. On `runtime: cursor`, repo defaults that pin OpenCode Go `escalateModel` are not applied; Composer plus another judge uses `reviewRuntime` / `reviewModel`, not `escalateModel`. DSH headless: `~/.dsh/.credentials.yaml` must be a flat `KEY: "string"` map — a wrapped store (`version` / `refs` / `records`) or YAML integer fails `agent-check dsh` and `agent-loop run` before spawning the worker; quoting `version` alone is not enough (the harness does not rewrite that file). 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. After each visit the harness restores frozen specs and removes any frozen basename a worker planted (e.g. `setup.sh`) so it cannot persist. OpenCode Go and Cline Pass model lists and list prices come from models.dev; unknown well-formed slugs warn at start and read `$0` until priced — budget caps still reject unpriced worker or escalate models. CLI binaries: `agent-loop`, `agent-loop-prompt`. Current npm: **0.6.3** (supported line **0.6.x**).

## Developer resources

Expand All @@ -23,7 +23,7 @@ How an agent should call it: install `@dancingteeth/agent-looper`, ask the human
- [Claude runtime](https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md): Claude Code CLI (`--safe-mode`)
- [Embed API](https://github.com/dancingteeth/agent-looper/blob/main/docs/embed-api.md): contract for embedding Agent Looper
- [Security](https://github.com/dancingteeth/agent-looper/blob/main/SECURITY.md): reporting vulnerabilities
- [Changelog](https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md): 0.6.2
- [Changelog](https://github.com/dancingteeth/agent-looper/blob/main/CHANGELOG.md): 0.6.3
- [Harnesses — Agent Looper worker runtimes](https://looper.dancingteeth.net/harnesses/index.md)

## Optional
Expand Down
21 changes: 16 additions & 5 deletions src/site/landingAgentReadiness.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ describe('landing agent readiness', () => {
}
})

it('names 0.6.2 setup wizard, env-wait, harness setup, frozen restore, plant block, models.dev soft-gate, Cursor escalate, scaffold wall, DSH credentials version, and DSH 4.1 Flash opt-in', () => {
it('names 0.6.3 setup wizard, env-wait, harness setup, frozen restore, plant block, models.dev soft-gate, Cursor escalate, scaffold wall, DSH flat credentials, and DSH 4.1 Flash opt-in', () => {
const html = readSite('index.html')
const md = readSite('index.md')
const llms = readSite('llms.txt')
Expand Down Expand Up @@ -690,7 +690,9 @@ describe('landing agent readiness', () => {
const flashLabel = '4.1 Flash'
const cursorEscalateBeat = 'are not applied'
const scaffoldWallBeat = '10-minute wall'
const dshVersionBeat = 'version: "1"'
const dshFlatBeat = 'must be a flat'
const dshPreflightBeat = 'agent-check dsh'
const dshQuoteNotEnoughBeat = 'alone is not enough'

const presetsQuestion = faq?.mainEntity?.find(
(q) => q.name === 'How do Agent Looper worker and judge presets work?',
Expand All @@ -708,15 +710,19 @@ describe('landing agent readiness', () => {
expect(surface).not.toMatch(/\bInk\b/i)
expect(surface).not.toMatch(/Current npm.*0\.6\.0/i)
expect(surface).not.toMatch(/Current npm.*0\.6\.1/i)
expect(surface).not.toMatch(/Current npm.*0\.6\.2/i)
expect(surface).toContain(cursorEscalateBeat)
expect(surface).toContain(scaffoldWallBeat)
}

expect(llms).toContain('Current npm: **0.6.2**')
expect(llms).toContain('Current npm: **0.6.3**')
expect(llms).toContain('0.6.x')
expect(llms).not.toContain('0.5.0')
expect(llms).not.toContain('Current npm: **0.6.2**')
expect(llms).not.toContain('Current npm: **0.6.1**')
expect(llms).not.toContain('Current npm: **0.6.0**')
expect(llms).toContain(dshPreflightBeat)
expect(llms).toContain(dshQuoteNotEnoughBeat)
expect(llms).toContain(setupWizardBeat)
expect(llms).toContain(plantBeat)
expect(llms).toContain(modelsDevBeat)
Expand All @@ -743,13 +749,18 @@ describe('landing agent readiness', () => {
harnessHtml.match(
/<article class="harness-card" id="dsh">[\s\S]*?<\/article>/,
)?.[0] ?? ''
expect(dshCard).toContain(dshVersionBeat)
expect(dshCard).toContain(dshFlatBeat)
expect(dshCard).toContain(dshPreflightBeat)
expect(dshCard).not.toContain('version: "1"')
expect(dshCard).toContain(flashOptIn)
expect(dshCard).toContain(flashLabel)
expect(dshCard).toContain('deepseek-v4-flash')
expect(harnessMd).toContain(flashOptIn)
expect(harnessMd).toContain('deepseek-v4-flash')
expect(harnessMd).toContain(dshVersionBeat)
expect(harnessMd).toContain(dshFlatBeat)
expect(harnessMd).toContain(dshPreflightBeat)
expect(harnessMd).toContain(dshQuoteNotEnoughBeat)
expect(harnessMd).not.toContain('version: "1"')
})

it('every HTML page loads analytics.js', () => {
Expand Down
Loading