@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,613 @@
1
+ /**
2
+ * Channel CLI 命令组
3
+ *
4
+ * 提供多代理协作 Channel 的 CLI 入口:
5
+ * - start/stop 管理 Channel 生命周期
6
+ * - status 查看运行状态
7
+ * - workers 管理 Worker 代理
8
+ * - send 发送消息
9
+ * - tasks 管理任务
10
+ *
11
+ * 状态持久化到 .specpow/channel/state.json
12
+ */
13
+ import chalk from 'chalk';
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
15
+ import { join } from 'path';
16
+ import { DEFAULT_INBOX_STRATEGY, } from '../core/channel/index.js';
17
+ import { successResponse, outputJson, errorResponse } from '../core/agent-contract.js';
18
+ // ─── 状态管理 ────────────────────────────────────────────────
19
+ function getChannelDir(projectRoot) {
20
+ return join(projectRoot, '.specpow', 'channel');
21
+ }
22
+ function getStatePath(projectRoot) {
23
+ return join(getChannelDir(projectRoot), 'state.json');
24
+ }
25
+ function loadState(projectRoot) {
26
+ const statePath = getStatePath(projectRoot);
27
+ if (!existsSync(statePath)) {
28
+ return null;
29
+ }
30
+ try {
31
+ return JSON.parse(readFileSync(statePath, 'utf-8'));
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ function saveState(projectRoot, state) {
38
+ const channelDir = getChannelDir(projectRoot);
39
+ if (!existsSync(channelDir)) {
40
+ mkdirSync(channelDir, { recursive: true });
41
+ }
42
+ writeFileSync(getStatePath(projectRoot), JSON.stringify(state, null, 2), 'utf-8');
43
+ }
44
+ function generateId(state) {
45
+ state.nextId++;
46
+ return `${Date.now()}_${state.nextId}`;
47
+ }
48
+ function logEvent(state, type, data, agentId) {
49
+ state.events.push({
50
+ id: generateId(state),
51
+ timestamp: Date.now(),
52
+ type,
53
+ data,
54
+ agentId,
55
+ });
56
+ // 限制事件数量
57
+ if (state.events.length > 10000) {
58
+ state.events = state.events.slice(-10000);
59
+ }
60
+ }
61
+ // ─── start 命令 ──────────────────────────────────────────────
62
+ export async function channelStart(name, options) {
63
+ const projectRoot = process.cwd();
64
+ const jsonMode = options.json ?? false;
65
+ // 检查是否已有运行中的 channel
66
+ const existing = loadState(projectRoot);
67
+ if (existing?.running) {
68
+ if (jsonMode) {
69
+ outputJson(errorResponse('Channel 已在运行中', 'CHANNEL_ALREADY_RUNNING', '先执行 specpow channel stop'));
70
+ }
71
+ else {
72
+ console.log(chalk.yellow(`Channel "${existing.config.name}" 已在运行中。`));
73
+ console.log(chalk.dim('使用 "specpow channel stop" 先停止。'));
74
+ }
75
+ return;
76
+ }
77
+ const maxAgents = parseInt(options.maxAgents || '10', 10);
78
+ const config = {
79
+ name,
80
+ maxAgents,
81
+ inboxStrategy: { ...DEFAULT_INBOX_STRATEGY },
82
+ enableEventLog: true,
83
+ eventLogPath: join(getChannelDir(projectRoot), 'events.json'),
84
+ };
85
+ const state = {
86
+ config,
87
+ running: true,
88
+ startedAt: Date.now(),
89
+ agents: [],
90
+ tasks: [],
91
+ messages: [],
92
+ events: [],
93
+ nextId: 0,
94
+ };
95
+ logEvent(state, 'channel_started', { name });
96
+ saveState(projectRoot, state);
97
+ if (jsonMode) {
98
+ outputJson(successResponse({
99
+ channel: name,
100
+ maxAgents,
101
+ startedAt: state.startedAt,
102
+ }));
103
+ }
104
+ else {
105
+ console.log(chalk.green(`\n✅ Channel "${chalk.bold(name)}" 已启动\n`));
106
+ console.log(` 最大代理数: ${chalk.bold(String(maxAgents))}`);
107
+ console.log(` 状态目录: ${chalk.dim(getChannelDir(projectRoot))}`);
108
+ console.log('');
109
+ }
110
+ }
111
+ // ─── status 命令 ─────────────────────────────────────────────
112
+ export async function channelStatus(options) {
113
+ const projectRoot = process.cwd();
114
+ const jsonMode = options.json ?? false;
115
+ const state = loadState(projectRoot);
116
+ if (!state) {
117
+ if (jsonMode) {
118
+ outputJson(errorResponse('未找到 Channel 状态', 'CHANNEL_NOT_FOUND', '先执行 specpow channel start <name>'));
119
+ }
120
+ else {
121
+ console.log(chalk.yellow('未找到 Channel。使用 "specpow channel start <name>" 创建。'));
122
+ }
123
+ return;
124
+ }
125
+ // 计算状态
126
+ const pendingMessages = state.messages.filter(m => state.agents.some(a => a.id === m.to)).length;
127
+ const activeTasks = state.tasks.filter(t => t.status === 'in_progress' || t.status === 'assigned' || t.status === 'pending').length;
128
+ const completedTasks = state.tasks.filter(t => t.status === 'completed').length;
129
+ const status = {
130
+ name: state.config.name,
131
+ running: state.running,
132
+ agentCount: state.agents.length,
133
+ pendingMessages,
134
+ activeTasks,
135
+ completedTasks,
136
+ startedAt: state.startedAt,
137
+ };
138
+ if (jsonMode) {
139
+ outputJson(successResponse(status));
140
+ return;
141
+ }
142
+ console.log(chalk.cyan('\n📊 Channel 状态\n'));
143
+ const runIcon = state.running ? chalk.green('●') : chalk.red('○');
144
+ console.log(` ${runIcon} ${chalk.bold(state.config.name)}`);
145
+ console.log(` 状态: ${state.running ? chalk.green('运行中') : chalk.red('已停止')}`);
146
+ console.log(` 代理数: ${chalk.bold(String(state.agents.length))} / ${state.config.maxAgents}`);
147
+ console.log(` 消息: ${chalk.bold(String(pendingMessages))} 条待处理`);
148
+ console.log(` 任务: ${chalk.bold(String(activeTasks))} 活跃 / ${chalk.bold(String(completedTasks))} 完成`);
149
+ if (state.startedAt) {
150
+ const uptime = Date.now() - state.startedAt;
151
+ const minutes = Math.floor(uptime / 60000);
152
+ const hours = Math.floor(minutes / 60);
153
+ if (hours > 0) {
154
+ console.log(` 运行时间: ${hours}h ${minutes % 60}m`);
155
+ }
156
+ else {
157
+ console.log(` 运行时间: ${minutes}m`);
158
+ }
159
+ }
160
+ // 最近事件
161
+ const recentEvents = state.events.slice(-5);
162
+ if (recentEvents.length > 0) {
163
+ console.log(`\n ${chalk.dim('最近事件:')}`);
164
+ for (const event of recentEvents) {
165
+ const time = new Date(event.timestamp).toLocaleTimeString();
166
+ console.log(` ${chalk.dim(time)} ${event.type}`);
167
+ }
168
+ }
169
+ console.log('');
170
+ }
171
+ // ─── workers 命令 ────────────────────────────────────────────
172
+ export async function channelWorkers(options) {
173
+ const projectRoot = process.cwd();
174
+ const jsonMode = options.json ?? false;
175
+ const state = loadState(projectRoot);
176
+ if (!state) {
177
+ if (jsonMode) {
178
+ outputJson(errorResponse('未找到 Channel', 'CHANNEL_NOT_FOUND', '先执行 specpow channel start <name>'));
179
+ }
180
+ else {
181
+ console.log(chalk.yellow('未找到 Channel。使用 "specpow channel start <name>" 创建。'));
182
+ }
183
+ return;
184
+ }
185
+ if (jsonMode) {
186
+ outputJson(successResponse({
187
+ workers: state.agents,
188
+ total: state.agents.length,
189
+ }));
190
+ return;
191
+ }
192
+ console.log(chalk.cyan('\n👷 Channel Workers\n'));
193
+ if (state.agents.length === 0) {
194
+ console.log(chalk.dim(' 暂无注册的 Worker。'));
195
+ console.log(chalk.dim(' 使用 "specpow channel workers add <id> <name>" 添加。'));
196
+ }
197
+ else {
198
+ for (const agent of state.agents) {
199
+ const statusIcon = agent.status === 'idle' ? chalk.green('●') :
200
+ agent.status === 'busy' ? chalk.yellow('◐') :
201
+ agent.status === 'waiting' ? chalk.blue('◑') :
202
+ chalk.red('○');
203
+ console.log(` ${statusIcon} ${chalk.bold(agent.name)} (${agent.id})`);
204
+ console.log(` 角色: ${agent.role} 状态: ${agent.status}`);
205
+ }
206
+ }
207
+ console.log('');
208
+ }
209
+ // ─── workers add 子命令 ──────────────────────────────────────
210
+ export async function channelWorkersAdd(id, name, options) {
211
+ const projectRoot = process.cwd();
212
+ const jsonMode = options.json ?? false;
213
+ const state = loadState(projectRoot);
214
+ if (!state || !state.running) {
215
+ const msg = !state ? '未找到 Channel' : 'Channel 未运行';
216
+ if (jsonMode) {
217
+ outputJson(errorResponse(msg, 'CHANNEL_NOT_RUNNING', '先执行 specpow channel start <name>'));
218
+ }
219
+ else {
220
+ console.log(chalk.yellow(`${msg}。使用 "specpow channel start <name>" 启动。`));
221
+ }
222
+ return;
223
+ }
224
+ // 检查最大代理数
225
+ if (state.agents.length >= state.config.maxAgents) {
226
+ const msg = `已达最大代理数 (${state.config.maxAgents})`;
227
+ if (jsonMode) {
228
+ outputJson(errorResponse(msg, 'MAX_AGENTS_REACHED'));
229
+ }
230
+ else {
231
+ console.log(chalk.red(msg));
232
+ }
233
+ return;
234
+ }
235
+ // 检查 ID 是否已存在
236
+ if (state.agents.some(a => a.id === id)) {
237
+ const msg = `Worker "${id}" 已存在`;
238
+ if (jsonMode) {
239
+ outputJson(errorResponse(msg, 'WORKER_EXISTS'));
240
+ }
241
+ else {
242
+ console.log(chalk.red(msg));
243
+ }
244
+ return;
245
+ }
246
+ const role = (options.role || 'worker');
247
+ const validRoles = ['supervisor', 'worker', 'reviewer', 'specialist'];
248
+ if (!validRoles.includes(role)) {
249
+ const msg = `无效角色 "${role}",可选: ${validRoles.join(', ')}`;
250
+ if (jsonMode) {
251
+ outputJson(errorResponse(msg, 'INVALID_ROLE'));
252
+ }
253
+ else {
254
+ console.log(chalk.red(msg));
255
+ }
256
+ return;
257
+ }
258
+ const agent = {
259
+ id,
260
+ name,
261
+ role,
262
+ createdAt: Date.now(),
263
+ lastActiveAt: Date.now(),
264
+ status: 'idle',
265
+ };
266
+ state.agents.push(agent);
267
+ logEvent(state, 'agent_joined', { agentId: id, role }, id);
268
+ saveState(projectRoot, state);
269
+ if (jsonMode) {
270
+ outputJson(successResponse({ agent }));
271
+ }
272
+ else {
273
+ console.log(chalk.green(`\n✅ Worker "${chalk.bold(name)}" (${id}) 已加入 Channel\n`));
274
+ console.log(` 角色: ${role} 状态: idle`);
275
+ console.log('');
276
+ }
277
+ }
278
+ // ─── workers remove 子命令 ───────────────────────────────────
279
+ export async function channelWorkersRemove(id, options) {
280
+ const projectRoot = process.cwd();
281
+ const jsonMode = options.json ?? false;
282
+ const state = loadState(projectRoot);
283
+ if (!state) {
284
+ if (jsonMode) {
285
+ outputJson(errorResponse('未找到 Channel', 'CHANNEL_NOT_FOUND'));
286
+ }
287
+ else {
288
+ console.log(chalk.yellow('未找到 Channel。'));
289
+ }
290
+ return;
291
+ }
292
+ const index = state.agents.findIndex(a => a.id === id);
293
+ if (index === -1) {
294
+ const msg = `Worker "${id}" 不存在`;
295
+ if (jsonMode) {
296
+ outputJson(errorResponse(msg, 'WORKER_NOT_FOUND'));
297
+ }
298
+ else {
299
+ console.log(chalk.red(msg));
300
+ }
301
+ return;
302
+ }
303
+ const removed = state.agents.splice(index, 1)[0];
304
+ logEvent(state, 'agent_left', { agentId: id }, id);
305
+ saveState(projectRoot, state);
306
+ if (jsonMode) {
307
+ outputJson(successResponse({ removed }));
308
+ }
309
+ else {
310
+ console.log(chalk.green(`\n✅ Worker "${chalk.bold(removed.name)}" (${id}) 已移除\n`));
311
+ }
312
+ }
313
+ // ─── send 命令 ───────────────────────────────────────────────
314
+ export async function channelSend(target, message, options) {
315
+ const projectRoot = process.cwd();
316
+ const jsonMode = options.json ?? false;
317
+ const state = loadState(projectRoot);
318
+ if (!state || !state.running) {
319
+ const msg = !state ? '未找到 Channel' : 'Channel 未运行';
320
+ if (jsonMode) {
321
+ outputJson(errorResponse(msg, 'CHANNEL_NOT_RUNNING'));
322
+ }
323
+ else {
324
+ console.log(chalk.yellow(`${msg}。`));
325
+ }
326
+ return;
327
+ }
328
+ const msgType = (options.type || 'broadcast');
329
+ const priority = (options.priority || 'medium');
330
+ // 确定接收者
331
+ let to = null;
332
+ if (target !== 'all') {
333
+ const agent = state.agents.find(a => a.id === target);
334
+ if (!agent) {
335
+ const msg = `目标 "${target}" 不存在。使用 "specpow channel workers" 查看可用 Worker。`;
336
+ if (jsonMode) {
337
+ outputJson(errorResponse(msg, 'TARGET_NOT_FOUND'));
338
+ }
339
+ else {
340
+ console.log(chalk.red(msg));
341
+ }
342
+ return;
343
+ }
344
+ to = target;
345
+ }
346
+ const channelMsg = {
347
+ id: generateId(state),
348
+ timestamp: Date.now(),
349
+ from: 'cli-user',
350
+ to,
351
+ type: msgType,
352
+ content: message,
353
+ metadata: {
354
+ priority: (priority || 'medium'),
355
+ },
356
+ };
357
+ state.messages.push(channelMsg);
358
+ logEvent(state, 'message_sent', {
359
+ messageId: channelMsg.id,
360
+ from: 'cli-user',
361
+ to,
362
+ type: msgType,
363
+ });
364
+ saveState(projectRoot, state);
365
+ if (jsonMode) {
366
+ outputJson(successResponse({
367
+ messageId: channelMsg.id,
368
+ to: to || 'all',
369
+ type: msgType,
370
+ }));
371
+ }
372
+ else {
373
+ const targetLabel = to ? chalk.bold(to) : chalk.bold('all (广播)');
374
+ console.log(chalk.green(`\n✅ 消息已发送 → ${targetLabel}\n`));
375
+ console.log(` 类型: ${msgType} 优先级: ${priority || 'medium'}`);
376
+ console.log(` 内容: ${chalk.dim(message)}`);
377
+ console.log('');
378
+ }
379
+ }
380
+ // ─── tasks 命令 ──────────────────────────────────────────────
381
+ export async function channelTasks(options) {
382
+ const projectRoot = process.cwd();
383
+ const jsonMode = options.json ?? false;
384
+ const state = loadState(projectRoot);
385
+ if (!state) {
386
+ if (jsonMode) {
387
+ outputJson(errorResponse('未找到 Channel', 'CHANNEL_NOT_FOUND'));
388
+ }
389
+ else {
390
+ console.log(chalk.yellow('未找到 Channel。'));
391
+ }
392
+ return;
393
+ }
394
+ if (jsonMode) {
395
+ outputJson(successResponse({
396
+ tasks: state.tasks,
397
+ total: state.tasks.length,
398
+ }));
399
+ return;
400
+ }
401
+ console.log(chalk.cyan('\n📋 Channel 任务\n'));
402
+ if (state.tasks.length === 0) {
403
+ console.log(chalk.dim(' 暂无任务。'));
404
+ console.log(chalk.dim(' 使用 "specpow channel tasks create --assignee <id> --description <desc>" 创建。'));
405
+ }
406
+ else {
407
+ // 按状态分组
408
+ const grouped = {};
409
+ for (const task of state.tasks) {
410
+ if (!grouped[task.status]) {
411
+ grouped[task.status] = [];
412
+ }
413
+ grouped[task.status].push(task);
414
+ }
415
+ const statusLabels = {
416
+ pending: chalk.yellow('待处理'),
417
+ assigned: chalk.blue('已分配'),
418
+ in_progress: chalk.cyan('进行中'),
419
+ completed: chalk.green('已完成'),
420
+ failed: chalk.red('已失败'),
421
+ cancelled: chalk.dim('已取消'),
422
+ };
423
+ for (const [status, tasks] of Object.entries(grouped)) {
424
+ console.log(` ${statusLabels[status] || status} (${tasks.length}):`);
425
+ for (const task of tasks) {
426
+ const assignee = state.agents.find(a => a.id === task.assignee);
427
+ const assigneeName = assignee?.name || task.assignee;
428
+ console.log(` - [${task.id}] ${task.description}`);
429
+ console.log(` 分配给: ${assigneeName} 创建者: ${task.creator}`);
430
+ if (task.result) {
431
+ console.log(` 结果: ${chalk.dim(JSON.stringify(task.result))}`);
432
+ }
433
+ }
434
+ console.log('');
435
+ }
436
+ }
437
+ console.log('');
438
+ }
439
+ // ─── tasks create 子命令 ─────────────────────────────────────
440
+ export async function channelTasksCreate(options) {
441
+ const projectRoot = process.cwd();
442
+ const jsonMode = options.json ?? false;
443
+ const state = loadState(projectRoot);
444
+ if (!state || !state.running) {
445
+ const msg = !state ? '未找到 Channel' : 'Channel 未运行';
446
+ if (jsonMode) {
447
+ outputJson(errorResponse(msg, 'CHANNEL_NOT_RUNNING'));
448
+ }
449
+ else {
450
+ console.log(chalk.yellow(`${msg}。`));
451
+ }
452
+ return;
453
+ }
454
+ // 检查 assignee 是否存在
455
+ const assignee = state.agents.find(a => a.id === options.assignee);
456
+ if (!assignee) {
457
+ const msg = `分配目标 "${options.assignee}" 不存在`;
458
+ if (jsonMode) {
459
+ outputJson(errorResponse(msg, 'ASSIGNEE_NOT_FOUND'));
460
+ }
461
+ else {
462
+ console.log(chalk.red(msg));
463
+ console.log(chalk.dim('使用 "specpow channel workers" 查看可用 Worker。'));
464
+ }
465
+ return;
466
+ }
467
+ const task = {
468
+ id: generateId(state),
469
+ description: options.description,
470
+ assignee: options.assignee,
471
+ creator: 'cli-user',
472
+ createdAt: Date.now(),
473
+ status: 'pending',
474
+ content: { description: options.description },
475
+ };
476
+ state.tasks.push(task);
477
+ // 发送任务分配消息
478
+ const assignMsg = {
479
+ id: generateId(state),
480
+ timestamp: Date.now(),
481
+ from: 'cli-user',
482
+ to: options.assignee,
483
+ type: 'task_assign',
484
+ content: { taskId: task.id, description: options.description },
485
+ metadata: { taskId: task.id, priority: 'medium' },
486
+ };
487
+ state.messages.push(assignMsg);
488
+ logEvent(state, 'task_created', { taskId: task.id, assignee: options.assignee });
489
+ saveState(projectRoot, state);
490
+ if (jsonMode) {
491
+ outputJson(successResponse({ task }));
492
+ }
493
+ else {
494
+ console.log(chalk.green(`\n✅ 任务已创建\n`));
495
+ console.log(` ID: ${task.id}`);
496
+ console.log(` 描述: ${task.description}`);
497
+ console.log(` 分配给: ${assignee.name} (${assignee.id})`);
498
+ console.log('');
499
+ }
500
+ }
501
+ // ─── tasks update 子命令 ─────────────────────────────────────
502
+ export async function channelTasksUpdate(taskId, options) {
503
+ const projectRoot = process.cwd();
504
+ const jsonMode = options.json ?? false;
505
+ const state = loadState(projectRoot);
506
+ if (!state) {
507
+ if (jsonMode) {
508
+ outputJson(errorResponse('未找到 Channel', 'CHANNEL_NOT_FOUND'));
509
+ }
510
+ else {
511
+ console.log(chalk.yellow('未找到 Channel。'));
512
+ }
513
+ return;
514
+ }
515
+ const task = state.tasks.find(t => t.id === taskId);
516
+ if (!task) {
517
+ const msg = `任务 "${taskId}" 不存在`;
518
+ if (jsonMode) {
519
+ outputJson(errorResponse(msg, 'TASK_NOT_FOUND'));
520
+ }
521
+ else {
522
+ console.log(chalk.red(msg));
523
+ }
524
+ return;
525
+ }
526
+ const validStatuses = ['pending', 'assigned', 'in_progress', 'completed', 'failed', 'cancelled'];
527
+ const newStatus = options.status;
528
+ if (!validStatuses.includes(newStatus)) {
529
+ const msg = `无效状态 "${options.status}",可选: ${validStatuses.join(', ')}`;
530
+ if (jsonMode) {
531
+ outputJson(errorResponse(msg, 'INVALID_STATUS'));
532
+ }
533
+ else {
534
+ console.log(chalk.red(msg));
535
+ }
536
+ return;
537
+ }
538
+ const oldStatus = task.status;
539
+ task.status = newStatus;
540
+ if (newStatus === 'in_progress' && !task.startedAt) {
541
+ task.startedAt = Date.now();
542
+ }
543
+ if (newStatus === 'completed' || newStatus === 'failed') {
544
+ task.completedAt = Date.now();
545
+ }
546
+ if (options.result) {
547
+ try {
548
+ task.result = JSON.parse(options.result);
549
+ }
550
+ catch {
551
+ task.result = options.result;
552
+ }
553
+ }
554
+ const eventType = newStatus === 'completed' ? 'task_completed' :
555
+ newStatus === 'failed' ? 'task_failed' :
556
+ 'task_updated';
557
+ logEvent(state, eventType, { taskId, status: newStatus, oldStatus }, task.assignee);
558
+ saveState(projectRoot, state);
559
+ if (jsonMode) {
560
+ outputJson(successResponse({ task }));
561
+ }
562
+ else {
563
+ console.log(chalk.green(`\n✅ 任务状态已更新\n`));
564
+ console.log(` ID: ${taskId}`);
565
+ console.log(` 状态: ${oldStatus} → ${newStatus}`);
566
+ console.log('');
567
+ }
568
+ }
569
+ // ─── stop 命令 ───────────────────────────────────────────────
570
+ export async function channelStop(options) {
571
+ const projectRoot = process.cwd();
572
+ const jsonMode = options.json ?? false;
573
+ const state = loadState(projectRoot);
574
+ if (!state) {
575
+ if (jsonMode) {
576
+ outputJson(errorResponse('未找到 Channel', 'CHANNEL_NOT_FOUND'));
577
+ }
578
+ else {
579
+ console.log(chalk.yellow('未找到 Channel。'));
580
+ }
581
+ return;
582
+ }
583
+ if (!state.running) {
584
+ if (jsonMode) {
585
+ outputJson(errorResponse('Channel 已经停止', 'CHANNEL_ALREADY_STOPPED'));
586
+ }
587
+ else {
588
+ console.log(chalk.yellow('Channel 已经停止。'));
589
+ }
590
+ return;
591
+ }
592
+ state.running = false;
593
+ logEvent(state, 'channel_stopped', { name: state.config.name });
594
+ saveState(projectRoot, state);
595
+ if (jsonMode) {
596
+ outputJson(successResponse({
597
+ channel: state.config.name,
598
+ stoppedAt: Date.now(),
599
+ summary: {
600
+ totalAgents: state.agents.length,
601
+ totalTasks: state.tasks.length,
602
+ completedTasks: state.tasks.filter(t => t.status === 'completed').length,
603
+ totalEvents: state.events.length,
604
+ },
605
+ }));
606
+ }
607
+ else {
608
+ console.log(chalk.green(`\n✅ Channel "${chalk.bold(state.config.name)}" 已停止\n`));
609
+ console.log(` 代理: ${state.agents.length} 任务: ${state.tasks.length} 事件: ${state.events.length}`);
610
+ console.log('');
611
+ }
612
+ }
613
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"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"}