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 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
@@ -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>]
@@ -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 resolveTicketCreationDelegate(flags = {}, selectedAgent = null) {
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 ticketDelegate = resolveTicketCreationDelegate(flags, selectedAgent);
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
  }
@@ -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
- // so the server can resolve the project from the local_working_directory setting.
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
- 'Could not resolve project from working directory. Set project local working directory in Overlord or pass --working-directory.'
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 agent workflow on a ticket: create one with \`ovld protocol spawn\`,
1208
- attach with \`ovld protocol attach --ticket-id <id>\`, then begin executing with
1209
- \`ovld protocol update --phase execute\`.
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 each project's
1214
- configured "Local working directory" (set in Project Settings in the Overlord UI).
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 each project's "Local working directory" setting for matching.
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 the local working directory for a project in the Overlord UI under Project Settings.
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 each project's local_working_directory).
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
@@ -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.8.0';
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord-cli",
3
- "version": "4.13.0",
3
+ "version": "4.15.0",
4
4
  "description": "Overlord CLI — launch AI agents on tickets from anywhere",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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 ticket drafts only (do not start execution), run `ovld protocol create --objective "..."`.
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. If the user wants to create and start execution immediately, use `/overlord:spawn` or run `ovld protocol spawn --agent claude-code --objective "..."`.
78
- This creates the ticket in `execute` status and attaches immediately.
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
- - `spawn` automatically resolves the correct project from the current working directory and starts execution.
111
- - `create` creates a draft follow-up ticket (no auto-attach execution session).
112
- No `--project-id` flag is needed for `spawn` unless you want to override resolution.
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 a new ticket, use `/spawn` or run `ovld protocol spawn --agent cursor --objective "..."`.
23
- 2. 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>`.
24
- 3. 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>`.
25
- 4. If the user wants to search for tickets by keyword or status, use the `search_tickets` MCP tool.
26
- 5. If you need other lifecycle commands or flags, run `ovld protocol help` and use the real subcommand list instead of guessing.
27
- 6. Once you attach to a ticket, switch back to Mode 1 and follow the full ticket lifecycle.
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 a new ticket, use `ovld protocol spawn --objective "..."`. It creates the ticket and attaches immediately.
71
- 2. If the user wants to inspect an existing ticket without starting work, use `ovld protocol load-context --ticket-id <ticket-id>`.
72
- 3. If the user wants to work an existing ticket, attach with `ovld protocol attach --ticket-id <ticket-id>` and then switch to Mode 1.
73
- 4. If the user wants to find existing tickets by keyword or workflow state, use the `search_tickets` tool.
74
- 5. If you need to understand project routing before spawning, use `ovld protocol discover-project`.
75
- 6. If you need other lifecycle commands or flags, run `ovld protocol help` and use the real subcommand list instead of guessing.
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.