@bobby_z/openspec 0.0.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 (234) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +204 -0
  3. package/bin/openspec.js +3 -0
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.js +482 -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 +257 -0
  10. package/dist/commands/config.d.ts +8 -0
  11. package/dist/commands/config.js +198 -0
  12. package/dist/commands/feedback.d.ts +9 -0
  13. package/dist/commands/feedback.js +183 -0
  14. package/dist/commands/schema.d.ts +6 -0
  15. package/dist/commands/schema.js +869 -0
  16. package/dist/commands/show.d.ts +14 -0
  17. package/dist/commands/show.js +132 -0
  18. package/dist/commands/spec.d.ts +15 -0
  19. package/dist/commands/spec.js +225 -0
  20. package/dist/commands/validate.d.ts +24 -0
  21. package/dist/commands/validate.js +294 -0
  22. package/dist/commands/workflow/index.d.ts +17 -0
  23. package/dist/commands/workflow/index.js +12 -0
  24. package/dist/commands/workflow/instructions.d.ts +29 -0
  25. package/dist/commands/workflow/instructions.js +381 -0
  26. package/dist/commands/workflow/new-change.d.ts +11 -0
  27. package/dist/commands/workflow/new-change.js +44 -0
  28. package/dist/commands/workflow/schemas.d.ts +10 -0
  29. package/dist/commands/workflow/schemas.js +34 -0
  30. package/dist/commands/workflow/shared.d.ts +52 -0
  31. package/dist/commands/workflow/shared.js +111 -0
  32. package/dist/commands/workflow/status.d.ts +14 -0
  33. package/dist/commands/workflow/status.js +58 -0
  34. package/dist/commands/workflow/templates.d.ts +16 -0
  35. package/dist/commands/workflow/templates.js +68 -0
  36. package/dist/core/archive.d.ts +11 -0
  37. package/dist/core/archive.js +328 -0
  38. package/dist/core/artifact-graph/graph.d.ts +56 -0
  39. package/dist/core/artifact-graph/graph.js +141 -0
  40. package/dist/core/artifact-graph/index.d.ts +7 -0
  41. package/dist/core/artifact-graph/index.js +13 -0
  42. package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
  43. package/dist/core/artifact-graph/instruction-loader.js +214 -0
  44. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  45. package/dist/core/artifact-graph/resolver.js +257 -0
  46. package/dist/core/artifact-graph/schema.d.ts +13 -0
  47. package/dist/core/artifact-graph/schema.js +108 -0
  48. package/dist/core/artifact-graph/state.d.ts +12 -0
  49. package/dist/core/artifact-graph/state.js +54 -0
  50. package/dist/core/artifact-graph/types.d.ts +45 -0
  51. package/dist/core/artifact-graph/types.js +43 -0
  52. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  53. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  54. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  55. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  56. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  57. package/dist/core/command-generation/adapters/auggie.js +27 -0
  58. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  59. package/dist/core/command-generation/adapters/claude.js +50 -0
  60. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  61. package/dist/core/command-generation/adapters/cline.js +27 -0
  62. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  63. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  64. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  65. package/dist/core/command-generation/adapters/codex.js +39 -0
  66. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  67. package/dist/core/command-generation/adapters/continue.js +28 -0
  68. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  69. package/dist/core/command-generation/adapters/costrict.js +27 -0
  70. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  71. package/dist/core/command-generation/adapters/crush.js +30 -0
  72. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  73. package/dist/core/command-generation/adapters/cursor.js +44 -0
  74. package/dist/core/command-generation/adapters/devagent.d.ts +15 -0
  75. package/dist/core/command-generation/adapters/devagent.js +28 -0
  76. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  77. package/dist/core/command-generation/adapters/factory.js +27 -0
  78. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  79. package/dist/core/command-generation/adapters/gemini.js +26 -0
  80. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  81. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  82. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/iflow.js +29 -0
  84. package/dist/core/command-generation/adapters/index.d.ts +28 -0
  85. package/dist/core/command-generation/adapters/index.js +28 -0
  86. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  87. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  88. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  89. package/dist/core/command-generation/adapters/opencode.js +29 -0
  90. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  91. package/dist/core/command-generation/adapters/qoder.js +30 -0
  92. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  93. package/dist/core/command-generation/adapters/qwen.js +26 -0
  94. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  95. package/dist/core/command-generation/adapters/roocode.js +27 -0
  96. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  97. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  98. package/dist/core/command-generation/generator.d.ts +21 -0
  99. package/dist/core/command-generation/generator.js +27 -0
  100. package/dist/core/command-generation/index.d.ts +22 -0
  101. package/dist/core/command-generation/index.js +24 -0
  102. package/dist/core/command-generation/registry.d.ts +36 -0
  103. package/dist/core/command-generation/registry.js +90 -0
  104. package/dist/core/command-generation/types.d.ts +56 -0
  105. package/dist/core/command-generation/types.js +8 -0
  106. package/dist/core/completions/command-registry.d.ts +7 -0
  107. package/dist/core/completions/command-registry.js +454 -0
  108. package/dist/core/completions/completion-provider.d.ts +60 -0
  109. package/dist/core/completions/completion-provider.js +102 -0
  110. package/dist/core/completions/factory.d.ts +64 -0
  111. package/dist/core/completions/factory.js +75 -0
  112. package/dist/core/completions/generators/bash-generator.d.ts +32 -0
  113. package/dist/core/completions/generators/bash-generator.js +174 -0
  114. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  115. package/dist/core/completions/generators/fish-generator.js +157 -0
  116. package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
  117. package/dist/core/completions/generators/powershell-generator.js +207 -0
  118. package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
  119. package/dist/core/completions/generators/zsh-generator.js +250 -0
  120. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  121. package/dist/core/completions/installers/bash-installer.js +318 -0
  122. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  123. package/dist/core/completions/installers/fish-installer.js +143 -0
  124. package/dist/core/completions/installers/powershell-installer.d.ts +88 -0
  125. package/dist/core/completions/installers/powershell-installer.js +327 -0
  126. package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
  127. package/dist/core/completions/installers/zsh-installer.js +449 -0
  128. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  129. package/dist/core/completions/templates/bash-templates.js +24 -0
  130. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  131. package/dist/core/completions/templates/fish-templates.js +39 -0
  132. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  133. package/dist/core/completions/templates/powershell-templates.js +25 -0
  134. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  135. package/dist/core/completions/templates/zsh-templates.js +36 -0
  136. package/dist/core/completions/types.d.ts +79 -0
  137. package/dist/core/completions/types.js +2 -0
  138. package/dist/core/config-prompts.d.ts +9 -0
  139. package/dist/core/config-prompts.js +34 -0
  140. package/dist/core/config-schema.d.ts +76 -0
  141. package/dist/core/config-schema.js +200 -0
  142. package/dist/core/config.d.ts +17 -0
  143. package/dist/core/config.js +175 -0
  144. package/dist/core/converters/json-converter.d.ts +6 -0
  145. package/dist/core/converters/json-converter.js +51 -0
  146. package/dist/core/global-config.d.ts +39 -0
  147. package/dist/core/global-config.js +115 -0
  148. package/dist/core/index.d.ts +2 -0
  149. package/dist/core/index.js +3 -0
  150. package/dist/core/init.d.ts +32 -0
  151. package/dist/core/init.js +447 -0
  152. package/dist/core/legacy-cleanup.d.ts +162 -0
  153. package/dist/core/legacy-cleanup.js +520 -0
  154. package/dist/core/list.d.ts +9 -0
  155. package/dist/core/list.js +171 -0
  156. package/dist/core/parsers/change-parser.d.ts +13 -0
  157. package/dist/core/parsers/change-parser.js +193 -0
  158. package/dist/core/parsers/markdown-parser.d.ts +22 -0
  159. package/dist/core/parsers/markdown-parser.js +187 -0
  160. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  161. package/dist/core/parsers/requirement-blocks.js +201 -0
  162. package/dist/core/project-config.d.ts +64 -0
  163. package/dist/core/project-config.js +223 -0
  164. package/dist/core/schemas/base.schema.d.ts +13 -0
  165. package/dist/core/schemas/base.schema.js +13 -0
  166. package/dist/core/schemas/change.schema.d.ts +73 -0
  167. package/dist/core/schemas/change.schema.js +31 -0
  168. package/dist/core/schemas/index.d.ts +4 -0
  169. package/dist/core/schemas/index.js +4 -0
  170. package/dist/core/schemas/spec.schema.d.ts +18 -0
  171. package/dist/core/schemas/spec.schema.js +15 -0
  172. package/dist/core/shared/index.d.ts +8 -0
  173. package/dist/core/shared/index.js +8 -0
  174. package/dist/core/shared/skill-generation.d.ts +42 -0
  175. package/dist/core/shared/skill-generation.js +80 -0
  176. package/dist/core/shared/tool-detection.d.ts +66 -0
  177. package/dist/core/shared/tool-detection.js +140 -0
  178. package/dist/core/specs-apply.d.ts +73 -0
  179. package/dist/core/specs-apply.js +384 -0
  180. package/dist/core/styles/palette.d.ts +7 -0
  181. package/dist/core/styles/palette.js +8 -0
  182. package/dist/core/templates/index.d.ts +8 -0
  183. package/dist/core/templates/index.js +9 -0
  184. package/dist/core/templates/skill-templates.d.ts +122 -0
  185. package/dist/core/templates/skill-templates.js +3437 -0
  186. package/dist/core/update.d.ts +42 -0
  187. package/dist/core/update.js +311 -0
  188. package/dist/core/validation/constants.d.ts +34 -0
  189. package/dist/core/validation/constants.js +40 -0
  190. package/dist/core/validation/types.d.ts +18 -0
  191. package/dist/core/validation/types.js +2 -0
  192. package/dist/core/validation/validator.d.ts +33 -0
  193. package/dist/core/validation/validator.js +409 -0
  194. package/dist/core/view.d.ts +8 -0
  195. package/dist/core/view.js +168 -0
  196. package/dist/index.d.ts +3 -0
  197. package/dist/index.js +3 -0
  198. package/dist/prompts/searchable-multi-select.d.ts +27 -0
  199. package/dist/prompts/searchable-multi-select.js +149 -0
  200. package/dist/telemetry/config.d.ts +32 -0
  201. package/dist/telemetry/config.js +68 -0
  202. package/dist/telemetry/index.d.ts +31 -0
  203. package/dist/telemetry/index.js +145 -0
  204. package/dist/ui/ascii-patterns.d.ts +16 -0
  205. package/dist/ui/ascii-patterns.js +133 -0
  206. package/dist/ui/welcome-screen.d.ts +10 -0
  207. package/dist/ui/welcome-screen.js +146 -0
  208. package/dist/utils/change-metadata.d.ts +51 -0
  209. package/dist/utils/change-metadata.js +147 -0
  210. package/dist/utils/change-utils.d.ts +62 -0
  211. package/dist/utils/change-utils.js +121 -0
  212. package/dist/utils/command-references.d.ts +18 -0
  213. package/dist/utils/command-references.js +20 -0
  214. package/dist/utils/file-system.d.ts +36 -0
  215. package/dist/utils/file-system.js +281 -0
  216. package/dist/utils/index.d.ts +6 -0
  217. package/dist/utils/index.js +9 -0
  218. package/dist/utils/interactive.d.ts +18 -0
  219. package/dist/utils/interactive.js +21 -0
  220. package/dist/utils/item-discovery.d.ts +4 -0
  221. package/dist/utils/item-discovery.js +72 -0
  222. package/dist/utils/match.d.ts +3 -0
  223. package/dist/utils/match.js +22 -0
  224. package/dist/utils/shell-detection.d.ts +20 -0
  225. package/dist/utils/shell-detection.js +41 -0
  226. package/dist/utils/task-progress.d.ts +8 -0
  227. package/dist/utils/task-progress.js +36 -0
  228. package/package.json +83 -0
  229. package/schemas/spec-driven/schema.yaml +151 -0
  230. package/schemas/spec-driven/templates/design.md +21 -0
  231. package/schemas/spec-driven/templates/proposal.md +25 -0
  232. package/schemas/spec-driven/templates/spec.md +10 -0
  233. package/schemas/spec-driven/templates/tasks.md +9 -0
  234. package/scripts/postinstall.js +147 -0
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Kilo Code Command Adapter
3
+ *
4
+ * Formats commands for Kilo Code following its workflow specification.
5
+ * Kilo Code workflows don't use frontmatter.
6
+ */
7
+ import type { ToolCommandAdapter } from '../types.js';
8
+ /**
9
+ * Kilo Code adapter for command generation.
10
+ * File path: .kilocode/workflows/opsx-<id>.md
11
+ * Format: Plain markdown without frontmatter
12
+ */
13
+ export declare const kilocodeAdapter: ToolCommandAdapter;
14
+ //# sourceMappingURL=kilocode.d.ts.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Kilo Code Command Adapter
3
+ *
4
+ * Formats commands for Kilo Code following its workflow specification.
5
+ * Kilo Code workflows don't use frontmatter.
6
+ */
7
+ import path from 'path';
8
+ /**
9
+ * Kilo Code adapter for command generation.
10
+ * File path: .kilocode/workflows/opsx-<id>.md
11
+ * Format: Plain markdown without frontmatter
12
+ */
13
+ export const kilocodeAdapter = {
14
+ toolId: 'kilocode',
15
+ getFilePath(commandId) {
16
+ return path.join('.kilocode', 'workflows', `opsx-${commandId}.md`);
17
+ },
18
+ formatFile(content) {
19
+ return `${content.body}
20
+ `;
21
+ },
22
+ };
23
+ //# sourceMappingURL=kilocode.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * OpenCode Command Adapter
3
+ *
4
+ * Formats commands for OpenCode following its frontmatter specification.
5
+ */
6
+ import type { ToolCommandAdapter } from '../types.js';
7
+ /**
8
+ * OpenCode adapter for command generation.
9
+ * File path: .opencode/command/opsx-<id>.md
10
+ * Frontmatter: description
11
+ */
12
+ export declare const opencodeAdapter: ToolCommandAdapter;
13
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * OpenCode Command Adapter
3
+ *
4
+ * Formats commands for OpenCode following its frontmatter specification.
5
+ */
6
+ import path from 'path';
7
+ import { transformToHyphenCommands } from '../../../utils/command-references.js';
8
+ /**
9
+ * OpenCode adapter for command generation.
10
+ * File path: .opencode/command/opsx-<id>.md
11
+ * Frontmatter: description
12
+ */
13
+ export const opencodeAdapter = {
14
+ toolId: 'opencode',
15
+ getFilePath(commandId) {
16
+ return path.join('.opencode', 'command', `opsx-${commandId}.md`);
17
+ },
18
+ formatFile(content) {
19
+ // Transform command references from colon to hyphen format for OpenCode
20
+ const transformedBody = transformToHyphenCommands(content.body);
21
+ return `---
22
+ description: ${content.description}
23
+ ---
24
+
25
+ ${transformedBody}
26
+ `;
27
+ },
28
+ };
29
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Qoder Command Adapter
3
+ *
4
+ * Formats commands for Qoder following its frontmatter specification.
5
+ */
6
+ import type { ToolCommandAdapter } from '../types.js';
7
+ /**
8
+ * Qoder adapter for command generation.
9
+ * File path: .qoder/commands/opsx/<id>.md
10
+ * Frontmatter: name, description, category, tags
11
+ */
12
+ export declare const qoderAdapter: ToolCommandAdapter;
13
+ //# sourceMappingURL=qoder.d.ts.map
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Qoder Command Adapter
3
+ *
4
+ * Formats commands for Qoder following its frontmatter specification.
5
+ */
6
+ import path from 'path';
7
+ /**
8
+ * Qoder adapter for command generation.
9
+ * File path: .qoder/commands/opsx/<id>.md
10
+ * Frontmatter: name, description, category, tags
11
+ */
12
+ export const qoderAdapter = {
13
+ toolId: 'qoder',
14
+ getFilePath(commandId) {
15
+ return path.join('.qoder', 'commands', 'opsx', `${commandId}.md`);
16
+ },
17
+ formatFile(content) {
18
+ const tagsStr = content.tags.join(', ');
19
+ return `---
20
+ name: ${content.name}
21
+ description: ${content.description}
22
+ category: ${content.category}
23
+ tags: [${tagsStr}]
24
+ ---
25
+
26
+ ${content.body}
27
+ `;
28
+ },
29
+ };
30
+ //# sourceMappingURL=qoder.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Qwen Code Command Adapter
3
+ *
4
+ * Formats commands for Qwen Code following its TOML specification.
5
+ */
6
+ import type { ToolCommandAdapter } from '../types.js';
7
+ /**
8
+ * Qwen adapter for command generation.
9
+ * File path: .qwen/commands/opsx-<id>.toml
10
+ * Format: TOML with description and prompt fields
11
+ */
12
+ export declare const qwenAdapter: ToolCommandAdapter;
13
+ //# sourceMappingURL=qwen.d.ts.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Qwen Code Command Adapter
3
+ *
4
+ * Formats commands for Qwen Code following its TOML specification.
5
+ */
6
+ import path from 'path';
7
+ /**
8
+ * Qwen adapter for command generation.
9
+ * File path: .qwen/commands/opsx-<id>.toml
10
+ * Format: TOML with description and prompt fields
11
+ */
12
+ export const qwenAdapter = {
13
+ toolId: 'qwen',
14
+ getFilePath(commandId) {
15
+ return path.join('.qwen', 'commands', `opsx-${commandId}.toml`);
16
+ },
17
+ formatFile(content) {
18
+ return `description = "${content.description}"
19
+
20
+ prompt = """
21
+ ${content.body}
22
+ """
23
+ `;
24
+ },
25
+ };
26
+ //# sourceMappingURL=qwen.js.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * RooCode Command Adapter
3
+ *
4
+ * Formats commands for RooCode following its workflow specification.
5
+ * RooCode uses markdown headers instead of YAML frontmatter.
6
+ */
7
+ import type { ToolCommandAdapter } from '../types.js';
8
+ /**
9
+ * RooCode adapter for command generation.
10
+ * File path: .roo/commands/opsx-<id>.md
11
+ * Format: Markdown header with description
12
+ */
13
+ export declare const roocodeAdapter: ToolCommandAdapter;
14
+ //# sourceMappingURL=roocode.d.ts.map
@@ -0,0 +1,27 @@
1
+ /**
2
+ * RooCode Command Adapter
3
+ *
4
+ * Formats commands for RooCode following its workflow specification.
5
+ * RooCode uses markdown headers instead of YAML frontmatter.
6
+ */
7
+ import path from 'path';
8
+ /**
9
+ * RooCode adapter for command generation.
10
+ * File path: .roo/commands/opsx-<id>.md
11
+ * Format: Markdown header with description
12
+ */
13
+ export const roocodeAdapter = {
14
+ toolId: 'roocode',
15
+ getFilePath(commandId) {
16
+ return path.join('.roo', 'commands', `opsx-${commandId}.md`);
17
+ },
18
+ formatFile(content) {
19
+ return `# ${content.name}
20
+
21
+ ${content.description}
22
+
23
+ ${content.body}
24
+ `;
25
+ },
26
+ };
27
+ //# sourceMappingURL=roocode.js.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Windsurf Command Adapter
3
+ *
4
+ * Formats commands for Windsurf following its frontmatter specification.
5
+ * Windsurf uses a similar format to Claude but may have different conventions.
6
+ */
7
+ import type { ToolCommandAdapter } from '../types.js';
8
+ /**
9
+ * Windsurf adapter for command generation.
10
+ * File path: .windsurf/workflows/opsx-<id>.md
11
+ * Frontmatter: name, description, category, tags
12
+ */
13
+ export declare const windsurfAdapter: ToolCommandAdapter;
14
+ //# sourceMappingURL=windsurf.d.ts.map
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Windsurf Command Adapter
3
+ *
4
+ * Formats commands for Windsurf following its frontmatter specification.
5
+ * Windsurf uses a similar format to Claude but may have different conventions.
6
+ */
7
+ import path from 'path';
8
+ /**
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
+ * Formats a tags array as a YAML array with proper escaping.
24
+ */
25
+ function formatTagsArray(tags) {
26
+ const escapedTags = tags.map((tag) => escapeYamlValue(tag));
27
+ return `[${escapedTags.join(', ')}]`;
28
+ }
29
+ /**
30
+ * Windsurf adapter for command generation.
31
+ * File path: .windsurf/workflows/opsx-<id>.md
32
+ * Frontmatter: name, description, category, tags
33
+ */
34
+ export const windsurfAdapter = {
35
+ toolId: 'windsurf',
36
+ getFilePath(commandId) {
37
+ return path.join('.windsurf', 'workflows', `opsx-${commandId}.md`);
38
+ },
39
+ formatFile(content) {
40
+ return `---
41
+ name: ${escapeYamlValue(content.name)}
42
+ description: ${escapeYamlValue(content.description)}
43
+ category: ${escapeYamlValue(content.category)}
44
+ tags: ${formatTagsArray(content.tags)}
45
+ ---
46
+
47
+ ${content.body}
48
+ `;
49
+ },
50
+ };
51
+ //# sourceMappingURL=windsurf.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, cursorAdapter, windsurfAdapter } 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, cursorAdapter, windsurfAdapter } from './adapters/index.js';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Command Adapter Registry
3
+ *
4
+ * Centralized registry for tool command adapters.
5
+ * Similar pattern to existing SlashCommandRegistry in the codebase.
6
+ */
7
+ import type { ToolCommandAdapter } from "./types.js";
8
+ /**
9
+ * Registry for looking up tool command adapters.
10
+ */
11
+ export declare class CommandAdapterRegistry {
12
+ private static adapters;
13
+ /**
14
+ * Register a tool command adapter.
15
+ * @param adapter - The adapter to register
16
+ */
17
+ static register(adapter: ToolCommandAdapter): void;
18
+ /**
19
+ * Get an adapter by tool ID.
20
+ * @param toolId - The tool identifier (e.g., 'claude', 'cursor')
21
+ * @returns The adapter or undefined if not registered
22
+ */
23
+ static get(toolId: string): ToolCommandAdapter | undefined;
24
+ /**
25
+ * Get all registered adapters.
26
+ * @returns Array of all registered adapters
27
+ */
28
+ static getAll(): ToolCommandAdapter[];
29
+ /**
30
+ * Check if an adapter is registered for a tool.
31
+ * @param toolId - The tool identifier
32
+ * @returns True if an adapter exists
33
+ */
34
+ static has(toolId: string): boolean;
35
+ }
36
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Command Adapter Registry
3
+ *
4
+ * Centralized registry for tool command adapters.
5
+ * Similar pattern to existing SlashCommandRegistry in the codebase.
6
+ */
7
+ import { amazonQAdapter } from "./adapters/amazon-q.js";
8
+ import { antigravityAdapter } from "./adapters/antigravity.js";
9
+ import { auggieAdapter } from "./adapters/auggie.js";
10
+ import { claudeAdapter } from "./adapters/claude.js";
11
+ import { clineAdapter } from "./adapters/cline.js";
12
+ import { devagentAdapter } from "./adapters/devagent.js";
13
+ import { codexAdapter } from "./adapters/codex.js";
14
+ import { codebuddyAdapter } from "./adapters/codebuddy.js";
15
+ import { continueAdapter } from "./adapters/continue.js";
16
+ import { costrictAdapter } from "./adapters/costrict.js";
17
+ import { crushAdapter } from "./adapters/crush.js";
18
+ import { cursorAdapter } from "./adapters/cursor.js";
19
+ import { factoryAdapter } from "./adapters/factory.js";
20
+ import { geminiAdapter } from "./adapters/gemini.js";
21
+ import { githubCopilotAdapter } from "./adapters/github-copilot.js";
22
+ import { iflowAdapter } from "./adapters/iflow.js";
23
+ import { kilocodeAdapter } from "./adapters/kilocode.js";
24
+ import { opencodeAdapter } from "./adapters/opencode.js";
25
+ import { qoderAdapter } from "./adapters/qoder.js";
26
+ import { qwenAdapter } from "./adapters/qwen.js";
27
+ import { roocodeAdapter } from "./adapters/roocode.js";
28
+ import { windsurfAdapter } from "./adapters/windsurf.js";
29
+ /**
30
+ * Registry for looking up tool command adapters.
31
+ */
32
+ export class CommandAdapterRegistry {
33
+ static adapters = new Map();
34
+ // Static initializer - register built-in adapters
35
+ static {
36
+ CommandAdapterRegistry.register(amazonQAdapter);
37
+ CommandAdapterRegistry.register(antigravityAdapter);
38
+ CommandAdapterRegistry.register(auggieAdapter);
39
+ CommandAdapterRegistry.register(claudeAdapter);
40
+ CommandAdapterRegistry.register(clineAdapter);
41
+ CommandAdapterRegistry.register(devagentAdapter);
42
+ CommandAdapterRegistry.register(codexAdapter);
43
+ CommandAdapterRegistry.register(codebuddyAdapter);
44
+ CommandAdapterRegistry.register(continueAdapter);
45
+ CommandAdapterRegistry.register(costrictAdapter);
46
+ CommandAdapterRegistry.register(crushAdapter);
47
+ CommandAdapterRegistry.register(cursorAdapter);
48
+ CommandAdapterRegistry.register(factoryAdapter);
49
+ CommandAdapterRegistry.register(geminiAdapter);
50
+ CommandAdapterRegistry.register(githubCopilotAdapter);
51
+ CommandAdapterRegistry.register(iflowAdapter);
52
+ CommandAdapterRegistry.register(kilocodeAdapter);
53
+ CommandAdapterRegistry.register(opencodeAdapter);
54
+ CommandAdapterRegistry.register(qoderAdapter);
55
+ CommandAdapterRegistry.register(qwenAdapter);
56
+ CommandAdapterRegistry.register(roocodeAdapter);
57
+ CommandAdapterRegistry.register(windsurfAdapter);
58
+ }
59
+ /**
60
+ * Register a tool command adapter.
61
+ * @param adapter - The adapter to register
62
+ */
63
+ static register(adapter) {
64
+ CommandAdapterRegistry.adapters.set(adapter.toolId, adapter);
65
+ }
66
+ /**
67
+ * Get an adapter by tool ID.
68
+ * @param toolId - The tool identifier (e.g., 'claude', 'cursor')
69
+ * @returns The adapter or undefined if not registered
70
+ */
71
+ static get(toolId) {
72
+ return CommandAdapterRegistry.adapters.get(toolId);
73
+ }
74
+ /**
75
+ * Get all registered adapters.
76
+ * @returns Array of all registered adapters
77
+ */
78
+ static getAll() {
79
+ return Array.from(CommandAdapterRegistry.adapters.values());
80
+ }
81
+ /**
82
+ * Check if an adapter is registered for a tool.
83
+ * @param toolId - The tool identifier
84
+ * @returns True if an adapter exists
85
+ */
86
+ static has(toolId) {
87
+ return CommandAdapterRegistry.adapters.has(toolId);
88
+ }
89
+ }
90
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Command Generation Types
3
+ *
4
+ * Tool-agnostic interfaces for command generation.
5
+ * These types separate "what to generate" from "how to format it".
6
+ */
7
+ /**
8
+ * Tool-agnostic command data.
9
+ * Represents the content of a command without any tool-specific formatting.
10
+ */
11
+ export interface CommandContent {
12
+ /** Command identifier (e.g., 'explore', 'apply', 'new') */
13
+ id: string;
14
+ /** Human-readable name (e.g., 'OpenSpec Explore') */
15
+ name: string;
16
+ /** Brief description of command purpose */
17
+ description: string;
18
+ /** Grouping category (e.g., 'Workflow') */
19
+ category: string;
20
+ /** Array of tag strings */
21
+ tags: string[];
22
+ /** The command instruction content (body text) */
23
+ body: string;
24
+ }
25
+ /**
26
+ * Per-tool formatting strategy.
27
+ * Each AI tool implements this interface to handle its specific file path
28
+ * and frontmatter format requirements.
29
+ */
30
+ export interface ToolCommandAdapter {
31
+ /** Tool identifier matching AIToolOption.value (e.g., 'claude', 'cursor') */
32
+ toolId: string;
33
+ /**
34
+ * Returns the file path for a command.
35
+ * @param commandId - The command identifier (e.g., 'explore')
36
+ * @returns Path from project root (e.g., '.claude/commands/opsx/explore.md').
37
+ * May be absolute for tools with global-scoped prompts (e.g., Codex).
38
+ */
39
+ getFilePath(commandId: string): string;
40
+ /**
41
+ * Formats the complete file content including frontmatter.
42
+ * @param content - The tool-agnostic command content
43
+ * @returns Complete file content ready to write
44
+ */
45
+ formatFile(content: CommandContent): string;
46
+ }
47
+ /**
48
+ * Result of generating a command file.
49
+ */
50
+ export interface GeneratedCommand {
51
+ /** File path from project root, or absolute for global-scoped tools */
52
+ path: string;
53
+ /** Complete file content (frontmatter + body) */
54
+ fileContent: string;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Command Generation Types
3
+ *
4
+ * Tool-agnostic interfaces for command generation.
5
+ * These types separate "what to generate" from "how to format it".
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ import { CommandDefinition } from "./types.js";
2
+ /**
3
+ * Registry of all OpenSpec CLI commands with their flags and metadata.
4
+ * This registry is used to generate shell completion scripts.
5
+ */
6
+ export declare const COMMAND_REGISTRY: CommandDefinition[];
7
+ //# sourceMappingURL=command-registry.d.ts.map