@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,153 @@
1
+ /**
2
+ * 验证模块 — 工件完整性校验
3
+ *
4
+ * 职责:
5
+ * 1. 验证 Schema YAML 格式正确性
6
+ * 2. 验证工件依赖关系无环
7
+ * 3. 验证模板文件存在且格式合法
8
+ * 4. 验证输出路径可写
9
+ */
10
+ import * as fs from 'fs';
11
+ import * as path from 'path';
12
+ import { parse as parseYaml } from 'yaml';
13
+ import { SchemaYamlSchema } from '../artifact-graph/types.js';
14
+ /**
15
+ * 验证 Schema YAML
16
+ */
17
+ export function validateSchema(schemaPath) {
18
+ const result = { valid: true, errors: [], warnings: [] };
19
+ if (!fs.existsSync(schemaPath)) {
20
+ result.valid = false;
21
+ result.errors.push({
22
+ code: 'SCHEMA_NOT_FOUND',
23
+ message: `Schema 文件不存在: ${schemaPath}`,
24
+ });
25
+ return result;
26
+ }
27
+ try {
28
+ const content = fs.readFileSync(schemaPath, 'utf-8');
29
+ const parsed = parseYaml(content);
30
+ // Zod 验证
31
+ const parseResult = SchemaYamlSchema.safeParse(parsed);
32
+ if (!parseResult.success) {
33
+ result.valid = false;
34
+ for (const issue of parseResult.error.issues) {
35
+ result.errors.push({
36
+ code: 'SCHEMA_VALIDATION',
37
+ message: `${issue.path.join('.')}: ${issue.message}`,
38
+ file: schemaPath,
39
+ });
40
+ }
41
+ return result;
42
+ }
43
+ const schema = parseResult.data;
44
+ // 检查工件依赖无环
45
+ const cycleResult = checkDependencyCycles(schema);
46
+ if (cycleResult.hasCycle) {
47
+ result.valid = false;
48
+ result.errors.push({
49
+ code: 'DEPENDENCY_CYCLE',
50
+ message: `工件依赖存在环: ${cycleResult.cycle.join(' → ')}`,
51
+ file: schemaPath,
52
+ });
53
+ }
54
+ // 检查模板文件存在性
55
+ const schemaDir = path.dirname(schemaPath);
56
+ for (const artifact of schema.artifacts) {
57
+ if (artifact.template) {
58
+ const templatePath = path.join(schemaDir, artifact.template);
59
+ if (!fs.existsSync(templatePath)) {
60
+ result.warnings.push({
61
+ code: 'TEMPLATE_MISSING',
62
+ message: `模板文件不存在: ${artifact.template} (工件: ${artifact.id})`,
63
+ file: templatePath,
64
+ });
65
+ }
66
+ }
67
+ }
68
+ }
69
+ catch (err) {
70
+ result.valid = false;
71
+ result.errors.push({
72
+ code: 'SCHEMA_PARSE_ERROR',
73
+ message: `Schema 解析失败: ${err.message}`,
74
+ file: schemaPath,
75
+ });
76
+ }
77
+ return result;
78
+ }
79
+ /**
80
+ * 检查工件依赖是否有环
81
+ */
82
+ function checkDependencyCycles(schema) {
83
+ const graph = new Map();
84
+ for (const artifact of schema.artifacts) {
85
+ graph.set(artifact.id, artifact.requires || []);
86
+ }
87
+ const visited = new Set();
88
+ const inStack = new Set();
89
+ function dfs(node, pathSoFar) {
90
+ if (inStack.has(node)) {
91
+ const cycleStart = pathSoFar.indexOf(node);
92
+ return { hasCycle: true, cycle: [...pathSoFar.slice(cycleStart), node] };
93
+ }
94
+ if (visited.has(node))
95
+ return { hasCycle: false, cycle: [] };
96
+ visited.add(node);
97
+ inStack.add(node);
98
+ const deps = graph.get(node) || [];
99
+ for (const dep of deps) {
100
+ const result = dfs(dep, [...pathSoFar, node]);
101
+ if (result.hasCycle)
102
+ return result;
103
+ }
104
+ inStack.delete(node);
105
+ return { hasCycle: false, cycle: [] };
106
+ }
107
+ for (const nodeId of graph.keys()) {
108
+ const result = dfs(nodeId, []);
109
+ if (result.hasCycle)
110
+ return result;
111
+ }
112
+ return { hasCycle: false, cycle: [] };
113
+ }
114
+ /**
115
+ * 验证变更目录结构
116
+ */
117
+ export function validateChangeDir(changeDir) {
118
+ const result = { valid: true, errors: [], warnings: [] };
119
+ if (!fs.existsSync(changeDir)) {
120
+ result.valid = false;
121
+ result.errors.push({
122
+ code: 'CHANGE_DIR_NOT_FOUND',
123
+ message: `变更目录不存在: ${changeDir}`,
124
+ });
125
+ return result;
126
+ }
127
+ // 检查必要文件
128
+ const requiredFiles = ['proposal.md'];
129
+ const optionalFiles = ['specs/spec.md', 'design.md', 'tasks.md'];
130
+ for (const file of requiredFiles) {
131
+ const filePath = path.join(changeDir, file);
132
+ if (!fs.existsSync(filePath)) {
133
+ result.valid = false;
134
+ result.errors.push({
135
+ code: 'REQUIRED_FILE_MISSING',
136
+ message: `缺少必要文件: ${file}`,
137
+ file: filePath,
138
+ });
139
+ }
140
+ }
141
+ for (const file of optionalFiles) {
142
+ const filePath = path.join(changeDir, file);
143
+ if (!fs.existsSync(filePath)) {
144
+ result.warnings.push({
145
+ code: 'OPTIONAL_FILE_MISSING',
146
+ message: `缺少可选文件: ${file}`,
147
+ file: filePath,
148
+ });
149
+ }
150
+ }
151
+ return result;
152
+ }
153
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAqB9D;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAE3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,iBAAiB,UAAU,EAAE;SACvC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAElC,SAAS;QACT,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YACrB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE;oBACpD,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAwC,CAAC;QAEpE,WAAW;QACX,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,YAAY,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACpD,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;QACL,CAAC;QAED,YAAY;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACnB,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,YAAY,QAAQ,CAAC,QAAQ,SAAS,QAAQ,CAAC,EAAE,GAAG;wBAC7D,IAAI,EAAE,YAAY;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,gBAAgB,GAAG,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAwC;IAIrE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,SAAS,GAAG,CAAC,IAAY,EAAE,SAAmB;QAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAE7D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAElB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,MAAM,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAE3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,YAAY,SAAS,EAAE;SACjC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS;IACT,MAAM,aAAa,GAAG,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,CAAC,eAAe,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAEjE,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,WAAW,IAAI,EAAE;gBAC1B,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,WAAW,IAAI,EAAE;gBAC1B,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * 工作流状态标签
3
+ *
4
+ * P2-14: 借鉴 Trellis 的 [workflow-state:xxx] 标签
5
+ *
6
+ * 功能:
7
+ * - 解析工作流状态标签
8
+ * - 生成状态标签
9
+ * - 状态标签格式化
10
+ */
11
+ export type WorkflowStage = 'explore' | 'propose' | 'apply' | 'verify' | 'archive' | 'idle';
12
+ export interface WorkflowState {
13
+ /** 当前阶段 */
14
+ stage: WorkflowStage;
15
+ /** 变更名称(如果有) */
16
+ changeName?: string;
17
+ /** 任务进度(如果有) */
18
+ taskProgress?: {
19
+ current: number;
20
+ total: number;
21
+ };
22
+ /** 阻塞原因(如果有) */
23
+ blocked?: string;
24
+ /** 最后更新时间 */
25
+ updatedAt: number;
26
+ }
27
+ /**
28
+ * 解析工作流状态标签
29
+ *
30
+ * 格式: [workflow-state:stage] 或 [workflow-state:stage:details]
31
+ *
32
+ * 示例:
33
+ * - [workflow-state:explore]
34
+ * - [workflow-state:apply:task-3-of-5]
35
+ * - [workflow-state:verify:blocked]
36
+ */
37
+ export declare function parseWorkflowStateTag(text: string): WorkflowState | null;
38
+ /**
39
+ * 生成工作流状态标签
40
+ */
41
+ export declare function generateWorkflowStateTag(state: WorkflowState): string;
42
+ /**
43
+ * 从阶段生成简单的状态标签
44
+ */
45
+ export declare function stageToTag(stage: WorkflowStage): string;
46
+ /**
47
+ * 从文本中提取所有工作流状态标签
48
+ */
49
+ export declare function extractWorkflowStateTags(text: string): WorkflowState[];
50
+ /**
51
+ * 检查文本是否包含工作流状态标签
52
+ */
53
+ export declare function hasWorkflowStateTag(text: string): boolean;
54
+ /**
55
+ * 移除文本中的工作流状态标签
56
+ */
57
+ export declare function removeWorkflowStateTags(text: string): string;
58
+ /**
59
+ * 获取阶段的图标
60
+ */
61
+ export declare function getStageIcon(stage: WorkflowStage): string;
62
+ /**
63
+ * 获取阶段的描述
64
+ */
65
+ export declare function getStageDescription(stage: WorkflowStage): string;
66
+ /**
67
+ * 生成带图标的阶段标签
68
+ */
69
+ export declare function formatStageLabel(stage: WorkflowStage): string;
70
+ /**
71
+ * 从文件路径推断工作流阶段
72
+ */
73
+ export declare function inferStageFromPath(filePath: string): WorkflowStage | null;
74
+ /**
75
+ * 从内容推断工作流阶段
76
+ */
77
+ export declare function inferStageFromContent(content: string): WorkflowStage | null;
78
+ /**
79
+ * 检测当前工作流阶段(共享函数)
80
+ *
81
+ * 基于 openspec/changes 目录结构推断当前阶段
82
+ */
83
+ export declare function detectCurrentStage(projectRoot: string): WorkflowStage;
84
+ /**
85
+ * 保存工作流状态到持久化文件
86
+ */
87
+ export declare function saveWorkflowState(projectRoot: string, state: WorkflowState): void;
88
+ /**
89
+ * 加载持久化的工作流状态
90
+ */
91
+ export declare function loadWorkflowState(projectRoot: string): WorkflowState | null;
92
+ /**
93
+ * 清除持久化的工作流状态
94
+ */
95
+ export declare function clearWorkflowState(projectRoot: string): void;
96
+ //# sourceMappingURL=workflow-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-state.d.ts","sourceRoot":"","sources":["../../src/core/workflow-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,SAAS,GACT,OAAO,GACP,QAAQ,GACR,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,KAAK,EAAE,aAAa,CAAC;IACrB,gBAAgB;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,YAAY,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA6CxE;AAeD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAwBrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAEvD;AAID;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAatE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAID;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAUzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAUhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAE7D;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgBzE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgB3E;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAgCrE;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAajF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAa3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAU5D"}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * 工作流状态标签
3
+ *
4
+ * P2-14: 借鉴 Trellis 的 [workflow-state:xxx] 标签
5
+ *
6
+ * 功能:
7
+ * - 解析工作流状态标签
8
+ * - 生成状态标签
9
+ * - 状态标签格式化
10
+ */
11
+ import { existsSync, readdirSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';
12
+ import { join } from 'path';
13
+ // ─── 状态标签解析 ───────────────────────────────────────────
14
+ /**
15
+ * 解析工作流状态标签
16
+ *
17
+ * 格式: [workflow-state:stage] 或 [workflow-state:stage:details]
18
+ *
19
+ * 示例:
20
+ * - [workflow-state:explore]
21
+ * - [workflow-state:apply:task-3-of-5]
22
+ * - [workflow-state:verify:blocked]
23
+ */
24
+ export function parseWorkflowStateTag(text) {
25
+ // 匹配 [workflow-state:stage] 或 [workflow-state:stage:details]
26
+ const match = text.match(/\[workflow-state:([a-z]+)(?::([^\]]+))?\]/i);
27
+ if (!match) {
28
+ return null;
29
+ }
30
+ const stageStr = match[1].toLowerCase();
31
+ const details = match[2];
32
+ const stage = parseStage(stageStr);
33
+ if (!stage) {
34
+ return null;
35
+ }
36
+ const state = {
37
+ stage,
38
+ updatedAt: Date.now(),
39
+ };
40
+ // 解析详情
41
+ if (details) {
42
+ // 解析任务进度: task-3-of-5
43
+ const taskMatch = details.match(/task-(\d+)-of-(\d+)/);
44
+ if (taskMatch) {
45
+ state.taskProgress = {
46
+ current: parseInt(taskMatch[1]),
47
+ total: parseInt(taskMatch[2]),
48
+ };
49
+ }
50
+ // 解析阻塞: blocked:reason
51
+ if (details.startsWith('blocked')) {
52
+ const reasonMatch = details.match(/blocked:(.+)/);
53
+ state.blocked = reasonMatch ? reasonMatch[1] : 'unknown';
54
+ }
55
+ // 解析变更名称: change:name
56
+ const changeMatch = details.match(/change:([^\s]+)/);
57
+ if (changeMatch) {
58
+ state.changeName = changeMatch[1];
59
+ }
60
+ }
61
+ return state;
62
+ }
63
+ /**
64
+ * 解析阶段字符串
65
+ */
66
+ function parseStage(stageStr) {
67
+ const validStages = ['explore', 'propose', 'apply', 'verify', 'archive', 'idle'];
68
+ if (validStages.includes(stageStr)) {
69
+ return stageStr;
70
+ }
71
+ return null;
72
+ }
73
+ // ─── 状态标签生成 ───────────────────────────────────────────
74
+ /**
75
+ * 生成工作流状态标签
76
+ */
77
+ export function generateWorkflowStateTag(state) {
78
+ let tag = `[workflow-state:${state.stage}`;
79
+ // 添加详情
80
+ const details = [];
81
+ if (state.changeName) {
82
+ details.push(`change:${state.changeName}`);
83
+ }
84
+ if (state.taskProgress) {
85
+ details.push(`task-${state.taskProgress.current}-of-${state.taskProgress.total}`);
86
+ }
87
+ if (state.blocked) {
88
+ details.push(`blocked:${state.blocked}`);
89
+ }
90
+ if (details.length > 0) {
91
+ tag += `:${details.join(',')}`;
92
+ }
93
+ tag += ']';
94
+ return tag;
95
+ }
96
+ /**
97
+ * 从阶段生成简单的状态标签
98
+ */
99
+ export function stageToTag(stage) {
100
+ return `[workflow-state:${stage}]`;
101
+ }
102
+ // ─── 状态标签提取 ───────────────────────────────────────────
103
+ /**
104
+ * 从文本中提取所有工作流状态标签
105
+ */
106
+ export function extractWorkflowStateTags(text) {
107
+ const tags = [];
108
+ const regex = /\[workflow-state:[^\]]+\]/gi;
109
+ const matches = text.match(regex) || [];
110
+ for (const match of matches) {
111
+ const state = parseWorkflowStateTag(match);
112
+ if (state) {
113
+ tags.push(state);
114
+ }
115
+ }
116
+ return tags;
117
+ }
118
+ /**
119
+ * 检查文本是否包含工作流状态标签
120
+ */
121
+ export function hasWorkflowStateTag(text) {
122
+ return /\[workflow-state:[^\]]+\]/i.test(text);
123
+ }
124
+ /**
125
+ * 移除文本中的工作流状态标签
126
+ */
127
+ export function removeWorkflowStateTags(text) {
128
+ return text.replace(/\[workflow-state:[^\]]+\]\s*/gi, '').trim();
129
+ }
130
+ // ─── 阶段图标 ───────────────────────────────────────────────
131
+ /**
132
+ * 获取阶段的图标
133
+ */
134
+ export function getStageIcon(stage) {
135
+ const icons = {
136
+ explore: '🔍',
137
+ propose: '📝',
138
+ apply: '⚙️',
139
+ verify: '✅',
140
+ archive: '📦',
141
+ idle: '💤',
142
+ };
143
+ return icons[stage] || '❓';
144
+ }
145
+ /**
146
+ * 获取阶段的描述
147
+ */
148
+ export function getStageDescription(stage) {
149
+ const descriptions = {
150
+ explore: '探索需求,理解问题',
151
+ propose: '创建变更提案',
152
+ apply: '实现代码',
153
+ verify: '验证实现',
154
+ archive: '归档变更',
155
+ idle: '空闲状态',
156
+ };
157
+ return descriptions[stage] || '未知阶段';
158
+ }
159
+ /**
160
+ * 生成带图标的阶段标签
161
+ */
162
+ export function formatStageLabel(stage) {
163
+ return `${getStageIcon(stage)} ${stage.toUpperCase()}`;
164
+ }
165
+ // ─── 状态推断 ───────────────────────────────────────────────
166
+ /**
167
+ * 从文件路径推断工作流阶段
168
+ */
169
+ export function inferStageFromPath(filePath) {
170
+ const patterns = [
171
+ { pattern: /explore|探索/i, stage: 'explore' },
172
+ { pattern: /propose|提案|proposal/i, stage: 'propose' },
173
+ { pattern: /apply|实现|implementation/i, stage: 'apply' },
174
+ { pattern: /verify|验证|verification/i, stage: 'verify' },
175
+ { pattern: /archive|归档/i, stage: 'archive' },
176
+ ];
177
+ for (const { pattern, stage } of patterns) {
178
+ if (pattern.test(filePath)) {
179
+ return stage;
180
+ }
181
+ }
182
+ return null;
183
+ }
184
+ /**
185
+ * 从内容推断工作流阶段
186
+ */
187
+ export function inferStageFromContent(content) {
188
+ const patterns = [
189
+ { pattern: /探索|理解|分析|调研|explore/i, stage: 'explore' },
190
+ { pattern: /提案|proposal| propose/i, stage: 'propose' },
191
+ { pattern: /实现|apply|执行|开发|编码/i, stage: 'apply' },
192
+ { pattern: /验证|verify|测试|检查/i, stage: 'verify' },
193
+ { pattern: /归档|archive|合并|merge/i, stage: 'archive' },
194
+ ];
195
+ for (const { pattern, stage } of patterns) {
196
+ if (pattern.test(content)) {
197
+ return stage;
198
+ }
199
+ }
200
+ return null;
201
+ }
202
+ // ─── 共享阶段检测 ───────────────────────────────────────────
203
+ /**
204
+ * 检测当前工作流阶段(共享函数)
205
+ *
206
+ * 基于 openspec/changes 目录结构推断当前阶段
207
+ */
208
+ export function detectCurrentStage(projectRoot) {
209
+ const changesDir = join(projectRoot, 'openspec', 'changes');
210
+ if (!existsSync(changesDir)) {
211
+ return 'idle';
212
+ }
213
+ try {
214
+ const entries = readdirSync(changesDir, { withFileTypes: true });
215
+ const changeDirs = entries.filter((e) => e.isDirectory() && e.name !== 'archive');
216
+ if (changeDirs.length === 0) {
217
+ return 'idle';
218
+ }
219
+ const changeDir = join(changesDir, changeDirs[0].name);
220
+ const files = readdirSync(changeDir);
221
+ // 推断阶段
222
+ if (files.some((f) => f.includes('verify') || f.includes('review'))) {
223
+ return 'verify';
224
+ }
225
+ if (files.some((f) => f.includes('tasks'))) {
226
+ return 'apply';
227
+ }
228
+ if (files.some((f) => f.includes('spec') || f.includes('design'))) {
229
+ return 'propose';
230
+ }
231
+ return 'explore';
232
+ }
233
+ catch {
234
+ return 'idle';
235
+ }
236
+ }
237
+ // ─── 工作流状态持久化 ───────────────────────────────────────
238
+ /**
239
+ * 保存工作流状态到持久化文件
240
+ */
241
+ export function saveWorkflowState(projectRoot, state) {
242
+ const stateDir = join(projectRoot, '.specpow', 'state');
243
+ try {
244
+ if (!existsSync(stateDir)) {
245
+ mkdirSync(stateDir, { recursive: true });
246
+ }
247
+ const stateFile = join(stateDir, 'workflow-state.json');
248
+ writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf-8');
249
+ }
250
+ catch {
251
+ // 静默失败
252
+ }
253
+ }
254
+ /**
255
+ * 加载持久化的工作流状态
256
+ */
257
+ export function loadWorkflowState(projectRoot) {
258
+ const stateFile = join(projectRoot, '.specpow', 'state', 'workflow-state.json');
259
+ if (!existsSync(stateFile)) {
260
+ return null;
261
+ }
262
+ try {
263
+ const content = readFileSync(stateFile, 'utf-8');
264
+ return JSON.parse(content);
265
+ }
266
+ catch {
267
+ return null;
268
+ }
269
+ }
270
+ /**
271
+ * 清除持久化的工作流状态
272
+ */
273
+ export function clearWorkflowState(projectRoot) {
274
+ const stateFile = join(projectRoot, '.specpow', 'state', 'workflow-state.json');
275
+ try {
276
+ if (existsSync(stateFile)) {
277
+ unlinkSync(stateFile);
278
+ }
279
+ }
280
+ catch {
281
+ // 静默失败
282
+ }
283
+ }
284
+ //# sourceMappingURL=workflow-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../src/core/workflow-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * SpecPow Framework - 主入口
3
+ *
4
+ * 融合 OpenSpec 规范驱动 + Superpowers 执行引擎
5
+ */
6
+ export { runCli } from './cli/index.js';
7
+ export * as artifactGraph from './core/artifact-graph/index.js';
8
+ export * as sddEngine from './core/sdd-engine/index.js';
9
+ export * as commandGeneration from './core/command-generation/index.js';
10
+ export * as store from './core/store/index.js';
11
+ export * as parsers from './core/parsers/index.js';
12
+ export * as validation from './core/validation/index.js';
13
+ export * as templates from './core/templates/index.js';
14
+ export * as hooks from './core/hooks/index.js';
15
+ export * as memory from './core/memory/index.js';
16
+ export * as channel from './core/channel/index.js';
17
+ export * as workflowState from './core/workflow-state.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,OAAO,KAAK,aAAa,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,iBAAiB,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AAGnD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SpecPow Framework - 主入口
3
+ *
4
+ * 融合 OpenSpec 规范驱动 + Superpowers 执行引擎
5
+ */
6
+ // CLI 模块
7
+ export { runCli } from './cli/index.js';
8
+ // 核心模块
9
+ export * as artifactGraph from './core/artifact-graph/index.js';
10
+ export * as sddEngine from './core/sdd-engine/index.js';
11
+ export * as commandGeneration from './core/command-generation/index.js';
12
+ export * as store from './core/store/index.js';
13
+ export * as parsers from './core/parsers/index.js';
14
+ export * as validation from './core/validation/index.js';
15
+ export * as templates from './core/templates/index.js';
16
+ export * as hooks from './core/hooks/index.js';
17
+ export * as memory from './core/memory/index.js';
18
+ export * as channel from './core/channel/index.js';
19
+ // 工作流状态
20
+ export * as workflowState from './core/workflow-state.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO;AACP,OAAO,KAAK,aAAa,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,iBAAiB,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AAEnD,QAAQ;AACR,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * 通用工具函数
3
+ */
4
+ /**
5
+ * 查找项目根目录(包含 package.json 或 .git 的最近父目录)
6
+ */
7
+ export declare function findProjectRoot(startDir?: string): string;
8
+ /**
9
+ * 安全读取 JSON 文件
10
+ */
11
+ export declare function readJsonSafe<T>(filePath: string): T | null;
12
+ /**
13
+ * 确保目录存在
14
+ */
15
+ export declare function ensureDir(dirPath: string): void;
16
+ /**
17
+ * 复制目录(递归)
18
+ */
19
+ export declare function copyDir(src: string, dest: string): void;
20
+ /**
21
+ * 列出目录下所有文件(递归)
22
+ */
23
+ export declare function listFilesRecursive(dir: string, pattern?: RegExp): string[];
24
+ /**
25
+ * 生成变更 ID(基于标题的 slug)
26
+ */
27
+ export declare function generateChangeId(title: string): string;
28
+ /**
29
+ * 格式化时间戳
30
+ */
31
+ export declare function formatTimestamp(date?: Date): string;
32
+ /**
33
+ * 打印成功消息
34
+ */
35
+ export declare function success(msg: string): void;
36
+ /**
37
+ * 打印错误消息
38
+ */
39
+ export declare function error(msg: string): void;
40
+ /**
41
+ * 打印警告消息
42
+ */
43
+ export declare function warn(msg: string): void;
44
+ /**
45
+ * 打印信息消息
46
+ */
47
+ export declare function info(msg: string): void;
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAYxE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAO1D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAYvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAc1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC"}