overlord-cli 0.2607201427.0 → 0.2607240957.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 +71 -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 +71 -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 +71 -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 +263 -219
- package/dist/index.js.map +4 -4
- 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"
|
|
@@ -89,6 +89,23 @@ const tools = [
|
|
|
89
89
|
)
|
|
90
90
|
})
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
name: 'overlord_create_project',
|
|
94
|
+
title: 'Create Overlord project',
|
|
95
|
+
description:
|
|
96
|
+
'Create a new Overlord project. If the caller belongs to more than one workspace and none is given, returns a workspace_selection_required result listing the workspaces for the user to choose.',
|
|
97
|
+
inputSchema: objectSchema(
|
|
98
|
+
{
|
|
99
|
+
name: stringProperty('New project name.'),
|
|
100
|
+
workspaceId: stringProperty(
|
|
101
|
+
'Workspace to create the project in (id, slug, or name). Required only when the caller belongs to multiple workspaces.'
|
|
102
|
+
),
|
|
103
|
+
description: stringProperty('Optional project description.'),
|
|
104
|
+
slug: stringProperty('Optional project slug; defaults to a slug derived from the name.')
|
|
105
|
+
},
|
|
106
|
+
['name']
|
|
107
|
+
)
|
|
108
|
+
},
|
|
92
109
|
{
|
|
93
110
|
name: 'overlord_search_missions',
|
|
94
111
|
title: 'Search Overlord missions',
|
|
@@ -217,6 +234,33 @@ const tools = [
|
|
|
217
234
|
},
|
|
218
235
|
['missionId', 'sessionKey', 'summary']
|
|
219
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
|
+
)
|
|
220
264
|
}
|
|
221
265
|
];
|
|
222
266
|
|
|
@@ -240,6 +284,18 @@ function callOverlordTool(name, args) {
|
|
|
240
284
|
...(optionalString(args, 'directory') ? { directory: requiredString(args, 'directory') } : {})
|
|
241
285
|
});
|
|
242
286
|
}
|
|
287
|
+
if (name === 'overlord_create_project') {
|
|
288
|
+
return runProtocol('create-project', {
|
|
289
|
+
name: requiredString(args, 'name'),
|
|
290
|
+
...(optionalString(args, 'workspaceId')
|
|
291
|
+
? { 'workspace-id': requiredString(args, 'workspaceId') }
|
|
292
|
+
: {}),
|
|
293
|
+
...(optionalString(args, 'description')
|
|
294
|
+
? { description: requiredString(args, 'description') }
|
|
295
|
+
: {}),
|
|
296
|
+
...(optionalString(args, 'slug') ? { slug: requiredString(args, 'slug') } : {})
|
|
297
|
+
});
|
|
298
|
+
}
|
|
243
299
|
if (name === 'overlord_search_missions') {
|
|
244
300
|
return runProtocol('search-missions', {
|
|
245
301
|
...(optionalString(args, 'query') ? { query: requiredString(args, 'query') } : {}),
|
|
@@ -331,6 +387,21 @@ function callOverlordTool(name, args) {
|
|
|
331
387
|
: {})
|
|
332
388
|
});
|
|
333
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
|
+
}
|
|
334
405
|
if (name === 'attach') {
|
|
335
406
|
return runProtocol('attach', { 'mission-id': args.mission_id });
|
|
336
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"
|
|
@@ -89,6 +89,23 @@ const tools = [
|
|
|
89
89
|
)
|
|
90
90
|
})
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
name: 'overlord_create_project',
|
|
94
|
+
title: 'Create Overlord project',
|
|
95
|
+
description:
|
|
96
|
+
'Create a new Overlord project. If the caller belongs to more than one workspace and none is given, returns a workspace_selection_required result listing the workspaces for the user to choose.',
|
|
97
|
+
inputSchema: objectSchema(
|
|
98
|
+
{
|
|
99
|
+
name: stringProperty('New project name.'),
|
|
100
|
+
workspaceId: stringProperty(
|
|
101
|
+
'Workspace to create the project in (id, slug, or name). Required only when the caller belongs to multiple workspaces.'
|
|
102
|
+
),
|
|
103
|
+
description: stringProperty('Optional project description.'),
|
|
104
|
+
slug: stringProperty('Optional project slug; defaults to a slug derived from the name.')
|
|
105
|
+
},
|
|
106
|
+
['name']
|
|
107
|
+
)
|
|
108
|
+
},
|
|
92
109
|
{
|
|
93
110
|
name: 'overlord_search_missions',
|
|
94
111
|
title: 'Search Overlord missions',
|
|
@@ -217,6 +234,33 @@ const tools = [
|
|
|
217
234
|
},
|
|
218
235
|
['missionId', 'sessionKey', 'summary']
|
|
219
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
|
+
)
|
|
220
264
|
}
|
|
221
265
|
];
|
|
222
266
|
|
|
@@ -240,6 +284,18 @@ function callOverlordTool(name, args) {
|
|
|
240
284
|
...(optionalString(args, 'directory') ? { directory: requiredString(args, 'directory') } : {})
|
|
241
285
|
});
|
|
242
286
|
}
|
|
287
|
+
if (name === 'overlord_create_project') {
|
|
288
|
+
return runProtocol('create-project', {
|
|
289
|
+
name: requiredString(args, 'name'),
|
|
290
|
+
...(optionalString(args, 'workspaceId')
|
|
291
|
+
? { 'workspace-id': requiredString(args, 'workspaceId') }
|
|
292
|
+
: {}),
|
|
293
|
+
...(optionalString(args, 'description')
|
|
294
|
+
? { description: requiredString(args, 'description') }
|
|
295
|
+
: {}),
|
|
296
|
+
...(optionalString(args, 'slug') ? { slug: requiredString(args, 'slug') } : {})
|
|
297
|
+
});
|
|
298
|
+
}
|
|
243
299
|
if (name === 'overlord_search_missions') {
|
|
244
300
|
return runProtocol('search-missions', {
|
|
245
301
|
...(optionalString(args, 'query') ? { query: requiredString(args, 'query') } : {}),
|
|
@@ -331,6 +387,21 @@ function callOverlordTool(name, args) {
|
|
|
331
387
|
: {})
|
|
332
388
|
});
|
|
333
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
|
+
}
|
|
334
405
|
if (name === 'attach') {
|
|
335
406
|
return runProtocol('attach', { 'mission-id': args.mission_id });
|
|
336
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"
|
|
@@ -89,6 +89,23 @@ const tools = [
|
|
|
89
89
|
)
|
|
90
90
|
})
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
name: 'overlord_create_project',
|
|
94
|
+
title: 'Create Overlord project',
|
|
95
|
+
description:
|
|
96
|
+
'Create a new Overlord project. If the caller belongs to more than one workspace and none is given, returns a workspace_selection_required result listing the workspaces for the user to choose.',
|
|
97
|
+
inputSchema: objectSchema(
|
|
98
|
+
{
|
|
99
|
+
name: stringProperty('New project name.'),
|
|
100
|
+
workspaceId: stringProperty(
|
|
101
|
+
'Workspace to create the project in (id, slug, or name). Required only when the caller belongs to multiple workspaces.'
|
|
102
|
+
),
|
|
103
|
+
description: stringProperty('Optional project description.'),
|
|
104
|
+
slug: stringProperty('Optional project slug; defaults to a slug derived from the name.')
|
|
105
|
+
},
|
|
106
|
+
['name']
|
|
107
|
+
)
|
|
108
|
+
},
|
|
92
109
|
{
|
|
93
110
|
name: 'overlord_search_missions',
|
|
94
111
|
title: 'Search Overlord missions',
|
|
@@ -217,6 +234,33 @@ const tools = [
|
|
|
217
234
|
},
|
|
218
235
|
['missionId', 'sessionKey', 'summary']
|
|
219
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
|
+
)
|
|
220
264
|
}
|
|
221
265
|
];
|
|
222
266
|
|
|
@@ -240,6 +284,18 @@ function callOverlordTool(name, args) {
|
|
|
240
284
|
...(optionalString(args, 'directory') ? { directory: requiredString(args, 'directory') } : {})
|
|
241
285
|
});
|
|
242
286
|
}
|
|
287
|
+
if (name === 'overlord_create_project') {
|
|
288
|
+
return runProtocol('create-project', {
|
|
289
|
+
name: requiredString(args, 'name'),
|
|
290
|
+
...(optionalString(args, 'workspaceId')
|
|
291
|
+
? { 'workspace-id': requiredString(args, 'workspaceId') }
|
|
292
|
+
: {}),
|
|
293
|
+
...(optionalString(args, 'description')
|
|
294
|
+
? { description: requiredString(args, 'description') }
|
|
295
|
+
: {}),
|
|
296
|
+
...(optionalString(args, 'slug') ? { slug: requiredString(args, 'slug') } : {})
|
|
297
|
+
});
|
|
298
|
+
}
|
|
243
299
|
if (name === 'overlord_search_missions') {
|
|
244
300
|
return runProtocol('search-missions', {
|
|
245
301
|
...(optionalString(args, 'query') ? { query: requiredString(args, 'query') } : {}),
|
|
@@ -331,6 +387,21 @@ function callOverlordTool(name, args) {
|
|
|
331
387
|
: {})
|
|
332
388
|
});
|
|
333
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
|
+
}
|
|
334
405
|
if (name === 'attach') {
|
|
335
406
|
return runProtocol('attach', { 'mission-id': args.mission_id });
|
|
336
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.
|