@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,435 @@
1
+ import * as fs from 'fs/promises';
2
+ import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync, unlinkSync } from 'fs';
3
+ import { execFileSync } from 'child_process';
4
+ import * as path from 'path';
5
+ import * as yaml from 'yaml';
6
+ import chalk from 'chalk';
7
+ import { tmpdir } from 'os';
8
+ /**
9
+ * 运行工作流
10
+ */
11
+ export async function runWorkflow(options) {
12
+ const projectRoot = process.cwd();
13
+ const workflowsDir = path.join(projectRoot, 'workflows');
14
+ // 列出可用工作流
15
+ if (options.list) {
16
+ await listWorkflows(workflowsDir);
17
+ return;
18
+ }
19
+ if (!options.workflow) {
20
+ console.error(chalk.red('错误: 请指定工作流名称 (--workflow <name>)'));
21
+ process.exit(1);
22
+ }
23
+ // 加载工作流定义
24
+ const workflowFile = path.join(workflowsDir, `${options.workflow}.yaml`);
25
+ let workflowContent;
26
+ try {
27
+ workflowContent = await fs.readFile(workflowFile, 'utf-8');
28
+ }
29
+ catch (error) {
30
+ console.error(chalk.red(`错误: 找不到工作流 "${options.workflow}"`));
31
+ process.exit(1);
32
+ }
33
+ const workflow = yaml.parse(workflowContent);
34
+ console.log(chalk.blue(`\n🚀 启动工作流: ${workflow.name}`));
35
+ console.log(chalk.gray(` ${workflow.description}\n`));
36
+ // 确定要执行的阶段
37
+ let phasesToRun = workflow.phases;
38
+ if (options.fromPhase) {
39
+ const startIndex = phasesToRun.findIndex(p => p.name === options.fromPhase);
40
+ if (startIndex === -1) {
41
+ console.error(chalk.red(`错误: 找不到阶段 "${options.fromPhase}"`));
42
+ process.exit(1);
43
+ }
44
+ phasesToRun = phasesToRun.slice(startIndex);
45
+ }
46
+ if (options.skipPhase && options.skipPhase.length > 0) {
47
+ phasesToRun = phasesToRun.filter(p => !options.skipPhase.includes(p.name));
48
+ }
49
+ // 验证技能是否存在
50
+ const skillMap = discoverSkills(path.join(projectRoot, 'skills'));
51
+ // 执行阶段
52
+ for (let i = 0; i < phasesToRun.length; i++) {
53
+ const phase = phasesToRun[i];
54
+ const phaseNum = i + 1;
55
+ console.log(chalk.cyan(`\n${'='.repeat(60)}`));
56
+ console.log(chalk.cyan(`阶段 ${phaseNum}/${phasesToRun.length}: ${phase.name}`));
57
+ console.log(chalk.cyan(`${'='.repeat(60)}`));
58
+ console.log(chalk.gray(`${phase.description}\n`));
59
+ if (options.dryRun) {
60
+ console.log(chalk.yellow('[预览模式] 将执行以下技能:'));
61
+ phase.skills.forEach(skill => {
62
+ const found = skillMap.has(skill);
63
+ console.log(chalk.yellow(` ${found ? '✓' : '✗'} ${skill}${found ? '' : ' (未找到)'}`));
64
+ });
65
+ continue;
66
+ }
67
+ // 执行技能
68
+ for (const skill of phase.skills) {
69
+ console.log(chalk.white(`\n▶ 执行技能: ${skill}`));
70
+ const result = await executeSkill(skill, skillMap, projectRoot, options.change);
71
+ if (result.status === 'executed') {
72
+ console.log(chalk.green(` ✓ ${result.message}`));
73
+ }
74
+ else if (result.status === 'not_found') {
75
+ console.log(chalk.yellow(` ⚠ ${result.message}`));
76
+ }
77
+ else {
78
+ console.log(chalk.red(` ✗ ${result.message}`));
79
+ // 技能执行失败 — 可选是否中止工作流
80
+ if (result.status === 'failed') {
81
+ console.log(chalk.yellow(` 跳过失败技能,继续下一项...`));
82
+ }
83
+ }
84
+ }
85
+ // 检查门禁
86
+ if (phase.gates && phase.gates.length > 0) {
87
+ console.log(chalk.gray(`\n🔒 检查门禁: ${phase.gates.join(', ')}`));
88
+ const gateResults = await checkGates(phase.gates, projectRoot, options.change);
89
+ let allPassed = true;
90
+ for (const gateResult of gateResults) {
91
+ if (gateResult.passed) {
92
+ console.log(chalk.green(` ✓ ${gateResult.gate}: ${gateResult.message}`));
93
+ }
94
+ else {
95
+ console.log(chalk.red(` ✗ ${gateResult.gate}: ${gateResult.message}`));
96
+ allPassed = false;
97
+ }
98
+ }
99
+ if (!allPassed) {
100
+ console.log(chalk.red(`\n✗ 门禁未通过,工作流中止`));
101
+ process.exit(1);
102
+ }
103
+ }
104
+ console.log(chalk.green(`✓ 阶段 ${phase.name} 完成`));
105
+ }
106
+ console.log(chalk.green.bold(`\n✨ 工作流完成!\n`));
107
+ }
108
+ // ============================================================
109
+ // 技能发现与执行
110
+ // ============================================================
111
+ /**
112
+ * 发现所有可用技能
113
+ *
114
+ * 扫描 skills/ 目录,建立技能名 → 技能文件的映射
115
+ */
116
+ function discoverSkills(skillsDir) {
117
+ const skillMap = new Map();
118
+ if (!existsSync(skillsDir)) {
119
+ return skillMap;
120
+ }
121
+ try {
122
+ const entries = readdirSync(skillsDir, { withFileTypes: true });
123
+ for (const entry of entries) {
124
+ if (!entry.isDirectory())
125
+ continue;
126
+ const skillDir = path.join(skillsDir, entry.name);
127
+ const skillFile = path.join(skillDir, 'SKILL.md');
128
+ if (existsSync(skillFile)) {
129
+ // 目录名即为技能名
130
+ skillMap.set(entry.name, skillFile);
131
+ }
132
+ }
133
+ }
134
+ catch {
135
+ // 技能目录读取失败
136
+ }
137
+ return skillMap;
138
+ }
139
+ /**
140
+ * 执行单个技能
141
+ *
142
+ * 加载 SKILL.md 内容,构建 prompt,通过 AI 后端(claude CLI)实际执行。
143
+ * 执行完成后将输出记录到工作流日志。
144
+ */
145
+ async function executeSkill(skillName, skillMap, projectRoot, changeName) {
146
+ // 在 skillMap 中查找
147
+ const skillPath = skillMap.get(skillName);
148
+ if (!skillPath) {
149
+ return {
150
+ status: 'not_found',
151
+ message: `技能 "${skillName}" 未在 skills/ 目录中找到`,
152
+ };
153
+ }
154
+ // 加载技能文件
155
+ let skillContent;
156
+ try {
157
+ skillContent = readFileSync(skillPath, 'utf-8');
158
+ }
159
+ catch (err) {
160
+ return {
161
+ status: 'failed',
162
+ message: `加载技能文件失败: ${err.message}`,
163
+ };
164
+ }
165
+ const description = extractSkillDescription(skillContent);
166
+ // ── 构建 prompt ──
167
+ const promptParts = [
168
+ `# 工作流技能执行: ${skillName}`,
169
+ ``,
170
+ `## 项目上下文`,
171
+ `- 项目根目录: ${projectRoot}`,
172
+ `- 当前变更: ${changeName || 'N/A'}`,
173
+ `- 执行时间: ${new Date().toISOString()}`,
174
+ ``,
175
+ `## 技能指令`,
176
+ ``,
177
+ `请严格按照以下技能文件的内容执行任务。`,
178
+ `技能文件路径: ${skillPath}`,
179
+ ``,
180
+ `---`,
181
+ ``,
182
+ skillContent,
183
+ ];
184
+ if (changeName) {
185
+ promptParts.push(``, `---`, ``, `## 变更上下文`, `当前变更目录: openspec/changes/${changeName}/`, `请在执行时参考该目录下的 proposal.md、specs/、design.md、tasks.md 文件。`);
186
+ }
187
+ const promptContent = promptParts.join('\n');
188
+ // ── 执行 ──
189
+ try {
190
+ // 读取配置的 AI 工具
191
+ const configPath = path.join(projectRoot, '.specpow', 'config.json');
192
+ let aiTool = 'claude'; // 默认值
193
+ if (existsSync(configPath)) {
194
+ try {
195
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
196
+ aiTool = config.aiTool || 'claude';
197
+ }
198
+ catch {
199
+ // 配置读取失败,使用默认值
200
+ }
201
+ }
202
+ // 写入临时 prompt 文件
203
+ const promptFile = path.join(tmpdir(), `specpow-skill-${skillName}-${Date.now()}.md`);
204
+ writeFileSync(promptFile, promptContent, 'utf-8');
205
+ let output;
206
+ try {
207
+ // 根据 AI 工具选择不同的命令和参数
208
+ const cmd = aiTool;
209
+ const args = aiTool === 'claude'
210
+ ? ['--print', '--file', promptFile]
211
+ : ['--file', promptFile]; // 其他工具的参数格式
212
+ output = execFileSync(cmd, args, {
213
+ cwd: projectRoot,
214
+ encoding: 'utf-8',
215
+ timeout: 600_000, // 10 分钟超时
216
+ maxBuffer: 10 * 1024 * 1024,
217
+ stdio: ['pipe', 'pipe', 'pipe'],
218
+ });
219
+ }
220
+ finally {
221
+ // 清理临时文件
222
+ try {
223
+ unlinkSync(promptFile);
224
+ }
225
+ catch { /* ignore */ }
226
+ }
227
+ // 记录执行结果到日志
228
+ const logDir = path.join(projectRoot, '.specpow', 'workflow-logs');
229
+ if (!existsSync(logDir)) {
230
+ mkdirSync(logDir, { recursive: true });
231
+ }
232
+ const logEntry = [
233
+ `---`,
234
+ `技能: ${skillName}`,
235
+ `时间: ${new Date().toISOString()}`,
236
+ `变更: ${changeName || 'N/A'}`,
237
+ `描述: ${description}`,
238
+ `状态: executed`,
239
+ `---`,
240
+ ``,
241
+ `## 技能内容`,
242
+ ``,
243
+ skillContent.substring(0, 5000),
244
+ ``,
245
+ `## 执行输出`,
246
+ ``,
247
+ output.substring(0, 10000),
248
+ ].join('\n');
249
+ const logFile = path.join(logDir, `${Date.now()}-${skillName}.md`);
250
+ await fs.writeFile(logFile, logEntry, 'utf-8');
251
+ return {
252
+ status: 'executed',
253
+ message: `${skillName} — ${description}(已执行)`,
254
+ };
255
+ }
256
+ catch (err) {
257
+ // 执行失败也记录日志
258
+ const logDir = path.join(projectRoot, '.specpow', 'workflow-logs');
259
+ if (!existsSync(logDir)) {
260
+ mkdirSync(logDir, { recursive: true });
261
+ }
262
+ const logEntry = [
263
+ `---`,
264
+ `技能: ${skillName}`,
265
+ `时间: ${new Date().toISOString()}`,
266
+ `变更: ${changeName || 'N/A'}`,
267
+ `描述: ${description}`,
268
+ `状态: failed`,
269
+ `错误: ${err.message}`,
270
+ `---`,
271
+ ].join('\n');
272
+ const logFile = path.join(logDir, `${Date.now()}-${skillName}-error.md`);
273
+ await fs.writeFile(logFile, logEntry, 'utf-8');
274
+ return {
275
+ status: 'failed',
276
+ message: `执行技能 "${skillName}" 失败: ${err.message}`,
277
+ };
278
+ }
279
+ }
280
+ /**
281
+ * 从 SKILL.md 中提取描述
282
+ */
283
+ function extractSkillDescription(content) {
284
+ // 查找第一行非空文本作为描述
285
+ const lines = content.split('\n');
286
+ for (const line of lines) {
287
+ const trimmed = line.trim();
288
+ if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('-') && trimmed.length > 10) {
289
+ return trimmed.substring(0, 100);
290
+ }
291
+ }
292
+ return '技能描述未找到';
293
+ }
294
+ // ============================================================
295
+ // 门禁检查
296
+ // ============================================================
297
+ /**
298
+ * 执行门禁检查
299
+ *
300
+ * 支持以下门禁类型:
301
+ * - spec-complete: 确保 specs 目录存在且非空
302
+ * - design-approved: 确保 design.md 存在
303
+ * - tasks-existent: 确保 tasks.md 存在且包含任务
304
+ * - lint-pass: 确保 linter 无错误
305
+ * - test-pass: 确保测试通过
306
+ * - review-complete: 确保所有审查已通过
307
+ */
308
+ async function checkGates(gates, projectRoot, changeName) {
309
+ const results = [];
310
+ const changeDir = changeName
311
+ ? path.join(projectRoot, 'openspec', 'changes', changeName)
312
+ : null;
313
+ for (const gate of gates) {
314
+ const result = await checkSingleGate(gate, projectRoot, changeDir);
315
+ results.push(result);
316
+ }
317
+ return results;
318
+ }
319
+ /**
320
+ * 检查单个门禁
321
+ */
322
+ async function checkSingleGate(gate, projectRoot, changeDir) {
323
+ switch (gate) {
324
+ case 'spec-complete': {
325
+ if (!changeDir) {
326
+ return { gate, passed: false, message: '未指定变更名称' };
327
+ }
328
+ const specsDir = path.join(changeDir, 'specs');
329
+ if (!existsSync(specsDir)) {
330
+ return { gate, passed: false, message: 'specs/ 目录不存在' };
331
+ }
332
+ const specFiles = readdirSync(specsDir).filter(f => f.endsWith('.md'));
333
+ if (specFiles.length === 0) {
334
+ return { gate, passed: false, message: 'specs/ 目录为空' };
335
+ }
336
+ return { gate, passed: true, message: `${specFiles.length} 个规范文件` };
337
+ }
338
+ case 'design-approved': {
339
+ if (!changeDir) {
340
+ return { gate, passed: false, message: '未指定变更名称' };
341
+ }
342
+ const designFile = path.join(changeDir, 'design.md');
343
+ if (!existsSync(designFile)) {
344
+ return { gate, passed: false, message: 'design.md 不存在' };
345
+ }
346
+ const designContent = readFileSync(designFile, 'utf-8');
347
+ if (designContent.trim().length < 50) {
348
+ return { gate, passed: false, message: 'design.md 内容过短' };
349
+ }
350
+ return { gate, passed: true, message: 'design.md 已就绪' };
351
+ }
352
+ case 'tasks-existent': {
353
+ if (!changeDir) {
354
+ return { gate, passed: false, message: '未指定变更名称' };
355
+ }
356
+ const tasksFile = path.join(changeDir, 'tasks.md');
357
+ if (!existsSync(tasksFile)) {
358
+ return { gate, passed: false, message: 'tasks.md 不存在' };
359
+ }
360
+ const tasksContent = readFileSync(tasksFile, 'utf-8');
361
+ const hasTasks = /- \[ \] \*\*Task \d+\*\*/.test(tasksContent);
362
+ if (!hasTasks) {
363
+ return { gate, passed: false, message: 'tasks.md 中没有待执行的任务' };
364
+ }
365
+ return { gate, passed: true, message: 'tasks.md 已就绪' };
366
+ }
367
+ case 'lint-pass': {
368
+ try {
369
+ execFileSync('npm', ['run', 'lint', '--', '--max-warnings', '0'], {
370
+ cwd: projectRoot,
371
+ timeout: 60000,
372
+ stdio: 'pipe',
373
+ });
374
+ return { gate, passed: true, message: 'Lint 通过' };
375
+ }
376
+ catch {
377
+ return { gate, passed: false, message: 'Lint 失败或有警告' };
378
+ }
379
+ }
380
+ case 'test-pass': {
381
+ try {
382
+ execFileSync('npm', ['test', '--', '--run'], {
383
+ cwd: projectRoot,
384
+ timeout: 120000,
385
+ stdio: 'pipe',
386
+ });
387
+ return { gate, passed: true, message: '测试通过' };
388
+ }
389
+ catch {
390
+ return { gate, passed: false, message: '测试失败' };
391
+ }
392
+ }
393
+ case 'review-complete': {
394
+ if (!changeDir) {
395
+ return { gate, passed: false, message: '未指定变更名称' };
396
+ }
397
+ const sddDir = path.join(projectRoot, '.specpow', 'sdd');
398
+ // 检查是否有已完成的审查记录
399
+ if (!existsSync(sddDir)) {
400
+ return { gate, passed: false, message: '无 SDD 工作目录,审查未进行' };
401
+ }
402
+ // 检查最终审查报告是否存在
403
+ const reviewReportPath = path.join(sddDir, 'reviews', 'final-review.md');
404
+ if (!existsSync(reviewReportPath)) {
405
+ return { gate, passed: false, message: '审查未完成:缺少 final-review.md 报告' };
406
+ }
407
+ return { gate, passed: true, message: '审查已完成' };
408
+ }
409
+ default:
410
+ return { gate, passed: false, message: `门禁 "${gate}" 未定义,无法验证(请检查 workflows/ 中的门禁配置)` };
411
+ }
412
+ }
413
+ // ============================================================
414
+ // 工作流列表
415
+ // ============================================================
416
+ async function listWorkflows(workflowsDir) {
417
+ try {
418
+ const files = await fs.readdir(workflowsDir);
419
+ const yamlFiles = files.filter(f => f.endsWith('.yaml'));
420
+ console.log(chalk.blue('\n可用工作流:\n'));
421
+ for (const file of yamlFiles) {
422
+ const content = await fs.readFile(path.join(workflowsDir, file), 'utf-8');
423
+ const workflow = yaml.parse(content);
424
+ console.log(chalk.cyan(` ${workflow.name}`));
425
+ console.log(chalk.gray(` ${workflow.description}`));
426
+ console.log(chalk.gray(` 阶段: ${workflow.phases.map(p => p.name).join(' → ')}`));
427
+ console.log();
428
+ }
429
+ }
430
+ catch (error) {
431
+ console.error(chalk.red(`Error: Cannot read workflows directory: ${error.message}`));
432
+ console.error(chalk.yellow(`Please ensure workflows directory exists at: ${workflowsDir}`));
433
+ }
434
+ }
435
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/workflow/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Agent Contract — 统一的 JSON 输出格式
3
+ *
4
+ * 移植自 OpenSpec 的 agent-contract 模式,为 AI 代理提供结构化输出
5
+ *
6
+ * 所有命令支持 --json 选项时,输出格式为:
7
+ * {
8
+ * status: 'success' | 'error' | 'blocked',
9
+ * data?: any,
10
+ * diagnostics?: Array<{ severity, code, message, fix? }>,
11
+ * nextSteps?: string[]
12
+ * }
13
+ */
14
+ export type AgentStatus = 'success' | 'error' | 'blocked' | 'warning';
15
+ export type DiagnosticSeverity = 'info' | 'warning' | 'error' | 'critical';
16
+ export interface Diagnostic {
17
+ /** 严重程度 */
18
+ severity: DiagnosticSeverity;
19
+ /** 诊断代码(如 CONFIG_MISSING, SCHEMA_INVALID) */
20
+ code: string;
21
+ /** 人类可读的消息 */
22
+ message: string;
23
+ /** 修复建议 */
24
+ fix?: string;
25
+ }
26
+ export interface AgentResponse<T = any> {
27
+ /** 操作状态 */
28
+ status: AgentStatus;
29
+ /** 响应数据(命令特定) */
30
+ data?: T;
31
+ /** 诊断信息(警告、错误、建议) */
32
+ diagnostics?: Diagnostic[];
33
+ /** 建议的下一步操作 */
34
+ nextSteps?: string[];
35
+ }
36
+ /**
37
+ * status 命令的 data 结构
38
+ */
39
+ export interface StatusData {
40
+ change: string;
41
+ artifacts: Array<{
42
+ name: string;
43
+ status: 'complete' | 'incomplete' | 'missing';
44
+ path: string;
45
+ }>;
46
+ tasks: {
47
+ total: number;
48
+ complete: number;
49
+ blocked: number;
50
+ pending: number;
51
+ };
52
+ specs: {
53
+ added: number;
54
+ modified: number;
55
+ removed: number;
56
+ };
57
+ }
58
+ /**
59
+ * apply 命令的 data 结构
60
+ */
61
+ export interface ApplyData {
62
+ change: string;
63
+ execution: {
64
+ mode: 'serial' | 'parallel';
65
+ completedTasks: number;
66
+ totalTasks: number;
67
+ blockedTasks: number;
68
+ parkedFindings: number;
69
+ };
70
+ conflicts?: string[];
71
+ mergeFailures?: string[];
72
+ }
73
+ /**
74
+ * propose 命令的 data 结构
75
+ */
76
+ export interface ProposeData {
77
+ change: string;
78
+ artifacts: Array<{
79
+ name: string;
80
+ path: string;
81
+ created: boolean;
82
+ }>;
83
+ schema: string;
84
+ }
85
+ /**
86
+ * archive 命令的 data 结构
87
+ */
88
+ export interface ArchiveData {
89
+ change: string;
90
+ archivedAs: string;
91
+ path: string;
92
+ specsUpdated: number;
93
+ totals: {
94
+ added: number;
95
+ modified: number;
96
+ removed: number;
97
+ total: number;
98
+ };
99
+ warnings: string[];
100
+ }
101
+ /**
102
+ * schemas 命令的 data 结构
103
+ */
104
+ export interface SchemasData {
105
+ schemas: Array<{
106
+ id: string;
107
+ name: string;
108
+ artifactCount: number;
109
+ valid: boolean;
110
+ source: 'project' | 'user' | 'builtin';
111
+ }>;
112
+ }
113
+ /**
114
+ * 创建成功的响应
115
+ */
116
+ export declare function successResponse<T>(data: T, diagnostics?: Diagnostic[]): AgentResponse<T>;
117
+ /**
118
+ * 创建错误的响应
119
+ */
120
+ export declare function errorResponse(message: string, code: string, fix?: string): AgentResponse;
121
+ /**
122
+ * 创建阻塞的响应
123
+ */
124
+ export declare function blockedResponse(message: string, nextSteps: string[]): AgentResponse;
125
+ /**
126
+ * 创建警告的响应
127
+ */
128
+ export declare function warningResponse<T>(data: T, warnings: Diagnostic[]): AgentResponse<T>;
129
+ /**
130
+ * 输出 JSON 响应(用于 --json 模式)
131
+ */
132
+ export declare function outputJson(response: AgentResponse): void;
133
+ //# sourceMappingURL=agent-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-contract.d.ts","sourceRoot":"","sources":["../../src/core/agent-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Agent Contract — 统一的 JSON 输出格式
3
+ *
4
+ * 移植自 OpenSpec 的 agent-contract 模式,为 AI 代理提供结构化输出
5
+ *
6
+ * 所有命令支持 --json 选项时,输出格式为:
7
+ * {
8
+ * status: 'success' | 'error' | 'blocked',
9
+ * data?: any,
10
+ * diagnostics?: Array<{ severity, code, message, fix? }>,
11
+ * nextSteps?: string[]
12
+ * }
13
+ */
14
+ // ============================================================
15
+ // 辅助函数
16
+ // ============================================================
17
+ /**
18
+ * 创建成功的响应
19
+ */
20
+ export function successResponse(data, diagnostics) {
21
+ return {
22
+ status: 'success',
23
+ data,
24
+ diagnostics,
25
+ };
26
+ }
27
+ /**
28
+ * 创建错误的响应
29
+ */
30
+ export function errorResponse(message, code, fix) {
31
+ return {
32
+ status: 'error',
33
+ diagnostics: [{
34
+ severity: 'error',
35
+ code,
36
+ message,
37
+ fix,
38
+ }],
39
+ };
40
+ }
41
+ /**
42
+ * 创建阻塞的响应
43
+ */
44
+ export function blockedResponse(message, nextSteps) {
45
+ return {
46
+ status: 'blocked',
47
+ diagnostics: [{
48
+ severity: 'warning',
49
+ code: 'BLOCKED',
50
+ message,
51
+ }],
52
+ nextSteps,
53
+ };
54
+ }
55
+ /**
56
+ * 创建警告的响应
57
+ */
58
+ export function warningResponse(data, warnings) {
59
+ return {
60
+ status: 'warning',
61
+ data,
62
+ diagnostics: warnings,
63
+ };
64
+ }
65
+ /**
66
+ * 输出 JSON 响应(用于 --json 模式)
67
+ */
68
+ export function outputJson(response) {
69
+ console.log(JSON.stringify(response, null, 2));
70
+ }
71
+ //# sourceMappingURL=agent-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-contract.js","sourceRoot":"","sources":["../../src/core/agent-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsHH,+DAA+D;AAC/D,OAAO;AACP,+DAA+D;AAE/D;;GAEG;AACH,MAAM,UAAU,eAAe,CAAI,IAAO,EAAE,WAA0B;IACpE,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,IAAI;QACJ,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAY,EAAE,GAAY;IACvE,OAAO;QACL,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,CAAC;gBACZ,QAAQ,EAAE,OAAO;gBACjB,IAAI;gBACJ,OAAO;gBACP,GAAG;aACJ,CAAC;KACH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,SAAmB;IAClE,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,CAAC;gBACZ,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,SAAS;gBACf,OAAO;aACR,CAAC;QACF,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAI,IAAO,EAAE,QAAsB;IAChE,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,IAAI;QACJ,WAAW,EAAE,QAAQ;KACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAuB;IAChD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}