@codewalla_india/openspec 1.3.0 → 1.3.2

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 (333) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +272 -230
  3. package/bin/openspec.js +5 -5
  4. package/dist/cli/index.js +99 -62
  5. package/dist/commands/change.d.ts +0 -2
  6. package/dist/commands/change.js +107 -86
  7. package/dist/commands/config.js +14 -16
  8. package/dist/commands/doctor.js +9 -4
  9. package/dist/commands/feedback.js +79 -30
  10. package/dist/commands/modify.d.ts +26 -0
  11. package/dist/commands/modify.js +147 -0
  12. package/dist/commands/schema.js +170 -91
  13. package/dist/commands/show.js +5 -2
  14. package/dist/commands/spec.js +49 -29
  15. package/dist/commands/store.js +15 -21
  16. package/dist/commands/validate.d.ts +8 -0
  17. package/dist/commands/validate.js +43 -20
  18. package/dist/commands/workflow/index.d.ts +2 -2
  19. package/dist/commands/workflow/index.js +1 -1
  20. package/dist/commands/workflow/instructions.d.ts +6 -26
  21. package/dist/commands/workflow/instructions.js +183 -376
  22. package/dist/commands/workflow/new-change.d.ts +0 -4
  23. package/dist/commands/workflow/new-change.js +10 -28
  24. package/dist/commands/workflow/shared.d.ts +34 -19
  25. package/dist/commands/workflow/shared.js +34 -4
  26. package/dist/commands/workflow/status.js +10 -32
  27. package/dist/commands/workflow/templates.js +15 -5
  28. package/dist/commands/workset.d.ts +2 -2
  29. package/dist/commands/workset.js +19 -22
  30. package/dist/comprehension-quiz/fingerprint.d.ts +39 -0
  31. package/dist/comprehension-quiz/fingerprint.js +84 -0
  32. package/dist/comprehension-quiz/index.d.ts +42 -0
  33. package/dist/comprehension-quiz/index.js +47 -0
  34. package/dist/comprehension-quiz/pass-record.d.ts +44 -0
  35. package/dist/comprehension-quiz/pass-record.js +98 -0
  36. package/dist/comprehension-quiz/providers/anthropic.d.ts +34 -0
  37. package/dist/comprehension-quiz/providers/anthropic.js +53 -0
  38. package/dist/comprehension-quiz/providers/factory.d.ts +44 -0
  39. package/dist/comprehension-quiz/providers/factory.js +174 -0
  40. package/dist/comprehension-quiz/providers/interface.d.ts +59 -0
  41. package/dist/comprehension-quiz/providers/interface.js +63 -0
  42. package/dist/comprehension-quiz/providers/local.d.ts +34 -0
  43. package/dist/comprehension-quiz/providers/local.js +53 -0
  44. package/dist/comprehension-quiz/providers/ollama.d.ts +34 -0
  45. package/dist/comprehension-quiz/providers/ollama.js +53 -0
  46. package/dist/comprehension-quiz/providers/openai.d.ts +34 -0
  47. package/dist/comprehension-quiz/providers/openai.js +53 -0
  48. package/dist/comprehension-quiz/question-generator.d.ts +69 -0
  49. package/dist/comprehension-quiz/question-generator.js +141 -0
  50. package/dist/comprehension-quiz/quiz-executor.d.ts +70 -0
  51. package/dist/comprehension-quiz/quiz-executor.js +165 -0
  52. package/dist/comprehension-quiz/types.d.ts +115 -0
  53. package/dist/comprehension-quiz/types.js +11 -0
  54. package/dist/core/archive.d.ts +14 -1
  55. package/dist/core/archive.js +1350 -190
  56. package/dist/core/artifact-graph/graph.d.ts +28 -9
  57. package/dist/core/artifact-graph/graph.js +94 -43
  58. package/dist/core/artifact-graph/index.d.ts +1 -1
  59. package/dist/core/artifact-graph/index.js +1 -1
  60. package/dist/core/artifact-graph/instruction-loader.d.ts +30 -3
  61. package/dist/core/artifact-graph/instruction-loader.js +70 -12
  62. package/dist/core/artifact-graph/outputs.d.ts +1 -0
  63. package/dist/core/artifact-graph/outputs.js +67 -5
  64. package/dist/core/artifact-graph/resolver.d.ts +14 -0
  65. package/dist/core/artifact-graph/resolver.js +69 -15
  66. package/dist/core/artifact-graph/types.js +21 -3
  67. package/dist/core/available-tools.d.ts +2 -2
  68. package/dist/core/available-tools.js +14 -3
  69. package/dist/core/change-metadata/schema.d.ts +2 -0
  70. package/dist/core/change-metadata/schema.js +13 -0
  71. package/dist/core/change-status-policy.d.ts +10 -1
  72. package/dist/core/change-status-policy.js +30 -2
  73. package/dist/core/command-generation/adapters/amazon-q.d.ts +4 -0
  74. package/dist/core/command-generation/adapters/amazon-q.js +11 -5
  75. package/dist/core/command-generation/adapters/antigravity.js +6 -5
  76. package/dist/core/command-generation/adapters/auggie.js +7 -6
  77. package/dist/core/command-generation/adapters/bob.d.ts +5 -1
  78. package/dist/core/command-generation/adapters/bob.js +11 -10
  79. package/dist/core/command-generation/adapters/claude.d.ts +1 -1
  80. package/dist/core/command-generation/adapters/claude.js +12 -17
  81. package/dist/core/command-generation/adapters/cline.js +5 -5
  82. package/dist/core/command-generation/adapters/codebuddy.js +8 -7
  83. package/dist/core/command-generation/adapters/continue.js +8 -7
  84. package/dist/core/command-generation/adapters/costrict.js +7 -6
  85. package/dist/core/command-generation/adapters/crush.js +9 -9
  86. package/dist/core/command-generation/adapters/cursor.js +8 -8
  87. package/dist/core/command-generation/adapters/devin.d.ts +19 -0
  88. package/dist/core/command-generation/adapters/devin.js +36 -0
  89. package/dist/core/command-generation/adapters/factory.js +7 -6
  90. package/dist/core/command-generation/adapters/gemini.js +40 -5
  91. package/dist/core/command-generation/adapters/github-copilot.js +6 -5
  92. package/dist/core/command-generation/adapters/iflow.js +9 -8
  93. package/dist/core/command-generation/adapters/index.d.ts +4 -2
  94. package/dist/core/command-generation/adapters/index.js +4 -2
  95. package/dist/core/command-generation/adapters/junie.js +6 -5
  96. package/dist/core/command-generation/adapters/kilocode.js +1 -1
  97. package/dist/core/command-generation/adapters/kiro.js +6 -5
  98. package/dist/core/command-generation/adapters/lingma.js +9 -9
  99. package/dist/core/command-generation/adapters/oh-my-pi.d.ts +21 -0
  100. package/dist/core/command-generation/adapters/oh-my-pi.js +42 -0
  101. package/dist/core/command-generation/adapters/opencode.js +6 -8
  102. package/dist/core/command-generation/adapters/pi.d.ts +2 -2
  103. package/dist/core/command-generation/adapters/pi.js +7 -10
  104. package/dist/core/command-generation/adapters/qoder.js +9 -9
  105. package/dist/core/command-generation/adapters/qwen.d.ts +7 -3
  106. package/dist/core/command-generation/adapters/qwen.js +14 -9
  107. package/dist/core/command-generation/adapters/roocode.d.ts +4 -4
  108. package/dist/core/command-generation/adapters/roocode.js +9 -9
  109. package/dist/core/command-generation/adapters/trae.d.ts +13 -0
  110. package/dist/core/command-generation/adapters/trae.js +28 -0
  111. package/dist/core/command-generation/adapters/zcode.d.ts +16 -0
  112. package/dist/core/command-generation/adapters/zcode.js +33 -0
  113. package/dist/core/command-generation/generator.d.ts +8 -0
  114. package/dist/core/command-generation/generator.js +15 -1
  115. package/dist/core/command-generation/index.d.ts +1 -1
  116. package/dist/core/command-generation/index.js +1 -1
  117. package/dist/core/command-generation/invocation.d.ts +73 -0
  118. package/dist/core/command-generation/invocation.js +77 -0
  119. package/dist/core/command-generation/registry.js +8 -4
  120. package/dist/core/command-generation/types.d.ts +9 -2
  121. package/dist/core/command-generation/yaml.d.ts +20 -6
  122. package/dist/core/command-generation/yaml.js +31 -21
  123. package/dist/core/command-surface.d.ts +15 -0
  124. package/dist/core/command-surface.js +33 -0
  125. package/dist/core/completions/command-registry.js +16 -61
  126. package/dist/core/completions/generators/bash-generator.js +41 -41
  127. package/dist/core/completions/generators/fish-generator.js +7 -7
  128. package/dist/core/completions/generators/powershell-generator.js +44 -37
  129. package/dist/core/completions/generators/zsh-generator.js +33 -33
  130. package/dist/core/completions/installers/zsh-installer.d.ts +9 -0
  131. package/dist/core/completions/installers/zsh-installer.js +20 -4
  132. package/dist/core/completions/templates/bash-templates.js +24 -24
  133. package/dist/core/completions/templates/fish-templates.js +38 -38
  134. package/dist/core/completions/templates/powershell-templates.js +28 -28
  135. package/dist/core/completions/templates/zsh-templates.js +39 -39
  136. package/dist/core/config-prompts.d.ts +1 -1
  137. package/dist/core/config-prompts.js +14 -1
  138. package/dist/core/config-schema.d.ts +10 -1
  139. package/dist/core/config-schema.js +67 -1
  140. package/dist/core/config.d.ts +15 -0
  141. package/dist/core/config.js +46 -5
  142. package/dist/core/file-state.js +56 -24
  143. package/dist/core/github-copilot/cloud-agent.d.ts +95 -0
  144. package/dist/core/github-copilot/cloud-agent.js +497 -0
  145. package/dist/core/global-config.d.ts +16 -0
  146. package/dist/core/init.d.ts +58 -0
  147. package/dist/core/init.js +474 -73
  148. package/dist/core/legacy-cleanup.d.ts +59 -0
  149. package/dist/core/legacy-cleanup.js +253 -24
  150. package/dist/core/list.js +23 -16
  151. package/dist/core/migration.d.ts +73 -1
  152. package/dist/core/migration.js +360 -11
  153. package/dist/core/modify/conflict-detector.d.ts +26 -0
  154. package/dist/core/modify/conflict-detector.js +62 -0
  155. package/dist/core/modify/dependency-propagator.d.ts +38 -0
  156. package/dist/core/modify/dependency-propagator.js +103 -0
  157. package/dist/core/modify/history-tracker.d.ts +34 -0
  158. package/dist/core/modify/history-tracker.js +114 -0
  159. package/dist/core/modify/index.d.ts +7 -0
  160. package/dist/core/modify/index.js +7 -0
  161. package/dist/core/onboarding-commands.d.ts +30 -0
  162. package/dist/core/onboarding-commands.js +38 -0
  163. package/dist/core/openspec-root.js +18 -15
  164. package/dist/core/parsers/change-parser.d.ts +17 -2
  165. package/dist/core/parsers/change-parser.js +35 -21
  166. package/dist/core/parsers/code-fence.d.ts +15 -0
  167. package/dist/core/parsers/code-fence.js +49 -0
  168. package/dist/core/parsers/markdown-parser.d.ts +0 -3
  169. package/dist/core/parsers/markdown-parser.js +7 -60
  170. package/dist/core/parsers/requirement-blocks.d.ts +29 -0
  171. package/dist/core/parsers/requirement-blocks.js +150 -31
  172. package/dist/core/parsers/requirement-text.d.ts +48 -0
  173. package/dist/core/parsers/requirement-text.js +98 -0
  174. package/dist/core/parsers/spec-structure.d.ts +1 -1
  175. package/dist/core/parsers/spec-structure.js +20 -30
  176. package/dist/core/profile-sync-drift.d.ts +0 -8
  177. package/dist/core/profile-sync-drift.js +49 -50
  178. package/dist/core/profiles.d.ts +2 -2
  179. package/dist/core/profiles.js +2 -2
  180. package/dist/core/project-config.d.ts +27 -18
  181. package/dist/core/project-config.js +101 -34
  182. package/dist/core/references.js +42 -4
  183. package/dist/core/relationship-health.d.ts +8 -0
  184. package/dist/core/relationship-health.js +13 -0
  185. package/dist/core/root-selection.d.ts +9 -6
  186. package/dist/core/root-selection.js +42 -5
  187. package/dist/core/schemas/base.schema.js +7 -2
  188. package/dist/core/shared/allowed-tools.d.ts +12 -0
  189. package/dist/core/shared/allowed-tools.js +12 -0
  190. package/dist/core/shared/index.d.ts +1 -0
  191. package/dist/core/shared/index.js +1 -0
  192. package/dist/core/shared/skill-content-equivalence.d.ts +7 -0
  193. package/dist/core/shared/skill-content-equivalence.js +41 -0
  194. package/dist/core/shared/skill-generation.js +17 -13
  195. package/dist/core/shared/skill-paths.d.ts +13 -0
  196. package/dist/core/shared/skill-paths.js +23 -0
  197. package/dist/core/shared/tool-detection.d.ts +27 -7
  198. package/dist/core/shared/tool-detection.js +167 -37
  199. package/dist/core/shared-skill-target.d.ts +16 -0
  200. package/dist/core/shared-skill-target.js +156 -0
  201. package/dist/core/specs-apply.d.ts +80 -33
  202. package/dist/core/specs-apply.js +667 -145
  203. package/dist/core/store/git.d.ts +13 -0
  204. package/dist/core/store/git.js +24 -0
  205. package/dist/core/store/operations.js +20 -0
  206. package/dist/core/templates/skill-templates.d.ts +3 -2
  207. package/dist/core/templates/skill-templates.js +3 -2
  208. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  209. package/dist/core/templates/workflows/apply-change.js +186 -323
  210. package/dist/core/templates/workflows/archive-change.js +387 -260
  211. package/dist/core/templates/workflows/bulk-archive-change.js +655 -475
  212. package/dist/core/templates/workflows/continue-change.js +210 -219
  213. package/dist/core/templates/workflows/explore.js +479 -443
  214. package/dist/core/templates/workflows/feedback.js +97 -97
  215. package/dist/core/templates/workflows/ff-change.js +200 -191
  216. package/dist/core/templates/workflows/modify-change.d.ts +4 -1
  217. package/dist/core/templates/workflows/modify-change.js +237 -115
  218. package/dist/core/templates/workflows/new-change.js +127 -134
  219. package/dist/core/templates/workflows/onboard.js +548 -542
  220. package/dist/core/templates/workflows/propose.js +273 -217
  221. package/dist/core/templates/workflows/store-selection.d.ts +1 -1
  222. package/dist/core/templates/workflows/store-selection.js +1 -1
  223. package/dist/core/templates/workflows/sync-specs.js +500 -273
  224. package/dist/core/templates/workflows/update-change.d.ts +10 -0
  225. package/dist/core/templates/workflows/update-change.js +177 -0
  226. package/dist/core/templates/workflows/verify-change.js +324 -326
  227. package/dist/core/update.d.ts +40 -5
  228. package/dist/core/update.js +411 -96
  229. package/dist/core/validation/constants.d.ts +4 -1
  230. package/dist/core/validation/constants.js +4 -1
  231. package/dist/core/validation/plan-validator.d.ts +8 -0
  232. package/dist/core/validation/plan-validator.js +45 -0
  233. package/dist/core/validation/task-numbering.d.ts +16 -0
  234. package/dist/core/validation/task-numbering.js +57 -0
  235. package/dist/core/validation/validator.d.ts +27 -3
  236. package/dist/core/validation/validator.js +337 -48
  237. package/dist/core/version-check.d.ts +152 -0
  238. package/dist/core/version-check.js +731 -0
  239. package/dist/core/view.js +13 -18
  240. package/dist/prompts/searchable-multi-select.js +1 -1
  241. package/dist/telemetry/caller-detection.d.ts +27 -0
  242. package/dist/telemetry/caller-detection.js +85 -0
  243. package/dist/telemetry/caller-detection.test.d.ts +5 -0
  244. package/dist/telemetry/config.d.ts +48 -2
  245. package/dist/telemetry/config.js +113 -11
  246. package/dist/telemetry/config.test.d.ts +5 -0
  247. package/dist/telemetry/deduplication.d.ts +35 -0
  248. package/dist/telemetry/deduplication.js +82 -0
  249. package/dist/telemetry/deduplication.test.d.ts +5 -0
  250. package/dist/telemetry/identity.d.ts +62 -22
  251. package/dist/telemetry/identity.js +147 -102
  252. package/dist/telemetry/index.d.ts +126 -15
  253. package/dist/telemetry/index.js +569 -37
  254. package/dist/telemetry/sanitization.d.ts +40 -0
  255. package/dist/telemetry/sanitization.js +114 -0
  256. package/dist/telemetry/sanitization.test.d.ts +5 -0
  257. package/dist/telemetry/throttling.d.ts +20 -0
  258. package/dist/telemetry/throttling.js +70 -0
  259. package/dist/ui/welcome-screen.d.ts +9 -1
  260. package/dist/ui/welcome-screen.js +91 -38
  261. package/dist/utils/change-metadata.d.ts +43 -0
  262. package/dist/utils/change-metadata.js +123 -7
  263. package/dist/utils/change-utils.d.ts +10 -4
  264. package/dist/utils/change-utils.js +20 -13
  265. package/dist/utils/ci.d.ts +12 -0
  266. package/dist/utils/ci.js +16 -0
  267. package/dist/utils/command-references.d.ts +92 -6
  268. package/dist/utils/command-references.js +180 -7
  269. package/dist/utils/date.d.ts +8 -0
  270. package/dist/utils/date.js +13 -0
  271. package/dist/utils/file-system.d.ts +10 -0
  272. package/dist/utils/file-system.js +70 -0
  273. package/dist/utils/index.d.ts +1 -1
  274. package/dist/utils/index.js +1 -1
  275. package/dist/utils/interactive.d.ts +23 -0
  276. package/dist/utils/interactive.js +32 -0
  277. package/dist/utils/item-discovery.d.ts +19 -0
  278. package/dist/utils/item-discovery.js +30 -48
  279. package/dist/utils/shell-detection.d.ts +1 -1
  280. package/dist/utils/shell-detection.js +64 -11
  281. package/dist/utils/spec-discovery.d.ts +40 -0
  282. package/dist/utils/spec-discovery.js +115 -0
  283. package/dist/utils/task-progress.d.ts +29 -1
  284. package/dist/utils/task-progress.js +109 -15
  285. package/package.json +96 -84
  286. package/schemas/spec-driven/schema.yaml +252 -184
  287. package/schemas/spec-driven/templates/design.md +19 -19
  288. package/schemas/spec-driven/templates/plan-template.md +91 -0
  289. package/schemas/spec-driven/templates/proposal.md +29 -24
  290. package/schemas/spec-driven/templates/spec.md +11 -8
  291. package/schemas/spec-driven/templates/tasks.md +9 -9
  292. package/scripts/postinstall.js +83 -83
  293. package/dist/core/command-generation/adapters/codex.d.ts +0 -16
  294. package/dist/core/command-generation/adapters/codex.js +0 -39
  295. package/dist/core/command-generation/adapters/windsurf.d.ts +0 -14
  296. package/dist/core/command-generation/adapters/windsurf.js +0 -38
  297. package/dist/core/comprehension/config.d.ts +0 -20
  298. package/dist/core/comprehension/config.js +0 -23
  299. package/dist/core/comprehension/fingerprint.d.ts +0 -14
  300. package/dist/core/comprehension/fingerprint.js +0 -33
  301. package/dist/core/comprehension/index.d.ts +0 -57
  302. package/dist/core/comprehension/index.js +0 -87
  303. package/dist/core/comprehension/pass-record.d.ts +0 -29
  304. package/dist/core/comprehension/pass-record.js +0 -64
  305. package/dist/core/comprehension/stats.d.ts +0 -35
  306. package/dist/core/comprehension/stats.js +0 -133
  307. package/dist/core/templates/workflows/comprehension-guidance.d.ts +0 -9
  308. package/dist/core/templates/workflows/comprehension-guidance.js +0 -71
  309. package/dist/core/templates/workflows/mcp-guidance.d.ts +0 -13
  310. package/dist/core/templates/workflows/mcp-guidance.js +0 -131
  311. package/dist/core/templates/workflows/user-prompt-guidance.d.ts +0 -16
  312. package/dist/core/templates/workflows/user-prompt-guidance.js +0 -48
  313. package/dist/telemetry/caller.d.ts +0 -5
  314. package/dist/telemetry/caller.js +0 -29
  315. package/dist/telemetry/client.d.ts +0 -27
  316. package/dist/telemetry/client.js +0 -127
  317. package/dist/telemetry/command-context.d.ts +0 -13
  318. package/dist/telemetry/command-context.js +0 -59
  319. package/dist/telemetry/comprehension.d.ts +0 -44
  320. package/dist/telemetry/comprehension.js +0 -105
  321. package/dist/telemetry/content.d.ts +0 -10
  322. package/dist/telemetry/content.js +0 -56
  323. package/dist/telemetry/git-stats.d.ts +0 -12
  324. package/dist/telemetry/git-stats.js +0 -69
  325. package/dist/telemetry/identify-cache.d.ts +0 -7
  326. package/dist/telemetry/identify-cache.js +0 -47
  327. package/dist/telemetry/input.d.ts +0 -17
  328. package/dist/telemetry/input.js +0 -68
  329. package/dist/telemetry/marker.d.ts +0 -37
  330. package/dist/telemetry/marker.js +0 -67
  331. package/dist/telemetry/workflow.d.ts +0 -85
  332. package/dist/telemetry/workflow.js +0 -318
  333. package/schemas/spec-driven/templates/plan.md +0 -19
@@ -1,19 +1,19 @@
1
- ## Context
2
-
3
- <!-- Background and current state -->
4
-
5
- ## Goals / Non-Goals
6
-
7
- **Goals:**
8
- <!-- What this design aims to achieve -->
9
-
10
- **Non-Goals:**
11
- <!-- What is explicitly out of scope -->
12
-
13
- ## Decisions
14
-
15
- <!-- Key design decisions and rationale -->
16
-
17
- ## Risks / Trade-offs
18
-
19
- <!-- Known risks and trade-offs -->
1
+ ## Context
2
+
3
+ <!-- Current state and constraints that shape the approach. See proposal.md for motivation - don't restate it -->
4
+
5
+ ## Goals / Non-Goals
6
+
7
+ **Goals:**
8
+ <!-- What this design aims to achieve -->
9
+
10
+ **Non-Goals:**
11
+ <!-- What is explicitly out of scope -->
12
+
13
+ ## Decisions
14
+
15
+ <!-- Key design decisions with rationale and alternatives considered -->
16
+
17
+ ## Risks / Trade-offs
18
+
19
+ <!-- Known risks and trade-offs -->
@@ -0,0 +1,91 @@
1
+ ## Code Map
2
+
3
+ <!-- List all files that will be created, modified, or deleted for this change -->
4
+
5
+ ### Files to Create
6
+ <!-- List new files to be created with brief descriptions -->
7
+ <!-- Example:
8
+ - `src/core/new-feature.ts` - Core implementation of new feature
9
+ - `src/core/new-feature.test.ts` - Unit tests for new feature
10
+ -->
11
+
12
+ ### Files to Modify
13
+ <!-- List existing files that will be modified with brief descriptions -->
14
+ <!-- Example:
15
+ - `src/core/index.ts` - Export new feature module
16
+ - `src/cli/commands.ts` - Add CLI command for new feature
17
+ -->
18
+
19
+ ### Files to Delete
20
+ <!-- List files that will be removed (if any) -->
21
+ <!-- Example:
22
+ - `src/legacy/old-feature.ts` - Remove deprecated feature
23
+ -->
24
+
25
+ ## Implementation Order
26
+
27
+ <!-- Sequence the implementation work at file/module level -->
28
+ <!-- Use numbered steps with file references in parentheses -->
29
+ <!-- Example:
30
+
31
+ 1. **Core Implementation** (new-feature.ts)
32
+ - Implement primary data structures
33
+ - Add main function logic
34
+ - Handle edge cases
35
+
36
+ 2. **CLI Integration** (commands.ts)
37
+ - Add command registration
38
+ - Implement command handler
39
+ - Add help text
40
+
41
+ 3. **Testing** (new-feature.test.ts)
42
+ - Write unit tests
43
+ - Add integration tests
44
+ - Verify coverage
45
+ -->
46
+
47
+ ## Test Plan
48
+
49
+ <!-- Describe how to verify the change -->
50
+ <!-- Include test types: unit, integration, e2e, manual -->
51
+ <!-- Example:
52
+
53
+ ### Unit Tests
54
+ - Test core function with valid inputs
55
+ - Test error handling for invalid inputs
56
+ - Test edge cases
57
+
58
+ ### Integration Tests
59
+ - Test CLI command with real filesystem
60
+ - Test integration with existing modules
61
+
62
+ ### Manual Tests
63
+ - Verify CLI command works as expected
64
+ - Check error messages are clear
65
+ -->
66
+
67
+ ## Risks
68
+
69
+ <!-- Identify known risks with mitigations -->
70
+ <!-- Format: [Risk] → Mitigation -->
71
+ <!-- Example:
72
+
73
+ **Breaking Change Risk**
74
+ - [Risk] Existing users may rely on old behavior
75
+ - [Mitigation] Provide migration guide, add deprecation warning
76
+
77
+ **Performance Risk**
78
+ - [Risk] New feature may slow down existing operations
79
+ - [Mitigation] Add performance tests, optimize hot paths
80
+ -->
81
+
82
+ ## Done Definition
83
+
84
+ <!-- Define objective criteria for completion -->
85
+ <!-- Example:
86
+ - All unit tests passing
87
+ - All integration tests passing
88
+ - Documentation updated
89
+ - Error messages are clear and actionable
90
+ - Performance requirements met
91
+ -->
@@ -1,24 +1,29 @@
1
- ## Why
2
-
3
- <!-- Explain the motivation for this change. What problem does this solve? Why now? -->
4
-
5
- ## What Changes
6
-
7
- <!-- Describe what will change. Be specific about new capabilities, modifications, or removals. -->
8
-
9
- ## Capabilities
10
-
11
- ### New Capabilities
12
- <!-- Capabilities being introduced. Replace <name> with kebab-case identifier (e.g., user-auth, data-export, api-rate-limiting). Each creates specs/<name>/spec.md -->
13
- - `<name>`: <brief description of what this capability covers>
14
-
15
- ### Modified Capabilities
16
- <!-- Existing capabilities whose REQUIREMENTS are changing (not just implementation).
17
- Only list here if spec-level behavior changes. Each needs a delta spec file.
18
- Use existing spec names from openspec/specs/. Leave empty if no requirement changes. -->
19
- - `<existing-name>`: <what requirement is changing>
20
-
21
- ## Impact
22
-
23
- <!-- Affected code, APIs, dependencies, systems -->
24
- <!-- If this change maps to a Jira ticket, note it here (e.g., Jira: CW-1234). Do NOT use the ticket key as a capability name. -->
1
+ ## Why
2
+
3
+ <!-- Explain the motivation for this change. What problem does this solve? Why now? -->
4
+
5
+ ## What Changes
6
+
7
+ <!-- Describe what will change. Be specific about new capabilities, modifications, or removals. -->
8
+
9
+ ## Capabilities
10
+
11
+ ### New Capabilities
12
+ <!-- Capabilities being introduced. Use kebab-case for path segments you introduce
13
+ (e.g., user-auth or identity/user-auth) that follow the project's existing
14
+ spec organization. Each creates specs/<capability-path>/spec.md. -->
15
+ - `<capability-path>`: <brief description of what this capability covers>
16
+
17
+ ### Modified Capabilities
18
+ <!-- Existing capabilities whose REQUIREMENTS are changing (not just implementation).
19
+ Only list here if spec-level behavior changes. Each needs a delta spec file.
20
+ Use the exact existing path under openspec/specs/. Leave empty if no requirement
21
+ changes. A change with no capabilities at all (pure refactor, tooling, docs)
22
+ must set `skip_specs: true` in its .openspec.yaml - openspec validate rejects
23
+ a zero-delta change without that marker. Do not invent a requirement just to
24
+ satisfy validation. -->
25
+ - `<existing-capability-path>`: <what requirement is changing>
26
+
27
+ ## Impact
28
+
29
+ <!-- Affected code, APIs, dependencies, systems -->
@@ -1,8 +1,11 @@
1
- ## ADDED Requirements
2
-
3
- ### Requirement: <!-- requirement name -->
4
- <!-- requirement text -->
5
-
6
- #### Scenario: <!-- scenario name -->
7
- - **WHEN** <!-- condition -->
8
- - **THEN** <!-- expected outcome -->
1
+ ## Purpose
2
+ <!-- New capabilities only: one or two sentences (50+ characters) on what this capability is for. Delete this section for an existing capability. -->
3
+
4
+ ## ADDED Requirements
5
+
6
+ ### Requirement: <!-- requirement name -->
7
+ <!-- requirement text -->
8
+
9
+ #### Scenario: <!-- scenario name -->
10
+ - **WHEN** <!-- condition -->
11
+ - **THEN** <!-- expected outcome -->
@@ -1,9 +1,9 @@
1
- ## 1. <!-- Task Group Name -->
2
-
3
- - [ ] 1.1 <!-- Task description -->
4
- - [ ] 1.2 <!-- Task description -->
5
-
6
- ## 2. <!-- Task Group Name -->
7
-
8
- - [ ] 2.1 <!-- Task description -->
9
- - [ ] 2.2 <!-- Task description -->
1
+ ## 1. <!-- Task Group Name -->
2
+
3
+ - [ ] 1.1 <!-- Task description -->
4
+ - [ ] 1.2 <!-- Task description -->
5
+
6
+ ## 2. <!-- Task Group Name -->
7
+
8
+ - [ ] 2.1 <!-- Task description -->
9
+ - [ ] 2.2 <!-- Task description -->
@@ -1,83 +1,83 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Postinstall script that hints about shell completions
5
- *
6
- * Completion installation is opt-in: the user must run
7
- * `openspec completion install` explicitly. This script only
8
- * prints a one-line tip after npm install.
9
- *
10
- * The tip is suppressed when:
11
- * - CI=true environment variable is set
12
- * - OPENSPEC_NO_COMPLETIONS=1 environment variable is set
13
- * - dist/ directory doesn't exist (dev setup scenario)
14
- *
15
- * The script never fails npm install - all errors are caught and handled gracefully.
16
- */
17
-
18
- import { promises as fs } from 'fs';
19
- import path from 'path';
20
- import { fileURLToPath } from 'url';
21
-
22
- const __filename = fileURLToPath(import.meta.url);
23
- const __dirname = path.dirname(__filename);
24
-
25
- /**
26
- * Check if we should skip installation
27
- */
28
- function shouldSkipInstallation() {
29
- // Skip in CI environments
30
- if (process.env.CI === 'true' || process.env.CI === '1') {
31
- return { skip: true, reason: 'CI environment detected' };
32
- }
33
-
34
- // Skip if user opted out
35
- if (process.env.OPENSPEC_NO_COMPLETIONS === '1') {
36
- return { skip: true, reason: 'OPENSPEC_NO_COMPLETIONS=1 set' };
37
- }
38
-
39
- return { skip: false };
40
- }
41
-
42
- /**
43
- * Check if dist/ directory exists
44
- */
45
- async function distExists() {
46
- const distPath = path.join(__dirname, '..', 'dist');
47
- try {
48
- const stat = await fs.stat(distPath);
49
- return stat.isDirectory();
50
- } catch {
51
- return false;
52
- }
53
- }
54
-
55
- /**
56
- * Main function
57
- */
58
- async function main() {
59
- try {
60
- // Check if we should skip
61
- const skipCheck = shouldSkipInstallation();
62
- if (skipCheck.skip) {
63
- // Silent skip - no output
64
- return;
65
- }
66
-
67
- // Check if dist/ exists (skip silently if not - expected during dev setup)
68
- if (!(await distExists())) {
69
- return;
70
- }
71
-
72
- // Completions are opt-in — just print a hint
73
- console.log(`\nTip: Run 'openspec completion install' for shell completions`);
74
- } catch (error) {
75
- // Fail gracefully - never break npm install
76
- }
77
- }
78
-
79
- // Run main and handle any unhandled errors
80
- main().catch(() => {
81
- // Silent failure - never break npm install
82
- process.exit(0);
83
- });
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Postinstall script that hints about shell completions
5
+ *
6
+ * Completion installation is opt-in: the user must run
7
+ * `openspec completion install` explicitly. This script only
8
+ * prints a one-line tip after npm install.
9
+ *
10
+ * The tip is suppressed when:
11
+ * - CI=true environment variable is set
12
+ * - OPENSPEC_NO_COMPLETIONS=1 environment variable is set
13
+ * - dist/ directory doesn't exist (dev setup scenario)
14
+ *
15
+ * The script never fails npm install - all errors are caught and handled gracefully.
16
+ */
17
+
18
+ import { promises as fs } from 'fs';
19
+ import path from 'path';
20
+ import { fileURLToPath } from 'url';
21
+
22
+ const __filename = fileURLToPath(import.meta.url);
23
+ const __dirname = path.dirname(__filename);
24
+
25
+ /**
26
+ * Check if we should skip installation
27
+ */
28
+ function shouldSkipInstallation() {
29
+ // Skip in CI environments
30
+ if (process.env.CI === 'true' || process.env.CI === '1') {
31
+ return { skip: true, reason: 'CI environment detected' };
32
+ }
33
+
34
+ // Skip if user opted out
35
+ if (process.env.OPENSPEC_NO_COMPLETIONS === '1') {
36
+ return { skip: true, reason: 'OPENSPEC_NO_COMPLETIONS=1 set' };
37
+ }
38
+
39
+ return { skip: false };
40
+ }
41
+
42
+ /**
43
+ * Check if dist/ directory exists
44
+ */
45
+ async function distExists() {
46
+ const distPath = path.join(__dirname, '..', 'dist');
47
+ try {
48
+ const stat = await fs.stat(distPath);
49
+ return stat.isDirectory();
50
+ } catch {
51
+ return false;
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Main function
57
+ */
58
+ async function main() {
59
+ try {
60
+ // Check if we should skip
61
+ const skipCheck = shouldSkipInstallation();
62
+ if (skipCheck.skip) {
63
+ // Silent skip - no output
64
+ return;
65
+ }
66
+
67
+ // Check if dist/ exists (skip silently if not - expected during dev setup)
68
+ if (!(await distExists())) {
69
+ return;
70
+ }
71
+
72
+ // Completions are opt-in — just print a hint
73
+ console.log(`\nTip: Run 'openspec completion install' for shell completions`);
74
+ } catch (error) {
75
+ // Fail gracefully - never break npm install
76
+ }
77
+ }
78
+
79
+ // Run main and handle any unhandled errors
80
+ main().catch(() => {
81
+ // Silent failure - never break npm install
82
+ process.exit(0);
83
+ });
@@ -1,16 +0,0 @@
1
- /**
2
- * Codex Command Adapter
3
- *
4
- * Formats commands for Codex following its frontmatter specification.
5
- * Codex custom prompts live in the global home directory (~/.codex/prompts/)
6
- * and are not shared through the repository. The CODEX_HOME env var can
7
- * override the default ~/.codex location.
8
- */
9
- import type { ToolCommandAdapter } from '../types.js';
10
- /**
11
- * Codex adapter for command generation.
12
- * File path: <CODEX_HOME>/prompts/opsx-<id>.md (absolute, global)
13
- * Frontmatter: description, argument-hint
14
- */
15
- export declare const codexAdapter: ToolCommandAdapter;
16
- //# sourceMappingURL=codex.d.ts.map
@@ -1,39 +0,0 @@
1
- /**
2
- * Codex Command Adapter
3
- *
4
- * Formats commands for Codex following its frontmatter specification.
5
- * Codex custom prompts live in the global home directory (~/.codex/prompts/)
6
- * and are not shared through the repository. The CODEX_HOME env var can
7
- * override the default ~/.codex location.
8
- */
9
- import os from 'os';
10
- import path from 'path';
11
- /**
12
- * Returns the Codex home directory.
13
- * Respects the CODEX_HOME env var, defaulting to ~/.codex.
14
- */
15
- function getCodexHome() {
16
- const envHome = process.env.CODEX_HOME?.trim();
17
- return path.resolve(envHome ? envHome : path.join(os.homedir(), '.codex'));
18
- }
19
- /**
20
- * Codex adapter for command generation.
21
- * File path: <CODEX_HOME>/prompts/opsx-<id>.md (absolute, global)
22
- * Frontmatter: description, argument-hint
23
- */
24
- export const codexAdapter = {
25
- toolId: 'codex',
26
- getFilePath(commandId) {
27
- return path.join(getCodexHome(), 'prompts', `opsx-${commandId}.md`);
28
- },
29
- formatFile(content) {
30
- return `---
31
- description: ${content.description}
32
- argument-hint: command arguments
33
- ---
34
-
35
- ${content.body}
36
- `;
37
- },
38
- };
39
- //# sourceMappingURL=codex.js.map
@@ -1,14 +0,0 @@
1
- /**
2
- * Windsurf Command Adapter
3
- *
4
- * Formats commands for Windsurf following its frontmatter specification.
5
- * Windsurf uses a similar format to Claude but may have different conventions.
6
- */
7
- import type { ToolCommandAdapter } from '../types.js';
8
- /**
9
- * Windsurf adapter for command generation.
10
- * File path: .windsurf/workflows/opsx-<id>.md
11
- * Frontmatter: name, description, category, tags
12
- */
13
- export declare const windsurfAdapter: ToolCommandAdapter;
14
- //# sourceMappingURL=windsurf.d.ts.map
@@ -1,38 +0,0 @@
1
- /**
2
- * Windsurf Command Adapter
3
- *
4
- * Formats commands for Windsurf following its frontmatter specification.
5
- * Windsurf uses a similar format to Claude but may have different conventions.
6
- */
7
- import path from 'path';
8
- import { escapeYamlValue } from '../yaml.js';
9
- /**
10
- * Formats a tags array as a YAML array with proper escaping.
11
- */
12
- function formatTagsArray(tags) {
13
- const escapedTags = tags.map((tag) => escapeYamlValue(tag));
14
- return `[${escapedTags.join(', ')}]`;
15
- }
16
- /**
17
- * Windsurf adapter for command generation.
18
- * File path: .windsurf/workflows/opsx-<id>.md
19
- * Frontmatter: name, description, category, tags
20
- */
21
- export const windsurfAdapter = {
22
- toolId: 'windsurf',
23
- getFilePath(commandId) {
24
- return path.join('.windsurf', 'workflows', `opsx-${commandId}.md`);
25
- },
26
- formatFile(content) {
27
- return `---
28
- name: ${escapeYamlValue(content.name)}
29
- description: ${escapeYamlValue(content.description)}
30
- category: ${escapeYamlValue(content.category)}
31
- tags: ${formatTagsArray(content.tags)}
32
- ---
33
-
34
- ${content.body}
35
- `;
36
- },
37
- };
38
- //# sourceMappingURL=windsurf.js.map
@@ -1,20 +0,0 @@
1
- import type { ProjectConfig } from '../project-config.js';
2
- export interface ComprehensionConfig {
3
- enabled: boolean;
4
- thresholdPercent: number;
5
- minQuestions: number;
6
- maxQuestions: number;
7
- }
8
- export declare const DEFAULT_COMPREHENSION_CONFIG: ComprehensionConfig;
9
- export interface ComprehensionConfigInput {
10
- enabled?: boolean;
11
- threshold_percent?: number;
12
- min_questions?: number;
13
- max_questions?: number;
14
- }
15
- /**
16
- * Resolve comprehension settings from project config.
17
- * Defaults apply when config is missing or fields are absent.
18
- */
19
- export declare function resolveComprehensionConfig(projectConfig: ProjectConfig | null | undefined): ComprehensionConfig;
20
- //# sourceMappingURL=config.d.ts.map
@@ -1,23 +0,0 @@
1
- export const DEFAULT_COMPREHENSION_CONFIG = {
2
- enabled: true,
3
- thresholdPercent: 80,
4
- minQuestions: 5,
5
- maxQuestions: 10,
6
- };
7
- /**
8
- * Resolve comprehension settings from project config.
9
- * Defaults apply when config is missing or fields are absent.
10
- */
11
- export function resolveComprehensionConfig(projectConfig) {
12
- const raw = projectConfig?.comprehension;
13
- if (!raw) {
14
- return { ...DEFAULT_COMPREHENSION_CONFIG };
15
- }
16
- return {
17
- enabled: raw.enabled ?? DEFAULT_COMPREHENSION_CONFIG.enabled,
18
- thresholdPercent: raw.thresholdPercent ?? DEFAULT_COMPREHENSION_CONFIG.thresholdPercent,
19
- minQuestions: raw.minQuestions ?? DEFAULT_COMPREHENSION_CONFIG.minQuestions,
20
- maxQuestions: raw.maxQuestions ?? DEFAULT_COMPREHENSION_CONFIG.maxQuestions,
21
- };
22
- }
23
- //# sourceMappingURL=config.js.map
@@ -1,14 +0,0 @@
1
- export interface ApplyArtifactFingerprintInput {
2
- specPaths: string[];
3
- tasksPath?: string | null;
4
- planPath?: string | null;
5
- }
6
- /**
7
- * SHA-256 fingerprint of delta specs and optional plan/tasks file contents.
8
- */
9
- export declare function fingerprintApplyArtifacts(input: ApplyArtifactFingerprintInput): string;
10
- /**
11
- * @deprecated Use fingerprintApplyArtifacts
12
- */
13
- export declare function fingerprintSpecFiles(specPaths: string[], tasksPath?: string | null): string;
14
- //# sourceMappingURL=fingerprint.d.ts.map
@@ -1,33 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { existsSync, readFileSync } from 'node:fs';
3
- function hashFileContent(hash, label, filePath) {
4
- hash.update(`${label}:`);
5
- hash.update(filePath);
6
- hash.update('\0');
7
- hash.update(readFileSync(filePath, 'utf-8'));
8
- hash.update('\0');
9
- }
10
- /**
11
- * SHA-256 fingerprint of delta specs and optional plan/tasks file contents.
12
- */
13
- export function fingerprintApplyArtifacts(input) {
14
- const sorted = [...input.specPaths].sort();
15
- const hash = createHash('sha256');
16
- for (const specPath of sorted) {
17
- hashFileContent(hash, 'spec', specPath);
18
- }
19
- if (input.planPath && existsSync(input.planPath)) {
20
- hashFileContent(hash, 'plan', input.planPath);
21
- }
22
- if (input.tasksPath && existsSync(input.tasksPath)) {
23
- hashFileContent(hash, 'tasks', input.tasksPath);
24
- }
25
- return hash.digest('hex');
26
- }
27
- /**
28
- * @deprecated Use fingerprintApplyArtifacts
29
- */
30
- export function fingerprintSpecFiles(specPaths, tasksPath) {
31
- return fingerprintApplyArtifacts({ specPaths, tasksPath });
32
- }
33
- //# sourceMappingURL=fingerprint.js.map
@@ -1,57 +0,0 @@
1
- import type { ProjectConfig } from '../project-config.js';
2
- import { type ComprehensionPassRecord } from './pass-record.js';
3
- import { OPTIONS_PER_QUESTION, type ArtifactPresence, type QuestionAllocation } from './stats.js';
4
- export { DEFAULT_COMPREHENSION_CONFIG, resolveComprehensionConfig, type ComprehensionConfig, } from './config.js';
5
- export { fingerprintApplyArtifacts, fingerprintSpecFiles } from './fingerprint.js';
6
- export { COMPREHENSION_PASS_FILENAME, COMPREHENSION_SESSION_FILENAME, buildPassRecord, deleteSessionRecord, isPassValid, readPassRecord, writePassRecord, type ComprehensionPassRecord, } from './pass-record.js';
7
- export { computeQuestionAllocation, computeQuestionCount, computeSpecStats, countSpecStats, OPTIONS_PER_QUESTION, type ArtifactPresence, type QuestionAllocation, type QuestionCategory, type SpecStats, } from './stats.js';
8
- export interface ComprehensionGateInfo {
9
- required: boolean;
10
- passed: boolean;
11
- thresholdPercent: number;
12
- bestScorePercent?: number;
13
- questionCount: number;
14
- questionAllocation: QuestionAllocation;
15
- optionsPerQuestion: number;
16
- requirementCount: number;
17
- scenarioCount: number;
18
- pendingTaskCount: number;
19
- attempts?: number;
20
- }
21
- export interface ComprehensionGateOptions {
22
- tasksPath?: string | null;
23
- planPath?: string | null;
24
- pendingTaskCount?: number;
25
- artifactPresence?: ArtifactPresence;
26
- }
27
- export interface ComprehensionGateResult {
28
- active: boolean;
29
- passed: boolean;
30
- info?: ComprehensionGateInfo;
31
- }
32
- /**
33
- * Evaluate whether apply is blocked by the comprehension gate.
34
- */
35
- export declare function checkComprehensionGate(changeDir: string, specPaths: string[], projectConfig: ProjectConfig | null | undefined, gateOptions?: ComprehensionGateOptions): ComprehensionGateResult;
36
- export declare class ComprehensionPassError extends Error {
37
- readonly score: number;
38
- readonly threshold: number;
39
- constructor(message: string, score: number, threshold: number);
40
- }
41
- /**
42
- * Record a comprehension pass after quiz success.
43
- */
44
- export declare function recordComprehensionPass(input: {
45
- changeDir: string;
46
- specPaths: string[];
47
- tasksPath?: string | null;
48
- planPath?: string | null;
49
- projectConfig: ProjectConfig | null | undefined;
50
- scorePercent: number;
51
- attempt: number;
52
- questionCount: number;
53
- pendingTaskCount?: number;
54
- artifactPresence?: ArtifactPresence;
55
- }): ComprehensionPassRecord;
56
- export { OPTIONS_PER_QUESTION as comprehensionOptionsPerQuestion };
57
- //# sourceMappingURL=index.d.ts.map