overlord-cli 0.2605240843.0 → 0.2605241101.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 +3 -1
- package/bin/_cli/protocol.mjs +18 -3
- package/bin/_cli/setup.mjs +20 -2
- package/package.json +1 -1
- package/plugins/antigravity/scripts/overlord-mcp.mjs +75 -9
- package/plugins/antigravity/skills/overlord-ticket/SKILL.md +15 -3
- package/plugins/claude/hooks/hooks.json +11 -0
- package/plugins/claude/scripts/stop-hook.sh +78 -0
- package/plugins/claude/skills/overlord-ticket/SKILL.md +7 -3
- package/plugins/claude/skills/overlord-ticket/reference/cli.md +8 -0
- package/plugins/cursor/skills/overlord-ticket/SKILL.md +7 -3
- package/plugins/cursor/skills/overlord-ticket/reference/cli.md +8 -0
- package/plugins/overlord/scripts/overlord-mcp.mjs +28 -6
- package/plugins/overlord/skills/overlord-ticket/SKILL.md +7 -3
- package/plugins/overlord/skills/overlord-ticket/reference/cli.md +8 -0
package/README.md
CHANGED
|
@@ -127,7 +127,7 @@ Agents can find docs here: https://www.ovld.ai/docs/for-agents
|
|
|
127
127
|
- `create` - create a draft ticket without attaching (standalone or follow-up)
|
|
128
128
|
- `prompt` - create a ticket and attach to it immediately (`spawn` is a backward-compatible alias)
|
|
129
129
|
- `record-work` - record already-completed chat work as a ticket in review with a completed objective and trigger feed-post generation
|
|
130
|
-
- `update` - post progress,
|
|
130
|
+
- `update` - post progress, discussion/decision events, optional change rationales, and explicit `--begin-follow-up-work` transitions
|
|
131
131
|
- `record-change-rationales` - persist structured change rationales without a normal progress update
|
|
132
132
|
- `ask` - post a blocking question and move the ticket to review
|
|
133
133
|
- `permission-request` - notify Overlord that the agent is requesting tool permission
|
|
@@ -151,6 +151,8 @@ Use `create` for future work you want to track, `prompt` for work that should st
|
|
|
151
151
|
|
|
152
152
|
`ovld protocol deliver` accepts either discrete flags like `--summary` / `--artifacts-json`, an inline full payload with `--payload-json '{"summary":"...","artifacts":[...],"changeRationales":[...]}'`, or a file/stdin payload with `--payload-file <path|->`.
|
|
153
153
|
|
|
154
|
+
After delivery, follow-up messages are recorded as discussion by default. To start implementation again on a delivered/review ticket, call `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before moving back to `--phase execute`. Use `--event-type discussion_summary` or `--event-type decision` for important non-file outcomes. Once follow-up execution records a real work signal, such as an execution update, git snapshot, change rationales, deliverables, or explicit `pending_delivery` intent, Overlord marks the objective `pending_delivery` so redelivery is only required for actual post-delivery work.
|
|
155
|
+
|
|
154
156
|
## License
|
|
155
157
|
|
|
156
158
|
Permission is granted to use this software for any purpose, free of charge. You may not modify, distribute, sublicense, or sell copies of the software without explicit permission from the author.
|
package/bin/_cli/protocol.mjs
CHANGED
|
@@ -1023,6 +1023,8 @@ async function protocolUpdate(args) {
|
|
|
1023
1023
|
: {}),
|
|
1024
1024
|
...(flags.phase ? { phase: String(flags.phase) } : {}),
|
|
1025
1025
|
...(flags['event-type'] ? { eventType: String(flags['event-type']) } : {}),
|
|
1026
|
+
...(flags['begin-follow-up-work'] !== undefined ? { beginFollowUpWork: true } : {}),
|
|
1027
|
+
...(flags['follow-up-intent'] ? { followUpIntent: String(flags['follow-up-intent']) } : {}),
|
|
1026
1028
|
...(flags['payload-json']
|
|
1027
1029
|
? { payload: parseJsonFlag('--payload-json', flags['payload-json']) }
|
|
1028
1030
|
: {}),
|
|
@@ -1204,13 +1206,17 @@ async function protocolHookEvent(args) {
|
|
|
1204
1206
|
await resolveProtocolAuthForFlags(flags, ticketId);
|
|
1205
1207
|
const timeoutMs = resolveTimeout(flags);
|
|
1206
1208
|
|
|
1209
|
+
const sessionKey = String(flags['session-key'] ?? process.env.SESSION_KEY ?? '');
|
|
1210
|
+
|
|
1207
1211
|
const body = {
|
|
1208
1212
|
hookType,
|
|
1209
1213
|
ticketId,
|
|
1210
1214
|
...(flags.prompt !== undefined ? { prompt: String(flags.prompt) } : {}),
|
|
1211
1215
|
...(flags['turn-index'] !== undefined
|
|
1212
1216
|
? { turnIndex: parseInt(String(flags['turn-index']), 10) }
|
|
1213
|
-
: {})
|
|
1217
|
+
: {}),
|
|
1218
|
+
...(flags['follow-up-intent'] ? { followUpIntent: String(flags['follow-up-intent']) } : {}),
|
|
1219
|
+
...(sessionKey ? { sessionKey } : {})
|
|
1214
1220
|
};
|
|
1215
1221
|
|
|
1216
1222
|
try {
|
|
@@ -2696,14 +2702,22 @@ update:
|
|
|
2696
2702
|
--summary <text> or --summary-file <path|->
|
|
2697
2703
|
Optional:
|
|
2698
2704
|
--phase <status> draft | execute | review | deliver | complete | blocked | cancelled
|
|
2699
|
-
--event-type <type> update | user_follow_up | alert
|
|
2705
|
+
--event-type <type> update | user_follow_up | alert | discussion_summary | decision
|
|
2706
|
+
--begin-follow-up-work Explicitly reopen a delivered/review ticket for execution
|
|
2707
|
+
--follow-up-intent <mode> discussion | execution | pending_delivery
|
|
2700
2708
|
--payload-json <json> Additional structured payload, for example notifications
|
|
2701
2709
|
--external-url <url|null> Store or clear a deep link to the live agent session
|
|
2702
2710
|
--external-session-id <id|null>
|
|
2703
2711
|
--change-rationales-json <json>
|
|
2704
2712
|
--change-rationales-file <path>
|
|
2705
2713
|
Notes:
|
|
2706
|
-
Use phase=execute while actively working.
|
|
2714
|
+
Use phase=execute while actively working. For delivered/review tickets, pass
|
|
2715
|
+
--begin-follow-up-work before moving back to execute. user_follow_up is for
|
|
2716
|
+
verbatim human follow-up messages; discussion_summary and decision record
|
|
2717
|
+
important non-file follow-up outcomes. After a prior delivery, execution
|
|
2718
|
+
updates, git snapshots, change rationales, or explicit pending_delivery
|
|
2719
|
+
intent mark the objective as pending_delivery so redelivery is required
|
|
2720
|
+
only when follow-up execution produced work.
|
|
2707
2721
|
Pass --summary-file - to read the summary from stdin — avoids shell interpretation of backticks,
|
|
2708
2722
|
quotes, or other special characters in the summary text.
|
|
2709
2723
|
|
|
@@ -2750,6 +2764,7 @@ hook-event:
|
|
|
2750
2764
|
Optional:
|
|
2751
2765
|
--prompt <text>
|
|
2752
2766
|
--turn-index <n>
|
|
2767
|
+
--follow-up-intent <mode> discussion | execution | pending_delivery
|
|
2753
2768
|
|
|
2754
2769
|
read-context:
|
|
2755
2770
|
Purpose:
|
package/bin/_cli/setup.mjs
CHANGED
|
@@ -1670,6 +1670,19 @@ function getPlatformUrl() {
|
|
|
1670
1670
|
return process.env.OVERLORD_URL || 'http://localhost:3000';
|
|
1671
1671
|
}
|
|
1672
1672
|
|
|
1673
|
+
function printAgentPermissionsDescription() {
|
|
1674
|
+
console.log('Agent permissions pre-approve the `ovld protocol` commands your coding');
|
|
1675
|
+
console.log('agent runs to drive Overlord tickets (attach, update, deliver, etc.) so');
|
|
1676
|
+
console.log('you aren\'t prompted to approve each call mid-task. Without this, the');
|
|
1677
|
+
console.log('agent stalls on permission prompts for every protocol step.');
|
|
1678
|
+
console.log('');
|
|
1679
|
+
console.log('Where each agent\'s permission is written:');
|
|
1680
|
+
console.log(' • Claude Code — ./.claude/settings.local.json (this directory only)');
|
|
1681
|
+
console.log(' • OpenCode — ~/.config/opencode/opencode.json (global)');
|
|
1682
|
+
console.log(' • Codex — prints a one-time command to run inside Codex');
|
|
1683
|
+
console.log('Each entry is plain JSON you can review or remove at any time.\n');
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1673
1686
|
function installAgentPermissions(agents, platformUrl) {
|
|
1674
1687
|
console.log(`\nInstalling agent permissions for: ${agents.join(', ')}`);
|
|
1675
1688
|
console.log(`Platform URL: ${platformUrl}\n`);
|
|
@@ -1878,6 +1891,7 @@ export async function runSetupCommand(args) {
|
|
|
1878
1891
|
if (agentsThatNeedPermissions.length > 0) {
|
|
1879
1892
|
console.log('Agent plugins/connectors prepared successfully!\n');
|
|
1880
1893
|
|
|
1894
|
+
printAgentPermissionsDescription();
|
|
1881
1895
|
const shouldInstallPermissions = await askYesNo(
|
|
1882
1896
|
'Would you like to configure agent permissions for Overlord protocol access?',
|
|
1883
1897
|
true
|
|
@@ -1923,8 +1937,10 @@ export async function runSetupCommand(args) {
|
|
|
1923
1937
|
);
|
|
1924
1938
|
|
|
1925
1939
|
if (agentsThatNeedPermissions.length > 0) {
|
|
1940
|
+
console.log();
|
|
1941
|
+
printAgentPermissionsDescription();
|
|
1926
1942
|
const shouldInstallPermissions = await askYesNo(
|
|
1927
|
-
'
|
|
1943
|
+
'Would you like to configure agent permissions for Overlord protocol access?',
|
|
1928
1944
|
true
|
|
1929
1945
|
);
|
|
1930
1946
|
|
|
@@ -1956,8 +1972,10 @@ export async function runSetupCommand(args) {
|
|
|
1956
1972
|
|
|
1957
1973
|
// Offer permissions setup for single agent install too
|
|
1958
1974
|
if (['claude', 'codex', 'opencode'].includes(agent)) {
|
|
1975
|
+
console.log();
|
|
1976
|
+
printAgentPermissionsDescription();
|
|
1959
1977
|
const shouldInstallPermissions = await askYesNo(
|
|
1960
|
-
'
|
|
1978
|
+
'Would you like to configure agent permissions for Overlord protocol access?',
|
|
1961
1979
|
true
|
|
1962
1980
|
);
|
|
1963
1981
|
|
package/package.json
CHANGED
|
@@ -327,7 +327,8 @@ const tools = [
|
|
|
327
327
|
},
|
|
328
328
|
{
|
|
329
329
|
name: 'update',
|
|
330
|
-
description:
|
|
330
|
+
description:
|
|
331
|
+
'Post an Overlord progress update or activity event. Use begin_follow_up_work to explicitly reopen delivered/review tickets for follow-up execution.',
|
|
331
332
|
inputSchema: {
|
|
332
333
|
type: 'object',
|
|
333
334
|
properties: {
|
|
@@ -341,7 +342,15 @@ const tools = [
|
|
|
341
342
|
type: 'string',
|
|
342
343
|
enum: ['draft', 'execute', 'review', 'deliver', 'complete', 'blocked', 'cancelled']
|
|
343
344
|
},
|
|
344
|
-
event_type: {
|
|
345
|
+
event_type: {
|
|
346
|
+
type: 'string',
|
|
347
|
+
enum: ['update', 'user_follow_up', 'alert', 'discussion_summary', 'decision']
|
|
348
|
+
},
|
|
349
|
+
begin_follow_up_work: { type: 'boolean' },
|
|
350
|
+
follow_up_intent: {
|
|
351
|
+
type: 'string',
|
|
352
|
+
enum: ['discussion', 'execution', 'pending_delivery']
|
|
353
|
+
},
|
|
345
354
|
external_url: { type: ['string', 'null'] },
|
|
346
355
|
external_session_id: { type: ['string', 'null'] },
|
|
347
356
|
payload: { type: 'object' },
|
|
@@ -355,6 +364,8 @@ const tools = [
|
|
|
355
364
|
summary: args.summary,
|
|
356
365
|
phase: args.phase,
|
|
357
366
|
'event-type': args.event_type,
|
|
367
|
+
...(args.begin_follow_up_work ? { 'begin-follow-up-work': true } : {}),
|
|
368
|
+
'follow-up-intent': args.follow_up_intent,
|
|
358
369
|
'external-url': args.external_url,
|
|
359
370
|
'external-session-id': args.external_session_id,
|
|
360
371
|
'payload-json': args.payload,
|
|
@@ -394,7 +405,7 @@ const tools = [
|
|
|
394
405
|
{
|
|
395
406
|
name: 'record_hook_event',
|
|
396
407
|
description:
|
|
397
|
-
|
|
408
|
+
"Record a hook lifecycle event for a ticket. Use hookType='Stop' with a session_key to check whether delivery is needed after a turn ends.",
|
|
398
409
|
inputSchema: {
|
|
399
410
|
type: 'object',
|
|
400
411
|
properties: {
|
|
@@ -404,7 +415,16 @@ const tools = [
|
|
|
404
415
|
description: 'Ticket identifier (e.g. 1:899). Also accepts UUID.'
|
|
405
416
|
},
|
|
406
417
|
prompt: { type: 'string' },
|
|
407
|
-
turn_index: { type: 'number' }
|
|
418
|
+
turn_index: { type: 'number' },
|
|
419
|
+
follow_up_intent: {
|
|
420
|
+
type: 'string',
|
|
421
|
+
enum: ['discussion', 'execution', 'pending_delivery']
|
|
422
|
+
},
|
|
423
|
+
session_key: {
|
|
424
|
+
type: 'string',
|
|
425
|
+
description:
|
|
426
|
+
'Optional session key for Stop hooks. When provided, the response includes deliveryStatus indicating whether delivery is needed.'
|
|
427
|
+
}
|
|
408
428
|
},
|
|
409
429
|
required: ['hook_type', 'ticket_id']
|
|
410
430
|
},
|
|
@@ -412,7 +432,9 @@ const tools = [
|
|
|
412
432
|
'hook-type': args.hook_type,
|
|
413
433
|
'ticket-id': args.ticket_id,
|
|
414
434
|
prompt: args.prompt,
|
|
415
|
-
'turn-index': args.turn_index
|
|
435
|
+
'turn-index': args.turn_index,
|
|
436
|
+
'follow-up-intent': args.follow_up_intent,
|
|
437
|
+
'session-key': args.session_key
|
|
416
438
|
}),
|
|
417
439
|
subcommand: 'hook-event'
|
|
418
440
|
},
|
|
@@ -760,6 +782,10 @@ const tools = [
|
|
|
760
782
|
device_platform: {
|
|
761
783
|
type: 'string',
|
|
762
784
|
description: 'e.g. darwin, linux, win32.'
|
|
785
|
+
},
|
|
786
|
+
device_port: {
|
|
787
|
+
type: 'integer',
|
|
788
|
+
description: 'SSH port for placeholder reconciliation when multiple targets share the same host.'
|
|
763
789
|
}
|
|
764
790
|
},
|
|
765
791
|
required: ['device_fingerprint']
|
|
@@ -771,7 +797,8 @@ const tools = [
|
|
|
771
797
|
: {}),
|
|
772
798
|
...(typeof args.device_platform === 'string' && args.device_platform.trim().length > 0
|
|
773
799
|
? { 'device-platform': args.device_platform }
|
|
774
|
-
: {})
|
|
800
|
+
: {}),
|
|
801
|
+
...(typeof args.device_port === 'number' ? { 'device-port': args.device_port } : {})
|
|
775
802
|
}),
|
|
776
803
|
subcommand: 'get-device'
|
|
777
804
|
},
|
|
@@ -833,7 +860,11 @@ const tools = [
|
|
|
833
860
|
label: { type: 'string' },
|
|
834
861
|
is_primary: { type: 'boolean' },
|
|
835
862
|
device_hostname: { type: 'string' },
|
|
836
|
-
device_platform: { type: 'string' }
|
|
863
|
+
device_platform: { type: 'string' },
|
|
864
|
+
device_port: {
|
|
865
|
+
type: 'integer',
|
|
866
|
+
description: 'SSH port for placeholder reconciliation when multiple targets share the same host.'
|
|
867
|
+
}
|
|
837
868
|
},
|
|
838
869
|
required: ['project_id', 'device_fingerprint']
|
|
839
870
|
},
|
|
@@ -850,7 +881,8 @@ const tools = [
|
|
|
850
881
|
: {}),
|
|
851
882
|
...(typeof args.device_platform === 'string' && args.device_platform.trim().length > 0
|
|
852
883
|
? { 'device-platform': args.device_platform }
|
|
853
|
-
: {})
|
|
884
|
+
: {}),
|
|
885
|
+
...(typeof args.device_port === 'number' ? { 'device-port': args.device_port } : {})
|
|
854
886
|
}),
|
|
855
887
|
subcommand: 'add-project-resource'
|
|
856
888
|
},
|
|
@@ -885,6 +917,40 @@ const tools = [
|
|
|
885
917
|
}),
|
|
886
918
|
subcommand: 'update-project-resource'
|
|
887
919
|
},
|
|
920
|
+
{
|
|
921
|
+
name: 'request_approval_gate',
|
|
922
|
+
description:
|
|
923
|
+
'Flip the next queued future objective on this ticket to require manual human approval before it runs. Use sparingly — only when your current work surfaced a question, risk, or decision a human must make before the next objective auto-launches.',
|
|
924
|
+
inputSchema: {
|
|
925
|
+
type: 'object',
|
|
926
|
+
properties: {
|
|
927
|
+
session_key: { type: 'string' },
|
|
928
|
+
ticket_id: {
|
|
929
|
+
type: 'string',
|
|
930
|
+
description: 'Ticket identifier (e.g. 1:899). Also accepts UUID.'
|
|
931
|
+
},
|
|
932
|
+
reason: {
|
|
933
|
+
type: 'string',
|
|
934
|
+
description:
|
|
935
|
+
'Why a human must approve before the next objective runs. Rendered in the awaiting-approval banner verbatim.'
|
|
936
|
+
},
|
|
937
|
+
objective_id: {
|
|
938
|
+
type: 'string',
|
|
939
|
+
description: 'Optional UUID of a specific future objective to gate. Defaults to the next.'
|
|
940
|
+
}
|
|
941
|
+
},
|
|
942
|
+
required: ['session_key', 'ticket_id', 'reason']
|
|
943
|
+
},
|
|
944
|
+
toCliFlags: args => ({
|
|
945
|
+
'session-key': args.session_key,
|
|
946
|
+
'ticket-id': args.ticket_id,
|
|
947
|
+
reason: args.reason,
|
|
948
|
+
...(typeof args.objective_id === 'string' && args.objective_id.trim().length > 0
|
|
949
|
+
? { 'objective-id': args.objective_id }
|
|
950
|
+
: {})
|
|
951
|
+
}),
|
|
952
|
+
subcommand: 'request-approval-gate'
|
|
953
|
+
},
|
|
888
954
|
{
|
|
889
955
|
name: 'request_execution',
|
|
890
956
|
description:
|
|
@@ -1190,7 +1256,7 @@ async function handleRequest(message) {
|
|
|
1190
1256
|
},
|
|
1191
1257
|
serverInfo: {
|
|
1192
1258
|
name: 'overlord',
|
|
1193
|
-
version: '0.1.
|
|
1259
|
+
version: '0.1.1'
|
|
1194
1260
|
},
|
|
1195
1261
|
instructions:
|
|
1196
1262
|
'Use these tools to drive Overlord ticket workflows through the installed ovld CLI. Names mirror hosted MCP tools (attach, update, deliver, get_device, list_project_resources, …). Session tools need attach/connect. Devices are scoped to organization + user + fingerprint — call get_device before add_project_resource.'
|
|
@@ -15,7 +15,7 @@ Use this mode when the prompt already contains a ticket ID or explicitly says th
|
|
|
15
15
|
2. Keep the returned `session.sessionKey` for all follow-up calls.
|
|
16
16
|
3. Treat the Overlord ticket prompt as authoritative for the objective, constraints, and delivery target.
|
|
17
17
|
4. Post updates while working with `ovld protocol update --phase execute`.
|
|
18
|
-
5. Follow-up messages after the initial ticket are captured automatically by the installed `UserPromptSubmit` hook. Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
18
|
+
5. Follow-up messages after the initial ticket are captured automatically by the installed `UserPromptSubmit` hook and stay in discussion intent while the ticket is in review. Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
19
19
|
6. If blocked, call `ovld protocol ask` and stop.
|
|
20
20
|
7. Deliver last with `ovld protocol deliver`, including `changeRationales` for each meaningful behavioral file change.
|
|
21
21
|
|
|
@@ -60,6 +60,14 @@ Event types:
|
|
|
60
60
|
- `update` for standard progress updates
|
|
61
61
|
- `user_follow_up` for human follow-up messages after the initial ticket when the automatic hook is unavailable
|
|
62
62
|
- `alert` for warnings or non-blocking issues
|
|
63
|
+
- `discussion_summary` for important discussion outcomes that should remain visible on the ticket
|
|
64
|
+
- `decision` for explicit non-file decisions made during follow-up discussion
|
|
65
|
+
|
|
66
|
+
Post-delivery follow-up modes:
|
|
67
|
+
|
|
68
|
+
- User follow-up messages default to `discussion` intent while the ticket is in review.
|
|
69
|
+
- Use `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before moving a delivered/review ticket back to execution.
|
|
70
|
+
- Use `--follow-up-intent pending_delivery` when implementation is complete but final delivery is still being prepared.
|
|
63
71
|
|
|
64
72
|
Ask when blocked:
|
|
65
73
|
|
|
@@ -256,12 +264,16 @@ This keeps the ticket feed readable while preserving the full document in versio
|
|
|
256
264
|
- Always attach first and always deliver last once you are on a ticket.
|
|
257
265
|
- Use `ovld protocol` commands and the plugin's slash commands instead of ad hoc scripts.
|
|
258
266
|
- Do not invent protocol subcommands. Use `ovld protocol help` when unsure.
|
|
267
|
+
- After delivery, answer ordinary questions and clarifications in discussion mode; only begin follow-up execution when the user explicitly asks for file or code changes.
|
|
268
|
+
- When explicit follow-up implementation starts on a delivered/review ticket, call `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before code changes or `--phase execute`.
|
|
269
|
+
- During follow-up execution, post progress updates and record change rationales for each file modified, the same as during initial execution.
|
|
270
|
+
- Record important non-file decisions with `--event-type decision` or `--event-type discussion_summary`.
|
|
259
271
|
- The `summary` in deliver is what the PM reads first, so write it as a narrative, not a command list.
|
|
260
272
|
- When a summary or question contains backticks, `$vars`, or other shell-special characters, always use `--summary-file -` (or `--question-file -`) with a single-quoted heredoc (`<<'EOF'`). Never retry by stripping or escaping content — pipe stdin instead.
|
|
261
273
|
- Use `write-context` for facts a future agent session should know.
|
|
262
274
|
- If a protocol or MCP call fails with auth/session errors, run `ovld auth repair` yourself before asking the user to log in again or proceed without Overlord updates.
|
|
263
275
|
- If you must run `ovld auth login`, `--organization-id <id>` is optional — use it only when you want to set a different default organization than the CLI would choose automatically.
|
|
264
276
|
- Do not add or commit changes unless the user explicitly asks you to commit.
|
|
265
|
-
- Delivery is the concluding step. After delivering, stop unless the user
|
|
277
|
+
- Delivery is the concluding step. After delivering, stop implementation work unless the user explicitly asks for follow-up execution; once follow-up execution is complete, deliver again.
|
|
266
278
|
|
|
267
|
-
<!-- version: 0.1.
|
|
279
|
+
<!-- version: 0.1.4 -->
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Overlord Stop hook — fires when the agent's turn ends.
|
|
3
|
+
# Checks whether the session has pending delivery work and outputs
|
|
4
|
+
# guidance if delivery is needed. Does not force delivery.
|
|
5
|
+
|
|
6
|
+
BODY=$(cat -)
|
|
7
|
+
OVERLORD_BASE_URL="${CLAUDE_PLUGIN_OPTION_OVERLORD_URL:-$OVERLORD_URL}"
|
|
8
|
+
OVERLORD_TOKEN="${CLAUDE_PLUGIN_OPTION_AGENT_TOKEN:-${CLAUDE_PLUGIN_OPTION_OVERLORD_ACCESS_TOKEN:-$OVERLORD_ACCESS_TOKEN}}"
|
|
9
|
+
OVERLORD_LOCAL_SECRET="${OVERLORD_LOCAL_SECRET:-}"
|
|
10
|
+
LOG_DIR="${HOME:-}/.ovld/logs"
|
|
11
|
+
LOG_FILE="${LOG_DIR}/stop-hook.log"
|
|
12
|
+
|
|
13
|
+
log_hook() {
|
|
14
|
+
mkdir -p "$LOG_DIR" 2>/dev/null || return 0
|
|
15
|
+
printf '%s [stop] %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$1" >>"$LOG_FILE" 2>/dev/null || true
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if [ -z "$OVERLORD_BASE_URL" ] || [ -z "$OVERLORD_TOKEN" ] || [ -z "${TICKET_ID:-}" ]; then
|
|
19
|
+
log_hook "missing required env, skipping"
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
SESSION_KEY=$(python3 -c "
|
|
24
|
+
import base64, json, os, tempfile
|
|
25
|
+
cwd = os.getcwd().encode()
|
|
26
|
+
encoded = base64.urlsafe_b64encode(cwd).decode().rstrip('=')
|
|
27
|
+
session_file = os.path.join(tempfile.gettempdir(), f'.overlord-session-{encoded}')
|
|
28
|
+
try:
|
|
29
|
+
with open(session_file) as f:
|
|
30
|
+
data = json.load(f)
|
|
31
|
+
print(data.get('sessionKey', ''))
|
|
32
|
+
except Exception:
|
|
33
|
+
print('')
|
|
34
|
+
" 2>/dev/null)
|
|
35
|
+
|
|
36
|
+
if [ -z "$SESSION_KEY" ]; then
|
|
37
|
+
log_hook "no persisted session key, skipping delivery check"
|
|
38
|
+
exit 0
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
PAYLOAD="{\"hookType\":\"Stop\",\"ticketId\":\"$TICKET_ID\",\"sessionKey\":\"$SESSION_KEY\"}"
|
|
42
|
+
|
|
43
|
+
log_hook "checking delivery status session_key=${SESSION_KEY:0:8}..."
|
|
44
|
+
|
|
45
|
+
RESPONSE_FILE=$(mktemp "${TMPDIR:-/tmp}/overlord-stop-hook.XXXXXX")
|
|
46
|
+
HTTP_CODE=$(curl -sS -m 5 -o "$RESPONSE_FILE" -w "%{http_code}" \
|
|
47
|
+
-X POST "$OVERLORD_BASE_URL/api/protocol/hook-event" \
|
|
48
|
+
-H "Authorization: Bearer $OVERLORD_TOKEN" \
|
|
49
|
+
-H "X-Overlord-Local-Secret: $OVERLORD_LOCAL_SECRET" \
|
|
50
|
+
-H "Content-Type: application/json" \
|
|
51
|
+
-d "$PAYLOAD")
|
|
52
|
+
CURL_EXIT=$?
|
|
53
|
+
|
|
54
|
+
if [ "$CURL_EXIT" -eq 0 ] && [ -f "$RESPONSE_FILE" ]; then
|
|
55
|
+
GUIDANCE=$(python3 -c "
|
|
56
|
+
import json, sys
|
|
57
|
+
try:
|
|
58
|
+
with open(sys.argv[1]) as f:
|
|
59
|
+
data = json.load(f)
|
|
60
|
+
status = data.get('deliveryStatus')
|
|
61
|
+
if status and status.get('needed'):
|
|
62
|
+
print(status.get('reason', 'Pending delivery work detected.'))
|
|
63
|
+
except Exception:
|
|
64
|
+
pass
|
|
65
|
+
" "$RESPONSE_FILE" 2>/dev/null)
|
|
66
|
+
|
|
67
|
+
if [ -n "$GUIDANCE" ]; then
|
|
68
|
+
log_hook "delivery needed, outputting guidance"
|
|
69
|
+
echo "[Overlord] $GUIDANCE"
|
|
70
|
+
else
|
|
71
|
+
log_hook "no delivery needed"
|
|
72
|
+
fi
|
|
73
|
+
else
|
|
74
|
+
log_hook "hook-event POST failed exit=$CURL_EXIT http_status=${HTTP_CODE:-none}"
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
rm -f "$RESPONSE_FILE"
|
|
78
|
+
exit 0
|
|
@@ -15,7 +15,7 @@ Use this mode when the prompt already contains a ticket ID or explicitly says th
|
|
|
15
15
|
2. The attach response prints JSON to stdout containing `session.sessionKey`. The CLI also persists this key automatically so subsequent `ovld protocol` commands in the same working directory resolve it without `--session-key`. If auto-resolution fails, pass `--session-key <sessionKey>` explicitly on every subsequent call.
|
|
16
16
|
3. Treat the Overlord ticket prompt as authoritative for the objective, constraints, and delivery target.
|
|
17
17
|
4. Post updates while working: `ovld protocol update --session-key <sessionKey> --ticket-id <ticket_id> --summary "..." --phase execute`.
|
|
18
|
-
5. Follow-up messages after the initial ticket are captured automatically by the installed `UserPromptSubmit` hook. Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
18
|
+
5. Follow-up messages after the initial ticket are captured automatically by the installed `UserPromptSubmit` hook and stay in discussion intent while the ticket is in review. Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
19
19
|
6. If blocked, call `ovld protocol ask --session-key <sessionKey> --ticket-id <ticket_id> --question "..."` and stop.
|
|
20
20
|
7. Deliver last with `ovld protocol deliver --session-key <sessionKey> --ticket-id <ticket_id> --summary "..."`, including `changeRationales` for each meaningful behavioral file change.
|
|
21
21
|
|
|
@@ -93,13 +93,17 @@ For the `record-change-rationales` command and full payload shape with optional
|
|
|
93
93
|
- Use `ovld protocol` commands and the plugin's slash commands instead of ad hoc scripts.
|
|
94
94
|
- Do not invent protocol subcommands. Use `ovld protocol help` when unsure.
|
|
95
95
|
- Include at least one progress update before delivering.
|
|
96
|
+
- After delivery, answer ordinary questions and clarifications in discussion mode; only begin follow-up execution when the user explicitly asks for file or code changes.
|
|
97
|
+
- When explicit follow-up implementation starts on a delivered/review ticket, call `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before code changes or `--phase execute`.
|
|
98
|
+
- During follow-up execution, post progress updates and record change rationales for each file modified, the same as during initial execution.
|
|
99
|
+
- Record important non-file decisions with `--event-type decision` or `--event-type discussion_summary`.
|
|
96
100
|
- The `summary` in deliver is what the PM reads first, so write it as a narrative, not a command list.
|
|
97
101
|
- When a summary or question contains backticks, `$vars`, or other shell-special characters, always use `--summary-file -` (or `--question-file -`) with a single-quoted heredoc (`<<'EOF'`). Never retry by stripping or escaping content — pipe stdin instead. See [reference/shell-escaping.md](reference/shell-escaping.md).
|
|
98
102
|
- Use `write-context` for facts a future agent session should know.
|
|
99
103
|
- If a protocol or MCP call fails with auth/session errors, run `ovld auth repair` yourself before asking the user to log in again or proceed without Overlord updates.
|
|
100
104
|
- If you must run `ovld auth login`, `--organization-id <id>` is optional — use it only when you want to set a different default organization than the CLI would choose automatically.
|
|
101
105
|
- Do not add or commit changes unless the user explicitly asks you to commit.
|
|
102
|
-
- Delivery is the concluding step. After delivering, stop unless the user
|
|
106
|
+
- Delivery is the concluding step. After delivering, stop implementation work unless the user explicitly asks for follow-up execution; once follow-up execution is complete, deliver again.
|
|
103
107
|
|
|
104
108
|
## Reference
|
|
105
109
|
|
|
@@ -109,5 +113,5 @@ For the `record-change-rationales` command and full payload shape with optional
|
|
|
109
113
|
- [reference/context.md](reference/context.md) — Shared state, attachments, and large artifact policy
|
|
110
114
|
- [reference/shell-escaping.md](reference/shell-escaping.md) — Heredoc stdin piping for special characters in summaries and payloads
|
|
111
115
|
|
|
112
|
-
<!-- version: 0.5.
|
|
116
|
+
<!-- version: 0.5.8 -->
|
|
113
117
|
|
|
@@ -31,6 +31,14 @@ Event types:
|
|
|
31
31
|
- `update` for standard progress updates
|
|
32
32
|
- `user_follow_up` — only when the `UserPromptSubmit` hook is unavailable; the hook normally posts follow-ups to the activity feed
|
|
33
33
|
- `alert` for warnings or non-blocking issues
|
|
34
|
+
- `discussion_summary` for important discussion outcomes that should remain visible on the ticket
|
|
35
|
+
- `decision` for explicit non-file decisions made during follow-up discussion
|
|
36
|
+
|
|
37
|
+
Post-delivery follow-up modes:
|
|
38
|
+
|
|
39
|
+
- User follow-up messages default to `discussion` intent while the ticket is in review.
|
|
40
|
+
- Use `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before moving a delivered/review ticket back to execution.
|
|
41
|
+
- Use `--follow-up-intent pending_delivery` when implementation is complete but final delivery is still being prepared.
|
|
34
42
|
|
|
35
43
|
## Ask
|
|
36
44
|
|
|
@@ -15,7 +15,7 @@ Use this mode when the prompt already contains a ticket ID or explicitly says th
|
|
|
15
15
|
2. The attach response prints JSON to stdout containing `session.sessionKey`. The CLI also persists this key automatically so subsequent `ovld protocol` commands in the same working directory resolve it without `--session-key`. If auto-resolution fails, pass `--session-key <sessionKey>` explicitly on every subsequent call.
|
|
16
16
|
3. Treat the Overlord ticket prompt as authoritative for the objective, constraints, and delivery target.
|
|
17
17
|
4. Post updates while working: `ovld protocol update --session-key <sessionKey> --ticket-id <ticket_id> --summary "..." --phase execute`.
|
|
18
|
-
5. Follow-up messages after the initial ticket are captured automatically by the installed Cursor `beforeSubmitPrompt` hook (see `~/.cursor/hooks.json`). Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
18
|
+
5. Follow-up messages after the initial ticket are captured automatically by the installed Cursor `beforeSubmitPrompt` hook (see `~/.cursor/hooks.json`) and stay in discussion intent while the ticket is in review. Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
19
19
|
6. If blocked, call `ovld protocol ask --session-key <sessionKey> --ticket-id <ticket_id> --question "..."` and stop.
|
|
20
20
|
7. Deliver last with `ovld protocol deliver --session-key <sessionKey> --ticket-id <ticket_id> --summary "..."`, including `changeRationales` for each meaningful behavioral file change.
|
|
21
21
|
|
|
@@ -93,13 +93,17 @@ For the `record-change-rationales` command and full payload shape with optional
|
|
|
93
93
|
- Use `ovld protocol` commands, the plugin commands, and the MCP tool instead of ad hoc scripts.
|
|
94
94
|
- Do not invent protocol subcommands. Use `ovld protocol help` when unsure.
|
|
95
95
|
- Include at least one progress update before delivering.
|
|
96
|
+
- After delivery, answer ordinary questions and clarifications in discussion mode; only begin follow-up execution when the user explicitly asks for file or code changes.
|
|
97
|
+
- When explicit follow-up implementation starts on a delivered/review ticket, call `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before code changes or `--phase execute`.
|
|
98
|
+
- During follow-up execution, post progress updates and record change rationales for each file modified, the same as during initial execution.
|
|
99
|
+
- Record important non-file decisions with `--event-type decision` or `--event-type discussion_summary`.
|
|
96
100
|
- The `summary` in deliver is what the PM reads first, so write it as a narrative, not a command list.
|
|
97
101
|
- When a summary or question contains backticks, `$vars`, or other shell-special characters, always use `--summary-file -` (or `--question-file -`) with a single-quoted heredoc (`<<'EOF'`). Never retry by stripping or escaping content — pipe stdin instead. See [reference/shell-escaping.md](reference/shell-escaping.md).
|
|
98
102
|
- Use `write-context` for facts a future agent session should know.
|
|
99
103
|
- If a protocol or MCP call fails with auth/session errors, run `ovld auth repair` yourself before asking the user to log in again or proceed without Overlord updates.
|
|
100
104
|
- If you must run `ovld auth login`, `--organization-id <id>` is optional — use it only when you want to set a different default organization than the CLI would choose automatically.
|
|
101
105
|
- Do not add or commit changes unless the user explicitly asks you to commit.
|
|
102
|
-
- Delivery is the concluding step. After delivering, stop unless the user
|
|
106
|
+
- Delivery is the concluding step. After delivering, stop implementation work unless the user explicitly asks for follow-up execution; once follow-up execution is complete, deliver again.
|
|
103
107
|
|
|
104
108
|
## Reference
|
|
105
109
|
|
|
@@ -109,5 +113,5 @@ For the `record-change-rationales` command and full payload shape with optional
|
|
|
109
113
|
- [reference/context.md](reference/context.md) — Shared state, attachments, and large artifact policy
|
|
110
114
|
- [reference/shell-escaping.md](reference/shell-escaping.md) — Heredoc stdin piping for special characters in summaries and payloads
|
|
111
115
|
|
|
112
|
-
<!-- version: 0.5.
|
|
116
|
+
<!-- version: 0.5.8 -->
|
|
113
117
|
|
|
@@ -31,6 +31,14 @@ Event types:
|
|
|
31
31
|
- `update` for standard progress updates
|
|
32
32
|
- `user_follow_up` — only when the Cursor `beforeSubmitPrompt` hook (see `~/.cursor/hooks.json`) is unavailable; the hook normally posts follow-ups to the activity feed
|
|
33
33
|
- `alert` for warnings or non-blocking issues
|
|
34
|
+
- `discussion_summary` for important discussion outcomes that should remain visible on the ticket
|
|
35
|
+
- `decision` for explicit non-file decisions made during follow-up discussion
|
|
36
|
+
|
|
37
|
+
Post-delivery follow-up modes:
|
|
38
|
+
|
|
39
|
+
- User follow-up messages default to `discussion` intent while the ticket is in review.
|
|
40
|
+
- Use `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before moving a delivered/review ticket back to execution.
|
|
41
|
+
- Use `--follow-up-intent pending_delivery` when implementation is complete but final delivery is still being prepared.
|
|
34
42
|
|
|
35
43
|
## Ask
|
|
36
44
|
|
|
@@ -327,7 +327,8 @@ const tools = [
|
|
|
327
327
|
},
|
|
328
328
|
{
|
|
329
329
|
name: 'update',
|
|
330
|
-
description:
|
|
330
|
+
description:
|
|
331
|
+
'Post an Overlord progress update or activity event. Use begin_follow_up_work to explicitly reopen delivered/review tickets for follow-up execution.',
|
|
331
332
|
inputSchema: {
|
|
332
333
|
type: 'object',
|
|
333
334
|
properties: {
|
|
@@ -341,7 +342,15 @@ const tools = [
|
|
|
341
342
|
type: 'string',
|
|
342
343
|
enum: ['draft', 'execute', 'review', 'deliver', 'complete', 'blocked', 'cancelled']
|
|
343
344
|
},
|
|
344
|
-
event_type: {
|
|
345
|
+
event_type: {
|
|
346
|
+
type: 'string',
|
|
347
|
+
enum: ['update', 'user_follow_up', 'alert', 'discussion_summary', 'decision']
|
|
348
|
+
},
|
|
349
|
+
begin_follow_up_work: { type: 'boolean' },
|
|
350
|
+
follow_up_intent: {
|
|
351
|
+
type: 'string',
|
|
352
|
+
enum: ['discussion', 'execution', 'pending_delivery']
|
|
353
|
+
},
|
|
345
354
|
external_url: { type: ['string', 'null'] },
|
|
346
355
|
external_session_id: { type: ['string', 'null'] },
|
|
347
356
|
payload: { type: 'object' },
|
|
@@ -355,6 +364,8 @@ const tools = [
|
|
|
355
364
|
summary: args.summary,
|
|
356
365
|
phase: args.phase,
|
|
357
366
|
'event-type': args.event_type,
|
|
367
|
+
...(args.begin_follow_up_work ? { 'begin-follow-up-work': true } : {}),
|
|
368
|
+
'follow-up-intent': args.follow_up_intent,
|
|
358
369
|
'external-url': args.external_url,
|
|
359
370
|
'external-session-id': args.external_session_id,
|
|
360
371
|
'payload-json': args.payload,
|
|
@@ -394,7 +405,7 @@ const tools = [
|
|
|
394
405
|
{
|
|
395
406
|
name: 'record_hook_event',
|
|
396
407
|
description:
|
|
397
|
-
|
|
408
|
+
"Record a hook lifecycle event for a ticket. Use hookType='Stop' with a session_key to check whether delivery is needed after a turn ends.",
|
|
398
409
|
inputSchema: {
|
|
399
410
|
type: 'object',
|
|
400
411
|
properties: {
|
|
@@ -404,7 +415,16 @@ const tools = [
|
|
|
404
415
|
description: 'Ticket identifier (e.g. 1:899). Also accepts UUID.'
|
|
405
416
|
},
|
|
406
417
|
prompt: { type: 'string' },
|
|
407
|
-
turn_index: { type: 'number' }
|
|
418
|
+
turn_index: { type: 'number' },
|
|
419
|
+
follow_up_intent: {
|
|
420
|
+
type: 'string',
|
|
421
|
+
enum: ['discussion', 'execution', 'pending_delivery']
|
|
422
|
+
},
|
|
423
|
+
session_key: {
|
|
424
|
+
type: 'string',
|
|
425
|
+
description:
|
|
426
|
+
'Optional session key for Stop hooks. When provided, the response includes deliveryStatus indicating whether delivery is needed.'
|
|
427
|
+
}
|
|
408
428
|
},
|
|
409
429
|
required: ['hook_type', 'ticket_id']
|
|
410
430
|
},
|
|
@@ -412,7 +432,9 @@ const tools = [
|
|
|
412
432
|
'hook-type': args.hook_type,
|
|
413
433
|
'ticket-id': args.ticket_id,
|
|
414
434
|
prompt: args.prompt,
|
|
415
|
-
'turn-index': args.turn_index
|
|
435
|
+
'turn-index': args.turn_index,
|
|
436
|
+
'follow-up-intent': args.follow_up_intent,
|
|
437
|
+
'session-key': args.session_key
|
|
416
438
|
}),
|
|
417
439
|
subcommand: 'hook-event'
|
|
418
440
|
},
|
|
@@ -1197,7 +1219,7 @@ async function handleRequest(message) {
|
|
|
1197
1219
|
},
|
|
1198
1220
|
serverInfo: {
|
|
1199
1221
|
name: 'overlord',
|
|
1200
|
-
version: '0.1.
|
|
1222
|
+
version: '0.1.6'
|
|
1201
1223
|
},
|
|
1202
1224
|
instructions:
|
|
1203
1225
|
'Use these tools to drive Overlord ticket workflows through the installed ovld CLI. Names mirror hosted MCP tools (attach, update, deliver, get_device, list_project_resources, …). Session tools need attach/connect. Devices are scoped to organization + user + fingerprint — call get_device before add_project_resource.'
|
|
@@ -15,7 +15,7 @@ Use this mode when the prompt already contains a ticket ID or explicitly says th
|
|
|
15
15
|
2. The attach response prints JSON to stdout containing `session.sessionKey`. The CLI also persists this key automatically so subsequent `ovld protocol` commands in the same working directory resolve it without `--session-key`. If auto-resolution fails, pass `--session-key <sessionKey>` explicitly on every subsequent call.
|
|
16
16
|
3. Treat the Overlord ticket prompt as authoritative for the objective, constraints, and delivery target.
|
|
17
17
|
4. Post updates while working: `ovld protocol update --session-key <sessionKey> --ticket-id <ticket_id> --summary "..." --phase execute`.
|
|
18
|
-
5. Follow-up messages after the initial ticket are captured automatically by the installed `UserPromptSubmit` hook. Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
18
|
+
5. Follow-up messages after the initial ticket are captured automatically by the installed `UserPromptSubmit` hook and stay in discussion intent while the ticket is in review. Do not post `user_follow_up` manually unless the hook is unavailable.
|
|
19
19
|
6. If blocked, call `ovld protocol ask --session-key <sessionKey> --ticket-id <ticket_id> --question "..."` and stop.
|
|
20
20
|
7. Deliver last with `ovld protocol deliver --session-key <sessionKey> --ticket-id <ticket_id> --summary "..."`, including `changeRationales` for each meaningful behavioral file change.
|
|
21
21
|
|
|
@@ -93,6 +93,10 @@ For the `record-change-rationales` command and full payload shape with optional
|
|
|
93
93
|
- Use `ovld protocol` commands and the plugin's MCP tools instead of ad hoc scripts.
|
|
94
94
|
- Do not invent protocol subcommands. Use `ovld protocol help` when unsure.
|
|
95
95
|
- Include at least one progress update before delivering.
|
|
96
|
+
- After delivery, answer ordinary questions and clarifications in discussion mode; only begin follow-up execution when the user explicitly asks for file or code changes.
|
|
97
|
+
- When explicit follow-up implementation starts on a delivered/review ticket, call `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before code changes or `--phase execute`.
|
|
98
|
+
- During follow-up execution, post progress updates and record change rationales for each file modified, the same as during initial execution.
|
|
99
|
+
- Record important non-file decisions with `--event-type decision` or `--event-type discussion_summary`.
|
|
96
100
|
- The `summary` in deliver is what the PM reads first, so write it as a narrative, not a command list.
|
|
97
101
|
- When a summary or question contains backticks, `$vars`, or other shell-special characters, always use `--summary-file -` (or `--question-file -`) with a single-quoted heredoc (`<<'EOF'`). Never retry by stripping or escaping content — pipe stdin instead. See [reference/shell-escaping.md](reference/shell-escaping.md).
|
|
98
102
|
- Use `write-context` for facts a future agent session should know.
|
|
@@ -100,7 +104,7 @@ For the `record-change-rationales` command and full payload shape with optional
|
|
|
100
104
|
- If you must run `ovld auth login`, `--organization-id <id>` is optional — use it only when you want to set a different default organization than the CLI would choose automatically.
|
|
101
105
|
- Do not add or commit changes unless the user explicitly asks you to commit.
|
|
102
106
|
- Do not create or rely on a local Codex `AGENTS.md` bundle for Overlord.
|
|
103
|
-
- Delivery is the concluding step. After delivering, stop unless the user
|
|
107
|
+
- Delivery is the concluding step. After delivering, stop implementation work unless the user explicitly asks for follow-up execution; once follow-up execution is complete, deliver again.
|
|
104
108
|
|
|
105
109
|
## Reference
|
|
106
110
|
|
|
@@ -110,5 +114,5 @@ For the `record-change-rationales` command and full payload shape with optional
|
|
|
110
114
|
- [reference/context.md](reference/context.md) — Shared state, attachments, and large artifact policy
|
|
111
115
|
- [reference/shell-escaping.md](reference/shell-escaping.md) — Heredoc stdin piping for special characters in summaries and payloads
|
|
112
116
|
|
|
113
|
-
<!-- version: 0.5.
|
|
117
|
+
<!-- version: 0.5.8 -->
|
|
114
118
|
|
|
@@ -31,6 +31,14 @@ Event types:
|
|
|
31
31
|
- `update` for standard progress updates
|
|
32
32
|
- `user_follow_up` — only when the `UserPromptSubmit` hook is unavailable; the hook normally posts follow-ups to the activity feed
|
|
33
33
|
- `alert` for warnings or non-blocking issues
|
|
34
|
+
- `discussion_summary` for important discussion outcomes that should remain visible on the ticket
|
|
35
|
+
- `decision` for explicit non-file decisions made during follow-up discussion
|
|
36
|
+
|
|
37
|
+
Post-delivery follow-up modes:
|
|
38
|
+
|
|
39
|
+
- User follow-up messages default to `discussion` intent while the ticket is in review.
|
|
40
|
+
- Use `ovld protocol update --begin-follow-up-work --follow-up-intent execution --summary "Beginning follow-up work."` before moving a delivered/review ticket back to execution.
|
|
41
|
+
- Use `--follow-up-intent pending_delivery` when implementation is complete but final delivery is still being prepared.
|
|
34
42
|
|
|
35
43
|
## Ask
|
|
36
44
|
|