overlord-cli 0.2607231225.0 → 0.2607241654.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/dist/connectors/adapters/antigravity/conformance-manifest.yaml +1 -0
- package/dist/connectors/adapters/antigravity/scripts/overlord-mcp.mjs +42 -0
- package/dist/connectors/adapters/antigravity/skills/record-work.md +7 -3
- package/dist/connectors/adapters/claude/commands/record-work.md +12 -8
- package/dist/connectors/adapters/claude/conformance-manifest.yaml +1 -0
- package/dist/connectors/adapters/codex/conformance-manifest.yaml +1 -0
- package/dist/connectors/adapters/codex/scripts/overlord-mcp.mjs +42 -0
- package/dist/connectors/adapters/cursor/commands/record-work.md +7 -5
- package/dist/connectors/adapters/cursor/conformance-manifest.yaml +1 -0
- package/dist/connectors/adapters/cursor/scripts/overlord-mcp.mjs +42 -0
- package/dist/connectors/adapters/pi/conformance-manifest.yaml +1 -0
- package/dist/connectors/core/overlord-mission/SKILL.md +7 -4
- package/dist/connectors/core/overlord-mission/reference/cli.md +25 -2
- package/dist/connectors/core/overlord-mission/reference/mcp.md +1 -0
- package/dist/connectors/core/overlord-mission/reference/record-work.md +110 -0
- package/dist/index.js +57 -3
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
|
@@ -35,6 +35,7 @@ connector:
|
|
|
35
35
|
- "skills/spawn.md"
|
|
36
36
|
- "skills/overlord-mission/SKILL.md"
|
|
37
37
|
- "skills/overlord-mission/reference/cli.md"
|
|
38
|
+
- "skills/overlord-mission/reference/record-work.md"
|
|
38
39
|
- "skills/overlord-mission/reference/context.md"
|
|
39
40
|
- "skills/overlord-mission/reference/devices.md"
|
|
40
41
|
- "skills/overlord-mission/reference/mcp.md"
|
|
@@ -234,6 +234,33 @@ const tools = [
|
|
|
234
234
|
},
|
|
235
235
|
['missionId', 'sessionKey', 'summary']
|
|
236
236
|
)
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
name: 'overlord_record_work',
|
|
240
|
+
title: 'Record completed work as a mission',
|
|
241
|
+
description:
|
|
242
|
+
'Record work already completed in this chat as a mission that lands in review — one call, no attach/deliver cycle. Records file-change rationales and runs the delivery through the standard Gemini summarizer.',
|
|
243
|
+
inputSchema: objectSchema(
|
|
244
|
+
{
|
|
245
|
+
projectId: stringProperty('Overlord project id, slug, or name.'),
|
|
246
|
+
objective: stringProperty('What was asked and done, phrased as a completed objective.'),
|
|
247
|
+
summary: stringProperty('Reviewer-facing narrative of what changed and why.'),
|
|
248
|
+
title: stringProperty('Optional mission title.'),
|
|
249
|
+
changeRationales: {
|
|
250
|
+
type: 'array',
|
|
251
|
+
description: 'One entry per meaningful file change (filePath, label, summary, why, impact).'
|
|
252
|
+
},
|
|
253
|
+
changedFiles: {
|
|
254
|
+
type: 'array',
|
|
255
|
+
description: 'Optional extra touched files without a full rationale.'
|
|
256
|
+
},
|
|
257
|
+
artifacts: {
|
|
258
|
+
type: 'array',
|
|
259
|
+
description: 'Optional artifacts: next_steps, test_results, decision, note, or url.'
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
['projectId', 'objective', 'summary']
|
|
263
|
+
)
|
|
237
264
|
}
|
|
238
265
|
];
|
|
239
266
|
|
|
@@ -360,6 +387,21 @@ function callOverlordTool(name, args) {
|
|
|
360
387
|
: {})
|
|
361
388
|
});
|
|
362
389
|
}
|
|
390
|
+
if (name === 'overlord_record_work') {
|
|
391
|
+
return runProtocol('record-work', {
|
|
392
|
+
'project-id': requiredString(args, 'projectId'),
|
|
393
|
+
payload: {
|
|
394
|
+
objective: requiredString(args, 'objective'),
|
|
395
|
+
summary: requiredString(args, 'summary'),
|
|
396
|
+
...(optionalString(args, 'title') ? { title: requiredString(args, 'title') } : {}),
|
|
397
|
+
...(Array.isArray(args.changeRationales)
|
|
398
|
+
? { changeRationales: args.changeRationales }
|
|
399
|
+
: {}),
|
|
400
|
+
...(Array.isArray(args.changedFiles) ? { changedFiles: args.changedFiles } : {}),
|
|
401
|
+
...(Array.isArray(args.artifacts) ? { artifacts: args.artifacts } : {})
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
363
405
|
if (name === 'attach') {
|
|
364
406
|
return runProtocol('attach', { 'mission-id': args.mission_id });
|
|
365
407
|
}
|
|
@@ -4,10 +4,14 @@ description: Record completed-from-chat work as a mission in review, with a feed
|
|
|
4
4
|
|
|
5
5
|
Immediately record the work you just completed in this chat as a new Overlord mission via `ovld protocol record-work`. No agent session is opened — the work is already done.
|
|
6
6
|
|
|
7
|
+
This creates a mission with one completed objective, records the file changes with rationales, lands it in the review column, and runs the standard Gemini delivery summary.
|
|
8
|
+
|
|
7
9
|
Synthesize from the current conversation:
|
|
8
10
|
- `objective`: what was asked / what was done (1-3 sentences).
|
|
9
11
|
- `summary`: reviewer-friendly narrative of what changed and why.
|
|
10
|
-
- `changeRationales`: one entry per meaningful git-tracked file change (`
|
|
12
|
+
- `changeRationales`: one entry per meaningful git-tracked file change (`file_path`, `label`, `summary`, `why`, `impact`, optional `hunks`). Use `git status` and `git diff` to enumerate changed files. Every listed file shows as "covered" in review.
|
|
13
|
+
- `changedFiles` (optional): touched files without a full rationale (`filePath`, optional `vcsStatus`).
|
|
14
|
+
- `title` (optional): mission title; defaults to a title derived from the objective.
|
|
11
15
|
- `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
|
|
12
16
|
|
|
13
17
|
If a command argument is present, treat it as additional context to weave into the summary.
|
|
@@ -21,5 +25,5 @@ After the command succeeds, report the new `MISSION_ID`.
|
|
|
21
25
|
|
|
22
26
|
Rules:
|
|
23
27
|
- Do NOT use this for in-progress work. Use `/prompt` for that.
|
|
24
|
-
-
|
|
25
|
-
-
|
|
28
|
+
- If project resolution fails, re-run with `--project-id <id-or-name>`.
|
|
29
|
+
- The exact submission format is documented in `skills/overlord-mission/reference/record-work.md`.
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Record completed-from-chat work as a mission in review
|
|
2
|
+
description: Record completed-from-chat work as a mission in review (no attach)
|
|
3
3
|
argument-hint: [optional additional context]
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Immediately record the work you just completed in this chat as a new Overlord mission via `ovld protocol record-work`. No agent session is opened — the work is already done.
|
|
7
|
+
Immediately record the work you just completed in this chat as a new Overlord mission via `ovld protocol record-work`. No agent session is opened — the work is already done. This creates a mission with one completed objective, records the file changes with rationales, lands it in the review column, and runs the standard Gemini delivery summary.
|
|
8
8
|
|
|
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
|
-
- `changeRationales`: one entry per meaningful git-tracked file change (`
|
|
12
|
+
- `changeRationales`: one entry per meaningful git-tracked file change (`file_path`, `label`, `summary`, `why`, `impact`, optional `hunks`). Use `git status` and `git diff` to enumerate changed files. Every listed file shows as "covered" in review.
|
|
13
|
+
- `changedFiles` (optional): touched files you are not writing a full rationale for (`filePath`, optional `vcsStatus`).
|
|
14
|
+
- `title` (optional): mission title; defaults to a title derived from the objective.
|
|
13
15
|
- `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
|
|
14
16
|
|
|
15
17
|
If `$ARGUMENTS` is non-empty, treat it as additional context to weave into the summary.
|
|
@@ -17,13 +19,15 @@ If `$ARGUMENTS` is non-empty, treat it as additional context to weave into the s
|
|
|
17
19
|
Run:
|
|
18
20
|
`ovld protocol record-work --payload-file -`
|
|
19
21
|
|
|
20
|
-
and stream a JSON object
|
|
22
|
+
and stream a single JSON object on stdin via a single-quoted heredoc (`<<'EOF'`):
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
{ "objective": "...", "summary": "...", "title": "...", "changeRationales": [...], "changedFiles": [...], "artifacts": [...] }
|
|
26
|
+
```
|
|
21
27
|
|
|
22
28
|
After the command succeeds, report the new `MISSION_ID`.
|
|
23
29
|
|
|
24
30
|
Rules:
|
|
25
31
|
- Do NOT use this for in-progress work. Use `/prompt` for that.
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
- If project resolution fails, re-run with `--project-id <id-or-name>`.
|
|
33
|
+
- The exact submission format is documented in `skills/overlord-mission/reference/record-work.md`.
|
|
@@ -41,6 +41,7 @@ connector:
|
|
|
41
41
|
- "scripts/user-prompt-submit-hook.sh"
|
|
42
42
|
- "skills/overlord-mission/SKILL.md"
|
|
43
43
|
- "skills/overlord-mission/reference/cli.md"
|
|
44
|
+
- "skills/overlord-mission/reference/record-work.md"
|
|
44
45
|
- "skills/overlord-mission/reference/context.md"
|
|
45
46
|
- "skills/overlord-mission/reference/devices.md"
|
|
46
47
|
- "skills/overlord-mission/reference/mcp.md"
|
|
@@ -32,6 +32,7 @@ connector:
|
|
|
32
32
|
- "scripts/user-prompt-submit-hook.sh"
|
|
33
33
|
- "skills/overlord-mission/SKILL.md"
|
|
34
34
|
- "skills/overlord-mission/reference/cli.md"
|
|
35
|
+
- "skills/overlord-mission/reference/record-work.md"
|
|
35
36
|
- "skills/overlord-mission/reference/context.md"
|
|
36
37
|
- "skills/overlord-mission/reference/devices.md"
|
|
37
38
|
- "skills/overlord-mission/reference/mcp.md"
|
|
@@ -234,6 +234,33 @@ const tools = [
|
|
|
234
234
|
},
|
|
235
235
|
['missionId', 'sessionKey', 'summary']
|
|
236
236
|
)
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
name: 'overlord_record_work',
|
|
240
|
+
title: 'Record completed work as a mission',
|
|
241
|
+
description:
|
|
242
|
+
'Record work already completed in this chat as a mission that lands in review — one call, no attach/deliver cycle. Records file-change rationales and runs the delivery through the standard Gemini summarizer.',
|
|
243
|
+
inputSchema: objectSchema(
|
|
244
|
+
{
|
|
245
|
+
projectId: stringProperty('Overlord project id, slug, or name.'),
|
|
246
|
+
objective: stringProperty('What was asked and done, phrased as a completed objective.'),
|
|
247
|
+
summary: stringProperty('Reviewer-facing narrative of what changed and why.'),
|
|
248
|
+
title: stringProperty('Optional mission title.'),
|
|
249
|
+
changeRationales: {
|
|
250
|
+
type: 'array',
|
|
251
|
+
description: 'One entry per meaningful file change (filePath, label, summary, why, impact).'
|
|
252
|
+
},
|
|
253
|
+
changedFiles: {
|
|
254
|
+
type: 'array',
|
|
255
|
+
description: 'Optional extra touched files without a full rationale.'
|
|
256
|
+
},
|
|
257
|
+
artifacts: {
|
|
258
|
+
type: 'array',
|
|
259
|
+
description: 'Optional artifacts: next_steps, test_results, decision, note, or url.'
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
['projectId', 'objective', 'summary']
|
|
263
|
+
)
|
|
237
264
|
}
|
|
238
265
|
];
|
|
239
266
|
|
|
@@ -360,6 +387,21 @@ function callOverlordTool(name, args) {
|
|
|
360
387
|
: {})
|
|
361
388
|
});
|
|
362
389
|
}
|
|
390
|
+
if (name === 'overlord_record_work') {
|
|
391
|
+
return runProtocol('record-work', {
|
|
392
|
+
'project-id': requiredString(args, 'projectId'),
|
|
393
|
+
payload: {
|
|
394
|
+
objective: requiredString(args, 'objective'),
|
|
395
|
+
summary: requiredString(args, 'summary'),
|
|
396
|
+
...(optionalString(args, 'title') ? { title: requiredString(args, 'title') } : {}),
|
|
397
|
+
...(Array.isArray(args.changeRationales)
|
|
398
|
+
? { changeRationales: args.changeRationales }
|
|
399
|
+
: {}),
|
|
400
|
+
...(Array.isArray(args.changedFiles) ? { changedFiles: args.changedFiles } : {}),
|
|
401
|
+
...(Array.isArray(args.artifacts) ? { artifacts: args.artifacts } : {})
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
363
405
|
if (name === 'attach') {
|
|
364
406
|
return runProtocol('attach', { 'mission-id': args.mission_id });
|
|
365
407
|
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
Immediately record the work you just completed in this chat as a new Overlord mission via `ovld protocol record-work`. No agent session is opened — the work is already done.
|
|
1
|
+
Immediately record the work you just completed in this chat as a new Overlord mission via `ovld protocol record-work`. No agent session is opened — the work is already done. This creates a mission with one completed objective, records the file changes with rationales, lands it in the review column, and runs the standard Gemini delivery summary.
|
|
2
2
|
|
|
3
3
|
Synthesize from the current conversation:
|
|
4
4
|
- `objective`: what was asked / what was done.
|
|
5
|
-
- `summary`: reviewer-friendly narrative
|
|
6
|
-
- `changeRationales`: one entry per meaningful git-tracked file change (`
|
|
5
|
+
- `summary`: reviewer-friendly narrative of what changed and why.
|
|
6
|
+
- `changeRationales`: one entry per meaningful git-tracked file change (`file_path`, `label`, `summary`, `why`, `impact`, optional `hunks`). Use `git status` and `git diff` to enumerate changed files. Every listed file shows as "covered" in review.
|
|
7
|
+
- `changedFiles` (optional): touched files without a full rationale (`filePath`, optional `vcsStatus`).
|
|
8
|
+
- `title` (optional): mission title; defaults to a title derived from the objective.
|
|
7
9
|
- `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
|
|
8
10
|
|
|
9
11
|
If text was provided after `/record-work`, treat it as additional context for the summary.
|
|
10
12
|
|
|
11
|
-
Run `ovld protocol record-work --payload-file -` and stream
|
|
13
|
+
Run `ovld protocol record-work --payload-file -` and stream a single JSON object `{ "objective": "...", "summary": "...", "title": "...", "changeRationales": [...], "changedFiles": [...], "artifacts": [...] }` on stdin via a single-quoted heredoc.
|
|
12
14
|
|
|
13
15
|
After the command succeeds, report the new MISSION_ID.
|
|
14
16
|
|
|
15
|
-
Do NOT use for in-progress work — use `/prompt` for that.
|
|
17
|
+
Do NOT use for in-progress work — use `/prompt` for that. The exact submission format is documented in `skills/overlord-mission/reference/record-work.md`.
|
|
@@ -42,6 +42,7 @@ connector:
|
|
|
42
42
|
- "scripts/overlord-mcp.mjs"
|
|
43
43
|
- "skills/overlord-mission/SKILL.md"
|
|
44
44
|
- "skills/overlord-mission/reference/cli.md"
|
|
45
|
+
- "skills/overlord-mission/reference/record-work.md"
|
|
45
46
|
- "skills/overlord-mission/reference/context.md"
|
|
46
47
|
- "skills/overlord-mission/reference/devices.md"
|
|
47
48
|
- "skills/overlord-mission/reference/mcp.md"
|
|
@@ -234,6 +234,33 @@ const tools = [
|
|
|
234
234
|
},
|
|
235
235
|
['missionId', 'sessionKey', 'summary']
|
|
236
236
|
)
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
name: 'overlord_record_work',
|
|
240
|
+
title: 'Record completed work as a mission',
|
|
241
|
+
description:
|
|
242
|
+
'Record work already completed in this chat as a mission that lands in review — one call, no attach/deliver cycle. Records file-change rationales and runs the delivery through the standard Gemini summarizer.',
|
|
243
|
+
inputSchema: objectSchema(
|
|
244
|
+
{
|
|
245
|
+
projectId: stringProperty('Overlord project id, slug, or name.'),
|
|
246
|
+
objective: stringProperty('What was asked and done, phrased as a completed objective.'),
|
|
247
|
+
summary: stringProperty('Reviewer-facing narrative of what changed and why.'),
|
|
248
|
+
title: stringProperty('Optional mission title.'),
|
|
249
|
+
changeRationales: {
|
|
250
|
+
type: 'array',
|
|
251
|
+
description: 'One entry per meaningful file change (filePath, label, summary, why, impact).'
|
|
252
|
+
},
|
|
253
|
+
changedFiles: {
|
|
254
|
+
type: 'array',
|
|
255
|
+
description: 'Optional extra touched files without a full rationale.'
|
|
256
|
+
},
|
|
257
|
+
artifacts: {
|
|
258
|
+
type: 'array',
|
|
259
|
+
description: 'Optional artifacts: next_steps, test_results, decision, note, or url.'
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
['projectId', 'objective', 'summary']
|
|
263
|
+
)
|
|
237
264
|
}
|
|
238
265
|
];
|
|
239
266
|
|
|
@@ -360,6 +387,21 @@ function callOverlordTool(name, args) {
|
|
|
360
387
|
: {})
|
|
361
388
|
});
|
|
362
389
|
}
|
|
390
|
+
if (name === 'overlord_record_work') {
|
|
391
|
+
return runProtocol('record-work', {
|
|
392
|
+
'project-id': requiredString(args, 'projectId'),
|
|
393
|
+
payload: {
|
|
394
|
+
objective: requiredString(args, 'objective'),
|
|
395
|
+
summary: requiredString(args, 'summary'),
|
|
396
|
+
...(optionalString(args, 'title') ? { title: requiredString(args, 'title') } : {}),
|
|
397
|
+
...(Array.isArray(args.changeRationales)
|
|
398
|
+
? { changeRationales: args.changeRationales }
|
|
399
|
+
: {}),
|
|
400
|
+
...(Array.isArray(args.changedFiles) ? { changedFiles: args.changedFiles } : {}),
|
|
401
|
+
...(Array.isArray(args.artifacts) ? { artifacts: args.artifacts } : {})
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
363
405
|
if (name === 'attach') {
|
|
364
406
|
return runProtocol('attach', { 'mission-id': args.mission_id });
|
|
365
407
|
}
|
|
@@ -21,6 +21,7 @@ connector:
|
|
|
21
21
|
- "prompt-wrapper.md"
|
|
22
22
|
- "skills/overlord-mission/SKILL.md"
|
|
23
23
|
- "skills/overlord-mission/reference/cli.md"
|
|
24
|
+
- "skills/overlord-mission/reference/record-work.md"
|
|
24
25
|
- "skills/overlord-mission/reference/context.md"
|
|
25
26
|
- "skills/overlord-mission/reference/devices.md"
|
|
26
27
|
- "skills/overlord-mission/reference/mcp.md"
|
|
@@ -82,10 +82,11 @@ Use this mode when the conversation starts normally and the user asks the agent
|
|
|
82
82
|
5. If the user wants to establish a persistent session with a mission by ID, run `ovld protocol attach --mission-id <mission_id>`.
|
|
83
83
|
6. If the user wants to find a mission but does not know the ID, run `ovld protocol search-missions --query "..." --status next-up,execute` and ask the user to confirm.
|
|
84
84
|
7. If you need to understand project routing before prompting, use `ovld protocol discover-project`.
|
|
85
|
-
8. If you
|
|
86
|
-
9.
|
|
85
|
+
8. If the user wants to **record work that is already finished** in this chat (for example, something you just built in a chat app) as a completed mission, run `ovld protocol record-work` (or the hosted `overlord_record_work` MCP tool). This creates a mission with one completed objective, records the file changes with rationales, lands it in the review column, and runs the standard Gemini delivery summary — all in one call, with no `attach`/`deliver`. Do **not** use it for in-progress work. The exact submission format is in [reference/record-work.md](reference/record-work.md).
|
|
86
|
+
9. If you need other lifecycle commands or flags, run `ovld protocol help` and use the real subcommand list instead of guessing.
|
|
87
|
+
10. Once you attach to a mission, switch back to Mode 1 and follow the full mission lifecycle.
|
|
87
88
|
|
|
88
|
-
For mission creation examples, project discovery, and `--objectives-json` format see **CLI Command Reference** below.
|
|
89
|
+
For mission creation examples, project discovery, and `--objectives-json` format see **CLI Command Reference** below. For recording already-completed work, see [reference/record-work.md](reference/record-work.md).
|
|
89
90
|
|
|
90
91
|
## CLI Command Reference
|
|
91
92
|
|
|
@@ -299,7 +300,8 @@ When creating missions from within a repository:
|
|
|
299
300
|
- Follow-up `create` calls under an active session inherit the current mission's project by default, but `--project-id` can override that when the follow-up belongs in a different project.
|
|
300
301
|
- Create multiple missions when each prompt represents a different feature or goal.
|
|
301
302
|
- Add objectives to the same mission when each prompt is a sequential step toward the same feature or goal; use `ovld protocol add-objectives --mission-id <mission_id> --objectives-json '[{"objective":"..."}]'`.
|
|
302
|
-
- `create
|
|
303
|
+
- `create` and `prompt` require `--objectives-json` or `--objectives-file` with an ordered array of `{ "objective": "...", "title": "...", "autoAdvance": true }` objects. A single objective is just an array with one item.
|
|
304
|
+
- `record-work` is different: it creates exactly one **completed** objective. It takes a single `--objective` (or positional / an `objective` field in `--payload-json`) plus a `--summary` and the file-change data — not `--objectives-json`. See [reference/record-work.md](reference/record-work.md).
|
|
303
305
|
- `create`, `prompt`, `create-mission`, and `record-work` accept `--assigned-to <member>` to set the mission's human owner. Accepts a username, an email, a user-id UUID, or the `orgid:username` member ID. When omitted, the assignee defaults to the mission creator.
|
|
304
306
|
|
|
305
307
|
```bash
|
|
@@ -414,6 +416,7 @@ Field shape, inline vs stdin piping, and `record-change-rationales` syntax are i
|
|
|
414
416
|
## Reference
|
|
415
417
|
|
|
416
418
|
- [reference/cli.md](reference/cli.md) — Full protocol command syntax, flags, phases, mission creation, and project discovery
|
|
419
|
+
- [reference/record-work.md](reference/record-work.md) — Recording already-completed chat work as a review mission: the exact CLI/MCP submission format for `record-work` / `overlord_record_work`
|
|
417
420
|
- [reference/mcp.md](reference/mcp.md) — MCP tool naming, key casing, hosted vs local shim defaults
|
|
418
421
|
- [reference/devices.md](reference/devices.md) — Device fingerprints, project resources, and `--for-human`
|
|
419
422
|
- [reference/context.md](reference/context.md) — Shared state, attachments, and large artifact policy
|
|
@@ -164,8 +164,8 @@ When creating missions from within a repository:
|
|
|
164
164
|
- Follow-up `create` calls under an active session inherit the current mission's project by default, but `--project-id` can override that when the follow-up belongs in a different project.
|
|
165
165
|
- Create multiple missions when each prompt represents a different feature or goal.
|
|
166
166
|
- Add objectives to the same mission when each prompt is a sequential step toward the same feature or goal; use `ovld protocol add-objectives --mission-id <mission_id> --objectives-json '[{"objective":"..."}]'`.
|
|
167
|
-
- `create
|
|
168
|
-
- `
|
|
167
|
+
- `create` and `prompt` require `--objectives-json` or `--objectives-file` with an ordered array of `{ "objective": "...", "title": "...", "autoAdvance": true }` objects. A single objective is just an array with one item.
|
|
168
|
+
- `record-work` creates exactly one **completed** objective from a single `--objective` (or positional / an `objective` field in `--payload-json`) plus a `--summary` and file-change data — it does not take `--objectives-json`. See [record-work.md](record-work.md).
|
|
169
169
|
|
|
170
170
|
```bash
|
|
171
171
|
ovld protocol create --agent <agent-identifier> --objectives-json '[{"objective":"Capture follow-up work from this repository"}]'
|
|
@@ -179,6 +179,29 @@ ovld protocol prompt --agent <agent-identifier> --objectives-json '[{"objective"
|
|
|
179
179
|
ovld protocol add-objectives --mission-id 1:899 --objectives-json '[{"objective":"Implement the API"},{"objective":"Add CLI docs"}]'
|
|
180
180
|
```
|
|
181
181
|
|
|
182
|
+
### Record Completed Work
|
|
183
|
+
|
|
184
|
+
Record already-finished chat work as a completed review mission in one call — no
|
|
185
|
+
`attach`/`deliver`. Creates a mission with one completed objective, records the file
|
|
186
|
+
changes with rationales, lands it in review, and runs the Gemini delivery summary.
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
ovld protocol record-work --payload-file - <<'EOF'
|
|
190
|
+
{
|
|
191
|
+
"objective": "Add a CSV export button to the reports page.",
|
|
192
|
+
"summary": "Added a CSV export control and the serializer behind it.",
|
|
193
|
+
"changeRationales": [
|
|
194
|
+
{ "file_path": "src/reports/export.ts", "label": "CSV serializer",
|
|
195
|
+
"summary": "New CSV serializer.", "why": "Users need offline reports.",
|
|
196
|
+
"impact": "Reports can be exported as CSV." }
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
EOF
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The full submission format (fields, MCP equivalent, `changedFiles`) is in
|
|
203
|
+
[record-work.md](record-work.md).
|
|
204
|
+
|
|
182
205
|
### Local Durability For New Missions
|
|
183
206
|
|
|
184
207
|
`create`, `prompt`, `add-objectives`, and `record-work` save the objective/mission text to a local draft (`~/.overlord/pending-missions/`) **before** sending it, and delete that draft only once the server confirms the write. If the network drops mid-call, your text is never lost — the failure message points at the saved file. Manage outstanding drafts with `pending-missions`:
|
|
@@ -6,5 +6,6 @@
|
|
|
6
6
|
- `permission-request` is invoked by connector permission hooks installed by adapter bundles. Agents do not normally call it directly.
|
|
7
7
|
- Execution request tools (`request_execution`, `claim_execution`, `list_execution_requests`, `clear_execution_requests`, `complete_execution_launch`, `fail_execution_launch`) back the local runner queue. Agents normally work missions with `attach`/`update`/`deliver`; runner processes use these queue tools.
|
|
8
8
|
- `record_change_rationales` (MCP) and `ovld protocol record-change-rationales` (CLI) both write to the same `file_changes` table. The dedicated CLI route is `POST /api/protocol/record-change-rationales`.
|
|
9
|
+
- `overlord_record_work` (hosted MCP) and `ovld protocol record-work` (CLI) record already-completed chat work as a single review-column mission with a completed objective, file-change rationales, and the standard Gemini delivery summary — no `attach`/`deliver`. Hosted MCP requires `projectId` (it never chooses a project implicitly); the CLI resolves the project from the working directory or `--project-id`. The submission format is in [record-work.md](record-work.md). The route is `POST /api/protocol/record-work`.
|
|
9
10
|
- Objective attachment tools follow the `<verb>_<noun>` MCP naming: `list_attachments`, `prepare_attachment_upload`, `finalize_attachment_upload`, `get_attachment_download_url`, `upload_attachment_file`. CLI commands use `attachment-*`. `mission_id` / `missionId` is optional for attachment calls when the objective or attachment id lets the server derive mission scope.
|
|
10
11
|
- "Artifacts" in `deliver` are the structured records an agent submits at delivery time (next_steps, test_results, migration, decision, note, url) — not user-uploaded files. Files attached by users live on objectives via the attachment tools above.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Recording Completed Work (`record-work`)
|
|
2
|
+
|
|
3
|
+
Use `record-work` to log work that is **already finished** — for example, something you
|
|
4
|
+
just built for the user in a chat app — as a completed Overlord mission. It is the
|
|
5
|
+
after-the-fact equivalent of `create` + `attach` + `deliver`, collapsed into one call:
|
|
6
|
+
|
|
7
|
+
1. Creates a mission with a **single completed objective** matching the work done.
|
|
8
|
+
2. Records each file change with its rationale.
|
|
9
|
+
3. Lands the mission in the **review** column.
|
|
10
|
+
4. Runs the delivery through the **standard Gemini delivery summarizer**, so the result
|
|
11
|
+
reads like any other delivered (in-review) mission.
|
|
12
|
+
|
|
13
|
+
There is **no agent session** — do not `attach`. Do not use this for in-progress work
|
|
14
|
+
(use `create`/`prompt` for that).
|
|
15
|
+
|
|
16
|
+
## Submission format (authoritative)
|
|
17
|
+
|
|
18
|
+
Submit **one JSON envelope** on stdin. This is the efficient, quoting-safe path and is
|
|
19
|
+
identical across the CLI (`--payload-file -`) and the hosted MCP tool
|
|
20
|
+
(`overlord_record_work`).
|
|
21
|
+
|
|
22
|
+
```jsonc
|
|
23
|
+
{
|
|
24
|
+
"objective": "What was asked and what you did, phrased as a completed objective (1–3 sentences).",
|
|
25
|
+
"summary": "Reviewer-facing narrative of what changed and why. This is what the PM reads first.",
|
|
26
|
+
"title": "Optional mission title; defaults to a title derived from the objective.",
|
|
27
|
+
"changeRationales": [
|
|
28
|
+
{
|
|
29
|
+
"file_path": "src/widget.ts", // repository-relative path
|
|
30
|
+
"label": "Add widget", // short reviewer title
|
|
31
|
+
"summary": "New widget module.", // what changed in this file
|
|
32
|
+
"why": "User asked for a widget.", // why it changed
|
|
33
|
+
"impact": "Widget now renders on the dashboard." // behavioral impact
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"changedFiles": [
|
|
37
|
+
{ "filePath": "src/generated.ts", "vcsStatus": "M" } // optional; touched files without a rationale
|
|
38
|
+
],
|
|
39
|
+
"artifacts": [
|
|
40
|
+
{ "type": "next_steps", "label": "Next steps", "content": "…" } // optional
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Field rules
|
|
46
|
+
|
|
47
|
+
- **`objective`** (required) — the completed objective text. May also be passed as
|
|
48
|
+
`--objective`/positional on the CLI; a flag always wins over the envelope.
|
|
49
|
+
- **`summary`** (required) — narrative, not a command list.
|
|
50
|
+
- **`title`** (optional) — omit to derive from the objective.
|
|
51
|
+
- **`changeRationales`** (one per meaningful file change) — same shape as `deliver`. All
|
|
52
|
+
five string fields (`file_path`, `label`, `summary`, `why`, `impact`) are required per
|
|
53
|
+
entry. `filePath` (camelCase) is accepted as an alias for `file_path`. Do **not** wrap
|
|
54
|
+
entries under a `rationale` key. Skip formatting-only noise.
|
|
55
|
+
- Every rationale's `file_path` is automatically recorded as a **changed file** and
|
|
56
|
+
shows as **covered** in the review file panel — you do not list it twice.
|
|
57
|
+
- **`changedFiles`** (optional) — additional touched files you are *not* writing a full
|
|
58
|
+
rationale for. They appear as **missing_rationale** in review, exactly like a live
|
|
59
|
+
delivery. Uses `filePath` (camelCase) + optional `vcsStatus`.
|
|
60
|
+
- **`artifacts`** (optional) — `next_steps`, `test_results`, `migration`, `note`, `url`,
|
|
61
|
+
or `decision`.
|
|
62
|
+
- **`deliveryReport`** (optional) — you may include a `deliveryReport.agentReport`
|
|
63
|
+
(`humanActions`, `tradeoffsMade`, `knownRisks`, `deferredWork`, `assumptions`) just as
|
|
64
|
+
in `deliver`. It improves review visibility but never blocks the record.
|
|
65
|
+
|
|
66
|
+
Enumerate changed files from `git status` / `git diff` before writing rationales.
|
|
67
|
+
|
|
68
|
+
## CLI
|
|
69
|
+
|
|
70
|
+
Stream the envelope on stdin with a single-quoted heredoc (safe for backticks/`$vars`):
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
ovld protocol record-work --payload-file - <<'EOF'
|
|
74
|
+
{
|
|
75
|
+
"objective": "Add a CSV export button to the reports page.",
|
|
76
|
+
"summary": "Added a CSV export control and the serializer behind it.",
|
|
77
|
+
"changeRationales": [
|
|
78
|
+
{ "file_path": "src/reports/export.ts", "label": "CSV serializer",
|
|
79
|
+
"summary": "New CSV serializer.", "why": "Users need offline reports.",
|
|
80
|
+
"impact": "Reports can be exported as CSV." }
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
EOF
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
- Project resolution: matches the current directory to a project resource. Pass
|
|
87
|
+
`--project-id <id-or-name>` when running outside a linked checkout or to be explicit.
|
|
88
|
+
- The command prints the new mission (and `MISSION_ID`); report it back to the user.
|
|
89
|
+
- Inline `--*-json` flags are capped (~8 KB) — prefer `--payload-file -` on stdin.
|
|
90
|
+
|
|
91
|
+
## Hosted MCP
|
|
92
|
+
|
|
93
|
+
Call `overlord_record_work` with the same fields as first-class arguments
|
|
94
|
+
(`projectId` **required** — hosted MCP never chooses a project implicitly):
|
|
95
|
+
|
|
96
|
+
```jsonc
|
|
97
|
+
{
|
|
98
|
+
"projectId": "acme-web",
|
|
99
|
+
"objective": "Add a CSV export button to the reports page.",
|
|
100
|
+
"summary": "Added a CSV export control and the serializer behind it.",
|
|
101
|
+
"changeRationales": [
|
|
102
|
+
{ "filePath": "src/reports/export.ts", "label": "CSV serializer",
|
|
103
|
+
"summary": "New CSV serializer.", "why": "Users need offline reports.",
|
|
104
|
+
"impact": "Reports can be exported as CSV." }
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The tool returns the created review-column mission and the `deliveryId` whose Gemini
|
|
110
|
+
summary is composing asynchronously.
|
package/dist/index.js
CHANGED
|
@@ -14808,19 +14808,30 @@ prompt:
|
|
|
14808
14808
|
|
|
14809
14809
|
record-work:
|
|
14810
14810
|
Purpose:
|
|
14811
|
-
Record work already completed in chat as a mission in review
|
|
14812
|
-
|
|
14811
|
+
Record work already completed in chat as a completed mission in review, in one
|
|
14812
|
+
call \u2014 no attach/deliver cycle. Creates a mission with a single completed
|
|
14813
|
+
objective, records the file changes and their rationales, lands it in the review
|
|
14814
|
+
column, and runs the delivery through the standard Gemini summarizer so it reads
|
|
14815
|
+
like any other delivered mission. Use instead of create + attach + deliver.
|
|
14813
14816
|
Required:
|
|
14814
|
-
--objective "<text>" (or positional objective
|
|
14817
|
+
--objective "<text>" (or positional, or an "objective" field in --payload-json)
|
|
14815
14818
|
--summary or --summary-file <path|->
|
|
14816
14819
|
Optional:
|
|
14817
14820
|
--title <text>
|
|
14818
14821
|
--project-id <id>
|
|
14819
14822
|
--artifacts-json / --artifacts-file <path|->
|
|
14820
14823
|
--change-rationales-json / --change-rationales-file <path|->
|
|
14824
|
+
--changed-files-json / --changed-files-file <path|->
|
|
14825
|
+
--payload-json / --payload-file <path|-> (single envelope; see Notes)
|
|
14821
14826
|
Notes:
|
|
14827
|
+
Efficient form: stream one JSON object on stdin via \`--payload-file -\` carrying
|
|
14828
|
+
{ objective, summary, title?, changeRationales, changedFiles?, artifacts? }.
|
|
14829
|
+
Explicit flags always win over fields inside --payload-json.
|
|
14822
14830
|
Change-rationale entries use the same shape documented under \`deliver\`
|
|
14823
14831
|
(file_path, label, summary, why, impact; summary is named "summary", not "rationale").
|
|
14832
|
+
Every rationale's file_path is recorded as a changed file (shown "covered" in
|
|
14833
|
+
review); add --changed-files-json for touched files without a rationale. The
|
|
14834
|
+
full submission format lives in reference/record-work.md.
|
|
14824
14835
|
|
|
14825
14836
|
update:
|
|
14826
14837
|
Purpose:
|
|
@@ -17157,6 +17168,43 @@ async function runManagementCommand({
|
|
|
17157
17168
|
else console.log(`Linked ${sourceUrl} to project ${projectId}`);
|
|
17158
17169
|
return;
|
|
17159
17170
|
}
|
|
17171
|
+
case "add-et": {
|
|
17172
|
+
const name = flagValue(parsed.flags, "--name") ?? parsed.positional.join(" ");
|
|
17173
|
+
const protocolFlags = {};
|
|
17174
|
+
if (name) protocolFlags["--name"] = name;
|
|
17175
|
+
const workspaceId = flagValue(parsed.flags, "--workspace-id");
|
|
17176
|
+
if (workspaceId) protocolFlags["--workspace-id"] = workspaceId;
|
|
17177
|
+
const result = await runtime.backend.post({
|
|
17178
|
+
path: "/api/protocol/register-target",
|
|
17179
|
+
body: { args: rest, positional: parsed.positional, flags: protocolFlags, fileInputs: {} }
|
|
17180
|
+
});
|
|
17181
|
+
const record = asRecord2(result);
|
|
17182
|
+
if (record.status === "workspace_selection_required") {
|
|
17183
|
+
if (json) {
|
|
17184
|
+
printJson({ result });
|
|
17185
|
+
} else {
|
|
17186
|
+
const workspaces = Array.isArray(record.workspaces) ? record.workspaces : [];
|
|
17187
|
+
console.log(
|
|
17188
|
+
"You belong to more than one workspace. Re-run with --workspace-id set to one of:"
|
|
17189
|
+
);
|
|
17190
|
+
for (const entry of workspaces) {
|
|
17191
|
+
const ws = asRecord2(entry);
|
|
17192
|
+
console.log(` - ${ws.name ?? ws.id} (${ws.slug ?? ws.id})`);
|
|
17193
|
+
}
|
|
17194
|
+
}
|
|
17195
|
+
return;
|
|
17196
|
+
}
|
|
17197
|
+
if (json) {
|
|
17198
|
+
printJson({ result });
|
|
17199
|
+
} else {
|
|
17200
|
+
const target = asRecord2(record.executionTarget);
|
|
17201
|
+
const ws = asRecord2(record.workspace);
|
|
17202
|
+
console.log(
|
|
17203
|
+
`Registered execution target ${target.label ?? name ?? ""} (${target.executionTargetId ?? "unknown"}) in workspace ${ws.name ?? ws.id ?? ""}`
|
|
17204
|
+
);
|
|
17205
|
+
}
|
|
17206
|
+
return;
|
|
17207
|
+
}
|
|
17160
17208
|
case "create":
|
|
17161
17209
|
case "prompt": {
|
|
17162
17210
|
const objectivesJson = flagValue(parsed.flags, "--objectives-json");
|
|
@@ -17780,6 +17828,7 @@ var COMMAND_FLAGS = {
|
|
|
17780
17828
|
],
|
|
17781
17829
|
"add-cwd": ["--directory", "--key", "--project-id", "--primary", "--access"],
|
|
17782
17830
|
"add-url": ["--url", "--project-id", "--key", "--primary", "--access"],
|
|
17831
|
+
"add-et": ["--name", "--workspace-id"],
|
|
17783
17832
|
create: ["--objectives-json", "--objective", "--prompt", "--project-id", "--title", "--resource"],
|
|
17784
17833
|
prompt: [
|
|
17785
17834
|
"--objectives-json",
|
|
@@ -17912,6 +17961,10 @@ Projects:
|
|
|
17912
17961
|
(prompts to pick a project when --project-id is omitted)
|
|
17913
17962
|
${primaryCommand} add-url --url <git-url> --project-id <id> [--key <resourceKey>] [--primary true|false] [--access read|read_write]
|
|
17914
17963
|
|
|
17964
|
+
Execution targets:
|
|
17965
|
+
${primaryCommand} add-et --name "<name>" [--workspace-id <id-or-name>] [--json]
|
|
17966
|
+
(announce this machine as an execution target)
|
|
17967
|
+
|
|
17915
17968
|
Missions:
|
|
17916
17969
|
${primaryCommand} create "<objective>" [--objectives-json '[...]'] [--json]
|
|
17917
17970
|
${primaryCommand} prompt "<objective>" [--json]
|
|
@@ -17982,6 +18035,7 @@ var KNOWN_COMMANDS = /* @__PURE__ */ new Set([
|
|
|
17982
18035
|
"org-setup",
|
|
17983
18036
|
"add-cwd",
|
|
17984
18037
|
"add-url",
|
|
18038
|
+
"add-et",
|
|
17985
18039
|
"create",
|
|
17986
18040
|
"prompt",
|
|
17987
18041
|
"attach",
|