@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,107 @@
1
+ /**
2
+ * SDD 控制器
3
+ *
4
+ * 核心协调器,编排整个子代理驱动开发流程:
5
+ *
6
+ * 1. 设置:工作区、账本、读取计划
7
+ * 2. 对每个任务:
8
+ * a. 提取任务简报
9
+ * b. 分发实现者子代理
10
+ * c. 处理报告
11
+ * d. 生成审查包 → 分发审查子代理
12
+ * e. 修复循环(≤5轮)
13
+ * f. 记录到账本
14
+ * 3. 全分支最终审查
15
+ * 4. 清理工作区
16
+ *
17
+ * 关键原则:
18
+ * - 控制器不自己修复代码(保持上下文干净)
19
+ * - 所有产物通过文件传递(不占用上下文窗口)
20
+ * - 信任账本而非自己的记忆
21
+ */
22
+ import type { SDDConfig } from './types.js';
23
+ export interface PlanTask {
24
+ number: number;
25
+ title: string;
26
+ description: string;
27
+ files: string[];
28
+ }
29
+ export interface SDDResult {
30
+ success: boolean;
31
+ completedTasks: number;
32
+ totalTasks: number;
33
+ blockedTasks: number;
34
+ parkedFindings: number;
35
+ }
36
+ export declare class SDDController {
37
+ private config;
38
+ private ledger;
39
+ private reviewLoop;
40
+ private modelSelector;
41
+ private aiCaller;
42
+ private inGitRepo;
43
+ constructor(config: SDDConfig);
44
+ /**
45
+ * 初始化 - 设置工作区和账本
46
+ * 注意:当前实现为纯同步操作,保留 async 签名以便未来扩展(如远程账本加载)
47
+ */
48
+ initialize(): void;
49
+ /**
50
+ * 执行计划
51
+ *
52
+ * 主循环:逐个任务执行,每个任务经过 实现→审查→修复 循环
53
+ */
54
+ executePlan(tasks: PlanTask[], projectContext: string): Promise<SDDResult>;
55
+ /**
56
+ * 执行单个任务
57
+ */
58
+ private executeTask;
59
+ /**
60
+ * 创建任务简报
61
+ */
62
+ private createBrief;
63
+ /**
64
+ * 分发实现者子代理
65
+ *
66
+ * 遵循 Superpowers 原则:
67
+ * - 全新上下文,不继承主会话历史
68
+ * - 通过文件传递任务简报和实现报告
69
+ * - 模型选择基于任务复杂度
70
+ */
71
+ private dispatchImplementer;
72
+ /**
73
+ * 分发审查者子代理
74
+ *
75
+ * 两阶段审查门(来自 Superpowers):
76
+ * 1. 规格合规裁决
77
+ * 2. 代码质量裁决
78
+ */
79
+ private dispatchReviewer;
80
+ /**
81
+ * 分发重新审查者子代理(范围限定)
82
+ *
83
+ * 仅审查修复 diff,不重新审查整个任务
84
+ */
85
+ private dispatchReReviewer;
86
+ /**
87
+ * 获取 HEAD commit SHA
88
+ */
89
+ private getHeadCommit;
90
+ /**
91
+ * 生成审查包文件
92
+ *
93
+ * 使用 git diff 生成 Markdown 格式的审查包,
94
+ * 审查者子代理读取文件而非接收上下文注入的 diff。
95
+ */
96
+ private generateReviewPackage;
97
+ /**
98
+ * 运行项目测试 — TDD 门控
99
+ *
100
+ * 智能检测并运行项目测试:
101
+ * 1. 优先使用 package.json 中的 test script(支持 npm/yarn/pnpm)
102
+ * 2. 自动检测常见测试框架(vitest, jest, mocha, ava, tape, pytest 等)
103
+ * 3. 如果项目没有测试框架或测试目录,返回 true(不阻塞流程)
104
+ */
105
+ private runTests;
106
+ }
107
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/core/sdd-engine/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,OAAO,KAAK,EAAE,SAAS,EAAgD,MAAM,YAAY,CAAC;AAE1F,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAAU;gBAEf,MAAM,EAAE,SAAS;IAqB7B;;;OAGG;IACH,UAAU,IAAI,IAAI;IAQlB;;;;OAIG;IACG,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAwChF;;OAEG;YACW,WAAW;IA4GzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;;;;OAOG;YACW,mBAAmB;IAajC;;;;;;OAMG;YACW,gBAAgB;IAW9B;;;;OAIG;YACW,kBAAkB;IAWhC;;OAEG;YACW,aAAa;IAQ3B;;;;;OAKG;YACW,qBAAqB;IAoBnC;;;;;;;OAOG;YACW,QAAQ;CA8EvB"}
@@ -0,0 +1,357 @@
1
+ /**
2
+ * SDD 控制器
3
+ *
4
+ * 核心协调器,编排整个子代理驱动开发流程:
5
+ *
6
+ * 1. 设置:工作区、账本、读取计划
7
+ * 2. 对每个任务:
8
+ * a. 提取任务简报
9
+ * b. 分发实现者子代理
10
+ * c. 处理报告
11
+ * d. 生成审查包 → 分发审查子代理
12
+ * e. 修复循环(≤5轮)
13
+ * f. 记录到账本
14
+ * 3. 全分支最终审查
15
+ * 4. 清理工作区
16
+ *
17
+ * 关键原则:
18
+ * - 控制器不自己修复代码(保持上下文干净)
19
+ * - 所有产物通过文件传递(不占用上下文窗口)
20
+ * - 信任账本而非自己的记忆
21
+ */
22
+ import { Ledger } from './ledger.js';
23
+ import { ReviewLoop } from './review-loop.js';
24
+ import { ModelSelector } from './model-selector.js';
25
+ import { AICaller } from './ai-caller.js';
26
+ import { getHeadCommit, generateReviewPackage, isGitRepo } from './git-ops.js';
27
+ import { execFileSync } from 'child_process';
28
+ import { existsSync, writeFileSync, readFileSync } from 'fs';
29
+ import { join } from 'path';
30
+ export class SDDController {
31
+ config;
32
+ ledger;
33
+ reviewLoop;
34
+ modelSelector;
35
+ aiCaller;
36
+ inGitRepo;
37
+ constructor(config) {
38
+ this.config = config;
39
+ this.ledger = new Ledger(config.workspaceDir, config.planFile, config.maxFixRounds);
40
+ this.reviewLoop = new ReviewLoop(config.maxFixRounds);
41
+ // Build ModelConfig: per-role overrides take precedence over tier defaults
42
+ const tierDefaults = {
43
+ cheap: 'haiku',
44
+ standard: 'sonnet',
45
+ capable: 'opus',
46
+ };
47
+ this.modelSelector = new ModelSelector({
48
+ cheap: config.modelConfig?.cheap || tierDefaults.cheap,
49
+ standard: config.modelConfig?.standard || tierDefaults.standard,
50
+ capable: config.modelConfig?.capable || tierDefaults.capable,
51
+ });
52
+ this.aiCaller = new AICaller(config.workspaceDir);
53
+ this.inGitRepo = isGitRepo();
54
+ }
55
+ /**
56
+ * 初始化 - 设置工作区和账本
57
+ * 注意:当前实现为纯同步操作,保留 async 签名以便未来扩展(如远程账本加载)
58
+ */
59
+ initialize() {
60
+ // 尝试加载已有账本(支持断点续跑)
61
+ const canResume = this.ledger.load();
62
+ if (!canResume) {
63
+ this.ledger.initialize();
64
+ }
65
+ }
66
+ /**
67
+ * 执行计划
68
+ *
69
+ * 主循环:逐个任务执行,每个任务经过 实现→审查→修复 循环
70
+ */
71
+ async executePlan(tasks, projectContext) {
72
+ await this.initialize();
73
+ let completed = 0;
74
+ let blocked = 0;
75
+ let parkedTotal = 0;
76
+ for (const task of tasks) {
77
+ // 跳过已完成的任务(断点续跑)
78
+ if (this.ledger.isTaskComplete(task.number)) {
79
+ completed++;
80
+ continue;
81
+ }
82
+ const result = await this.executeTask(task, projectContext);
83
+ switch (result.outcome) {
84
+ case 'complete':
85
+ completed++;
86
+ break;
87
+ case 'blocked':
88
+ blocked++;
89
+ this.ledger.recordBlocked(task.number, result.reason || 'Unknown');
90
+ break;
91
+ case 'adjudicated':
92
+ completed++;
93
+ parkedTotal += result.parkedCount || 0;
94
+ break;
95
+ }
96
+ }
97
+ return {
98
+ success: blocked === 0,
99
+ completedTasks: completed,
100
+ totalTasks: tasks.length,
101
+ blockedTasks: blocked,
102
+ parkedFindings: parkedTotal,
103
+ };
104
+ }
105
+ /**
106
+ * 执行单个任务
107
+ */
108
+ async executeTask(task, projectContext) {
109
+ // 1. 构建任务简报
110
+ const brief = this.createBrief(task);
111
+ // 2. 记录 BASE commit
112
+ const baseCommit = await this.getHeadCommit();
113
+ // 3. 选择实现者模型(基于任务复杂度)
114
+ const model = this.modelSelector.selectImplementerModel(task.files.length, !!this.config.specConstraints, false);
115
+ // 4. 调用实现者子代理
116
+ const report = await this.dispatchImplementer(brief, projectContext, model);
117
+ // 5. 处理报告
118
+ if (report.status === 'blocked') {
119
+ return { outcome: 'blocked', reason: report.concerns };
120
+ }
121
+ // 6. 生成审查包并分发审查者
122
+ const headCommit = await this.getHeadCommit();
123
+ await this.generateReviewPackage(baseCommit, headCommit);
124
+ const review = await this.dispatchReviewer(brief, projectContext);
125
+ // 7. TDD 门控:检测测试是否通过
126
+ const testsPassed = await this.runTests();
127
+ // 8. 审查循环
128
+ let currentRound = 0;
129
+ let decision = this.reviewLoop.analyzeReview(review, currentRound, testsPassed);
130
+ while (decision.type === 'fix') {
131
+ currentRound++;
132
+ if (currentRound > this.config.maxFixRounds) {
133
+ // 断路器触发:将 decision 转为 adjudicate,避免 break 后落入 Unknown decision type
134
+ decision = { type: 'adjudicate', findings: decision.findings };
135
+ break;
136
+ }
137
+ // 修复轮次 4-5 升级模型
138
+ const fixModel = currentRound >= 4
139
+ ? this.modelSelector.getEscalatedModel(model)
140
+ : model;
141
+ // 分发实现者修复 — 使用独立的 reportPath 避免覆盖原始实现报告
142
+ const fixBrief = {
143
+ ...brief,
144
+ reportPath: `${brief.reportPath}.fix-${currentRound}`,
145
+ };
146
+ const fixBase = await this.getHeadCommit();
147
+ await this.dispatchImplementer(fixBrief, projectContext, fixModel);
148
+ const fixHead = await this.getHeadCommit();
149
+ // 记录修复轮次到账本
150
+ const fixRecord = this.reviewLoop.createFixRecord(currentRound, 0, // addressed 由审查结果确定
151
+ decision.findings.length, decision.findings.map(f => f.description), `${fixBase.slice(0, 7)}..${fixHead.slice(0, 7)}`);
152
+ this.ledger.recordFixRound(task.number, fixRecord);
153
+ // 范围限定的重新审查
154
+ await this.generateReviewPackage(fixBase, fixHead);
155
+ const reReview = await this.dispatchReReviewer(fixBrief, decision.findings);
156
+ // 修复轮次也检查测试
157
+ const fixTestsPassed = await this.runTests();
158
+ decision = this.reviewLoop.analyzeReview(reReview, currentRound, fixTestsPassed);
159
+ }
160
+ // 9. 处理最终结果
161
+ if (decision.type === 'pass') {
162
+ const commits = `${baseCommit.slice(0, 7)}..${(await this.getHeadCommit()).slice(0, 7)}`;
163
+ this.ledger.recordComplete(task.number, commits, true);
164
+ return { outcome: 'complete' };
165
+ }
166
+ if (decision.type === 'blocked') {
167
+ return { outcome: 'blocked', reason: decision.reason };
168
+ }
169
+ if (decision.type === 'adjudicate') {
170
+ let parkedCount = 0;
171
+ for (const finding of decision.findings) {
172
+ const ruling = this.reviewLoop.adjudicateFinding(finding, '');
173
+ if (ruling.action === 'park') {
174
+ this.ledger.recordParkedFinding(task.number, finding, ruling.ruling);
175
+ parkedCount++;
176
+ }
177
+ else {
178
+ return { outcome: 'blocked', reason: ruling.ruling };
179
+ }
180
+ }
181
+ const commits = `${baseCommit.slice(0, 7)}..${(await this.getHeadCommit()).slice(0, 7)}`;
182
+ this.ledger.recordComplete(task.number, commits, false);
183
+ return { outcome: 'adjudicated', parkedCount };
184
+ }
185
+ return { outcome: 'blocked', reason: 'Unknown decision type' };
186
+ }
187
+ /**
188
+ * 创建任务简报
189
+ */
190
+ createBrief(task) {
191
+ const briefPath = `${this.config.workspaceDir}/task-${task.number}-brief.md`;
192
+ const reportPath = `${this.config.workspaceDir}/task-${task.number}-report.md`;
193
+ return {
194
+ taskNumber: task.number,
195
+ title: task.title,
196
+ description: task.description,
197
+ files: task.files,
198
+ briefPath,
199
+ reportPath,
200
+ };
201
+ }
202
+ // ============================================================
203
+ // AI 子代理分发 — 委托给 AICaller
204
+ // ============================================================
205
+ /**
206
+ * 分发实现者子代理
207
+ *
208
+ * 遵循 Superpowers 原则:
209
+ * - 全新上下文,不继承主会话历史
210
+ * - 通过文件传递任务简报和实现报告
211
+ * - 模型选择基于任务复杂度
212
+ */
213
+ async dispatchImplementer(brief, projectContext, model) {
214
+ return this.aiCaller.dispatchImplementer(brief, projectContext, this.config.specConstraints, model);
215
+ }
216
+ /**
217
+ * 分发审查者子代理
218
+ *
219
+ * 两阶段审查门(来自 Superpowers):
220
+ * 1. 规格合规裁决
221
+ * 2. 代码质量裁决
222
+ */
223
+ async dispatchReviewer(brief, projectContext) {
224
+ return this.aiCaller.dispatchReviewer(brief, projectContext, this.config.specConstraints);
225
+ }
226
+ /**
227
+ * 分发重新审查者子代理(范围限定)
228
+ *
229
+ * 仅审查修复 diff,不重新审查整个任务
230
+ */
231
+ async dispatchReReviewer(brief, openFindings) {
232
+ return this.aiCaller.dispatchReReviewer(brief, openFindings);
233
+ }
234
+ // ============================================================
235
+ // Git 操作 — 委托给 git-ops 模块
236
+ // ============================================================
237
+ /**
238
+ * 获取 HEAD commit SHA
239
+ */
240
+ async getHeadCommit() {
241
+ if (!this.inGitRepo) {
242
+ // 非 Git 环境返回占位 SHA
243
+ return `nosha-${Date.now().toString(36)}`;
244
+ }
245
+ return getHeadCommit();
246
+ }
247
+ /**
248
+ * 生成审查包文件
249
+ *
250
+ * 使用 git diff 生成 Markdown 格式的审查包,
251
+ * 审查者子代理读取文件而非接收上下文注入的 diff。
252
+ */
253
+ async generateReviewPackage(base, head) {
254
+ if (!this.inGitRepo || base === head || base.startsWith('nosha-')) {
255
+ // 非 Git 环境:创建空审查包文件(确保文件存在供下游读取)
256
+ const emptyPath = `${this.config.workspaceDir}/review-empty-${Date.now().toString(36)}.md`;
257
+ writeFileSync(emptyPath, [
258
+ '# 审查包',
259
+ '',
260
+ '> 非 Git 环境 — 无 diff 可用',
261
+ '',
262
+ '## 审查清单',
263
+ '',
264
+ '- [ ] 手动验证实现是否满足任务简报要求',
265
+ '- [ ] 代码质量检查',
266
+ '- [ ] 测试覆盖检查',
267
+ ].join('\n'), 'utf-8');
268
+ return emptyPath;
269
+ }
270
+ return generateReviewPackage(base, head, '', this.config.workspaceDir);
271
+ }
272
+ /**
273
+ * 运行项目测试 — TDD 门控
274
+ *
275
+ * 智能检测并运行项目测试:
276
+ * 1. 优先使用 package.json 中的 test script(支持 npm/yarn/pnpm)
277
+ * 2. 自动检测常见测试框架(vitest, jest, mocha, ava, tape, pytest 等)
278
+ * 3. 如果项目没有测试框架或测试目录,返回 true(不阻塞流程)
279
+ */
280
+ async runTests() {
281
+ // 策略 1: 检测 package.json 中的 test script
282
+ const packageJsonPath = join(process.cwd(), 'package.json');
283
+ if (existsSync(packageJsonPath)) {
284
+ try {
285
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
286
+ if (packageJson.scripts?.test) {
287
+ // 检测包管理器
288
+ const hasYarnLock = existsSync(join(process.cwd(), 'yarn.lock'));
289
+ const hasPnpmLock = existsSync(join(process.cwd(), 'pnpm-lock.yaml'));
290
+ let cmd;
291
+ let args;
292
+ if (hasYarnLock) {
293
+ cmd = 'yarn';
294
+ args = ['test', '--silent'];
295
+ }
296
+ else if (hasPnpmLock) {
297
+ cmd = 'pnpm';
298
+ args = ['test', '--silent'];
299
+ }
300
+ else {
301
+ cmd = 'npm';
302
+ args = ['test', '--silent'];
303
+ }
304
+ try {
305
+ execFileSync(cmd, args, {
306
+ encoding: 'utf-8',
307
+ stdio: ['pipe', 'pipe', 'pipe'],
308
+ timeout: 120_000,
309
+ cwd: process.cwd(),
310
+ });
311
+ return true;
312
+ }
313
+ catch {
314
+ // test script 存在但测试失败
315
+ return false;
316
+ }
317
+ }
318
+ }
319
+ catch {
320
+ // package.json 解析失败,继续其他策略
321
+ }
322
+ }
323
+ // 策略 2: 自动检测常见测试框架
324
+ const testFrameworks = [
325
+ { cmd: 'npx', args: ['vitest', 'run', '--reporter=json'] },
326
+ { cmd: 'npx', args: ['jest', '--json', '--passWithNoTests'] },
327
+ { cmd: 'npx', args: ['mocha', '--reporter', 'json'] },
328
+ { cmd: 'npx', args: ['ava', '--tap'] },
329
+ { cmd: 'npx', args: ['tape', '**/*.test.js'] },
330
+ { cmd: 'python3', args: ['-m', 'pytest', '-q'] },
331
+ { cmd: 'python', args: ['-m', 'pytest', '-q'] },
332
+ ];
333
+ for (const framework of testFrameworks) {
334
+ try {
335
+ execFileSync(framework.cmd, framework.args, {
336
+ encoding: 'utf-8',
337
+ stdio: ['pipe', 'pipe', 'pipe'],
338
+ timeout: 120_000,
339
+ cwd: process.cwd(),
340
+ });
341
+ return true;
342
+ }
343
+ catch {
344
+ // 该框架不存在或测试失败,继续尝试下一个
345
+ }
346
+ }
347
+ // 策略 3: 检查是否有测试目录
348
+ const testDirs = ['test', 'tests', '__tests__', 'src/test', 'src/__tests__'];
349
+ const hasTestDir = testDirs.some(d => existsSync(d));
350
+ if (!hasTestDir) {
351
+ return true; // 无测试目录 — TDD 门控不适用
352
+ }
353
+ // 有测试目录但测试失败
354
+ return false;
355
+ }
356
+ }
357
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/core/sdd-engine/controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * 任务分发器
3
+ *
4
+ * 负责将任务分发给子代理实现者
5
+ * 核心原则:
6
+ * - 每个任务分发一个全新的子代理(上下文隔离)
7
+ * - 分发 prompt 只包含当前任务所需的信息
8
+ * - 不传递历史任务的累积摘要
9
+ *
10
+ * @deprecated 此模块为遗留代码,当前未被任何 CLI 命令使用。
11
+ * 功能已由 SDDController 通过 AICaller 实现。
12
+ * 建议在未来版本中移除此文件,或将其集成到 CLI 命令中。
13
+ */
14
+ import type { TaskBrief, SDDConfig } from './types.js';
15
+ export interface DispatchPrompt {
16
+ taskContext: string;
17
+ briefPath: string;
18
+ reportPath: string;
19
+ interfaces: string;
20
+ resolutions: string;
21
+ specConstraints: string;
22
+ globalConstraints: string;
23
+ }
24
+ export declare class TaskDispatcher {
25
+ private config;
26
+ constructor(config: SDDConfig);
27
+ /**
28
+ * 构建实现者分发 prompt
29
+ *
30
+ * 关键设计:
31
+ * - 简报路径是需求的唯一来源
32
+ * - 不粘贴历史任务摘要
33
+ * - 只传递接口信息和全局约束
34
+ */
35
+ buildImplementerPrompt(brief: TaskBrief, projectContext: string, priorInterfaces: string, specConstraints: string): DispatchPrompt;
36
+ /**
37
+ * 构建修复轮次的分发 prompt
38
+ *
39
+ * Rounds 1-3: 恢复原始实现者(上下文完整)
40
+ * Rounds 4-5: 分发全新实现者,使用更强模型
41
+ */
42
+ buildFixPrompt(brief: TaskBrief, reportPath: string, openFindings: string[], round: number, useFreshAgent: boolean): DispatchPrompt;
43
+ /**
44
+ * 判断是否应该使用全新实现者
45
+ * Rounds 1-3: 恢复原始实现者
46
+ * Rounds 4-5: 全新实现者 + 更强模型
47
+ */
48
+ shouldUseFreshAgent(round: number): boolean;
49
+ /**
50
+ * 获取修复轮次的模型级别
51
+ *
52
+ * @deprecated 此方法引用已废弃的配置字段,不再使用。
53
+ * 模型选择逻辑已移至 ModelSelector 类。
54
+ */
55
+ getFixRoundModel(round: number): string;
56
+ /**
57
+ * 提取全局约束
58
+ *
59
+ * 从项目根目录的约束文件中读取全局编码规范,
60
+ * 这些约束会注入到每个子代理的 prompt 中。
61
+ *
62
+ * 约束来源优先级:
63
+ * 1. .specpow/config.json 中的 globalConstraints 字段
64
+ * 2. CLAUDE.md / AGENTS.md / GEMINI.md 中的编码规范
65
+ * 3. 默认约束
66
+ */
67
+ private extractGlobalConstraints;
68
+ }
69
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/core/sdd-engine/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAI7B;;;;;;;OAOG;IACH,sBAAsB,CACpB,KAAK,EAAE,SAAS,EAChB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,GACtB,cAAc;IAYjB;;;;;OAKG;IACH,cAAc,CACZ,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,GACrB,cAAc;IAgBjB;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;OAKG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQvC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,wBAAwB;CAsEjC"}