@fission-ai/openspec 1.3.1 → 1.4.1

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.
Files changed (165) hide show
  1. package/README.md +9 -2
  2. package/bin/openspec.js +3 -1
  3. package/dist/cli/index.d.ts +4 -1
  4. package/dist/cli/index.js +65 -3
  5. package/dist/commands/completion.js +7 -0
  6. package/dist/commands/config.js +64 -5
  7. package/dist/commands/context-store.d.ts +3 -0
  8. package/dist/commands/context-store.js +475 -0
  9. package/dist/commands/initiative.d.ts +13 -0
  10. package/dist/commands/initiative.js +318 -0
  11. package/dist/commands/workflow/index.d.ts +2 -0
  12. package/dist/commands/workflow/index.js +1 -0
  13. package/dist/commands/workflow/initiative-link.d.ts +24 -0
  14. package/dist/commands/workflow/initiative-link.js +47 -0
  15. package/dist/commands/workflow/instructions.d.ts +1 -1
  16. package/dist/commands/workflow/instructions.js +28 -11
  17. package/dist/commands/workflow/new-change.d.ts +6 -0
  18. package/dist/commands/workflow/new-change.js +114 -17
  19. package/dist/commands/workflow/set-change.d.ts +13 -0
  20. package/dist/commands/workflow/set-change.js +87 -0
  21. package/dist/commands/workflow/shared.d.ts +4 -2
  22. package/dist/commands/workflow/shared.js +6 -6
  23. package/dist/commands/workflow/status.js +19 -4
  24. package/dist/commands/workspace/context-status.d.ts +4 -0
  25. package/dist/commands/workspace/context-status.js +59 -0
  26. package/dist/commands/workspace/open-target-selection.d.ts +13 -0
  27. package/dist/commands/workspace/open-target-selection.js +146 -0
  28. package/dist/commands/workspace/open-view.d.ts +62 -0
  29. package/dist/commands/workspace/open-view.js +249 -0
  30. package/dist/commands/workspace/open.d.ts +37 -0
  31. package/dist/commands/workspace/open.js +110 -0
  32. package/dist/commands/workspace/opener-selection.d.ts +11 -0
  33. package/dist/commands/workspace/opener-selection.js +98 -0
  34. package/dist/commands/workspace/operations.d.ts +29 -0
  35. package/dist/commands/workspace/operations.js +543 -0
  36. package/dist/commands/workspace/prompt-theme.d.ts +29 -0
  37. package/dist/commands/workspace/prompt-theme.js +24 -0
  38. package/dist/commands/workspace/registration.d.ts +13 -0
  39. package/dist/commands/workspace/registration.js +84 -0
  40. package/dist/commands/workspace/selection.d.ts +8 -0
  41. package/dist/commands/workspace/selection.js +104 -0
  42. package/dist/commands/workspace/setup-prompts.d.ts +13 -0
  43. package/dist/commands/workspace/setup-prompts.js +121 -0
  44. package/dist/commands/workspace/types.d.ts +103 -0
  45. package/dist/commands/workspace/types.js +36 -0
  46. package/dist/commands/workspace.d.ts +5 -0
  47. package/dist/commands/workspace.js +574 -0
  48. package/dist/core/artifact-graph/index.d.ts +2 -1
  49. package/dist/core/artifact-graph/instruction-loader.d.ts +41 -1
  50. package/dist/core/artifact-graph/instruction-loader.js +46 -6
  51. package/dist/core/artifact-graph/types.d.ts +0 -5
  52. package/dist/core/artifact-graph/types.js +0 -14
  53. package/dist/core/change-metadata/index.d.ts +2 -0
  54. package/dist/core/change-metadata/index.js +2 -0
  55. package/dist/core/change-metadata/schema.d.ts +18 -0
  56. package/dist/core/change-metadata/schema.js +28 -0
  57. package/dist/core/change-status-policy.d.ts +50 -0
  58. package/dist/core/change-status-policy.js +70 -0
  59. package/dist/core/collections/index.d.ts +3 -0
  60. package/dist/core/collections/index.js +3 -0
  61. package/dist/core/collections/initiatives/collection.d.ts +4 -0
  62. package/dist/core/collections/initiatives/collection.js +17 -0
  63. package/dist/core/collections/initiatives/index.d.ts +6 -0
  64. package/dist/core/collections/initiatives/index.js +6 -0
  65. package/dist/core/collections/initiatives/operations.d.ts +49 -0
  66. package/dist/core/collections/initiatives/operations.js +175 -0
  67. package/dist/core/collections/initiatives/resolution.d.ts +87 -0
  68. package/dist/core/collections/initiatives/resolution.js +374 -0
  69. package/dist/core/collections/initiatives/schema.d.ts +41 -0
  70. package/dist/core/collections/initiatives/schema.js +134 -0
  71. package/dist/core/collections/initiatives/templates.d.ts +12 -0
  72. package/dist/core/collections/initiatives/templates.js +90 -0
  73. package/dist/core/collections/runtime.d.ts +46 -0
  74. package/dist/core/collections/runtime.js +194 -0
  75. package/dist/core/completions/command-registry.d.ts +1 -5
  76. package/dist/core/completions/command-registry.js +532 -32
  77. package/dist/core/completions/completion-provider.d.ts +11 -0
  78. package/dist/core/completions/completion-provider.js +27 -0
  79. package/dist/core/completions/generators/bash-generator.d.ts +3 -0
  80. package/dist/core/completions/generators/bash-generator.js +60 -4
  81. package/dist/core/completions/generators/fish-generator.js +3 -0
  82. package/dist/core/completions/generators/powershell-generator.d.ts +3 -0
  83. package/dist/core/completions/generators/powershell-generator.js +63 -4
  84. package/dist/core/completions/generators/zsh-generator.d.ts +3 -0
  85. package/dist/core/completions/generators/zsh-generator.js +46 -22
  86. package/dist/core/completions/installers/zsh-installer.d.ts +0 -8
  87. package/dist/core/completions/installers/zsh-installer.js +3 -31
  88. package/dist/core/completions/shared-flags.d.ts +12 -0
  89. package/dist/core/completions/shared-flags.js +28 -0
  90. package/dist/core/completions/templates/bash-templates.d.ts +1 -1
  91. package/dist/core/completions/templates/bash-templates.js +6 -0
  92. package/dist/core/completions/templates/fish-templates.d.ts +1 -1
  93. package/dist/core/completions/templates/fish-templates.js +6 -0
  94. package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
  95. package/dist/core/completions/templates/powershell-templates.js +9 -0
  96. package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
  97. package/dist/core/completions/templates/zsh-templates.js +9 -0
  98. package/dist/core/completions/types.d.ts +23 -1
  99. package/dist/core/config.js +3 -1
  100. package/dist/core/context-store/binding.d.ts +53 -0
  101. package/dist/core/context-store/binding.js +197 -0
  102. package/dist/core/context-store/errors.d.ts +20 -0
  103. package/dist/core/context-store/errors.js +22 -0
  104. package/dist/core/context-store/foundation.d.ts +55 -0
  105. package/dist/core/context-store/foundation.js +321 -0
  106. package/dist/core/context-store/index.d.ts +6 -0
  107. package/dist/core/context-store/index.js +6 -0
  108. package/dist/core/context-store/operations.d.ts +85 -0
  109. package/dist/core/context-store/operations.js +528 -0
  110. package/dist/core/context-store/registry.d.ts +45 -0
  111. package/dist/core/context-store/registry.js +229 -0
  112. package/dist/core/global-config.d.ts +6 -1
  113. package/dist/core/global-config.js +15 -16
  114. package/dist/core/index.d.ts +5 -1
  115. package/dist/core/index.js +4 -0
  116. package/dist/core/parsers/requirement-blocks.js +5 -5
  117. package/dist/core/parsers/spec-structure.js +1 -1
  118. package/dist/core/planning-home.d.ts +21 -0
  119. package/dist/core/planning-home.js +108 -0
  120. package/dist/core/profiles.d.ts +1 -1
  121. package/dist/core/profiles.js +1 -1
  122. package/dist/core/specs-apply.js +1 -1
  123. package/dist/core/templates/workflows/apply-change.js +6 -0
  124. package/dist/core/templates/workflows/archive-change.js +21 -15
  125. package/dist/core/templates/workflows/bulk-archive-change.js +14 -10
  126. package/dist/core/templates/workflows/continue-change.js +6 -4
  127. package/dist/core/templates/workflows/explore.js +8 -10
  128. package/dist/core/templates/workflows/ff-change.js +8 -6
  129. package/dist/core/templates/workflows/new-change.js +6 -6
  130. package/dist/core/templates/workflows/onboard.js +13 -15
  131. package/dist/core/templates/workflows/propose.js +8 -6
  132. package/dist/core/templates/workflows/sync-specs.js +28 -10
  133. package/dist/core/templates/workflows/verify-change.js +10 -4
  134. package/dist/core/update.d.ts +5 -0
  135. package/dist/core/update.js +20 -0
  136. package/dist/core/validation/validator.d.ts +11 -0
  137. package/dist/core/validation/validator.js +19 -2
  138. package/dist/core/workspace/foundation.d.ts +67 -0
  139. package/dist/core/workspace/foundation.js +295 -0
  140. package/dist/core/workspace/index.d.ts +8 -0
  141. package/dist/core/workspace/index.js +8 -0
  142. package/dist/core/workspace/legacy-state.d.ts +28 -0
  143. package/dist/core/workspace/legacy-state.js +200 -0
  144. package/dist/core/workspace/link-input.d.ts +9 -0
  145. package/dist/core/workspace/link-input.js +32 -0
  146. package/dist/core/workspace/open-surface.d.ts +45 -0
  147. package/dist/core/workspace/open-surface.js +215 -0
  148. package/dist/core/workspace/openers.d.ts +21 -0
  149. package/dist/core/workspace/openers.js +124 -0
  150. package/dist/core/workspace/registry.d.ts +24 -0
  151. package/dist/core/workspace/registry.js +146 -0
  152. package/dist/core/workspace/skills.d.ts +57 -0
  153. package/dist/core/workspace/skills.js +334 -0
  154. package/dist/core/workspace/state-io.d.ts +10 -0
  155. package/dist/core/workspace/state-io.js +121 -0
  156. package/dist/utils/change-metadata.d.ts +5 -2
  157. package/dist/utils/change-metadata.js +7 -13
  158. package/dist/utils/change-utils.d.ts +9 -0
  159. package/dist/utils/change-utils.js +7 -5
  160. package/package.json +2 -1
  161. package/schemas/workspace-planning/schema.yaml +72 -0
  162. package/schemas/workspace-planning/templates/design.md +33 -0
  163. package/schemas/workspace-planning/templates/proposal.md +28 -0
  164. package/schemas/workspace-planning/templates/spec.md +9 -0
  165. package/schemas/workspace-planning/templates/tasks.md +15 -0
@@ -1,46 +1,27 @@
1
- /**
2
- * Common flags used across multiple commands
3
- */
4
- const COMMON_FLAGS = {
5
- json: {
6
- name: 'json',
7
- description: 'Output as JSON',
8
- },
9
- jsonValidation: {
10
- name: 'json',
11
- description: 'Output validation results as JSON',
12
- },
13
- strict: {
14
- name: 'strict',
15
- description: 'Enable strict validation mode',
16
- },
17
- noInteractive: {
18
- name: 'no-interactive',
19
- description: 'Disable interactive prompts',
20
- },
21
- type: {
22
- name: 'type',
23
- description: 'Specify item type when ambiguous',
24
- takesValue: true,
25
- values: ['change', 'spec'],
26
- },
27
- };
28
- /**
29
- * Registry of all OpenSpec CLI commands with their flags and metadata.
30
- * This registry is used to generate shell completion scripts.
31
- */
1
+ import { COMMON_FLAGS } from './shared-flags.js';
32
2
  export const COMMAND_REGISTRY = [
33
3
  {
34
4
  name: 'init',
35
5
  description: 'Initialize OpenSpec in your project',
36
6
  acceptsPositional: true,
37
7
  positionalType: 'path',
8
+ positionals: [{ name: 'path', type: 'path', optional: true }],
38
9
  flags: [
39
10
  {
40
11
  name: 'tools',
41
12
  description: 'Configure AI tools non-interactively (e.g., "all", "none", or comma-separated tool IDs)',
42
13
  takesValue: true,
43
14
  },
15
+ {
16
+ name: 'force',
17
+ description: 'Auto-cleanup legacy files without prompting',
18
+ },
19
+ {
20
+ name: 'profile',
21
+ description: 'Override global config profile (core or custom)',
22
+ takesValue: true,
23
+ values: ['core', 'custom'],
24
+ },
44
25
  ],
45
26
  },
46
27
  {
@@ -48,7 +29,13 @@ export const COMMAND_REGISTRY = [
48
29
  description: 'Update OpenSpec instruction files',
49
30
  acceptsPositional: true,
50
31
  positionalType: 'path',
51
- flags: [],
32
+ positionals: [{ name: 'path', type: 'path', optional: true }],
33
+ flags: [
34
+ {
35
+ name: 'force',
36
+ description: 'Force update even when tools are up to date',
37
+ },
38
+ ],
52
39
  },
53
40
  {
54
41
  name: 'list',
@@ -62,6 +49,13 @@ export const COMMAND_REGISTRY = [
62
49
  name: 'changes',
63
50
  description: 'List changes explicitly (default)',
64
51
  },
52
+ {
53
+ name: 'sort',
54
+ description: 'Sort order: "recent" (default) or "name"',
55
+ takesValue: true,
56
+ values: ['recent', 'name'],
57
+ },
58
+ COMMON_FLAGS.json,
65
59
  ],
66
60
  },
67
61
  {
@@ -74,6 +68,7 @@ export const COMMAND_REGISTRY = [
74
68
  description: 'Validate changes and specs',
75
69
  acceptsPositional: true,
76
70
  positionalType: 'change-or-spec-id',
71
+ positionals: [{ name: 'item-name', type: 'change-or-spec-id', optional: true }],
77
72
  flags: [
78
73
  {
79
74
  name: 'all',
@@ -103,6 +98,7 @@ export const COMMAND_REGISTRY = [
103
98
  description: 'Show a change or spec',
104
99
  acceptsPositional: true,
105
100
  positionalType: 'change-or-spec-id',
101
+ positionals: [{ name: 'item-name', type: 'change-or-spec-id', optional: true }],
106
102
  flags: [
107
103
  COMMON_FLAGS.json,
108
104
  COMMON_FLAGS.type,
@@ -136,6 +132,7 @@ export const COMMAND_REGISTRY = [
136
132
  description: 'Archive a completed change and update main specs',
137
133
  acceptsPositional: true,
138
134
  positionalType: 'change-id',
135
+ positionals: [{ name: 'change-name', type: 'change-id', optional: true }],
139
136
  flags: [
140
137
  {
141
138
  name: 'yes',
@@ -152,10 +149,494 @@ export const COMMAND_REGISTRY = [
152
149
  },
153
150
  ],
154
151
  },
152
+ {
153
+ name: 'status',
154
+ description: 'Display artifact completion status for a change',
155
+ flags: [
156
+ {
157
+ name: 'change',
158
+ description: 'Change name to show status for',
159
+ takesValue: true,
160
+ },
161
+ {
162
+ name: 'schema',
163
+ description: 'Schema override',
164
+ takesValue: true,
165
+ },
166
+ COMMON_FLAGS.json,
167
+ ],
168
+ },
169
+ {
170
+ name: 'instructions',
171
+ description: 'Output enriched instructions for creating an artifact or applying tasks',
172
+ acceptsPositional: true,
173
+ positionals: [{ name: 'artifact', optional: true }],
174
+ flags: [
175
+ {
176
+ name: 'change',
177
+ description: 'Change name',
178
+ takesValue: true,
179
+ },
180
+ {
181
+ name: 'schema',
182
+ description: 'Schema override',
183
+ takesValue: true,
184
+ },
185
+ COMMON_FLAGS.json,
186
+ ],
187
+ },
188
+ {
189
+ name: 'templates',
190
+ description: 'Show resolved template paths for all artifacts in a schema',
191
+ flags: [
192
+ {
193
+ name: 'schema',
194
+ description: 'Schema to use',
195
+ takesValue: true,
196
+ },
197
+ COMMON_FLAGS.json,
198
+ ],
199
+ },
200
+ {
201
+ name: 'schemas',
202
+ description: 'List available workflow schemas with descriptions',
203
+ flags: [
204
+ COMMON_FLAGS.json,
205
+ ],
206
+ },
207
+ {
208
+ name: 'new',
209
+ description: 'Create new items',
210
+ flags: [],
211
+ subcommands: [
212
+ {
213
+ name: 'change',
214
+ description: 'Create a new change directory',
215
+ acceptsPositional: true,
216
+ positionals: [{ name: 'name' }],
217
+ flags: [
218
+ {
219
+ name: 'description',
220
+ description: 'Description to add to README.md',
221
+ takesValue: true,
222
+ },
223
+ {
224
+ name: 'goal',
225
+ description: 'Workspace product goal to store with the change',
226
+ takesValue: true,
227
+ },
228
+ {
229
+ name: 'areas',
230
+ description: 'Comma-separated affected workspace link names',
231
+ takesValue: true,
232
+ },
233
+ {
234
+ name: 'initiative',
235
+ description: 'Link the repo-local change to an initiative',
236
+ takesValue: true,
237
+ },
238
+ {
239
+ name: 'store',
240
+ description: 'Context store id for --initiative',
241
+ takesValue: true,
242
+ },
243
+ {
244
+ name: 'store-path',
245
+ description: 'Existing local context store root for --initiative',
246
+ takesValue: true,
247
+ },
248
+ {
249
+ name: 'schema',
250
+ description: 'Workflow schema to use',
251
+ takesValue: true,
252
+ },
253
+ COMMON_FLAGS.json,
254
+ ],
255
+ },
256
+ ],
257
+ },
258
+ {
259
+ name: 'set',
260
+ description: 'Set checked-in OpenSpec metadata',
261
+ flags: [],
262
+ subcommands: [
263
+ {
264
+ name: 'change',
265
+ description: 'Set repo-local change metadata',
266
+ acceptsPositional: true,
267
+ positionalType: 'change-id',
268
+ positionals: [{ name: 'name', type: 'change-id' }],
269
+ flags: [
270
+ {
271
+ name: 'initiative',
272
+ description: 'Link the repo-local change to an initiative',
273
+ takesValue: true,
274
+ },
275
+ {
276
+ name: 'store',
277
+ description: 'Context store id for --initiative',
278
+ takesValue: true,
279
+ },
280
+ {
281
+ name: 'store-path',
282
+ description: 'Existing local context store root for --initiative',
283
+ takesValue: true,
284
+ },
285
+ COMMON_FLAGS.json,
286
+ ],
287
+ },
288
+ ],
289
+ },
290
+ {
291
+ name: 'workspace',
292
+ description: 'Set up and inspect coordination workspaces',
293
+ flags: [],
294
+ subcommands: [
295
+ {
296
+ name: 'setup',
297
+ description: 'Set up a workspace and link existing repos or folders',
298
+ flags: [
299
+ {
300
+ name: 'name',
301
+ description: 'Workspace name',
302
+ takesValue: true,
303
+ },
304
+ {
305
+ name: 'link',
306
+ description: 'Repo or folder link. Use <path> or <name>=<path>',
307
+ takesValue: true,
308
+ },
309
+ {
310
+ name: 'opener',
311
+ description: 'Preferred opener: codex-cli, claude, github-copilot, or editor',
312
+ takesValue: true,
313
+ values: ['codex-cli', 'claude', 'github-copilot', 'editor'],
314
+ },
315
+ {
316
+ name: 'tools',
317
+ description: 'Install OpenSpec skills for agents (all, none, or comma-separated tool IDs)',
318
+ takesValue: true,
319
+ },
320
+ COMMON_FLAGS.json,
321
+ COMMON_FLAGS.noInteractive,
322
+ ],
323
+ },
324
+ {
325
+ name: 'list',
326
+ description: 'List known OpenSpec workspaces',
327
+ flags: [
328
+ COMMON_FLAGS.json,
329
+ ],
330
+ },
331
+ {
332
+ name: 'ls',
333
+ description: 'List known OpenSpec workspaces',
334
+ flags: [
335
+ COMMON_FLAGS.json,
336
+ ],
337
+ },
338
+ {
339
+ name: 'link',
340
+ description: 'Link an existing repo or folder to a workspace',
341
+ acceptsPositional: true,
342
+ positionals: [
343
+ { name: 'name-or-path', type: 'path', optional: true },
344
+ { name: 'path', type: 'path', optional: true },
345
+ ],
346
+ flags: [
347
+ {
348
+ name: 'workspace',
349
+ description: 'Workspace name from local workspace views',
350
+ takesValue: true,
351
+ },
352
+ COMMON_FLAGS.json,
353
+ COMMON_FLAGS.noInteractive,
354
+ ],
355
+ },
356
+ {
357
+ name: 'relink',
358
+ description: 'Update the local path for an existing workspace link',
359
+ acceptsPositional: true,
360
+ positionals: [
361
+ { name: 'name' },
362
+ { name: 'path', type: 'path' },
363
+ ],
364
+ flags: [
365
+ {
366
+ name: 'workspace',
367
+ description: 'Workspace name from local workspace views',
368
+ takesValue: true,
369
+ },
370
+ COMMON_FLAGS.json,
371
+ COMMON_FLAGS.noInteractive,
372
+ ],
373
+ },
374
+ {
375
+ name: 'doctor',
376
+ description: 'Check what a workspace can resolve on this machine',
377
+ flags: [
378
+ {
379
+ name: 'workspace',
380
+ description: 'Workspace name from local workspace views',
381
+ takesValue: true,
382
+ },
383
+ COMMON_FLAGS.json,
384
+ COMMON_FLAGS.noInteractive,
385
+ ],
386
+ },
387
+ {
388
+ name: 'update',
389
+ description: 'Refresh workspace-local OpenSpec guidance and agent skills',
390
+ acceptsPositional: true,
391
+ positionals: [{ name: 'name', optional: true }],
392
+ flags: [
393
+ {
394
+ name: 'workspace',
395
+ description: 'Workspace name from local workspace views',
396
+ takesValue: true,
397
+ },
398
+ {
399
+ name: 'tools',
400
+ description: 'Select agents for workspace skills-only delivery; global profile selects workflows',
401
+ takesValue: true,
402
+ },
403
+ COMMON_FLAGS.json,
404
+ COMMON_FLAGS.noInteractive,
405
+ ],
406
+ },
407
+ {
408
+ name: 'open',
409
+ description: 'Open a workspace in an agent or VS Code editor',
410
+ acceptsPositional: true,
411
+ positionals: [{ name: 'name', optional: true }],
412
+ flags: [
413
+ {
414
+ name: 'workspace',
415
+ description: 'Workspace name from local workspace views',
416
+ takesValue: true,
417
+ },
418
+ {
419
+ name: 'initiative',
420
+ description: 'Open an initiative as a local workspace view',
421
+ takesValue: true,
422
+ },
423
+ {
424
+ name: 'store',
425
+ description: 'Context store id for --initiative',
426
+ takesValue: true,
427
+ },
428
+ {
429
+ name: 'store-path',
430
+ description: 'Existing local context store root for --initiative',
431
+ takesValue: true,
432
+ },
433
+ {
434
+ name: 'agent',
435
+ description: 'Use an agent for this session: codex-cli, claude, or github-copilot',
436
+ takesValue: true,
437
+ values: ['codex-cli', 'claude', 'github-copilot'],
438
+ },
439
+ {
440
+ name: 'editor',
441
+ description: 'Open the workspace in VS Code editor mode',
442
+ },
443
+ {
444
+ name: 'prepare-only',
445
+ description: 'Unsupported: preview surfaces belong to a future context/query command',
446
+ },
447
+ COMMON_FLAGS.json,
448
+ {
449
+ name: 'change',
450
+ description: 'Unsupported: change-scoped open belongs to future workspace change planning',
451
+ takesValue: true,
452
+ },
453
+ COMMON_FLAGS.noInteractive,
454
+ ],
455
+ },
456
+ ],
457
+ },
458
+ {
459
+ name: 'context-store',
460
+ description: 'Set up and inspect context stores',
461
+ flags: [],
462
+ subcommands: [
463
+ {
464
+ name: 'setup',
465
+ description: 'Create or register a local context store',
466
+ acceptsPositional: true,
467
+ positionals: [{ name: 'id', optional: true }],
468
+ flags: [
469
+ {
470
+ name: 'path',
471
+ description: 'Directory to use for the context store',
472
+ takesValue: true,
473
+ },
474
+ {
475
+ name: 'init-git',
476
+ description: 'Initialize a Git repository in the context store',
477
+ },
478
+ {
479
+ name: 'no-init-git',
480
+ description: 'Skip Git repository initialization',
481
+ },
482
+ COMMON_FLAGS.json,
483
+ ],
484
+ },
485
+ {
486
+ name: 'register',
487
+ description: 'Register an existing context store directory',
488
+ acceptsPositional: true,
489
+ positionals: [{ name: 'path', type: 'path', optional: true }],
490
+ flags: [
491
+ {
492
+ name: 'id',
493
+ description: 'Context store id',
494
+ takesValue: true,
495
+ },
496
+ COMMON_FLAGS.json,
497
+ ],
498
+ },
499
+ {
500
+ name: 'unregister',
501
+ description: 'Forget a local context-store registration without deleting files',
502
+ acceptsPositional: true,
503
+ positionals: [{ name: 'id' }],
504
+ flags: [
505
+ COMMON_FLAGS.json,
506
+ ],
507
+ },
508
+ {
509
+ name: 'remove',
510
+ description: 'Forget a local context-store registration and delete its local folder',
511
+ acceptsPositional: true,
512
+ positionals: [{ name: 'id' }],
513
+ flags: [
514
+ {
515
+ name: 'yes',
516
+ description: 'Confirm local context-store folder deletion',
517
+ },
518
+ COMMON_FLAGS.json,
519
+ ],
520
+ },
521
+ {
522
+ name: 'list',
523
+ description: 'List registered context stores',
524
+ flags: [
525
+ COMMON_FLAGS.json,
526
+ ],
527
+ },
528
+ {
529
+ name: 'ls',
530
+ description: 'List registered context stores',
531
+ flags: [
532
+ COMMON_FLAGS.json,
533
+ ],
534
+ },
535
+ {
536
+ name: 'doctor',
537
+ description: 'Check local context-store registration and metadata',
538
+ acceptsPositional: true,
539
+ positionals: [{ name: 'id', optional: true }],
540
+ flags: [
541
+ COMMON_FLAGS.json,
542
+ ],
543
+ },
544
+ ],
545
+ },
546
+ {
547
+ name: 'initiative',
548
+ description: 'Create and list coordinated initiatives',
549
+ flags: [],
550
+ subcommands: [
551
+ {
552
+ name: 'create',
553
+ description: 'Create an initiative in a context store',
554
+ acceptsPositional: true,
555
+ positionals: [{ name: 'id', optional: true }],
556
+ flags: [
557
+ {
558
+ name: 'store',
559
+ description: 'Context store id from the local context-store registry',
560
+ takesValue: true,
561
+ },
562
+ {
563
+ name: 'store-path',
564
+ description: 'Existing local context store root',
565
+ takesValue: true,
566
+ },
567
+ {
568
+ name: 'title',
569
+ description: 'Initiative title',
570
+ takesValue: true,
571
+ },
572
+ {
573
+ name: 'summary',
574
+ description: 'Initiative summary',
575
+ takesValue: true,
576
+ },
577
+ COMMON_FLAGS.json,
578
+ ],
579
+ },
580
+ {
581
+ name: 'show',
582
+ description: 'Show where an initiative lives and how to read it',
583
+ acceptsPositional: true,
584
+ positionals: [{ name: 'id' }],
585
+ flags: [
586
+ {
587
+ name: 'store',
588
+ description: 'Context store id from the local context-store registry',
589
+ takesValue: true,
590
+ },
591
+ {
592
+ name: 'store-path',
593
+ description: 'Existing local context store root',
594
+ takesValue: true,
595
+ },
596
+ COMMON_FLAGS.json,
597
+ ],
598
+ },
599
+ {
600
+ name: 'list',
601
+ description: 'List initiatives across registered context stores',
602
+ flags: [
603
+ {
604
+ name: 'store',
605
+ description: 'Context store id from the local context-store registry',
606
+ takesValue: true,
607
+ },
608
+ {
609
+ name: 'store-path',
610
+ description: 'Existing local context store root',
611
+ takesValue: true,
612
+ },
613
+ COMMON_FLAGS.json,
614
+ ],
615
+ },
616
+ {
617
+ name: 'ls',
618
+ description: 'List initiatives across registered context stores',
619
+ flags: [
620
+ {
621
+ name: 'store',
622
+ description: 'Context store id from the local context-store registry',
623
+ takesValue: true,
624
+ },
625
+ {
626
+ name: 'store-path',
627
+ description: 'Existing local context store root',
628
+ takesValue: true,
629
+ },
630
+ COMMON_FLAGS.json,
631
+ ],
632
+ },
633
+ ],
634
+ },
155
635
  {
156
636
  name: 'feedback',
157
637
  description: 'Submit feedback about OpenSpec',
158
638
  acceptsPositional: true,
639
+ positionals: [{ name: 'message' }],
159
640
  flags: [
160
641
  {
161
642
  name: 'body',
@@ -174,6 +655,7 @@ export const COMMAND_REGISTRY = [
174
655
  description: 'Show a change proposal',
175
656
  acceptsPositional: true,
176
657
  positionalType: 'change-id',
658
+ positionals: [{ name: 'change-name', type: 'change-id', optional: true }],
177
659
  flags: [
178
660
  COMMON_FLAGS.json,
179
661
  {
@@ -203,6 +685,7 @@ export const COMMAND_REGISTRY = [
203
685
  description: 'Validate a change proposal',
204
686
  acceptsPositional: true,
205
687
  positionalType: 'change-id',
688
+ positionals: [{ name: 'change-name', type: 'change-id', optional: true }],
206
689
  flags: [
207
690
  COMMON_FLAGS.strict,
208
691
  COMMON_FLAGS.jsonValidation,
@@ -221,6 +704,7 @@ export const COMMAND_REGISTRY = [
221
704
  description: 'Show a specification',
222
705
  acceptsPositional: true,
223
706
  positionalType: 'spec-id',
707
+ positionals: [{ name: 'spec-id', type: 'spec-id', optional: true }],
224
708
  flags: [
225
709
  COMMON_FLAGS.json,
226
710
  {
@@ -256,6 +740,7 @@ export const COMMAND_REGISTRY = [
256
740
  description: 'Validate a specification',
257
741
  acceptsPositional: true,
258
742
  positionalType: 'spec-id',
743
+ positionals: [{ name: 'spec-id', type: 'spec-id', optional: true }],
259
744
  flags: [
260
745
  COMMON_FLAGS.strict,
261
746
  COMMON_FLAGS.jsonValidation,
@@ -274,6 +759,7 @@ export const COMMAND_REGISTRY = [
274
759
  description: 'Generate completion script for a shell (outputs to stdout)',
275
760
  acceptsPositional: true,
276
761
  positionalType: 'shell',
762
+ positionals: [{ name: 'shell', type: 'shell', optional: true }],
277
763
  flags: [],
278
764
  },
279
765
  {
@@ -281,6 +767,7 @@ export const COMMAND_REGISTRY = [
281
767
  description: 'Install completion script for a shell',
282
768
  acceptsPositional: true,
283
769
  positionalType: 'shell',
770
+ positionals: [{ name: 'shell', type: 'shell', optional: true }],
284
771
  flags: [
285
772
  {
286
773
  name: 'verbose',
@@ -293,6 +780,7 @@ export const COMMAND_REGISTRY = [
293
780
  description: 'Uninstall completion script for a shell',
294
781
  acceptsPositional: true,
295
782
  positionalType: 'shell',
783
+ positionals: [{ name: 'shell', type: 'shell', optional: true }],
296
784
  flags: [
297
785
  {
298
786
  name: 'yes',
@@ -331,12 +819,14 @@ export const COMMAND_REGISTRY = [
331
819
  name: 'get',
332
820
  description: 'Get a specific value (raw, scriptable)',
333
821
  acceptsPositional: true,
822
+ positionals: [{ name: 'key' }],
334
823
  flags: [],
335
824
  },
336
825
  {
337
826
  name: 'set',
338
827
  description: 'Set a value (auto-coerce types)',
339
828
  acceptsPositional: true,
829
+ positionals: [{ name: 'key' }, { name: 'value' }],
340
830
  flags: [
341
831
  {
342
832
  name: 'string',
@@ -352,6 +842,7 @@ export const COMMAND_REGISTRY = [
352
842
  name: 'unset',
353
843
  description: 'Remove a key (revert to default)',
354
844
  acceptsPositional: true,
845
+ positionals: [{ name: 'key' }],
355
846
  flags: [],
356
847
  },
357
848
  {
@@ -377,6 +868,8 @@ export const COMMAND_REGISTRY = [
377
868
  {
378
869
  name: 'profile',
379
870
  description: 'Configure workflow profile (interactive picker or preset shortcut)',
871
+ acceptsPositional: true,
872
+ positionals: [{ name: 'preset', optional: true }],
380
873
  flags: [],
381
874
  },
382
875
  ],
@@ -391,6 +884,7 @@ export const COMMAND_REGISTRY = [
391
884
  description: 'Show where a schema resolves from',
392
885
  acceptsPositional: true,
393
886
  positionalType: 'schema-name',
887
+ positionals: [{ name: 'name', type: 'schema-name', optional: true }],
394
888
  flags: [
395
889
  COMMON_FLAGS.json,
396
890
  {
@@ -404,6 +898,7 @@ export const COMMAND_REGISTRY = [
404
898
  description: 'Validate a schema structure and templates',
405
899
  acceptsPositional: true,
406
900
  positionalType: 'schema-name',
901
+ positionals: [{ name: 'name', type: 'schema-name', optional: true }],
407
902
  flags: [
408
903
  COMMON_FLAGS.json,
409
904
  {
@@ -417,6 +912,10 @@ export const COMMAND_REGISTRY = [
417
912
  description: 'Copy an existing schema to project for customization',
418
913
  acceptsPositional: true,
419
914
  positionalType: 'schema-name',
915
+ positionals: [
916
+ { name: 'source', type: 'schema-name' },
917
+ { name: 'name', optional: true },
918
+ ],
420
919
  flags: [
421
920
  COMMON_FLAGS.json,
422
921
  {
@@ -429,6 +928,7 @@ export const COMMAND_REGISTRY = [
429
928
  name: 'init',
430
929
  description: 'Create a new project-local schema',
431
930
  acceptsPositional: true,
931
+ positionals: [{ name: 'name' }],
432
932
  flags: [
433
933
  COMMON_FLAGS.json,
434
934
  {