@mobrienv/autoloop 0.8.0 → 0.9.1
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 +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/testing/mock-backend.js +15 -1
- package/dist/testing/mock-backend.js.map +1 -1
- package/package.json +10 -7
- package/plugins/autoloop/.claude-plugin/plugin.json +3 -3
- package/plugins/autoloop/skills/autoloop/SKILL.md +1 -1
- package/plugins/autoloop/skills/autoloop-acp/SKILL.md +118 -0
package/README.md
CHANGED
|
@@ -233,6 +233,7 @@ Bundled presets give you opinionated starting points for common workflows like c
|
|
|
233
233
|
| `autospec` | Research, clarify, design, plan, and critique specifications |
|
|
234
234
|
| `automerge` | Merge a completed worktree branch back into its base branch |
|
|
235
235
|
| `autopr` | Turn the current branch into a reviewable pull request |
|
|
236
|
+
| `autowiki` | Ingest a queue of source URLs into an OKF-conformant LLM wiki of cross-linked concept pages |
|
|
236
237
|
|
|
237
238
|
## Creating custom presets
|
|
238
239
|
|
package/dist/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export { type Config, defaults as configDefaults, get as configGet, getInt as co
|
|
|
3
3
|
export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
|
|
4
4
|
export type { EmitResult } from "@mobrienv/autoloop-harness/emit";
|
|
5
5
|
export type { LoopEvent, LoopEventEmitter, } from "@mobrienv/autoloop-harness/events";
|
|
6
|
-
export type { LoopContext, RunOptions, RunSummary, TriggerSource, Verdict, VerdictKind, } from "@mobrienv/autoloop-harness/types";
|
|
6
|
+
export type { LoopContext, RunOptions, RunSummary, StopReason, TriggerSource, Verdict, VerdictKind, } from "@mobrienv/autoloop-harness/types";
|
|
7
|
+
export { STOP_REASONS } from "@mobrienv/autoloop-harness/types";
|
package/dist/index.js
CHANGED
|
@@ -16,4 +16,5 @@ export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config
|
|
|
16
16
|
// without re-implementing the schema layer.
|
|
17
17
|
export { defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
|
|
18
18
|
export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
|
|
19
|
+
export { STOP_REASONS } from "@mobrienv/autoloop-harness/types";
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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"}
|
|
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;AAe7E,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* or accepts a fixture path as the first positional argument.
|
|
10
10
|
*/
|
|
11
11
|
import { execFileSync } from "node:child_process";
|
|
12
|
-
import { readFileSync } from "node:fs";
|
|
12
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
13
13
|
import { createRequire } from "node:module";
|
|
14
14
|
function fixturePathFromArgs() {
|
|
15
15
|
return process.argv[2] ?? "";
|
|
@@ -29,6 +29,8 @@ function loadFixture() {
|
|
|
29
29
|
delay_ms: parsed.delay_ms ?? 0,
|
|
30
30
|
emit_event: parsed.emit_event,
|
|
31
31
|
emit_payload: parsed.emit_payload,
|
|
32
|
+
usage: parsed.usage,
|
|
33
|
+
trap_usr1: parsed.trap_usr1 ?? false,
|
|
32
34
|
};
|
|
33
35
|
}
|
|
34
36
|
catch (err) {
|
|
@@ -56,6 +58,12 @@ function sleep(ms) {
|
|
|
56
58
|
}
|
|
57
59
|
async function main() {
|
|
58
60
|
const fixture = loadFixture();
|
|
61
|
+
if (fixture.trap_usr1) {
|
|
62
|
+
process.on("SIGUSR1", () => {
|
|
63
|
+
process.stdout.write("mock-backend: interrupted by SIGUSR1\n");
|
|
64
|
+
process.exit(130);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
59
67
|
if (fixture.delay_ms > 0) {
|
|
60
68
|
await sleep(fixture.delay_ms);
|
|
61
69
|
}
|
|
@@ -65,6 +73,12 @@ async function main() {
|
|
|
65
73
|
if (fixture.output) {
|
|
66
74
|
process.stdout.write(fixture.output);
|
|
67
75
|
}
|
|
76
|
+
if (fixture.usage) {
|
|
77
|
+
const usageFile = process.env.AUTOLOOP_USAGE_FILE;
|
|
78
|
+
if (usageFile) {
|
|
79
|
+
writeFileSync(usageFile, JSON.stringify(fixture.usage));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
68
82
|
process.exitCode = fixture.exit_code;
|
|
69
83
|
}
|
|
70
84
|
main().catch((err) => {
|
|
@@ -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;
|
|
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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mobrienv/autoloop",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Simpler, opinionated loop harness for inspectable long-running agent workflows",
|
|
6
6
|
"type": "module",
|
|
@@ -32,7 +32,10 @@
|
|
|
32
32
|
"packages/harness",
|
|
33
33
|
"packages/dashboard",
|
|
34
34
|
"packages/kanban",
|
|
35
|
-
"packages/cli"
|
|
35
|
+
"packages/cli",
|
|
36
|
+
"packages/issue-sync-core",
|
|
37
|
+
"packages/gh-sync",
|
|
38
|
+
"packages/linear-sync"
|
|
36
39
|
],
|
|
37
40
|
"repository": {
|
|
38
41
|
"type": "git",
|
|
@@ -62,7 +65,7 @@
|
|
|
62
65
|
"format": "biome format src/ test/",
|
|
63
66
|
"format:fix": "biome format --write src/ test/",
|
|
64
67
|
"test": "node --experimental-vm-modules node_modules/.bin/vitest run",
|
|
65
|
-
"test:coverage": "node --experimental-vm-modules node_modules/.bin/vitest run --coverage",
|
|
68
|
+
"test:coverage": "node --experimental-vm-modules node_modules/.bin/vitest run --no-file-parallelism --coverage",
|
|
66
69
|
"test:watch": "node --experimental-vm-modules node_modules/.bin/vitest",
|
|
67
70
|
"check": "biome check src/ test/ && tsc --noEmit && npm run test:coverage",
|
|
68
71
|
"release": "node bin/release",
|
|
@@ -90,9 +93,9 @@
|
|
|
90
93
|
"vitest": "^3.0.0"
|
|
91
94
|
},
|
|
92
95
|
"dependencies": {
|
|
93
|
-
"@mobrienv/autoloop-cli": "0.
|
|
94
|
-
"@mobrienv/autoloop-core": "0.
|
|
95
|
-
"@mobrienv/autoloop-harness": "0.
|
|
96
|
-
"@mobrienv/autoloop-presets": "0.
|
|
96
|
+
"@mobrienv/autoloop-cli": "0.9.1",
|
|
97
|
+
"@mobrienv/autoloop-core": "0.9.1",
|
|
98
|
+
"@mobrienv/autoloop-harness": "0.9.1",
|
|
99
|
+
"@mobrienv/autoloop-presets": "0.9.1"
|
|
97
100
|
}
|
|
98
101
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autoloop",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Run and operate autoloops — start runs, monitor progress, inject guidance, manage worktrees, inspect artifacts, and clean up.",
|
|
5
|
-
"homepage": "https://github.com/mikeyobrien/autoloop
|
|
6
|
-
"repository": "https://github.com/mikeyobrien/autoloop
|
|
5
|
+
"homepage": "https://github.com/mikeyobrien/autoloop",
|
|
6
|
+
"repository": "https://github.com/mikeyobrien/autoloop",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"keywords": ["autoloop", "ai-agents", "autonomous", "coding"]
|
|
9
9
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: autoloop
|
|
3
3
|
description: Run and operate autoloops — start runs, monitor progress, inject guidance, manage worktrees, inspect artifacts, and clean up. Use when the user asks to run an autoloop, check loop status, merge/clean worktrees, or operate on runs.
|
|
4
|
-
argument-hint: [run|status|guide|merge|clean|inspect] [args...]
|
|
4
|
+
argument-hint: "[run|status|guide|merge|clean|inspect] [args...]"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Autoloop Operations
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: autoloop-acp
|
|
3
|
+
description: Drive autoloop over the Agent Client Protocol (ACP) — connect an external editor, harness, or agent to `autoloop acp` over stdio, send prompts/slash commands that map to autoloop verbs, and stream loop runs as tool calls. Use when wiring up or operating an ACP connection to autoloop from another system.
|
|
4
|
+
argument-hint: "[connect|run|<slash-command>] [args...]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Autoloop over ACP
|
|
8
|
+
|
|
9
|
+
`autoloop acp` presents an **Agent Client Protocol** (ACP) interface over stdio. The external system (an editor, harness, or another agent) is the ACP **client**; autoloop is the ACP **agent**. This skill is for setting up that connection and driving autoloop through it. Parse `$ARGUMENTS` to determine what the user needs; if ambiguous, ask.
|
|
10
|
+
|
|
11
|
+
> Direction matters. This skill is about **other systems driving autoloop** (autoloop is the agent). The inverse — autoloop *consuming* an external ACP agent as a backend — is the separate `-b kiro` option and is **not** what this covers.
|
|
12
|
+
|
|
13
|
+
## Launching the agent
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Start the ACP agent on stdio (the client spawns this as a subprocess)
|
|
17
|
+
autoloop acp
|
|
18
|
+
|
|
19
|
+
# Surface debug logs as agent thoughts
|
|
20
|
+
autoloop acp --verbose # or -v
|
|
21
|
+
|
|
22
|
+
# Usage
|
|
23
|
+
autoloop acp --help # or -h
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Transport rules (important):**
|
|
27
|
+
- Frames are **NDJSON over stdio**. **Stdout is the protocol channel** — nothing else may write to it. All logs go to **stderr**.
|
|
28
|
+
- The client therefore launches `autoloop acp` as a subprocess and speaks ACP on stdin/stdout. Don't pipe other output into stdout.
|
|
29
|
+
|
|
30
|
+
**Working directory (REQUIRED):** per session. The ACP client **must** set it via the `session/new` `cwd` field, as the absolute path of the target project directory. autoloop anchors **all run state** (journal, registry, `runs/`) on `cwd`. If `cwd` is missing or blank, `session/new` is **rejected** with a JSON-RPC `invalid params` error — autoloop does **not** silently fall back to its own launch directory, because doing so would misroute the entire run into the wrong project. `--project-dir` / `AUTOLOOP_PROJECT_DIR` only affect dashboard control; they are not a fallback for the session working directory.
|
|
31
|
+
|
|
32
|
+
### Representative client config
|
|
33
|
+
|
|
34
|
+
ACP clients differ, but they spawn the agent as a command + args. A generic entry looks like:
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"command": "autoloop",
|
|
39
|
+
"args": ["acp"]
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Add `"--verbose"` to `args` if needed. The client **must** send a valid `cwd` on `session/new` (see Working directory above). No authentication step is required — `authenticate` is a no-op because autoloop runs locally under the caller's own credentials.
|
|
44
|
+
|
|
45
|
+
## What the client sees
|
|
46
|
+
|
|
47
|
+
On `initialize`, autoloop reports:
|
|
48
|
+
- `agentInfo`: `{ name: "autoloop", version: "0.1.0" }`
|
|
49
|
+
- `agentCapabilities`: `{ loadSession: false }` — sessions are not resumable; one session lives for the life of the connection and can launch many runs and quick commands over successive prompt turns.
|
|
50
|
+
|
|
51
|
+
On `session/new`, autoloop **requires** a valid `cwd` (rejecting the session otherwise) and advertises its verbs as **slash commands** (`available_commands_update`), each with a description and an input hint.
|
|
52
|
+
|
|
53
|
+
## Prompt behaviour
|
|
54
|
+
|
|
55
|
+
Each prompt turn's text is dispatched as an autoloop command line:
|
|
56
|
+
|
|
57
|
+
- **Bare objective** (no recognised verb) → runs the default preset: `run autocode "<your prompt>"`. So sending `build the login page` starts an `autocode` loop on that objective.
|
|
58
|
+
- **Explicit verb** or **`/slash` command** always overrides the default (e.g. `run autofix "..."`, `/loops`, `inspect scratchpad`).
|
|
59
|
+
- A single outer **XML-ish wrapper** is stripped before parsing — `<user_message>`, `<user>`, `<message>`, `<query>`, or `<prompt>`. This makes model-driven clients that wrap prompts work transparently. Unrecognised tags are left untouched.
|
|
60
|
+
- Tokenising honours single and double quotes, so quoted objectives with spaces survive: `run autocode "Fix the login bug"`.
|
|
61
|
+
- An empty prompt returns help text.
|
|
62
|
+
|
|
63
|
+
## Command surface
|
|
64
|
+
|
|
65
|
+
All 14 verbs work both as bare prompt lines and as `/slash` commands. They run in one of three modes:
|
|
66
|
+
|
|
67
|
+
### Stream mode — long-running loops, streamed as ACP tool calls
|
|
68
|
+
|
|
69
|
+
| Verb | Hint | Description |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `run` | `<preset> [objective] [flags]` | Start a loop with a preset (e.g. `run autocode "Fix bug"`) |
|
|
72
|
+
| `chain` | `<list\|run> [args]` | Run or list chains of presets |
|
|
73
|
+
|
|
74
|
+
These execute a loop and bridge its events onto ACP `session/update` notifications as tool calls. The turn ends with a summary message.
|
|
75
|
+
|
|
76
|
+
### Capture mode — quick commands, returns captured text
|
|
77
|
+
|
|
78
|
+
| Verb | Hint | Description |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `loops` | `[--all\|show <id>\|artifacts <id>\|health]` | List active/recent runs or show/health a run |
|
|
81
|
+
| `inspect` | `<artifact> [selector] [--format <fmt>]` | Inspect a run artifact (journal, scratchpad, metrics, ...) |
|
|
82
|
+
| `guide` | `[--run <id>] <message>` | Inject operator guidance into the next iteration of a run |
|
|
83
|
+
| `list` | | List available presets |
|
|
84
|
+
| `memory` | `<list\|status\|find\|add\|remove> [args]` | Manage persistent loop memory |
|
|
85
|
+
| `task` | `<add\|complete\|update\|remove\|list> [args]` | Manage loop tasks |
|
|
86
|
+
| `worktree` | `<list\|show\|merge\|clean> [args]` | Manage git worktrees for isolated runs |
|
|
87
|
+
| `runs` | `clean [--max-age <days>]` | Maintain run directories |
|
|
88
|
+
| `config` | `<show\|set\|unset\|path> [args]` | Show or edit autoloop configuration |
|
|
89
|
+
| `control` | `<show\|capabilities\|interrupt\|guide> <id>` | Inspect or control a live run |
|
|
90
|
+
| `emit` | `<topic> [summary]` | Emit a coordination topic event into a run |
|
|
91
|
+
|
|
92
|
+
These run synchronously with stdout/stderr captured and return the text as a single agent message.
|
|
93
|
+
|
|
94
|
+
### Control mode — dashboard lifecycle
|
|
95
|
+
|
|
96
|
+
| Verb | Hint | Description |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| `dashboard` | `[start\|stop\|status] [--port <port>] [--host <host>]` | Start/stop the local dashboard and return its URL |
|
|
99
|
+
|
|
100
|
+
Handled directly by the agent. On start, the dashboard **URL is returned on its own line** so clients can linkify it.
|
|
101
|
+
|
|
102
|
+
## Streaming & cancellation
|
|
103
|
+
|
|
104
|
+
- **Stream verbs** (`run`, `chain`) emit live `session/update` notifications as the loop runs, then a final summary with a stop reason.
|
|
105
|
+
- **Capture verbs** return their full captured output in one message.
|
|
106
|
+
- Cancel an in-flight turn with the ACP **`session/cancel`** notification — it aborts the active turn (and the running loop) for that session.
|
|
107
|
+
|
|
108
|
+
## Quick reference
|
|
109
|
+
|
|
110
|
+
| The client wants to... | Send this prompt |
|
|
111
|
+
|---|---|
|
|
112
|
+
| Start a feature loop | `run autocode "..."` (or just the bare objective) |
|
|
113
|
+
| Fix a bug | `run autofix "..."` |
|
|
114
|
+
| List/inspect runs | `loops` / `loops show <id>` / `inspect scratchpad` |
|
|
115
|
+
| Steer a running loop | `guide "..."` |
|
|
116
|
+
| List presets | `list` |
|
|
117
|
+
| Open the dashboard | `dashboard start` (URL returned on its own line) |
|
|
118
|
+
| Cancel the current turn | ACP `session/cancel` notification |
|