overlord-cli 4.12.0 → 4.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/_cli/index.mjs +3 -3
- package/bin/_cli/new-ticket.mjs +24 -6
- package/bin/_cli/protocol.mjs +125 -5
- package/bin/_cli/setup.mjs +61 -1
- package/package.json +1 -1
- package/plugins/claude/README.md +2 -2
- package/plugins/claude/commands/create.md +16 -0
- package/plugins/claude/skills/overlord-ticket/SKILL.md +18 -7
- package/plugins/cursor/commands/create.md +9 -0
- package/plugins/cursor/skills/overlord-ticket/SKILL.md +7 -6
- package/plugins/overlord/skills/overlord-ticket/SKILL.md +22 -6
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ Common commands:
|
|
|
30
30
|
```bash
|
|
31
31
|
ovld auth login
|
|
32
32
|
ovld attach
|
|
33
|
-
ovld create "Investigate the failing build"
|
|
33
|
+
ovld create "Investigate the failing build" --agent codex
|
|
34
34
|
ovld prompt "Draft a fix for the onboarding flow"
|
|
35
35
|
ovld update
|
|
36
36
|
ovld protocol discover-project
|
|
@@ -52,7 +52,7 @@ ovld doctor
|
|
|
52
52
|
## Commands
|
|
53
53
|
|
|
54
54
|
- `attach` - search tickets and launch an agent interactively
|
|
55
|
-
- `create` - create a ticket from a short objective
|
|
55
|
+
- `create` - create a ticket from a short objective; supports the same delegate-identifying flags as `ovld protocol create` (`--agent`, `--model`, `--delegate`)
|
|
56
56
|
- `prompt` - create a ticket and launch an agent on it
|
|
57
57
|
- `auth` - log in, log out, or check auth status
|
|
58
58
|
- `tickets` - list or create tickets
|
package/bin/_cli/index.mjs
CHANGED
|
@@ -29,7 +29,7 @@ Primary command: ${primaryCommand}
|
|
|
29
29
|
|
|
30
30
|
Usage:
|
|
31
31
|
${primaryCommand} attach [ticketId] [agent] Search tickets and launch an agent (interactive)
|
|
32
|
-
${primaryCommand} create "<objective>" Create a ticket with numbered project selection
|
|
32
|
+
${primaryCommand} create "<objective>" Create a ticket with numbered project selection; supports --agent/--model/--delegate
|
|
33
33
|
${primaryCommand} prompt "<objective>" Create a ticket, then launch an agent on it
|
|
34
34
|
${primaryCommand} auth <subcommand> Login, logout, repair, or check auth status
|
|
35
35
|
${primaryCommand} tickets <subcommand> Create or list tickets
|
|
@@ -46,7 +46,7 @@ Usage:
|
|
|
46
46
|
|
|
47
47
|
Agents:
|
|
48
48
|
Use ${primaryCommand} protocol help for ticket lifecycle commands.
|
|
49
|
-
Key protocol commands: auth-status, discover-project, spawn, attach, connect, load-context.
|
|
49
|
+
Key protocol commands: auth-status, discover-project, create, spawn, attach, connect, load-context.
|
|
50
50
|
|
|
51
51
|
Auth:
|
|
52
52
|
${primaryCommand} auth login Authorize CLI via browser
|
|
@@ -55,7 +55,7 @@ Auth:
|
|
|
55
55
|
${primaryCommand} auth logout Remove stored credentials
|
|
56
56
|
|
|
57
57
|
Tickets:
|
|
58
|
-
${primaryCommand} create "..." [options]
|
|
58
|
+
${primaryCommand} create "..." [--agent <agent>] [--model <identifier>] [--delegate <agent>] [options]
|
|
59
59
|
${primaryCommand} prompt "..." [options]
|
|
60
60
|
${primaryCommand} tickets create "..." [options]
|
|
61
61
|
${primaryCommand} tickets list [--status <status>]
|
package/bin/_cli/new-ticket.mjs
CHANGED
|
@@ -47,10 +47,10 @@ function parseFlags(args) {
|
|
|
47
47
|
|
|
48
48
|
function buildUsage(commandName) {
|
|
49
49
|
if (commandName === 'prompt') {
|
|
50
|
-
return 'Usage: ovld prompt "<objective>" [--title "..."] [--acceptance-criteria "..."] [--available-tools "..."] [--execution-target agent|human] [--priority low|medium|high|urgent] [--project-id <id>] [--agent <agent>] [--delegate <agent>]';
|
|
50
|
+
return 'Usage: ovld prompt "<objective>" [--title "..."] [--acceptance-criteria "..."] [--available-tools "..."] [--execution-target agent|human] [--priority low|medium|high|urgent] [--project-id <id>] [--agent <agent>] [--model <identifier>] [--delegate <agent>]';
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
return 'Usage: ovld create "<objective>" [--title "..."] [--acceptance-criteria "..."] [--available-tools "..."] [--execution-target agent|human] [--priority low|medium|high|urgent] [--project-id <id>] [--delegate <agent>]';
|
|
53
|
+
return 'Usage: ovld create "<objective>" [--title "..."] [--acceptance-criteria "..."] [--available-tools "..."] [--execution-target agent|human] [--priority low|medium|high|urgent] [--project-id <id>] [--agent <agent>] [--model <identifier>] [--delegate <agent>]';
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
function ensureObjective(commandName, objective) {
|
|
@@ -192,10 +192,27 @@ export function resolvePromptAgentIdentifier(agent) {
|
|
|
192
192
|
return PROMPT_AGENT_IDENTIFIERS[agent] ?? agent;
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
-
export function
|
|
195
|
+
export function resolveTicketCreationModelIdentifier(flags = {}) {
|
|
196
|
+
const explicitModel = typeof flags.model === 'string' ? flags.model.trim() : '';
|
|
197
|
+
if (explicitModel) return explicitModel;
|
|
198
|
+
|
|
199
|
+
const envModel =
|
|
200
|
+
process.env.OVERLORD_MODEL_IDENTIFIER?.trim() ||
|
|
201
|
+
process.env.MODEL_IDENTIFIER?.trim() ||
|
|
202
|
+
process.env.AGENT_MODEL?.trim();
|
|
203
|
+
return envModel || null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export function resolveTicketCreationDelegate(flags = {}, selectedAgent = null, modelIdentifier = '') {
|
|
196
207
|
const explicitDelegate = typeof flags.delegate === 'string' ? flags.delegate.trim() : '';
|
|
197
208
|
if (explicitDelegate) return explicitDelegate;
|
|
198
209
|
|
|
210
|
+
const resolvedModel = typeof modelIdentifier === 'string' ? modelIdentifier.trim() : '';
|
|
211
|
+
if (resolvedModel) return resolvedModel;
|
|
212
|
+
|
|
213
|
+
const explicitAgent = typeof flags.agent === 'string' ? flags.agent.trim() : '';
|
|
214
|
+
if (explicitAgent) return resolvePromptAgentIdentifier(explicitAgent.toLowerCase()) ?? explicitAgent;
|
|
215
|
+
|
|
199
216
|
if (selectedAgent) return resolvePromptAgentIdentifier(selectedAgent);
|
|
200
217
|
|
|
201
218
|
const envAgent = process.env.AGENT_IDENTIFIER?.trim();
|
|
@@ -233,7 +250,8 @@ async function runTicketCreationFlow(args, { commandName, launchAgent }) {
|
|
|
233
250
|
})))
|
|
234
251
|
: null;
|
|
235
252
|
|
|
236
|
-
const
|
|
253
|
+
const modelIdentifier = resolveTicketCreationModelIdentifier(flags);
|
|
254
|
+
const ticketDelegate = resolveTicketCreationDelegate(flags, selectedAgent, modelIdentifier);
|
|
237
255
|
|
|
238
256
|
const ticket = await createTicket(platformUrl, agentToken, localSecret, {
|
|
239
257
|
objective,
|
|
@@ -262,7 +280,7 @@ export async function runCreateCommand(args) {
|
|
|
262
280
|
Creates a ticket after interactive numbered project selection.
|
|
263
281
|
|
|
264
282
|
Examples:
|
|
265
|
-
ovld create "Implement login page"
|
|
283
|
+
ovld create "Implement login page" --agent codex
|
|
266
284
|
ovld create "Fix sync bug" --project-id <project-id>
|
|
267
285
|
`);
|
|
268
286
|
return;
|
|
@@ -279,7 +297,7 @@ Creates a ticket after interactive numbered project selection, then lets you pic
|
|
|
279
297
|
|
|
280
298
|
Examples:
|
|
281
299
|
ovld prompt "Implement login page"
|
|
282
|
-
ovld prompt "Investigate flaky tests" --agent codex
|
|
300
|
+
ovld prompt "Investigate flaky tests" --agent codex --model gpt-5.4
|
|
283
301
|
`);
|
|
284
302
|
return;
|
|
285
303
|
}
|
package/bin/_cli/protocol.mjs
CHANGED
|
@@ -43,10 +43,13 @@ export function resolveProtocolAgentIdentifier(flags = {}) {
|
|
|
43
43
|
return envAgent || 'claude-code';
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
export function resolveProtocolTicketDelegate(flags = {}, agentIdentifier = '') {
|
|
46
|
+
export function resolveProtocolTicketDelegate(flags = {}, modelIdentifier = '', agentIdentifier = '') {
|
|
47
47
|
const explicitDelegate = typeof flags.delegate === 'string' ? flags.delegate.trim() : '';
|
|
48
48
|
if (explicitDelegate) return explicitDelegate;
|
|
49
49
|
|
|
50
|
+
const resolvedModel = typeof modelIdentifier === 'string' ? modelIdentifier.trim() : '';
|
|
51
|
+
if (resolvedModel) return resolvedModel;
|
|
52
|
+
|
|
50
53
|
const resolvedAgent = String(agentIdentifier).trim();
|
|
51
54
|
return resolvedAgent || null;
|
|
52
55
|
}
|
|
@@ -1039,6 +1042,7 @@ async function protocolSpawn(args) {
|
|
|
1039
1042
|
const { platformUrl, agentToken, localSecret } = resolveAuth();
|
|
1040
1043
|
const timeoutMs = resolveTimeout(flags);
|
|
1041
1044
|
const agentIdentifier = resolveProtocolAgentIdentifier(flags);
|
|
1045
|
+
const modelIdentifier = resolveProtocolModelIdentifier(flags);
|
|
1042
1046
|
|
|
1043
1047
|
// When --project-id is not provided, auto-send cwd as workingDirectory
|
|
1044
1048
|
// so the server can resolve the project from the local_working_directory setting.
|
|
@@ -1056,7 +1060,7 @@ async function protocolSpawn(args) {
|
|
|
1056
1060
|
...(flags['acceptance-criteria'] ? { acceptanceCriteria: String(flags['acceptance-criteria']) } : {}),
|
|
1057
1061
|
...(flags['available-tools'] ? { availableTools: String(flags['available-tools']) } : {}),
|
|
1058
1062
|
...(flags['execution-target'] ? { executionTarget: String(flags['execution-target']) } : {}),
|
|
1059
|
-
delegate: resolveProtocolTicketDelegate(flags, agentIdentifier),
|
|
1063
|
+
delegate: resolveProtocolTicketDelegate(flags, modelIdentifier, agentIdentifier),
|
|
1060
1064
|
...(flags['parent-session-key'] ? { parentSessionKey: String(flags['parent-session-key']) } : {}),
|
|
1061
1065
|
...(flags['parent-ticket-id'] ? { parentTicketId: String(flags['parent-ticket-id'] ?? process.env.TICKET_ID ?? '') } : {})
|
|
1062
1066
|
};
|
|
@@ -1082,6 +1086,93 @@ async function protocolSpawn(args) {
|
|
|
1082
1086
|
}
|
|
1083
1087
|
}
|
|
1084
1088
|
|
|
1089
|
+
// ---------------------------------------------------------------------------
|
|
1090
|
+
// create (create follow-up ticket draft only)
|
|
1091
|
+
// ---------------------------------------------------------------------------
|
|
1092
|
+
|
|
1093
|
+
async function protocolCreateTicket(args) {
|
|
1094
|
+
const flags = parseFlags(args);
|
|
1095
|
+
const { sessionKey, ticketId } = resolveSessionFlags(flags);
|
|
1096
|
+
const objective = requireFlag(flags, 'objective', undefined);
|
|
1097
|
+
const { platformUrl, agentToken, localSecret } = resolveAuth();
|
|
1098
|
+
const timeoutMs = resolveTimeout(flags);
|
|
1099
|
+
const agentIdentifier = resolveProtocolAgentIdentifier(flags);
|
|
1100
|
+
const modelIdentifier = resolveProtocolModelIdentifier(flags);
|
|
1101
|
+
|
|
1102
|
+
const hasSessionContext = Boolean(sessionKey && ticketId);
|
|
1103
|
+
|
|
1104
|
+
// Follow-up mode: create a draft ticket linked to the current session ticket.
|
|
1105
|
+
if (hasSessionContext) {
|
|
1106
|
+
const body = {
|
|
1107
|
+
sessionKey,
|
|
1108
|
+
ticketId,
|
|
1109
|
+
objective,
|
|
1110
|
+
...(flags.title ? { title: String(flags.title) } : {}),
|
|
1111
|
+
...(flags.priority ? { priority: String(flags.priority) } : {}),
|
|
1112
|
+
...(flags['acceptance-criteria'] ? { acceptanceCriteria: String(flags['acceptance-criteria']) } : {}),
|
|
1113
|
+
...(flags['available-tools'] ? { availableTools: String(flags['available-tools']) } : {}),
|
|
1114
|
+
...(flags['execution-target'] ? { executionTarget: String(flags['execution-target']) } : {}),
|
|
1115
|
+
delegate: resolveProtocolTicketDelegate(flags, modelIdentifier, agentIdentifier)
|
|
1116
|
+
};
|
|
1117
|
+
|
|
1118
|
+
const data = await apiPost(
|
|
1119
|
+
platformUrl,
|
|
1120
|
+
agentToken,
|
|
1121
|
+
localSecret,
|
|
1122
|
+
'/api/protocol/create-ticket',
|
|
1123
|
+
body,
|
|
1124
|
+
timeoutMs
|
|
1125
|
+
);
|
|
1126
|
+
console.log(JSON.stringify(data, null, 2));
|
|
1127
|
+
return;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
// Standalone mode: resolve project from cwd/--working-directory first, then create draft ticket.
|
|
1131
|
+
if (sessionKey || ticketId) {
|
|
1132
|
+
throw new Error(
|
|
1133
|
+
'Provide both --session-key and --ticket-id for follow-up create, or provide neither for standalone create.'
|
|
1134
|
+
);
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
const workingDirectory = String(flags['working-directory'] ?? process.cwd());
|
|
1138
|
+
const discovered = await apiPost(
|
|
1139
|
+
platformUrl,
|
|
1140
|
+
agentToken,
|
|
1141
|
+
localSecret,
|
|
1142
|
+
'/api/protocol/discover-project',
|
|
1143
|
+
{ workingDirectory },
|
|
1144
|
+
timeoutMs
|
|
1145
|
+
);
|
|
1146
|
+
|
|
1147
|
+
const projectId = discovered?.project?.id;
|
|
1148
|
+
if (!projectId) {
|
|
1149
|
+
throw new Error(
|
|
1150
|
+
'Could not resolve project from working directory. Set project local working directory in Overlord or pass --working-directory.'
|
|
1151
|
+
);
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
const standaloneBody = {
|
|
1155
|
+
objective,
|
|
1156
|
+
projectId,
|
|
1157
|
+
...(flags.title ? { title: String(flags.title) } : {}),
|
|
1158
|
+
...(flags.priority ? { priority: String(flags.priority) } : {}),
|
|
1159
|
+
...(flags['acceptance-criteria'] ? { acceptanceCriteria: String(flags['acceptance-criteria']) } : {}),
|
|
1160
|
+
...(flags['available-tools'] ? { availableTools: String(flags['available-tools']) } : {}),
|
|
1161
|
+
...(flags['execution-target'] ? { executionTarget: String(flags['execution-target']) } : {}),
|
|
1162
|
+
delegate: resolveProtocolTicketDelegate(flags, modelIdentifier, agentIdentifier)
|
|
1163
|
+
};
|
|
1164
|
+
|
|
1165
|
+
const data = await apiPost(
|
|
1166
|
+
platformUrl,
|
|
1167
|
+
agentToken,
|
|
1168
|
+
localSecret,
|
|
1169
|
+
'/api/protocol/tickets',
|
|
1170
|
+
standaloneBody,
|
|
1171
|
+
timeoutMs
|
|
1172
|
+
);
|
|
1173
|
+
console.log(JSON.stringify(data, null, 2));
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1085
1176
|
// ---------------------------------------------------------------------------
|
|
1086
1177
|
// auth-status (agent-friendly auth diagnostics)
|
|
1087
1178
|
// ---------------------------------------------------------------------------
|
|
@@ -1118,9 +1209,9 @@ export async function runProtocolCommand(subcommand, args) {
|
|
|
1118
1209
|
if (!subcommand || subcommand === 'help' || subcommand === '--help') {
|
|
1119
1210
|
console.log(`ovld protocol <subcommand> [flags]
|
|
1120
1211
|
|
|
1121
|
-
Use this for
|
|
1122
|
-
|
|
1123
|
-
\`ovld protocol
|
|
1212
|
+
Use this for ticket lifecycle work from an agent runtime: create a standalone
|
|
1213
|
+
draft with \`ovld protocol create\`, create-and-attach with \`ovld protocol spawn\`,
|
|
1214
|
+
or attach to an existing ticket with \`ovld protocol attach --ticket-id <id>\`.
|
|
1124
1215
|
|
|
1125
1216
|
Project discovery:
|
|
1126
1217
|
When spawning or creating tickets, the CLI automatically resolves the correct
|
|
@@ -1139,6 +1230,7 @@ Subcommands:
|
|
|
1139
1230
|
attach Start a ticket session and return full working context
|
|
1140
1231
|
connect Start a lightweight session without full context
|
|
1141
1232
|
load-context Read ticket context without creating a session
|
|
1233
|
+
create Create a draft ticket without attaching (follow-up or standalone)
|
|
1142
1234
|
spawn Create a follow-up ticket and attach to it immediately
|
|
1143
1235
|
update Post progress, activity events, and optional change rationales
|
|
1144
1236
|
record-change-rationales Persist structured change rationales without a progress update
|
|
@@ -1335,6 +1427,31 @@ spawn:
|
|
|
1335
1427
|
Returns:
|
|
1336
1428
|
New ticket/session JSON plus SESSION_KEY and TICKET_ID on stderr when available
|
|
1337
1429
|
|
|
1430
|
+
create:
|
|
1431
|
+
Purpose:
|
|
1432
|
+
Create a draft ticket without attaching to it.
|
|
1433
|
+
If session flags are provided, creates a follow-up draft linked to the current ticket.
|
|
1434
|
+
If session flags are omitted, resolves project by working directory and creates a standalone draft.
|
|
1435
|
+
Required:
|
|
1436
|
+
--objective <text>
|
|
1437
|
+
Optional:
|
|
1438
|
+
--session-key <key>
|
|
1439
|
+
--ticket-id <id>
|
|
1440
|
+
--working-directory <path> Resolve project by local working directory (default: cwd)
|
|
1441
|
+
--title <text>
|
|
1442
|
+
--priority <level> low | medium | high | urgent
|
|
1443
|
+
--acceptance-criteria <text>
|
|
1444
|
+
--available-tools <text>
|
|
1445
|
+
--execution-target <t> agent | human
|
|
1446
|
+
--delegate <model> Model or delegate identifier that created the ticket
|
|
1447
|
+
--agent <identifier>
|
|
1448
|
+
--model <identifier>
|
|
1449
|
+
Returns:
|
|
1450
|
+
New draft ticket JSON (follow-up draft when session flags are provided)
|
|
1451
|
+
Notes:
|
|
1452
|
+
Standalone create auto-discovers the project from the current working directory.
|
|
1453
|
+
Follow-up create requires both --session-key and --ticket-id.
|
|
1454
|
+
|
|
1338
1455
|
artifact-prepare-upload:
|
|
1339
1456
|
Required:
|
|
1340
1457
|
--session-key <key>
|
|
@@ -1388,6 +1505,8 @@ Examples:
|
|
|
1388
1505
|
ovld protocol attach --ticket-id abc-123 --external-session-id null
|
|
1389
1506
|
ovld protocol connect --ticket-id abc-123
|
|
1390
1507
|
ovld protocol load-context --ticket-id abc-123
|
|
1508
|
+
ovld protocol create --agent codex --objective "Capture follow-up work from this repo"
|
|
1509
|
+
ovld protocol create --agent codex --session-key <key> --ticket-id <id> --objective "Capture follow-up work"
|
|
1391
1510
|
ovld protocol spawn --agent codex --objective "Implement user auth" --priority high
|
|
1392
1511
|
ovld protocol update --session-key <key> --ticket-id <id> --summary "Did X" --phase execute
|
|
1393
1512
|
ovld protocol update --session-key <key> --ticket-id <id> --summary-file ./update.txt --event-type user_follow_up
|
|
@@ -1413,6 +1532,7 @@ Examples:
|
|
|
1413
1532
|
if (subcommand === 'attach') { await protocolAttach(args); return; }
|
|
1414
1533
|
if (subcommand === 'connect') { await protocolConnect(args); return; }
|
|
1415
1534
|
if (subcommand === 'load-context') { await protocolLoadContext(args); return; }
|
|
1535
|
+
if (subcommand === 'create' || subcommand === 'create-ticket') { await protocolCreateTicket(args); return; }
|
|
1416
1536
|
if (subcommand === 'spawn') { await protocolSpawn(args); return; }
|
|
1417
1537
|
if (subcommand === 'artifact-prepare-upload') { await protocolArtifactPrepareUpload(args); return; }
|
|
1418
1538
|
if (subcommand === 'artifact-finalize-upload') { await protocolArtifactFinalizeUpload(args); return; }
|
package/bin/_cli/setup.mjs
CHANGED
|
@@ -14,7 +14,7 @@ import path from 'node:path';
|
|
|
14
14
|
import { fileURLToPath } from 'node:url';
|
|
15
15
|
import { checkForCliUpdate, getCurrentCliVersion, printCliUpdateNotice } from './cli-update.mjs';
|
|
16
16
|
|
|
17
|
-
const BUNDLE_VERSION = '1.
|
|
17
|
+
const BUNDLE_VERSION = '1.9.0';
|
|
18
18
|
const MD_MARKER_START = '<!-- overlord:managed:start -->';
|
|
19
19
|
const MD_MARKER_END = '<!-- overlord:managed:end -->';
|
|
20
20
|
const MANIFEST_DIR = path.join(os.homedir(), '.ovld');
|
|
@@ -110,6 +110,21 @@ ovld protocol record-change-rationales --session-key <sessionKey> --ticket-id $T
|
|
|
110
110
|
|
|
111
111
|
Record only meaningful behavioral changes — skip formatting-only noise. Prefer 1–5 concise rationales per ticket, each tied to a specific file and diff hunk.
|
|
112
112
|
|
|
113
|
+
## Project Discovery & Ticket Creation
|
|
114
|
+
|
|
115
|
+
When creating tickets from within a repository:
|
|
116
|
+
- Prefer \`ovld protocol create --agent claude-code\` by default for draft ticket creation.
|
|
117
|
+
- Use \`ovld protocol spawn --agent claude-code\` only when the user explicitly asks to create and execute immediately.
|
|
118
|
+
- Both commands can resolve the project from the current working directory; use \`--working-directory\` to override.
|
|
119
|
+
|
|
120
|
+
\`\`\`bash
|
|
121
|
+
ovld protocol create --agent claude-code --objective "Capture follow-up work from this repository"
|
|
122
|
+
\`\`\`
|
|
123
|
+
|
|
124
|
+
\`\`\`bash
|
|
125
|
+
ovld protocol spawn --agent claude-code --objective "Implement feature X" --priority medium
|
|
126
|
+
\`\`\`
|
|
127
|
+
|
|
113
128
|
## Context & Artifacts
|
|
114
129
|
|
|
115
130
|
\`\`\`bash
|
|
@@ -174,6 +189,21 @@ ovld protocol record-change-rationales --session-key <sessionKey> --ticket-id $T
|
|
|
174
189
|
--change-rationales-json '[{"label":"Add backoff","file_path":"lib/api.ts","summary":"Added retry.","why":"Transient failures.","impact":"Retries 3x.","hunks":[{"header":"@@ -22,4 +22,18 @@"}]}]'
|
|
175
190
|
\`\`\`
|
|
176
191
|
|
|
192
|
+
## Project Discovery & Ticket Creation
|
|
193
|
+
|
|
194
|
+
When creating tickets from within a repository:
|
|
195
|
+
- Prefer \`ovld protocol create --agent opencode\` by default for draft ticket creation.
|
|
196
|
+
- Use \`ovld protocol spawn --agent opencode\` only when the user explicitly asks to create and execute immediately.
|
|
197
|
+
- Both commands can resolve the project from the current working directory; use \`--working-directory\` to override.
|
|
198
|
+
|
|
199
|
+
\`\`\`bash
|
|
200
|
+
ovld protocol create --agent opencode --objective "Capture follow-up work from this repository"
|
|
201
|
+
\`\`\`
|
|
202
|
+
|
|
203
|
+
\`\`\`bash
|
|
204
|
+
ovld protocol spawn --agent opencode --objective "Implement feature X" --priority medium
|
|
205
|
+
\`\`\`
|
|
206
|
+
|
|
177
207
|
## Context & Artifacts
|
|
178
208
|
|
|
179
209
|
\`\`\`bash
|
|
@@ -236,6 +266,7 @@ For larger delivery JSON, prefer \`--payload-file -\` with stdin so no scratch f
|
|
|
236
266
|
Rules:
|
|
237
267
|
- Always attach first and deliver last.
|
|
238
268
|
- Use \`ovld protocol\` commands instead of ad hoc repo scripts for ticket lifecycle work.
|
|
269
|
+
- Prefer \`ovld protocol create --agent cursor\` for draft ticket creation; use \`spawn --agent cursor\` only for create-and-execute requests.
|
|
239
270
|
- If the user sends a new message during an active ticket session, publish a \`user_follow_up\` event before doing anything else.
|
|
240
271
|
`;
|
|
241
272
|
|
|
@@ -356,6 +387,16 @@ disable-model-invocation: true
|
|
|
356
387
|
---
|
|
357
388
|
|
|
358
389
|
Run \`ovld protocol load-context --ticket-id <ticketId>\` using \`$ARGUMENTS\` as the ticket ID.`
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
path: path.join(base, 'create.md'),
|
|
393
|
+
content: `---
|
|
394
|
+
description: Create a draft Overlord ticket from the current conversation
|
|
395
|
+
argument-hint: <objective or raw flags>
|
|
396
|
+
disable-model-invocation: true
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
Run \`ovld protocol create --agent claude-code\` with \`$ARGUMENTS\`. If no flags are present, treat the arguments as the objective and call \`ovld protocol create --agent claude-code --objective "<objective>"\`.`
|
|
359
400
|
},
|
|
360
401
|
{
|
|
361
402
|
path: path.join(base, 'spawn.md'),
|
|
@@ -383,6 +424,11 @@ Run \`ovld protocol spawn --agent claude-code\` with \`$ARGUMENTS\`. If no flags
|
|
|
383
424
|
content:
|
|
384
425
|
'Load Overlord ticket context without attaching.\n\nRun `ovld protocol load-context --ticket-id <ticketId>` using the text after `/load` as the ticket ID.\n'
|
|
385
426
|
},
|
|
427
|
+
{
|
|
428
|
+
path: path.join(base, 'create.md'),
|
|
429
|
+
content:
|
|
430
|
+
'Create a draft Overlord ticket.\n\nRun `ovld protocol create --agent cursor --objective "<objective>"` using the text after `/create` unless raw flags were provided. If raw flags were provided, pass them after `ovld protocol create --agent cursor`.\n'
|
|
431
|
+
},
|
|
386
432
|
{
|
|
387
433
|
path: path.join(base, 'spawn.md'),
|
|
388
434
|
content:
|
|
@@ -404,6 +450,11 @@ Run \`ovld protocol spawn --agent claude-code\` with \`$ARGUMENTS\`. If no flags
|
|
|
404
450
|
content:
|
|
405
451
|
'description = "Load Overlord ticket context without creating a new session."\nprompt = """\nRun `ovld protocol load-context --ticket-id <ticketId>` using `{{args}}` as the ticket ID.\n"""\n'
|
|
406
452
|
},
|
|
453
|
+
{
|
|
454
|
+
path: path.join(base, 'create.toml'),
|
|
455
|
+
content:
|
|
456
|
+
'description = "Create a draft Overlord ticket from the current conversation."\nprompt = """\nRun `ovld protocol create --agent gemini --objective "<objective>"` using `{{args}}` as the objective unless raw flags were provided. If raw flags were provided, pass them after `ovld protocol create --agent gemini`.\n"""\n'
|
|
457
|
+
},
|
|
407
458
|
{
|
|
408
459
|
path: path.join(base, 'spawn.toml'),
|
|
409
460
|
content:
|
|
@@ -431,6 +482,15 @@ agent: build
|
|
|
431
482
|
---
|
|
432
483
|
|
|
433
484
|
Run \`ovld protocol load-context --ticket-id <ticketId>\` using \`$ARGUMENTS\` as the ticket ID. If no ticket ID was provided, ask the user for one and stop.`
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
path: path.join(base, 'create.md'),
|
|
488
|
+
content: `---
|
|
489
|
+
description: Create a draft Overlord ticket from the current conversation
|
|
490
|
+
agent: build
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
Run \`ovld protocol create --agent opencode\` with \`$ARGUMENTS\`. If no flags are present, treat the arguments as the objective and call \`ovld protocol create --agent opencode --objective "<objective>"\`.`
|
|
434
494
|
},
|
|
435
495
|
{
|
|
436
496
|
path: path.join(base, 'spawn.md'),
|
package/package.json
CHANGED
package/plugins/claude/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Claude Code plugin that exposes the Overlord local ticket workflow to any Claude
|
|
|
5
5
|
## What ships
|
|
6
6
|
|
|
7
7
|
- `skills/overlord-ticket/SKILL.md` — durable attach → update → ask → deliver workflow.
|
|
8
|
-
- `commands/{connect,load,spawn}.md` — slash commands for session routing and ticket creation.
|
|
8
|
+
- `commands/{connect,load,create,spawn}.md` — slash commands for session routing and ticket creation.
|
|
9
9
|
- `hooks/hooks.json` + `scripts/permission-hook.sh` — PermissionRequest notifier that calls `ovld protocol permission-request`.
|
|
10
10
|
- `userConfig` for legacy `overlord_url` and `agent_token` installs. Current installs should authenticate with `ovld auth login` or Overlord Desktop; env vars remain optional overrides for remote shells, CI, and explicit token injection.
|
|
11
11
|
|
|
@@ -36,6 +36,6 @@ Older plugin versions prompted for `overlord_url` and `agent_token` at install t
|
|
|
36
36
|
Inside Claude Code the components are surfaced with the plugin prefix:
|
|
37
37
|
|
|
38
38
|
- skill → `overlord:overlord-ticket`
|
|
39
|
-
- commands → `/overlord:connect`, `/overlord:load`, `/overlord:spawn`
|
|
39
|
+
- commands → `/overlord:connect`, `/overlord:load`, `/overlord:create`, `/overlord:spawn`
|
|
40
40
|
|
|
41
41
|
Prompts generated by Overlord (see `lib/overlord/ticket-prompt.ts`) already reference these names in `bundle` instruction mode.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Create a draft Overlord ticket from the current conversation
|
|
3
|
+
argument-hint: <objective or raw flags>
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Create a draft Overlord ticket from the user's request.
|
|
8
|
+
|
|
9
|
+
Use `$ARGUMENTS` as the input.
|
|
10
|
+
If it already contains flags such as `--title`, `--priority`, `--project-id`, or `--execution-target`, pass those flags through after `ovld protocol create --agent claude-code`.
|
|
11
|
+
Otherwise, treat `$ARGUMENTS` as the objective text and run:
|
|
12
|
+
`ovld protocol create --agent claude-code --objective "<objective>"`
|
|
13
|
+
|
|
14
|
+
If no objective was provided, ask the user for one and stop.
|
|
15
|
+
|
|
16
|
+
After the command succeeds, report the new `TICKET_ID`.
|
|
@@ -71,12 +71,16 @@ For larger delivery payloads, prefer `--payload-file -` and stream the full JSON
|
|
|
71
71
|
|
|
72
72
|
Use this mode when the conversation starts normally and the user asks Claude to create, inspect, connect to, or otherwise use Overlord.
|
|
73
73
|
|
|
74
|
-
1. If the user wants
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
1. If the user wants to create tickets (and does not ask to start execution), run `ovld protocol create --agent claude-code --objective "..."`.
|
|
75
|
+
- When `--session-key` and `--ticket-id` are provided, it creates a follow-up draft.
|
|
76
|
+
- When session flags are omitted, it resolves the project by matching current working directory (or `--working-directory`) to Overlord `local_working_directory`, then creates a standalone draft.
|
|
77
|
+
2. Default to `create` for new tickets. Only use `/overlord:spawn` or `ovld protocol spawn --agent claude-code --objective "..."` when the user explicitly asks to create and execute immediately.
|
|
78
|
+
`spawn` creates the ticket in `execute` status and attaches immediately.
|
|
79
|
+
3. If the user already has a ticket ID and only wants to inspect it, use `/overlord:load` or run `ovld protocol load-context --ticket-id <ticket-id>`.
|
|
80
|
+
4. If the user wants to route the current session onto an existing ticket by ID, use `/overlord:connect` or run `ovld protocol connect --ticket-id <ticket-id>`.
|
|
81
|
+
5. If the user wants to find a ticket but does not know the ID, use `ovld attach` for interactive ticket search and agent launch, or ask the user for the ticket ID if staying strictly inside chat is the better fit.
|
|
82
|
+
6. If you need other lifecycle commands or flags, run `ovld protocol help` and use the real subcommand list instead of guessing.
|
|
83
|
+
7. Once you attach to a ticket, switch back to Mode 1 and follow the full ticket lifecycle.
|
|
80
84
|
|
|
81
85
|
## Change Rationales
|
|
82
86
|
|
|
@@ -102,7 +106,14 @@ Record only meaningful behavioral changes. Skip formatting-only noise.
|
|
|
102
106
|
|
|
103
107
|
## Project Discovery And Ticket Creation
|
|
104
108
|
|
|
105
|
-
When creating tickets from within a repository
|
|
109
|
+
When creating tickets from within a repository:
|
|
110
|
+
- Prefer `create` by default for draft ticket creation.
|
|
111
|
+
- Use `spawn` only when the user explicitly asks to start execution immediately.
|
|
112
|
+
- Both commands can resolve the project from the current working directory; use `--working-directory` to override.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
ovld protocol create --agent claude-code --objective "Capture follow-up work from this repository"
|
|
116
|
+
```
|
|
106
117
|
|
|
107
118
|
```bash
|
|
108
119
|
ovld protocol spawn --agent claude-code --objective "Implement feature X" --priority medium
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Create a draft Overlord ticket.
|
|
2
|
+
|
|
3
|
+
Use the text after `/create` as the objective unless raw flags are present.
|
|
4
|
+
|
|
5
|
+
Run:
|
|
6
|
+
`ovld protocol create --agent cursor --objective "<objective>"`
|
|
7
|
+
|
|
8
|
+
If raw flags are present, pass them through after:
|
|
9
|
+
`ovld protocol create --agent cursor`
|
|
@@ -19,12 +19,13 @@ Use this skill whenever Cursor needs to work with Overlord, whether the session
|
|
|
19
19
|
|
|
20
20
|
## Mode 2: Asked From Chat To Use Overlord
|
|
21
21
|
|
|
22
|
-
1. If the user wants
|
|
23
|
-
2.
|
|
24
|
-
3. If the user
|
|
25
|
-
4. If the user wants to
|
|
26
|
-
5. If
|
|
27
|
-
6.
|
|
22
|
+
1. If the user wants to create tickets (and does not ask to start execution), use `/create` or run `ovld protocol create --agent cursor --objective "..."`.
|
|
23
|
+
2. Default to `create` for new tickets. Only use `/spawn` or `ovld protocol spawn --agent cursor --objective "..."` when the user explicitly asks to create and execute immediately.
|
|
24
|
+
3. If the user already has a ticket ID and only wants to inspect it, use `/load` or run `ovld protocol load-context --ticket-id <ticket-id>`.
|
|
25
|
+
4. If the user wants to route the current session onto an existing ticket by ID, use `/connect` or run `ovld protocol connect --ticket-id <ticket-id>`.
|
|
26
|
+
5. If the user wants to search for tickets by keyword or status, use the `search_tickets` MCP tool.
|
|
27
|
+
6. If you need other lifecycle commands or flags, run `ovld protocol help` and use the real subcommand list instead of guessing.
|
|
28
|
+
7. Once you attach to a ticket, switch back to Mode 1 and follow the full ticket lifecycle.
|
|
28
29
|
|
|
29
30
|
## Rules
|
|
30
31
|
|
|
@@ -67,12 +67,13 @@ For larger delivery payloads, prefer `--payload-file -` and stream the full JSON
|
|
|
67
67
|
|
|
68
68
|
## Mode 2: Asked From Chat To Use Overlord
|
|
69
69
|
|
|
70
|
-
1. If the user wants
|
|
71
|
-
2.
|
|
72
|
-
3. If the user wants to
|
|
73
|
-
4. If the user wants to
|
|
74
|
-
5. If
|
|
75
|
-
6. If you need
|
|
70
|
+
1. If the user wants to create tickets (and does not ask to start execution), run `ovld protocol create --agent codex --objective "..."`.
|
|
71
|
+
2. Default to `create` for new tickets. Only use `ovld protocol spawn --agent codex --objective "..."` when the user explicitly asks to create and execute immediately.
|
|
72
|
+
3. If the user wants to inspect an existing ticket without starting work, use `ovld protocol load-context --ticket-id <ticket-id>`.
|
|
73
|
+
4. If the user wants to work an existing ticket, attach with `ovld protocol attach --ticket-id <ticket-id>` and then switch to Mode 1.
|
|
74
|
+
5. If the user wants to find existing tickets by keyword or workflow state, use the `search_tickets` tool.
|
|
75
|
+
6. If you need to understand project routing before spawning, use `ovld protocol discover-project`.
|
|
76
|
+
7. If you need other lifecycle commands or flags, run `ovld protocol help` and use the real subcommand list instead of guessing.
|
|
76
77
|
|
|
77
78
|
## Change Rationales
|
|
78
79
|
|
|
@@ -105,6 +106,21 @@ ovld protocol artifact-upload-file --session-key <sessionKey> --ticket-id $TICKE
|
|
|
105
106
|
ovld protocol artifact-download-url --session-key <sessionKey> --ticket-id $TICKET_ID --artifact-id <artifact-id>
|
|
106
107
|
```
|
|
107
108
|
|
|
109
|
+
## Project Discovery And Ticket Creation
|
|
110
|
+
|
|
111
|
+
When creating tickets from within a repository:
|
|
112
|
+
- Prefer `create` by default for draft ticket creation.
|
|
113
|
+
- Use `spawn` only when the user explicitly asks to start execution immediately.
|
|
114
|
+
- Both commands can resolve the project from the current working directory; use `--working-directory` to override.
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
ovld protocol create --agent codex --objective "Capture follow-up work from this repository"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
ovld protocol spawn --agent codex --objective "Implement feature X" --priority medium
|
|
122
|
+
```
|
|
123
|
+
|
|
108
124
|
## Rules
|
|
109
125
|
|
|
110
126
|
- The authoritative lifecycle is the `ovld protocol` CLI once you are on a ticket.
|