@codewalla_india/openspec 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +272 -230
  3. package/bin/openspec.js +5 -5
  4. package/dist/cli/index.js +99 -62
  5. package/dist/commands/change.d.ts +0 -2
  6. package/dist/commands/change.js +107 -86
  7. package/dist/commands/config.js +14 -16
  8. package/dist/commands/doctor.js +9 -4
  9. package/dist/commands/feedback.js +79 -30
  10. package/dist/commands/modify.d.ts +26 -0
  11. package/dist/commands/modify.js +147 -0
  12. package/dist/commands/schema.js +170 -91
  13. package/dist/commands/show.js +5 -2
  14. package/dist/commands/spec.js +49 -29
  15. package/dist/commands/store.js +15 -21
  16. package/dist/commands/validate.d.ts +8 -0
  17. package/dist/commands/validate.js +43 -20
  18. package/dist/commands/workflow/index.d.ts +2 -2
  19. package/dist/commands/workflow/index.js +1 -1
  20. package/dist/commands/workflow/instructions.d.ts +6 -26
  21. package/dist/commands/workflow/instructions.js +183 -376
  22. package/dist/commands/workflow/new-change.d.ts +0 -4
  23. package/dist/commands/workflow/new-change.js +10 -28
  24. package/dist/commands/workflow/shared.d.ts +34 -19
  25. package/dist/commands/workflow/shared.js +34 -4
  26. package/dist/commands/workflow/status.js +10 -32
  27. package/dist/commands/workflow/templates.js +15 -5
  28. package/dist/commands/workset.d.ts +2 -2
  29. package/dist/commands/workset.js +19 -22
  30. package/dist/comprehension-quiz/fingerprint.d.ts +39 -0
  31. package/dist/comprehension-quiz/fingerprint.js +84 -0
  32. package/dist/comprehension-quiz/index.d.ts +42 -0
  33. package/dist/comprehension-quiz/index.js +47 -0
  34. package/dist/comprehension-quiz/pass-record.d.ts +44 -0
  35. package/dist/comprehension-quiz/pass-record.js +98 -0
  36. package/dist/comprehension-quiz/providers/anthropic.d.ts +34 -0
  37. package/dist/comprehension-quiz/providers/anthropic.js +53 -0
  38. package/dist/comprehension-quiz/providers/factory.d.ts +44 -0
  39. package/dist/comprehension-quiz/providers/factory.js +174 -0
  40. package/dist/comprehension-quiz/providers/interface.d.ts +59 -0
  41. package/dist/comprehension-quiz/providers/interface.js +63 -0
  42. package/dist/comprehension-quiz/providers/local.d.ts +34 -0
  43. package/dist/comprehension-quiz/providers/local.js +53 -0
  44. package/dist/comprehension-quiz/providers/ollama.d.ts +34 -0
  45. package/dist/comprehension-quiz/providers/ollama.js +53 -0
  46. package/dist/comprehension-quiz/providers/openai.d.ts +34 -0
  47. package/dist/comprehension-quiz/providers/openai.js +53 -0
  48. package/dist/comprehension-quiz/question-generator.d.ts +69 -0
  49. package/dist/comprehension-quiz/question-generator.js +141 -0
  50. package/dist/comprehension-quiz/quiz-executor.d.ts +70 -0
  51. package/dist/comprehension-quiz/quiz-executor.js +165 -0
  52. package/dist/comprehension-quiz/types.d.ts +115 -0
  53. package/dist/comprehension-quiz/types.js +11 -0
  54. package/dist/core/archive.d.ts +14 -1
  55. package/dist/core/archive.js +1350 -190
  56. package/dist/core/artifact-graph/graph.d.ts +28 -9
  57. package/dist/core/artifact-graph/graph.js +94 -43
  58. package/dist/core/artifact-graph/index.d.ts +1 -1
  59. package/dist/core/artifact-graph/index.js +1 -1
  60. package/dist/core/artifact-graph/instruction-loader.d.ts +30 -3
  61. package/dist/core/artifact-graph/instruction-loader.js +70 -12
  62. package/dist/core/artifact-graph/outputs.d.ts +1 -0
  63. package/dist/core/artifact-graph/outputs.js +67 -5
  64. package/dist/core/artifact-graph/resolver.d.ts +14 -0
  65. package/dist/core/artifact-graph/resolver.js +69 -15
  66. package/dist/core/artifact-graph/types.js +21 -3
  67. package/dist/core/available-tools.d.ts +2 -2
  68. package/dist/core/available-tools.js +14 -3
  69. package/dist/core/change-metadata/schema.d.ts +2 -0
  70. package/dist/core/change-metadata/schema.js +13 -0
  71. package/dist/core/change-status-policy.d.ts +10 -1
  72. package/dist/core/change-status-policy.js +30 -2
  73. package/dist/core/command-generation/adapters/amazon-q.d.ts +4 -0
  74. package/dist/core/command-generation/adapters/amazon-q.js +11 -5
  75. package/dist/core/command-generation/adapters/antigravity.js +6 -5
  76. package/dist/core/command-generation/adapters/auggie.js +7 -6
  77. package/dist/core/command-generation/adapters/bob.d.ts +5 -1
  78. package/dist/core/command-generation/adapters/bob.js +11 -10
  79. package/dist/core/command-generation/adapters/claude.d.ts +1 -1
  80. package/dist/core/command-generation/adapters/claude.js +12 -17
  81. package/dist/core/command-generation/adapters/cline.js +5 -5
  82. package/dist/core/command-generation/adapters/codebuddy.js +8 -7
  83. package/dist/core/command-generation/adapters/continue.js +8 -7
  84. package/dist/core/command-generation/adapters/costrict.js +7 -6
  85. package/dist/core/command-generation/adapters/crush.js +9 -9
  86. package/dist/core/command-generation/adapters/cursor.js +8 -8
  87. package/dist/core/command-generation/adapters/devin.d.ts +19 -0
  88. package/dist/core/command-generation/adapters/devin.js +36 -0
  89. package/dist/core/command-generation/adapters/factory.js +7 -6
  90. package/dist/core/command-generation/adapters/gemini.js +40 -5
  91. package/dist/core/command-generation/adapters/github-copilot.js +6 -5
  92. package/dist/core/command-generation/adapters/iflow.js +9 -8
  93. package/dist/core/command-generation/adapters/index.d.ts +4 -2
  94. package/dist/core/command-generation/adapters/index.js +4 -2
  95. package/dist/core/command-generation/adapters/junie.js +6 -5
  96. package/dist/core/command-generation/adapters/kilocode.js +1 -1
  97. package/dist/core/command-generation/adapters/kiro.js +6 -5
  98. package/dist/core/command-generation/adapters/lingma.js +9 -9
  99. package/dist/core/command-generation/adapters/oh-my-pi.d.ts +21 -0
  100. package/dist/core/command-generation/adapters/oh-my-pi.js +42 -0
  101. package/dist/core/command-generation/adapters/opencode.js +6 -8
  102. package/dist/core/command-generation/adapters/pi.d.ts +2 -2
  103. package/dist/core/command-generation/adapters/pi.js +7 -10
  104. package/dist/core/command-generation/adapters/qoder.js +9 -9
  105. package/dist/core/command-generation/adapters/qwen.d.ts +7 -3
  106. package/dist/core/command-generation/adapters/qwen.js +14 -9
  107. package/dist/core/command-generation/adapters/roocode.d.ts +4 -4
  108. package/dist/core/command-generation/adapters/roocode.js +9 -9
  109. package/dist/core/command-generation/adapters/trae.d.ts +13 -0
  110. package/dist/core/command-generation/adapters/trae.js +28 -0
  111. package/dist/core/command-generation/adapters/zcode.d.ts +16 -0
  112. package/dist/core/command-generation/adapters/zcode.js +33 -0
  113. package/dist/core/command-generation/generator.d.ts +8 -0
  114. package/dist/core/command-generation/generator.js +15 -1
  115. package/dist/core/command-generation/index.d.ts +1 -1
  116. package/dist/core/command-generation/index.js +1 -1
  117. package/dist/core/command-generation/invocation.d.ts +73 -0
  118. package/dist/core/command-generation/invocation.js +77 -0
  119. package/dist/core/command-generation/registry.js +8 -4
  120. package/dist/core/command-generation/types.d.ts +9 -2
  121. package/dist/core/command-generation/yaml.d.ts +20 -6
  122. package/dist/core/command-generation/yaml.js +31 -21
  123. package/dist/core/command-surface.d.ts +15 -0
  124. package/dist/core/command-surface.js +33 -0
  125. package/dist/core/completions/command-registry.js +16 -61
  126. package/dist/core/completions/generators/bash-generator.js +41 -41
  127. package/dist/core/completions/generators/fish-generator.js +7 -7
  128. package/dist/core/completions/generators/powershell-generator.js +44 -37
  129. package/dist/core/completions/generators/zsh-generator.js +33 -33
  130. package/dist/core/completions/installers/zsh-installer.d.ts +9 -0
  131. package/dist/core/completions/installers/zsh-installer.js +20 -4
  132. package/dist/core/completions/templates/bash-templates.js +24 -24
  133. package/dist/core/completions/templates/fish-templates.js +38 -38
  134. package/dist/core/completions/templates/powershell-templates.js +28 -28
  135. package/dist/core/completions/templates/zsh-templates.js +39 -39
  136. package/dist/core/config-prompts.d.ts +1 -1
  137. package/dist/core/config-prompts.js +14 -1
  138. package/dist/core/config-schema.d.ts +10 -1
  139. package/dist/core/config-schema.js +67 -1
  140. package/dist/core/config.d.ts +15 -0
  141. package/dist/core/config.js +46 -5
  142. package/dist/core/file-state.js +56 -24
  143. package/dist/core/github-copilot/cloud-agent.d.ts +95 -0
  144. package/dist/core/github-copilot/cloud-agent.js +497 -0
  145. package/dist/core/global-config.d.ts +16 -0
  146. package/dist/core/init.d.ts +58 -0
  147. package/dist/core/init.js +474 -73
  148. package/dist/core/legacy-cleanup.d.ts +59 -0
  149. package/dist/core/legacy-cleanup.js +253 -24
  150. package/dist/core/list.js +23 -16
  151. package/dist/core/migration.d.ts +73 -1
  152. package/dist/core/migration.js +360 -11
  153. package/dist/core/modify/conflict-detector.d.ts +26 -0
  154. package/dist/core/modify/conflict-detector.js +62 -0
  155. package/dist/core/modify/dependency-propagator.d.ts +38 -0
  156. package/dist/core/modify/dependency-propagator.js +103 -0
  157. package/dist/core/modify/history-tracker.d.ts +34 -0
  158. package/dist/core/modify/history-tracker.js +114 -0
  159. package/dist/core/modify/index.d.ts +7 -0
  160. package/dist/core/modify/index.js +7 -0
  161. package/dist/core/onboarding-commands.d.ts +30 -0
  162. package/dist/core/onboarding-commands.js +38 -0
  163. package/dist/core/openspec-root.js +18 -15
  164. package/dist/core/parsers/change-parser.d.ts +17 -2
  165. package/dist/core/parsers/change-parser.js +35 -21
  166. package/dist/core/parsers/code-fence.d.ts +15 -0
  167. package/dist/core/parsers/code-fence.js +49 -0
  168. package/dist/core/parsers/markdown-parser.d.ts +0 -3
  169. package/dist/core/parsers/markdown-parser.js +7 -60
  170. package/dist/core/parsers/requirement-blocks.d.ts +29 -0
  171. package/dist/core/parsers/requirement-blocks.js +150 -31
  172. package/dist/core/parsers/requirement-text.d.ts +48 -0
  173. package/dist/core/parsers/requirement-text.js +98 -0
  174. package/dist/core/parsers/spec-structure.d.ts +1 -1
  175. package/dist/core/parsers/spec-structure.js +20 -30
  176. package/dist/core/profile-sync-drift.d.ts +0 -8
  177. package/dist/core/profile-sync-drift.js +49 -50
  178. package/dist/core/profiles.d.ts +2 -2
  179. package/dist/core/profiles.js +2 -2
  180. package/dist/core/project-config.d.ts +27 -18
  181. package/dist/core/project-config.js +101 -34
  182. package/dist/core/references.js +42 -4
  183. package/dist/core/relationship-health.d.ts +8 -0
  184. package/dist/core/relationship-health.js +13 -0
  185. package/dist/core/root-selection.d.ts +9 -6
  186. package/dist/core/root-selection.js +42 -5
  187. package/dist/core/schemas/base.schema.js +7 -2
  188. package/dist/core/shared/allowed-tools.d.ts +12 -0
  189. package/dist/core/shared/allowed-tools.js +12 -0
  190. package/dist/core/shared/index.d.ts +1 -0
  191. package/dist/core/shared/index.js +1 -0
  192. package/dist/core/shared/skill-content-equivalence.d.ts +7 -0
  193. package/dist/core/shared/skill-content-equivalence.js +41 -0
  194. package/dist/core/shared/skill-generation.js +17 -13
  195. package/dist/core/shared/skill-paths.d.ts +13 -0
  196. package/dist/core/shared/skill-paths.js +23 -0
  197. package/dist/core/shared/tool-detection.d.ts +27 -7
  198. package/dist/core/shared/tool-detection.js +167 -37
  199. package/dist/core/shared-skill-target.d.ts +16 -0
  200. package/dist/core/shared-skill-target.js +156 -0
  201. package/dist/core/specs-apply.d.ts +80 -33
  202. package/dist/core/specs-apply.js +667 -145
  203. package/dist/core/store/git.d.ts +13 -0
  204. package/dist/core/store/git.js +24 -0
  205. package/dist/core/store/operations.js +20 -0
  206. package/dist/core/templates/skill-templates.d.ts +3 -2
  207. package/dist/core/templates/skill-templates.js +3 -2
  208. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  209. package/dist/core/templates/workflows/apply-change.js +186 -323
  210. package/dist/core/templates/workflows/archive-change.js +387 -260
  211. package/dist/core/templates/workflows/bulk-archive-change.js +655 -475
  212. package/dist/core/templates/workflows/continue-change.js +210 -219
  213. package/dist/core/templates/workflows/explore.js +479 -443
  214. package/dist/core/templates/workflows/feedback.js +97 -97
  215. package/dist/core/templates/workflows/ff-change.js +200 -191
  216. package/dist/core/templates/workflows/modify-change.d.ts +4 -1
  217. package/dist/core/templates/workflows/modify-change.js +237 -115
  218. package/dist/core/templates/workflows/new-change.js +127 -134
  219. package/dist/core/templates/workflows/onboard.js +548 -542
  220. package/dist/core/templates/workflows/propose.js +273 -217
  221. package/dist/core/templates/workflows/store-selection.d.ts +1 -1
  222. package/dist/core/templates/workflows/store-selection.js +1 -1
  223. package/dist/core/templates/workflows/sync-specs.js +500 -273
  224. package/dist/core/templates/workflows/update-change.d.ts +10 -0
  225. package/dist/core/templates/workflows/update-change.js +177 -0
  226. package/dist/core/templates/workflows/verify-change.js +324 -326
  227. package/dist/core/update.d.ts +40 -5
  228. package/dist/core/update.js +411 -96
  229. package/dist/core/validation/constants.d.ts +4 -1
  230. package/dist/core/validation/constants.js +4 -1
  231. package/dist/core/validation/plan-validator.d.ts +8 -0
  232. package/dist/core/validation/plan-validator.js +45 -0
  233. package/dist/core/validation/task-numbering.d.ts +16 -0
  234. package/dist/core/validation/task-numbering.js +57 -0
  235. package/dist/core/validation/validator.d.ts +27 -3
  236. package/dist/core/validation/validator.js +337 -48
  237. package/dist/core/version-check.d.ts +152 -0
  238. package/dist/core/version-check.js +731 -0
  239. package/dist/core/view.js +13 -18
  240. package/dist/prompts/searchable-multi-select.js +1 -1
  241. package/dist/telemetry/caller-detection.d.ts +27 -0
  242. package/dist/telemetry/caller-detection.js +85 -0
  243. package/dist/telemetry/caller-detection.test.d.ts +5 -0
  244. package/dist/telemetry/config.d.ts +48 -2
  245. package/dist/telemetry/config.js +113 -11
  246. package/dist/telemetry/config.test.d.ts +5 -0
  247. package/dist/telemetry/deduplication.d.ts +35 -0
  248. package/dist/telemetry/deduplication.js +82 -0
  249. package/dist/telemetry/deduplication.test.d.ts +5 -0
  250. package/dist/telemetry/identity.d.ts +62 -22
  251. package/dist/telemetry/identity.js +147 -102
  252. package/dist/telemetry/index.d.ts +126 -15
  253. package/dist/telemetry/index.js +569 -37
  254. package/dist/telemetry/sanitization.d.ts +40 -0
  255. package/dist/telemetry/sanitization.js +114 -0
  256. package/dist/telemetry/sanitization.test.d.ts +5 -0
  257. package/dist/telemetry/throttling.d.ts +20 -0
  258. package/dist/telemetry/throttling.js +70 -0
  259. package/dist/ui/welcome-screen.d.ts +9 -1
  260. package/dist/ui/welcome-screen.js +91 -38
  261. package/dist/utils/change-metadata.d.ts +43 -0
  262. package/dist/utils/change-metadata.js +123 -7
  263. package/dist/utils/change-utils.d.ts +10 -4
  264. package/dist/utils/change-utils.js +20 -13
  265. package/dist/utils/ci.d.ts +12 -0
  266. package/dist/utils/ci.js +16 -0
  267. package/dist/utils/command-references.d.ts +92 -6
  268. package/dist/utils/command-references.js +180 -7
  269. package/dist/utils/date.d.ts +8 -0
  270. package/dist/utils/date.js +13 -0
  271. package/dist/utils/file-system.d.ts +10 -0
  272. package/dist/utils/file-system.js +70 -0
  273. package/dist/utils/index.d.ts +1 -1
  274. package/dist/utils/index.js +1 -1
  275. package/dist/utils/interactive.d.ts +23 -0
  276. package/dist/utils/interactive.js +32 -0
  277. package/dist/utils/item-discovery.d.ts +19 -0
  278. package/dist/utils/item-discovery.js +30 -48
  279. package/dist/utils/shell-detection.d.ts +1 -1
  280. package/dist/utils/shell-detection.js +64 -11
  281. package/dist/utils/spec-discovery.d.ts +40 -0
  282. package/dist/utils/spec-discovery.js +115 -0
  283. package/dist/utils/task-progress.d.ts +29 -1
  284. package/dist/utils/task-progress.js +109 -15
  285. package/package.json +96 -84
  286. package/schemas/spec-driven/schema.yaml +252 -184
  287. package/schemas/spec-driven/templates/design.md +19 -19
  288. package/schemas/spec-driven/templates/plan-template.md +91 -0
  289. package/schemas/spec-driven/templates/proposal.md +29 -24
  290. package/schemas/spec-driven/templates/spec.md +11 -8
  291. package/schemas/spec-driven/templates/tasks.md +9 -9
  292. package/scripts/postinstall.js +83 -83
  293. package/dist/core/command-generation/adapters/codex.d.ts +0 -16
  294. package/dist/core/command-generation/adapters/codex.js +0 -39
  295. package/dist/core/command-generation/adapters/windsurf.d.ts +0 -14
  296. package/dist/core/command-generation/adapters/windsurf.js +0 -38
  297. package/dist/core/comprehension/config.d.ts +0 -20
  298. package/dist/core/comprehension/config.js +0 -23
  299. package/dist/core/comprehension/fingerprint.d.ts +0 -14
  300. package/dist/core/comprehension/fingerprint.js +0 -33
  301. package/dist/core/comprehension/index.d.ts +0 -57
  302. package/dist/core/comprehension/index.js +0 -87
  303. package/dist/core/comprehension/pass-record.d.ts +0 -29
  304. package/dist/core/comprehension/pass-record.js +0 -64
  305. package/dist/core/comprehension/stats.d.ts +0 -35
  306. package/dist/core/comprehension/stats.js +0 -133
  307. package/dist/core/templates/workflows/comprehension-guidance.d.ts +0 -9
  308. package/dist/core/templates/workflows/comprehension-guidance.js +0 -71
  309. package/dist/core/templates/workflows/mcp-guidance.d.ts +0 -13
  310. package/dist/core/templates/workflows/mcp-guidance.js +0 -131
  311. package/dist/core/templates/workflows/user-prompt-guidance.d.ts +0 -16
  312. package/dist/core/templates/workflows/user-prompt-guidance.js +0 -48
  313. package/dist/telemetry/caller.d.ts +0 -5
  314. package/dist/telemetry/caller.js +0 -29
  315. package/dist/telemetry/client.d.ts +0 -27
  316. package/dist/telemetry/client.js +0 -127
  317. package/dist/telemetry/command-context.d.ts +0 -13
  318. package/dist/telemetry/command-context.js +0 -59
  319. package/dist/telemetry/comprehension.d.ts +0 -44
  320. package/dist/telemetry/comprehension.js +0 -105
  321. package/dist/telemetry/content.d.ts +0 -10
  322. package/dist/telemetry/content.js +0 -56
  323. package/dist/telemetry/git-stats.d.ts +0 -12
  324. package/dist/telemetry/git-stats.js +0 -69
  325. package/dist/telemetry/identify-cache.d.ts +0 -7
  326. package/dist/telemetry/identify-cache.js +0 -47
  327. package/dist/telemetry/input.d.ts +0 -17
  328. package/dist/telemetry/input.js +0 -68
  329. package/dist/telemetry/marker.d.ts +0 -37
  330. package/dist/telemetry/marker.js +0 -67
  331. package/dist/telemetry/workflow.d.ts +0 -85
  332. package/dist/telemetry/workflow.js +0 -318
  333. package/schemas/spec-driven/templates/plan.md +0 -19
@@ -4,6 +4,7 @@
4
4
  * Formats commands for CoStrict following its frontmatter specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue } from '../yaml.js';
7
8
  /**
8
9
  * CoStrict adapter for command generation.
9
10
  * File path: .cospec/openspec/commands/opsx-<id>.md
@@ -15,12 +16,12 @@ export const costrictAdapter = {
15
16
  return path.join('.cospec', 'openspec', 'commands', `opsx-${commandId}.md`);
16
17
  },
17
18
  formatFile(content) {
18
- return `---
19
- description: "${content.description}"
20
- argument-hint: command arguments
21
- ---
22
-
23
- ${content.body}
19
+ return `---
20
+ description: ${escapeYamlValue(content.description)}
21
+ argument-hint: command arguments
22
+ ---
23
+
24
+ ${content.body}
24
25
  `;
25
26
  },
26
27
  };
@@ -4,6 +4,7 @@
4
4
  * Formats commands for Crush following its frontmatter specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue, formatTagsArray } from '../yaml.js';
7
8
  /**
8
9
  * Crush adapter for command generation.
9
10
  * File path: .crush/commands/opsx/<id>.md
@@ -15,15 +16,14 @@ export const crushAdapter = {
15
16
  return path.join('.crush', 'commands', 'opsx', `${commandId}.md`);
16
17
  },
17
18
  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}
19
+ return `---
20
+ name: ${escapeYamlValue(content.name)}
21
+ description: ${escapeYamlValue(content.description)}
22
+ category: ${escapeYamlValue(content.category)}
23
+ tags: ${formatTagsArray(content.tags)}
24
+ ---
25
+
26
+ ${content.body}
27
27
  `;
28
28
  },
29
29
  };
@@ -17,14 +17,14 @@ export const cursorAdapter = {
17
17
  return path.join('.cursor', 'commands', `opsx-${commandId}.md`);
18
18
  },
19
19
  formatFile(content) {
20
- return `---
21
- name: /opsx-${content.id}
22
- id: opsx-${content.id}
23
- category: ${escapeYamlValue(content.category)}
24
- description: ${escapeYamlValue(content.description)}
25
- ---
26
-
27
- ${content.body}
20
+ return `---
21
+ name: ${escapeYamlValue(`/opsx-${content.id}`)}
22
+ id: ${escapeYamlValue(`opsx-${content.id}`)}
23
+ category: ${escapeYamlValue(content.category)}
24
+ description: ${escapeYamlValue(content.description)}
25
+ ---
26
+
27
+ ${content.body}
28
28
  `;
29
29
  },
30
30
  };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Devin Desktop Command Adapter
3
+ *
4
+ * Formats commands for Devin Desktop following its frontmatter specification.
5
+ * Devin Desktop reads Cascade-style workflows from `.devin/workflows/`, the
6
+ * same shape Windsurf uses.
7
+ */
8
+ import type { ToolCommandAdapter } from '../types.js';
9
+ /**
10
+ * Devin Desktop adapter for command generation.
11
+ * File path: .devin/workflows/opsx-<id>.md
12
+ * Frontmatter: name, description, category, tags
13
+ *
14
+ * The `opsx-` filename prefix makes this a flat invocation, so the generator
15
+ * rewrites the body's `/opsx:*` references to the `/opsx-*` form Devin
16
+ * registers — see invocation.ts.
17
+ */
18
+ export declare const devinAdapter: ToolCommandAdapter;
19
+ //# sourceMappingURL=devin.d.ts.map
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Devin Desktop Command Adapter
3
+ *
4
+ * Formats commands for Devin Desktop following its frontmatter specification.
5
+ * Devin Desktop reads Cascade-style workflows from `.devin/workflows/`, the
6
+ * same shape Windsurf uses.
7
+ */
8
+ import path from 'path';
9
+ import { escapeYamlValue, formatTagsArray } from '../yaml.js';
10
+ /**
11
+ * Devin Desktop adapter for command generation.
12
+ * File path: .devin/workflows/opsx-<id>.md
13
+ * Frontmatter: name, description, category, tags
14
+ *
15
+ * The `opsx-` filename prefix makes this a flat invocation, so the generator
16
+ * rewrites the body's `/opsx:*` references to the `/opsx-*` form Devin
17
+ * registers — see invocation.ts.
18
+ */
19
+ export const devinAdapter = {
20
+ toolId: 'devin',
21
+ getFilePath(commandId) {
22
+ return path.join('.devin', 'workflows', `opsx-${commandId}.md`);
23
+ },
24
+ formatFile(content) {
25
+ return `---
26
+ name: ${escapeYamlValue(content.name)}
27
+ description: ${escapeYamlValue(content.description)}
28
+ category: ${escapeYamlValue(content.category)}
29
+ tags: ${formatTagsArray(content.tags)}
30
+ ---
31
+
32
+ ${content.body}
33
+ `;
34
+ },
35
+ };
36
+ //# sourceMappingURL=devin.js.map
@@ -4,6 +4,7 @@
4
4
  * Formats commands for Factory Droid following its frontmatter specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue } from '../yaml.js';
7
8
  /**
8
9
  * Factory adapter for command generation.
9
10
  * File path: .factory/commands/opsx-<id>.md
@@ -15,12 +16,12 @@ export const factoryAdapter = {
15
16
  return path.join('.factory', 'commands', `opsx-${commandId}.md`);
16
17
  },
17
18
  formatFile(content) {
18
- return `---
19
- description: ${content.description}
20
- argument-hint: command arguments
21
- ---
22
-
23
- ${content.body}
19
+ return `---
20
+ description: ${escapeYamlValue(content.description)}
21
+ argument-hint: command arguments
22
+ ---
23
+
24
+ ${content.body}
24
25
  `;
25
26
  },
26
27
  };
@@ -4,6 +4,41 @@
4
4
  * Formats commands for Gemini CLI following its TOML specification.
5
5
  */
6
6
  import path from 'path';
7
+ /**
8
+ * Control characters (C0 except tab/newline/carriage return, plus DEL) are
9
+ * invalid inside TOML strings and must be written as escapes.
10
+ */
11
+ const TOML_CONTROL_CHARS = new RegExp('[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f]', 'g');
12
+ /**
13
+ * TOML basic strings are escape-active: a backslash or double quote in the
14
+ * value breaks the file if written raw. Newlines cannot appear in a
15
+ * single-line basic string at all, so they are escaped too.
16
+ */
17
+ function escapeTomlBasicString(value) {
18
+ return value
19
+ .replace(/\\/g, '\\\\')
20
+ .replace(/"/g, '\\"')
21
+ .replace(/\n/g, '\\n')
22
+ .replace(/\r/g, '\\r')
23
+ .replace(/\t/g, '\\t')
24
+ .replace(TOML_CONTROL_CHARS, (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`);
25
+ }
26
+ /**
27
+ * Multiline basic strings keep raw newlines and tabs, but backslashes are
28
+ * still escape-active, any run of three quotes would end the string, and the
29
+ * same control characters are invalid as in single-line basic strings — a
30
+ * lone carriage return included (only LF and CRLF may appear raw; CRLF is
31
+ * normalized away so the emitted file is single-convention). Escapes are
32
+ * introduced after backslash-doubling so they are not re-doubled.
33
+ */
34
+ function escapeTomlMultilineBasicString(value) {
35
+ return value
36
+ .replace(/\r\n/g, '\n')
37
+ .replace(/\\/g, '\\\\')
38
+ .replace(/"""/g, '""\\"')
39
+ .replace(/\r/g, '\\r')
40
+ .replace(TOML_CONTROL_CHARS, (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`);
41
+ }
7
42
  /**
8
43
  * Gemini adapter for command generation.
9
44
  * File path: .gemini/commands/opsx/<id>.toml
@@ -15,11 +50,11 @@ export const geminiAdapter = {
15
50
  return path.join('.gemini', 'commands', 'opsx', `${commandId}.toml`);
16
51
  },
17
52
  formatFile(content) {
18
- return `description = "${content.description}"
19
-
20
- prompt = """
21
- ${content.body}
22
- """
53
+ return `description = "${escapeTomlBasicString(content.description)}"
54
+
55
+ prompt = """
56
+ ${escapeTomlMultilineBasicString(content.body)}
57
+ """
23
58
  `;
24
59
  },
25
60
  };
@@ -4,6 +4,7 @@
4
4
  * Formats commands for GitHub Copilot following its .prompt.md specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue } from '../yaml.js';
7
8
  /**
8
9
  * GitHub Copilot adapter for command generation.
9
10
  * File path: .github/prompts/opsx-<id>.prompt.md
@@ -15,11 +16,11 @@ export const githubCopilotAdapter = {
15
16
  return path.join('.github', 'prompts', `opsx-${commandId}.prompt.md`);
16
17
  },
17
18
  formatFile(content) {
18
- return `---
19
- description: ${content.description}
20
- ---
21
-
22
- ${content.body}
19
+ return `---
20
+ description: ${escapeYamlValue(content.description)}
21
+ ---
22
+
23
+ ${content.body}
23
24
  `;
24
25
  },
25
26
  };
@@ -4,6 +4,7 @@
4
4
  * Formats commands for iFlow following its frontmatter specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue } from '../yaml.js';
7
8
  /**
8
9
  * iFlow adapter for command generation.
9
10
  * File path: .iflow/commands/opsx-<id>.md
@@ -15,14 +16,14 @@ export const iflowAdapter = {
15
16
  return path.join('.iflow', 'commands', `opsx-${commandId}.md`);
16
17
  },
17
18
  formatFile(content) {
18
- return `---
19
- name: /opsx-${content.id}
20
- id: opsx-${content.id}
21
- category: ${content.category}
22
- description: ${content.description}
23
- ---
24
-
25
- ${content.body}
19
+ return `---
20
+ name: ${escapeYamlValue(`/opsx-${content.id}`)}
21
+ id: ${escapeYamlValue(`opsx-${content.id}`)}
22
+ category: ${escapeYamlValue(content.category)}
23
+ description: ${escapeYamlValue(content.description)}
24
+ ---
25
+
26
+ ${content.body}
26
27
  `;
27
28
  },
28
29
  };
@@ -9,12 +9,12 @@ export { auggieAdapter } from './auggie.js';
9
9
  export { bobAdapter } from './bob.js';
10
10
  export { claudeAdapter } from './claude.js';
11
11
  export { clineAdapter } from './cline.js';
12
- export { codexAdapter } from './codex.js';
13
12
  export { codebuddyAdapter } from './codebuddy.js';
14
13
  export { continueAdapter } from './continue.js';
15
14
  export { costrictAdapter } from './costrict.js';
16
15
  export { crushAdapter } from './crush.js';
17
16
  export { cursorAdapter } from './cursor.js';
17
+ export { devinAdapter } from './devin.js';
18
18
  export { factoryAdapter } from './factory.js';
19
19
  export { geminiAdapter } from './gemini.js';
20
20
  export { githubCopilotAdapter } from './github-copilot.js';
@@ -22,11 +22,13 @@ export { iflowAdapter } from './iflow.js';
22
22
  export { junieAdapter } from './junie.js';
23
23
  export { kilocodeAdapter } from './kilocode.js';
24
24
  export { kiroAdapter } from './kiro.js';
25
+ export { ohMyPiAdapter } from './oh-my-pi.js';
25
26
  export { opencodeAdapter } from './opencode.js';
26
27
  export { piAdapter } from './pi.js';
27
28
  export { qoderAdapter } from './qoder.js';
28
29
  export { lingmaAdapter } from './lingma.js';
29
30
  export { qwenAdapter } from './qwen.js';
30
31
  export { roocodeAdapter } from './roocode.js';
31
- export { windsurfAdapter } from './windsurf.js';
32
+ export { traeAdapter } from './trae.js';
33
+ export { zcodeAdapter } from './zcode.js';
32
34
  //# sourceMappingURL=index.d.ts.map
@@ -9,12 +9,12 @@ export { auggieAdapter } from './auggie.js';
9
9
  export { bobAdapter } from './bob.js';
10
10
  export { claudeAdapter } from './claude.js';
11
11
  export { clineAdapter } from './cline.js';
12
- export { codexAdapter } from './codex.js';
13
12
  export { codebuddyAdapter } from './codebuddy.js';
14
13
  export { continueAdapter } from './continue.js';
15
14
  export { costrictAdapter } from './costrict.js';
16
15
  export { crushAdapter } from './crush.js';
17
16
  export { cursorAdapter } from './cursor.js';
17
+ export { devinAdapter } from './devin.js';
18
18
  export { factoryAdapter } from './factory.js';
19
19
  export { geminiAdapter } from './gemini.js';
20
20
  export { githubCopilotAdapter } from './github-copilot.js';
@@ -22,11 +22,13 @@ export { iflowAdapter } from './iflow.js';
22
22
  export { junieAdapter } from './junie.js';
23
23
  export { kilocodeAdapter } from './kilocode.js';
24
24
  export { kiroAdapter } from './kiro.js';
25
+ export { ohMyPiAdapter } from './oh-my-pi.js';
25
26
  export { opencodeAdapter } from './opencode.js';
26
27
  export { piAdapter } from './pi.js';
27
28
  export { qoderAdapter } from './qoder.js';
28
29
  export { lingmaAdapter } from './lingma.js';
29
30
  export { qwenAdapter } from './qwen.js';
30
31
  export { roocodeAdapter } from './roocode.js';
31
- export { windsurfAdapter } from './windsurf.js';
32
+ export { traeAdapter } from './trae.js';
33
+ export { zcodeAdapter } from './zcode.js';
32
34
  //# sourceMappingURL=index.js.map
@@ -4,6 +4,7 @@
4
4
  * Formats commands for Junie following its frontmatter specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue } from '../yaml.js';
7
8
  /**
8
9
  * Junie adapter for command generation.
9
10
  * File path: .junie/commands/opsx-<id>.md
@@ -15,11 +16,11 @@ export const junieAdapter = {
15
16
  return path.join('.junie', 'commands', `opsx-${commandId}.md`);
16
17
  },
17
18
  formatFile(content) {
18
- return `---
19
- description: ${content.description}
20
- ---
21
-
22
- ${content.body}
19
+ return `---
20
+ description: ${escapeYamlValue(content.description)}
21
+ ---
22
+
23
+ ${content.body}
23
24
  `;
24
25
  },
25
26
  };
@@ -16,7 +16,7 @@ export const kilocodeAdapter = {
16
16
  return path.join('.kilocode', 'workflows', `opsx-${commandId}.md`);
17
17
  },
18
18
  formatFile(content) {
19
- return `${content.body}
19
+ return `${content.body}
20
20
  `;
21
21
  },
22
22
  };
@@ -4,6 +4,7 @@
4
4
  * Formats commands for Kiro following its .prompt.md specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue } from '../yaml.js';
7
8
  /**
8
9
  * Kiro adapter for command generation.
9
10
  * File path: .kiro/prompts/opsx-<id>.prompt.md
@@ -15,11 +16,11 @@ export const kiroAdapter = {
15
16
  return path.join('.kiro', 'prompts', `opsx-${commandId}.prompt.md`);
16
17
  },
17
18
  formatFile(content) {
18
- return `---
19
- description: ${content.description}
20
- ---
21
-
22
- ${content.body}
19
+ return `---
20
+ description: ${escapeYamlValue(content.description)}
21
+ ---
22
+
23
+ ${content.body}
23
24
  `;
24
25
  },
25
26
  };
@@ -4,6 +4,7 @@
4
4
  * Formats commands for Lingma following its frontmatter specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue, formatTagsArray } from '../yaml.js';
7
8
  /**
8
9
  * Lingma adapter for command generation.
9
10
  * File path: .lingma/commands/opsx/<id>.md
@@ -15,15 +16,14 @@ export const lingmaAdapter = {
15
16
  return path.join('.lingma', 'commands', 'opsx', `${commandId}.md`);
16
17
  },
17
18
  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}
19
+ return `---
20
+ name: ${escapeYamlValue(content.name)}
21
+ description: ${escapeYamlValue(content.description)}
22
+ category: ${escapeYamlValue(content.category)}
23
+ tags: ${formatTagsArray(content.tags)}
24
+ ---
25
+
26
+ ${content.body}
27
27
  `;
28
28
  },
29
29
  };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Oh My Pi (OMP) Command Adapter
3
+ *
4
+ * Formats commands for Oh My Pi following its slash command specification.
5
+ * OMP loads slash commands from .omp/commands/*.md with YAML frontmatter.
6
+ * The filename (minus .md) becomes the slash command name.
7
+ */
8
+ import type { ToolCommandAdapter } from '../types.js';
9
+ /**
10
+ * Oh My Pi adapter for command generation.
11
+ * File path: .omp/commands/opsx-<id>.md
12
+ * Frontmatter: description
13
+ *
14
+ * OMP uses the filename (minus .md) as the slash command name, so
15
+ * opsx-propose.md → /opsx-propose. generateCommand rewrites the body's
16
+ * command references to that form before this adapter formats it, and
17
+ * $@ is injected after **Input**: headings so user-supplied arguments
18
+ * (e.g. /opsx-propose my-feature) are visible to the agent.
19
+ */
20
+ export declare const ohMyPiAdapter: ToolCommandAdapter;
21
+ //# sourceMappingURL=oh-my-pi.d.ts.map
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Oh My Pi (OMP) Command Adapter
3
+ *
4
+ * Formats commands for Oh My Pi following its slash command specification.
5
+ * OMP loads slash commands from .omp/commands/*.md with YAML frontmatter.
6
+ * The filename (minus .md) becomes the slash command name.
7
+ */
8
+ import path from 'path';
9
+ import { escapeYamlValue } from '../yaml.js';
10
+ const OMP_INPUT_HEADING = /^\*\*Input\*\*:[^\n]*$/m;
11
+ function injectOmpArgs(body) {
12
+ if (body.includes('$@') || body.includes('$ARGUMENTS')) {
13
+ return body;
14
+ }
15
+ return body.replace(OMP_INPUT_HEADING, (heading) => `${heading}\n**Provided arguments**: $@`);
16
+ }
17
+ /**
18
+ * Oh My Pi adapter for command generation.
19
+ * File path: .omp/commands/opsx-<id>.md
20
+ * Frontmatter: description
21
+ *
22
+ * OMP uses the filename (minus .md) as the slash command name, so
23
+ * opsx-propose.md → /opsx-propose. generateCommand rewrites the body's
24
+ * command references to that form before this adapter formats it, and
25
+ * $@ is injected after **Input**: headings so user-supplied arguments
26
+ * (e.g. /opsx-propose my-feature) are visible to the agent.
27
+ */
28
+ export const ohMyPiAdapter = {
29
+ toolId: 'oh-my-pi',
30
+ getFilePath(commandId) {
31
+ return path.join('.omp', 'commands', `opsx-${commandId}.md`);
32
+ },
33
+ formatFile(content) {
34
+ return `---
35
+ description: ${escapeYamlValue(content.description)}
36
+ ---
37
+
38
+ ${injectOmpArgs(content.body)}
39
+ `;
40
+ },
41
+ };
42
+ //# sourceMappingURL=oh-my-pi.js.map
@@ -4,7 +4,7 @@
4
4
  * Formats commands for OpenCode following its frontmatter specification.
5
5
  */
6
6
  import path from 'path';
7
- import { transformToHyphenCommands } from '../../../utils/command-references.js';
7
+ import { escapeYamlValue } from '../yaml.js';
8
8
  /**
9
9
  * OpenCode adapter for command generation.
10
10
  * File path: .opencode/commands/opsx-<id>.md
@@ -16,13 +16,11 @@ export const opencodeAdapter = {
16
16
  return path.join('.opencode', 'commands', `opsx-${commandId}.md`);
17
17
  },
18
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}
19
+ return `---
20
+ description: ${escapeYamlValue(content.description)}
21
+ ---
22
+
23
+ ${content.body}
26
24
  `;
27
25
  },
28
26
  };
@@ -11,8 +11,8 @@ import type { ToolCommandAdapter } from '../types.js';
11
11
  * Frontmatter: description
12
12
  *
13
13
  * Pi uses the filename (minus .md) as the slash command name, so
14
- * opsx-propose.md → /opsx-propose. Command references in the body
15
- * are transformed from /opsx: to /opsx- for consistency.
14
+ * opsx-propose.md → /opsx-propose. generateCommand rewrites the body's
15
+ * command references to that form before this adapter formats it.
16
16
  */
17
17
  export declare const piAdapter: ToolCommandAdapter;
18
18
  //# sourceMappingURL=pi.d.ts.map
@@ -5,7 +5,6 @@
5
5
  * Pi prompt templates live in .pi/prompts/*.md with description frontmatter.
6
6
  */
7
7
  import path from 'path';
8
- import { transformToHyphenCommands } from '../../../utils/command-references.js';
9
8
  import { escapeYamlValue } from '../yaml.js';
10
9
  const PI_INPUT_HEADING = /^\*\*Input\*\*:[^\n]*$/m;
11
10
  function injectPiArgs(body) {
@@ -20,8 +19,8 @@ function injectPiArgs(body) {
20
19
  * Frontmatter: description
21
20
  *
22
21
  * Pi uses the filename (minus .md) as the slash command name, so
23
- * opsx-propose.md → /opsx-propose. Command references in the body
24
- * are transformed from /opsx: to /opsx- for consistency.
22
+ * opsx-propose.md → /opsx-propose. generateCommand rewrites the body's
23
+ * command references to that form before this adapter formats it.
25
24
  */
26
25
  export const piAdapter = {
27
26
  toolId: 'pi',
@@ -29,13 +28,11 @@ export const piAdapter = {
29
28
  return path.join('.pi', 'prompts', `opsx-${commandId}.md`);
30
29
  },
31
30
  formatFile(content) {
32
- // Transform /opsx: references to /opsx- and inject $@ for template args
33
- const transformedBody = transformToHyphenCommands(content.body);
34
- return `---
35
- description: ${escapeYamlValue(content.description)}
36
- ---
37
-
38
- ${injectPiArgs(transformedBody)}
31
+ return `---
32
+ description: ${escapeYamlValue(content.description)}
33
+ ---
34
+
35
+ ${injectPiArgs(content.body)}
39
36
  `;
40
37
  },
41
38
  };
@@ -4,6 +4,7 @@
4
4
  * Formats commands for Qoder following its frontmatter specification.
5
5
  */
6
6
  import path from 'path';
7
+ import { escapeYamlValue, formatTagsArray } from '../yaml.js';
7
8
  /**
8
9
  * Qoder adapter for command generation.
9
10
  * File path: .qoder/commands/opsx/<id>.md
@@ -15,15 +16,14 @@ export const qoderAdapter = {
15
16
  return path.join('.qoder', 'commands', 'opsx', `${commandId}.md`);
16
17
  },
17
18
  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}
19
+ return `---
20
+ name: ${escapeYamlValue(content.name)}
21
+ description: ${escapeYamlValue(content.description)}
22
+ category: ${escapeYamlValue(content.category)}
23
+ tags: ${formatTagsArray(content.tags)}
24
+ ---
25
+
26
+ ${content.body}
27
27
  `;
28
28
  },
29
29
  };
@@ -1,13 +1,17 @@
1
1
  /**
2
2
  * Qwen Code Command Adapter
3
3
  *
4
- * Formats commands for Qwen Code following its TOML specification.
4
+ * Formats commands for Qwen Code following its Markdown custom command
5
+ * specification. Qwen Code has deprecated TOML commands in favor of
6
+ * Markdown files with YAML frontmatter.
7
+ *
8
+ * @see https://qwenlm.github.io/qwen-code-docs/en/users/features/commands/#markdown-file-format-specification-recommended
5
9
  */
6
10
  import type { ToolCommandAdapter } from '../types.js';
7
11
  /**
8
12
  * Qwen adapter for command generation.
9
- * File path: .qwen/commands/opsx-<id>.toml
10
- * Format: TOML with description and prompt fields
13
+ * File path: .qwen/commands/opsx-<id>.md
14
+ * Format: Markdown with description frontmatter
11
15
  */
12
16
  export declare const qwenAdapter: ToolCommandAdapter;
13
17
  //# sourceMappingURL=qwen.d.ts.map