@thiagodiogo/pscode 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +142 -0
  3. package/bin/pscode.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/claude.d.ts +13 -0
  107. package/dist/core/command-generation/adapters/claude.js +50 -0
  108. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  109. package/dist/core/command-generation/adapters/codex.js +39 -0
  110. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  111. package/dist/core/command-generation/adapters/cursor.js +44 -0
  112. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/gemini.js +26 -0
  114. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  115. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  116. package/dist/core/command-generation/adapters/index.d.ts +11 -0
  117. package/dist/core/command-generation/adapters/index.js +11 -0
  118. package/dist/core/command-generation/generator.d.ts +21 -0
  119. package/dist/core/command-generation/generator.js +27 -0
  120. package/dist/core/command-generation/index.d.ts +22 -0
  121. package/dist/core/command-generation/index.js +24 -0
  122. package/dist/core/command-generation/registry.d.ts +35 -0
  123. package/dist/core/command-generation/registry.js +55 -0
  124. package/dist/core/command-generation/types.d.ts +56 -0
  125. package/dist/core/command-generation/types.js +8 -0
  126. package/dist/core/completions/command-registry.d.ts +3 -0
  127. package/dist/core/completions/command-registry.js +939 -0
  128. package/dist/core/completions/completion-provider.d.ts +71 -0
  129. package/dist/core/completions/completion-provider.js +129 -0
  130. package/dist/core/completions/factory.d.ts +64 -0
  131. package/dist/core/completions/factory.js +75 -0
  132. package/dist/core/completions/generators/bash-generator.d.ts +35 -0
  133. package/dist/core/completions/generators/bash-generator.js +230 -0
  134. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  135. package/dist/core/completions/generators/fish-generator.js +160 -0
  136. package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
  137. package/dist/core/completions/generators/powershell-generator.js +266 -0
  138. package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
  139. package/dist/core/completions/generators/zsh-generator.js +274 -0
  140. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  141. package/dist/core/completions/installers/bash-installer.js +318 -0
  142. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  143. package/dist/core/completions/installers/fish-installer.js +143 -0
  144. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  145. package/dist/core/completions/installers/powershell-installer.js +387 -0
  146. package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
  147. package/dist/core/completions/installers/zsh-installer.js +421 -0
  148. package/dist/core/completions/shared-flags.d.ts +12 -0
  149. package/dist/core/completions/shared-flags.js +28 -0
  150. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  151. package/dist/core/completions/templates/bash-templates.js +30 -0
  152. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  153. package/dist/core/completions/templates/fish-templates.js +45 -0
  154. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  155. package/dist/core/completions/templates/powershell-templates.js +34 -0
  156. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  157. package/dist/core/completions/templates/zsh-templates.js +45 -0
  158. package/dist/core/completions/types.d.ts +101 -0
  159. package/dist/core/completions/types.js +2 -0
  160. package/dist/core/config-prompts.d.ts +9 -0
  161. package/dist/core/config-prompts.js +34 -0
  162. package/dist/core/config-schema.d.ts +86 -0
  163. package/dist/core/config-schema.js +213 -0
  164. package/dist/core/config.d.ts +18 -0
  165. package/dist/core/config.js +13 -0
  166. package/dist/core/context-store/binding.d.ts +53 -0
  167. package/dist/core/context-store/binding.js +197 -0
  168. package/dist/core/context-store/errors.d.ts +20 -0
  169. package/dist/core/context-store/errors.js +22 -0
  170. package/dist/core/context-store/foundation.d.ts +54 -0
  171. package/dist/core/context-store/foundation.js +318 -0
  172. package/dist/core/context-store/index.d.ts +6 -0
  173. package/dist/core/context-store/index.js +6 -0
  174. package/dist/core/context-store/operations.d.ts +62 -0
  175. package/dist/core/context-store/operations.js +352 -0
  176. package/dist/core/context-store/registry.d.ts +35 -0
  177. package/dist/core/context-store/registry.js +158 -0
  178. package/dist/core/converters/json-converter.d.ts +6 -0
  179. package/dist/core/converters/json-converter.js +51 -0
  180. package/dist/core/global-config.d.ts +49 -0
  181. package/dist/core/global-config.js +124 -0
  182. package/dist/core/index.d.ts +6 -0
  183. package/dist/core/index.js +7 -0
  184. package/dist/core/init.d.ts +40 -0
  185. package/dist/core/init.js +676 -0
  186. package/dist/core/legacy-cleanup.d.ts +162 -0
  187. package/dist/core/legacy-cleanup.js +489 -0
  188. package/dist/core/list.d.ts +9 -0
  189. package/dist/core/list.js +171 -0
  190. package/dist/core/migration.d.ts +23 -0
  191. package/dist/core/migration.js +108 -0
  192. package/dist/core/openspec-migration.d.ts +71 -0
  193. package/dist/core/openspec-migration.js +320 -0
  194. package/dist/core/parsers/change-parser.d.ts +13 -0
  195. package/dist/core/parsers/change-parser.js +197 -0
  196. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  197. package/dist/core/parsers/markdown-parser.js +227 -0
  198. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  199. package/dist/core/parsers/requirement-blocks.js +201 -0
  200. package/dist/core/parsers/spec-structure.d.ts +9 -0
  201. package/dist/core/parsers/spec-structure.js +88 -0
  202. package/dist/core/planning-home.d.ts +21 -0
  203. package/dist/core/planning-home.js +108 -0
  204. package/dist/core/profile-sync-drift.d.ts +38 -0
  205. package/dist/core/profile-sync-drift.js +203 -0
  206. package/dist/core/profiles.d.ts +26 -0
  207. package/dist/core/profiles.js +43 -0
  208. package/dist/core/project-config.d.ts +64 -0
  209. package/dist/core/project-config.js +223 -0
  210. package/dist/core/schemas/base.schema.d.ts +13 -0
  211. package/dist/core/schemas/base.schema.js +13 -0
  212. package/dist/core/schemas/change.schema.d.ts +73 -0
  213. package/dist/core/schemas/change.schema.js +31 -0
  214. package/dist/core/schemas/index.d.ts +4 -0
  215. package/dist/core/schemas/index.js +4 -0
  216. package/dist/core/schemas/spec.schema.d.ts +18 -0
  217. package/dist/core/schemas/spec.schema.js +15 -0
  218. package/dist/core/shared/index.d.ts +8 -0
  219. package/dist/core/shared/index.js +8 -0
  220. package/dist/core/shared/skill-generation.d.ts +49 -0
  221. package/dist/core/shared/skill-generation.js +102 -0
  222. package/dist/core/shared/tool-detection.d.ts +71 -0
  223. package/dist/core/shared/tool-detection.js +158 -0
  224. package/dist/core/specs-apply.d.ts +73 -0
  225. package/dist/core/specs-apply.js +392 -0
  226. package/dist/core/styles/palette.d.ts +7 -0
  227. package/dist/core/styles/palette.js +8 -0
  228. package/dist/core/templates/index.d.ts +8 -0
  229. package/dist/core/templates/index.js +9 -0
  230. package/dist/core/templates/skill-templates.d.ts +21 -0
  231. package/dist/core/templates/skill-templates.js +21 -0
  232. package/dist/core/templates/types.d.ts +19 -0
  233. package/dist/core/templates/types.js +5 -0
  234. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  235. package/dist/core/templates/workflows/apply-change.js +287 -0
  236. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  237. package/dist/core/templates/workflows/archive-change.js +227 -0
  238. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  239. package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
  240. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  241. package/dist/core/templates/workflows/continue-change.js +234 -0
  242. package/dist/core/templates/workflows/explore.d.ts +10 -0
  243. package/dist/core/templates/workflows/explore.js +755 -0
  244. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  245. package/dist/core/templates/workflows/feedback.js +108 -0
  246. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  247. package/dist/core/templates/workflows/ff-change.js +200 -0
  248. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  249. package/dist/core/templates/workflows/new-change.js +143 -0
  250. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  251. package/dist/core/templates/workflows/onboard.js +607 -0
  252. package/dist/core/templates/workflows/propose.d.ts +10 -0
  253. package/dist/core/templates/workflows/propose.js +347 -0
  254. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  255. package/dist/core/templates/workflows/sync-specs.js +290 -0
  256. package/dist/core/templates/workflows/trello-draft.d.ts +12 -0
  257. package/dist/core/templates/workflows/trello-draft.js +217 -0
  258. package/dist/core/templates/workflows/trello-setup.d.ts +12 -0
  259. package/dist/core/templates/workflows/trello-setup.js +315 -0
  260. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  261. package/dist/core/templates/workflows/verify-change.js +338 -0
  262. package/dist/core/trello-config.d.ts +90 -0
  263. package/dist/core/trello-config.js +86 -0
  264. package/dist/core/trello-init-prompt.d.ts +61 -0
  265. package/dist/core/trello-init-prompt.js +180 -0
  266. package/dist/core/update.d.ts +82 -0
  267. package/dist/core/update.js +560 -0
  268. package/dist/core/validation/constants.d.ts +34 -0
  269. package/dist/core/validation/constants.js +40 -0
  270. package/dist/core/validation/types.d.ts +18 -0
  271. package/dist/core/validation/types.js +2 -0
  272. package/dist/core/validation/validator.d.ts +33 -0
  273. package/dist/core/validation/validator.js +418 -0
  274. package/dist/core/view.d.ts +8 -0
  275. package/dist/core/view.js +168 -0
  276. package/dist/core/workspace/foundation.d.ts +62 -0
  277. package/dist/core/workspace/foundation.js +274 -0
  278. package/dist/core/workspace/index.d.ts +8 -0
  279. package/dist/core/workspace/index.js +8 -0
  280. package/dist/core/workspace/legacy-state.d.ts +28 -0
  281. package/dist/core/workspace/legacy-state.js +200 -0
  282. package/dist/core/workspace/link-input.d.ts +9 -0
  283. package/dist/core/workspace/link-input.js +32 -0
  284. package/dist/core/workspace/open-surface.d.ts +43 -0
  285. package/dist/core/workspace/open-surface.js +214 -0
  286. package/dist/core/workspace/openers.d.ts +21 -0
  287. package/dist/core/workspace/openers.js +119 -0
  288. package/dist/core/workspace/registry.d.ts +24 -0
  289. package/dist/core/workspace/registry.js +146 -0
  290. package/dist/core/workspace/skills.d.ts +57 -0
  291. package/dist/core/workspace/skills.js +334 -0
  292. package/dist/core/workspace/state-io.d.ts +10 -0
  293. package/dist/core/workspace/state-io.js +119 -0
  294. package/dist/index.d.ts +3 -0
  295. package/dist/index.js +3 -0
  296. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  297. package/dist/prompts/searchable-multi-select.js +159 -0
  298. package/dist/telemetry/config.d.ts +38 -0
  299. package/dist/telemetry/config.js +136 -0
  300. package/dist/telemetry/index.d.ts +31 -0
  301. package/dist/telemetry/index.js +164 -0
  302. package/dist/ui/ascii-patterns.d.ts +16 -0
  303. package/dist/ui/ascii-patterns.js +133 -0
  304. package/dist/ui/welcome-screen.d.ts +10 -0
  305. package/dist/ui/welcome-screen.js +146 -0
  306. package/dist/utils/change-metadata.d.ts +54 -0
  307. package/dist/utils/change-metadata.js +141 -0
  308. package/dist/utils/change-utils.d.ts +71 -0
  309. package/dist/utils/change-utils.js +123 -0
  310. package/dist/utils/command-references.d.ts +18 -0
  311. package/dist/utils/command-references.js +20 -0
  312. package/dist/utils/file-system.d.ts +41 -0
  313. package/dist/utils/file-system.js +301 -0
  314. package/dist/utils/index.d.ts +6 -0
  315. package/dist/utils/index.js +9 -0
  316. package/dist/utils/interactive.d.ts +18 -0
  317. package/dist/utils/interactive.js +21 -0
  318. package/dist/utils/item-discovery.d.ts +4 -0
  319. package/dist/utils/item-discovery.js +72 -0
  320. package/dist/utils/match.d.ts +3 -0
  321. package/dist/utils/match.js +22 -0
  322. package/dist/utils/shell-detection.d.ts +20 -0
  323. package/dist/utils/shell-detection.js +41 -0
  324. package/dist/utils/task-progress.d.ts +8 -0
  325. package/dist/utils/task-progress.js +36 -0
  326. package/package.json +84 -0
  327. package/schemas/spec-driven/schema.yaml +153 -0
  328. package/schemas/spec-driven/templates/design.md +19 -0
  329. package/schemas/spec-driven/templates/proposal.md +23 -0
  330. package/schemas/spec-driven/templates/spec.md +8 -0
  331. package/schemas/spec-driven/templates/tasks.md +9 -0
  332. package/schemas/workspace-planning/schema.yaml +72 -0
  333. package/schemas/workspace-planning/templates/design.md +33 -0
  334. package/schemas/workspace-planning/templates/proposal.md +28 -0
  335. package/schemas/workspace-planning/templates/spec.md +9 -0
  336. package/schemas/workspace-planning/templates/tasks.md +15 -0
  337. package/scripts/postinstall.js +83 -0
@@ -0,0 +1,46 @@
1
+ export type CollectionMetadata = Readonly<Record<string, unknown>>;
2
+ export type CollectionHooks = Readonly<Record<string, unknown>>;
3
+ export interface CollectionDefinition<THandle = unknown> {
4
+ id: string;
5
+ mount: string;
6
+ metadata?: CollectionMetadata;
7
+ hooks?: CollectionHooks;
8
+ createHandle?: (context: MountedCollectionContext) => THandle;
9
+ }
10
+ export interface CollectionRegistry {
11
+ list(): readonly CollectionDefinition[];
12
+ get<THandle = unknown>(collectionId: string): CollectionDefinition<THandle> | undefined;
13
+ require<THandle = unknown>(collectionId: string): CollectionDefinition<THandle>;
14
+ }
15
+ export interface MountedCollectionContext {
16
+ storeRoot: string;
17
+ collectionId: string;
18
+ mount: string;
19
+ mountRoot: string;
20
+ resolvePath(relativePath?: string): string;
21
+ toStorePath(relativePath?: string): string;
22
+ }
23
+ export interface MountedCollection<THandle = unknown> {
24
+ collectionId: string;
25
+ mount: string;
26
+ mountRoot: string;
27
+ context: MountedCollectionContext;
28
+ handle: THandle | undefined;
29
+ resolvePath(relativePath?: string): string;
30
+ toStorePath(relativePath?: string): string;
31
+ }
32
+ export interface MountedCollectionRegistry {
33
+ list(): readonly MountedCollection[];
34
+ get<THandle = unknown>(collectionId: string): MountedCollection<THandle> | undefined;
35
+ require<THandle = unknown>(collectionId: string): MountedCollection<THandle>;
36
+ }
37
+ export interface MountCollectionsInput {
38
+ storeRoot: string;
39
+ collections: CollectionRegistry;
40
+ }
41
+ export declare function validateCollectionId(id: string): string;
42
+ export declare function validateMount(mount: string): string;
43
+ export declare function parseCollectionPath(input?: string): string;
44
+ export declare function createCollectionRegistry(definitions: readonly CollectionDefinition[]): CollectionRegistry;
45
+ export declare function mountCollections(input: MountCollectionsInput): MountedCollectionRegistry;
46
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1,194 @@
1
+ import * as path from 'node:path';
2
+ import { FileSystemUtils } from '../../utils/file-system.js';
3
+ function assertNoNul(value, label) {
4
+ if (value.includes('\0')) {
5
+ throw new Error(`${label} must not contain NUL bytes`);
6
+ }
7
+ }
8
+ function validateKebabSegment(value, label) {
9
+ assertNoNul(value, label);
10
+ if (value.length === 0) {
11
+ throw new Error(`${label} must not be empty`);
12
+ }
13
+ if (value === '.' || value === '..') {
14
+ throw new Error(`${label} must not be '${value}'`);
15
+ }
16
+ if (/[\\/]/u.test(value)) {
17
+ throw new Error(`${label} must not contain path separators`);
18
+ }
19
+ if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(value)) {
20
+ throw new Error(`${label} must be kebab-case with lowercase letters, numbers, and single hyphen separators`);
21
+ }
22
+ return value;
23
+ }
24
+ export function validateCollectionId(id) {
25
+ return validateKebabSegment(id, 'Collection id');
26
+ }
27
+ export function validateMount(mount) {
28
+ assertNoNul(mount, 'Collection mount');
29
+ if (mount.startsWith('.')) {
30
+ throw new Error(`Collection mount '${mount}' is reserved`);
31
+ }
32
+ return validateKebabSegment(mount, 'Collection mount');
33
+ }
34
+ function isWindowsDrivePath(value) {
35
+ return /^[A-Za-z]:/u.test(value);
36
+ }
37
+ function isUncPath(value) {
38
+ return value.startsWith('\\\\') || value.startsWith('//');
39
+ }
40
+ export function parseCollectionPath(input = '') {
41
+ assertNoNul(input, 'Collection path');
42
+ if (input.length === 0) {
43
+ return '';
44
+ }
45
+ if (input.includes('\\')) {
46
+ throw new Error('Collection path must use forward slashes');
47
+ }
48
+ if (isWindowsDrivePath(input)) {
49
+ throw new Error('Collection path must not be a Windows drive path');
50
+ }
51
+ if (isUncPath(input) || path.posix.isAbsolute(input)) {
52
+ throw new Error('Collection path must be relative');
53
+ }
54
+ const segments = input.split('/');
55
+ for (const segment of segments) {
56
+ if (segment.length === 0) {
57
+ throw new Error('Collection path must not contain empty segments');
58
+ }
59
+ if (segment === '.' || segment === '..') {
60
+ throw new Error('Collection path must not contain dot segments');
61
+ }
62
+ }
63
+ return segments.join('/');
64
+ }
65
+ function compareCollectionDefinitions(a, b) {
66
+ return a.id.localeCompare(b.id);
67
+ }
68
+ export function createCollectionRegistry(definitions) {
69
+ const byId = new Map();
70
+ const mountOwners = new Map();
71
+ for (const definition of definitions) {
72
+ const id = validateCollectionId(definition.id);
73
+ const mount = validateMount(definition.mount);
74
+ if (byId.has(id)) {
75
+ throw new Error(`Duplicate collection id '${id}'`);
76
+ }
77
+ const existingMountOwner = mountOwners.get(mount);
78
+ if (existingMountOwner) {
79
+ throw new Error(`Duplicate collection mount '${mount}' for '${existingMountOwner}' and '${id}'`);
80
+ }
81
+ const normalizedDefinition = {
82
+ ...definition,
83
+ id,
84
+ mount,
85
+ };
86
+ byId.set(id, normalizedDefinition);
87
+ mountOwners.set(mount, id);
88
+ }
89
+ const sortedDefinitions = Array.from(byId.values()).sort(compareCollectionDefinitions);
90
+ return {
91
+ list() {
92
+ return [...sortedDefinitions];
93
+ },
94
+ get(collectionId) {
95
+ const id = validateCollectionId(collectionId);
96
+ return byId.get(id);
97
+ },
98
+ require(collectionId) {
99
+ const definition = this.get(collectionId);
100
+ if (!definition) {
101
+ throw new Error(`Unknown collection '${collectionId}'`);
102
+ }
103
+ return definition;
104
+ },
105
+ };
106
+ }
107
+ function isWindowsLikePath(candidatePath) {
108
+ return /^[A-Za-z]:[\\/]/u.test(candidatePath) || candidatePath.startsWith('\\\\');
109
+ }
110
+ function relativePath(fromPath, toPath) {
111
+ if (isWindowsLikePath(fromPath) || isWindowsLikePath(toPath)) {
112
+ return path.win32.relative(path.win32.normalize(fromPath), path.win32.normalize(toPath));
113
+ }
114
+ return path.posix.relative(fromPath.replace(/\\/g, '/'), toPath.replace(/\\/g, '/'));
115
+ }
116
+ function isRelativePathAbsolute(value, windowsLike) {
117
+ return windowsLike ? path.win32.isAbsolute(value) : path.posix.isAbsolute(value);
118
+ }
119
+ function isSameOrDescendant(rootPath, candidatePath) {
120
+ const windowsLike = isWindowsLikePath(rootPath) || isWindowsLikePath(candidatePath);
121
+ const relative = relativePath(rootPath, candidatePath);
122
+ const escapesRoot = /^\.\.(?:[\\/]|$)/u.test(relative);
123
+ return (relative === '' ||
124
+ (!escapesRoot && !isRelativePathAbsolute(relative, windowsLike)));
125
+ }
126
+ function getMountRoot(storeRoot, mount) {
127
+ return FileSystemUtils.joinPath(storeRoot, validateMount(mount));
128
+ }
129
+ function resolvePathInsideMount(mountRoot, relativePath) {
130
+ const collectionPath = parseCollectionPath(relativePath);
131
+ const resolvedPath = collectionPath.length > 0
132
+ ? FileSystemUtils.joinPath(mountRoot, collectionPath)
133
+ : mountRoot;
134
+ if (!isSameOrDescendant(mountRoot, resolvedPath)) {
135
+ throw new Error(`Collection path escapes mount: ${relativePath ?? ''}`);
136
+ }
137
+ return resolvedPath;
138
+ }
139
+ function toStorePath(mount, relativePath) {
140
+ const collectionPath = parseCollectionPath(relativePath);
141
+ return collectionPath.length > 0
142
+ ? `${validateMount(mount)}/${collectionPath}`
143
+ : validateMount(mount);
144
+ }
145
+ function createMountedCollection(storeRoot, definition) {
146
+ const mountRoot = getMountRoot(storeRoot, definition.mount);
147
+ const resolveMountedPath = (relativePath) => resolvePathInsideMount(mountRoot, relativePath);
148
+ const resolveStorePath = (relativePath) => toStorePath(definition.mount, relativePath);
149
+ const context = {
150
+ storeRoot,
151
+ collectionId: definition.id,
152
+ mount: definition.mount,
153
+ mountRoot,
154
+ resolvePath: resolveMountedPath,
155
+ toStorePath: resolveStorePath,
156
+ };
157
+ return {
158
+ collectionId: definition.id,
159
+ mount: definition.mount,
160
+ mountRoot,
161
+ context,
162
+ handle: definition.createHandle?.(context),
163
+ resolvePath: resolveMountedPath,
164
+ toStorePath: resolveStorePath,
165
+ };
166
+ }
167
+ export function mountCollections(input) {
168
+ if (input.storeRoot.length === 0) {
169
+ throw new Error('Context store root must not be empty');
170
+ }
171
+ const byId = new Map();
172
+ for (const definition of input.collections.list()) {
173
+ const mountedCollection = createMountedCollection(input.storeRoot, definition);
174
+ byId.set(mountedCollection.collectionId, mountedCollection);
175
+ }
176
+ const sortedCollections = Array.from(byId.values()).sort((a, b) => a.collectionId.localeCompare(b.collectionId));
177
+ return {
178
+ list() {
179
+ return [...sortedCollections];
180
+ },
181
+ get(collectionId) {
182
+ const id = validateCollectionId(collectionId);
183
+ return byId.get(id);
184
+ },
185
+ require(collectionId) {
186
+ const mountedCollection = this.get(collectionId);
187
+ if (!mountedCollection) {
188
+ throw new Error(`Unknown mounted collection '${collectionId}'`);
189
+ }
190
+ return mountedCollection;
191
+ },
192
+ };
193
+ }
194
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Claude Code Command Adapter
3
+ *
4
+ * Formats commands for Claude Code following its frontmatter specification.
5
+ */
6
+ import type { ToolCommandAdapter } from '../types.js';
7
+ /**
8
+ * Claude Code adapter for command generation.
9
+ * File path: .claude/commands/ps/<id>.md
10
+ * Frontmatter: name, description, category, tags
11
+ */
12
+ export declare const claudeAdapter: ToolCommandAdapter;
13
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Claude Code Command Adapter
3
+ *
4
+ * Formats commands for Claude Code following its frontmatter specification.
5
+ */
6
+ import path from 'path';
7
+ /**
8
+ * Escapes a string value for safe YAML output.
9
+ * Quotes the string if it contains special YAML characters.
10
+ */
11
+ function escapeYamlValue(value) {
12
+ // Check if value needs quoting (contains special YAML characters or starts/ends with whitespace)
13
+ const needsQuoting = /[:\n\r#{}[\],&*!|>'"%@`]|^\s|\s$/.test(value);
14
+ if (needsQuoting) {
15
+ // Use double quotes and escape internal double quotes and backslashes
16
+ const escaped = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n');
17
+ return `"${escaped}"`;
18
+ }
19
+ return value;
20
+ }
21
+ /**
22
+ * Formats a tags array as a YAML array with proper escaping.
23
+ */
24
+ function formatTagsArray(tags) {
25
+ const escapedTags = tags.map((tag) => escapeYamlValue(tag));
26
+ return `[${escapedTags.join(', ')}]`;
27
+ }
28
+ /**
29
+ * Claude Code adapter for command generation.
30
+ * File path: .claude/commands/ps/<id>.md
31
+ * Frontmatter: name, description, category, tags
32
+ */
33
+ export const claudeAdapter = {
34
+ toolId: 'claude',
35
+ getFilePath(commandId) {
36
+ return path.join('.claude', 'commands', 'ps', `${commandId}.md`);
37
+ },
38
+ formatFile(content) {
39
+ return `---
40
+ name: ${escapeYamlValue(content.name)}
41
+ description: ${escapeYamlValue(content.description)}
42
+ category: ${escapeYamlValue(content.category)}
43
+ tags: ${formatTagsArray(content.tags)}
44
+ ---
45
+
46
+ ${content.body}
47
+ `;
48
+ },
49
+ };
50
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1,16 @@
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/ps-<id>.md (absolute, global)
13
+ * Frontmatter: description, argument-hint
14
+ */
15
+ export declare const codexAdapter: ToolCommandAdapter;
16
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1,39 @@
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/ps-<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', `ps-${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
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Cursor Command Adapter
3
+ *
4
+ * Formats commands for Cursor following its frontmatter specification.
5
+ * Cursor uses a different frontmatter format and file naming convention.
6
+ */
7
+ import type { ToolCommandAdapter } from '../types.js';
8
+ /**
9
+ * Cursor adapter for command generation.
10
+ * File path: .cursor/commands/ps-<id>.md
11
+ * Frontmatter: name (as /ps-<id>), id, category, description
12
+ */
13
+ export declare const cursorAdapter: ToolCommandAdapter;
14
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Cursor Command Adapter
3
+ *
4
+ * Formats commands for Cursor following its frontmatter specification.
5
+ * Cursor uses a different frontmatter format and file naming convention.
6
+ */
7
+ import path from 'path';
8
+ /**
9
+ * Escapes a string value for safe YAML output.
10
+ * Quotes the string if it contains special YAML characters.
11
+ */
12
+ function escapeYamlValue(value) {
13
+ // Check if value needs quoting (contains special YAML characters or starts/ends with whitespace)
14
+ const needsQuoting = /[:\n\r#{}[\],&*!|>'"%@`]|^\s|\s$/.test(value);
15
+ if (needsQuoting) {
16
+ // Use double quotes and escape internal double quotes and backslashes
17
+ const escaped = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n');
18
+ return `"${escaped}"`;
19
+ }
20
+ return value;
21
+ }
22
+ /**
23
+ * Cursor adapter for command generation.
24
+ * File path: .cursor/commands/ps-<id>.md
25
+ * Frontmatter: name (as /ps-<id>), id, category, description
26
+ */
27
+ export const cursorAdapter = {
28
+ toolId: 'cursor',
29
+ getFilePath(commandId) {
30
+ return path.join('.cursor', 'commands', `ps-${commandId}.md`);
31
+ },
32
+ formatFile(content) {
33
+ return `---
34
+ name: /ps-${content.id}
35
+ id: ps-${content.id}
36
+ category: ${escapeYamlValue(content.category)}
37
+ description: ${escapeYamlValue(content.description)}
38
+ ---
39
+
40
+ ${content.body}
41
+ `;
42
+ },
43
+ };
44
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Gemini CLI Command Adapter
3
+ *
4
+ * Formats commands for Gemini CLI following its TOML specification.
5
+ */
6
+ import type { ToolCommandAdapter } from '../types.js';
7
+ /**
8
+ * Gemini adapter for command generation.
9
+ * File path: .gemini/commands/ps/<id>.toml
10
+ * Format: TOML with description and prompt fields
11
+ */
12
+ export declare const geminiAdapter: ToolCommandAdapter;
13
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Gemini CLI Command Adapter
3
+ *
4
+ * Formats commands for Gemini CLI following its TOML specification.
5
+ */
6
+ import path from 'path';
7
+ /**
8
+ * Gemini adapter for command generation.
9
+ * File path: .gemini/commands/ps/<id>.toml
10
+ * Format: TOML with description and prompt fields
11
+ */
12
+ export const geminiAdapter = {
13
+ toolId: 'gemini',
14
+ getFilePath(commandId) {
15
+ return path.join('.gemini', 'commands', 'ps', `${commandId}.toml`);
16
+ },
17
+ formatFile(content) {
18
+ return `description = "${content.description}"
19
+
20
+ prompt = """
21
+ ${content.body}
22
+ """
23
+ `;
24
+ },
25
+ };
26
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * GitHub Copilot Command Adapter
3
+ *
4
+ * Formats commands for GitHub Copilot following its .prompt.md specification.
5
+ */
6
+ import type { ToolCommandAdapter } from '../types.js';
7
+ /**
8
+ * GitHub Copilot adapter for command generation.
9
+ * File path: .github/prompts/ps-<id>.prompt.md
10
+ * Frontmatter: description
11
+ */
12
+ export declare const githubCopilotAdapter: ToolCommandAdapter;
13
+ //# sourceMappingURL=github-copilot.d.ts.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * GitHub Copilot Command Adapter
3
+ *
4
+ * Formats commands for GitHub Copilot following its .prompt.md specification.
5
+ */
6
+ import path from 'path';
7
+ /**
8
+ * GitHub Copilot adapter for command generation.
9
+ * File path: .github/prompts/ps-<id>.prompt.md
10
+ * Frontmatter: description
11
+ */
12
+ export const githubCopilotAdapter = {
13
+ toolId: 'github-copilot',
14
+ getFilePath(commandId) {
15
+ return path.join('.github', 'prompts', `ps-${commandId}.prompt.md`);
16
+ },
17
+ formatFile(content) {
18
+ return `---
19
+ description: ${content.description}
20
+ ---
21
+
22
+ ${content.body}
23
+ `;
24
+ },
25
+ };
26
+ //# sourceMappingURL=github-copilot.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Command Adapters Index
3
+ *
4
+ * Re-exports all tool command adapters.
5
+ */
6
+ export { claudeAdapter } from './claude.js';
7
+ export { codexAdapter } from './codex.js';
8
+ export { cursorAdapter } from './cursor.js';
9
+ export { geminiAdapter } from './gemini.js';
10
+ export { githubCopilotAdapter } from './github-copilot.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Command Adapters Index
3
+ *
4
+ * Re-exports all tool command adapters.
5
+ */
6
+ export { claudeAdapter } from './claude.js';
7
+ export { codexAdapter } from './codex.js';
8
+ export { cursorAdapter } from './cursor.js';
9
+ export { geminiAdapter } from './gemini.js';
10
+ export { githubCopilotAdapter } from './github-copilot.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Command Generator
3
+ *
4
+ * Functions for generating command files using tool adapters.
5
+ */
6
+ import type { CommandContent, ToolCommandAdapter, GeneratedCommand } from './types.js';
7
+ /**
8
+ * Generate a single command file using the provided adapter.
9
+ * @param content - The tool-agnostic command content
10
+ * @param adapter - The tool-specific adapter
11
+ * @returns Generated command with path and file content
12
+ */
13
+ export declare function generateCommand(content: CommandContent, adapter: ToolCommandAdapter): GeneratedCommand;
14
+ /**
15
+ * Generate multiple command files using the provided adapter.
16
+ * @param contents - Array of tool-agnostic command contents
17
+ * @param adapter - The tool-specific adapter
18
+ * @returns Array of generated commands with paths and file contents
19
+ */
20
+ export declare function generateCommands(contents: CommandContent[], adapter: ToolCommandAdapter): GeneratedCommand[];
21
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Command Generator
3
+ *
4
+ * Functions for generating command files using tool adapters.
5
+ */
6
+ /**
7
+ * Generate a single command file using the provided adapter.
8
+ * @param content - The tool-agnostic command content
9
+ * @param adapter - The tool-specific adapter
10
+ * @returns Generated command with path and file content
11
+ */
12
+ export function generateCommand(content, adapter) {
13
+ return {
14
+ path: adapter.getFilePath(content.id),
15
+ fileContent: adapter.formatFile(content),
16
+ };
17
+ }
18
+ /**
19
+ * Generate multiple command files using the provided adapter.
20
+ * @param contents - Array of tool-agnostic command contents
21
+ * @param adapter - The tool-specific adapter
22
+ * @returns Array of generated commands with paths and file contents
23
+ */
24
+ export function generateCommands(contents, adapter) {
25
+ return contents.map((content) => generateCommand(content, adapter));
26
+ }
27
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Command Generation Module
3
+ *
4
+ * Generic command generation system with tool-specific adapters.
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * import { generateCommands, CommandAdapterRegistry, type CommandContent } from './command-generation/index.js';
9
+ *
10
+ * const contents: CommandContent[] = [...];
11
+ * const adapter = CommandAdapterRegistry.get('cursor');
12
+ * if (adapter) {
13
+ * const commands = generateCommands(contents, adapter);
14
+ * // Write commands to disk
15
+ * }
16
+ * ```
17
+ */
18
+ export type { CommandContent, ToolCommandAdapter, GeneratedCommand, } from './types.js';
19
+ export { CommandAdapterRegistry } from './registry.js';
20
+ export { generateCommand, generateCommands } from './generator.js';
21
+ export { claudeAdapter, codexAdapter, cursorAdapter, geminiAdapter, githubCopilotAdapter } from './adapters/index.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Command Generation Module
3
+ *
4
+ * Generic command generation system with tool-specific adapters.
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * import { generateCommands, CommandAdapterRegistry, type CommandContent } from './command-generation/index.js';
9
+ *
10
+ * const contents: CommandContent[] = [...];
11
+ * const adapter = CommandAdapterRegistry.get('cursor');
12
+ * if (adapter) {
13
+ * const commands = generateCommands(contents, adapter);
14
+ * // Write commands to disk
15
+ * }
16
+ * ```
17
+ */
18
+ // Registry
19
+ export { CommandAdapterRegistry } from './registry.js';
20
+ // Generator functions
21
+ export { generateCommand, generateCommands } from './generator.js';
22
+ // Adapters (for direct access if needed)
23
+ export { claudeAdapter, codexAdapter, cursorAdapter, geminiAdapter, githubCopilotAdapter } from './adapters/index.js';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Command Adapter Registry
3
+ *
4
+ * Centralized registry for tool command adapters.
5
+ */
6
+ import type { ToolCommandAdapter } from './types.js';
7
+ /**
8
+ * Registry for looking up tool command adapters.
9
+ */
10
+ export declare class CommandAdapterRegistry {
11
+ private static adapters;
12
+ /**
13
+ * Register a tool command adapter.
14
+ * @param adapter - The adapter to register
15
+ */
16
+ static register(adapter: ToolCommandAdapter): void;
17
+ /**
18
+ * Get an adapter by tool ID.
19
+ * @param toolId - The tool identifier (e.g., 'claude', 'cursor')
20
+ * @returns The adapter or undefined if not registered
21
+ */
22
+ static get(toolId: string): ToolCommandAdapter | undefined;
23
+ /**
24
+ * Get all registered adapters.
25
+ * @returns Array of all registered adapters
26
+ */
27
+ static getAll(): ToolCommandAdapter[];
28
+ /**
29
+ * Check if an adapter is registered for a tool.
30
+ * @param toolId - The tool identifier
31
+ * @returns True if an adapter exists
32
+ */
33
+ static has(toolId: string): boolean;
34
+ }
35
+ //# sourceMappingURL=registry.d.ts.map