@thiagodiogo/pastelsdd 1.0.0-beta.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 (369) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +3 -0
  3. package/bin/pastelsdd.js +5 -0
  4. package/dist/cli/index.d.ts +5 -0
  5. package/dist/cli/index.js +526 -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 +282 -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-view.d.ts +62 -0
  47. package/dist/commands/workspace/open-view.js +228 -0
  48. package/dist/commands/workspace/open.d.ts +37 -0
  49. package/dist/commands/workspace/open.js +102 -0
  50. package/dist/commands/workspace/opener-selection.d.ts +11 -0
  51. package/dist/commands/workspace/opener-selection.js +93 -0
  52. package/dist/commands/workspace/operations.d.ts +28 -0
  53. package/dist/commands/workspace/operations.js +543 -0
  54. package/dist/commands/workspace/prompt-theme.d.ts +29 -0
  55. package/dist/commands/workspace/prompt-theme.js +24 -0
  56. package/dist/commands/workspace/registration.d.ts +13 -0
  57. package/dist/commands/workspace/registration.js +84 -0
  58. package/dist/commands/workspace/selection.d.ts +6 -0
  59. package/dist/commands/workspace/selection.js +122 -0
  60. package/dist/commands/workspace/types.d.ts +103 -0
  61. package/dist/commands/workspace/types.js +36 -0
  62. package/dist/commands/workspace.d.ts +6 -0
  63. package/dist/commands/workspace.js +678 -0
  64. package/dist/core/archive.d.ts +11 -0
  65. package/dist/core/archive.js +318 -0
  66. package/dist/core/artifact-graph/graph.d.ts +56 -0
  67. package/dist/core/artifact-graph/graph.js +141 -0
  68. package/dist/core/artifact-graph/index.d.ts +9 -0
  69. package/dist/core/artifact-graph/index.js +14 -0
  70. package/dist/core/artifact-graph/instruction-loader.d.ts +183 -0
  71. package/dist/core/artifact-graph/instruction-loader.js +256 -0
  72. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  73. package/dist/core/artifact-graph/outputs.js +39 -0
  74. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  75. package/dist/core/artifact-graph/resolver.js +257 -0
  76. package/dist/core/artifact-graph/schema.d.ts +13 -0
  77. package/dist/core/artifact-graph/schema.js +108 -0
  78. package/dist/core/artifact-graph/state.d.ts +12 -0
  79. package/dist/core/artifact-graph/state.js +31 -0
  80. package/dist/core/artifact-graph/types.d.ts +40 -0
  81. package/dist/core/artifact-graph/types.js +29 -0
  82. package/dist/core/available-tools.d.ts +17 -0
  83. package/dist/core/available-tools.js +43 -0
  84. package/dist/core/change-metadata/index.d.ts +2 -0
  85. package/dist/core/change-metadata/index.js +2 -0
  86. package/dist/core/change-metadata/schema.d.ts +18 -0
  87. package/dist/core/change-metadata/schema.js +28 -0
  88. package/dist/core/change-status-policy.d.ts +50 -0
  89. package/dist/core/change-status-policy.js +70 -0
  90. package/dist/core/collections/index.d.ts +3 -0
  91. package/dist/core/collections/index.js +3 -0
  92. package/dist/core/collections/initiatives/collection.d.ts +4 -0
  93. package/dist/core/collections/initiatives/collection.js +17 -0
  94. package/dist/core/collections/initiatives/index.d.ts +6 -0
  95. package/dist/core/collections/initiatives/index.js +6 -0
  96. package/dist/core/collections/initiatives/operations.d.ts +49 -0
  97. package/dist/core/collections/initiatives/operations.js +175 -0
  98. package/dist/core/collections/initiatives/resolution.d.ts +87 -0
  99. package/dist/core/collections/initiatives/resolution.js +374 -0
  100. package/dist/core/collections/initiatives/schema.d.ts +41 -0
  101. package/dist/core/collections/initiatives/schema.js +134 -0
  102. package/dist/core/collections/initiatives/templates.d.ts +12 -0
  103. package/dist/core/collections/initiatives/templates.js +90 -0
  104. package/dist/core/collections/runtime.d.ts +46 -0
  105. package/dist/core/collections/runtime.js +194 -0
  106. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  107. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  108. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  109. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  110. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  111. package/dist/core/command-generation/adapters/auggie.js +27 -0
  112. package/dist/core/command-generation/adapters/bob.d.ts +14 -0
  113. package/dist/core/command-generation/adapters/bob.js +45 -0
  114. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  115. package/dist/core/command-generation/adapters/claude.js +50 -0
  116. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  117. package/dist/core/command-generation/adapters/cline.js +27 -0
  118. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  120. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  121. package/dist/core/command-generation/adapters/codex.js +39 -0
  122. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  123. package/dist/core/command-generation/adapters/continue.js +28 -0
  124. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  125. package/dist/core/command-generation/adapters/costrict.js +27 -0
  126. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  127. package/dist/core/command-generation/adapters/crush.js +30 -0
  128. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  129. package/dist/core/command-generation/adapters/cursor.js +44 -0
  130. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  131. package/dist/core/command-generation/adapters/factory.js +27 -0
  132. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  133. package/dist/core/command-generation/adapters/gemini.js +26 -0
  134. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  135. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  136. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  137. package/dist/core/command-generation/adapters/iflow.js +29 -0
  138. package/dist/core/command-generation/adapters/index.d.ts +32 -0
  139. package/dist/core/command-generation/adapters/index.js +32 -0
  140. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  141. package/dist/core/command-generation/adapters/junie.js +26 -0
  142. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  143. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  144. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  145. package/dist/core/command-generation/adapters/kiro.js +26 -0
  146. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  147. package/dist/core/command-generation/adapters/lingma.js +30 -0
  148. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  149. package/dist/core/command-generation/adapters/opencode.js +29 -0
  150. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  151. package/dist/core/command-generation/adapters/pi.js +55 -0
  152. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  153. package/dist/core/command-generation/adapters/qoder.js +30 -0
  154. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  155. package/dist/core/command-generation/adapters/qwen.js +26 -0
  156. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  157. package/dist/core/command-generation/adapters/roocode.js +27 -0
  158. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  159. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  160. package/dist/core/command-generation/generator.d.ts +21 -0
  161. package/dist/core/command-generation/generator.js +27 -0
  162. package/dist/core/command-generation/index.d.ts +22 -0
  163. package/dist/core/command-generation/index.js +24 -0
  164. package/dist/core/command-generation/registry.d.ts +36 -0
  165. package/dist/core/command-generation/registry.js +98 -0
  166. package/dist/core/command-generation/types.d.ts +56 -0
  167. package/dist/core/command-generation/types.js +8 -0
  168. package/dist/core/completions/command-registry.d.ts +3 -0
  169. package/dist/core/completions/command-registry.js +939 -0
  170. package/dist/core/completions/completion-provider.d.ts +71 -0
  171. package/dist/core/completions/completion-provider.js +129 -0
  172. package/dist/core/completions/factory.d.ts +64 -0
  173. package/dist/core/completions/factory.js +75 -0
  174. package/dist/core/completions/generators/bash-generator.d.ts +35 -0
  175. package/dist/core/completions/generators/bash-generator.js +230 -0
  176. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  177. package/dist/core/completions/generators/fish-generator.js +160 -0
  178. package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
  179. package/dist/core/completions/generators/powershell-generator.js +266 -0
  180. package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
  181. package/dist/core/completions/generators/zsh-generator.js +274 -0
  182. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  183. package/dist/core/completions/installers/bash-installer.js +318 -0
  184. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  185. package/dist/core/completions/installers/fish-installer.js +143 -0
  186. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  187. package/dist/core/completions/installers/powershell-installer.js +387 -0
  188. package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
  189. package/dist/core/completions/installers/zsh-installer.js +421 -0
  190. package/dist/core/completions/shared-flags.d.ts +12 -0
  191. package/dist/core/completions/shared-flags.js +28 -0
  192. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  193. package/dist/core/completions/templates/bash-templates.js +30 -0
  194. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  195. package/dist/core/completions/templates/fish-templates.js +45 -0
  196. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  197. package/dist/core/completions/templates/powershell-templates.js +34 -0
  198. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  199. package/dist/core/completions/templates/zsh-templates.js +45 -0
  200. package/dist/core/completions/types.d.ts +101 -0
  201. package/dist/core/completions/types.js +2 -0
  202. package/dist/core/config-prompts.d.ts +9 -0
  203. package/dist/core/config-prompts.js +34 -0
  204. package/dist/core/config-schema.d.ts +86 -0
  205. package/dist/core/config-schema.js +213 -0
  206. package/dist/core/config.d.ts +18 -0
  207. package/dist/core/config.js +38 -0
  208. package/dist/core/context-store/binding.d.ts +53 -0
  209. package/dist/core/context-store/binding.js +197 -0
  210. package/dist/core/context-store/errors.d.ts +20 -0
  211. package/dist/core/context-store/errors.js +22 -0
  212. package/dist/core/context-store/foundation.d.ts +54 -0
  213. package/dist/core/context-store/foundation.js +318 -0
  214. package/dist/core/context-store/index.d.ts +6 -0
  215. package/dist/core/context-store/index.js +6 -0
  216. package/dist/core/context-store/operations.d.ts +62 -0
  217. package/dist/core/context-store/operations.js +352 -0
  218. package/dist/core/context-store/registry.d.ts +35 -0
  219. package/dist/core/context-store/registry.js +158 -0
  220. package/dist/core/converters/json-converter.d.ts +6 -0
  221. package/dist/core/converters/json-converter.js +51 -0
  222. package/dist/core/global-config.d.ts +49 -0
  223. package/dist/core/global-config.js +124 -0
  224. package/dist/core/index.d.ts +6 -0
  225. package/dist/core/index.js +7 -0
  226. package/dist/core/init.d.ts +37 -0
  227. package/dist/core/init.js +593 -0
  228. package/dist/core/legacy-cleanup.d.ts +162 -0
  229. package/dist/core/legacy-cleanup.js +514 -0
  230. package/dist/core/list.d.ts +9 -0
  231. package/dist/core/list.js +171 -0
  232. package/dist/core/migration.d.ts +23 -0
  233. package/dist/core/migration.js +108 -0
  234. package/dist/core/parsers/change-parser.d.ts +13 -0
  235. package/dist/core/parsers/change-parser.js +197 -0
  236. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  237. package/dist/core/parsers/markdown-parser.js +227 -0
  238. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  239. package/dist/core/parsers/requirement-blocks.js +201 -0
  240. package/dist/core/parsers/spec-structure.d.ts +9 -0
  241. package/dist/core/parsers/spec-structure.js +88 -0
  242. package/dist/core/planning-home.d.ts +21 -0
  243. package/dist/core/planning-home.js +108 -0
  244. package/dist/core/profile-sync-drift.d.ts +38 -0
  245. package/dist/core/profile-sync-drift.js +200 -0
  246. package/dist/core/profiles.d.ts +26 -0
  247. package/dist/core/profiles.js +40 -0
  248. package/dist/core/project-config.d.ts +64 -0
  249. package/dist/core/project-config.js +223 -0
  250. package/dist/core/schemas/base.schema.d.ts +13 -0
  251. package/dist/core/schemas/base.schema.js +13 -0
  252. package/dist/core/schemas/change.schema.d.ts +73 -0
  253. package/dist/core/schemas/change.schema.js +31 -0
  254. package/dist/core/schemas/index.d.ts +4 -0
  255. package/dist/core/schemas/index.js +4 -0
  256. package/dist/core/schemas/spec.schema.d.ts +18 -0
  257. package/dist/core/schemas/spec.schema.js +15 -0
  258. package/dist/core/shared/index.d.ts +8 -0
  259. package/dist/core/shared/index.js +8 -0
  260. package/dist/core/shared/skill-generation.d.ts +49 -0
  261. package/dist/core/shared/skill-generation.js +96 -0
  262. package/dist/core/shared/tool-detection.d.ts +71 -0
  263. package/dist/core/shared/tool-detection.js +158 -0
  264. package/dist/core/specs-apply.d.ts +73 -0
  265. package/dist/core/specs-apply.js +392 -0
  266. package/dist/core/styles/palette.d.ts +7 -0
  267. package/dist/core/styles/palette.js +8 -0
  268. package/dist/core/templates/index.d.ts +8 -0
  269. package/dist/core/templates/index.js +9 -0
  270. package/dist/core/templates/skill-templates.d.ts +19 -0
  271. package/dist/core/templates/skill-templates.js +18 -0
  272. package/dist/core/templates/types.d.ts +19 -0
  273. package/dist/core/templates/types.js +5 -0
  274. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  275. package/dist/core/templates/workflows/apply-change.js +314 -0
  276. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  277. package/dist/core/templates/workflows/archive-change.js +277 -0
  278. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  279. package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
  280. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  281. package/dist/core/templates/workflows/continue-change.js +234 -0
  282. package/dist/core/templates/workflows/explore.d.ts +10 -0
  283. package/dist/core/templates/workflows/explore.js +459 -0
  284. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  285. package/dist/core/templates/workflows/feedback.js +108 -0
  286. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  287. package/dist/core/templates/workflows/ff-change.js +200 -0
  288. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  289. package/dist/core/templates/workflows/new-change.js +143 -0
  290. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  291. package/dist/core/templates/workflows/onboard.js +563 -0
  292. package/dist/core/templates/workflows/propose.d.ts +10 -0
  293. package/dist/core/templates/workflows/propose.js +218 -0
  294. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  295. package/dist/core/templates/workflows/sync-specs.js +290 -0
  296. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  297. package/dist/core/templates/workflows/verify-change.js +338 -0
  298. package/dist/core/update.d.ts +82 -0
  299. package/dist/core/update.js +557 -0
  300. package/dist/core/validation/constants.d.ts +34 -0
  301. package/dist/core/validation/constants.js +40 -0
  302. package/dist/core/validation/types.d.ts +18 -0
  303. package/dist/core/validation/types.js +2 -0
  304. package/dist/core/validation/validator.d.ts +33 -0
  305. package/dist/core/validation/validator.js +418 -0
  306. package/dist/core/view.d.ts +8 -0
  307. package/dist/core/view.js +168 -0
  308. package/dist/core/workspace/foundation.d.ts +62 -0
  309. package/dist/core/workspace/foundation.js +274 -0
  310. package/dist/core/workspace/index.d.ts +8 -0
  311. package/dist/core/workspace/index.js +8 -0
  312. package/dist/core/workspace/legacy-state.d.ts +28 -0
  313. package/dist/core/workspace/legacy-state.js +200 -0
  314. package/dist/core/workspace/link-input.d.ts +9 -0
  315. package/dist/core/workspace/link-input.js +32 -0
  316. package/dist/core/workspace/open-surface.d.ts +43 -0
  317. package/dist/core/workspace/open-surface.js +214 -0
  318. package/dist/core/workspace/openers.d.ts +21 -0
  319. package/dist/core/workspace/openers.js +119 -0
  320. package/dist/core/workspace/registry.d.ts +24 -0
  321. package/dist/core/workspace/registry.js +146 -0
  322. package/dist/core/workspace/skills.d.ts +57 -0
  323. package/dist/core/workspace/skills.js +334 -0
  324. package/dist/core/workspace/state-io.d.ts +10 -0
  325. package/dist/core/workspace/state-io.js +119 -0
  326. package/dist/index.d.ts +3 -0
  327. package/dist/index.js +3 -0
  328. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  329. package/dist/prompts/searchable-multi-select.js +159 -0
  330. package/dist/telemetry/config.d.ts +38 -0
  331. package/dist/telemetry/config.js +136 -0
  332. package/dist/telemetry/index.d.ts +31 -0
  333. package/dist/telemetry/index.js +164 -0
  334. package/dist/ui/ascii-patterns.d.ts +16 -0
  335. package/dist/ui/ascii-patterns.js +133 -0
  336. package/dist/ui/welcome-screen.d.ts +10 -0
  337. package/dist/ui/welcome-screen.js +146 -0
  338. package/dist/utils/change-metadata.d.ts +54 -0
  339. package/dist/utils/change-metadata.js +141 -0
  340. package/dist/utils/change-utils.d.ts +71 -0
  341. package/dist/utils/change-utils.js +123 -0
  342. package/dist/utils/command-references.d.ts +18 -0
  343. package/dist/utils/command-references.js +20 -0
  344. package/dist/utils/file-system.d.ts +41 -0
  345. package/dist/utils/file-system.js +301 -0
  346. package/dist/utils/index.d.ts +6 -0
  347. package/dist/utils/index.js +9 -0
  348. package/dist/utils/interactive.d.ts +18 -0
  349. package/dist/utils/interactive.js +21 -0
  350. package/dist/utils/item-discovery.d.ts +4 -0
  351. package/dist/utils/item-discovery.js +72 -0
  352. package/dist/utils/match.d.ts +3 -0
  353. package/dist/utils/match.js +22 -0
  354. package/dist/utils/shell-detection.d.ts +20 -0
  355. package/dist/utils/shell-detection.js +41 -0
  356. package/dist/utils/task-progress.d.ts +8 -0
  357. package/dist/utils/task-progress.js +36 -0
  358. package/package.json +84 -0
  359. package/schemas/spec-driven/schema.yaml +153 -0
  360. package/schemas/spec-driven/templates/design.md +19 -0
  361. package/schemas/spec-driven/templates/proposal.md +23 -0
  362. package/schemas/spec-driven/templates/spec.md +8 -0
  363. package/schemas/spec-driven/templates/tasks.md +9 -0
  364. package/schemas/workspace-planning/schema.yaml +72 -0
  365. package/schemas/workspace-planning/templates/design.md +33 -0
  366. package/schemas/workspace-planning/templates/proposal.md +28 -0
  367. package/schemas/workspace-planning/templates/spec.md +9 -0
  368. package/schemas/workspace-planning/templates/tasks.md +15 -0
  369. package/scripts/postinstall.js +83 -0
@@ -0,0 +1,352 @@
1
+ import { execFile } from 'node:child_process';
2
+ import * as nodeFs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { FileSystemUtils } from '../../utils/file-system.js';
6
+ import { getContextStoreMetadataPath, getContextStoreRegistryPath, listContextStoreRegistryEntries, readContextStoreRegistryState, readOptionalContextStoreMetadataState, resolveGitContextStoreBackendConfig, validateContextStoreId, } from './foundation.js';
7
+ import { ContextStoreError, makeContextStoreDiagnostic } from './errors.js';
8
+ import { getStoreRootForBackend, assertNoRegisteredStoreConflict, commitContextStoreRegistration, listRegisteredContextStores, } from './registry.js';
9
+ const fs = nodeFs.promises;
10
+ const execFileAsync = promisify(execFile);
11
+ async function pathKind(targetPath) {
12
+ try {
13
+ const stat = await fs.stat(targetPath);
14
+ if (stat.isDirectory())
15
+ return 'directory';
16
+ if (stat.isFile())
17
+ return 'file';
18
+ return 'other';
19
+ }
20
+ catch (error) {
21
+ if (typeof error === 'object' &&
22
+ error !== null &&
23
+ 'code' in error &&
24
+ error.code === 'ENOENT') {
25
+ return 'missing';
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+ async function isDirectoryEmpty(directory) {
31
+ return (await fs.readdir(directory)).length === 0;
32
+ }
33
+ async function readStoreMetadataForOperation(storeRoot) {
34
+ try {
35
+ return await readOptionalContextStoreMetadataState(storeRoot);
36
+ }
37
+ catch (error) {
38
+ throw new ContextStoreError(error instanceof Error ? error.message : String(error), 'invalid_context_store_metadata', {
39
+ target: 'context_store.metadata',
40
+ fix: `Repair ${getContextStoreMetadataPath(storeRoot)}.`,
41
+ });
42
+ }
43
+ }
44
+ async function isGitRepositoryAtRoot(storeRoot) {
45
+ const gitPath = path.join(storeRoot, '.git');
46
+ const kind = await pathKind(gitPath);
47
+ return kind === 'directory' || kind === 'file';
48
+ }
49
+ async function initGitRepository(storeRoot) {
50
+ if (await isGitRepositoryAtRoot(storeRoot)) {
51
+ return false;
52
+ }
53
+ try {
54
+ await execFileAsync('git', ['init'], { cwd: storeRoot });
55
+ }
56
+ catch (error) {
57
+ throw new ContextStoreError(`Failed to initialize Git repository: ${error instanceof Error ? error.message : String(error)}`, 'context_store_git_init_failed', {
58
+ target: 'context_store.git',
59
+ fix: 'Install Git or rerun setup with --no-init-git.',
60
+ });
61
+ }
62
+ return true;
63
+ }
64
+ function resolveSetupRoot(id, inputPath) {
65
+ if (inputPath !== undefined && inputPath.trim().length === 0) {
66
+ throw new ContextStoreError('Pass a non-empty --path value.', 'context_store_path_required', {
67
+ target: 'context_store.root',
68
+ fix: `pastelsdd context-store setup ${id} --path ./team-context`,
69
+ });
70
+ }
71
+ return path.resolve(inputPath ?? id);
72
+ }
73
+ function resolveRegisterRoot(inputPath) {
74
+ if (inputPath === undefined || inputPath.trim().length === 0) {
75
+ throw new ContextStoreError('Pass a context store path.', 'context_store_path_required', {
76
+ target: 'context_store.root',
77
+ fix: 'pastelsdd context-store register /path/to/context-store',
78
+ });
79
+ }
80
+ return path.resolve(inputPath);
81
+ }
82
+ function inferStoreIdFromPath(storeRoot) {
83
+ return validateContextStoreId(path.basename(storeRoot));
84
+ }
85
+ function mutationPayload(id, storeRoot, git, createdFiles) {
86
+ return {
87
+ store: {
88
+ id,
89
+ root: storeRoot,
90
+ metadataPath: getContextStoreMetadataPath(storeRoot),
91
+ },
92
+ registryCommit: {
93
+ path: getContextStoreRegistryPath(),
94
+ },
95
+ git: {
96
+ isRepository: git.isRepository,
97
+ initialized: git.initialized,
98
+ },
99
+ createdArtifacts: createdFiles,
100
+ };
101
+ }
102
+ async function prepareSetupPlan(input) {
103
+ const id = validateContextStoreId(input.id ?? '');
104
+ const storeRoot = resolveSetupRoot(id, input.path);
105
+ const kind = await pathKind(storeRoot);
106
+ if (kind === 'file' || kind === 'other') {
107
+ throw new ContextStoreError(`Context store setup path is not a directory: ${storeRoot}`, 'context_store_setup_path_not_directory', {
108
+ target: 'context_store.root',
109
+ fix: 'Choose an empty directory or omit --path to use ./<id>.',
110
+ });
111
+ }
112
+ let metadata = null;
113
+ let backend;
114
+ if (kind === 'directory') {
115
+ metadata = await readStoreMetadataForOperation(storeRoot);
116
+ if (metadata) {
117
+ if (metadata.id !== id) {
118
+ throw new ContextStoreError(`Context store metadata id '${metadata.id}' does not match requested id '${id}'.`, 'context_store_metadata_id_mismatch', {
119
+ target: 'context_store.metadata',
120
+ fix: `Use id '${metadata.id}' or choose a different setup path.`,
121
+ });
122
+ }
123
+ }
124
+ else if (!(await isDirectoryEmpty(storeRoot))) {
125
+ throw new ContextStoreError('Context store setup does not support initializing a non-empty folder yet.', 'context_store_setup_non_empty_directory', {
126
+ target: 'context_store.root',
127
+ fix: 'Create an empty folder or use context-store register for an existing context store.',
128
+ });
129
+ }
130
+ backend = await resolveGitContextStoreBackendConfig({ localPath: storeRoot });
131
+ }
132
+ const registry = await readContextStoreRegistryState();
133
+ const conflictBackend = backend ?? {
134
+ type: 'git',
135
+ local_path: FileSystemUtils.canonicalizeExistingPath(storeRoot),
136
+ };
137
+ assertNoRegisteredStoreConflict(registry, id, conflictBackend);
138
+ return {
139
+ id,
140
+ storeRoot,
141
+ kind,
142
+ registry,
143
+ ...(backend ? { backend } : {}),
144
+ };
145
+ }
146
+ export async function prepareContextStoreSetup(input) {
147
+ const plan = await prepareSetupPlan(input);
148
+ return {
149
+ id: plan.id,
150
+ root: plan.storeRoot,
151
+ rootKind: plan.kind,
152
+ registry: plan.registry,
153
+ ...(plan.backend ? { backend: plan.backend } : {}),
154
+ };
155
+ }
156
+ export async function setupPreparedContextStore(prepared, input = {}) {
157
+ const plan = {
158
+ id: prepared.id,
159
+ storeRoot: prepared.root,
160
+ kind: prepared.rootKind,
161
+ registry: prepared.registry,
162
+ ...(prepared.backend ? { backend: prepared.backend } : {}),
163
+ };
164
+ const { id, storeRoot, kind, registry } = plan;
165
+ let { backend } = plan;
166
+ const createdFiles = [];
167
+ const initGit = input.initGit ?? false;
168
+ if (kind === 'missing') {
169
+ await fs.mkdir(storeRoot, { recursive: true });
170
+ }
171
+ try {
172
+ backend ??= await resolveGitContextStoreBackendConfig({ localPath: storeRoot });
173
+ assertNoRegisteredStoreConflict(registry, id, backend);
174
+ const gitInitialized = initGit ? await initGitRepository(storeRoot) : false;
175
+ const registered = await commitContextStoreRegistration({
176
+ id,
177
+ backend,
178
+ writeMetadataIfMissing: true,
179
+ });
180
+ if (registered.metadataCreated) {
181
+ createdFiles.push('.pastelsdd-store/store.yaml');
182
+ }
183
+ const isRepository = await isGitRepositoryAtRoot(registered.storeRoot);
184
+ return mutationPayload(id, registered.storeRoot, {
185
+ isRepository,
186
+ initialized: gitInitialized,
187
+ }, createdFiles);
188
+ }
189
+ catch (error) {
190
+ if (kind === 'missing') {
191
+ await fs.rm(storeRoot, { recursive: true, force: true });
192
+ }
193
+ throw error;
194
+ }
195
+ }
196
+ export async function setupContextStore(input) {
197
+ return setupPreparedContextStore(await prepareContextStoreSetup(input), {
198
+ initGit: input.initGit,
199
+ });
200
+ }
201
+ export async function registerExistingContextStore(input) {
202
+ const storeRoot = resolveRegisterRoot(input.path);
203
+ const kind = await pathKind(storeRoot);
204
+ if (kind === 'missing') {
205
+ throw new ContextStoreError(`Context store path does not exist: ${storeRoot}`, 'context_store_path_missing', {
206
+ target: 'context_store.root',
207
+ fix: 'Clone or create the context store folder before registering it.',
208
+ });
209
+ }
210
+ if (kind !== 'directory') {
211
+ throw new ContextStoreError(`Context store path is not a directory: ${storeRoot}`, 'context_store_path_not_directory', {
212
+ target: 'context_store.root',
213
+ fix: 'Pass an existing context store directory.',
214
+ });
215
+ }
216
+ const metadata = await readStoreMetadataForOperation(storeRoot);
217
+ const explicitId = input.id !== undefined ? validateContextStoreId(input.id) : undefined;
218
+ if (metadata && explicitId !== undefined && metadata.id !== explicitId) {
219
+ throw new ContextStoreError(`Context store metadata id '${metadata.id}' does not match --id '${explicitId}'.`, 'context_store_metadata_id_mismatch', {
220
+ target: 'context_store.id',
221
+ fix: `Use --id ${metadata.id} or register a different folder.`,
222
+ });
223
+ }
224
+ const id = metadata?.id ?? explicitId ?? inferStoreIdFromPath(storeRoot);
225
+ const backend = await resolveGitContextStoreBackendConfig({ localPath: storeRoot });
226
+ const registry = await readContextStoreRegistryState();
227
+ assertNoRegisteredStoreConflict(registry, id, backend);
228
+ const createdFiles = [];
229
+ const registered = await commitContextStoreRegistration({
230
+ id,
231
+ backend,
232
+ writeMetadataIfMissing: true,
233
+ });
234
+ if (registered.metadataCreated) {
235
+ createdFiles.push('.pastelsdd-store/store.yaml');
236
+ }
237
+ return mutationPayload(id, registered.storeRoot, {
238
+ isRepository: await isGitRepositoryAtRoot(registered.storeRoot),
239
+ initialized: false,
240
+ }, createdFiles);
241
+ }
242
+ export async function listContextStores() {
243
+ const entries = await listRegisteredContextStores();
244
+ return {
245
+ stores: entries.map((entry) => ({
246
+ id: entry.id,
247
+ root: entry.storeRoot,
248
+ })),
249
+ };
250
+ }
251
+ function doctorStatusForError(error, code, target, fix) {
252
+ if (error instanceof ContextStoreError) {
253
+ return error.diagnostic;
254
+ }
255
+ return makeContextStoreDiagnostic('error', code, error instanceof Error ? error.message : String(error), {
256
+ target,
257
+ ...(fix ? { fix } : {}),
258
+ });
259
+ }
260
+ async function inspectContextStore(entry) {
261
+ const root = getStoreRootForBackend(entry.backend);
262
+ const metadataPath = getContextStoreMetadataPath(root);
263
+ const diagnostics = [];
264
+ const kind = await pathKind(root);
265
+ let metadata = {
266
+ present: null,
267
+ valid: null,
268
+ };
269
+ let git = {
270
+ isRepository: null,
271
+ };
272
+ if (kind === 'missing') {
273
+ diagnostics.push(makeContextStoreDiagnostic('error', 'context_store_root_missing', 'Context store location does not exist.', {
274
+ target: 'context_store.root',
275
+ fix: `Run pastelsdd context-store register /path/to/${entry.id} --id ${entry.id}.`,
276
+ }));
277
+ }
278
+ else if (kind !== 'directory') {
279
+ diagnostics.push(makeContextStoreDiagnostic('error', 'context_store_root_not_directory', 'Context store location is not a directory.', {
280
+ target: 'context_store.root',
281
+ fix: 'Register a directory path for this context store.',
282
+ }));
283
+ }
284
+ else {
285
+ try {
286
+ const parsed = await readOptionalContextStoreMetadataState(root);
287
+ if (!parsed) {
288
+ metadata = { present: false, valid: false };
289
+ diagnostics.push(makeContextStoreDiagnostic('error', 'context_store_metadata_missing', 'Context store metadata is missing.', {
290
+ target: 'context_store.metadata',
291
+ fix: `Create ${metadataPath} or rerun context-store register.`,
292
+ }));
293
+ }
294
+ else if (parsed.id !== entry.id) {
295
+ metadata = { present: true, valid: false, id: parsed.id };
296
+ diagnostics.push(makeContextStoreDiagnostic('error', 'context_store_metadata_id_mismatch', `Context store metadata id '${parsed.id}' does not match registry id '${entry.id}'.`, {
297
+ target: 'context_store.metadata',
298
+ fix: 'Repair the local registry or store metadata so the ids match.',
299
+ }));
300
+ }
301
+ else {
302
+ metadata = { present: true, valid: true, id: parsed.id };
303
+ }
304
+ }
305
+ catch (error) {
306
+ metadata = { present: true, valid: false };
307
+ diagnostics.push(doctorStatusForError(error, 'context_store_metadata_invalid', 'context_store.metadata', `Repair ${metadataPath}.`));
308
+ }
309
+ git = {
310
+ isRepository: await isGitRepositoryAtRoot(root),
311
+ };
312
+ }
313
+ return {
314
+ id: entry.id,
315
+ root,
316
+ metadataPath,
317
+ metadata,
318
+ git,
319
+ diagnostics,
320
+ };
321
+ }
322
+ export async function doctorContextStores(id) {
323
+ const selectedId = id !== undefined ? validateContextStoreId(id) : undefined;
324
+ const registry = await readContextStoreRegistryState();
325
+ if (!registry) {
326
+ if (selectedId !== undefined) {
327
+ throw new ContextStoreError(`Unknown context store '${selectedId}'.`, 'context_store_not_found', {
328
+ target: 'context_store.id',
329
+ fix: 'Run pastelsdd context-store list to see registered stores.',
330
+ });
331
+ }
332
+ return { stores: [], diagnostics: [] };
333
+ }
334
+ const entries = listContextStoreRegistryEntries(registry);
335
+ const selected = selectedId
336
+ ? entries.filter((entry) => entry.id === selectedId)
337
+ : entries;
338
+ if (selectedId && selected.length === 0) {
339
+ throw new ContextStoreError(`Unknown context store '${selectedId}'.`, 'context_store_not_found', {
340
+ target: 'context_store.id',
341
+ fix: 'Run pastelsdd context-store list to see registered stores.',
342
+ });
343
+ }
344
+ return {
345
+ stores: await Promise.all(selected.map(inspectContextStore)),
346
+ diagnostics: [],
347
+ };
348
+ }
349
+ export function normalizeContextStorePathForComparison(targetPath) {
350
+ return FileSystemUtils.canonicalizeExistingPath(targetPath);
351
+ }
352
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1,35 @@
1
+ import { type ContextStoreBackendConfig, type ContextStoreGitBackendConfig, type ContextStorePathOptions, type ContextStoreRegistryEntry, type ContextStoreRegistryState } from './foundation.js';
2
+ export interface RegisterContextStoreInput extends ContextStorePathOptions {
3
+ id: string;
4
+ localPath: string;
5
+ remote?: string;
6
+ branch?: string;
7
+ cwd?: string;
8
+ }
9
+ export interface ResolveRegisteredContextStoreInput extends ContextStorePathOptions {
10
+ id: string;
11
+ }
12
+ export type ListRegisteredContextStoresOptions = ContextStorePathOptions;
13
+ export interface RegisteredContextStoreEntry extends ContextStoreRegistryEntry {
14
+ storeRoot: string;
15
+ }
16
+ export interface ResolvedContextStore {
17
+ id: string;
18
+ storeRoot: string;
19
+ backend: ContextStoreGitBackendConfig;
20
+ }
21
+ export interface ContextStoreRegistrationCommit extends ResolvedContextStore {
22
+ metadataCreated: boolean;
23
+ }
24
+ export interface CommitContextStoreRegistrationInput extends ContextStorePathOptions {
25
+ id: string;
26
+ backend: ContextStoreGitBackendConfig;
27
+ writeMetadataIfMissing: boolean;
28
+ }
29
+ export declare function getStoreRootForBackend(backend: ContextStoreBackendConfig): string;
30
+ export declare function assertNoRegisteredStoreConflict(registry: ContextStoreRegistryState | null, id: string, backend: ContextStoreGitBackendConfig): void;
31
+ export declare function commitContextStoreRegistration(input: CommitContextStoreRegistrationInput): Promise<ContextStoreRegistrationCommit>;
32
+ export declare function registerContextStore(input: RegisterContextStoreInput): Promise<ResolvedContextStore>;
33
+ export declare function listRegisteredContextStores(options?: ListRegisteredContextStoresOptions): Promise<RegisteredContextStoreEntry[]>;
34
+ export declare function resolveRegisteredContextStore(input: ResolveRegisteredContextStoreInput): Promise<ResolvedContextStore>;
35
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1,158 @@
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
+ async function ensureStoreMetadata(storeRoot, id, options) {
54
+ const metadata = await readOptionalContextStoreMetadataState(storeRoot);
55
+ if (!metadata) {
56
+ if (!options.writeIfMissing) {
57
+ throw new ContextStoreError(`Registered context store '${id}' is missing metadata at ${getContextStoreMetadataPath(storeRoot)}`, 'context_store_metadata_missing', {
58
+ target: 'context_store.metadata',
59
+ fix: `Create ${getContextStoreMetadataPath(storeRoot)} or rerun context-store register.`,
60
+ });
61
+ }
62
+ await writeContextStoreMetadataState(storeRoot, {
63
+ version: 1,
64
+ id,
65
+ });
66
+ return true;
67
+ }
68
+ if (metadata.id !== id) {
69
+ throw new ContextStoreError(`Context store metadata id '${metadata.id}' does not match registered id '${id}'`, 'context_store_metadata_id_mismatch', {
70
+ target: 'context_store.metadata',
71
+ fix: 'Repair the local registry or store metadata so the ids match.',
72
+ });
73
+ }
74
+ return false;
75
+ }
76
+ export async function commitContextStoreRegistration(input) {
77
+ const id = validateContextStoreId(input.id);
78
+ const backend = input.backend;
79
+ const storeRoot = getStoreRootForBackend(backend);
80
+ let metadataCreated = false;
81
+ try {
82
+ metadataCreated = await ensureStoreMetadata(storeRoot, id, {
83
+ writeIfMissing: input.writeMetadataIfMissing,
84
+ });
85
+ await updateContextStoreRegistryState((registry) => withRegisteredStore(registry, id, backend), { globalDataDir: input.globalDataDir });
86
+ }
87
+ catch (error) {
88
+ if (metadataCreated) {
89
+ await fs.rm(getContextStoreMetadataPath(storeRoot), { force: true });
90
+ await fs.rmdir(getContextStoreMetadataDir(storeRoot)).catch(() => undefined);
91
+ }
92
+ throw error;
93
+ }
94
+ return {
95
+ id,
96
+ storeRoot,
97
+ backend,
98
+ metadataCreated,
99
+ };
100
+ }
101
+ export async function registerContextStore(input) {
102
+ const id = validateContextStoreId(input.id);
103
+ const backend = await resolveGitContextStoreBackendConfig({
104
+ localPath: input.localPath,
105
+ ...(input.remote !== undefined ? { remote: input.remote } : {}),
106
+ ...(input.branch !== undefined ? { branch: input.branch } : {}),
107
+ }, input.cwd);
108
+ const storeRoot = getStoreRootForBackend(backend);
109
+ const committed = await commitContextStoreRegistration({
110
+ id,
111
+ backend,
112
+ writeMetadataIfMissing: true,
113
+ ...(input.globalDataDir ? { globalDataDir: input.globalDataDir } : {}),
114
+ });
115
+ return {
116
+ id: committed.id,
117
+ storeRoot: committed.storeRoot,
118
+ backend: committed.backend,
119
+ };
120
+ }
121
+ export async function listRegisteredContextStores(options = {}) {
122
+ const registry = await readContextStoreRegistryState(options);
123
+ if (!registry) {
124
+ return [];
125
+ }
126
+ return listContextStoreRegistryEntries(registry).map((entry) => ({
127
+ ...entry,
128
+ storeRoot: getStoreRootForBackend(entry.backend),
129
+ }));
130
+ }
131
+ export async function resolveRegisteredContextStore(input) {
132
+ const id = validateContextStoreId(input.id);
133
+ const registry = await readContextStoreRegistryState({
134
+ globalDataDir: input.globalDataDir,
135
+ });
136
+ if (!registry) {
137
+ throw new ContextStoreError('No context store registry found', 'no_context_store_registry', {
138
+ target: 'context_store.id',
139
+ fix: 'Register a context store before using --store, or pass --store-path <path>.',
140
+ });
141
+ }
142
+ const entry = registry.stores[id];
143
+ if (!entry) {
144
+ throw new ContextStoreError(`Unknown context store '${id}'`, 'context_store_not_found', {
145
+ target: 'context_store.id',
146
+ fix: 'Run pastelsdd context-store list to see registered stores.',
147
+ });
148
+ }
149
+ const backend = entry.backend;
150
+ const storeRoot = getStoreRootForBackend(backend);
151
+ await ensureStoreMetadata(storeRoot, id, { writeIfMissing: false });
152
+ return {
153
+ id,
154
+ storeRoot,
155
+ backend,
156
+ };
157
+ }
158
+ //# 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 = "pastelsdd";
2
+ export declare const GLOBAL_CONFIG_FILE_NAME = "config.json";
3
+ export declare const GLOBAL_DATA_DIR_NAME = "pastelsdd";
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/pastelsdd/ if XDG_CONFIG_HOME is set
16
+ * - Unix/macOS fallback: ~/.config/pastelsdd/
17
+ * - Windows fallback: %APPDATA%/pastelsdd/
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/pastelsdd/ if XDG_DATA_HOME is set
25
+ * - Unix/macOS fallback: ~/.local/share/pastelsdd/
26
+ * - Windows fallback: %LOCALAPPDATA%/pastelsdd/
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