overlord-cli 0.2610241050.0 → 0.2610261104.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 +2 -2
- package/dist/connectors/AGENTS.md +22 -5
- package/dist/connectors/VERSION +1 -1
- package/dist/connectors/adapters/antigravity/conformance-manifest.yaml +1 -1
- package/dist/connectors/adapters/antigravity/plugin.json +1 -1
- package/dist/connectors/adapters/antigravity/skills/record-work.md +2 -3
- package/dist/connectors/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/dist/connectors/adapters/claude/codec/claude.codec.yaml +5 -0
- package/dist/connectors/adapters/claude/commands/record-work.md +2 -3
- package/dist/connectors/adapters/claude/conformance-manifest.yaml +1 -1
- package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-notebook.json +1 -0
- package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-shell.json +1 -0
- package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-write.json +1 -0
- package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/dist/connectors/adapters/codex/CAPABILITIES.md +2 -2
- package/dist/connectors/adapters/codex/codec/codex.codec.yaml +10 -1
- package/dist/connectors/adapters/codex/conformance-manifest.yaml +2 -2
- package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use-failed.json +42 -0
- package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use-rename.json +42 -0
- package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use.json +6 -3
- package/dist/connectors/adapters/codex/harness-capabilities.yaml +2 -0
- package/dist/connectors/adapters/cursor/.cursor-plugin/plugin.json +1 -1
- package/dist/connectors/adapters/cursor/codec/cursor.codec.yaml +5 -0
- package/dist/connectors/adapters/cursor/commands/record-work.md +2 -3
- package/dist/connectors/adapters/cursor/conformance-manifest.yaml +1 -1
- package/dist/connectors/adapters/cursor/fixtures/normalize-post-tool-use-write.json +1 -0
- package/dist/connectors/adapters/cursor/rules/overlord-local.mdc +1 -1
- package/dist/connectors/adapters/opencode/conformance-manifest.yaml +1 -1
- package/dist/connectors/adapters/pi/conformance-manifest.yaml +1 -1
- package/dist/connectors/core/README.md +1 -1
- package/dist/connectors/core/overlord-mission/SKILL.md +113 -70
- package/dist/connectors/core/overlord-mission/reference/cli.md +53 -63
- package/dist/connectors/core/overlord-mission/reference/context.md +1 -1
- package/dist/connectors/core/overlord-mission/reference/mcp.md +3 -2
- package/dist/connectors/core/overlord-mission/reference/record-work.md +23 -43
- package/dist/connectors/core/overlord-mission/reference/shell-escaping.md +7 -5
- package/dist/connectors/core/scripts/capture-change-hook.sh +6 -4
- package/dist/connectors/core/scripts/overlord-mcp.mjs +81 -164
- package/dist/connectors/docs/05-connectors-and-agent-plugins.md +3 -3
- package/dist/connectors/docs/testing.md +5 -0
- package/dist/index.js +665 -236
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -255,7 +255,7 @@ This module is the developer-facing home for three components defined in
|
|
|
255
255
|
| Component | Stable id | What it owns |
|
|
256
256
|
| -------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
257
257
|
| CLI Layer | `cli` | Management command names/shapes, project linking & discovery, config file locations (`overlord.toml`, `.overlord/project.json`), human-readable output conventions |
|
|
258
|
-
| Protocol Layer | `protocol` | `ovld protocol` subcommands and flags, session lifecycle (`attach → (update\|heartbeat)* → (ask\|deliver)`), context-assembly format, delivery payload +
|
|
258
|
+
| Protocol Layer | `protocol` | `ovld protocol` subcommands and flags, session lifecycle (`attach → (update\|heartbeat)* → (ask\|deliver)`), context-assembly format, delivery payload + declared-path recording |
|
|
259
259
|
| Runner Layer | `runner` | `execution_requests` queue claiming and launch, working-directory resolution, `ovld runner` commands, execution-target selection |
|
|
260
260
|
|
|
261
261
|
These stay distinct components in the contract (separate interaction surfaces
|
|
@@ -273,7 +273,7 @@ colocation convention):
|
|
|
273
273
|
- [03 — Agent Protocol](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/03-agent-protocol.md): `ovld protocol` lifecycle, context assembly, updates, delivery, attachments.
|
|
274
274
|
- [04 — Runner and Launch Execution](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/04-runner-and-launch-execution.md): execution requests, local runner, launch command generation, auto-advance.
|
|
275
275
|
- [06 — Core Domain and Lifecycle](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/06-core-domain-and-lifecycle.md): projects, missions, objectives, sessions, events, statuses, state transitions.
|
|
276
|
-
- [11 — Review, Artifacts, and Change Tracking](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/11-review-artifacts-and-change-tracking.md): delivery review records, artifacts, objective-ledger evidence, and
|
|
276
|
+
- [11 — Review, Artifacts, and Change Tracking](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/11-review-artifacts-and-change-tracking.md): delivery review records, artifacts, objective-ledger evidence, and declared paths.
|
|
277
277
|
- [Test Plan](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/testing.md): test plan for the `cli`, `protocol`, and `runner` components — management commands, protocol lifecycle/attach-shape/validation conformance, runner queue atomicity, and surface smoke tests. Part of the root [TEST_PLAN.md](https://github.com/cooperativ-labs/OpenOverlord/blob/main/TEST_PLAN.md).
|
|
278
278
|
|
|
279
279
|
### Code & Tests
|
|
@@ -85,11 +85,28 @@ A connector may invoke `ovld protocol capture-change` from a native post-mutatio
|
|
|
85
85
|
`OVERLORD_OBJECTIVE_ID` is explicit in the launch environment. Mission scope is recovered from
|
|
86
86
|
that objective's exact active-session binding; cwd never selects it. The hook must remain silent
|
|
87
87
|
and perform no write when the objective id or `ovld` is unavailable. A directly named native edit
|
|
88
|
-
path records objective-bound, non-exclusive `declared_edit
|
|
89
|
-
connector-owned codec normalizes it as `file.edited
|
|
90
|
-
`--agent`; generic payload path parsing is forbidden.
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
path records objective-bound, non-exclusive `declared_edit` evidence only after the
|
|
89
|
+
connector-owned codec normalizes it as `file.edited` **and** its outcome is `ok`. The hook must
|
|
90
|
+
pass its connector key through `--agent`; generic payload path parsing is forbidden.
|
|
91
|
+
|
|
92
|
+
Outcome is decided in the codec, never guessed in capture:
|
|
93
|
+
|
|
94
|
+
- `outcomePath` decodes a boolean, status word, or numeric exit code; `outcomeExitCodePrefix`
|
|
95
|
+
decodes a leading `<prefix><n>` line of a text result (Codex `apply_patch`: `Exit code: 0`).
|
|
96
|
+
Only the decoded value is kept.
|
|
97
|
+
- `successOnly: true` declares that the harness emits this event only for successful calls and
|
|
98
|
+
routes failures elsewhere. It must cite source/binary evidence for the harness version in the
|
|
99
|
+
codec comment and be pinned by a normalized-event fixture; never infer it from an event name.
|
|
100
|
+
- An absent or unrecognized result is unknown, never success.
|
|
101
|
+
|
|
102
|
+
Capture then applies: `ok` with exact paths appends evidence; `blocked` appends nothing;
|
|
103
|
+
`error`/`cancelled` append nothing and record sticky `outcome_partial` (a non-atomic edit may have
|
|
104
|
+
partially applied, so the agent declares actual writes); unknown records `outcome_unavailable`;
|
|
105
|
+
shell records `shell_activity_unverified` (coverage uncertainty, never a claimed write); other
|
|
106
|
+
no-path, generic, and unmapped callbacks record `direct_path_unavailable`. Codec-normalized
|
|
107
|
+
read, search, and fetch callbacks append no evidence but still record callback observation.
|
|
108
|
+
Patch-text extraction reduces `*** Add|Update|Delete File:` and `*** Move to:` headers, so a
|
|
109
|
+
rename keeps both endpoints. Every hook
|
|
93
110
|
registration must be backed by a `script-io` fixture, and every mutation window claim must be
|
|
94
111
|
backed by a `mutation-window` fixture. Claude, Codex, and Cursor render this callback from
|
|
95
112
|
`connectors/core/scripts/capture-change-hook.sh`; their adapter directories own only the native
|
package/dist/connectors/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.57
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://antigravity.google/schemas/v1/plugin.json",
|
|
3
3
|
"name": "overlord",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.57",
|
|
5
5
|
"description": "Chat-driven access to Overlord mission protocol workflows through skills and MCP.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Cooperativ",
|
|
@@ -9,8 +9,7 @@ This creates a mission with one completed objective, lands it in the review colu
|
|
|
9
9
|
Synthesize from the current conversation:
|
|
10
10
|
- `objective`: what was asked / what was done (1-3 sentences).
|
|
11
11
|
- `summary`: reviewer-friendly narrative of what changed and why.
|
|
12
|
-
- `
|
|
13
|
-
- `changedFiles` (optional, `record-work` only): files known from this completed chat work that have no rationale. Each entry is an object with canonical repository-relative `filePath` and optional `vcsStatus`; never infer ownership from a shared-worktree-wide status or diff.
|
|
12
|
+
- `declaredPaths` (optional): repository-relative paths you know this work changed, as a JSON string array (deleted files and both rename endpoints are valid). They are recorded as Declared; never infer them from a shared-worktree-wide status or diff, and never explain files one by one.
|
|
14
13
|
- `title` (optional): mission title; defaults to a title derived from the objective.
|
|
15
14
|
- `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
|
|
16
15
|
|
|
@@ -19,7 +18,7 @@ If a command argument is present, treat it as additional context to weave into t
|
|
|
19
18
|
Run:
|
|
20
19
|
`ovld protocol record-work --agent antigravity --payload-file -`
|
|
21
20
|
|
|
22
|
-
and stream a JSON object `{ "objective": "...", "summary": "...", "artifacts": [...], "
|
|
21
|
+
and stream a JSON object `{ "objective": "...", "summary": "...", "artifacts": [...], "declaredPaths": [...] }` on stdin via a single-quoted heredoc (`<<'EOF'`).
|
|
23
22
|
|
|
24
23
|
After the command succeeds, report the new `MISSION_ID`.
|
|
25
24
|
|
|
@@ -33,6 +33,11 @@ events:
|
|
|
33
33
|
origin: agent
|
|
34
34
|
toolPath: tool_name
|
|
35
35
|
inputPath: tool_input
|
|
36
|
+
# Success-only by harness contract: Claude Code's hook table (verified in the shipped
|
|
37
|
+
# 2.1.310 binary) reads "PostToolUse — Run after successful tool" and routes failures to
|
|
38
|
+
# the separate PostToolUseFailure event, which Overlord does not register. A failed or
|
|
39
|
+
# denied Write therefore never reaches capture as native evidence.
|
|
40
|
+
successOnly: true
|
|
36
41
|
# A file-mutating tool becomes `file.edited` instead, so the feed can show a change
|
|
37
42
|
# timeline without the reader having to know which tool names mutate files.
|
|
38
43
|
fileEditKind: file.edited
|
|
@@ -9,8 +9,7 @@ Immediately record the work you just completed in this chat as a new Overlord mi
|
|
|
9
9
|
Synthesize from the current conversation:
|
|
10
10
|
- `objective`: what was asked / what was done (1–3 sentences).
|
|
11
11
|
- `summary`: reviewer-friendly narrative of what changed and why.
|
|
12
|
-
- `
|
|
13
|
-
- `changedFiles` (optional, `record-work` only): files known from this completed chat work that have no rationale. Each entry is an object with canonical repository-relative `filePath` and optional `vcsStatus`; never infer ownership from a shared-worktree-wide status or diff.
|
|
12
|
+
- `declaredPaths` (optional): repository-relative paths you know this work changed, as a JSON string array (deleted files and both rename endpoints are valid). They are recorded as Declared; never infer them from a shared-worktree-wide status or diff, and never explain files one by one.
|
|
14
13
|
- `title` (optional): mission title; defaults to a title derived from the objective.
|
|
15
14
|
- `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
|
|
16
15
|
|
|
@@ -22,7 +21,7 @@ Run:
|
|
|
22
21
|
and stream a single JSON object on stdin via a single-quoted heredoc (`<<'EOF'`):
|
|
23
22
|
|
|
24
23
|
```
|
|
25
|
-
{ "objective": "...", "summary": "...", "title": "...", "
|
|
24
|
+
{ "objective": "...", "summary": "...", "title": "...", "declaredPaths": [...], "artifacts": [...] }
|
|
26
25
|
```
|
|
27
26
|
|
|
28
27
|
After the command succeeds, report the new `MISSION_ID`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "overlord",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.57",
|
|
4
4
|
"description": "Chat-driven access to Overlord mission protocol workflows with hook-driven activity capture.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cooperativ",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"defaultPrompt": [
|
|
39
39
|
"Attach to Overlord mission 123 and summarize the context before editing code",
|
|
40
40
|
"Post an execute update to this Overlord mission after a meaningful implementation step",
|
|
41
|
-
"Deliver this Overlord mission with
|
|
41
|
+
"Deliver this Overlord mission with a summary and any declared paths"
|
|
42
42
|
],
|
|
43
43
|
"brandColor": "#1E6B5C",
|
|
44
44
|
"composerIcon": "./assets/icon.png",
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
**Harness version verified** `0.147.0` · **range** `>=0.124.0` · **scheme** `semver`
|
|
8
8
|
|
|
9
|
-
**Descriptor digest** `
|
|
9
|
+
**Descriptor digest** `b3120edbb3f8a017801de0b9b085c42f05f1d7c335246e224cd283e874ddc542`
|
|
10
10
|
|
|
11
11
|
> The tier is derived from passing fixtures, never authored. `unsupported` means the harness
|
|
12
12
|
> cannot do it — do not attempt it. `not-implemented` means it is buildable and unbuilt: that is
|
|
@@ -59,7 +59,7 @@ path. Runtime file evidence is unavailable for this adapter.
|
|
|
59
59
|
| `observe.prompt` | ✅ supported | `UserPromptSubmit` | fixtures: `fixtures/normalize-user-prompt.json` |
|
|
60
60
|
| `observe.toolCall` | 🚧 not-implemented | `PreToolUse` | tracked as `latch-engine` |
|
|
61
61
|
| `observe.toolResult` | 🚧 not-implemented | `PostToolUse` | tracked as `latch-engine` |
|
|
62
|
-
| `observe.fileEdit` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use.json`, `fixtures/agent-session-hooks.json`, `fixtures/post-tool-use-hook.json`, `fixtures/post-tool-use-unbound.json` |
|
|
62
|
+
| `observe.fileEdit` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use.json`, `fixtures/normalize-post-tool-use-failed.json`, `fixtures/normalize-post-tool-use-rename.json`, `fixtures/agent-session-hooks.json`, `fixtures/post-tool-use-hook.json`, `fixtures/post-tool-use-unbound.json` |
|
|
63
63
|
| `observe.sessionLifecycle` | 🚧 not-implemented | `SessionStart` | tracked as `latch-engine` |
|
|
64
64
|
| `decide.shell` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
|
|
65
65
|
| `decide.mcp` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
|
|
@@ -28,13 +28,22 @@ events:
|
|
|
28
28
|
inputPath: tool_input
|
|
29
29
|
callIdPath: tool_use_id
|
|
30
30
|
turnIdPath: turn_id
|
|
31
|
+
# Codex runs PostToolUse after a handler returns a result, but apply_patch reports its own
|
|
32
|
+
# failure inside that result: `tool_response` is text whose first line is `Exit code: <n>`
|
|
33
|
+
# (upstream codex-rs hook test `post_tool_use_records_additional_context_for_apply_patch`
|
|
34
|
+
# asserts the `Exit code: 0` / `Success. Updated the following files:` shape). Only the
|
|
35
|
+
# leading exit code is decoded; the text is never retained. A missing or unrecognized
|
|
36
|
+
# line stays unknown, so capture records outcome_unavailable rather than native evidence.
|
|
37
|
+
outcomePath: tool_response
|
|
38
|
+
outcomeExitCodePrefix: 'Exit code: '
|
|
31
39
|
fileEditKind: file.edited
|
|
32
40
|
filePathPaths:
|
|
33
41
|
- file_path
|
|
34
42
|
- filePath
|
|
35
43
|
- path
|
|
36
44
|
# Codex apply_patch carries destinations in bounded patch headers rather
|
|
37
|
-
# than a standalone path field. The codec extracts only
|
|
45
|
+
# than a standalone path field. The codec extracts only Add/Update/Delete
|
|
46
|
+
# File and Move to headers, so a rename keeps both endpoints.
|
|
38
47
|
filePathPatchTextPaths:
|
|
39
48
|
- command
|
|
40
49
|
- patch
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
contractVersion: "
|
|
1
|
+
contractVersion: "167"
|
|
2
2
|
componentType: connector
|
|
3
3
|
componentKey: codex
|
|
4
4
|
label: "Codex Connector"
|
|
@@ -14,7 +14,7 @@ connector:
|
|
|
14
14
|
harnessCapabilities:
|
|
15
15
|
path: connectors/adapters/codex/harness-capabilities.yaml
|
|
16
16
|
schemaVersion: 1
|
|
17
|
-
digest: "
|
|
17
|
+
digest: "b3120edbb3f8a017801de0b9b085c42f05f1d7c335246e224cd283e874ddc542"
|
|
18
18
|
# ── END GENERATED ────────────────────────────────────────────────────────────
|
|
19
19
|
installPath: "~/.codex/plugins/overlord"
|
|
20
20
|
managedFiles:
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fixtureVersion": 1,
|
|
3
|
+
"kind": "normalized-event",
|
|
4
|
+
"description": "Codex PostToolUse for an apply_patch that ran and exited non-zero (`Exit code: 1`). The codec decodes outcome `error`, so capture appends no native evidence for the attempted path and records outcome_partial instead. The tool output (with a credential) never enters the envelope.",
|
|
5
|
+
"codec": "codec/codex.codec.yaml",
|
|
6
|
+
"occurredAt": "2026-08-01T00:00:00.000Z",
|
|
7
|
+
"payload": {
|
|
8
|
+
"session_id": "codex-session-1",
|
|
9
|
+
"turn_id": "turn-1",
|
|
10
|
+
"tool_use_id": "call-3",
|
|
11
|
+
"transcript_path": "/Users/jake/.codex/sessions/secret.jsonl",
|
|
12
|
+
"cwd": "/repo",
|
|
13
|
+
"hook_event_name": "PostToolUse",
|
|
14
|
+
"tool_name": "apply_patch",
|
|
15
|
+
"tool_input": {
|
|
16
|
+
"command": "*** Begin Patch\n*** Update File: /repo/src/attempted.ts\n@@\n-const a = 1;\n+const a = 'AKIAIOSFODNN7EXAMPLE';\n*** End Patch"
|
|
17
|
+
},
|
|
18
|
+
"tool_response": "Exit code: 1\nWall time: 0.1 seconds\nOutput:\nerror: hunk failed near postgres://user:hunter2@db/app\n"
|
|
19
|
+
},
|
|
20
|
+
"expect": {
|
|
21
|
+
"eventId": "ev_4f0111e1e5440a7f448e6fda0caaaf82",
|
|
22
|
+
"producerSequence": null,
|
|
23
|
+
"occurredAt": "2026-08-01T00:00:00.000Z",
|
|
24
|
+
"kind": "file.edited",
|
|
25
|
+
"severity": "info",
|
|
26
|
+
"nativeEvent": "PostToolUse",
|
|
27
|
+
"nativeTurnId": "turn-1",
|
|
28
|
+
"nativeCallId": "call-3",
|
|
29
|
+
"subagentId": null,
|
|
30
|
+
"correlationId": "codex-session-1",
|
|
31
|
+
"origin": "agent",
|
|
32
|
+
"summary": "Write a file",
|
|
33
|
+
"payload": {
|
|
34
|
+
"tool": "edit",
|
|
35
|
+
"action": "Write a file",
|
|
36
|
+
"paths": ["src/attempted.ts"],
|
|
37
|
+
"outcome": "error",
|
|
38
|
+
"formatterVersion": 1
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"mustNotContain": ["AKIAIOSFODNN7EXAMPLE", "hunter2", "secret.jsonl", "/Users/jake"]
|
|
42
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fixtureVersion": 1,
|
|
3
|
+
"kind": "normalized-event",
|
|
4
|
+
"description": "Codex PostToolUse for a successful apply_patch rename plus delete. `*** Move to:` is reduced alongside Update/Delete headers so both rename endpoints and the deleted path become exact evidence; hunk content never enters the envelope.",
|
|
5
|
+
"codec": "codec/codex.codec.yaml",
|
|
6
|
+
"occurredAt": "2026-08-01T00:00:00.000Z",
|
|
7
|
+
"payload": {
|
|
8
|
+
"session_id": "codex-session-1",
|
|
9
|
+
"turn_id": "turn-1",
|
|
10
|
+
"tool_use_id": "call-4",
|
|
11
|
+
"transcript_path": "/Users/jake/.codex/sessions/secret.jsonl",
|
|
12
|
+
"cwd": "/repo",
|
|
13
|
+
"hook_event_name": "PostToolUse",
|
|
14
|
+
"tool_name": "apply_patch",
|
|
15
|
+
"tool_input": {
|
|
16
|
+
"command": "*** Begin Patch\n*** Update File: /repo/src/old-name.ts\n*** Move to: /repo/src/new-name.ts\n@@\n-export const key = 'AKIAIOSFODNN7EXAMPLE';\n+export const key = process.env.KEY;\n*** Delete File: /repo/src/removed.ts\n*** End Patch"
|
|
17
|
+
},
|
|
18
|
+
"tool_response": "Exit code: 0\nWall time: 0.1 seconds\nOutput:\nSuccess. Updated the following files:\nM src/new-name.ts\nD src/removed.ts\n"
|
|
19
|
+
},
|
|
20
|
+
"expect": {
|
|
21
|
+
"eventId": "ev_93222a9e39bc13fdd124587e3a68962e",
|
|
22
|
+
"producerSequence": null,
|
|
23
|
+
"occurredAt": "2026-08-01T00:00:00.000Z",
|
|
24
|
+
"kind": "file.edited",
|
|
25
|
+
"severity": "info",
|
|
26
|
+
"nativeEvent": "PostToolUse",
|
|
27
|
+
"nativeTurnId": "turn-1",
|
|
28
|
+
"nativeCallId": "call-4",
|
|
29
|
+
"subagentId": null,
|
|
30
|
+
"correlationId": "codex-session-1",
|
|
31
|
+
"origin": "agent",
|
|
32
|
+
"summary": "Write a file",
|
|
33
|
+
"payload": {
|
|
34
|
+
"tool": "edit",
|
|
35
|
+
"action": "Write a file",
|
|
36
|
+
"paths": ["src/old-name.ts", "src/new-name.ts", "src/removed.ts"],
|
|
37
|
+
"outcome": "ok",
|
|
38
|
+
"formatterVersion": 1
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"mustNotContain": ["AKIAIOSFODNN7EXAMPLE", "hunter2", "secret.jsonl", "/Users/jake"]
|
|
42
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"fixtureVersion": 1,
|
|
3
3
|
"kind": "normalized-event",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "Codex PostToolUse apply_patch payload in the upstream hook shape (tool_input.command patch text; tool_response text whose first line is `Exit code: 0`). Proves the edit is reduced to structural metadata plus a decoded `ok` outcome and never leaks written content or tool output.",
|
|
5
5
|
"codec": "codec/codex.codec.yaml",
|
|
6
6
|
"occurredAt": "2026-08-01T00:00:00.000Z",
|
|
7
7
|
"payload": {
|
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
"cwd": "/repo",
|
|
13
13
|
"hook_event_name": "PostToolUse",
|
|
14
14
|
"tool_name": "apply_patch",
|
|
15
|
-
"tool_input": {
|
|
16
|
-
|
|
15
|
+
"tool_input": {
|
|
16
|
+
"command": "*** Begin Patch\n*** Update File: /repo/src/token.ts\n+const key = 'AKIAIOSFODNN7EXAMPLE';\n*** End Patch"
|
|
17
|
+
},
|
|
18
|
+
"tool_response": "Exit code: 0\nWall time: 0.1 seconds\nOutput:\nSuccess. Updated the following files:\nM src/token.ts\nconnected with postgres://user:hunter2@db/app\n"
|
|
17
19
|
},
|
|
18
20
|
"expect": {
|
|
19
21
|
"eventId": "ev_bf289659aca425896e8c26747d35c87e",
|
|
@@ -32,6 +34,7 @@
|
|
|
32
34
|
"tool": "edit",
|
|
33
35
|
"action": "Write a file",
|
|
34
36
|
"paths": ["src/token.ts"],
|
|
37
|
+
"outcome": "ok",
|
|
35
38
|
"formatterVersion": 1
|
|
36
39
|
}
|
|
37
40
|
},
|
|
@@ -75,6 +75,8 @@ capabilities:
|
|
|
75
75
|
native: PostToolUse
|
|
76
76
|
fixtures:
|
|
77
77
|
- fixtures/normalize-post-tool-use.json
|
|
78
|
+
- fixtures/normalize-post-tool-use-failed.json
|
|
79
|
+
- fixtures/normalize-post-tool-use-rename.json
|
|
78
80
|
- fixtures/agent-session-hooks.json
|
|
79
81
|
- fixtures/post-tool-use-hook.json
|
|
80
82
|
- fixtures/post-tool-use-unbound.json
|
|
@@ -68,6 +68,11 @@ events:
|
|
|
68
68
|
toolPath: tool_name
|
|
69
69
|
inputPath: tool_input
|
|
70
70
|
callIdPath: call_id
|
|
71
|
+
# Success-only by harness contract. The shipped cursor-agent 2026.09.23 executor fires
|
|
72
|
+
# postToolUse from `fireSuccessAsync` only when the tool result `isSuccess` (or its stream
|
|
73
|
+
# succeeded); errors, aborts, and preToolUse/permission denials go to `postToolUseFailure`
|
|
74
|
+
# with `error_message`/`failure_type`, which Overlord does not register.
|
|
75
|
+
successOnly: true
|
|
71
76
|
fileEditKind: file.edited
|
|
72
77
|
# Live Cursor Write payloads use file_path; path/filePath match the write
|
|
73
78
|
# formatter's key order so an alternate Cursor dialect still captures.
|
|
@@ -3,14 +3,13 @@ Immediately record the work you just completed in this chat as a new Overlord mi
|
|
|
3
3
|
Synthesize from the current conversation:
|
|
4
4
|
- `objective`: what was asked / what was done.
|
|
5
5
|
- `summary`: reviewer-friendly narrative of what changed and why.
|
|
6
|
-
- `
|
|
7
|
-
- `changedFiles` (optional, `record-work` only): files known from this completed chat work that have no rationale. Each entry is an object with canonical repository-relative `filePath` and optional `vcsStatus`; never infer ownership from a shared-worktree-wide status or diff.
|
|
6
|
+
- `declaredPaths` (optional): repository-relative paths you know this work changed, as a JSON string array (deleted files and both rename endpoints are valid). They are recorded as Declared; never infer them from a shared-worktree-wide status or diff, and never explain files one by one.
|
|
8
7
|
- `title` (optional): mission title; defaults to a title derived from the objective.
|
|
9
8
|
- `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
|
|
10
9
|
|
|
11
10
|
If text was provided after `/record-work`, treat it as additional context for the summary.
|
|
12
11
|
|
|
13
|
-
Run `ovld protocol record-work --payload-file -` and stream a single JSON object `{ "objective": "...", "summary": "...", "title": "...", "
|
|
12
|
+
Run `ovld protocol record-work --payload-file -` and stream a single JSON object `{ "objective": "...", "summary": "...", "title": "...", "declaredPaths": [...], "artifacts": [...] }` on stdin via a single-quoted heredoc.
|
|
14
13
|
|
|
15
14
|
After the command succeeds, report the new MISSION_ID.
|
|
16
15
|
|
|
@@ -9,5 +9,5 @@ alwaysApply: true
|
|
|
9
9
|
- If the user asks from chat to use Overlord, use `/prompt` for new missions, `/load` for read-only context by mission ID, `/connect` to route the session onto an existing mission, and `/attach` when the user explicitly wants execution.
|
|
10
10
|
- If you need other protocol commands or flags, run `ovld protocol help` instead of guessing.
|
|
11
11
|
|
|
12
|
-
Normal delivery is summary-only; the objective ledger syncs independently.
|
|
12
|
+
Normal delivery is summary-only; the objective ledger syncs independently. Before delivering, read the captured paths once with `ovld protocol changes --objective-id <id>`, declare only files you know you changed that capture missed with `--paths` / `--paths-file`, and summarize by behavior or component. Never diff a shared worktree or infer ownership from it.
|
|
13
13
|
**Never revert, restore, or delete file changes from other agents or missions.** Leave unrelated dirty files intact.
|
|
@@ -21,7 +21,7 @@ follow:
|
|
|
21
21
|
- treat mission context as authoritative
|
|
22
22
|
- update or heartbeat while working
|
|
23
23
|
- ask exactly one blocking question and stop
|
|
24
|
-
- deliver last with
|
|
24
|
+
- deliver last with a behavior-level summary, declaring only paths native capture missed
|
|
25
25
|
- use safe stdin/file flags for shell-special payloads
|
|
26
26
|
- repair local auth/setup before asking the user to intervene
|
|
27
27
|
|