@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,367 @@
1
+ /**
2
+ * 解析器模块 — 工件内容解析
3
+ *
4
+ * 职责:
5
+ * 1. 解析 tasks.md 提取任务列表(支持 YAML frontmatter + Markdown checkbox)
6
+ * 2. 解析 spec.md 提取 Delta 需求
7
+ * 3. 解析 proposal.md 提取元数据
8
+ * 4. 解析 design.md 提取架构决策
9
+ */
10
+ import { parse as parseYaml } from 'yaml';
11
+ /**
12
+ * 从 tasks.md 内容解析任务列表(统一入口)
13
+ *
14
+ * 解析策略:
15
+ * 1. 优先检测 YAML frontmatter(--- 分隔的结构化数据块)
16
+ * 2. 回退到 Markdown checkbox 逐行解析
17
+ *
18
+ * YAML frontmatter 格式示例:
19
+ * ```yaml
20
+ * ---
21
+ * tasks:
22
+ * - number: 1
23
+ * title: 创建用户模型
24
+ * files:
25
+ * - src/models/user.ts
26
+ * description: 实现用户数据模型
27
+ * verification: 单元测试通过
28
+ * dependsOn: []
29
+ * estimatedEffort: S
30
+ * ---
31
+ * ```
32
+ */
33
+ export function parseTasksFromContent(content) {
34
+ const frontmatter = extractFrontmatter(content);
35
+ if (frontmatter) {
36
+ const tasks = parseFrontmatterTasks(frontmatter);
37
+ if (tasks.length > 0)
38
+ return tasks;
39
+ }
40
+ return parseMarkdownTasks(content);
41
+ }
42
+ /**
43
+ * 将 ParsedTask[] 转换为 SDD 控制器所需的 PlanTask 格式
44
+ */
45
+ export function toPlanTasks(tasks) {
46
+ return tasks
47
+ .filter(t => !t.completed)
48
+ .map((t, i) => ({
49
+ number: extractTaskNumber(t.id, i + 1),
50
+ title: t.title,
51
+ description: t.description,
52
+ files: t.files,
53
+ }));
54
+ }
55
+ /**
56
+ * 从任务 ID 中提取数字编号
57
+ * 例如: "Task-001" → 1, "Task-5" → 5, 无法解析时返回 fallback
58
+ */
59
+ function extractTaskNumber(id, fallback) {
60
+ const match = id.match(/(\d+)/);
61
+ return match ? parseInt(match[1]) : fallback;
62
+ }
63
+ // ─── YAML Frontmatter 解析 ─────────────────────────────────
64
+ /**
65
+ * 提取 YAML frontmatter(--- 分隔符之间的内容)
66
+ */
67
+ function extractFrontmatter(content) {
68
+ const trimmed = content.trimStart();
69
+ if (!trimmed.startsWith('---'))
70
+ return null;
71
+ const endIndex = trimmed.indexOf('---', 3);
72
+ if (endIndex === -1)
73
+ return null;
74
+ return trimmed.substring(3, endIndex).trim();
75
+ }
76
+ /**
77
+ * 从 YAML frontmatter 解析任务列表
78
+ */
79
+ function parseFrontmatterTasks(yamlContent) {
80
+ try {
81
+ const data = parseYaml(yamlContent);
82
+ if (!data || !Array.isArray(data.tasks))
83
+ return [];
84
+ return data.tasks.map((task, index) => ({
85
+ id: task.id || task.number ? `Task-${String(task.number ?? index + 1).padStart(3, '0')}` : `Task-${String(index + 1).padStart(3, '0')}`,
86
+ title: task.title || '',
87
+ description: task.description || '',
88
+ files: Array.isArray(task.files) ? task.files : [],
89
+ dependsOn: Array.isArray(task.dependsOn) ? task.dependsOn : [],
90
+ verification: task.verification || '',
91
+ estimatedEffort: (['S', 'M', 'L'].includes(task.estimatedEffort) ? task.estimatedEffort : 'M'),
92
+ completed: task.completed === true,
93
+ }));
94
+ }
95
+ catch {
96
+ return [];
97
+ }
98
+ }
99
+ // ─── Markdown Checkbox 解析 ────────────────────────────────
100
+ /**
101
+ * 从 Markdown checkbox 格式解析任务列表
102
+ *
103
+ * 支持多种任务标题格式:
104
+ * - `- [ ] **Task 1**: 标题` (apply 命令格式)
105
+ * - `- [ ] Task-001: 标题` (核心解析器格式)
106
+ * - `- [ ] 标题` (简单格式)
107
+ */
108
+ function parseMarkdownTasks(content) {
109
+ const tasks = [];
110
+ const lines = content.split('\n');
111
+ let currentTask = null;
112
+ let inCodeBlock = false;
113
+ for (let i = 0; i < lines.length; i++) {
114
+ const line = lines[i];
115
+ // 跳过代码块
116
+ if (line.trim().startsWith('```')) {
117
+ inCodeBlock = !inCodeBlock;
118
+ continue;
119
+ }
120
+ if (inCodeBlock)
121
+ continue;
122
+ // 匹配任务行: - [ ] 或 - [x]
123
+ const taskMatch = line.match(/^-\s+\[([ x])\]\s+(.+)$/i);
124
+ if (taskMatch) {
125
+ // 保存上一个任务
126
+ if (currentTask && currentTask.id) {
127
+ tasks.push(finalizeTask(currentTask));
128
+ }
129
+ const completed = taskMatch[1].toLowerCase() === 'x';
130
+ const rawTitle = taskMatch[2].trim();
131
+ // 尝试多种 ID 提取模式
132
+ let id = `Task-${String(tasks.length + 1).padStart(3, '0')}`;
133
+ let title = rawTitle;
134
+ // 模式 1: **Task N**: title (apply 命令格式)
135
+ const boldMatch = rawTitle.match(/^\*\*Task\s+(\d+)\*\*\s*[::]\s*(.*)/);
136
+ if (boldMatch) {
137
+ id = `Task-${String(parseInt(boldMatch[1])).padStart(3, '0')}`;
138
+ title = boldMatch[2].trim() || rawTitle;
139
+ }
140
+ else {
141
+ // 模式 2: Task-NNN: title (核心解析器格式)
142
+ const idMatch = rawTitle.match(/^(Task-\d+)[\s::]*(.*)/);
143
+ if (idMatch) {
144
+ id = idMatch[1];
145
+ title = idMatch[2] || rawTitle;
146
+ }
147
+ }
148
+ currentTask = {
149
+ id,
150
+ title,
151
+ description: title,
152
+ files: [],
153
+ dependsOn: [],
154
+ verification: '',
155
+ estimatedEffort: 'M',
156
+ completed,
157
+ };
158
+ continue;
159
+ }
160
+ // 解析任务属性
161
+ if (currentTask) {
162
+ // 文件路径提取
163
+ const fileMatch = line.match(/(?:文件|files?|路径|path)\s*[::]\s*`?([^\n,,]+(?:[,,]\s*`?[^\n]+)*)/i);
164
+ if (fileMatch) {
165
+ const files = fileMatch[1]
166
+ .split(/[,,]/)
167
+ .map(f => f.trim().replace(/`/g, ''))
168
+ .filter(f => f.length > 0);
169
+ currentTask.files = [...(currentTask.files || []), ...files];
170
+ continue;
171
+ }
172
+ // 依赖关系
173
+ const depMatch = line.match(/(?:依赖|depends?)[\s::]*(.+)/i);
174
+ if (depMatch) {
175
+ const deps = depMatch[1].split(/[,,]/).map(d => d.trim());
176
+ currentTask.dependsOn = deps;
177
+ continue;
178
+ }
179
+ // 验证步骤
180
+ const verifyMatch = line.match(/(?:验证|verify|verification)\s*[::]\s*(.+)/i);
181
+ if (verifyMatch) {
182
+ currentTask.verification = verifyMatch[1].trim();
183
+ continue;
184
+ }
185
+ // 工作量评估
186
+ const effortMatch = line.match(/(?:工作量|effort|size)\s*[::]\s*([SML])/i);
187
+ if (effortMatch) {
188
+ currentTask.estimatedEffort = effortMatch[1].toUpperCase();
189
+ continue;
190
+ }
191
+ // 累积描述(跳过空行和标题行)
192
+ if (line.trim() && !line.startsWith('#')) {
193
+ currentTask.description += (currentTask.description ? '\n' : '') + line.trim();
194
+ }
195
+ }
196
+ }
197
+ // 保存最后一个任务
198
+ if (currentTask && currentTask.id) {
199
+ tasks.push(finalizeTask(currentTask));
200
+ }
201
+ return tasks;
202
+ }
203
+ function finalizeTask(partial) {
204
+ return {
205
+ id: partial.id || 'unknown',
206
+ title: partial.title || '',
207
+ description: partial.description || '',
208
+ files: partial.files || [],
209
+ dependsOn: partial.dependsOn || [],
210
+ verification: partial.verification || '',
211
+ estimatedEffort: partial.estimatedEffort || 'M',
212
+ completed: partial.completed || false,
213
+ };
214
+ }
215
+ /**
216
+ * 解析 tasks.md 文件,提取结构化任务列表
217
+ * @deprecated 使用 parseTasksFromContent() 替代,支持 YAML frontmatter
218
+ */
219
+ export function parseTasksFile(content) {
220
+ return parseMarkdownTasks(content);
221
+ }
222
+ /**
223
+ * 解析 spec.md 文件,提取 Delta 需求
224
+ */
225
+ export function parseSpecFile(content) {
226
+ const requirements = [];
227
+ const lines = content.split('\n');
228
+ let currentType = null;
229
+ let currentReq = null;
230
+ let currentCriterion = null;
231
+ for (const line of lines) {
232
+ // 检测 Delta 类型标题
233
+ const typeMatch = line.match(/^###?\s+(ADDED|MODIFIED|REMOVED|RENAMED)\s+(.+)/i);
234
+ if (typeMatch) {
235
+ // 保存上一个需求
236
+ if (currentReq) {
237
+ if (currentCriterion) {
238
+ currentReq.acceptanceCriteria = currentReq.acceptanceCriteria || [];
239
+ currentReq.acceptanceCriteria.push(finalizeCriterion(currentCriterion));
240
+ }
241
+ requirements.push(finalizeRequirement(currentReq));
242
+ }
243
+ currentType = typeMatch[1].toUpperCase();
244
+ const title = typeMatch[2].trim();
245
+ const idMatch = title.match(/^([A-Z]+-\d+)[\s::]*(.*)/);
246
+ currentReq = {
247
+ type: currentType,
248
+ id: idMatch ? idMatch[1] : `REQ-${String(requirements.length + 1).padStart(3, '0')}`,
249
+ title: idMatch ? idMatch[2] || title : title,
250
+ description: '',
251
+ acceptanceCriteria: [],
252
+ };
253
+ currentCriterion = null;
254
+ continue;
255
+ }
256
+ if (!currentReq)
257
+ continue;
258
+ // 解析验收标准
259
+ const givenMatch = line.match(/(?:\*\*)?Given(?:\*\*)?\s+(.+)/i);
260
+ if (givenMatch) {
261
+ if (currentCriterion) {
262
+ currentReq.acceptanceCriteria = currentReq.acceptanceCriteria || [];
263
+ currentReq.acceptanceCriteria.push(finalizeCriterion(currentCriterion));
264
+ }
265
+ currentCriterion = { given: givenMatch[1].trim() };
266
+ continue;
267
+ }
268
+ const whenMatch = line.match(/(?:\*\*)?When(?:\*\*)?\s+(.+)/i);
269
+ if (whenMatch) {
270
+ if (currentCriterion)
271
+ currentCriterion.when = whenMatch[1].trim();
272
+ continue;
273
+ }
274
+ const thenMatch = line.match(/(?:\*\*)?Then(?:\*\*)?\s+(.+)/i);
275
+ if (thenMatch) {
276
+ if (currentCriterion)
277
+ currentCriterion.then = thenMatch[1].trim();
278
+ continue;
279
+ }
280
+ // 累积描述
281
+ if (line.trim() && !line.startsWith('#')) {
282
+ currentReq.description += (currentReq.description ? '\n' : '') + line.trim();
283
+ }
284
+ }
285
+ // 保存最后一个
286
+ if (currentReq) {
287
+ if (currentCriterion) {
288
+ currentReq.acceptanceCriteria = currentReq.acceptanceCriteria || [];
289
+ currentReq.acceptanceCriteria.push(finalizeCriterion(currentCriterion));
290
+ }
291
+ requirements.push(finalizeRequirement(currentReq));
292
+ }
293
+ return requirements;
294
+ }
295
+ function finalizeCriterion(partial) {
296
+ return {
297
+ given: partial.given || '',
298
+ when: partial.when || '',
299
+ then: partial.then || '',
300
+ };
301
+ }
302
+ function finalizeRequirement(partial) {
303
+ return {
304
+ type: partial.type || 'ADDED',
305
+ id: partial.id || 'unknown',
306
+ title: partial.title || '',
307
+ description: partial.description || '',
308
+ acceptanceCriteria: partial.acceptanceCriteria || [],
309
+ };
310
+ }
311
+ /**
312
+ * 解析 proposal.md 文件
313
+ */
314
+ export function parseProposal(content) {
315
+ const proposal = {
316
+ title: '',
317
+ motivation: '',
318
+ goals: [],
319
+ successCriteria: [],
320
+ scope: { in: [], out: [] },
321
+ risks: [],
322
+ };
323
+ const lines = content.split('\n');
324
+ let currentSection = '';
325
+ for (const line of lines) {
326
+ // 标题
327
+ if (line.startsWith('# ')) {
328
+ proposal.title = line.replace(/^#\s+/, '').trim();
329
+ continue;
330
+ }
331
+ // 检测段落
332
+ if (line.startsWith('## ')) {
333
+ currentSection = line.replace(/^##\s+/, '').trim().toLowerCase();
334
+ continue;
335
+ }
336
+ // 列表项
337
+ if (line.match(/^-\s+/)) {
338
+ const item = line.replace(/^-\s+/, '').trim();
339
+ switch (currentSection) {
340
+ case '目标':
341
+ case 'goals':
342
+ proposal.goals.push(item);
343
+ break;
344
+ case '成功标准':
345
+ case 'success criteria':
346
+ proposal.successCriteria.push(item);
347
+ break;
348
+ case '影响范围':
349
+ case 'scope':
350
+ if (/^(包含|in[\s::])/i.test(item)) {
351
+ proposal.scope.in.push(item.replace(/^(包含|in)\s*[::]?\s*/i, ''));
352
+ }
353
+ else if (/^(不包含|out[\s::])/i.test(item)) {
354
+ proposal.scope.out.push(item.replace(/^(不包含|out)\s*[::]?\s*/i, ''));
355
+ }
356
+ break;
357
+ }
358
+ continue;
359
+ }
360
+ // 累积动机
361
+ if (currentSection === '动机' || currentSection === 'motivation') {
362
+ proposal.motivation += (proposal.motivation ? '\n' : '') + line.trim();
363
+ }
364
+ }
365
+ return proposal;
366
+ }
367
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/parsers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * AI 调用抽象层
3
+ *
4
+ * 统一的子代理分发接口,遵循 Superpowers 的核心原则:
5
+ * 1. 每个子代理使用全新上下文(不继承主会话历史)
6
+ * 2. 产物通过文件传递(不占用上下文窗口)
7
+ * 3. 支持多种 AI 后端:Claude Code、Cursor、自定义 CLI
8
+ *
9
+ * 子代理通信协议:
10
+ * Controller → writes brief file → AI reads brief → AI writes report → Controller reads report
11
+ *
12
+ * 模型选择策略(5级层次):
13
+ * cheap → standard → capable
14
+ * 修复轮次 4-5 自动升级到更强模型
15
+ */
16
+ import type { TaskBrief, TaskReport, ReviewResult, Finding } from './types.js';
17
+ /**
18
+ * AI 后端适配器接口
19
+ * 不同 AI 工具实现此接口来适配具体的调用方式
20
+ */
21
+ export interface AIBackend {
22
+ /** 后端名称 */
23
+ readonly name: string;
24
+ /** 调用 AI 执行任务,将输出写入 outputPath */
25
+ execute(promptFile: string, model?: string, outputPath?: string, cwd?: string): Promise<string>;
26
+ /** 检查后端是否可用 */
27
+ isAvailable(): boolean;
28
+ }
29
+ /**
30
+ * 子代理分发选项
31
+ */
32
+ export interface DispatchOptions {
33
+ /** 任务简报 */
34
+ brief: TaskBrief;
35
+ /** 任务限定 */
36
+ taskConstraint: string;
37
+ /** 使用的模型(可选,不指定则自动选择) */
38
+ model?: string;
39
+ /** 超时时间(毫秒) */
40
+ timeout?: number;
41
+ }
42
+ export declare class AICaller {
43
+ private backends;
44
+ private workspaceDir;
45
+ constructor(workspaceDir: string, preferredBackend?: string, options?: {
46
+ timeout?: number;
47
+ });
48
+ /**
49
+ * 获取可用后端
50
+ */
51
+ private getAvailableBackend;
52
+ /**
53
+ * 写入分发 prompt 到文件
54
+ */
55
+ private writePromptFile;
56
+ /**
57
+ * 构建实现者 prompt
58
+ *
59
+ * 遵循 Superpowers 的子代理分发设计:
60
+ * - 只告诉代理去哪里读简报(不粘贴任务描述)
61
+ * - 传递全局约束和接口约定
62
+ * - 要求将报告写入指定文件
63
+ */
64
+ buildImplementerPrompt(brief: TaskBrief, projectContext: string, specConstraints: string): string;
65
+ /**
66
+ * 构建审查者 prompt
67
+ *
68
+ * 两阶段审查门(来自 Superpowers):
69
+ * 1. 规格合规:实现是否覆盖所有需求
70
+ * 2. 代码质量:实现质量评估
71
+ */
72
+ buildReviewerPrompt(brief: TaskBrief, reviewPackagePath: string): string;
73
+ /**
74
+ * 构建重新审查 prompt
75
+ *
76
+ * 范围限定的重新审查——只审查修复 diff
77
+ */
78
+ buildReReviewerPrompt(brief: TaskBrief, reviewPackagePath: string, openFindings: Finding[]): string;
79
+ /**
80
+ * 分发实现者子代理
81
+ *
82
+ * 1. 写入实现者 prompt 到文件
83
+ * 2. 调用 AI 后端执行
84
+ * 3. 读取报告文件
85
+ * 4. 解析返回 TaskReport
86
+ */
87
+ dispatchImplementer(brief: TaskBrief, projectContext: string, specConstraints: string, model?: string): Promise<TaskReport>;
88
+ /**
89
+ * 分发审查者子代理
90
+ */
91
+ dispatchReviewer(brief: TaskBrief, _projectContext: string, _specConstraints: string, baseCommit?: string, headCommit?: string): Promise<ReviewResult>;
92
+ /**
93
+ * 分发重新审查者子代理(范围限定)
94
+ */
95
+ dispatchReReviewer(brief: TaskBrief, openFindings: Finding[], baseCommit?: string, headCommit?: string): Promise<ReviewResult>;
96
+ /**
97
+ * 格式化简报文件内容
98
+ */
99
+ private formatBriefFile;
100
+ /**
101
+ * 解析任务报告
102
+ */
103
+ private parseTaskReport;
104
+ /**
105
+ * 解析审查结果
106
+ */
107
+ private parseReviewResult;
108
+ /**
109
+ * 状态映射
110
+ */
111
+ private mapStatus;
112
+ /**
113
+ * 从文本中提取 commit SHA
114
+ * 使用 word boundary 避免误匹配非 SHA 的十六进制字符串
115
+ */
116
+ private extractCommits;
117
+ }
118
+ //# sourceMappingURL=ai-caller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-caller.d.ts","sourceRoot":"","sources":["../../../src/core/sdd-engine/ai-caller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAM/E;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChG,eAAe;IACf,WAAW,IAAI,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsKD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAkB3F;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAavB;;;;;;;OAOG;IACH,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM;IAsDjG;;;;;;OAMG;IACH,mBAAmB,CACjB,KAAK,EAAE,SAAS,EAChB,iBAAiB,EAAE,MAAM,GACxB,MAAM;IAsDT;;;;OAIG;IACH,qBAAqB,CACnB,KAAK,EAAE,SAAS,EAChB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,OAAO,EAAE,GACtB,MAAM;IAkBT;;;;;;;OAOG;IACG,mBAAmB,CACvB,KAAK,EAAE,SAAS,EAChB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC;IAqCtB;;OAEG;IACG,gBAAgB,CACpB,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,EACxB,UAAU,GAAE,MAAiB,EAC7B,UAAU,GAAE,MAAe,GAC1B,OAAO,CAAC,YAAY,CAAC;IA+BxB;;OAEG;IACG,kBAAkB,CACtB,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,OAAO,EAAE,EACvB,UAAU,GAAE,MAAiB,EAC7B,UAAU,GAAE,MAAe,GAC1B,OAAO,CAAC,YAAY,CAAC;IA0BxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmEvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2DzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAUjB;;;OAGG;IACH,OAAO,CAAC,cAAc;CAMvB"}