@specpow/framework 0.2.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 (362) hide show
  1. package/CHANGELOG.md +307 -0
  2. package/LICENSE +21 -0
  3. package/README.md +557 -0
  4. package/agents/controller/sdd-controller.md +55 -0
  5. package/agents/execution/java-codegen-agent.md +39 -0
  6. package/agents/execution/ui-codegen-agent.md +32 -0
  7. package/agents/ops/deploy-agent.md +181 -0
  8. package/agents/planning/db-designer-agent.md +30 -0
  9. package/agents/planning/prd-agent.md +31 -0
  10. package/agents/quality/review-agent.md +36 -0
  11. package/agents/quality/test-agent.md +33 -0
  12. package/bin/specpow.js +10 -0
  13. package/dist/cli/index.d.ts +7 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +444 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/commands/apply.d.ts +14 -0
  18. package/dist/commands/apply.d.ts.map +1 -0
  19. package/dist/commands/apply.js +195 -0
  20. package/dist/commands/apply.js.map +1 -0
  21. package/dist/commands/archive.d.ts +30 -0
  22. package/dist/commands/archive.d.ts.map +1 -0
  23. package/dist/commands/archive.js +141 -0
  24. package/dist/commands/archive.js.map +1 -0
  25. package/dist/commands/channel.d.ts +61 -0
  26. package/dist/commands/channel.d.ts.map +1 -0
  27. package/dist/commands/channel.js +613 -0
  28. package/dist/commands/channel.js.map +1 -0
  29. package/dist/commands/config.d.ts +40 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +130 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/debug.d.ts +45 -0
  34. package/dist/commands/debug.d.ts.map +1 -0
  35. package/dist/commands/debug.js +167 -0
  36. package/dist/commands/debug.js.map +1 -0
  37. package/dist/commands/doctor.d.ts +20 -0
  38. package/dist/commands/doctor.d.ts.map +1 -0
  39. package/dist/commands/doctor.js +121 -0
  40. package/dist/commands/doctor.js.map +1 -0
  41. package/dist/commands/execute.d.ts +25 -0
  42. package/dist/commands/execute.d.ts.map +1 -0
  43. package/dist/commands/execute.js +120 -0
  44. package/dist/commands/execute.js.map +1 -0
  45. package/dist/commands/explore.d.ts +71 -0
  46. package/dist/commands/explore.d.ts.map +1 -0
  47. package/dist/commands/explore.js +481 -0
  48. package/dist/commands/explore.js.map +1 -0
  49. package/dist/commands/init.d.ts +20 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +146 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/memory.d.ts +32 -0
  54. package/dist/commands/memory.d.ts.map +1 -0
  55. package/dist/commands/memory.js +455 -0
  56. package/dist/commands/memory.js.map +1 -0
  57. package/dist/commands/propose.d.ts +13 -0
  58. package/dist/commands/propose.d.ts.map +1 -0
  59. package/dist/commands/propose.js +193 -0
  60. package/dist/commands/propose.js.map +1 -0
  61. package/dist/commands/review.d.ts +50 -0
  62. package/dist/commands/review.d.ts.map +1 -0
  63. package/dist/commands/review.js +198 -0
  64. package/dist/commands/review.js.map +1 -0
  65. package/dist/commands/schema.d.ts +22 -0
  66. package/dist/commands/schema.d.ts.map +1 -0
  67. package/dist/commands/schema.js +79 -0
  68. package/dist/commands/schema.js.map +1 -0
  69. package/dist/commands/status.d.ts +11 -0
  70. package/dist/commands/status.d.ts.map +1 -0
  71. package/dist/commands/status.js +130 -0
  72. package/dist/commands/status.js.map +1 -0
  73. package/dist/commands/store.d.ts +31 -0
  74. package/dist/commands/store.d.ts.map +1 -0
  75. package/dist/commands/store.js +109 -0
  76. package/dist/commands/store.js.map +1 -0
  77. package/dist/commands/update.d.ts +42 -0
  78. package/dist/commands/update.d.ts.map +1 -0
  79. package/dist/commands/update.js +239 -0
  80. package/dist/commands/update.js.map +1 -0
  81. package/dist/commands/verify.d.ts +39 -0
  82. package/dist/commands/verify.d.ts.map +1 -0
  83. package/dist/commands/verify.js +386 -0
  84. package/dist/commands/verify.js.map +1 -0
  85. package/dist/commands/workflow/index.d.ts +12 -0
  86. package/dist/commands/workflow/index.d.ts.map +1 -0
  87. package/dist/commands/workflow/index.js +435 -0
  88. package/dist/commands/workflow/index.js.map +1 -0
  89. package/dist/core/agent-contract.d.ts +133 -0
  90. package/dist/core/agent-contract.d.ts.map +1 -0
  91. package/dist/core/agent-contract.js +71 -0
  92. package/dist/core/agent-contract.js.map +1 -0
  93. package/dist/core/archive/delta-merger.d.ts +101 -0
  94. package/dist/core/archive/delta-merger.d.ts.map +1 -0
  95. package/dist/core/archive/delta-merger.js +398 -0
  96. package/dist/core/archive/delta-merger.js.map +1 -0
  97. package/dist/core/archive/delta-parser.d.ts +48 -0
  98. package/dist/core/archive/delta-parser.d.ts.map +1 -0
  99. package/dist/core/archive/delta-parser.js +193 -0
  100. package/dist/core/archive/delta-parser.js.map +1 -0
  101. package/dist/core/archive/engine.d.ts +136 -0
  102. package/dist/core/archive/engine.d.ts.map +1 -0
  103. package/dist/core/archive/engine.js +506 -0
  104. package/dist/core/archive/engine.js.map +1 -0
  105. package/dist/core/archive/index.d.ts +11 -0
  106. package/dist/core/archive/index.d.ts.map +1 -0
  107. package/dist/core/archive/index.js +9 -0
  108. package/dist/core/archive/index.js.map +1 -0
  109. package/dist/core/artifact-graph/graph.d.ts +48 -0
  110. package/dist/core/artifact-graph/graph.d.ts.map +1 -0
  111. package/dist/core/artifact-graph/graph.js +170 -0
  112. package/dist/core/artifact-graph/graph.js.map +1 -0
  113. package/dist/core/artifact-graph/index.d.ts +13 -0
  114. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  115. package/dist/core/artifact-graph/index.js +12 -0
  116. package/dist/core/artifact-graph/index.js.map +1 -0
  117. package/dist/core/artifact-graph/instruction-loader.d.ts +60 -0
  118. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
  119. package/dist/core/artifact-graph/instruction-loader.js +166 -0
  120. package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
  121. package/dist/core/artifact-graph/outputs.d.ts +17 -0
  122. package/dist/core/artifact-graph/outputs.d.ts.map +1 -0
  123. package/dist/core/artifact-graph/outputs.js +27 -0
  124. package/dist/core/artifact-graph/outputs.js.map +1 -0
  125. package/dist/core/artifact-graph/resolver.d.ts +34 -0
  126. package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
  127. package/dist/core/artifact-graph/resolver.js +99 -0
  128. package/dist/core/artifact-graph/resolver.js.map +1 -0
  129. package/dist/core/artifact-graph/state.d.ts +54 -0
  130. package/dist/core/artifact-graph/state.d.ts.map +1 -0
  131. package/dist/core/artifact-graph/state.js +149 -0
  132. package/dist/core/artifact-graph/state.js.map +1 -0
  133. package/dist/core/artifact-graph/types.d.ts +151 -0
  134. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  135. package/dist/core/artifact-graph/types.js +44 -0
  136. package/dist/core/artifact-graph/types.js.map +1 -0
  137. package/dist/core/channel/channel-event-log.d.ts +81 -0
  138. package/dist/core/channel/channel-event-log.d.ts.map +1 -0
  139. package/dist/core/channel/channel-event-log.js +177 -0
  140. package/dist/core/channel/channel-event-log.js.map +1 -0
  141. package/dist/core/channel/channel-inbox.d.ts +70 -0
  142. package/dist/core/channel/channel-inbox.d.ts.map +1 -0
  143. package/dist/core/channel/channel-inbox.js +122 -0
  144. package/dist/core/channel/channel-inbox.js.map +1 -0
  145. package/dist/core/channel/channel-runtime.d.ts +81 -0
  146. package/dist/core/channel/channel-runtime.d.ts.map +1 -0
  147. package/dist/core/channel/channel-runtime.js +291 -0
  148. package/dist/core/channel/channel-runtime.js.map +1 -0
  149. package/dist/core/channel/channel-supervisor.d.ts +72 -0
  150. package/dist/core/channel/channel-supervisor.d.ts.map +1 -0
  151. package/dist/core/channel/channel-supervisor.js +189 -0
  152. package/dist/core/channel/channel-supervisor.js.map +1 -0
  153. package/dist/core/channel/channel-types.d.ts +169 -0
  154. package/dist/core/channel/channel-types.d.ts.map +1 -0
  155. package/dist/core/channel/channel-types.js +26 -0
  156. package/dist/core/channel/channel-types.js.map +1 -0
  157. package/dist/core/channel/index.d.ts +21 -0
  158. package/dist/core/channel/index.d.ts.map +1 -0
  159. package/dist/core/channel/index.js +23 -0
  160. package/dist/core/channel/index.js.map +1 -0
  161. package/dist/core/command-generation/index.d.ts +225 -0
  162. package/dist/core/command-generation/index.d.ts.map +1 -0
  163. package/dist/core/command-generation/index.js +462 -0
  164. package/dist/core/command-generation/index.js.map +1 -0
  165. package/dist/core/config/config-schema.d.ts +745 -0
  166. package/dist/core/config/config-schema.d.ts.map +1 -0
  167. package/dist/core/config/config-schema.js +108 -0
  168. package/dist/core/config/config-schema.js.map +1 -0
  169. package/dist/core/config/global-config.d.ts +73 -0
  170. package/dist/core/config/global-config.d.ts.map +1 -0
  171. package/dist/core/config/global-config.js +225 -0
  172. package/dist/core/config/global-config.js.map +1 -0
  173. package/dist/core/config/index.d.ts +8 -0
  174. package/dist/core/config/index.d.ts.map +1 -0
  175. package/dist/core/config/index.js +8 -0
  176. package/dist/core/config/index.js.map +1 -0
  177. package/dist/core/hooks/hook-registry.d.ts +55 -0
  178. package/dist/core/hooks/hook-registry.d.ts.map +1 -0
  179. package/dist/core/hooks/hook-registry.js +172 -0
  180. package/dist/core/hooks/hook-registry.js.map +1 -0
  181. package/dist/core/hooks/hook-types.d.ts +87 -0
  182. package/dist/core/hooks/hook-types.d.ts.map +1 -0
  183. package/dist/core/hooks/hook-types.js +11 -0
  184. package/dist/core/hooks/hook-types.js.map +1 -0
  185. package/dist/core/hooks/index.d.ts +28 -0
  186. package/dist/core/hooks/index.d.ts.map +1 -0
  187. package/dist/core/hooks/index.js +28 -0
  188. package/dist/core/hooks/index.js.map +1 -0
  189. package/dist/core/hooks/post-tool-call-hook.d.ts +21 -0
  190. package/dist/core/hooks/post-tool-call-hook.d.ts.map +1 -0
  191. package/dist/core/hooks/post-tool-call-hook.js +191 -0
  192. package/dist/core/hooks/post-tool-call-hook.js.map +1 -0
  193. package/dist/core/hooks/pre-tool-call-hook.d.ts +31 -0
  194. package/dist/core/hooks/pre-tool-call-hook.d.ts.map +1 -0
  195. package/dist/core/hooks/pre-tool-call-hook.js +122 -0
  196. package/dist/core/hooks/pre-tool-call-hook.js.map +1 -0
  197. package/dist/core/hooks/session-start-hook.d.ts +25 -0
  198. package/dist/core/hooks/session-start-hook.d.ts.map +1 -0
  199. package/dist/core/hooks/session-start-hook.js +226 -0
  200. package/dist/core/hooks/session-start-hook.js.map +1 -0
  201. package/dist/core/hooks/workflow-state-hook.d.ts +18 -0
  202. package/dist/core/hooks/workflow-state-hook.d.ts.map +1 -0
  203. package/dist/core/hooks/workflow-state-hook.js +181 -0
  204. package/dist/core/hooks/workflow-state-hook.js.map +1 -0
  205. package/dist/core/init/engine.d.ts +69 -0
  206. package/dist/core/init/engine.d.ts.map +1 -0
  207. package/dist/core/init/engine.js +211 -0
  208. package/dist/core/init/engine.js.map +1 -0
  209. package/dist/core/init/template-hash.d.ts +86 -0
  210. package/dist/core/init/template-hash.d.ts.map +1 -0
  211. package/dist/core/init/template-hash.js +228 -0
  212. package/dist/core/init/template-hash.js.map +1 -0
  213. package/dist/core/memory/adapters/json-adapter.d.ts +50 -0
  214. package/dist/core/memory/adapters/json-adapter.d.ts.map +1 -0
  215. package/dist/core/memory/adapters/json-adapter.js +273 -0
  216. package/dist/core/memory/adapters/json-adapter.js.map +1 -0
  217. package/dist/core/memory/adapters/sqlite-adapter.d.ts +26 -0
  218. package/dist/core/memory/adapters/sqlite-adapter.d.ts.map +1 -0
  219. package/dist/core/memory/adapters/sqlite-adapter.js +230 -0
  220. package/dist/core/memory/adapters/sqlite-adapter.js.map +1 -0
  221. package/dist/core/memory/index.d.ts +38 -0
  222. package/dist/core/memory/index.d.ts.map +1 -0
  223. package/dist/core/memory/index.js +40 -0
  224. package/dist/core/memory/index.js.map +1 -0
  225. package/dist/core/memory/memory-indexer.d.ts +39 -0
  226. package/dist/core/memory/memory-indexer.d.ts.map +1 -0
  227. package/dist/core/memory/memory-indexer.js +213 -0
  228. package/dist/core/memory/memory-indexer.js.map +1 -0
  229. package/dist/core/memory/memory-manager.d.ts +59 -0
  230. package/dist/core/memory/memory-manager.d.ts.map +1 -0
  231. package/dist/core/memory/memory-manager.js +194 -0
  232. package/dist/core/memory/memory-manager.js.map +1 -0
  233. package/dist/core/memory/memory-store.d.ts +31 -0
  234. package/dist/core/memory/memory-store.d.ts.map +1 -0
  235. package/dist/core/memory/memory-store.js +148 -0
  236. package/dist/core/memory/memory-store.js.map +1 -0
  237. package/dist/core/memory/memory-types.d.ts +154 -0
  238. package/dist/core/memory/memory-types.d.ts.map +1 -0
  239. package/dist/core/memory/memory-types.js +13 -0
  240. package/dist/core/memory/memory-types.js.map +1 -0
  241. package/dist/core/migration/index.d.ts +80 -0
  242. package/dist/core/migration/index.d.ts.map +1 -0
  243. package/dist/core/migration/index.js +361 -0
  244. package/dist/core/migration/index.js.map +1 -0
  245. package/dist/core/parsers/index.d.ts +95 -0
  246. package/dist/core/parsers/index.d.ts.map +1 -0
  247. package/dist/core/parsers/index.js +367 -0
  248. package/dist/core/parsers/index.js.map +1 -0
  249. package/dist/core/sdd-engine/ai-caller.d.ts +118 -0
  250. package/dist/core/sdd-engine/ai-caller.d.ts.map +1 -0
  251. package/dist/core/sdd-engine/ai-caller.js +624 -0
  252. package/dist/core/sdd-engine/ai-caller.js.map +1 -0
  253. package/dist/core/sdd-engine/controller.d.ts +107 -0
  254. package/dist/core/sdd-engine/controller.d.ts.map +1 -0
  255. package/dist/core/sdd-engine/controller.js +357 -0
  256. package/dist/core/sdd-engine/controller.js.map +1 -0
  257. package/dist/core/sdd-engine/dispatcher.d.ts +69 -0
  258. package/dist/core/sdd-engine/dispatcher.d.ts.map +1 -0
  259. package/dist/core/sdd-engine/dispatcher.js +146 -0
  260. package/dist/core/sdd-engine/dispatcher.js.map +1 -0
  261. package/dist/core/sdd-engine/git-ops.d.ts +73 -0
  262. package/dist/core/sdd-engine/git-ops.d.ts.map +1 -0
  263. package/dist/core/sdd-engine/git-ops.js +326 -0
  264. package/dist/core/sdd-engine/git-ops.js.map +1 -0
  265. package/dist/core/sdd-engine/index.d.ts +17 -0
  266. package/dist/core/sdd-engine/index.d.ts.map +1 -0
  267. package/dist/core/sdd-engine/index.js +15 -0
  268. package/dist/core/sdd-engine/index.js.map +1 -0
  269. package/dist/core/sdd-engine/ledger.d.ts +92 -0
  270. package/dist/core/sdd-engine/ledger.d.ts.map +1 -0
  271. package/dist/core/sdd-engine/ledger.js +273 -0
  272. package/dist/core/sdd-engine/ledger.js.map +1 -0
  273. package/dist/core/sdd-engine/model-selector.d.ts +49 -0
  274. package/dist/core/sdd-engine/model-selector.d.ts.map +1 -0
  275. package/dist/core/sdd-engine/model-selector.js +76 -0
  276. package/dist/core/sdd-engine/model-selector.js.map +1 -0
  277. package/dist/core/sdd-engine/parallel-dispatcher.d.ts +99 -0
  278. package/dist/core/sdd-engine/parallel-dispatcher.d.ts.map +1 -0
  279. package/dist/core/sdd-engine/parallel-dispatcher.js +350 -0
  280. package/dist/core/sdd-engine/parallel-dispatcher.js.map +1 -0
  281. package/dist/core/sdd-engine/review-loop.d.ts +61 -0
  282. package/dist/core/sdd-engine/review-loop.d.ts.map +1 -0
  283. package/dist/core/sdd-engine/review-loop.js +139 -0
  284. package/dist/core/sdd-engine/review-loop.js.map +1 -0
  285. package/dist/core/sdd-engine/types.d.ts +104 -0
  286. package/dist/core/sdd-engine/types.d.ts.map +1 -0
  287. package/dist/core/sdd-engine/types.js +7 -0
  288. package/dist/core/sdd-engine/types.js.map +1 -0
  289. package/dist/core/store/index.d.ts +78 -0
  290. package/dist/core/store/index.d.ts.map +1 -0
  291. package/dist/core/store/index.js +182 -0
  292. package/dist/core/store/index.js.map +1 -0
  293. package/dist/core/templates/index.d.ts +58 -0
  294. package/dist/core/templates/index.d.ts.map +1 -0
  295. package/dist/core/templates/index.js +158 -0
  296. package/dist/core/templates/index.js.map +1 -0
  297. package/dist/core/validation/index.d.ts +34 -0
  298. package/dist/core/validation/index.d.ts.map +1 -0
  299. package/dist/core/validation/index.js +153 -0
  300. package/dist/core/validation/index.js.map +1 -0
  301. package/dist/core/workflow-state.d.ts +96 -0
  302. package/dist/core/workflow-state.d.ts.map +1 -0
  303. package/dist/core/workflow-state.js +284 -0
  304. package/dist/core/workflow-state.js.map +1 -0
  305. package/dist/index.d.ts +18 -0
  306. package/dist/index.d.ts.map +1 -0
  307. package/dist/index.js +21 -0
  308. package/dist/index.js.map +1 -0
  309. package/dist/utils/index.d.ts +48 -0
  310. package/dist/utils/index.d.ts.map +1 -0
  311. package/dist/utils/index.js +119 -0
  312. package/dist/utils/index.js.map +1 -0
  313. package/hooks/hooks.json +30 -0
  314. package/hooks/run-hook.cmd +19 -0
  315. package/hooks/session-start +62 -0
  316. package/hooks/workflow-state +150 -0
  317. package/package.json +122 -0
  318. package/schemas/bug-fix/schema.yaml +64 -0
  319. package/schemas/bug-fix/templates/analysis.md +43 -0
  320. package/schemas/bug-fix/templates/fix-plan.md +19 -0
  321. package/schemas/bug-fix/templates/proposal.md +30 -0
  322. package/schemas/crud-module/schema.yaml +65 -0
  323. package/schemas/crud-module/templates/design.md +36 -0
  324. package/schemas/crud-module/templates/proposal.md +30 -0
  325. package/schemas/crud-module/templates/spec.md +33 -0
  326. package/schemas/crud-module/templates/tasks.md +57 -0
  327. package/schemas/spec-driven/schema.yaml +87 -0
  328. package/schemas/spec-driven/templates/design.md +54 -0
  329. package/schemas/spec-driven/templates/proposal.md +31 -0
  330. package/schemas/spec-driven/templates/spec.md +44 -0
  331. package/schemas/spec-driven/templates/tasks.md +98 -0
  332. package/skills/business-code-review/SKILL.md +78 -0
  333. package/skills/business-db-design/SKILL.md +74 -0
  334. package/skills/business-deploy-check/SKILL.md +72 -0
  335. package/skills/business-doc-sync/SKILL.md +72 -0
  336. package/skills/business-java-codegen/SKILL.md +97 -0
  337. package/skills/business-menu-register/SKILL.md +63 -0
  338. package/skills/business-prd-writer/SKILL.md +80 -0
  339. package/skills/business-test-gen/SKILL.md +82 -0
  340. package/skills/business-ui-codegen/SKILL.md +104 -0
  341. package/skills/execution-finish-branch/SKILL.md +58 -0
  342. package/skills/execution-git-worktrees/SKILL.md +48 -0
  343. package/skills/execution-parallel-agents/SKILL.md +51 -0
  344. package/skills/execution-receiving-review/SKILL.md +47 -0
  345. package/skills/execution-requesting-review/SKILL.md +51 -0
  346. package/skills/execution-subagent-driven-dev/SKILL.md +148 -0
  347. package/skills/execution-systematic-debugging/SKILL.md +95 -0
  348. package/skills/execution-tdd/SKILL.md +74 -0
  349. package/skills/execution-verification-before-completion/SKILL.md +75 -0
  350. package/skills/meta-create-skill/SKILL.md +374 -0
  351. package/skills/meta-using-skills/SKILL.md +97 -0
  352. package/skills/meta-writing-skills/SKILL.md +66 -0
  353. package/skills/planning-apply-change/SKILL.md +199 -0
  354. package/skills/planning-archive-change/SKILL.md +43 -0
  355. package/skills/planning-explore/SKILL.md +108 -0
  356. package/skills/planning-onboard/SKILL.md +60 -0
  357. package/skills/planning-propose/SKILL.md +145 -0
  358. package/skills/planning-update-change/SKILL.md +45 -0
  359. package/skills/planning-verify-change/SKILL.md +58 -0
  360. package/skills/planning-write-design/SKILL.md +59 -0
  361. package/skills/planning-write-plans/SKILL.md +55 -0
  362. package/skills/planning-write-specs/SKILL.md +73 -0
@@ -0,0 +1,462 @@
1
+ /**
2
+ * 命令生成模块 — AI 工具适配层
3
+ *
4
+ * P1-9: 重构为统一适配器注册表,支持 14+ AI 工具
5
+ *
6
+ * 将 SpecPow 技能/命令转换为各 AI 工具的原生格式:
7
+ * - Claude Code → .claude/commands/*.md (namespaced: /specpow:explore)
8
+ * - Cursor → .cursor/rules/*.mdc (flat: /specpow-explore)
9
+ * - Copilot → .github/copilot-instructions.md (flat: /specpow-explore)
10
+ * - CodeBuddy → .codebuddy/rules/*.md
11
+ * - Codex → .codex/instructions.md
12
+ * - Gemini → .gemini/instructions.md (namespaced: /specpow:explore)
13
+ * - Amazon Q → .amazonq/commands/*.md (prefix: @specpow-propose)
14
+ * - Cline → .cline/rules/*.md
15
+ * - Continue → .continue/config.md
16
+ * - Windsurf → .windsurf/rules/*.md
17
+ * - Trae → .trae/rules/*.md
18
+ * - Kiro → .kiro/steering/*.md
19
+ * - Qwen → .qwen/instructions.md
20
+ * - Kimi → .kimi/instructions.md
21
+ */
22
+ import * as fs from 'fs';
23
+ import * as path from 'path';
24
+ // ─── P1-9: 适配器注册表 ─────────────────────────────────────
25
+ /**
26
+ * 适配器注册表 — 统一管理所有 AI 工具适配器
27
+ *
28
+ * 支持动态注册自定义适配器,替代硬编码的 switch-case 工厂函数
29
+ */
30
+ export class AdapterRegistry {
31
+ static adapters = new Map();
32
+ /**
33
+ * 注册适配器
34
+ */
35
+ static register(toolId, adapterClass) {
36
+ AdapterRegistry.adapters.set(toolId, adapterClass);
37
+ }
38
+ /**
39
+ * 获取适配器实例
40
+ */
41
+ static get(toolId, projectRoot) {
42
+ const AdapterClass = AdapterRegistry.adapters.get(toolId);
43
+ if (!AdapterClass) {
44
+ throw new Error(`不支持的 AI 工具: ${toolId}。可用: ${AdapterRegistry.list().join(', ')}`);
45
+ }
46
+ return new AdapterClass(projectRoot);
47
+ }
48
+ /**
49
+ * 列出所有已注册的适配器 ID
50
+ */
51
+ static list() {
52
+ return Array.from(AdapterRegistry.adapters.keys());
53
+ }
54
+ /**
55
+ * 检查适配器是否已注册
56
+ */
57
+ static has(toolId) {
58
+ return AdapterRegistry.adapters.has(toolId);
59
+ }
60
+ /**
61
+ * 获取所有已注册适配器的实例列表
62
+ */
63
+ static getAll(projectRoot) {
64
+ return Array.from(AdapterRegistry.adapters.values())
65
+ .map(AdapterClass => new AdapterClass(projectRoot));
66
+ }
67
+ }
68
+ // ─── 通用 Markdown 文件适配器基类 ─────────────────────────────
69
+ /**
70
+ * 通用基类:将命令写入独立 Markdown 文件的适配器
71
+ * 子类只需指定 installDir 和 fileExt
72
+ */
73
+ class MarkdownFileAdapter {
74
+ installDir;
75
+ invocationStyle;
76
+ constructor(projectRoot) {
77
+ this.installDir = projectRoot; // 由子类覆盖
78
+ }
79
+ /** 文件扩展名,默认 '.md' */
80
+ get fileExt() { return '.md'; }
81
+ /** 生成文件内容,子类可覆盖以定制格式 */
82
+ formatContent(cmd) {
83
+ return [`# ${cmd.name}`, '', `> ${cmd.description}`, '', cmd.prompt].join('\n');
84
+ }
85
+ installCommands(commands) {
86
+ fs.mkdirSync(this.installDir, { recursive: true });
87
+ for (const cmd of commands) {
88
+ const filePath = path.join(this.installDir, `${cmd.name}${this.fileExt}`);
89
+ fs.writeFileSync(filePath, this.formatContent(cmd), 'utf-8');
90
+ }
91
+ }
92
+ uninstallCommands() {
93
+ if (fs.existsSync(this.installDir)) {
94
+ fs.rmSync(this.installDir, { recursive: true, force: true });
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * P1-9: 单文件聚合适配器基类
100
+ * 适用于使用单一文件存放所有命令的工具(如 Codex, Gemini, Qwen, Kimi)
101
+ */
102
+ class SingleFileAdapter {
103
+ installDir;
104
+ invocationStyle;
105
+ fileName = 'instructions.md';
106
+ constructor(projectRoot) {
107
+ this.installDir = projectRoot;
108
+ }
109
+ installCommands(commands) {
110
+ fs.mkdirSync(this.installDir, { recursive: true });
111
+ const filePath = path.join(this.installDir, this.fileName);
112
+ const sections = commands.map(cmd => [
113
+ `## ${cmd.name}`,
114
+ '',
115
+ cmd.description,
116
+ '',
117
+ cmd.prompt,
118
+ '',
119
+ ].join('\n'));
120
+ const content = ['# SpecPow Commands', '', ...sections].join('\n');
121
+ fs.writeFileSync(filePath, content, 'utf-8');
122
+ }
123
+ uninstallCommands() {
124
+ const filePath = path.join(this.installDir, this.fileName);
125
+ if (fs.existsSync(filePath)) {
126
+ fs.unlinkSync(filePath);
127
+ }
128
+ }
129
+ }
130
+ // ─── Claude Code 适配器 ──────────────────────────────────────
131
+ export class ClaudeAdapter extends MarkdownFileAdapter {
132
+ tool = 'claude';
133
+ invocationStyle = 'namespaced'; // /specpow:explore
134
+ constructor(projectRoot) {
135
+ super(projectRoot);
136
+ this.installDir = path.join(projectRoot, '.claude', 'commands');
137
+ }
138
+ }
139
+ // ─── Cursor 适配器 ──────────────────────────────────────────
140
+ export class CursorAdapter {
141
+ tool = 'cursor';
142
+ installDir;
143
+ invocationStyle = 'flat'; // /specpow-explore
144
+ constructor(projectRoot) {
145
+ this.installDir = path.join(projectRoot, '.cursor', 'rules');
146
+ }
147
+ installCommands(commands) {
148
+ fs.mkdirSync(this.installDir, { recursive: true });
149
+ for (const cmd of commands) {
150
+ const filePath = path.join(this.installDir, `${cmd.name}.mdc`);
151
+ const content = [
152
+ '---',
153
+ `description: ${cmd.description}`,
154
+ 'globs:',
155
+ 'alwaysApply: false',
156
+ '---',
157
+ '',
158
+ cmd.prompt,
159
+ ].join('\n');
160
+ fs.writeFileSync(filePath, content, 'utf-8');
161
+ }
162
+ }
163
+ uninstallCommands() {
164
+ if (fs.existsSync(this.installDir)) {
165
+ fs.rmSync(this.installDir, { recursive: true, force: true });
166
+ }
167
+ }
168
+ }
169
+ // ─── CodeBuddy 适配器 ──────────────────────────────────────
170
+ export class CodeBuddyAdapter extends MarkdownFileAdapter {
171
+ tool = 'codebuddy';
172
+ constructor(projectRoot) {
173
+ super(projectRoot);
174
+ this.installDir = path.join(projectRoot, '.codebuddy', 'rules');
175
+ }
176
+ }
177
+ // ─── Copilot 适配器 ──────────────────────────────────────────
178
+ export class CopilotAdapter {
179
+ tool = 'copilot';
180
+ installDir;
181
+ invocationStyle = 'flat'; // /specpow-explore
182
+ constructor(projectRoot) {
183
+ this.installDir = path.join(projectRoot, '.github');
184
+ }
185
+ installCommands(commands) {
186
+ fs.mkdirSync(this.installDir, { recursive: true });
187
+ const filePath = path.join(this.installDir, 'copilot-instructions.md');
188
+ const sections = commands.map(cmd => [
189
+ `## ${cmd.name}`,
190
+ '',
191
+ cmd.description,
192
+ '',
193
+ cmd.prompt,
194
+ '',
195
+ ].join('\n'));
196
+ const content = ['# SpecPow Commands', '', ...sections].join('\n');
197
+ fs.writeFileSync(filePath, content, 'utf-8');
198
+ }
199
+ uninstallCommands() {
200
+ const filePath = path.join(this.installDir, 'copilot-instructions.md');
201
+ if (fs.existsSync(filePath)) {
202
+ fs.unlinkSync(filePath);
203
+ }
204
+ }
205
+ }
206
+ // ─── Codex 适配器 ──────────────────────────────────────────
207
+ export class CodexAdapter extends SingleFileAdapter {
208
+ tool = 'codex';
209
+ constructor(projectRoot) {
210
+ super(projectRoot);
211
+ this.installDir = path.join(projectRoot, '.codex');
212
+ }
213
+ }
214
+ // ─── Gemini 适配器 ──────────────────────────────────────────
215
+ export class GeminiAdapter extends SingleFileAdapter {
216
+ tool = 'gemini';
217
+ invocationStyle = 'namespaced'; // /specpow:explore
218
+ constructor(projectRoot) {
219
+ super(projectRoot);
220
+ this.installDir = path.join(projectRoot, '.gemini');
221
+ }
222
+ }
223
+ // ─── P1-9: 新增适配器 ─────────────────────────────────────
224
+ // ─── GitHub Copilot Workspace 适配器 ──────────────────────
225
+ export class CopilotWorkspaceAdapter extends MarkdownFileAdapter {
226
+ tool = 'copilot-workspace';
227
+ invocationStyle = 'flat'; // /specpow-explore
228
+ constructor(projectRoot) {
229
+ super(projectRoot);
230
+ this.installDir = path.join(projectRoot, '.github', 'copilot-workspace');
231
+ }
232
+ }
233
+ // ─── Roo Code 适配器 ──────────────────────────────────────
234
+ export class RooAdapter extends MarkdownFileAdapter {
235
+ tool = 'roo';
236
+ invocationStyle = 'flat';
237
+ constructor(projectRoot) {
238
+ super(projectRoot);
239
+ this.installDir = path.join(projectRoot, '.roo', 'rules');
240
+ }
241
+ }
242
+ // ─── Auggie 适配器 ────────────────────────────────────────
243
+ export class AuggieAdapter extends SingleFileAdapter {
244
+ tool = 'auggie';
245
+ invocationStyle = 'flat';
246
+ constructor(projectRoot) {
247
+ super(projectRoot);
248
+ this.installDir = path.join(projectRoot, '.auggie');
249
+ }
250
+ }
251
+ // ─── Bob 适配器 ───────────────────────────────────────────
252
+ export class BobAdapter extends MarkdownFileAdapter {
253
+ tool = 'bob';
254
+ invocationStyle = 'flat';
255
+ constructor(projectRoot) {
256
+ super(projectRoot);
257
+ this.installDir = path.join(projectRoot, '.bob', 'rules');
258
+ }
259
+ }
260
+ // ─── Crush 适配器 ─────────────────────────────────────────
261
+ export class CrushAdapter extends MarkdownFileAdapter {
262
+ tool = 'crush';
263
+ invocationStyle = 'flat';
264
+ constructor(projectRoot) {
265
+ super(projectRoot);
266
+ this.installDir = path.join(projectRoot, '.crush', 'rules');
267
+ }
268
+ }
269
+ // ─── Devin 适配器 ─────────────────────────────────────────
270
+ export class DevinAdapter extends SingleFileAdapter {
271
+ tool = 'devin';
272
+ invocationStyle = 'flat';
273
+ constructor(projectRoot) {
274
+ super(projectRoot);
275
+ this.installDir = path.join(projectRoot, '.devin');
276
+ }
277
+ }
278
+ // ─── Junie 适配器 ─────────────────────────────────────────
279
+ export class JunieAdapter extends MarkdownFileAdapter {
280
+ tool = 'junie';
281
+ invocationStyle = 'flat';
282
+ constructor(projectRoot) {
283
+ super(projectRoot);
284
+ this.installDir = path.join(projectRoot, '.junie', 'rules');
285
+ }
286
+ }
287
+ // ─── Qoder 适配器 ─────────────────────────────────────────
288
+ export class QoderAdapter extends SingleFileAdapter {
289
+ tool = 'qoder';
290
+ invocationStyle = 'flat';
291
+ constructor(projectRoot) {
292
+ super(projectRoot);
293
+ this.installDir = path.join(projectRoot, '.qoder');
294
+ }
295
+ }
296
+ // ─── Amazon Q 适配器 ──────────────────────────────────────
297
+ export class AmazonQAdapter extends MarkdownFileAdapter {
298
+ tool = 'amazonq';
299
+ invocationStyle = 'prefix'; // @specpow-propose
300
+ constructor(projectRoot) {
301
+ super(projectRoot);
302
+ this.installDir = path.join(projectRoot, '.amazonq', 'commands');
303
+ }
304
+ /** Amazon Q 使用 @prefix 调用风格 */
305
+ formatContent(cmd) {
306
+ return [
307
+ `# @specpow-${cmd.name}`,
308
+ '',
309
+ `> ${cmd.description}`,
310
+ '',
311
+ cmd.prompt,
312
+ ].join('\n');
313
+ }
314
+ }
315
+ // ─── Cline 适配器 ──────────────────────────────────────────
316
+ export class ClineAdapter extends MarkdownFileAdapter {
317
+ tool = 'cline';
318
+ invocationStyle = 'flat'; // /specpow-explore
319
+ constructor(projectRoot) {
320
+ super(projectRoot);
321
+ this.installDir = path.join(projectRoot, '.cline', 'rules');
322
+ }
323
+ }
324
+ // ─── Continue 适配器 ──────────────────────────────────────
325
+ export class ContinueAdapter extends SingleFileAdapter {
326
+ tool = 'continue';
327
+ invocationStyle = 'flat';
328
+ constructor(projectRoot) {
329
+ super(projectRoot);
330
+ this.installDir = path.join(projectRoot, '.continue');
331
+ this.fileName = 'config.md';
332
+ }
333
+ }
334
+ // ─── Windsurf 适配器 ──────────────────────────────────────
335
+ export class WindsurfAdapter extends MarkdownFileAdapter {
336
+ tool = 'windsurf';
337
+ invocationStyle = 'flat';
338
+ constructor(projectRoot) {
339
+ super(projectRoot);
340
+ this.installDir = path.join(projectRoot, '.windsurf', 'rules');
341
+ }
342
+ }
343
+ // ─── Trae 适配器 ──────────────────────────────────────────
344
+ export class TraeAdapter extends MarkdownFileAdapter {
345
+ tool = 'trae';
346
+ invocationStyle = 'flat';
347
+ constructor(projectRoot) {
348
+ super(projectRoot);
349
+ this.installDir = path.join(projectRoot, '.trae', 'rules');
350
+ }
351
+ }
352
+ // ─── Kiro 适配器 ──────────────────────────────────────────
353
+ export class KiroAdapter extends MarkdownFileAdapter {
354
+ tool = 'kiro';
355
+ invocationStyle = 'flat';
356
+ constructor(projectRoot) {
357
+ super(projectRoot);
358
+ this.installDir = path.join(projectRoot, '.kiro', 'steering');
359
+ }
360
+ /** Kiro steering 文件使用特定格式 */
361
+ formatContent(cmd) {
362
+ return [
363
+ `# ${cmd.name}`,
364
+ '',
365
+ `## Description`,
366
+ cmd.description,
367
+ '',
368
+ `## Instructions`,
369
+ '',
370
+ cmd.prompt,
371
+ ].join('\n');
372
+ }
373
+ }
374
+ // ─── Qwen 适配器 ──────────────────────────────────────────
375
+ export class QwenAdapter extends SingleFileAdapter {
376
+ tool = 'qwen';
377
+ invocationStyle = 'flat';
378
+ constructor(projectRoot) {
379
+ super(projectRoot);
380
+ this.installDir = path.join(projectRoot, '.qwen');
381
+ }
382
+ }
383
+ // ─── Kimi 适配器 ──────────────────────────────────────────
384
+ export class KimiAdapter extends SingleFileAdapter {
385
+ tool = 'kimi';
386
+ invocationStyle = 'flat';
387
+ constructor(projectRoot) {
388
+ super(projectRoot);
389
+ this.installDir = path.join(projectRoot, '.kimi');
390
+ }
391
+ }
392
+ // ─── 注册所有内置适配器 ─────────────────────────────────────
393
+ AdapterRegistry.register('claude', ClaudeAdapter);
394
+ AdapterRegistry.register('cursor', CursorAdapter);
395
+ AdapterRegistry.register('copilot', CopilotAdapter);
396
+ AdapterRegistry.register('codebuddy', CodeBuddyAdapter);
397
+ AdapterRegistry.register('codex', CodexAdapter);
398
+ AdapterRegistry.register('gemini', GeminiAdapter);
399
+ AdapterRegistry.register('amazonq', AmazonQAdapter);
400
+ AdapterRegistry.register('cline', ClineAdapter);
401
+ AdapterRegistry.register('continue', ContinueAdapter);
402
+ AdapterRegistry.register('windsurf', WindsurfAdapter);
403
+ AdapterRegistry.register('trae', TraeAdapter);
404
+ AdapterRegistry.register('kiro', KiroAdapter);
405
+ AdapterRegistry.register('qwen', QwenAdapter);
406
+ AdapterRegistry.register('kimi', KimiAdapter);
407
+ AdapterRegistry.register('copilot-workspace', CopilotWorkspaceAdapter);
408
+ AdapterRegistry.register('roo', RooAdapter);
409
+ AdapterRegistry.register('auggie', AuggieAdapter);
410
+ AdapterRegistry.register('bob', BobAdapter);
411
+ AdapterRegistry.register('crush', CrushAdapter);
412
+ AdapterRegistry.register('devin', DevinAdapter);
413
+ AdapterRegistry.register('junie', JunieAdapter);
414
+ AdapterRegistry.register('qoder', QoderAdapter);
415
+ // ─── 工厂函数(向后兼容) ──────────────────────────────────
416
+ /**
417
+ * 根据 AI 工具类型创建对应的适配器
418
+ * P1-9: 委托给 AdapterRegistry,保持向后兼容
419
+ */
420
+ export function createAdapter(tool, projectRoot) {
421
+ return AdapterRegistry.get(tool, projectRoot);
422
+ }
423
+ /**
424
+ * 从技能目录加载命令定义
425
+ */
426
+ export function loadCommandsFromSkills(skillsDir) {
427
+ const commands = [];
428
+ const VALID_CATEGORIES = ['planning', 'execution', 'quality', 'business'];
429
+ if (!fs.existsSync(skillsDir))
430
+ return commands;
431
+ const categories = fs.readdirSync(skillsDir, { withFileTypes: true });
432
+ for (const category of categories) {
433
+ if (!category.isDirectory())
434
+ continue;
435
+ // P3-10: 验证目录名是否为合法的 CommandDefinition category
436
+ const catName = category.name;
437
+ if (!VALID_CATEGORIES.includes(catName)) {
438
+ // 跳过不属于已知分类的目录,避免类型不安全
439
+ continue;
440
+ }
441
+ const catDir = path.join(skillsDir, category.name);
442
+ const skills = fs.readdirSync(catDir, { withFileTypes: true });
443
+ for (const skill of skills) {
444
+ if (!skill.isDirectory())
445
+ continue;
446
+ const skillMd = path.join(catDir, skill.name, 'SKILL.md');
447
+ if (!fs.existsSync(skillMd))
448
+ continue;
449
+ const content = fs.readFileSync(skillMd, 'utf-8');
450
+ const titleMatch = content.match(/^#\s+(.+)/m);
451
+ const descMatch = content.match(/^>\s*(.+)/m);
452
+ commands.push({
453
+ name: skill.name,
454
+ description: descMatch ? descMatch[1] : titleMatch ? titleMatch[1] : skill.name,
455
+ prompt: content,
456
+ category: catName,
457
+ });
458
+ }
459
+ }
460
+ return commands;
461
+ }
462
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/command-generation/index.ts"],"names":[],"mappings":"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"}