overlord-cli 4.13.0 → 4.15.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 +28 -18
- 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 +11 -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,9 +1042,11 @@ 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
|
-
// When --project-id is not provided, auto-send cwd as workingDirectory
|
|
1044
|
-
//
|
|
1047
|
+
// When --project-id is not provided, auto-send cwd as workingDirectory so
|
|
1048
|
+
// the server can resolve the project from the caller's project_user
|
|
1049
|
+
// local_working_directory setting.
|
|
1045
1050
|
const workingDirectory = flags['working-directory'] ?? (!flags['project-id'] ? process.cwd() : undefined);
|
|
1046
1051
|
|
|
1047
1052
|
const body = {
|
|
@@ -1056,7 +1061,7 @@ async function protocolSpawn(args) {
|
|
|
1056
1061
|
...(flags['acceptance-criteria'] ? { acceptanceCriteria: String(flags['acceptance-criteria']) } : {}),
|
|
1057
1062
|
...(flags['available-tools'] ? { availableTools: String(flags['available-tools']) } : {}),
|
|
1058
1063
|
...(flags['execution-target'] ? { executionTarget: String(flags['execution-target']) } : {}),
|
|
1059
|
-
delegate: resolveProtocolTicketDelegate(flags, agentIdentifier),
|
|
1064
|
+
delegate: resolveProtocolTicketDelegate(flags, modelIdentifier, agentIdentifier),
|
|
1060
1065
|
...(flags['parent-session-key'] ? { parentSessionKey: String(flags['parent-session-key']) } : {}),
|
|
1061
1066
|
...(flags['parent-ticket-id'] ? { parentTicketId: String(flags['parent-ticket-id'] ?? process.env.TICKET_ID ?? '') } : {})
|
|
1062
1067
|
};
|
|
@@ -1093,6 +1098,7 @@ async function protocolCreateTicket(args) {
|
|
|
1093
1098
|
const { platformUrl, agentToken, localSecret } = resolveAuth();
|
|
1094
1099
|
const timeoutMs = resolveTimeout(flags);
|
|
1095
1100
|
const agentIdentifier = resolveProtocolAgentIdentifier(flags);
|
|
1101
|
+
const modelIdentifier = resolveProtocolModelIdentifier(flags);
|
|
1096
1102
|
|
|
1097
1103
|
const hasSessionContext = Boolean(sessionKey && ticketId);
|
|
1098
1104
|
|
|
@@ -1107,7 +1113,7 @@ async function protocolCreateTicket(args) {
|
|
|
1107
1113
|
...(flags['acceptance-criteria'] ? { acceptanceCriteria: String(flags['acceptance-criteria']) } : {}),
|
|
1108
1114
|
...(flags['available-tools'] ? { availableTools: String(flags['available-tools']) } : {}),
|
|
1109
1115
|
...(flags['execution-target'] ? { executionTarget: String(flags['execution-target']) } : {}),
|
|
1110
|
-
delegate: resolveProtocolTicketDelegate(flags, agentIdentifier)
|
|
1116
|
+
delegate: resolveProtocolTicketDelegate(flags, modelIdentifier, agentIdentifier)
|
|
1111
1117
|
};
|
|
1112
1118
|
|
|
1113
1119
|
const data = await apiPost(
|
|
@@ -1142,7 +1148,7 @@ async function protocolCreateTicket(args) {
|
|
|
1142
1148
|
const projectId = discovered?.project?.id;
|
|
1143
1149
|
if (!projectId) {
|
|
1144
1150
|
throw new Error(
|
|
1145
|
-
|
|
1151
|
+
"Could not resolve project from working directory. Set your local working directory for this project in Overlord or pass --working-directory."
|
|
1146
1152
|
);
|
|
1147
1153
|
}
|
|
1148
1154
|
|
|
@@ -1154,7 +1160,7 @@ async function protocolCreateTicket(args) {
|
|
|
1154
1160
|
...(flags['acceptance-criteria'] ? { acceptanceCriteria: String(flags['acceptance-criteria']) } : {}),
|
|
1155
1161
|
...(flags['available-tools'] ? { availableTools: String(flags['available-tools']) } : {}),
|
|
1156
1162
|
...(flags['execution-target'] ? { executionTarget: String(flags['execution-target']) } : {}),
|
|
1157
|
-
delegate: resolveProtocolTicketDelegate(flags, agentIdentifier)
|
|
1163
|
+
delegate: resolveProtocolTicketDelegate(flags, modelIdentifier, agentIdentifier)
|
|
1158
1164
|
};
|
|
1159
1165
|
|
|
1160
1166
|
const data = await apiPost(
|
|
@@ -1204,14 +1210,14 @@ export async function runProtocolCommand(subcommand, args) {
|
|
|
1204
1210
|
if (!subcommand || subcommand === 'help' || subcommand === '--help') {
|
|
1205
1211
|
console.log(`ovld protocol <subcommand> [flags]
|
|
1206
1212
|
|
|
1207
|
-
Use this for
|
|
1208
|
-
|
|
1209
|
-
\`ovld protocol
|
|
1213
|
+
Use this for ticket lifecycle work from an agent runtime: create a standalone
|
|
1214
|
+
draft with \`ovld protocol create\`, create-and-attach with \`ovld protocol spawn\`,
|
|
1215
|
+
or attach to an existing ticket with \`ovld protocol attach --ticket-id <id>\`.
|
|
1210
1216
|
|
|
1211
1217
|
Project discovery:
|
|
1212
1218
|
When spawning or creating tickets, the CLI automatically resolves the correct
|
|
1213
|
-
project by matching your current working directory against
|
|
1214
|
-
|
|
1219
|
+
project by matching your current working directory against your configured
|
|
1220
|
+
"Local working directory" for that project (stored per user in Overlord).
|
|
1215
1221
|
You can also discover the project explicitly:
|
|
1216
1222
|
|
|
1217
1223
|
ovld protocol discover-project
|
|
@@ -1262,13 +1268,13 @@ auth-status:
|
|
|
1262
1268
|
discover-project:
|
|
1263
1269
|
Purpose:
|
|
1264
1270
|
Resolve the Overlord project that corresponds to the current (or given) working directory.
|
|
1265
|
-
Uses
|
|
1271
|
+
Uses the caller's configured "Local working directory" for matching.
|
|
1266
1272
|
Optional:
|
|
1267
1273
|
--working-directory <path> Directory to match (default: current working directory)
|
|
1268
1274
|
Returns:
|
|
1269
1275
|
Project JSON with id, name, organizationId. Prints PROJECT_ID=<id> on stderr.
|
|
1270
1276
|
Notes:
|
|
1271
|
-
Set
|
|
1277
|
+
Set your local working directory for a project in the Overlord UI under Project Settings.
|
|
1272
1278
|
When no match is found, returns a 404 with a hint.
|
|
1273
1279
|
|
|
1274
1280
|
attach:
|
|
@@ -1401,7 +1407,7 @@ spawn:
|
|
|
1401
1407
|
Purpose:
|
|
1402
1408
|
Create a follow-up ticket and attach to it in one call.
|
|
1403
1409
|
When --project-id is omitted, automatically resolves the project from the
|
|
1404
|
-
current working directory (matching against
|
|
1410
|
+
current working directory (matching against the caller's project_user.local_working_directory).
|
|
1405
1411
|
Required:
|
|
1406
1412
|
--objective <text>
|
|
1407
1413
|
Optional:
|
|
@@ -1432,7 +1438,7 @@ create:
|
|
|
1432
1438
|
Optional:
|
|
1433
1439
|
--session-key <key>
|
|
1434
1440
|
--ticket-id <id>
|
|
1435
|
-
--working-directory <path> Resolve project by local working directory (default: cwd)
|
|
1441
|
+
--working-directory <path> Resolve project by your configured local working directory (default: cwd)
|
|
1436
1442
|
--title <text>
|
|
1437
1443
|
--priority <level> low | medium | high | urgent
|
|
1438
1444
|
--acceptance-criteria <text>
|
|
@@ -1440,8 +1446,12 @@ create:
|
|
|
1440
1446
|
--execution-target <t> agent | human
|
|
1441
1447
|
--delegate <model> Model or delegate identifier that created the ticket
|
|
1442
1448
|
--agent <identifier>
|
|
1449
|
+
--model <identifier>
|
|
1443
1450
|
Returns:
|
|
1444
1451
|
New draft ticket JSON (follow-up draft when session flags are provided)
|
|
1452
|
+
Notes:
|
|
1453
|
+
Standalone create auto-discovers the project from the current working directory.
|
|
1454
|
+
Follow-up create requires both --session-key and --ticket-id.
|
|
1445
1455
|
|
|
1446
1456
|
artifact-prepare-upload:
|
|
1447
1457
|
Required:
|
|
@@ -1496,8 +1506,8 @@ Examples:
|
|
|
1496
1506
|
ovld protocol attach --ticket-id abc-123 --external-session-id null
|
|
1497
1507
|
ovld protocol connect --ticket-id abc-123
|
|
1498
1508
|
ovld protocol load-context --ticket-id abc-123
|
|
1499
|
-
ovld protocol create --objective "Capture follow-up work from this repo"
|
|
1500
|
-
ovld protocol create --session-key <key> --ticket-id <id> --objective "Capture follow-up work"
|
|
1509
|
+
ovld protocol create --agent codex --objective "Capture follow-up work from this repo"
|
|
1510
|
+
ovld protocol create --agent codex --session-key <key> --ticket-id <id> --objective "Capture follow-up work"
|
|
1501
1511
|
ovld protocol spawn --agent codex --objective "Implement user auth" --priority high
|
|
1502
1512
|
ovld protocol update --session-key <key> --ticket-id <id> --summary "Did X" --phase execute
|
|
1503
1513
|
ovld protocol update --session-key <key> --ticket-id <id> --summary-file ./update.txt --event-type user_follow_up
|
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,11 +71,11 @@ 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 to create
|
|
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
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.
|
|
78
|
-
|
|
76
|
+
- When session flags are omitted, it resolves the project by matching current working directory (or `--working-directory`) to the caller's configured Overlord `project_user.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
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
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
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.
|
|
@@ -107,9 +107,13 @@ Record only meaningful behavioral changes. Skip formatting-only noise.
|
|
|
107
107
|
## Project Discovery And Ticket Creation
|
|
108
108
|
|
|
109
109
|
When creating tickets from within a repository:
|
|
110
|
-
- `
|
|
111
|
-
- `
|
|
112
|
-
|
|
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
|
+
```
|
|
113
117
|
|
|
114
118
|
```bash
|
|
115
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.
|