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: 2 additions & 0 deletions site/docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ <h1>Agent Looper developer resources</h1>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/dsh-plugin.md">DSH plugin</a> — DeepSeek Harness</li>
<li><a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/muse-runtime.md">Muse runtime</a> — Muse Code</li>
<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="../llms.txt">Agent Looper llms.txt</a></li>
<li><a href="../index.md">Agent Looper homepage (markdown)</a></li>
</ul>
Expand Down
2 changes: 2 additions & 0 deletions site/docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ Agent Looper is the npm package `@dancingteeth/agent-looper` and the CLI `agent-
- DSH plugin (DeepSeek Harness): https://github.com/dancingteeth/agent-looper/blob/main/docs/dsh-plugin.md
- Muse runtime (Muse Code): https://github.com/dancingteeth/agent-looper/blob/main/docs/muse-runtime.md
- 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
- 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 @@ -230,7 +230,7 @@ <h3>Claude</h3>
<span class="harness-card__pill"><code>--runtime claude</code></span>
</div>
</header>
<p class="harness-card__job">PATH <code>claude</code> CLI — Claude Code subscription. Spawn uses <code>--safe-mode</code>. Not on <code>costPreset</code> minmax.</p>
<p class="harness-card__job">PATH <code>claude</code> CLI — Claude Code subscription. <code>--safe-mode</code> so the harness prompt is the only instruction source (strips project hooks and auto-memory). Not on <code>costPreset</code> minmax.</p>
<p class="harness-card__chips">
<span class="harness-chip">Worker <code>sonnet</code> → <code>opus</code></span>
<span class="harness-chip">Judge any runtime, optional</span>
Expand Down
2 changes: 1 addition & 1 deletion site/harnesses/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper`

### Claude (`--runtime claude`)

PATH `claude` CLI — Claude Code subscription. Spawn uses `--safe-mode`. Not on `costPreset` minmax. See [docs/claude-runtime.md](https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md).
PATH `claude` CLI — Claude Code subscription. `--safe-mode` so the harness prompt is the only instruction source (strips project hooks and auto-memory). Not on `costPreset` minmax. See [docs/claude-runtime.md](https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md).

- Worker: `sonnet` → `opus`
- Judge: any runtime, optional
Expand Down
72 changes: 46 additions & 26 deletions site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,23 @@
"name": "What do I get when a loop finishes?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A report card, not a chat dump. How often the check sent work back, whether the worker hung, whether the judge bounced it, what it cost, and whether it needed you."
"text": "A report card, not a chat dump. How often the check sent work back, whether the worker hung, whether the judge bounced it, list and billed spend when they differ, and whether it needed you."
}
},
{
"@type": "Question",
"name": "How do I start a loop from an idea?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Type an idea, freeze a loop. agent-loop-prompt is an Ink TUI: you describe the goal; the judge (not the worker) drafts GOAL.md and verify.sh; freeze lint rejects gameable greps; you confirm; then the watch TUI grinds. Resume lines keep Doppler when the shell was started that way. Optional preview after green is trust-gated and is not executed by agent-loop run."
}
},
{
"@type": "Question",
"name": "What do the spend numbers mean?",
"acceptedAnswer": {
"@type": "Answer",
"text": "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."
}
}
]
Expand Down Expand Up @@ -179,18 +195,12 @@
{
"@type": "HowToStep",
"position": 3,
"name": "Initialize a loop",
"text": "Run pnpm exec agent-loop-init to scaffold the loop folder."
"name": "Freeze a goal and check",
"text": "Prefer pnpm exec agent-loop-prompt --out .cursor/loops/my-task — describe your idea; the judge drafts GOAL.md and verify.sh; confirm freeze. Or run pnpm exec agent-loop-init and edit GOAL.md and verify.sh until bash verify.sh is an honest pass/fail."
},
{
"@type": "HowToStep",
"position": 4,
"name": "Write the finish line",
"text": "Edit GOAL.md and verify.sh until bash verify.sh is an honest determined check."
},
{
"@type": "HowToStep",
"position": 5,
"name": "Run until green",
"text": "Run pnpm exec agent-loop run .cursor/loops/my-task --runtime cursor --review-gate."
}
Expand Down Expand Up @@ -355,7 +365,19 @@ <h2>How do I know if a loop is still alive?</h2>
<article class="tui-answer tui-answer--report">
<h2>What do I get when a loop finishes?</h2>
<p>
A report card, not a chat dump. How often the check sent work back, whether the worker hung, whether the judge bounced it, what it cost, and whether it needed you.
A report card, not a chat dump. How often the check sent work back, whether the worker hung, whether the judge bounced it, <strong>list</strong> and <strong>billed</strong> spend when they differ, and whether it needed you.
</p>
</article>
<article class="tui-answer tui-answer--prompt">
<h2>How do I start a loop from an idea?</h2>
<p>
Type an idea, freeze a loop. <code>agent-loop-prompt</code> is an Ink TUI: you describe the goal; the <strong>judge</strong> (not the worker) drafts <code>GOAL.md</code> and <code>verify.sh</code>; freeze lint rejects gameable greps; you confirm; then the watch TUI grinds. Resume lines keep Doppler when the shell was started that way. Optional <code>preview</code> after green is trust-gated and is <strong>not</strong> executed by <code>agent-loop run</code>.
</p>
</article>
<article class="tui-answer tui-answer--spend">
<h2>What do the spend numbers mean?</h2>
<p>
Watch and the report card show two numbers when they differ: <strong>list</strong> (public API rates, including prompt-cache) and <strong>billed</strong> (what the runtime invoice says). <code>$0</code> on a subscription quota is billed <code>$0</code>, not “free.” Budget caps use billed when you are on PAYG and list when the invoice is <code>$0</code>.
</p>
</article>
</div>
Expand Down Expand Up @@ -432,7 +454,7 @@ <h2>How is Agent Looper different from looping in chat?</h2>
<div class="wrap">
<h2>Open spine, not rented brain</h2>
<p class="section-intro">
MIT. Inspectable. Models stay whoever you already pay — Cursor, OpenCode, OpenRouter, Codex, DSH, Muse.
MIT. Inspectable. Models stay whoever you already pay — Cursor, OpenCode, OpenRouter, Codex, DSH, Muse, Claude.
What you own is the loop: frozen <code>GOAL.md</code>, measurable <code>verify.sh</code>,
sparse <code>REVIEWS.md</code> / <code>AGENTS.md</code>, and orchestration that keeps workers fresh and spend bounded.
</p>
Expand All @@ -448,8 +470,7 @@ <h2>Install Agent Looper</h2>
<ol class="howto-steps">
<li>Add <code>@dancingteeth/agent-looper</code> and the SDK for your coding agent (Cursor: <code>@cursor/sdk</code>).</li>
<li>Export an API key, or run under Doppler.</li>
<li>Run <code>pnpm exec agent-loop-init</code>.</li>
<li>Edit <code>GOAL.md</code> and <code>verify.sh</code> until <code>bash verify.sh</code> is an honest determined check.</li>
<li>Prefer <code>pnpm exec agent-loop-prompt --out .cursor/loops/my-task</code> — describe your idea; the judge drafts <code>GOAL.md</code> and <code>verify.sh</code>; confirm freeze. Or <code>pnpm exec agent-loop-init</code> and edit the goal and check yourself.</li>
<li>Run <code>pnpm exec agent-loop run</code> until that check is green.</li>
</ol>
<div class="install-switcher">
Expand All @@ -469,25 +490,24 @@ <h2>Install Agent Looper</h2>

Requirements: Node 22+ and pnpm.

1. Add @dancingteeth/agent-looper and the SDK for the coding agent on this machine. Cursor uses @cursor/sdk. If you're not sure, detect what's installed (Cursor, Cline, OpenCode, Pi, Codex, DSH, Muse).
1. Add @dancingteeth/agent-looper and the SDK for the coding agent on this machine. Cursor uses @cursor/sdk. If you're not sure, detect what's installed (Cursor, Cline, OpenCode, Pi, Codex, DSH, Muse, Claude).
2. Keep @dancingteeth/agent-looper in package.json even if you gitignore `.cursor/loops`. Don't only npx it.
3. Use an API key already on this machine, or run under Doppler. Don't invent keys.
4. Run: pnpm exec agent-loop-init
5. Write GOAL.md for the feature and freeze it. Don't rewrite the goal mid-loop.
6. Write a determined check until `bash verify.sh` is an honest pass/fail that the feature actually works. The model does not get to say done.
7. Start the loop:
pnpm exec agent-loop run .cursor/loops/&lt;task&gt; --runtime &lt;cursor|cline|opencode|pi|codex|dsh|muse&gt; --review-gate
8. Review skill: blockers come back for the next iteration. Advisory is my call. Don't loop on subjective taste.
4. Prefer: pnpm exec agent-loop-prompt --out .cursor/loops/&lt;task&gt;
— describe the idea; the judge (not the worker) drafts GOAL.md and verify.sh; freeze lint rejects gameable greps; confirm; then the watch TUI grinds.
Or manually: pnpm exec agent-loop-init, write GOAL.md, and a determined check until `bash verify.sh` is an honest pass/fail. Don't rewrite the goal mid-loop.
5. Start the loop:
pnpm exec agent-loop run .cursor/loops/&lt;task&gt; --runtime &lt;cursor|cline|opencode|pi|codex|dsh|muse|claude&gt; --review-gate
6. Review skill: blockers come back for the next iteration. Advisory is my call. Don't loop on subjective taste.

Cursor example (swap the SDK, key, and --runtime if this machine isn't Cursor):

pnpm add -D @dancingteeth/agent-looper @cursor/sdk

export CURSOR_API_KEY=… # or: doppler run -- …

pnpm exec agent-loop-init
# edit .cursor/loops/my-task/GOAL.md
# edit verify.sh until `bash .cursor/loops/my-task/verify.sh` is honest
pnpm exec agent-loop-prompt --out .cursor/loops/my-task
# or: pnpm exec agent-loop-init and edit GOAL.md + verify.sh yourself

pnpm exec agent-loop run .cursor/loops/my-task --runtime cursor --review-gate</code></pre>
</div>
Expand All @@ -503,9 +523,9 @@ <h2>Install Agent Looper</h2>

export CURSOR_API_KEY=… # or: doppler run -- …

pnpm exec agent-loop-init
# edit .cursor/loops/my-task/GOAL.md
# edit verify.sh until `bash .cursor/loops/my-task/verify.sh` is honest
pnpm exec agent-loop-prompt --out .cursor/loops/my-task
# describe your idea; the judge drafts GOAL.md + verify.sh — confirm freeze, then watch
# or: pnpm exec agent-loop-init and edit GOAL.md + verify.sh until `bash .cursor/loops/my-task/verify.sh` is honest

pnpm exec agent-loop run .cursor/loops/my-task --runtime cursor --review-gate</code></pre>
</div>
Expand Down
38 changes: 22 additions & 16 deletions site/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,15 @@ The IDE job list will lie. Ask your agent to use the check-running-loops skill.

## What do I get when a loop finishes?

A report card, not a chat dump. How often the check sent work back, whether the worker hung, whether the judge bounced it, what it cost, and whether it needed you.
A report card, not a chat dump. How often the check sent work back, whether the worker hung, whether the judge bounced it, **list** and **billed** spend when they differ, and whether it needed you.

## How do I start a loop from an idea?

Type an idea, freeze a loop. `agent-loop-prompt` is an Ink TUI: you describe the goal; the **judge** (not the worker) drafts `GOAL.md` and `verify.sh`; freeze lint rejects gameable greps; you confirm; then the watch TUI grinds. Resume lines keep Doppler when the shell was started that way. Optional `preview` after green is trust-gated and is **not** executed by `agent-loop run`.

## 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 is Agent Looper different from looping in chat?

Expand All @@ -46,9 +54,8 @@ Node 22+, pnpm.

1. Add `@dancingteeth/agent-looper` and the SDK for your coding agent (Cursor: `@cursor/sdk`).
2. Export an API key, or run under Doppler.
3. Run `pnpm exec agent-loop-init`.
4. Edit `GOAL.md` and `verify.sh` until `bash verify.sh` is an honest determined check.
5. Run `pnpm exec agent-loop run` until that check is green.
3. Prefer `pnpm exec agent-loop-prompt --out .cursor/loops/my-task` — describe your idea; the judge drafts `GOAL.md` and `verify.sh`; confirm freeze. Or `pnpm exec agent-loop-init` and edit the goal and check yourself.
4. Run `pnpm exec agent-loop run` until that check is green.

### For agent

Expand All @@ -60,22 +67,21 @@ Requirements: Node 22+ and pnpm.
1. Add @dancingteeth/agent-looper and the SDK for the coding agent on this machine. Cursor uses @cursor/sdk. If you're not sure, detect what's installed (Cursor, Cline, OpenCode, Pi, Codex, DSH, Muse, Claude).
2. Keep @dancingteeth/agent-looper in package.json even if you gitignore `.cursor/loops`. Don't only npx it.
3. Use an API key already on this machine, or run under Doppler. Don't invent keys.
4. Run: pnpm exec agent-loop-init
5. Write GOAL.md for the feature and freeze it. Don't rewrite the goal mid-loop.
6. Write a determined check until `bash verify.sh` is an honest pass/fail that the feature actually works. The model does not get to say done.
7. Start the loop:
pnpm exec agent-loop run .cursor/loops/<task> --runtime <cursor|cline|opencode|pi|codex|dsh|muse> --review-gate
8. Review skill: blockers come back for the next iteration. Advisory is my call. Don't loop on subjective taste.
4. Prefer: pnpm exec agent-loop-prompt --out .cursor/loops/<task>
— describe the idea; the judge (not the worker) drafts GOAL.md and verify.sh; freeze lint rejects gameable greps; confirm; then the watch TUI grinds.
Or manually: pnpm exec agent-loop-init, write GOAL.md, and a determined check until `bash verify.sh` is an honest pass/fail. Don't rewrite the goal mid-loop.
5. Start the loop:
pnpm exec agent-loop run .cursor/loops/<task> --runtime <cursor|cline|opencode|pi|codex|dsh|muse|claude> --review-gate
6. Review skill: blockers come back for the next iteration. Advisory is my call. Don't loop on subjective taste.

Cursor example (swap the SDK, key, and --runtime if this machine isn't Cursor):

pnpm add -D @dancingteeth/agent-looper @cursor/sdk

export CURSOR_API_KEY=… # or: doppler run -- …

pnpm exec agent-loop-init
# edit .cursor/loops/my-task/GOAL.md
# edit verify.sh until `bash .cursor/loops/my-task/verify.sh` is honest
pnpm exec agent-loop-prompt --out .cursor/loops/my-task
# or: pnpm exec agent-loop-init and edit GOAL.md + verify.sh yourself

pnpm exec agent-loop run .cursor/loops/my-task --runtime cursor --review-gate
```
Expand All @@ -88,9 +94,9 @@ pnpm add -D @dancingteeth/agent-looper @cursor/sdk

export CURSOR_API_KEY=… # or: doppler run -- …

pnpm exec agent-loop-init
# edit .cursor/loops/my-task/GOAL.md
# edit verify.sh until `bash .cursor/loops/my-task/verify.sh` is honest
pnpm exec agent-loop-prompt --out .cursor/loops/my-task
# describe your idea; the judge drafts GOAL.md + verify.sh — confirm freeze, then watch
# or: pnpm exec agent-loop-init and edit GOAL.md + verify.sh until `bash .cursor/loops/my-task/verify.sh` is honest

pnpm exec agent-loop run .cursor/loops/my-task --runtime cursor --review-gate
```
Expand Down
4 changes: 3 additions & 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 determined 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`, run `pnpm exec agent-loop-init`, freeze `.cursor/loops/<task>/GOAL.md` and `verify.sh`, 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 binary: `agent-loop`.
How an agent should call it: install `@dancingteeth/agent-looper`, prefer `pnpm exec agent-loop-prompt --out .cursor/loops/<task>` (describe the idea; judge drafts GOAL/verify; confirm freeze) or run `pnpm exec agent-loop-init` and edit `GOAL.md` and `verify.sh`, 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 binary: `agent-loop`.

## Developer resources

Expand All @@ -21,6 +21,8 @@ How an agent should call it: install `@dancingteeth/agent-looper`, run `pnpm exe
- [DSH plugin](https://github.com/dancingteeth/agent-looper/blob/main/docs/dsh-plugin.md): DeepSeek Harness companion
- [Muse runtime](https://github.com/dancingteeth/agent-looper/blob/main/docs/muse-runtime.md): Muse Code CLI
- [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
- [Harnesses — Agent Looper worker runtimes](https://looper.dancingteeth.net/harnesses/index.md)

## Optional
Expand Down
Loading
Loading