@superkou/openspec 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 (373) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +213 -0
  3. package/bin/openspec.js +5 -0
  4. package/dist/cli/index.d.ts +5 -0
  5. package/dist/cli/index.js +544 -0
  6. package/dist/commands/change.d.ts +35 -0
  7. package/dist/commands/change.js +277 -0
  8. package/dist/commands/completion.d.ts +72 -0
  9. package/dist/commands/completion.js +264 -0
  10. package/dist/commands/config.d.ts +36 -0
  11. package/dist/commands/config.js +611 -0
  12. package/dist/commands/context-store.d.ts +3 -0
  13. package/dist/commands/context-store.js +475 -0
  14. package/dist/commands/feedback.d.ts +9 -0
  15. package/dist/commands/feedback.js +183 -0
  16. package/dist/commands/initiative.d.ts +13 -0
  17. package/dist/commands/initiative.js +318 -0
  18. package/dist/commands/schema.d.ts +6 -0
  19. package/dist/commands/schema.js +869 -0
  20. package/dist/commands/show.d.ts +14 -0
  21. package/dist/commands/show.js +132 -0
  22. package/dist/commands/spec.d.ts +15 -0
  23. package/dist/commands/spec.js +225 -0
  24. package/dist/commands/validate.d.ts +24 -0
  25. package/dist/commands/validate.js +294 -0
  26. package/dist/commands/workflow/index.d.ts +19 -0
  27. package/dist/commands/workflow/index.js +13 -0
  28. package/dist/commands/workflow/initiative-link.d.ts +24 -0
  29. package/dist/commands/workflow/initiative-link.js +47 -0
  30. package/dist/commands/workflow/instructions.d.ts +29 -0
  31. package/dist/commands/workflow/instructions.js +344 -0
  32. package/dist/commands/workflow/new-change.d.ts +17 -0
  33. package/dist/commands/workflow/new-change.js +141 -0
  34. package/dist/commands/workflow/schemas.d.ts +10 -0
  35. package/dist/commands/workflow/schemas.js +34 -0
  36. package/dist/commands/workflow/set-change.d.ts +13 -0
  37. package/dist/commands/workflow/set-change.js +87 -0
  38. package/dist/commands/workflow/shared.d.ts +59 -0
  39. package/dist/commands/workflow/shared.js +116 -0
  40. package/dist/commands/workflow/status.d.ts +14 -0
  41. package/dist/commands/workflow/status.js +90 -0
  42. package/dist/commands/workflow/templates.d.ts +16 -0
  43. package/dist/commands/workflow/templates.js +69 -0
  44. package/dist/commands/workspace/context-status.d.ts +4 -0
  45. package/dist/commands/workspace/context-status.js +59 -0
  46. package/dist/commands/workspace/open-target-selection.d.ts +13 -0
  47. package/dist/commands/workspace/open-target-selection.js +146 -0
  48. package/dist/commands/workspace/open-view.d.ts +62 -0
  49. package/dist/commands/workspace/open-view.js +249 -0
  50. package/dist/commands/workspace/open.d.ts +37 -0
  51. package/dist/commands/workspace/open.js +110 -0
  52. package/dist/commands/workspace/opener-selection.d.ts +11 -0
  53. package/dist/commands/workspace/opener-selection.js +98 -0
  54. package/dist/commands/workspace/operations.d.ts +29 -0
  55. package/dist/commands/workspace/operations.js +543 -0
  56. package/dist/commands/workspace/prompt-theme.d.ts +29 -0
  57. package/dist/commands/workspace/prompt-theme.js +24 -0
  58. package/dist/commands/workspace/registration.d.ts +13 -0
  59. package/dist/commands/workspace/registration.js +84 -0
  60. package/dist/commands/workspace/selection.d.ts +8 -0
  61. package/dist/commands/workspace/selection.js +104 -0
  62. package/dist/commands/workspace/setup-prompts.d.ts +13 -0
  63. package/dist/commands/workspace/setup-prompts.js +121 -0
  64. package/dist/commands/workspace/types.d.ts +103 -0
  65. package/dist/commands/workspace/types.js +36 -0
  66. package/dist/commands/workspace.d.ts +5 -0
  67. package/dist/commands/workspace.js +577 -0
  68. package/dist/core/archive.d.ts +11 -0
  69. package/dist/core/archive.js +318 -0
  70. package/dist/core/artifact-graph/graph.d.ts +56 -0
  71. package/dist/core/artifact-graph/graph.js +141 -0
  72. package/dist/core/artifact-graph/index.d.ts +9 -0
  73. package/dist/core/artifact-graph/index.js +14 -0
  74. package/dist/core/artifact-graph/instruction-loader.d.ts +183 -0
  75. package/dist/core/artifact-graph/instruction-loader.js +256 -0
  76. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  77. package/dist/core/artifact-graph/outputs.js +39 -0
  78. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  79. package/dist/core/artifact-graph/resolver.js +257 -0
  80. package/dist/core/artifact-graph/schema.d.ts +13 -0
  81. package/dist/core/artifact-graph/schema.js +108 -0
  82. package/dist/core/artifact-graph/state.d.ts +12 -0
  83. package/dist/core/artifact-graph/state.js +31 -0
  84. package/dist/core/artifact-graph/types.d.ts +40 -0
  85. package/dist/core/artifact-graph/types.js +29 -0
  86. package/dist/core/available-tools.d.ts +17 -0
  87. package/dist/core/available-tools.js +43 -0
  88. package/dist/core/change-metadata/index.d.ts +2 -0
  89. package/dist/core/change-metadata/index.js +2 -0
  90. package/dist/core/change-metadata/schema.d.ts +18 -0
  91. package/dist/core/change-metadata/schema.js +28 -0
  92. package/dist/core/change-status-policy.d.ts +50 -0
  93. package/dist/core/change-status-policy.js +70 -0
  94. package/dist/core/collections/index.d.ts +3 -0
  95. package/dist/core/collections/index.js +3 -0
  96. package/dist/core/collections/initiatives/collection.d.ts +4 -0
  97. package/dist/core/collections/initiatives/collection.js +17 -0
  98. package/dist/core/collections/initiatives/index.d.ts +6 -0
  99. package/dist/core/collections/initiatives/index.js +6 -0
  100. package/dist/core/collections/initiatives/operations.d.ts +49 -0
  101. package/dist/core/collections/initiatives/operations.js +175 -0
  102. package/dist/core/collections/initiatives/resolution.d.ts +87 -0
  103. package/dist/core/collections/initiatives/resolution.js +374 -0
  104. package/dist/core/collections/initiatives/schema.d.ts +41 -0
  105. package/dist/core/collections/initiatives/schema.js +134 -0
  106. package/dist/core/collections/initiatives/templates.d.ts +12 -0
  107. package/dist/core/collections/initiatives/templates.js +90 -0
  108. package/dist/core/collections/runtime.d.ts +46 -0
  109. package/dist/core/collections/runtime.js +194 -0
  110. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  111. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  112. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  114. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  115. package/dist/core/command-generation/adapters/auggie.js +27 -0
  116. package/dist/core/command-generation/adapters/bob.d.ts +14 -0
  117. package/dist/core/command-generation/adapters/bob.js +45 -0
  118. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/claude.js +50 -0
  120. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  121. package/dist/core/command-generation/adapters/cline.js +27 -0
  122. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  123. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  124. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  125. package/dist/core/command-generation/adapters/codex.js +39 -0
  126. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  127. package/dist/core/command-generation/adapters/continue.js +28 -0
  128. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  129. package/dist/core/command-generation/adapters/costrict.js +27 -0
  130. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  131. package/dist/core/command-generation/adapters/crush.js +30 -0
  132. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  133. package/dist/core/command-generation/adapters/cursor.js +44 -0
  134. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  135. package/dist/core/command-generation/adapters/factory.js +27 -0
  136. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  137. package/dist/core/command-generation/adapters/gemini.js +26 -0
  138. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  139. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  140. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  141. package/dist/core/command-generation/adapters/iflow.js +29 -0
  142. package/dist/core/command-generation/adapters/index.d.ts +32 -0
  143. package/dist/core/command-generation/adapters/index.js +32 -0
  144. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  145. package/dist/core/command-generation/adapters/junie.js +26 -0
  146. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  147. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  148. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  149. package/dist/core/command-generation/adapters/kiro.js +26 -0
  150. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  151. package/dist/core/command-generation/adapters/lingma.js +30 -0
  152. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  153. package/dist/core/command-generation/adapters/opencode.js +29 -0
  154. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  155. package/dist/core/command-generation/adapters/pi.js +55 -0
  156. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  157. package/dist/core/command-generation/adapters/qoder.js +30 -0
  158. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  159. package/dist/core/command-generation/adapters/qwen.js +26 -0
  160. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  161. package/dist/core/command-generation/adapters/roocode.js +27 -0
  162. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  163. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  164. package/dist/core/command-generation/generator.d.ts +21 -0
  165. package/dist/core/command-generation/generator.js +27 -0
  166. package/dist/core/command-generation/index.d.ts +22 -0
  167. package/dist/core/command-generation/index.js +24 -0
  168. package/dist/core/command-generation/registry.d.ts +36 -0
  169. package/dist/core/command-generation/registry.js +98 -0
  170. package/dist/core/command-generation/types.d.ts +56 -0
  171. package/dist/core/command-generation/types.js +8 -0
  172. package/dist/core/completions/command-registry.d.ts +3 -0
  173. package/dist/core/completions/command-registry.js +961 -0
  174. package/dist/core/completions/completion-provider.d.ts +71 -0
  175. package/dist/core/completions/completion-provider.js +129 -0
  176. package/dist/core/completions/factory.d.ts +64 -0
  177. package/dist/core/completions/factory.js +75 -0
  178. package/dist/core/completions/generators/bash-generator.d.ts +35 -0
  179. package/dist/core/completions/generators/bash-generator.js +230 -0
  180. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  181. package/dist/core/completions/generators/fish-generator.js +160 -0
  182. package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
  183. package/dist/core/completions/generators/powershell-generator.js +266 -0
  184. package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
  185. package/dist/core/completions/generators/zsh-generator.js +274 -0
  186. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  187. package/dist/core/completions/installers/bash-installer.js +318 -0
  188. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  189. package/dist/core/completions/installers/fish-installer.js +143 -0
  190. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  191. package/dist/core/completions/installers/powershell-installer.js +387 -0
  192. package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
  193. package/dist/core/completions/installers/zsh-installer.js +421 -0
  194. package/dist/core/completions/shared-flags.d.ts +12 -0
  195. package/dist/core/completions/shared-flags.js +28 -0
  196. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  197. package/dist/core/completions/templates/bash-templates.js +30 -0
  198. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  199. package/dist/core/completions/templates/fish-templates.js +45 -0
  200. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  201. package/dist/core/completions/templates/powershell-templates.js +34 -0
  202. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  203. package/dist/core/completions/templates/zsh-templates.js +45 -0
  204. package/dist/core/completions/types.d.ts +101 -0
  205. package/dist/core/completions/types.js +2 -0
  206. package/dist/core/config-prompts.d.ts +9 -0
  207. package/dist/core/config-prompts.js +34 -0
  208. package/dist/core/config-schema.d.ts +86 -0
  209. package/dist/core/config-schema.js +213 -0
  210. package/dist/core/config.d.ts +18 -0
  211. package/dist/core/config.js +39 -0
  212. package/dist/core/context-store/binding.d.ts +53 -0
  213. package/dist/core/context-store/binding.js +197 -0
  214. package/dist/core/context-store/errors.d.ts +20 -0
  215. package/dist/core/context-store/errors.js +22 -0
  216. package/dist/core/context-store/foundation.d.ts +55 -0
  217. package/dist/core/context-store/foundation.js +321 -0
  218. package/dist/core/context-store/index.d.ts +6 -0
  219. package/dist/core/context-store/index.js +6 -0
  220. package/dist/core/context-store/operations.d.ts +85 -0
  221. package/dist/core/context-store/operations.js +528 -0
  222. package/dist/core/context-store/registry.d.ts +45 -0
  223. package/dist/core/context-store/registry.js +229 -0
  224. package/dist/core/converters/json-converter.d.ts +6 -0
  225. package/dist/core/converters/json-converter.js +51 -0
  226. package/dist/core/global-config.d.ts +49 -0
  227. package/dist/core/global-config.js +124 -0
  228. package/dist/core/index.d.ts +6 -0
  229. package/dist/core/index.js +7 -0
  230. package/dist/core/init.d.ts +37 -0
  231. package/dist/core/init.js +593 -0
  232. package/dist/core/legacy-cleanup.d.ts +162 -0
  233. package/dist/core/legacy-cleanup.js +514 -0
  234. package/dist/core/list.d.ts +9 -0
  235. package/dist/core/list.js +171 -0
  236. package/dist/core/migration.d.ts +23 -0
  237. package/dist/core/migration.js +108 -0
  238. package/dist/core/parsers/change-parser.d.ts +13 -0
  239. package/dist/core/parsers/change-parser.js +197 -0
  240. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  241. package/dist/core/parsers/markdown-parser.js +227 -0
  242. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  243. package/dist/core/parsers/requirement-blocks.js +201 -0
  244. package/dist/core/parsers/spec-structure.d.ts +9 -0
  245. package/dist/core/parsers/spec-structure.js +88 -0
  246. package/dist/core/planning-home.d.ts +21 -0
  247. package/dist/core/planning-home.js +108 -0
  248. package/dist/core/profile-sync-drift.d.ts +38 -0
  249. package/dist/core/profile-sync-drift.js +200 -0
  250. package/dist/core/profiles.d.ts +26 -0
  251. package/dist/core/profiles.js +40 -0
  252. package/dist/core/project-config.d.ts +64 -0
  253. package/dist/core/project-config.js +223 -0
  254. package/dist/core/schemas/base.schema.d.ts +13 -0
  255. package/dist/core/schemas/base.schema.js +13 -0
  256. package/dist/core/schemas/change.schema.d.ts +73 -0
  257. package/dist/core/schemas/change.schema.js +31 -0
  258. package/dist/core/schemas/index.d.ts +4 -0
  259. package/dist/core/schemas/index.js +4 -0
  260. package/dist/core/schemas/spec.schema.d.ts +18 -0
  261. package/dist/core/schemas/spec.schema.js +15 -0
  262. package/dist/core/shared/index.d.ts +8 -0
  263. package/dist/core/shared/index.js +8 -0
  264. package/dist/core/shared/skill-generation.d.ts +49 -0
  265. package/dist/core/shared/skill-generation.js +96 -0
  266. package/dist/core/shared/tool-detection.d.ts +71 -0
  267. package/dist/core/shared/tool-detection.js +158 -0
  268. package/dist/core/specs-apply.d.ts +73 -0
  269. package/dist/core/specs-apply.js +392 -0
  270. package/dist/core/styles/palette.d.ts +7 -0
  271. package/dist/core/styles/palette.js +8 -0
  272. package/dist/core/templates/index.d.ts +8 -0
  273. package/dist/core/templates/index.js +9 -0
  274. package/dist/core/templates/skill-templates.d.ts +19 -0
  275. package/dist/core/templates/skill-templates.js +18 -0
  276. package/dist/core/templates/types.d.ts +19 -0
  277. package/dist/core/templates/types.js +5 -0
  278. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  279. package/dist/core/templates/workflows/apply-change.js +314 -0
  280. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  281. package/dist/core/templates/workflows/archive-change.js +277 -0
  282. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  283. package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
  284. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  285. package/dist/core/templates/workflows/continue-change.js +234 -0
  286. package/dist/core/templates/workflows/explore.d.ts +10 -0
  287. package/dist/core/templates/workflows/explore.js +459 -0
  288. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  289. package/dist/core/templates/workflows/feedback.js +108 -0
  290. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  291. package/dist/core/templates/workflows/ff-change.js +200 -0
  292. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  293. package/dist/core/templates/workflows/new-change.js +143 -0
  294. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  295. package/dist/core/templates/workflows/onboard.js +563 -0
  296. package/dist/core/templates/workflows/propose.d.ts +10 -0
  297. package/dist/core/templates/workflows/propose.js +218 -0
  298. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  299. package/dist/core/templates/workflows/sync-specs.js +290 -0
  300. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  301. package/dist/core/templates/workflows/verify-change.js +338 -0
  302. package/dist/core/update.d.ts +82 -0
  303. package/dist/core/update.js +557 -0
  304. package/dist/core/validation/constants.d.ts +34 -0
  305. package/dist/core/validation/constants.js +40 -0
  306. package/dist/core/validation/types.d.ts +18 -0
  307. package/dist/core/validation/types.js +2 -0
  308. package/dist/core/validation/validator.d.ts +43 -0
  309. package/dist/core/validation/validator.js +435 -0
  310. package/dist/core/view.d.ts +8 -0
  311. package/dist/core/view.js +168 -0
  312. package/dist/core/workspace/foundation.d.ts +67 -0
  313. package/dist/core/workspace/foundation.js +295 -0
  314. package/dist/core/workspace/index.d.ts +8 -0
  315. package/dist/core/workspace/index.js +8 -0
  316. package/dist/core/workspace/legacy-state.d.ts +28 -0
  317. package/dist/core/workspace/legacy-state.js +200 -0
  318. package/dist/core/workspace/link-input.d.ts +9 -0
  319. package/dist/core/workspace/link-input.js +32 -0
  320. package/dist/core/workspace/open-surface.d.ts +45 -0
  321. package/dist/core/workspace/open-surface.js +215 -0
  322. package/dist/core/workspace/openers.d.ts +21 -0
  323. package/dist/core/workspace/openers.js +124 -0
  324. package/dist/core/workspace/registry.d.ts +24 -0
  325. package/dist/core/workspace/registry.js +146 -0
  326. package/dist/core/workspace/skills.d.ts +57 -0
  327. package/dist/core/workspace/skills.js +334 -0
  328. package/dist/core/workspace/state-io.d.ts +10 -0
  329. package/dist/core/workspace/state-io.js +121 -0
  330. package/dist/index.d.ts +3 -0
  331. package/dist/index.js +3 -0
  332. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  333. package/dist/prompts/searchable-multi-select.js +159 -0
  334. package/dist/telemetry/config.d.ts +38 -0
  335. package/dist/telemetry/config.js +136 -0
  336. package/dist/telemetry/index.d.ts +31 -0
  337. package/dist/telemetry/index.js +164 -0
  338. package/dist/ui/ascii-patterns.d.ts +16 -0
  339. package/dist/ui/ascii-patterns.js +133 -0
  340. package/dist/ui/welcome-screen.d.ts +10 -0
  341. package/dist/ui/welcome-screen.js +146 -0
  342. package/dist/utils/change-metadata.d.ts +54 -0
  343. package/dist/utils/change-metadata.js +141 -0
  344. package/dist/utils/change-utils.d.ts +71 -0
  345. package/dist/utils/change-utils.js +123 -0
  346. package/dist/utils/command-references.d.ts +18 -0
  347. package/dist/utils/command-references.js +20 -0
  348. package/dist/utils/file-system.d.ts +41 -0
  349. package/dist/utils/file-system.js +301 -0
  350. package/dist/utils/index.d.ts +6 -0
  351. package/dist/utils/index.js +9 -0
  352. package/dist/utils/interactive.d.ts +18 -0
  353. package/dist/utils/interactive.js +21 -0
  354. package/dist/utils/item-discovery.d.ts +4 -0
  355. package/dist/utils/item-discovery.js +72 -0
  356. package/dist/utils/match.d.ts +3 -0
  357. package/dist/utils/match.js +22 -0
  358. package/dist/utils/shell-detection.d.ts +20 -0
  359. package/dist/utils/shell-detection.js +41 -0
  360. package/dist/utils/task-progress.d.ts +8 -0
  361. package/dist/utils/task-progress.js +36 -0
  362. package/package.json +85 -0
  363. package/schemas/spec-driven/schema.yaml +151 -0
  364. package/schemas/spec-driven/templates/design.md +19 -0
  365. package/schemas/spec-driven/templates/proposal.md +23 -0
  366. package/schemas/spec-driven/templates/spec.md +8 -0
  367. package/schemas/spec-driven/templates/tasks.md +9 -0
  368. package/schemas/workspace-planning/schema.yaml +72 -0
  369. package/schemas/workspace-planning/templates/design.md +33 -0
  370. package/schemas/workspace-planning/templates/proposal.md +28 -0
  371. package/schemas/workspace-planning/templates/spec.md +9 -0
  372. package/schemas/workspace-planning/templates/tasks.md +15 -0
  373. package/scripts/postinstall.js +83 -0
@@ -0,0 +1,229 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { getContextStoreMetadataPath, getContextStoreMetadataDir, listContextStoreRegistryEntries, readContextStoreRegistryState, readOptionalContextStoreMetadataState, resolveGitContextStoreBackendConfig, updateContextStoreRegistryState, validateContextStoreId, writeContextStoreMetadataState, } from './foundation.js';
3
+ import { ContextStoreError } from './errors.js';
4
+ import { FileSystemUtils } from '../../utils/file-system.js';
5
+ export function getStoreRootForBackend(backend) {
6
+ switch (backend.type) {
7
+ case 'git':
8
+ return backend.local_path;
9
+ }
10
+ }
11
+ function normalizePathForComparison(targetPath) {
12
+ try {
13
+ return FileSystemUtils.canonicalizeExistingPath(targetPath);
14
+ }
15
+ catch {
16
+ return targetPath;
17
+ }
18
+ }
19
+ export function assertNoRegisteredStoreConflict(registry, id, backend) {
20
+ const nextPath = normalizePathForComparison(getStoreRootForBackend(backend));
21
+ for (const entry of listContextStoreRegistryEntries(registry ?? { version: 1, stores: {} })) {
22
+ const entryPath = normalizePathForComparison(getStoreRootForBackend(entry.backend));
23
+ if (entry.id === id && entryPath === nextPath) {
24
+ continue;
25
+ }
26
+ if (entry.id === id) {
27
+ throw new ContextStoreError(`Context store '${id}' is already registered at ${getStoreRootForBackend(entry.backend)}.`, 'context_store_id_conflict', {
28
+ target: 'context_store.id',
29
+ fix: 'Use the existing registration or choose a different context store id.',
30
+ });
31
+ }
32
+ if (entryPath === nextPath) {
33
+ throw new ContextStoreError(`Context store path is already registered as '${entry.id}'.`, 'context_store_path_conflict', {
34
+ target: 'context_store.root',
35
+ fix: `Use the existing '${entry.id}' registration or choose a different path.`,
36
+ });
37
+ }
38
+ }
39
+ }
40
+ function withRegisteredStore(registry, id, backend) {
41
+ assertNoRegisteredStoreConflict(registry, id, backend);
42
+ const stores = {
43
+ ...(registry?.stores ?? {}),
44
+ [id]: {
45
+ backend,
46
+ },
47
+ };
48
+ return {
49
+ version: 1,
50
+ stores: Object.fromEntries(Object.entries(stores).sort(([leftId], [rightId]) => leftId.localeCompare(rightId))),
51
+ };
52
+ }
53
+ function getRegisteredStoreOrThrow(registry, id) {
54
+ const entry = registry?.stores[id];
55
+ if (!entry) {
56
+ throw new ContextStoreError(`Unknown context store '${id}'`, 'context_store_not_found', {
57
+ target: 'context_store.id',
58
+ fix: 'Run openspec context-store list to see registered stores.',
59
+ });
60
+ }
61
+ return {
62
+ id,
63
+ backend: entry.backend,
64
+ };
65
+ }
66
+ function contextStoreBackendsMatch(actual, expected) {
67
+ return (actual.type === expected.type &&
68
+ normalizePathForComparison(actual.local_path) ===
69
+ normalizePathForComparison(expected.local_path) &&
70
+ actual.remote === expected.remote &&
71
+ actual.branch === expected.branch);
72
+ }
73
+ function assertExpectedRegisteredBackend(id, actual, expected) {
74
+ if (!expected || contextStoreBackendsMatch(actual, expected))
75
+ return;
76
+ throw new ContextStoreError(`Context store '${id}' changed before cleanup completed.`, 'context_store_registry_changed', {
77
+ target: 'context_store.registry',
78
+ fix: 'Retry the cleanup command after reviewing the current context-store registration.',
79
+ });
80
+ }
81
+ function withoutRegisteredStore(registry, id, expectedBackend) {
82
+ const removed = getRegisteredStoreOrThrow(registry, id);
83
+ assertExpectedRegisteredBackend(id, removed.backend, expectedBackend);
84
+ const stores = { ...(registry?.stores ?? {}) };
85
+ delete stores[id];
86
+ return {
87
+ removed,
88
+ next: {
89
+ version: 1,
90
+ stores: Object.fromEntries(Object.entries(stores).sort(([leftId], [rightId]) => leftId.localeCompare(rightId))),
91
+ },
92
+ };
93
+ }
94
+ async function ensureStoreMetadata(storeRoot, id, options) {
95
+ const metadata = await readOptionalContextStoreMetadataState(storeRoot);
96
+ if (!metadata) {
97
+ if (!options.writeIfMissing) {
98
+ throw new ContextStoreError(`Registered context store '${id}' is missing metadata at ${getContextStoreMetadataPath(storeRoot)}`, 'context_store_metadata_missing', {
99
+ target: 'context_store.metadata',
100
+ fix: `Create ${getContextStoreMetadataPath(storeRoot)} or rerun context-store register.`,
101
+ });
102
+ }
103
+ await writeContextStoreMetadataState(storeRoot, {
104
+ version: 1,
105
+ id,
106
+ });
107
+ return true;
108
+ }
109
+ if (metadata.id !== id) {
110
+ throw new ContextStoreError(`Context store metadata id '${metadata.id}' does not match registered id '${id}'`, 'context_store_metadata_id_mismatch', {
111
+ target: 'context_store.metadata',
112
+ fix: 'Repair the local registry or store metadata so the ids match.',
113
+ });
114
+ }
115
+ return false;
116
+ }
117
+ export async function commitContextStoreRegistration(input) {
118
+ const id = validateContextStoreId(input.id);
119
+ const backend = input.backend;
120
+ const storeRoot = getStoreRootForBackend(backend);
121
+ let metadataCreated = false;
122
+ try {
123
+ metadataCreated = await ensureStoreMetadata(storeRoot, id, {
124
+ writeIfMissing: input.writeMetadataIfMissing,
125
+ });
126
+ await updateContextStoreRegistryState((registry) => withRegisteredStore(registry, id, backend), { globalDataDir: input.globalDataDir });
127
+ }
128
+ catch (error) {
129
+ if (metadataCreated) {
130
+ await fs.rm(getContextStoreMetadataPath(storeRoot), { force: true });
131
+ await fs.rmdir(getContextStoreMetadataDir(storeRoot)).catch(() => undefined);
132
+ }
133
+ throw error;
134
+ }
135
+ return {
136
+ id,
137
+ storeRoot,
138
+ backend,
139
+ metadataCreated,
140
+ };
141
+ }
142
+ export async function registerContextStore(input) {
143
+ const id = validateContextStoreId(input.id);
144
+ const backend = await resolveGitContextStoreBackendConfig({
145
+ localPath: input.localPath,
146
+ ...(input.remote !== undefined ? { remote: input.remote } : {}),
147
+ ...(input.branch !== undefined ? { branch: input.branch } : {}),
148
+ }, input.cwd);
149
+ const storeRoot = getStoreRootForBackend(backend);
150
+ const committed = await commitContextStoreRegistration({
151
+ id,
152
+ backend,
153
+ writeMetadataIfMissing: true,
154
+ ...(input.globalDataDir ? { globalDataDir: input.globalDataDir } : {}),
155
+ });
156
+ return {
157
+ id: committed.id,
158
+ storeRoot: committed.storeRoot,
159
+ backend: committed.backend,
160
+ };
161
+ }
162
+ export async function listRegisteredContextStores(options = {}) {
163
+ const registry = await readContextStoreRegistryState(options);
164
+ if (!registry) {
165
+ return [];
166
+ }
167
+ return listContextStoreRegistryEntries(registry).map((entry) => ({
168
+ ...entry,
169
+ storeRoot: getStoreRootForBackend(entry.backend),
170
+ }));
171
+ }
172
+ export async function getRegisteredContextStore(input) {
173
+ const id = validateContextStoreId(input.id);
174
+ const registry = await readContextStoreRegistryState({
175
+ globalDataDir: input.globalDataDir,
176
+ });
177
+ const entry = getRegisteredStoreOrThrow(registry, id);
178
+ assertExpectedRegisteredBackend(id, entry.backend, input.expectedBackend);
179
+ return {
180
+ ...entry,
181
+ storeRoot: getStoreRootForBackend(entry.backend),
182
+ };
183
+ }
184
+ export async function unregisterContextStoreRegistration(input) {
185
+ const id = validateContextStoreId(input.id);
186
+ let removed;
187
+ await updateContextStoreRegistryState(async (registry) => {
188
+ const result = withoutRegisteredStore(registry, id, input.expectedBackend);
189
+ const removedEntry = {
190
+ ...result.removed,
191
+ storeRoot: getStoreRootForBackend(result.removed.backend),
192
+ };
193
+ await input.beforeCommit?.(removedEntry);
194
+ removed = result.removed;
195
+ return result.next;
196
+ }, { globalDataDir: input.globalDataDir });
197
+ if (!removed) {
198
+ throw new ContextStoreError(`Unknown context store '${id}'`, 'context_store_not_found', {
199
+ target: 'context_store.id',
200
+ fix: 'Run openspec context-store list to see registered stores.',
201
+ });
202
+ }
203
+ return {
204
+ ...removed,
205
+ storeRoot: getStoreRootForBackend(removed.backend),
206
+ };
207
+ }
208
+ export async function resolveRegisteredContextStore(input) {
209
+ const id = validateContextStoreId(input.id);
210
+ const registry = await readContextStoreRegistryState({
211
+ globalDataDir: input.globalDataDir,
212
+ });
213
+ if (!registry) {
214
+ throw new ContextStoreError('No context store registry found', 'no_context_store_registry', {
215
+ target: 'context_store.id',
216
+ fix: 'Register a context store before using --store, or pass --store-path <path>.',
217
+ });
218
+ }
219
+ const entry = getRegisteredStoreOrThrow(registry, id);
220
+ const backend = entry.backend;
221
+ const storeRoot = getStoreRootForBackend(backend);
222
+ await ensureStoreMetadata(storeRoot, id, { writeIfMissing: false });
223
+ return {
224
+ id,
225
+ storeRoot,
226
+ backend,
227
+ };
228
+ }
229
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1,6 @@
1
+ export declare class JsonConverter {
2
+ convertSpecToJson(filePath: string): string;
3
+ convertChangeToJson(filePath: string): Promise<string>;
4
+ private extractNameFromPath;
5
+ }
6
+ //# sourceMappingURL=json-converter.d.ts.map
@@ -0,0 +1,51 @@
1
+ import { readFileSync } from 'fs';
2
+ import path from 'path';
3
+ import { MarkdownParser } from '../parsers/markdown-parser.js';
4
+ import { ChangeParser } from '../parsers/change-parser.js';
5
+ import { FileSystemUtils } from '../../utils/file-system.js';
6
+ export class JsonConverter {
7
+ convertSpecToJson(filePath) {
8
+ const content = readFileSync(filePath, 'utf-8');
9
+ const parser = new MarkdownParser(content);
10
+ const specName = this.extractNameFromPath(filePath);
11
+ const spec = parser.parseSpec(specName);
12
+ const jsonSpec = {
13
+ ...spec,
14
+ metadata: {
15
+ ...spec.metadata,
16
+ sourcePath: filePath,
17
+ },
18
+ };
19
+ return JSON.stringify(jsonSpec, null, 2);
20
+ }
21
+ async convertChangeToJson(filePath) {
22
+ const content = readFileSync(filePath, 'utf-8');
23
+ const changeName = this.extractNameFromPath(filePath);
24
+ const changeDir = path.dirname(filePath);
25
+ const parser = new ChangeParser(content, changeDir);
26
+ const change = await parser.parseChangeWithDeltas(changeName);
27
+ const jsonChange = {
28
+ ...change,
29
+ metadata: {
30
+ ...change.metadata,
31
+ sourcePath: filePath,
32
+ },
33
+ };
34
+ return JSON.stringify(jsonChange, null, 2);
35
+ }
36
+ extractNameFromPath(filePath) {
37
+ const normalizedPath = FileSystemUtils.toPosixPath(filePath);
38
+ const parts = normalizedPath.split('/');
39
+ for (let i = parts.length - 1; i >= 0; i--) {
40
+ if (parts[i] === 'specs' || parts[i] === 'changes') {
41
+ if (i < parts.length - 1) {
42
+ return parts[i + 1];
43
+ }
44
+ }
45
+ }
46
+ const fileName = parts[parts.length - 1] ?? '';
47
+ const dotIndex = fileName.lastIndexOf('.');
48
+ return dotIndex > 0 ? fileName.slice(0, dotIndex) : fileName;
49
+ }
50
+ }
51
+ //# sourceMappingURL=json-converter.js.map
@@ -0,0 +1,49 @@
1
+ export declare const GLOBAL_CONFIG_DIR_NAME = "openspec";
2
+ export declare const GLOBAL_CONFIG_FILE_NAME = "config.json";
3
+ export declare const GLOBAL_DATA_DIR_NAME = "openspec";
4
+ export type Profile = 'core' | 'custom';
5
+ export type Delivery = 'both' | 'skills' | 'commands';
6
+ export interface GlobalConfig {
7
+ featureFlags?: Record<string, boolean>;
8
+ profile?: Profile;
9
+ delivery?: Delivery;
10
+ workflows?: string[];
11
+ }
12
+ /**
13
+ * Gets the global configuration directory path following XDG Base Directory Specification.
14
+ *
15
+ * - All platforms: $XDG_CONFIG_HOME/openspec/ if XDG_CONFIG_HOME is set
16
+ * - Unix/macOS fallback: ~/.config/openspec/
17
+ * - Windows fallback: %APPDATA%/openspec/
18
+ */
19
+ export declare function getGlobalConfigDir(): string;
20
+ /**
21
+ * Gets the global data directory path following XDG Base Directory Specification.
22
+ * Used for user data like schema overrides.
23
+ *
24
+ * - All platforms: $XDG_DATA_HOME/openspec/ if XDG_DATA_HOME is set
25
+ * - Unix/macOS fallback: ~/.local/share/openspec/
26
+ * - Windows fallback: %LOCALAPPDATA%/openspec/
27
+ */
28
+ export interface GlobalDataDirOptions {
29
+ env?: NodeJS.ProcessEnv;
30
+ platform?: NodeJS.Platform;
31
+ homedir?: string;
32
+ }
33
+ export declare function getGlobalDataDir(options?: GlobalDataDirOptions): string;
34
+ /**
35
+ * Gets the path to the global config file.
36
+ */
37
+ export declare function getGlobalConfigPath(): string;
38
+ /**
39
+ * Loads the global configuration from disk.
40
+ * Returns default configuration if file doesn't exist or is invalid.
41
+ * Merges loaded config with defaults to ensure new fields are available.
42
+ */
43
+ export declare function getGlobalConfig(): GlobalConfig;
44
+ /**
45
+ * Saves the global configuration to disk.
46
+ * Creates the config directory if it doesn't exist.
47
+ */
48
+ export declare function saveGlobalConfig(config: GlobalConfig): void;
49
+ //# sourceMappingURL=global-config.d.ts.map
@@ -0,0 +1,124 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ // Constants
5
+ export const GLOBAL_CONFIG_DIR_NAME = 'openspec';
6
+ export const GLOBAL_CONFIG_FILE_NAME = 'config.json';
7
+ export const GLOBAL_DATA_DIR_NAME = 'openspec';
8
+ const DEFAULT_CONFIG = {
9
+ featureFlags: {},
10
+ profile: 'core',
11
+ delivery: 'both',
12
+ };
13
+ /**
14
+ * Gets the global configuration directory path following XDG Base Directory Specification.
15
+ *
16
+ * - All platforms: $XDG_CONFIG_HOME/openspec/ if XDG_CONFIG_HOME is set
17
+ * - Unix/macOS fallback: ~/.config/openspec/
18
+ * - Windows fallback: %APPDATA%/openspec/
19
+ */
20
+ export function getGlobalConfigDir() {
21
+ // XDG_CONFIG_HOME takes precedence on all platforms when explicitly set
22
+ const xdgConfigHome = process.env.XDG_CONFIG_HOME;
23
+ if (xdgConfigHome) {
24
+ return path.join(xdgConfigHome, GLOBAL_CONFIG_DIR_NAME);
25
+ }
26
+ const platform = os.platform();
27
+ if (platform === 'win32') {
28
+ // Windows: use %APPDATA%
29
+ const appData = process.env.APPDATA;
30
+ if (appData) {
31
+ return path.join(appData, GLOBAL_CONFIG_DIR_NAME);
32
+ }
33
+ // Fallback for Windows if APPDATA is not set
34
+ return path.join(os.homedir(), 'AppData', 'Roaming', GLOBAL_CONFIG_DIR_NAME);
35
+ }
36
+ // Unix/macOS fallback: ~/.config
37
+ return path.join(os.homedir(), '.config', GLOBAL_CONFIG_DIR_NAME);
38
+ }
39
+ function joinGlobalDataPath(platform, ...segments) {
40
+ return platform === 'win32'
41
+ ? path.win32.join(...segments)
42
+ : path.posix.join(...segments);
43
+ }
44
+ export function getGlobalDataDir(options = {}) {
45
+ const env = options.env ?? process.env;
46
+ const platform = options.platform ?? os.platform();
47
+ // XDG_DATA_HOME takes precedence on all platforms when explicitly set
48
+ const xdgDataHome = env.XDG_DATA_HOME;
49
+ if (xdgDataHome) {
50
+ return joinGlobalDataPath(platform, xdgDataHome, GLOBAL_DATA_DIR_NAME);
51
+ }
52
+ const homedir = options.homedir ?? os.homedir();
53
+ if (platform === 'win32') {
54
+ // Windows: use %LOCALAPPDATA%
55
+ const localAppData = env.LOCALAPPDATA;
56
+ if (localAppData) {
57
+ return joinGlobalDataPath(platform, localAppData, GLOBAL_DATA_DIR_NAME);
58
+ }
59
+ // Fallback for Windows if LOCALAPPDATA is not set
60
+ return joinGlobalDataPath(platform, homedir, 'AppData', 'Local', GLOBAL_DATA_DIR_NAME);
61
+ }
62
+ // Unix/macOS fallback: ~/.local/share
63
+ return joinGlobalDataPath(platform, homedir, '.local', 'share', GLOBAL_DATA_DIR_NAME);
64
+ }
65
+ /**
66
+ * Gets the path to the global config file.
67
+ */
68
+ export function getGlobalConfigPath() {
69
+ return path.join(getGlobalConfigDir(), GLOBAL_CONFIG_FILE_NAME);
70
+ }
71
+ /**
72
+ * Loads the global configuration from disk.
73
+ * Returns default configuration if file doesn't exist or is invalid.
74
+ * Merges loaded config with defaults to ensure new fields are available.
75
+ */
76
+ export function getGlobalConfig() {
77
+ const configPath = getGlobalConfigPath();
78
+ try {
79
+ if (!fs.existsSync(configPath)) {
80
+ return { ...DEFAULT_CONFIG };
81
+ }
82
+ const content = fs.readFileSync(configPath, 'utf-8');
83
+ const parsed = JSON.parse(content);
84
+ // Merge with defaults (loaded values take precedence)
85
+ const merged = {
86
+ ...DEFAULT_CONFIG,
87
+ ...parsed,
88
+ // Deep merge featureFlags
89
+ featureFlags: {
90
+ ...DEFAULT_CONFIG.featureFlags,
91
+ ...(parsed.featureFlags || {})
92
+ }
93
+ };
94
+ // Schema evolution: apply defaults for new fields if not present in loaded config
95
+ if (parsed.profile === undefined) {
96
+ merged.profile = DEFAULT_CONFIG.profile;
97
+ }
98
+ if (parsed.delivery === undefined) {
99
+ merged.delivery = DEFAULT_CONFIG.delivery;
100
+ }
101
+ return merged;
102
+ }
103
+ catch (error) {
104
+ // Log warning for parse errors, but not for missing files
105
+ if (error instanceof SyntaxError) {
106
+ console.error(`警告:${configPath} 中的 JSON 无效,使用默认配置`);
107
+ }
108
+ return { ...DEFAULT_CONFIG };
109
+ }
110
+ }
111
+ /**
112
+ * Saves the global configuration to disk.
113
+ * Creates the config directory if it doesn't exist.
114
+ */
115
+ export function saveGlobalConfig(config) {
116
+ const configDir = getGlobalConfigDir();
117
+ const configPath = getGlobalConfigPath();
118
+ // Create directory if it doesn't exist
119
+ if (!fs.existsSync(configDir)) {
120
+ fs.mkdirSync(configDir, { recursive: true });
121
+ }
122
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
123
+ }
124
+ //# sourceMappingURL=global-config.js.map
@@ -0,0 +1,6 @@
1
+ export { GLOBAL_CONFIG_DIR_NAME, GLOBAL_CONFIG_FILE_NAME, GLOBAL_DATA_DIR_NAME, type GlobalDataDirOptions, type GlobalConfig, getGlobalConfigDir, getGlobalConfigPath, getGlobalConfig, saveGlobalConfig, getGlobalDataDir } from './global-config.js';
2
+ export * from './workspace/index.js';
3
+ export * from './context-store/index.js';
4
+ export * from './collections/index.js';
5
+ export * from './planning-home.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,7 @@
1
+ // Core OpenSpec logic will be implemented here
2
+ export { GLOBAL_CONFIG_DIR_NAME, GLOBAL_CONFIG_FILE_NAME, GLOBAL_DATA_DIR_NAME, getGlobalConfigDir, getGlobalConfigPath, getGlobalConfig, saveGlobalConfig, getGlobalDataDir } from './global-config.js';
3
+ export * from './workspace/index.js';
4
+ export * from './context-store/index.js';
5
+ export * from './collections/index.js';
6
+ export * from './planning-home.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Init Command
3
+ *
4
+ * Sets up OpenSpec with Agent Skills and /opsx:* slash commands.
5
+ * This is the unified setup command that replaces both the old init and experimental commands.
6
+ */
7
+ type InitCommandOptions = {
8
+ tools?: string;
9
+ force?: boolean;
10
+ interactive?: boolean;
11
+ profile?: string;
12
+ };
13
+ export declare class InitCommand {
14
+ private readonly toolsArg?;
15
+ private readonly force;
16
+ private readonly interactiveOption?;
17
+ private readonly profileOverride?;
18
+ constructor(options?: InitCommandOptions);
19
+ execute(targetPath: string): Promise<void>;
20
+ private validate;
21
+ private canPromptInteractively;
22
+ private resolveProfileOverride;
23
+ private handleLegacyCleanup;
24
+ private performLegacyCleanup;
25
+ private getSelectedTools;
26
+ private resolveToolsArg;
27
+ private validateTools;
28
+ private createDirectoryStructure;
29
+ private generateSkillsAndCommands;
30
+ private createConfig;
31
+ private displaySuccessMessage;
32
+ private startSpinner;
33
+ private removeSkillDirs;
34
+ private removeCommandFiles;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=init.d.ts.map