Skip to content

Releases: dancingteeth/agent-looper

0.7.0

Choose a tag to compare

@dancingteeth dancingteeth released this 25 Sep 13:32

0.7.0 — 2026-09-25

Cursor judge is Grok 4.7, DeepSeek Flash defaults are 4.1, and the Go / Cline Pass catalogs pick up the new models.dev rows.

Headline

  • Cursor judge is Grok 4.7 — reviewModel defaults to grok-4.7 when the worker is Cursor. grok-4.6 and grok-4.5 stay allowed. Composer 2.5 is still the only Cursor worker.
  • DeepSeek Flash defaults are 4.1 — DSH worker deepseek-official/deepseek-flash, OpenCode Go opencode-go/deepseek-v4.1-flash, Cline Pass cline-pass/deepseek-v4.1-flash. Previous deepseek-v4-flash stays allowed. Go minmax stays Hy3.
  • Claude aliases track the CLI — opus / sonnet / fable follow Claude Code latest-per-family (Opus 5, Sonnet 5, Fable 5.1 on 2.1.273). List-price estimates match those ids. Opus 5.5 is on the Cursor SDK catalog; the claude runtime does not offer it until the CLI does.
  • Codex lists gpt-6-astra — optional, not the default judge (gpt-5.6-sol stays).

Also

  • OpenCode Go / Cline Pass catalog — pnpm sync:models picks up Grok 4.7, GPT-6 Luna, MiMo V2.6 Flash/Pro, and Space Bunny Free from models.dev.
  • Error discovery between runs — label a diverse sample of .cursor/loop-exports/ before adding a verify.sh / REVIEWS.md check. Procedure in docs/unknowns-preflight.md; design-loop and meta-review point at it. Freeze during a run is unchanged.
  • Supported line: 0.7.x.

npm · tag

0.6.3

Choose a tag to compare

@dancingteeth dancingteeth released this 21 Sep 12:10

0.6.3 — 2026-09-21

DSH wrapped credentials abort before WORKER — quoting version is not enough.

Headline

  • DSH wrapped credentials abort before WORKER — ~/.dsh/.credentials.yaml must be a flat KEY: "string" map. A wrapped store (version / refs / records) or YAML integer (version: 1) now fails agent-check dsh and agent-loop run before spawning headless. Quoting version is not enough. The harness does not rewrite that file.

npm · tag

0.6.2

Choose a tag to compare

@dancingteeth dancingteeth released this 21 Sep 11:39

0.6.2 — 2026-09-21

Cursor loops no longer inherit OpenCode escalate from repo defaults; scaffold judges stop when the spec exists; DSH credentials version must be a quoted string.

Headline

  • Cursor loops no longer inherit OpenCode escalateModel — repo defaults that pin Go minmax (opencode-go/qwen3.7-plus) are dropped when loop.json sets runtime: "cursor". Composer worker + another judge still uses reviewRuntime / reviewModel, not escalateModel. Invalid Cursor slugs now say whether the field is the worker, the hung-worker fallback, or the judge.
  • agent-loop-prompt scaffold stops when the spec exists — 10-minute wall (not 45m); abort as soon as GOAL.md + verify.sh pass freeze; prompt forbids tsc/vitest/vite and copying sibling loops.
  • DSH credentials version must be a string — a YAML integer version: 1 now fails headless boot (credentials-local). The harness prints a one-line fix instead of the Node stack. Quote it as version: "1".

npm · tag

0.6.1

Choose a tag to compare

@dancingteeth dancingteeth released this 15 Sep 01:50

0.6.1 — 2026-09-15

Frozen-file creation guard, models.dev catalog + pricing, and soft-gated Go / Cline Pass slugs.

Headline

  • Frozen files also cover creation — a worker that adds a frozen basename (setup.sh, RESEARCH.md, …) that did not exist at loop start now has it removed on restore and the visit fails, closing the cross-run persistence path where a planted setup.sh would be auto-selected by the next agent-loop run.
  • Model catalog from models.dev — pnpm sync:models regenerates OPENCODE_GO_LOOP_MODELS, CLINE_PASS_LOOP_MODELS, and pricing from https://models.dev/api.json; weekly CI PR via sync-models.yml. Go / Cline Pass costUsd / maxCostUsd follow the new rows (some list prices are higher than the old hand table).
  • Soft-gate unknown Go / Cline Pass slugs — well-formed opencode-go/<id> and cline-pass/<id> slugs parse even when absent from the curated catalog; unpriced models warn at loop start and report $0 cost. maxCostUsd rejects worker or escalateModel slugs with no pricing row.

Also

  • Per-runtime defaults, model-shape validation, and capability flags live in one RUNTIME_SPEC table. Invalid-model errors now read Invalid <field> "<slug>" for <runtimeField> "<runtime>". <hint>; the zod issue path comes from the typed AgentModelError.field. Public exports from loopAgentConfig are unchanged.
  • DSH companion bash guard documented as a best-effort tripwire (not a sandbox); README states the shell-trust default is warn-and-run.
  • Supported line: 0.6.x.

npm · tag

0.6.0

Choose a tag to compare

@dancingteeth dancingteeth released this 11 Sep 11:10

0.6.0 — 2026-09-11

Single-screen setup wizard, DeepSeek 4.1 Flash on the DSH runtime, a hardened DSH companion guard, and harness control-plane gates.

Headline

  • Env vs product verify — verify.sh exit 75 (EX_TEMPFAIL), exit 127 (command not found), or a VERIFY_CLASS=env line parks the loop (status: waiting, HITL) instead of sending another worker. Other non-zero exits stay product failures and keep iterating. VerifyResult.verifyClass is ok | product | env. deriveLoopRunStatus maps env-class lastVerify / failed setup to waiting.
  • Harness setup — optional loop.json setup, or setup.sh beside GOAL.md. Runs once, awaited, before the first worker. Evidence in setup.log / run-report.md. Failure does not spawn a worker and restores frozen spec files if setup mutated them. Template: templates/setup.example.sh.
  • Frozen files — after each visit the harness restores GOAL.md, loop.json, verify.sh, VERIFY.skill.md, RESEARCH.md, PERMISSIONS.md, and setup.sh if a worker edited them, and fails that visit. The worker prompt names all seven.
  • Single-screen setup wizard — one persistent Ink render shows the recap plus the current question instead of appending a block per prompt. Back re-asks one step; the review screen re-asks one row and keeps the rest, dropping disabled-branch answers (Telegram, Taskwarrior UUID). A re-asked row starts on your previous answer, so Enter keeps it. --plain / --answers unchanged.
  • DeepSeek 4.1 Flash on the DSH runtime — deepseek-official/deepseek-flash (the DSH DeepSeek-V41-Flash catalog row, image-capable by default) joins the setup menu, usage pricing, and docs/dsh-runtime.md. The pinned deepseek-v4-flash stays the DSH worker default; opt in per loop.
  • DSH companion guard hardening (@dancingteeth/dsh-agent-looper 0.1.1, first npm release) — the bash guard denies foreground grind launches: agent-loop run and bare agent-loop <loop-dir>, agent-loop-batch, node dist/cli/run.js / ./dist/cli/run.js, and tsx src/cli/run.ts, whether started via npx / pnpm exec / pnpm agent-loop / node_modules/.bin, behind doppler run … --, sudo -u, env -i, timeout, or nice, inside subshells or if / then bodies, through $() / backtick substitution or bash -c / -lc / --login -c, or in executed heredocs. It also blocks secret copy-outs (cp / mv / rsync / install, < file redirects) and env dumps (doppler run … -- env / printenv, doppler configure), while allowing commands that merely mention the CLI (rg, git log --grep, sed, single-quoted text, doc-writing heredocs).

Also

  • Judge prompts fence the goal, diff stat, and REVIEWS.md as data, so instructions injected into them cannot steer the verdict.
  • With reviewGate on, the configured secondary judge always runs instead of being skipped on a primary PASS.
  • Log-append, Cline usage, and OpenCode permission-reply failures are logged instead of thrown or swallowed.
  • agent-loop-batch lists each loop's verify / finalVerify / setup in the shell-trust warning (same gate as a single agent-loop run).
  • DSH plugin: registrations are released through ctx.effect, a missing skillsDir warns through ctx.logger, CI compiles the plugin, and its guard cases run in pnpm test.
  • Landing site: deterministic-check copy, judge caveat, rewritten FAQ and install paths.

Compatibility

  • A verify.sh that used exit 75 or 127 for product failures now parks instead of iterating — switch those to another non-zero exit.
  • A setup.sh beside GOAL.md now runs automatically before the first worker; it is listed in the shell-trust warning.
  • A worker visit that edits a frozen file is restored and counted as failed.
  • AgentLoopPhase gains SETUP (emitted only when setup runs). Phase events stay Experimental.
  • Pre-0.6.0 lines are unsupported for security fixes.

npm · DSH plugin · tag

0.5.0

Choose a tag to compare

@dancingteeth dancingteeth released this 04 Sep 15:12

0.5.0 — 2026-09-04

Fix-until-green with a prompt TUI, Claude Code as a first-class runtime, list-vs-billed spend, and a documented embed contract.

Headline

  • agent-loop-prompt — Ink TUI: type an idea; the judge (not the worker) drafts GOAL.md + verify.sh; freeze lint rejects gameable greps; confirm; existing watch TUI grinds. Optional preview after green is trust-gated and is not executed by agent-loop run. Resume lines keep Doppler when the shell was started that way.
  • Claude Code worker and judge — runtime: claude / reviewRuntime: claude spawn PATH claude -p once per outer iteration under --safe-mode (CLI 2.1.169+). No CLAUDE.md, hooks, plugins, MCP, skills, or auto-memory. --no-session-persistence plus CLAUDE_CODE_DISABLE_AUTO_MEMORY=1. Child unsets ANTHROPIC_API_KEY so print mode uses Claude Code login, not Console pay-per-token. Worker default sonnet (escalate opus); Claude judge default opus. Not on costPreset minmax. No @anthropic-ai/claude-agent-sdk on the CLI package. See docs/claude-runtime.md.
  • List vs billed spend — Watch and run-report show list (public API rates, including prompt-cache read/write) and billed (runtime invoice). Subscription quota $0 is billed $0, not free; maxCostUsd uses billed when PAYG and list when the invoice is $0. DSH headless usage is parsed from session JSONL (including logs that grow in place).
  • Embed contract + security policy — docs/embed-api.md names stable vs experimental exports, Portal-storable shapes, ADE composition, and a hard-to-rewrite bill of materials. AgentLoopPhase / AgentLoopPhaseEvent are re-exported from the package entry. SECURITY.md: security@dancingteeth.net and GitHub private vulnerability reporting. Supported line: 0.5.x only.

Also

  • OpenRouter :free slugs as valid OpenCode BYOK worker ids; setup labels hosted-$0 stacks.
  • Review gate treats BLOCKERS with an empty list as unparseable, not a silent pass. Verify spawn buffer no longer kills a passing oversized log.
  • Hosts can pass workerSession into runAgentLoop (still disposed at end of run).
  • Muse Spark 1.3 is the setup/docs default (1.2 stays as a prior pick). Contributor vs PAYG is billing, not a worker/judge pair.
  • Watch TUI: live assistant stream + pid pulse; OpenCode tools in the run report; check-running-loops distinguishes alive / stale / hung / dead / done.
  • OpenCode skill preflight relinks or drops dangling ~/.agents/skills symlinks after Cursor plugin-cache rotations.
  • Competitive-steal planning notes are gitignored and no longer ship in the tarball.
  • Publish CI runs on Node 22.15 (DSH zlib.zstd*).

Compatibility

  • Claude Code 2.1.169+ required for runtime: claude.
  • Default costPreset is still minmax.
  • Phase events stay Experimental (no schemaVersion yet). No thin-core package.json export subpath.
  • Pre-0.5.0 lines are unsupported for security fixes.

npm · tag