@mobrienv/autoloop 0.3.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -43
- package/bin/autoloop +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/testing/mock-backend.js +3 -5
- package/dist/testing/mock-backend.js.map +1 -1
- package/package.json +32 -10
- package/plugins/autoloop/.claude-plugin/plugin.json +1 -1
- package/dist/agent-map.d.ts +0 -10
- package/dist/agent-map.js +0 -58
- package/dist/agent-map.js.map +0 -1
- package/dist/backend/acp-client.d.ts +0 -38
- package/dist/backend/acp-client.js +0 -288
- package/dist/backend/acp-client.js.map +0 -1
- package/dist/backend/index.d.ts +0 -10
- package/dist/backend/index.js +0 -71
- package/dist/backend/index.js.map +0 -1
- package/dist/backend/kiro-bridge.d.ts +0 -17
- package/dist/backend/kiro-bridge.js +0 -84
- package/dist/backend/kiro-bridge.js.map +0 -1
- package/dist/backend/kiro-worker.d.ts +0 -1
- package/dist/backend/kiro-worker.js +0 -92
- package/dist/backend/kiro-worker.js.map +0 -1
- package/dist/backend/run-command.d.ts +0 -7
- package/dist/backend/run-command.js +0 -50
- package/dist/backend/run-command.js.map +0 -1
- package/dist/backend/run-kiro.d.ts +0 -3
- package/dist/backend/run-kiro.js +0 -16
- package/dist/backend/run-kiro.js.map +0 -1
- package/dist/backend/run-mock.d.ts +0 -1
- package/dist/backend/run-mock.js +0 -6
- package/dist/backend/run-mock.js.map +0 -1
- package/dist/backend/run-pi.d.ts +0 -5
- package/dist/backend/run-pi.js +0 -5
- package/dist/backend/run-pi.js.map +0 -1
- package/dist/backend/types.d.ts +0 -21
- package/dist/backend/types.js +0 -2
- package/dist/backend/types.js.map +0 -1
- package/dist/chains/budget.d.ts +0 -7
- package/dist/chains/budget.js +0 -54
- package/dist/chains/budget.js.map +0 -1
- package/dist/chains/load.d.ts +0 -18
- package/dist/chains/load.js +0 -129
- package/dist/chains/load.js.map +0 -1
- package/dist/chains/render.d.ts +0 -2
- package/dist/chains/render.js +0 -74
- package/dist/chains/render.js.map +0 -1
- package/dist/chains/run.d.ts +0 -17
- package/dist/chains/run.js +0 -260
- package/dist/chains/run.js.map +0 -1
- package/dist/chains/types.d.ts +0 -38
- package/dist/chains/types.js +0 -2
- package/dist/chains/types.js.map +0 -1
- package/dist/chains.d.ts +0 -6
- package/dist/chains.js +0 -5
- package/dist/chains.js.map +0 -1
- package/dist/commands/chain.d.ts +0 -1
- package/dist/commands/chain.js +0 -53
- package/dist/commands/chain.js.map +0 -1
- package/dist/commands/config.d.ts +0 -1
- package/dist/commands/config.js +0 -74
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -1
- package/dist/commands/dashboard.js +0 -68
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/commands/guide.d.ts +0 -1
- package/dist/commands/guide.js +0 -33
- package/dist/commands/guide.js.map +0 -1
- package/dist/commands/inspect.d.ts +0 -1
- package/dist/commands/inspect.js +0 -203
- package/dist/commands/inspect.js.map +0 -1
- package/dist/commands/list.d.ts +0 -1
- package/dist/commands/list.js +0 -15
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/loops.d.ts +0 -1
- package/dist/commands/loops.js +0 -72
- package/dist/commands/loops.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -1
- package/dist/commands/memory.js +0 -65
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/pi-adapter.d.ts +0 -1
- package/dist/commands/pi-adapter.js +0 -6
- package/dist/commands/pi-adapter.js.map +0 -1
- package/dist/commands/run.d.ts +0 -1
- package/dist/commands/run.js +0 -292
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/runs.d.ts +0 -1
- package/dist/commands/runs.js +0 -50
- package/dist/commands/runs.js.map +0 -1
- package/dist/commands/task.d.ts +0 -1
- package/dist/commands/task.js +0 -74
- package/dist/commands/task.js.map +0 -1
- package/dist/commands/worktree.d.ts +0 -1
- package/dist/commands/worktree.js +0 -162
- package/dist/commands/worktree.js.map +0 -1
- package/dist/config.d.ts +0 -31
- package/dist/config.js +0 -261
- package/dist/config.js.map +0 -1
- package/dist/dashboard/app.d.ts +0 -12
- package/dist/dashboard/app.js +0 -23
- package/dist/dashboard/app.js.map +0 -1
- package/dist/dashboard/routes/api.d.ts +0 -3
- package/dist/dashboard/routes/api.js +0 -130
- package/dist/dashboard/routes/api.js.map +0 -1
- package/dist/dashboard/routes/pages.d.ts +0 -2
- package/dist/dashboard/routes/pages.js +0 -14
- package/dist/dashboard/routes/pages.js.map +0 -1
- package/dist/dashboard/views/alpine-vendor.d.ts +0 -1
- package/dist/dashboard/views/alpine-vendor.js +0 -10
- package/dist/dashboard/views/alpine-vendor.js.map +0 -1
- package/dist/dashboard/views/shell.d.ts +0 -1
- package/dist/dashboard/views/shell.js +0 -746
- package/dist/dashboard/views/shell.js.map +0 -1
- package/dist/events/decode.d.ts +0 -2
- package/dist/events/decode.js +0 -45
- package/dist/events/decode.js.map +0 -1
- package/dist/events/encode.d.ts +0 -2
- package/dist/events/encode.js +0 -33
- package/dist/events/encode.js.map +0 -1
- package/dist/events/guards.d.ts +0 -5
- package/dist/events/guards.js +0 -42
- package/dist/events/guards.js.map +0 -1
- package/dist/events/types.d.ts +0 -26
- package/dist/events/types.js +0 -2
- package/dist/events/types.js.map +0 -1
- package/dist/harness/config-helpers.d.ts +0 -35
- package/dist/harness/config-helpers.js +0 -411
- package/dist/harness/config-helpers.js.map +0 -1
- package/dist/harness/coordination.d.ts +0 -1
- package/dist/harness/coordination.js +0 -127
- package/dist/harness/coordination.js.map +0 -1
- package/dist/harness/display.d.ts +0 -21
- package/dist/harness/display.js +0 -176
- package/dist/harness/display.js.map +0 -1
- package/dist/harness/emit.d.ts +0 -15
- package/dist/harness/emit.js +0 -240
- package/dist/harness/emit.js.map +0 -1
- package/dist/harness/index.d.ts +0 -13
- package/dist/harness/index.js +0 -240
- package/dist/harness/index.js.map +0 -1
- package/dist/harness/iteration.d.ts +0 -16
- package/dist/harness/iteration.js +0 -131
- package/dist/harness/iteration.js.map +0 -1
- package/dist/harness/journal.d.ts +0 -31
- package/dist/harness/journal.js +0 -178
- package/dist/harness/journal.js.map +0 -1
- package/dist/harness/metareview.d.ts +0 -4
- package/dist/harness/metareview.js +0 -48
- package/dist/harness/metareview.js.map +0 -1
- package/dist/harness/metrics.d.ts +0 -12
- package/dist/harness/metrics.js +0 -180
- package/dist/harness/metrics.js.map +0 -1
- package/dist/harness/parallel.d.ts +0 -37
- package/dist/harness/parallel.js +0 -237
- package/dist/harness/parallel.js.map +0 -1
- package/dist/harness/prompt.d.ts +0 -46
- package/dist/harness/prompt.js +0 -403
- package/dist/harness/prompt.js.map +0 -1
- package/dist/harness/scratchpad.d.ts +0 -2
- package/dist/harness/scratchpad.js +0 -67
- package/dist/harness/scratchpad.js.map +0 -1
- package/dist/harness/stop.d.ts +0 -5
- package/dist/harness/stop.js +0 -70
- package/dist/harness/stop.js.map +0 -1
- package/dist/harness/tools.d.ts +0 -3
- package/dist/harness/tools.js +0 -65
- package/dist/harness/tools.js.map +0 -1
- package/dist/harness/types.d.ts +0 -110
- package/dist/harness/types.js +0 -2
- package/dist/harness/types.js.map +0 -1
- package/dist/harness/wave/finalize-wave.d.ts +0 -9
- package/dist/harness/wave/finalize-wave.js +0 -87
- package/dist/harness/wave/finalize-wave.js.map +0 -1
- package/dist/harness/wave/launch-branches.d.ts +0 -6
- package/dist/harness/wave/launch-branches.js +0 -314
- package/dist/harness/wave/launch-branches.js.map +0 -1
- package/dist/harness/wave/parse-objectives.d.ts +0 -3
- package/dist/harness/wave/parse-objectives.js +0 -32
- package/dist/harness/wave/parse-objectives.js.map +0 -1
- package/dist/harness/wave/types.d.ts +0 -43
- package/dist/harness/wave/types.js +0 -2
- package/dist/harness/wave/types.js.map +0 -1
- package/dist/harness/wave.d.ts +0 -6
- package/dist/harness/wave.js +0 -159
- package/dist/harness/wave.js.map +0 -1
- package/dist/isolation/index.d.ts +0 -4
- package/dist/isolation/index.js +0 -3
- package/dist/isolation/index.js.map +0 -1
- package/dist/isolation/resolve.d.ts +0 -39
- package/dist/isolation/resolve.js +0 -118
- package/dist/isolation/resolve.js.map +0 -1
- package/dist/isolation/run-scope.d.ts +0 -21
- package/dist/isolation/run-scope.js +0 -50
- package/dist/isolation/run-scope.js.map +0 -1
- package/dist/json.d.ts +0 -8
- package/dist/json.js +0 -82
- package/dist/json.js.map +0 -1
- package/dist/loops/health.d.ts +0 -16
- package/dist/loops/health.js +0 -152
- package/dist/loops/health.js.map +0 -1
- package/dist/loops/list.d.ts +0 -6
- package/dist/loops/list.js +0 -21
- package/dist/loops/list.js.map +0 -1
- package/dist/loops/policy.d.ts +0 -6
- package/dist/loops/policy.js +0 -41
- package/dist/loops/policy.js.map +0 -1
- package/dist/loops/render.d.ts +0 -19
- package/dist/loops/render.js +0 -100
- package/dist/loops/render.js.map +0 -1
- package/dist/loops/show.d.ts +0 -8
- package/dist/loops/show.js +0 -31
- package/dist/loops/show.js.map +0 -1
- package/dist/loops/watch.d.ts +0 -14
- package/dist/loops/watch.js +0 -143
- package/dist/loops/watch.js.map +0 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -148
- package/dist/main.js.map +0 -1
- package/dist/markdown.d.ts +0 -10
- package/dist/markdown.js +0 -66
- package/dist/markdown.js.map +0 -1
- package/dist/memory-render.d.ts +0 -6
- package/dist/memory-render.js +0 -81
- package/dist/memory-render.js.map +0 -1
- package/dist/memory.d.ts +0 -22
- package/dist/memory.js +0 -318
- package/dist/memory.js.map +0 -1
- package/dist/pi-adapter.d.ts +0 -1
- package/dist/pi-adapter.js +0 -220
- package/dist/pi-adapter.js.map +0 -1
- package/dist/profiles.d.ts +0 -12
- package/dist/profiles.js +0 -71
- package/dist/profiles.js.map +0 -1
- package/dist/registry/derive.d.ts +0 -8
- package/dist/registry/derive.js +0 -88
- package/dist/registry/derive.js.map +0 -1
- package/dist/registry/discover.d.ts +0 -20
- package/dist/registry/discover.js +0 -98
- package/dist/registry/discover.js.map +0 -1
- package/dist/registry/harness.d.ts +0 -7
- package/dist/registry/harness.js +0 -63
- package/dist/registry/harness.js.map +0 -1
- package/dist/registry/index.d.ts +0 -6
- package/dist/registry/index.js +0 -6
- package/dist/registry/index.js.map +0 -1
- package/dist/registry/read.d.ts +0 -11
- package/dist/registry/read.js +0 -50
- package/dist/registry/read.js.map +0 -1
- package/dist/registry/rebuild.d.ts +0 -5
- package/dist/registry/rebuild.js +0 -22
- package/dist/registry/rebuild.js.map +0 -1
- package/dist/registry/types.d.ts +0 -28
- package/dist/registry/types.js +0 -2
- package/dist/registry/types.js.map +0 -1
- package/dist/registry/update.d.ts +0 -2
- package/dist/registry/update.js +0 -7
- package/dist/registry/update.js.map +0 -1
- package/dist/tasks-render.d.ts +0 -2
- package/dist/tasks-render.js +0 -44
- package/dist/tasks-render.js.map +0 -1
- package/dist/tasks.d.ts +0 -24
- package/dist/tasks.js +0 -184
- package/dist/tasks.js.map +0 -1
- package/dist/topology.d.ts +0 -31
- package/dist/topology.js +0 -309
- package/dist/topology.js.map +0 -1
- package/dist/usage.d.ts +0 -9
- package/dist/usage.js +0 -159
- package/dist/usage.js.map +0 -1
- package/dist/utils.d.ts +0 -21
- package/dist/utils.js +0 -349
- package/dist/utils.js.map +0 -1
- package/dist/worktree/clean.d.ts +0 -12
- package/dist/worktree/clean.js +0 -98
- package/dist/worktree/clean.js.map +0 -1
- package/dist/worktree/create.d.ts +0 -14
- package/dist/worktree/create.js +0 -71
- package/dist/worktree/create.js.map +0 -1
- package/dist/worktree/index.d.ts +0 -10
- package/dist/worktree/index.js +0 -6
- package/dist/worktree/index.js.map +0 -1
- package/dist/worktree/list.d.ts +0 -9
- package/dist/worktree/list.js +0 -24
- package/dist/worktree/list.js.map +0 -1
- package/dist/worktree/merge.d.ts +0 -11
- package/dist/worktree/merge.js +0 -129
- package/dist/worktree/merge.js.map +0 -1
- package/dist/worktree/meta.d.ts +0 -17
- package/dist/worktree/meta.js +0 -34
- package/dist/worktree/meta.js.map +0 -1
- package/presets/autocode/README.md +0 -81
- package/presets/autocode/autoloops.toml +0 -30
- package/presets/autocode/harness.md +0 -26
- package/presets/autocode/miniloops.toml +0 -22
- package/presets/autocode/roles/build.md +0 -34
- package/presets/autocode/roles/critic.md +0 -40
- package/presets/autocode/roles/finalizer.md +0 -43
- package/presets/autocode/roles/planner.md +0 -40
- package/presets/autocode/topology.toml +0 -32
- package/presets/autodoc/README.md +0 -42
- package/presets/autodoc/autoloops.toml +0 -21
- package/presets/autodoc/harness.md +0 -19
- package/presets/autodoc/miniloops.toml +0 -21
- package/presets/autodoc/roles/auditor.md +0 -39
- package/presets/autodoc/roles/checker.md +0 -43
- package/presets/autodoc/roles/publisher.md +0 -51
- package/presets/autodoc/roles/writer.md +0 -37
- package/presets/autodoc/topology.toml +0 -31
- package/presets/autofix/README.md +0 -56
- package/presets/autofix/autoloops.toml +0 -24
- package/presets/autofix/harness.md +0 -25
- package/presets/autofix/miniloops.toml +0 -21
- package/presets/autofix/roles/closer.md +0 -48
- package/presets/autofix/roles/diagnoser.md +0 -43
- package/presets/autofix/roles/fixer.md +0 -28
- package/presets/autofix/roles/verifier.md +0 -31
- package/presets/autofix/topology.toml +0 -33
- package/presets/autoideas/README.md +0 -73
- package/presets/autoideas/autoloops.toml +0 -18
- package/presets/autoideas/harness.md +0 -31
- package/presets/autoideas/miniloops.toml +0 -18
- package/presets/autoideas/roles/analyst.md +0 -32
- package/presets/autoideas/roles/reviewer.md +0 -36
- package/presets/autoideas/roles/scanner.md +0 -26
- package/presets/autoideas/roles/synthesizer.md +0 -61
- package/presets/autoideas/topology.toml +0 -32
- package/presets/automerge/README.md +0 -3
- package/presets/automerge/autoloops.toml +0 -12
- package/presets/automerge/harness.md +0 -10
- package/presets/automerge/miniloops.toml +0 -12
- package/presets/automerge/roles/merge.md +0 -10
- package/presets/automerge/topology.toml +0 -10
- package/presets/autoperf/README.md +0 -56
- package/presets/autoperf/autoloops.toml +0 -21
- package/presets/autoperf/harness.md +0 -21
- package/presets/autoperf/miniloops.toml +0 -21
- package/presets/autoperf/roles/judge.md +0 -38
- package/presets/autoperf/roles/measurer.md +0 -36
- package/presets/autoperf/roles/optimizer.md +0 -35
- package/presets/autoperf/roles/profiler.md +0 -38
- package/presets/autoperf/topology.toml +0 -32
- package/presets/autopr/README.md +0 -99
- package/presets/autopr/autoloops.toml +0 -22
- package/presets/autopr/harness.md +0 -27
- package/presets/autopr/miniloops.toml +0 -22
- package/presets/autopr/roles/collector.md +0 -55
- package/presets/autopr/roles/drafter.md +0 -38
- package/presets/autopr/roles/publisher.md +0 -28
- package/presets/autopr/roles/validator.md +0 -31
- package/presets/autopr/topology.toml +0 -32
- package/presets/autoqa/README.md +0 -76
- package/presets/autoqa/autoloops.toml +0 -21
- package/presets/autoqa/harness.md +0 -30
- package/presets/autoqa/miniloops.toml +0 -21
- package/presets/autoqa/roles/executor.md +0 -43
- package/presets/autoqa/roles/inspector.md +0 -45
- package/presets/autoqa/roles/planner.md +0 -55
- package/presets/autoqa/roles/reporter.md +0 -74
- package/presets/autoqa/topology.toml +0 -31
- package/presets/autoresearch/README.md +0 -63
- package/presets/autoresearch/autoloops.toml +0 -18
- package/presets/autoresearch/harness.md +0 -28
- package/presets/autoresearch/miniloops.toml +0 -18
- package/presets/autoresearch/roles/benchmarker.md +0 -34
- package/presets/autoresearch/roles/evaluator.md +0 -33
- package/presets/autoresearch/roles/implementer.md +0 -26
- package/presets/autoresearch/roles/strategist.md +0 -43
- package/presets/autoresearch/topology.toml +0 -31
- package/presets/autoreview/README.md +0 -51
- package/presets/autoreview/autoloops.toml +0 -21
- package/presets/autoreview/harness.md +0 -20
- package/presets/autoreview/miniloops.toml +0 -21
- package/presets/autoreview/roles/checker.md +0 -36
- package/presets/autoreview/roles/reader.md +0 -33
- package/presets/autoreview/roles/suggester.md +0 -26
- package/presets/autoreview/roles/summarizer.md +0 -57
- package/presets/autoreview/topology.toml +0 -31
- package/presets/autosec/README.md +0 -51
- package/presets/autosec/autoloops.toml +0 -21
- package/presets/autosec/harness.md +0 -20
- package/presets/autosec/miniloops.toml +0 -21
- package/presets/autosec/roles/analyst.md +0 -38
- package/presets/autosec/roles/hardener.md +0 -36
- package/presets/autosec/roles/reporter.md +0 -63
- package/presets/autosec/roles/scanner.md +0 -38
- package/presets/autosec/topology.toml +0 -31
- package/presets/autosimplify/README.md +0 -83
- package/presets/autosimplify/autoloops.toml +0 -26
- package/presets/autosimplify/harness.md +0 -25
- package/presets/autosimplify/miniloops.toml +0 -22
- package/presets/autosimplify/roles/reviewer.md +0 -38
- package/presets/autosimplify/roles/scoper.md +0 -42
- package/presets/autosimplify/roles/simplifier.md +0 -51
- package/presets/autosimplify/roles/verifier.md +0 -40
- package/presets/autosimplify/topology.toml +0 -32
- package/presets/autospec/README.md +0 -84
- package/presets/autospec/autoloops.toml +0 -21
- package/presets/autospec/harness.md +0 -23
- package/presets/autospec/miniloops.toml +0 -21
- package/presets/autospec/roles/clarifier.md +0 -39
- package/presets/autospec/roles/critic.md +0 -41
- package/presets/autospec/roles/designer.md +0 -37
- package/presets/autospec/roles/planner.md +0 -38
- package/presets/autospec/roles/researcher.md +0 -33
- package/presets/autospec/topology.toml +0 -38
- package/presets/autotest/README.md +0 -55
- package/presets/autotest/autoloops.toml +0 -21
- package/presets/autotest/harness.md +0 -21
- package/presets/autotest/miniloops.toml +0 -21
- package/presets/autotest/roles/assessor.md +0 -57
- package/presets/autotest/roles/runner.md +0 -31
- package/presets/autotest/roles/surveyor.md +0 -39
- package/presets/autotest/roles/writer.md +0 -37
- package/presets/autotest/topology.toml +0 -32
package/README.md
CHANGED
|
@@ -1,21 +1,85 @@
|
|
|
1
1
|
# autoloop
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
autoloop is a spinoff of ralph-orchestrator built to keep the parts that mattered and drop a lot of the extra experimental surface area.
|
|
4
|
+
|
|
5
|
+
It’s a simpler, more opinionated loop harness for long-running agent work: inspectable runs, easier preset-driven workflows, and operator surfaces that agents can use directly too.
|
|
6
|
+
|
|
7
|
+
It’s early and still evolving. autoloop is not a replacement for ralph-orchestrator — it’s a cleaner path for exploring a simpler UX without breaking Ralph.
|
|
4
8
|
|
|
5
9
|
[](https://www.npmjs.com/package/@mobrienv/autoloop)
|
|
10
|
+
[](https://mikeyobrien.github.io/autoloop/)
|
|
6
11
|
[](https://nodejs.org/)
|
|
7
12
|
|
|
8
|
-
|
|
13
|
+
**[Read the docs →](https://mikeyobrien.github.io/autoloop/)**
|
|
14
|
+
|
|
15
|
+
[](docs/launches/autoloop-hybrid-launch-video-x.mp4)
|
|
16
|
+
|
|
17
|
+
## Use as a library
|
|
18
|
+
|
|
19
|
+
As of `0.5.0-sdk.0`, autoloop ships an embed-able runtime alongside the CLI. Pass an `AbortSignal` for cancellation and an `onEvent` callback to consume the structured event stream — no terminal output is produced unless you ask for it.
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { run, type LoopEvent } from "@mobrienv/autoloop";
|
|
23
|
+
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
setTimeout(() => controller.abort(), 60_000);
|
|
26
|
+
|
|
27
|
+
const summary = await run("./my-project", "build the login page", "autoloop", {
|
|
28
|
+
signal: controller.signal,
|
|
29
|
+
onEvent: (event: LoopEvent) => {
|
|
30
|
+
if (event.type === "iteration.start") console.log(`iter ${event.iteration}`);
|
|
31
|
+
if (event.type === "loop.finish") console.log(`done: ${event.stopReason}`);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
console.log(summary); // { iterations, stopReason, runId }
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The CLI entry (`bin/autoloop`) is still the primary interface; the library export is for agent frameworks and dashboards that want to drive loops in-process.
|
|
39
|
+
|
|
40
|
+
## Why autoloop exists
|
|
41
|
+
|
|
42
|
+
ralph-orchestrator grew to include a lot of different experiments and ways of doing things. autoloop spins out a narrower set of ideas into something simpler and more opinionated.
|
|
43
|
+
|
|
44
|
+
The bet is that long-running agent workflows get much better when they are:
|
|
45
|
+
|
|
46
|
+
- inspectable after every iteration
|
|
47
|
+
- easy to launch through reusable presets
|
|
48
|
+
- safe to run in isolation when they touch real code
|
|
49
|
+
- operable by both humans and agents
|
|
9
50
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
51
|
+
If Ralph is the broader experimentation surface, autoloop is the cleaner runtime path.
|
|
52
|
+
|
|
53
|
+
## What it emphasizes
|
|
54
|
+
|
|
55
|
+
- **Inspectable long-running loops** -- every iteration is recorded in an append-only journal, with tools to inspect prompts, outputs, topology, metrics, tasks, memory, and artifacts
|
|
56
|
+
- **Easier preset-driven workflows** -- bundled presets give you a fast starting point, and custom preset creation is a first-class path
|
|
57
|
+
- **Operator visibility** -- `loops`, `watch`, `health`, `inspect`, and the local dashboard show what actually happened
|
|
58
|
+
- **Worktree isolation + automerge** -- run risky coding passes in git worktrees and merge them back only when ready
|
|
59
|
+
- **Designed for agents too** -- autoloop is intentionally shaped as a surface that agents can use directly, not just a human operator CLI
|
|
14
60
|
- **Dynamic chains** -- compose presets into multi-stage pipelines
|
|
15
|
-
- **
|
|
61
|
+
- **Persistent memory + profiles** -- loops accumulate learnings across runs and can load repo/user tuning profiles
|
|
62
|
+
|
|
63
|
+
## What autoloop is
|
|
64
|
+
|
|
65
|
+
- a simpler, more opinionated spinoff of ralph-orchestrator
|
|
66
|
+
- a loop harness for long-running agent workflows
|
|
67
|
+
- a system built around inspectability, presets, and operator visibility
|
|
68
|
+
- a tool for both human operators and agents
|
|
69
|
+
|
|
70
|
+
## What it is not
|
|
71
|
+
|
|
72
|
+
- not a replacement for ralph-orchestrator
|
|
73
|
+
- not just a thin CLI wrapper around model calls
|
|
74
|
+
- not a generic workflow engine for everything
|
|
75
|
+
- not optimized for the broadest possible feature surface
|
|
16
76
|
|
|
17
77
|
## Table of contents
|
|
18
78
|
|
|
79
|
+
- [Why autoloop exists](#why-autoloop-exists)
|
|
80
|
+
- [What it emphasizes](#what-it-emphasizes)
|
|
81
|
+
- [What autoloop is](#what-autoloop-is)
|
|
82
|
+
- [What it is not](#what-it-is-not)
|
|
19
83
|
- [Install](#install)
|
|
20
84
|
- [Quick start](#quick-start)
|
|
21
85
|
- [Usage](#usage)
|
|
@@ -33,7 +97,6 @@ Autonomous LLM loop harness for long-horizon, multi-role agent work.
|
|
|
33
97
|
|
|
34
98
|
```bash
|
|
35
99
|
npm install -g @mobrienv/autoloop
|
|
36
|
-
autoloop --help
|
|
37
100
|
```
|
|
38
101
|
|
|
39
102
|
### From source
|
|
@@ -50,31 +113,51 @@ node bin/autoloop --help
|
|
|
50
113
|
```bash
|
|
51
114
|
# Run a bundled preset
|
|
52
115
|
autoloop run autocode "Fix the login bug"
|
|
116
|
+
|
|
117
|
+
# Inspect active and recent runs
|
|
118
|
+
autoloop loops
|
|
119
|
+
|
|
120
|
+
# Open the local dashboard
|
|
121
|
+
autoloop dashboard
|
|
122
|
+
|
|
123
|
+
# Keep an implementation pass isolated in a git worktree
|
|
124
|
+
autoloop run autocode --worktree --automerge "Implement the approved fix"
|
|
53
125
|
```
|
|
54
126
|
|
|
55
|
-
`autocode` is a bundled preset. The quoted string is the
|
|
127
|
+
`autocode` is a bundled preset. The quoted string is the objective passed to the loop.
|
|
128
|
+
|
|
129
|
+
The usual golden path is:
|
|
130
|
+
|
|
131
|
+
1. start a loop with a preset
|
|
132
|
+
2. watch it move through iterations
|
|
133
|
+
3. inspect the journal, events, and artifacts
|
|
134
|
+
4. open the dashboard when you want a higher-level operator view
|
|
135
|
+
5. use worktree isolation when the loop is making risky repo changes
|
|
56
136
|
|
|
57
137
|
## Usage
|
|
58
138
|
|
|
139
|
+
The main commands are:
|
|
140
|
+
|
|
59
141
|
```
|
|
60
142
|
autoloop run <preset-name|preset-dir> [prompt...] [flags]
|
|
61
|
-
autoloop emit <topic> [summary]
|
|
62
|
-
autoloop inspect <artifact> [selector] [project-dir] [--format <md|terminal|text|json|csv>]
|
|
63
|
-
autoloop memory <list|add|remove> [args]
|
|
64
|
-
autoloop task <add|complete|update|remove|list> [args]
|
|
65
143
|
autoloop list
|
|
66
144
|
autoloop loops [--all]
|
|
67
145
|
autoloop loops show <run-id>
|
|
68
146
|
autoloop loops artifacts <run-id>
|
|
69
147
|
autoloop loops watch <run-id>
|
|
70
|
-
autoloop
|
|
148
|
+
autoloop inspect <artifact> [selector] [project-dir] [--format <md|terminal|text|json|csv|graph>]
|
|
149
|
+
autoloop dashboard [--port <port>]
|
|
150
|
+
autoloop worktree <list|show|merge|clean> [args]
|
|
71
151
|
autoloop chain <list|run> [args]
|
|
152
|
+
autoloop emit <topic> [summary]
|
|
153
|
+
autoloop memory <list|status|find|add|remove> [args]
|
|
154
|
+
autoloop task <add|complete|update|remove|list> [args]
|
|
72
155
|
autoloop runs clean [--max-age <days>]
|
|
73
|
-
autoloop worktree <list|show|merge|clean> [args]
|
|
74
156
|
autoloop config <show|set|unset|path> [args]
|
|
75
|
-
autoloop dashboard [--port <port>]
|
|
76
157
|
```
|
|
77
158
|
|
|
159
|
+
Use `run` to start work, `loops` and `inspect` to understand what happened, and `dashboard` when you want a local operator surface.
|
|
160
|
+
|
|
78
161
|
### Flags
|
|
79
162
|
|
|
80
163
|
| Flag | Description |
|
|
@@ -90,17 +173,27 @@ autoloop dashboard [--port <port>]
|
|
|
90
173
|
### Examples
|
|
91
174
|
|
|
92
175
|
```bash
|
|
93
|
-
# Run a preset
|
|
176
|
+
# Run a preset against a coding task
|
|
94
177
|
autoloop run autocode "Refactor the auth module"
|
|
95
178
|
|
|
179
|
+
# Run a QA pass
|
|
180
|
+
autoloop run autoqa "Exercise the new onboarding flow and report UX issues"
|
|
181
|
+
|
|
96
182
|
# Run from a custom preset directory
|
|
97
183
|
autoloop run ./my-preset "Analyze the API"
|
|
98
184
|
|
|
99
|
-
#
|
|
100
|
-
autoloop run
|
|
185
|
+
# Keep implementation isolated in a worktree
|
|
186
|
+
autoloop run autocode --worktree --automerge "Implement the approved fix"
|
|
101
187
|
|
|
102
|
-
#
|
|
103
|
-
autoloop
|
|
188
|
+
# Watch a run in progress
|
|
189
|
+
autoloop loops watch <run-id>
|
|
190
|
+
|
|
191
|
+
# Inspect what happened after the run completes
|
|
192
|
+
autoloop inspect journal <run-id>
|
|
193
|
+
autoloop loops artifacts <run-id>
|
|
194
|
+
|
|
195
|
+
# Open the dashboard
|
|
196
|
+
autoloop dashboard
|
|
104
197
|
|
|
105
198
|
# Run an inline chain
|
|
106
199
|
autoloop run --chain autospec,autocode "Design and build feature X"
|
|
@@ -108,26 +201,30 @@ autoloop run --chain autospec,autocode "Design and build feature X"
|
|
|
108
201
|
|
|
109
202
|
## Bundled presets
|
|
110
203
|
|
|
204
|
+
Bundled presets give you opinionated starting points for common workflows like coding, QA, docs, review, security, specs, and performance.
|
|
205
|
+
|
|
111
206
|
| Preset | Purpose |
|
|
112
207
|
|--------|---------|
|
|
113
208
|
| `autocode` | Plan, build, review, and commit code changes |
|
|
114
|
-
| `
|
|
115
|
-
| `autofix` | Diagnose, fix, and verify bugs |
|
|
209
|
+
| `autosimplify` | Scope, simplify, verify, and review code for simplicity |
|
|
116
210
|
| `autoideas` | Scan, analyze, review, and synthesize improvement ideas |
|
|
117
|
-
| `automerge` | Merge a completed worktree branch back into its base branch |
|
|
118
|
-
| `autoperf` | Profile, measure, optimize, and judge performance |
|
|
119
|
-
| `autopr` | Turn the current branch into a reviewable pull request |
|
|
120
|
-
| `autoqa` | Plan, execute, inspect, and report on QA |
|
|
121
211
|
| `autoresearch` | Research strategies, implement, evaluate, and benchmark |
|
|
212
|
+
| `autoqa` | Plan, execute, inspect, and report on QA |
|
|
213
|
+
| `autotest` | Survey, write, run, and assess tests |
|
|
214
|
+
| `autofix` | Diagnose, fix, and verify bugs |
|
|
122
215
|
| `autoreview` | Read, suggest, check, and summarize code reviews |
|
|
216
|
+
| `autodoc` | Audit, write, verify, and publish documentation |
|
|
123
217
|
| `autosec` | Scan, analyze, harden, and report on security |
|
|
124
|
-
| `
|
|
218
|
+
| `autoperf` | Profile, measure, optimize, and judge performance |
|
|
125
219
|
| `autospec` | Research, clarify, design, plan, and critique specifications |
|
|
126
|
-
| `
|
|
220
|
+
| `automerge` | Merge a completed worktree branch back into its base branch |
|
|
221
|
+
| `autopr` | Turn the current branch into a reviewable pull request |
|
|
127
222
|
|
|
128
223
|
## Creating custom presets
|
|
129
224
|
|
|
130
|
-
A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](
|
|
225
|
+
A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](https://mikeyobrien.github.io/autoloop/guides/creating-presets) for the full guide, or examine any `presets/<name>/` directory as a working example.
|
|
226
|
+
|
|
227
|
+
Some older or internal layouts may still include `miniloops.toml`, but `autoloops.toml` is the canonical entry point for new presets.
|
|
131
228
|
|
|
132
229
|
## Project structure
|
|
133
230
|
|
|
@@ -182,22 +279,22 @@ export MOCK_FIXTURE_PATH=test/fixtures/backend/complete-success.json
|
|
|
182
279
|
node bin/autoloop run . -b "node dist/testing/mock-backend.js"
|
|
183
280
|
```
|
|
184
281
|
|
|
185
|
-
See [CLI reference](
|
|
282
|
+
See [CLI reference](https://mikeyobrien.github.io/autoloop/reference/cli#mock-backend) for fixture schema and bundled scenarios.
|
|
186
283
|
|
|
187
284
|
## Further reading
|
|
188
285
|
|
|
189
|
-
- [Platform architecture](
|
|
190
|
-
- [Configuration reference](
|
|
191
|
-
- [Creating presets](
|
|
192
|
-
- [Topology and event routing](
|
|
193
|
-
- [Memory system](
|
|
194
|
-
- [Dynamic chains](
|
|
195
|
-
- [CLI reference](
|
|
196
|
-
- [Dashboard](
|
|
197
|
-
- [Profiles](
|
|
198
|
-
- [Tasks](
|
|
199
|
-
- [Worktree isolation](
|
|
200
|
-
- [Releasing](
|
|
286
|
+
- [Platform architecture](https://mikeyobrien.github.io/autoloop/concepts/platform)
|
|
287
|
+
- [Configuration reference](https://mikeyobrien.github.io/autoloop/reference/configuration)
|
|
288
|
+
- [Creating presets](https://mikeyobrien.github.io/autoloop/guides/creating-presets)
|
|
289
|
+
- [Topology and event routing](https://mikeyobrien.github.io/autoloop/reference/topology)
|
|
290
|
+
- [Memory system](https://mikeyobrien.github.io/autoloop/reference/memory)
|
|
291
|
+
- [Dynamic chains](https://mikeyobrien.github.io/autoloop/features/dynamic-chains)
|
|
292
|
+
- [CLI reference](https://mikeyobrien.github.io/autoloop/reference/cli)
|
|
293
|
+
- [Dashboard](https://mikeyobrien.github.io/autoloop/features/dashboard)
|
|
294
|
+
- [Profiles](https://mikeyobrien.github.io/autoloop/features/profiles)
|
|
295
|
+
- [Tasks](https://mikeyobrien.github.io/autoloop/features/tasks)
|
|
296
|
+
- [Worktree isolation](https://mikeyobrien.github.io/autoloop/features/worktree)
|
|
297
|
+
- [Releasing](https://mikeyobrien.github.io/autoloop/development/releasing)
|
|
201
298
|
|
|
202
299
|
## Contributing
|
|
203
300
|
|
package/bin/autoloop
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import('
|
|
2
|
+
import('@mobrienv/autoloop-cli');
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config";
|
|
2
|
+
export { type Config, defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, type LayeredConfig, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
|
|
3
|
+
export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
|
|
4
|
+
export type { EmitResult } from "@mobrienv/autoloop-harness/emit";
|
|
5
|
+
export type { LoopEvent, LoopEventEmitter, } from "@mobrienv/autoloop-harness/events";
|
|
6
|
+
export type { LoopContext, RunOptions, RunSummary, TriggerSource, Verdict, VerdictKind, } from "@mobrienv/autoloop-harness/types";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Public SDK entry point for @mobrienv/autoloop.
|
|
2
|
+
//
|
|
3
|
+
// This module re-exports the minimal surface SDK consumers need to embed
|
|
4
|
+
// autoloop in their own code. It is deliberately narrow; everything else
|
|
5
|
+
// (CLI render helpers, preset resolution, dashboard, etc.) stays internal.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// import { run, type LoopEvent } from "@mobrienv/autoloop";
|
|
9
|
+
//
|
|
10
|
+
// const summary = await run(projectDir, prompt, "autoloop", {
|
|
11
|
+
// signal: controller.signal,
|
|
12
|
+
// onEvent: (e: LoopEvent) => console.log(e.type),
|
|
13
|
+
// });
|
|
14
|
+
export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config";
|
|
15
|
+
// Pure config helpers, for consumers who want to inspect merged config
|
|
16
|
+
// without re-implementing the schema layer.
|
|
17
|
+
export { defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
|
|
18
|
+
export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,EAAE;AACF,SAAS;AACT,8DAA8D;AAC9D,EAAE;AACF,gEAAgE;AAChE,iCAAiC;AACjC,sDAAsD;AACtD,QAAQ;AAER,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,uEAAuE;AACvE,4CAA4C;AAC5C,OAAO,EAEL,QAAQ,IAAI,cAAc,EAC1B,GAAG,IAAI,SAAS,EAChB,MAAM,IAAI,YAAY,EACtB,OAAO,IAAI,aAAa,EAExB,SAAS,IAAI,eAAe,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { execFileSync } from "node:child_process";
|
|
12
12
|
import { readFileSync } from "node:fs";
|
|
13
|
-
import {
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { createRequire } from "node:module";
|
|
15
14
|
function fixturePathFromArgs() {
|
|
16
15
|
return process.argv[2] ?? "";
|
|
17
16
|
}
|
|
@@ -38,9 +37,8 @@ function loadFixture() {
|
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
39
|
function emitEvent(event, payload) {
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const mainEntry = resolve(distDir, "main.js");
|
|
40
|
+
const require = createRequire(import.meta.url);
|
|
41
|
+
const mainEntry = require.resolve("@mobrienv/autoloop-cli");
|
|
44
42
|
try {
|
|
45
43
|
execFileSync(process.execPath, [mainEntry, "emit", event, payload], {
|
|
46
44
|
encoding: "utf-8",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-backend.js","sourceRoot":"","sources":["../../src/testing/mock-backend.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mock-backend.js","sourceRoot":"","sources":["../../src/testing/mock-backend.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mobrienv/autoloop",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Simpler, opinionated loop harness for inspectable long-running agent workflows",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist/
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
7
15
|
"bin": {
|
|
8
16
|
"autoloop": "bin/autoloop"
|
|
9
17
|
},
|
|
10
18
|
"files": [
|
|
11
19
|
"bin/autoloop",
|
|
12
20
|
"dist",
|
|
13
|
-
"
|
|
14
|
-
"plugins",
|
|
21
|
+
"plugins/autoloop",
|
|
15
22
|
"README.md"
|
|
16
23
|
],
|
|
17
24
|
"engines": {
|
|
18
25
|
"node": ">=18"
|
|
19
26
|
},
|
|
27
|
+
"workspaces": [
|
|
28
|
+
"packages/core",
|
|
29
|
+
"packages/presets",
|
|
30
|
+
"packages/backends",
|
|
31
|
+
"packages/harness",
|
|
32
|
+
"packages/dashboard",
|
|
33
|
+
"packages/cli"
|
|
34
|
+
],
|
|
20
35
|
"repository": {
|
|
21
36
|
"type": "git",
|
|
22
37
|
"url": "git+https://github.com/mikeyobrien/autoloop.git"
|
|
@@ -38,7 +53,8 @@
|
|
|
38
53
|
"provenance": true
|
|
39
54
|
},
|
|
40
55
|
"scripts": {
|
|
41
|
-
"build": "tsc",
|
|
56
|
+
"build": "npm run build --workspaces && tsc",
|
|
57
|
+
"build:root": "tsc",
|
|
42
58
|
"lint": "biome check src/ test/",
|
|
43
59
|
"lint:fix": "biome check --write src/ test/",
|
|
44
60
|
"format": "biome format src/ test/",
|
|
@@ -47,6 +63,10 @@
|
|
|
47
63
|
"test:coverage": "node --experimental-vm-modules node_modules/.bin/vitest run --coverage",
|
|
48
64
|
"test:watch": "node --experimental-vm-modules node_modules/.bin/vitest",
|
|
49
65
|
"check": "biome check src/ test/ && tsc --noEmit && npm run test:coverage",
|
|
66
|
+
"release": "node bin/release",
|
|
67
|
+
"docs:dev": "vitepress dev docs",
|
|
68
|
+
"docs:build": "vitepress build docs",
|
|
69
|
+
"docs:preview": "vitepress preview docs",
|
|
50
70
|
"prepare": "husky",
|
|
51
71
|
"version": "node -e \"const p=require('./plugins/autoloop/.claude-plugin/plugin.json');p.version=require('./package.json').version;require('fs').writeFileSync('./plugins/autoloop/.claude-plugin/plugin.json',JSON.stringify(p,null,2)+'\\n')\" && git add plugins/autoloop/.claude-plugin/plugin.json"
|
|
52
72
|
},
|
|
@@ -63,12 +83,14 @@
|
|
|
63
83
|
"lint-staged": "^16.4.0",
|
|
64
84
|
"playwright": "^1.59.1",
|
|
65
85
|
"typescript": "^5.9.3",
|
|
86
|
+
"vitepress": "^1.6.4",
|
|
87
|
+
"vitepress-plugin-llmstxt": "^0.5.1",
|
|
66
88
|
"vitest": "^3.0.0"
|
|
67
89
|
},
|
|
68
90
|
"dependencies": {
|
|
69
|
-
"@
|
|
70
|
-
"@
|
|
71
|
-
"@
|
|
72
|
-
"
|
|
91
|
+
"@mobrienv/autoloop-cli": "0.7.0",
|
|
92
|
+
"@mobrienv/autoloop-core": "0.7.0",
|
|
93
|
+
"@mobrienv/autoloop-harness": "0.7.0",
|
|
94
|
+
"@mobrienv/autoloop-presets": "0.7.0"
|
|
73
95
|
}
|
|
74
96
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autoloop",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Run and operate autoloops — start runs, monitor progress, inject guidance, manage worktrees, inspect artifacts, and clean up.",
|
|
5
5
|
"homepage": "https://github.com/mikeyobrien/autoloop-ts",
|
|
6
6
|
"repository": "https://github.com/mikeyobrien/autoloop-ts",
|
package/dist/agent-map.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export interface AgentMap {
|
|
2
|
-
globalDefault: string;
|
|
3
|
-
presets: Record<string, PresetAgentMap>;
|
|
4
|
-
}
|
|
5
|
-
export interface PresetAgentMap {
|
|
6
|
-
defaultAgent: string;
|
|
7
|
-
roles: Record<string, string>;
|
|
8
|
-
}
|
|
9
|
-
export declare function loadAgentMap(projectDir: string): AgentMap | null;
|
|
10
|
-
export declare function resolveRoleAgent(agentMap: AgentMap | null, presetName: string, roleId: string): string | undefined;
|
package/dist/agent-map.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Loads and resolves per-role agent mappings from agents.toml.
|
|
3
|
-
*
|
|
4
|
-
* Resolution order:
|
|
5
|
-
* 1. preset.<name>.<role> (role-specific)
|
|
6
|
-
* 2. preset.<name>.default (preset default)
|
|
7
|
-
* 3. defaults.agent (global fallback)
|
|
8
|
-
* 4. undefined (caller falls back to backend.agent)
|
|
9
|
-
*/
|
|
10
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
import TOML from "@iarna/toml";
|
|
13
|
-
export function loadAgentMap(projectDir) {
|
|
14
|
-
const path = join(projectDir, "agents.toml");
|
|
15
|
-
if (!existsSync(path))
|
|
16
|
-
return null;
|
|
17
|
-
const text = readFileSync(path, "utf-8");
|
|
18
|
-
const parsed = TOML.parse(text);
|
|
19
|
-
return buildAgentMap(parsed);
|
|
20
|
-
}
|
|
21
|
-
export function resolveRoleAgent(agentMap, presetName, roleId) {
|
|
22
|
-
if (!agentMap)
|
|
23
|
-
return undefined;
|
|
24
|
-
const preset = agentMap.presets[presetName];
|
|
25
|
-
if (preset) {
|
|
26
|
-
const roleAgent = preset.roles[roleId];
|
|
27
|
-
if (roleAgent)
|
|
28
|
-
return roleAgent;
|
|
29
|
-
if (preset.defaultAgent)
|
|
30
|
-
return preset.defaultAgent;
|
|
31
|
-
}
|
|
32
|
-
return agentMap.globalDefault || undefined;
|
|
33
|
-
}
|
|
34
|
-
function buildAgentMap(parsed) {
|
|
35
|
-
const defaults = parsed["defaults"];
|
|
36
|
-
const globalDefault = typeof defaults?.["agent"] === "string" ? defaults["agent"] : "";
|
|
37
|
-
const presets = {};
|
|
38
|
-
const presetSection = parsed["preset"];
|
|
39
|
-
if (presetSection) {
|
|
40
|
-
for (const [name, value] of Object.entries(presetSection)) {
|
|
41
|
-
if (typeof value === "object" && value !== null) {
|
|
42
|
-
presets[name] = buildPresetAgentMap(value);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return { globalDefault, presets };
|
|
47
|
-
}
|
|
48
|
-
function buildPresetAgentMap(section) {
|
|
49
|
-
const defaultAgent = typeof section["default"] === "string" ? section["default"] : "";
|
|
50
|
-
const roles = {};
|
|
51
|
-
for (const [key, value] of Object.entries(section)) {
|
|
52
|
-
if (key !== "default" && typeof value === "string") {
|
|
53
|
-
roles[key] = value;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return { defaultAgent, roles };
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=agent-map.js.map
|
package/dist/agent-map.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-map.js","sourceRoot":"","sources":["../src/agent-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,aAAa,CAAC;AAY/B,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IAC3D,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAyB,EACzB,UAAkB,EAClB,MAAc;IAEd,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,MAAM,CAAC,YAAY;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACtD,CAAC;IAED,OAAO,QAAQ,CAAC,aAAa,IAAI,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAwC,CAAC;IAC3E,MAAM,aAAa,GACjB,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAwC,CAAC;IAC9E,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAgC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IAC3D,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnD,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { type ChildProcess } from "node:child_process";
|
|
2
|
-
import * as acp from "@agentclientprotocol/sdk";
|
|
3
|
-
export interface AcpClientOptions {
|
|
4
|
-
command: string;
|
|
5
|
-
args: string[];
|
|
6
|
-
cwd: string;
|
|
7
|
-
trustAllTools: boolean;
|
|
8
|
-
agentName?: string;
|
|
9
|
-
modelId?: string;
|
|
10
|
-
verbose?: boolean;
|
|
11
|
-
}
|
|
12
|
-
export interface AcpSession {
|
|
13
|
-
sessionId: string;
|
|
14
|
-
connection: acp.ClientSideConnection;
|
|
15
|
-
process: ChildProcess;
|
|
16
|
-
textBuffer: string;
|
|
17
|
-
stderrBuffer: string;
|
|
18
|
-
options: AcpClientOptions;
|
|
19
|
-
/** Resolves when the child process exits — used to race against hanging prompts */
|
|
20
|
-
closed: Promise<{
|
|
21
|
-
code: number | null;
|
|
22
|
-
signal: string | null;
|
|
23
|
-
}>;
|
|
24
|
-
}
|
|
25
|
-
export interface AcpPromptResult {
|
|
26
|
-
output: string;
|
|
27
|
-
stopReason: acp.StopReason;
|
|
28
|
-
timedOut: boolean;
|
|
29
|
-
error?: string;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Format an ACP SessionUpdate for verbose stderr output.
|
|
33
|
-
* Returns null for event types that should be silenced.
|
|
34
|
-
*/
|
|
35
|
-
export declare function formatStreamingUpdate(update: acp.SessionUpdate): string | null;
|
|
36
|
-
export declare function initAcpSession(opts: AcpClientOptions): Promise<AcpSession>;
|
|
37
|
-
export declare function sendAcpPrompt(session: AcpSession, prompt: string, timeoutMs: number): Promise<AcpPromptResult>;
|
|
38
|
-
export declare function terminateAcpSession(session: AcpSession): Promise<void>;
|