maestro-flow 0.3.15 → 0.3.16

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 (374) hide show
  1. package/.claude/commands/maestro-amend.md +300 -0
  2. package/.claude/commands/maestro-analyze.md +1 -49
  3. package/.claude/commands/maestro-execute.md +2 -56
  4. package/.claude/commands/maestro-fork.md +3 -50
  5. package/.claude/commands/maestro-merge.md +2 -26
  6. package/.claude/commands/maestro-milestone-audit.md +1 -5
  7. package/.claude/commands/maestro-milestone-complete.md +1 -7
  8. package/.claude/commands/maestro-plan.md +6 -127
  9. package/.claude/commands/maestro-roadmap.md +3 -101
  10. package/.claude/commands/maestro-spec-generate.md +1 -25
  11. package/.claude/commands/maestro-ui-design.md +14 -73
  12. package/.claude/commands/maestro-verify.md +1 -32
  13. package/.claude/commands/maestro.md +13 -30
  14. package/.claude/commands/manage-harvest.md +7 -44
  15. package/.claude/commands/manage-knowhow-capture.md +193 -0
  16. package/.claude/commands/{manage-memory.md → manage-knowhow.md} +77 -88
  17. package/.claude/commands/manage-learn.md +3 -28
  18. package/.claude/commands/manage-status.md +1 -20
  19. package/.claude/commands/manage-wiki.md +1 -1
  20. package/.claude/commands/quality-business-test.md +1 -1
  21. package/.claude/commands/quality-debug.md +3 -18
  22. package/.claude/commands/quality-integration-test.md +3 -23
  23. package/.claude/commands/quality-retrospective.md +1 -28
  24. package/.claude/commands/quality-review.md +3 -52
  25. package/.claude/commands/quality-test-gen.md +1 -10
  26. package/.claude/commands/quality-test.md +3 -25
  27. package/.claude/commands/spec-add.md +1 -21
  28. package/.claude/commands/spec-load.md +1 -16
  29. package/.claude/commands/wiki-connect.md +2 -112
  30. package/.claude/commands/wiki-digest.md +2 -141
  31. package/.codex/skills/learn-decompose/SKILL.md +2 -8
  32. package/.codex/skills/maestro/SKILL.md +60 -146
  33. package/.codex/skills/maestro-analyze/SKILL.md +52 -150
  34. package/.codex/skills/maestro-brainstorm/SKILL.md +36 -91
  35. package/.codex/skills/maestro-composer/SKILL.md +4 -76
  36. package/.codex/skills/maestro-execute/SKILL.md +46 -177
  37. package/.codex/skills/maestro-init/SKILL.md +7 -51
  38. package/.codex/skills/maestro-link-coordinate/SKILL.md +56 -229
  39. package/.codex/skills/maestro-milestone-audit/SKILL.md +7 -36
  40. package/.codex/skills/maestro-milestone-complete/SKILL.md +11 -93
  41. package/.codex/skills/maestro-overlay/SKILL.md +23 -92
  42. package/.codex/skills/maestro-plan/SKILL.md +42 -166
  43. package/.codex/skills/maestro-player/SKILL.md +24 -149
  44. package/.codex/skills/maestro-quick/SKILL.md +5 -48
  45. package/.codex/skills/maestro-roadmap/SKILL.md +21 -66
  46. package/.codex/skills/maestro-spec-generate/SKILL.md +20 -56
  47. package/.codex/skills/maestro-ui-design/SKILL.md +6 -53
  48. package/.codex/skills/maestro-verify/SKILL.md +39 -136
  49. package/.codex/skills/manage-codebase-rebuild/SKILL.md +25 -75
  50. package/.codex/skills/manage-codebase-refresh/SKILL.md +5 -32
  51. package/.codex/skills/manage-issue/SKILL.md +1 -6
  52. package/.codex/skills/manage-issue-discover/SKILL.md +33 -93
  53. package/.codex/skills/{manage-memory → manage-knowhow}/SKILL.md +95 -95
  54. package/.codex/skills/manage-knowhow-capture/SKILL.md +110 -0
  55. package/.codex/skills/manage-learn/SKILL.md +17 -71
  56. package/.codex/skills/manage-status/SKILL.md +4 -35
  57. package/.codex/skills/manage-wiki/SKILL.md +1 -1
  58. package/.codex/skills/quality-business-test/SKILL.md +2 -14
  59. package/.codex/skills/quality-debug/SKILL.md +41 -133
  60. package/.codex/skills/quality-integration-test/SKILL.md +36 -145
  61. package/.codex/skills/quality-refactor/SKILL.md +6 -59
  62. package/.codex/skills/quality-retrospective/SKILL.md +292 -531
  63. package/.codex/skills/quality-review/SKILL.md +30 -65
  64. package/.codex/skills/quality-sync/SKILL.md +2 -11
  65. package/.codex/skills/quality-test/SKILL.md +4 -45
  66. package/.codex/skills/quality-test-gen/SKILL.md +33 -121
  67. package/.codex/skills/spec-add/SKILL.md +2 -9
  68. package/.codex/skills/spec-load/SKILL.md +4 -14
  69. package/.codex/skills/spec-map/SKILL.md +4 -37
  70. package/.codex/skills/spec-remove/SKILL.md +3 -35
  71. package/.codex/skills/spec-setup/SKILL.md +2 -19
  72. package/.codex/skills/team-coordinate/SKILL.md +20 -132
  73. package/.codex/skills/team-coordinate/roles/coordinator/commands/monitor.md +61 -215
  74. package/.codex/skills/team-executor/SKILL.md +7 -66
  75. package/.codex/skills/team-executor/roles/executor/commands/monitor.md +60 -182
  76. package/.codex/skills/team-executor/specs/session-schema.md +22 -56
  77. package/.codex/skills/team-lifecycle-v4/SKILL.md +22 -143
  78. package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +31 -223
  79. package/.codex/skills/team-quality-assurance/SKILL.md +14 -88
  80. package/.codex/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +46 -186
  81. package/.codex/skills/team-review/SKILL.md +12 -86
  82. package/.codex/skills/team-review/roles/coordinator/commands/monitor.md +49 -187
  83. package/.codex/skills/team-tech-debt/SKILL.md +11 -50
  84. package/.codex/skills/team-tech-debt/roles/coordinator/commands/monitor.md +50 -239
  85. package/.codex/skills/team-testing/SKILL.md +14 -99
  86. package/.codex/skills/team-testing/roles/coordinator/commands/monitor.md +52 -228
  87. package/.codex/skills/wiki-connect/SKILL.md +2 -5
  88. package/README.md +6 -0
  89. package/README.zh-CN.md +6 -0
  90. package/chains/_intent-map.json +7 -7
  91. package/chains/singles/{memory-capture.json → knowhow-capture.json} +5 -5
  92. package/chains/singles/{memory.json → knowhow.json} +6 -6
  93. package/dashboard/dist/assets/{ArtifactsPage-CUrrDGgN.js → ArtifactsPage-iJZtYsmR.js} +6 -6
  94. package/dashboard/dist/assets/ChatInput-DNnDLdQF.js +6 -0
  95. package/dashboard/dist/assets/ChatPage-BjBibfE4.js +22 -0
  96. package/dashboard/dist/assets/{CollabPage-DIUXeazv.js → CollabPage-8lUMUol_.js} +1 -1
  97. package/dashboard/dist/assets/{ExecutionPanel-VmYeADFj.js → ExecutionPanel-BKV3GZ7Q.js} +1 -1
  98. package/dashboard/dist/assets/{KanbanPage-DLq8v7hg.js → KanbanPage-diY3QmGd.js} +2 -2
  99. package/dashboard/dist/assets/{MarkdownRenderer-D7AehrnR.js → MarkdownRenderer-cYFfe1uX.js} +1 -1
  100. package/dashboard/dist/assets/McpPage-COjuIf7U.js +21 -0
  101. package/dashboard/dist/assets/MeetingRoomPage-wnvT7wlB.js +85 -0
  102. package/dashboard/dist/assets/{OutputPanel-B-Rjwgmv.js → OutputPanel-DDL90Idy.js} +1 -1
  103. package/dashboard/dist/assets/{ProblemsPanel-GEpF-oi4.js → ProblemsPanel-zFN9IIs0.js} +1 -1
  104. package/dashboard/dist/assets/{RequirementBoardPage-xs8uDM7I.js → RequirementBoardPage-DOPJoT0I.js} +2 -2
  105. package/dashboard/dist/assets/{RequirementPage-BKDSFwjA.js → RequirementPage-CEVquRgM.js} +1 -1
  106. package/dashboard/dist/assets/RoomsPage-D5USEWDh.js +1 -0
  107. package/dashboard/dist/assets/{SpecsPage-DLFb9ZH0.js → SpecsPage-BOwBin_o.js} +1 -1
  108. package/dashboard/dist/assets/{SupervisorPage-SOki_kgz.js → SupervisorPage-5iRyMU5T.js} +1 -1
  109. package/dashboard/dist/assets/TeamsPage-DlcEmr_Q.js +1 -0
  110. package/dashboard/dist/assets/{TreeBrowser-B9DHdULE.js → TreeBrowser-Y48Wz-QY.js} +1 -1
  111. package/dashboard/dist/assets/WorkflowPage-CmQaRVgL.js +6 -0
  112. package/dashboard/dist/assets/arrow-left-NCUOENvg.js +6 -0
  113. package/dashboard/dist/assets/{check-DJDk3A2a.js → check-o7nfGNHf.js} +1 -1
  114. package/dashboard/dist/assets/{chevron-right-C7bVDreZ.js → chevron-right-BXySK2fn.js} +1 -1
  115. package/dashboard/dist/assets/{circle-alert-Na1vf6qQ.js → circle-alert-DcSBokh4.js} +1 -1
  116. package/dashboard/dist/assets/{circle-check-CEGgy3NV.js → circle-check-Cd-jce4j.js} +1 -1
  117. package/dashboard/dist/assets/{circle-check-big-3JB8zRYj.js → circle-check-big-BN7Mdp4i.js} +1 -1
  118. package/dashboard/dist/assets/{circle-Qfgy4LB_.js → circle-cooAwnAR.js} +1 -1
  119. package/dashboard/dist/assets/{code-Ble63Idz.js → code-BQa9oL1n.js} +1 -1
  120. package/dashboard/dist/assets/{columns-3-BUcKlxve.js → columns-3-BzgxelGx.js} +1 -1
  121. package/dashboard/dist/assets/{download-CMqkfn8x.js → download-swRJnate.js} +1 -1
  122. package/dashboard/dist/assets/en-C_BD3UCD.js +1 -0
  123. package/dashboard/dist/assets/{folder-B9ewx9LL.js → folder-DbGbLNFN.js} +1 -1
  124. package/dashboard/dist/assets/index-BEUaOz_b.css +1 -0
  125. package/dashboard/dist/assets/{index-JTmGteaT.js → index-DIoMBMbv.js} +1 -1
  126. package/dashboard/dist/assets/index-DLBN_7fb.js +44 -0
  127. package/dashboard/dist/assets/index-uIqUCT8y.js +236 -0
  128. package/dashboard/dist/assets/{list-DI8Wn2aT.js → list-BTRAIvDq.js} +1 -1
  129. package/dashboard/dist/assets/loader-NHtB6Mdn.js +6 -0
  130. package/dashboard/dist/assets/{minus-Lp_BfctG.js → minus-BjMxRTET.js} +1 -1
  131. package/dashboard/dist/assets/{pen-line-Ch7sphzZ.js → pen-line-C4_O16H0.js} +1 -1
  132. package/dashboard/dist/assets/{pencil-_yRMHmGT.js → pencil-DTmKhyDY.js} +1 -1
  133. package/dashboard/dist/assets/{proxy-D72Y8a4Y.js → proxy-Dtx5p6IO.js} +1 -1
  134. package/dashboard/dist/assets/rows-2-GR1dZtRu.js +6 -0
  135. package/dashboard/dist/assets/{search-BS6fI6Bg.js → search-DVtgy2W7.js} +1 -1
  136. package/dashboard/dist/assets/{shallow-BXasQBvr.js → shallow-BOmvDNsv.js} +1 -1
  137. package/dashboard/dist/assets/{table-CeGlFjlP.js → table-DCzuJAFh.js} +1 -1
  138. package/dashboard/dist/assets/team-types-BPeOvVdA.js +6 -0
  139. package/dashboard/dist/assets/{terminal-BJic2yW-.js → terminal-CzogW4cl.js} +1 -1
  140. package/dashboard/dist/assets/{trash-2-Czz4X8Fb.js → trash-2-52LATVfW.js} +1 -1
  141. package/dashboard/dist/assets/users-DLFE2voE.js +6 -0
  142. package/dashboard/dist/assets/{zap-C3H0jVFA.js → zap-DhiYlgyZ.js} +1 -1
  143. package/dashboard/dist/assets/zh-CN-DvQKfow3.js +1 -0
  144. package/dashboard/dist/index.html +2 -2
  145. package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.d.ts +2 -0
  146. package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js +19 -11
  147. package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js.map +1 -1
  148. package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.js +5 -0
  149. package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.js.map +1 -1
  150. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.d.ts +1 -0
  151. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +21 -4
  152. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
  153. package/dashboard/dist-server/dashboard/src/server/agents/env-cleanup.js +8 -0
  154. package/dashboard/dist-server/dashboard/src/server/agents/env-cleanup.js.map +1 -1
  155. package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js +6 -6
  156. package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js.map +1 -1
  157. package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.test.js +2 -2
  158. package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.test.js.map +1 -1
  159. package/dashboard/dist-server/dashboard/src/server/index.js +14 -3
  160. package/dashboard/dist-server/dashboard/src/server/index.js.map +1 -1
  161. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.d.ts +24 -0
  162. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.js +220 -0
  163. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.js.map +1 -0
  164. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.d.ts +1 -0
  165. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.js +115 -0
  166. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.js.map +1 -0
  167. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.d.ts +44 -0
  168. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.js +260 -0
  169. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.js.map +1 -0
  170. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.d.ts +1 -0
  171. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.js +194 -0
  172. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.js.map +1 -0
  173. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.d.ts +2 -0
  174. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.js +279 -0
  175. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.js.map +1 -0
  176. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.d.ts +14 -0
  177. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.js +131 -0
  178. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.js.map +1 -0
  179. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.d.ts +1 -0
  180. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.js +134 -0
  181. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.js.map +1 -0
  182. package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.d.ts +51 -0
  183. package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.js +185 -0
  184. package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.js.map +1 -0
  185. package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.d.ts +29 -0
  186. package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.js +125 -0
  187. package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.js.map +1 -0
  188. package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.d.ts +18 -0
  189. package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.js +63 -0
  190. package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.js.map +1 -0
  191. package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.d.ts +19 -0
  192. package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.js +45 -0
  193. package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.js.map +1 -0
  194. package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.d.ts +25 -0
  195. package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.js +115 -0
  196. package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.js.map +1 -0
  197. package/dashboard/dist-server/dashboard/src/server/rooms/room-types.d.ts +53 -0
  198. package/dashboard/dist-server/dashboard/src/server/rooms/room-types.js +5 -0
  199. package/dashboard/dist-server/dashboard/src/server/rooms/room-types.js.map +1 -0
  200. package/dashboard/dist-server/dashboard/src/server/routes/agents.js +6 -0
  201. package/dashboard/dist-server/dashboard/src/server/routes/agents.js.map +1 -1
  202. package/dashboard/dist-server/dashboard/src/server/routes/cli-history.js +20 -1
  203. package/dashboard/dist-server/dashboard/src/server/routes/cli-history.js.map +1 -1
  204. package/dashboard/dist-server/dashboard/src/server/routes/index.d.ts +2 -1
  205. package/dashboard/dist-server/dashboard/src/server/routes/index.js +8 -1
  206. package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
  207. package/dashboard/dist-server/dashboard/src/server/routes/install.js +1 -1
  208. package/dashboard/dist-server/dashboard/src/server/routes/install.js.map +1 -1
  209. package/dashboard/dist-server/dashboard/src/server/routes/mcp.js +2 -2
  210. package/dashboard/dist-server/dashboard/src/server/routes/mcp.js.map +1 -1
  211. package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.d.ts +3 -0
  212. package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.js +246 -0
  213. package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.js.map +1 -0
  214. package/dashboard/dist-server/dashboard/src/server/routes/rooms.d.ts +3 -0
  215. package/dashboard/dist-server/dashboard/src/server/routes/rooms.js +38 -0
  216. package/dashboard/dist-server/dashboard/src/server/routes/rooms.js.map +1 -0
  217. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js +7 -7
  218. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js.map +1 -1
  219. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +1 -1
  220. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
  221. package/dashboard/dist-server/dashboard/src/server/state/event-bus.d.ts +39 -1
  222. package/dashboard/dist-server/dashboard/src/server/state/event-bus.js +12 -0
  223. package/dashboard/dist-server/dashboard/src/server/state/event-bus.js.map +1 -1
  224. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +1 -1
  225. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  226. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +25 -14
  227. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  228. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +6 -6
  229. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
  230. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +1 -1
  231. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js +17 -16
  232. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js.map +1 -1
  233. package/dashboard/dist-server/dashboard/src/server/wiki/writer.d.ts +1 -1
  234. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +18 -7
  235. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
  236. package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.d.ts +3 -1
  237. package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.js +75 -1
  238. package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.js.map +1 -1
  239. package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.d.ts +17 -0
  240. package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.js +192 -0
  241. package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.js.map +1 -0
  242. package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.d.ts +13 -0
  243. package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.js +37 -0
  244. package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.js.map +1 -0
  245. package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.d.ts +7 -1
  246. package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.js +39 -2
  247. package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.js.map +1 -1
  248. package/dashboard/dist-server/dashboard/src/shared/constants.js +12 -0
  249. package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
  250. package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.d.ts +1 -0
  251. package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.js +38 -0
  252. package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.js.map +1 -0
  253. package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +66 -0
  254. package/dashboard/dist-server/dashboard/src/shared/team-types.js.map +1 -1
  255. package/dashboard/dist-server/dashboard/src/shared/types.d.ts +24 -3
  256. package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +76 -2
  257. package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
  258. package/dashboard/dist-server/shared/agent-types.d.ts +2 -0
  259. package/dashboard/dist-server/src/commands/delegate.js +11 -8
  260. package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
  261. package/dist/shared/agent-types.d.ts +2 -0
  262. package/dist/shared/agent-types.d.ts.map +1 -1
  263. package/dist/src/cli.js +2 -2
  264. package/dist/src/cli.js.map +1 -1
  265. package/dist/src/commands/delegate.d.ts.map +1 -1
  266. package/dist/src/commands/delegate.js +11 -8
  267. package/dist/src/commands/delegate.js.map +1 -1
  268. package/dist/src/commands/install-backend.d.ts +1 -1
  269. package/dist/src/commands/install-backend.d.ts.map +1 -1
  270. package/dist/src/commands/install-backend.js +1 -1
  271. package/dist/src/commands/install-backend.js.map +1 -1
  272. package/dist/src/commands/knowhow.d.ts +10 -0
  273. package/dist/src/commands/knowhow.d.ts.map +1 -0
  274. package/dist/src/commands/knowhow.js +217 -0
  275. package/dist/src/commands/knowhow.js.map +1 -0
  276. package/dist/src/commands/overlay-ui/OverlayList.d.ts +2 -0
  277. package/dist/src/commands/overlay-ui/OverlayList.d.ts.map +1 -1
  278. package/dist/src/commands/overlay-ui/OverlayList.js +6 -3
  279. package/dist/src/commands/overlay-ui/OverlayList.js.map +1 -1
  280. package/dist/src/commands/overlay-ui/index.d.ts.map +1 -1
  281. package/dist/src/commands/overlay-ui/index.js +70 -44
  282. package/dist/src/commands/overlay-ui/index.js.map +1 -1
  283. package/dist/src/commands/overlay.d.ts.map +1 -1
  284. package/dist/src/commands/overlay.js +4 -3
  285. package/dist/src/commands/overlay.js.map +1 -1
  286. package/dist/src/core/overlay/applier.d.ts +1 -1
  287. package/dist/src/core/overlay/applier.d.ts.map +1 -1
  288. package/dist/src/core/overlay/applier.js +40 -13
  289. package/dist/src/core/overlay/applier.js.map +1 -1
  290. package/dist/src/core/overlay/loader.d.ts.map +1 -1
  291. package/dist/src/core/overlay/loader.js +6 -0
  292. package/dist/src/core/overlay/loader.js.map +1 -1
  293. package/dist/src/core/overlay/types.d.ts +5 -1
  294. package/dist/src/core/overlay/types.d.ts.map +1 -1
  295. package/dist/src/core/overlay/types.js +1 -1
  296. package/dist/src/core/overlay/types.js.map +1 -1
  297. package/dist/src/hooks/context-monitor.js +1 -1
  298. package/dist/src/hooks/context-monitor.js.map +1 -1
  299. package/dist/src/hooks/skill-context.js +1 -1
  300. package/dist/src/hooks/skill-context.js.map +1 -1
  301. package/dist/src/mcp/delegate-channel-relay.d.ts +4 -0
  302. package/dist/src/mcp/delegate-channel-relay.d.ts.map +1 -1
  303. package/dist/src/mcp/delegate-channel-relay.js +73 -4
  304. package/dist/src/mcp/delegate-channel-relay.js.map +1 -1
  305. package/dist/src/tools/index.js +2 -2
  306. package/dist/src/tools/index.js.map +1 -1
  307. package/dist/src/tools/store-knowhow.d.ts +21 -0
  308. package/dist/src/tools/store-knowhow.d.ts.map +1 -0
  309. package/dist/src/tools/store-knowhow.js +295 -0
  310. package/dist/src/tools/store-knowhow.js.map +1 -0
  311. package/package.json +1 -1
  312. package/shared/agent-types.ts +2 -0
  313. package/workflows/analyze.md +61 -185
  314. package/workflows/brainstorm.md +3 -23
  315. package/workflows/codebase-rebuild.md +79 -191
  316. package/workflows/codebase-refresh.md +26 -124
  317. package/workflows/debug.md +21 -141
  318. package/workflows/execute.md +183 -350
  319. package/workflows/fork.md +72 -230
  320. package/workflows/harvest.md +12 -79
  321. package/workflows/init.md +3 -17
  322. package/workflows/integration-test.md +21 -190
  323. package/workflows/issue-analyze.md +35 -153
  324. package/workflows/issue-discover.md +88 -263
  325. package/workflows/issue-execute.md +29 -208
  326. package/workflows/issue-plan.md +33 -154
  327. package/workflows/issue.md +44 -202
  328. package/workflows/knowhow.md +374 -0
  329. package/workflows/learn.md +30 -177
  330. package/workflows/maestro-coordinate.codex.md +77 -362
  331. package/workflows/maestro-link-coordinate.md +12 -61
  332. package/workflows/maestro.codex.md +124 -457
  333. package/workflows/maestro.md +562 -976
  334. package/workflows/map.md +16 -53
  335. package/workflows/merge.md +42 -197
  336. package/workflows/milestone-audit.md +5 -43
  337. package/workflows/milestone-complete.md +11 -60
  338. package/workflows/plan.md +176 -387
  339. package/workflows/quick.md +25 -174
  340. package/workflows/refactor.md +28 -221
  341. package/workflows/retrospective.md +104 -443
  342. package/workflows/review.md +87 -299
  343. package/workflows/roadmap.md +117 -97
  344. package/workflows/spec-generate.md +22 -118
  345. package/workflows/specs-add.md +5 -25
  346. package/workflows/specs-load.md +1 -5
  347. package/workflows/specs-remove.md +0 -11
  348. package/workflows/specs-setup.md +11 -47
  349. package/workflows/status.md +58 -200
  350. package/workflows/sync.md +28 -141
  351. package/workflows/test-gen.md +23 -100
  352. package/workflows/test.md +15 -125
  353. package/workflows/ui-design.md +139 -465
  354. package/workflows/ui-style.md +36 -228
  355. package/workflows/verify.md +52 -273
  356. package/workflows/wiki-connect.md +9 -46
  357. package/workflows/wiki-digest.md +7 -50
  358. package/workflows/wiki-manage.md +11 -108
  359. package/.claude/commands/maestro-coordinate.md +0 -63
  360. package/.claude/commands/manage-memory-capture.md +0 -59
  361. package/.codex/skills/maestro-coordinate/SKILL.md +0 -213
  362. package/.codex/skills/manage-memory-capture/SKILL.md +0 -93
  363. package/dashboard/dist/assets/ChatInput-pUOLJIKE.js +0 -49
  364. package/dashboard/dist/assets/ChatPage-B8Xqkt0v.js +0 -27
  365. package/dashboard/dist/assets/McpPage-BY0SjTgw.js +0 -21
  366. package/dashboard/dist/assets/TeamsPage-BO2kP70F.js +0 -11
  367. package/dashboard/dist/assets/WorkflowPage-C8hWbYim.js +0 -6
  368. package/dashboard/dist/assets/en-ZbRpfzuP.js +0 -1
  369. package/dashboard/dist/assets/index-C2Mcb4TJ.js +0 -231
  370. package/dashboard/dist/assets/index-DyBbPc18.css +0 -1
  371. package/dashboard/dist/assets/loader-B5F6PzFT.js +0 -11
  372. package/dashboard/dist/assets/zh-CN-CoXBFuny.js +0 -1
  373. package/workflows/maestro-coordinate.md +0 -582
  374. package/workflows/memory.md +0 -451
@@ -0,0 +1,115 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ const capturedTools = new Map();
3
+ vi.mock('@anthropic-ai/claude-agent-sdk', () => ({
4
+ tool: (name, _desc, _schema, handler) => {
5
+ capturedTools.set(name, handler);
6
+ return { name, handler };
7
+ },
8
+ createSdkMcpServer: (opts) => ({
9
+ type: 'sdk',
10
+ name: opts.name,
11
+ instance: {},
12
+ }),
13
+ }));
14
+ import { getStdioConfig, getClaudeCodeConfig, getSdkMcpServer, } from './mcp-config-builder.js';
15
+ import { MeetingRoomSession } from '../meeting-room-session.js';
16
+ function createMockSession() {
17
+ const eventBus = { emit: vi.fn() };
18
+ const agentManager = { sendMessage: vi.fn() };
19
+ return new MeetingRoomSession('test-session', eventBus, agentManager);
20
+ }
21
+ describe('mcp-config-builder', () => {
22
+ const serverInfo = { port: 12345, token: 'test-token-abc' };
23
+ describe('getStdioConfig', () => {
24
+ it('returns correct command, args, and env', () => {
25
+ const config = getStdioConfig('agent-1', serverInfo);
26
+ expect(config.command).toBe(process.execPath);
27
+ expect(config.args).toHaveLength(1);
28
+ expect(config.args[0]).toContain('stdio-bridge');
29
+ expect(config.env).toEqual({
30
+ MEETING_ROOM_MCP_PORT: '12345',
31
+ MEETING_ROOM_MCP_TOKEN: 'test-token-abc',
32
+ MEETING_ROOM_AGENT_ID: 'agent-1',
33
+ });
34
+ });
35
+ });
36
+ describe('getClaudeCodeConfig', () => {
37
+ it('returns McpStdioServerConfig with type stdio', () => {
38
+ const config = getClaudeCodeConfig('agent-2', serverInfo);
39
+ expect(config.type).toBe('stdio');
40
+ expect(config.command).toBe(process.execPath);
41
+ expect(config.args).toBeDefined();
42
+ expect(config.env).toMatchObject({
43
+ MEETING_ROOM_MCP_PORT: '12345',
44
+ MEETING_ROOM_MCP_TOKEN: 'test-token-abc',
45
+ MEETING_ROOM_AGENT_ID: 'agent-2',
46
+ });
47
+ });
48
+ });
49
+ describe('getSdkMcpServer', () => {
50
+ it('returns McpSdkServerConfigWithInstance with correct name', () => {
51
+ capturedTools.clear();
52
+ const session = createMockSession();
53
+ const config = getSdkMcpServer(session, 'agent-3');
54
+ expect(config.type).toBe('sdk');
55
+ expect(config.name).toBe('meeting-room');
56
+ });
57
+ it('registers all 8 tools', () => {
58
+ capturedTools.clear();
59
+ const session = createMockSession();
60
+ getSdkMcpServer(session, 'agent-3');
61
+ expect(capturedTools.size).toBe(8);
62
+ expect(capturedTools.has('team_send_message')).toBe(true);
63
+ expect(capturedTools.has('team_read_messages')).toBe(true);
64
+ expect(capturedTools.has('team_create_task')).toBe(true);
65
+ expect(capturedTools.has('team_update_task')).toBe(true);
66
+ expect(capturedTools.has('team_list_tasks')).toBe(true);
67
+ expect(capturedTools.has('team_get_agents')).toBe(true);
68
+ expect(capturedTools.has('team_spawn_agent')).toBe(true);
69
+ expect(capturedTools.has('team_shutdown_agent')).toBe(true);
70
+ });
71
+ it('team_spawn_agent enforces leader ACL in SDK tools', async () => {
72
+ capturedTools.clear();
73
+ const session = createMockSession();
74
+ getSdkMcpServer(session, 'worker'); // non-leader
75
+ const handler = capturedTools.get('team_spawn_agent');
76
+ const result = await handler({ role: 'coder' });
77
+ expect(result.isError).toBe(true);
78
+ const text = JSON.parse(result.content[0].text);
79
+ expect(text.error).toContain('requires leader role');
80
+ });
81
+ it('team_shutdown_agent enforces leader ACL in SDK tools', async () => {
82
+ capturedTools.clear();
83
+ const session = createMockSession();
84
+ getSdkMcpServer(session, 'worker');
85
+ const handler = capturedTools.get('team_shutdown_agent');
86
+ const result = await handler({ role: 'coder' });
87
+ expect(result.isError).toBe(true);
88
+ const text = JSON.parse(result.content[0].text);
89
+ expect(text.error).toContain('requires leader role');
90
+ });
91
+ it('team_read_messages reads unread messages via SDK tool', async () => {
92
+ capturedTools.clear();
93
+ const session = createMockSession();
94
+ getSdkMcpServer(session, 'bob');
95
+ // Write a message directly to mailbox
96
+ session.mailbox.write('test-session', 'alice', 'bob', 'Hello!', 'normal');
97
+ const handler = capturedTools.get('team_read_messages');
98
+ const result = await handler({});
99
+ const messages = JSON.parse(result.content[0].text);
100
+ expect(messages).toHaveLength(1);
101
+ expect(messages[0].content).toBe('Hello!');
102
+ });
103
+ it('team_create_task creates a task via SDK tool', async () => {
104
+ capturedTools.clear();
105
+ const session = createMockSession();
106
+ getSdkMcpServer(session, 'agent-x');
107
+ const handler = capturedTools.get('team_create_task');
108
+ const result = await handler({ title: 'My Task', description: 'Do it' });
109
+ const task = JSON.parse(result.content[0].text);
110
+ expect(task.status).toBe('pending');
111
+ expect(task.id).toBeDefined();
112
+ });
113
+ });
114
+ });
115
+ //# sourceMappingURL=mcp-config-builder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config-builder.test.js","sourceRoot":"","sources":["../../../../../../src/server/rooms/mcp-server/mcp-config-builder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { MeetingRoomSession } from '../meeting-room-session.js';
2
+ export interface McpToolRequest {
3
+ id: string;
4
+ token: string;
5
+ agentId: string;
6
+ tool: string;
7
+ args: Record<string, unknown>;
8
+ }
9
+ export interface McpToolResponse {
10
+ id: string;
11
+ result?: unknown;
12
+ error?: string;
13
+ }
14
+ export interface MeetingRoomMcpServerInfo {
15
+ port: number;
16
+ token: string;
17
+ }
18
+ export declare class MeetingRoomMcpServer {
19
+ private readonly session;
20
+ private server;
21
+ private readonly token;
22
+ private port;
23
+ private readonly connections;
24
+ constructor(session: MeetingRoomSession);
25
+ start(): Promise<MeetingRoomMcpServerInfo>;
26
+ destroy(): Promise<void>;
27
+ getInfo(): MeetingRoomMcpServerInfo;
28
+ private handleConnection;
29
+ private handleMessage;
30
+ private handleToolCall;
31
+ private toolSendMessage;
32
+ private toolReadMessages;
33
+ private toolCreateTask;
34
+ private toolUpdateTask;
35
+ private toolListTasks;
36
+ private toolGetAgents;
37
+ private toolSpawnAgent;
38
+ private toolShutdownAgent;
39
+ /**
40
+ * Fire-and-forget wake after task completion.
41
+ * Wakes the task owner and any agents whose tasks became unblocked.
42
+ */
43
+ private safeWakeAfterTaskComplete;
44
+ }
@@ -0,0 +1,260 @@
1
+ // ---------------------------------------------------------------------------
2
+ // MeetingRoomMcpServer -- TCP server exposing 8 MCP tools for room subsystems
3
+ // ---------------------------------------------------------------------------
4
+ // Listens on port 0 (loopback only) with a random auth token.
5
+ // Each incoming connection receives length-framed JSON messages (see tcp-helpers).
6
+ // Tool calls are dispatched to the MeetingRoomSession subsystems.
7
+ // ---------------------------------------------------------------------------
8
+ import { createServer } from 'node:net';
9
+ import { randomBytes } from 'node:crypto';
10
+ import { writeTcpMessage, createTcpMessageReader } from './tcp-helpers.js';
11
+ // Leader-only tools that require the calling agent to have the 'leader' role
12
+ const LEADER_ONLY_TOOLS = new Set(['team_spawn_agent', 'team_shutdown_agent']);
13
+ // ---------------------------------------------------------------------------
14
+ // MeetingRoomMcpServer
15
+ // ---------------------------------------------------------------------------
16
+ export class MeetingRoomMcpServer {
17
+ session;
18
+ server = null;
19
+ token;
20
+ port = 0;
21
+ connections = new Set();
22
+ constructor(session) {
23
+ this.session = session;
24
+ this.token = randomBytes(16).toString('hex');
25
+ }
26
+ // --- Lifecycle -----------------------------------------------------------
27
+ async start() {
28
+ return new Promise((resolve, reject) => {
29
+ const srv = createServer((socket) => this.handleConnection(socket));
30
+ this.server = srv;
31
+ srv.on('error', reject);
32
+ // Listen on port 0, loopback only
33
+ srv.listen(0, '127.0.0.1', () => {
34
+ const addr = srv.address();
35
+ if (!addr || typeof addr === 'string') {
36
+ reject(new Error('Failed to get server address'));
37
+ return;
38
+ }
39
+ this.port = addr.port;
40
+ resolve({ port: this.port, token: this.token });
41
+ });
42
+ });
43
+ }
44
+ async destroy() {
45
+ // Close all active connections
46
+ for (const socket of this.connections) {
47
+ socket.destroy();
48
+ }
49
+ this.connections.clear();
50
+ return new Promise((resolve) => {
51
+ if (!this.server) {
52
+ resolve();
53
+ return;
54
+ }
55
+ this.server.close(() => {
56
+ this.server = null;
57
+ resolve();
58
+ });
59
+ });
60
+ }
61
+ getInfo() {
62
+ return { port: this.port, token: this.token };
63
+ }
64
+ // --- Connection handling -------------------------------------------------
65
+ handleConnection(socket) {
66
+ this.connections.add(socket);
67
+ const reader = createTcpMessageReader();
68
+ socket.on('data', (chunk) => {
69
+ const messages = reader.feed(chunk);
70
+ for (const msg of messages) {
71
+ this.handleMessage(socket, msg);
72
+ }
73
+ });
74
+ socket.on('close', () => {
75
+ this.connections.delete(socket);
76
+ });
77
+ socket.on('error', () => {
78
+ this.connections.delete(socket);
79
+ });
80
+ }
81
+ async handleMessage(socket, req) {
82
+ // Validate auth token
83
+ if (req.token !== this.token) {
84
+ writeTcpMessage(socket, { id: req.id, error: 'Invalid auth token' });
85
+ return;
86
+ }
87
+ // Check leader-only ACL
88
+ if (LEADER_ONLY_TOOLS.has(req.tool)) {
89
+ const agent = this.session.agentRegistry.getAgentByRole(this.session.sessionId, req.agentId);
90
+ if (!agent || req.agentId !== 'leader') {
91
+ writeTcpMessage(socket, {
92
+ id: req.id,
93
+ error: `Tool '${req.tool}' requires leader role. Caller: '${req.agentId}'`,
94
+ });
95
+ return;
96
+ }
97
+ }
98
+ try {
99
+ const result = await this.handleToolCall(req);
100
+ writeTcpMessage(socket, { id: req.id, result });
101
+ }
102
+ catch (err) {
103
+ const message = err instanceof Error ? err.message : String(err);
104
+ writeTcpMessage(socket, { id: req.id, error: message });
105
+ }
106
+ }
107
+ // --- Tool dispatch -------------------------------------------------------
108
+ async handleToolCall(req) {
109
+ switch (req.tool) {
110
+ case 'team_send_message':
111
+ return this.toolSendMessage(req);
112
+ case 'team_read_messages':
113
+ return this.toolReadMessages(req);
114
+ case 'team_create_task':
115
+ return this.toolCreateTask(req);
116
+ case 'team_update_task':
117
+ return this.toolUpdateTask(req);
118
+ case 'team_list_tasks':
119
+ return this.toolListTasks(req);
120
+ case 'team_get_agents':
121
+ return this.toolGetAgents(req);
122
+ case 'team_spawn_agent':
123
+ return this.toolSpawnAgent(req);
124
+ case 'team_shutdown_agent':
125
+ return this.toolShutdownAgent(req);
126
+ default:
127
+ throw new Error(`Unknown tool: ${req.tool}`);
128
+ }
129
+ }
130
+ // --- Tool implementations ------------------------------------------------
131
+ async toolSendMessage(req) {
132
+ const { to, content, priority } = req.args;
133
+ if (!to || !content) {
134
+ throw new Error('Missing required args: to, content');
135
+ }
136
+ const msg = to === '*'
137
+ ? await this.session.broadcastMessage(req.agentId, content, priority)
138
+ : await this.session.sendMessage(req.agentId, to, content, priority);
139
+ // safeWake is already handled inside sendMessage/broadcastMessage
140
+ return { id: msg.id, from: msg.from, to: msg.to, createdAt: msg.createdAt };
141
+ }
142
+ toolReadMessages(req) {
143
+ const messages = this.session.mailbox.readUnread(this.session.sessionId, req.agentId);
144
+ return messages.map((m) => ({
145
+ id: m.id,
146
+ from: m.from,
147
+ to: m.to,
148
+ content: m.content,
149
+ priority: m.priority,
150
+ createdAt: m.createdAt,
151
+ }));
152
+ }
153
+ toolCreateTask(req) {
154
+ const title = req.args.title;
155
+ const description = req.args.description;
156
+ const owner = req.args.owner ?? req.agentId;
157
+ const blockedBy = req.args.blockedBy;
158
+ if (!title || !description) {
159
+ throw new Error('Missing required args: title, description');
160
+ }
161
+ const task = this.session.createTask({
162
+ title,
163
+ description,
164
+ owner,
165
+ blockedBy,
166
+ });
167
+ return { id: task.id, status: task.status, createdAt: task.createdAt };
168
+ }
169
+ toolUpdateTask(req) {
170
+ const taskId = req.args.taskId;
171
+ const patch = {};
172
+ if (req.args.title !== undefined)
173
+ patch.title = req.args.title;
174
+ if (req.args.description !== undefined)
175
+ patch.description = req.args.description;
176
+ if (req.args.status !== undefined)
177
+ patch.status = req.args.status;
178
+ if (req.args.owner !== undefined)
179
+ patch.owner = req.args.owner;
180
+ if (!taskId) {
181
+ throw new Error('Missing required arg: taskId');
182
+ }
183
+ const task = this.session.updateTask(taskId, patch);
184
+ if (!task) {
185
+ throw new Error(`Task not found: ${taskId}`);
186
+ }
187
+ // safeWake: if task completed, wake owner and any newly unblocked task owners
188
+ if (patch.status === 'completed') {
189
+ this.safeWakeAfterTaskComplete(task.id);
190
+ }
191
+ return { id: task.id, status: task.status, updatedAt: task.updatedAt };
192
+ }
193
+ toolListTasks(req) {
194
+ const { owner } = req.args;
195
+ const tasks = owner
196
+ ? this.session.taskBoard.getByOwner(this.session.sessionId, owner)
197
+ : this.session.getTasks();
198
+ return tasks.map((t) => ({
199
+ id: t.id,
200
+ title: t.title,
201
+ status: t.status,
202
+ owner: t.owner,
203
+ blockedBy: t.blockedBy,
204
+ blocks: t.blocks,
205
+ }));
206
+ }
207
+ toolGetAgents(_req) {
208
+ const agents = this.session.getAgents();
209
+ return agents.map((a) => ({
210
+ role: a.role,
211
+ status: a.status,
212
+ joinedAt: a.joinedAt,
213
+ lastActivityAt: a.lastActivityAt,
214
+ }));
215
+ }
216
+ toolSpawnAgent(req) {
217
+ const { role, processId } = req.args;
218
+ if (!role) {
219
+ throw new Error('Missing required arg: role');
220
+ }
221
+ const agent = this.session.addAgent(role, processId);
222
+ return { role: agent.role, status: agent.status, joinedAt: agent.joinedAt };
223
+ }
224
+ toolShutdownAgent(req) {
225
+ const { role } = req.args;
226
+ if (!role) {
227
+ throw new Error('Missing required arg: role');
228
+ }
229
+ const removed = this.session.removeAgent(role);
230
+ return { role, removed };
231
+ }
232
+ // --- safeWake pattern: fire-and-forget after state changes ---------------
233
+ /**
234
+ * Fire-and-forget wake after task completion.
235
+ * Wakes the task owner and any agents whose tasks became unblocked.
236
+ */
237
+ safeWakeAfterTaskComplete(taskId) {
238
+ const tasks = this.session.getTasks();
239
+ const completed = tasks.find((t) => t.id === taskId);
240
+ if (!completed)
241
+ return;
242
+ // Build set of agents to wake: task owner + owners of tasks that were blocked by this task
243
+ const toWake = new Set();
244
+ if (completed.owner)
245
+ toWake.add(completed.owner);
246
+ for (const blockedId of completed.blocks) {
247
+ const blocked = tasks.find((t) => t.id === blockedId);
248
+ if (blocked?.owner && blocked.status === 'pending') {
249
+ toWake.add(blocked.owner);
250
+ }
251
+ }
252
+ // Fire-and-forget: errors are silently caught
253
+ for (const role of toWake) {
254
+ this.session.agentRegistry
255
+ .wake(this.session.sessionId, role, `Task ${taskId} completed`)
256
+ .catch(() => { });
257
+ }
258
+ }
259
+ }
260
+ //# sourceMappingURL=meeting-room-mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meeting-room-mcp-server.js","sourceRoot":"","sources":["../../../../../../src/server/rooms/mcp-server/meeting-room-mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { MeetingRoomMcpServer } from './meeting-room-mcp-server.js';
3
+ import { sendTcpRequest } from './tcp-helpers.js';
4
+ import { MeetingRoomSession } from '../meeting-room-session.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Mocks
7
+ // ---------------------------------------------------------------------------
8
+ function createMockEventBus() {
9
+ return { emit: vi.fn() };
10
+ }
11
+ function createMockAgentManager() {
12
+ return {
13
+ sendMessage: vi.fn().mockResolvedValue(undefined),
14
+ };
15
+ }
16
+ async function callTool(port, token, agentId, tool, args = {}) {
17
+ return sendTcpRequest({
18
+ port,
19
+ payload: { id: `test-${Date.now()}`, token, agentId, tool, args },
20
+ timeoutMs: 5000,
21
+ });
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Tests
25
+ // ---------------------------------------------------------------------------
26
+ describe('MeetingRoomMcpServer', () => {
27
+ let session;
28
+ let mcpServer;
29
+ let port;
30
+ let token;
31
+ beforeEach(async () => {
32
+ session = new MeetingRoomSession('test-session', createMockEventBus(), createMockAgentManager());
33
+ mcpServer = new MeetingRoomMcpServer(session);
34
+ const info = await mcpServer.start();
35
+ port = info.port;
36
+ token = info.token;
37
+ });
38
+ afterEach(async () => {
39
+ await mcpServer.destroy();
40
+ });
41
+ // --- Server lifecycle ---
42
+ it('starts on a random port with a valid token', () => {
43
+ expect(port).toBeGreaterThan(0);
44
+ expect(token).toHaveLength(32); // 16 hex bytes
45
+ });
46
+ it('rejects requests with invalid auth token', async () => {
47
+ const resp = await callTool(port, 'bad-token', 'agent1', 'team_get_agents');
48
+ expect(resp.error).toBe('Invalid auth token');
49
+ });
50
+ // --- team_get_agents ---
51
+ it('team_get_agents returns empty list initially', async () => {
52
+ const resp = await callTool(port, token, 'agent1', 'team_get_agents');
53
+ expect(resp.error).toBeUndefined();
54
+ expect(resp.result).toEqual([]);
55
+ });
56
+ // --- team_spawn_agent / team_shutdown_agent (leader ACL) ---
57
+ it('team_spawn_agent rejects non-leader callers', async () => {
58
+ const resp = await callTool(port, token, 'worker', 'team_spawn_agent', { role: 'coder' });
59
+ expect(resp.error).toContain('requires leader role');
60
+ expect(resp.error).toContain("Caller: 'worker'");
61
+ });
62
+ it('team_spawn_agent succeeds for leader', async () => {
63
+ // Register leader first so ACL check finds the agent
64
+ session.addAgent('leader');
65
+ const resp = await callTool(port, token, 'leader', 'team_spawn_agent', { role: 'coder' });
66
+ expect(resp.error).toBeUndefined();
67
+ expect(resp.result).toMatchObject({ role: 'coder', status: 'idle' });
68
+ });
69
+ it('team_shutdown_agent rejects non-leader callers', async () => {
70
+ session.addAgent('coder');
71
+ const resp = await callTool(port, token, 'coder', 'team_shutdown_agent', { role: 'coder' });
72
+ expect(resp.error).toContain('requires leader role');
73
+ });
74
+ it('team_shutdown_agent succeeds for leader', async () => {
75
+ session.addAgent('leader');
76
+ session.addAgent('coder');
77
+ const resp = await callTool(port, token, 'leader', 'team_shutdown_agent', { role: 'coder' });
78
+ expect(resp.error).toBeUndefined();
79
+ expect(resp.result).toEqual({ role: 'coder', removed: true });
80
+ });
81
+ // --- team_send_message + team_read_messages ---
82
+ it('sends and reads messages', async () => {
83
+ session.addAgent('alice');
84
+ session.addAgent('bob');
85
+ const sendResp = await callTool(port, token, 'alice', 'team_send_message', {
86
+ to: 'bob',
87
+ content: 'Hello Bob!',
88
+ });
89
+ expect(sendResp.error).toBeUndefined();
90
+ expect(sendResp.result).toMatchObject({ from: 'alice', to: 'bob' });
91
+ const readResp = await callTool(port, token, 'bob', 'team_read_messages');
92
+ expect(readResp.error).toBeUndefined();
93
+ const messages = readResp.result;
94
+ expect(messages).toHaveLength(1);
95
+ expect(messages[0].content).toBe('Hello Bob!');
96
+ });
97
+ it('broadcasts to all agents', async () => {
98
+ session.addAgent('alice');
99
+ session.addAgent('bob');
100
+ const sendResp = await callTool(port, token, 'alice', 'team_send_message', {
101
+ to: '*',
102
+ content: 'Hello everyone!',
103
+ });
104
+ expect(sendResp.error).toBeUndefined();
105
+ expect(sendResp.result).toMatchObject({ to: '*' });
106
+ });
107
+ // --- team_create_task + team_update_task + team_list_tasks ---
108
+ it('creates and lists tasks', async () => {
109
+ const createResp = await callTool(port, token, 'agent1', 'team_create_task', {
110
+ title: 'Task 1',
111
+ description: 'Do something',
112
+ });
113
+ expect(createResp.error).toBeUndefined();
114
+ expect(createResp.result).toMatchObject({ status: 'pending' });
115
+ const listResp = await callTool(port, token, 'agent1', 'team_list_tasks');
116
+ expect(listResp.error).toBeUndefined();
117
+ const tasks = listResp.result;
118
+ expect(tasks).toHaveLength(1);
119
+ expect(tasks[0].title).toBe('Task 1');
120
+ });
121
+ it('updates task status', async () => {
122
+ const createResp = await callTool(port, token, 'agent1', 'team_create_task', {
123
+ title: 'Task 1',
124
+ description: 'Do something',
125
+ });
126
+ const taskId = createResp.result.id;
127
+ const updateResp = await callTool(port, token, 'agent1', 'team_update_task', {
128
+ taskId,
129
+ status: 'completed',
130
+ });
131
+ expect(updateResp.error).toBeUndefined();
132
+ expect(updateResp.result).toMatchObject({ status: 'completed' });
133
+ });
134
+ it('filters tasks by owner', async () => {
135
+ await callTool(port, token, 'alice', 'team_create_task', {
136
+ title: 'Alice Task',
137
+ description: 'Alice work',
138
+ owner: 'alice',
139
+ });
140
+ await callTool(port, token, 'bob', 'team_create_task', {
141
+ title: 'Bob Task',
142
+ description: 'Bob work',
143
+ owner: 'bob',
144
+ });
145
+ const aliceTasks = await callTool(port, token, 'alice', 'team_list_tasks', {
146
+ owner: 'alice',
147
+ });
148
+ const tasks = aliceTasks.result;
149
+ expect(tasks).toHaveLength(1);
150
+ expect(tasks[0].owner).toBe('alice');
151
+ });
152
+ // --- Error handling ---
153
+ it('returns error for unknown tool', async () => {
154
+ const resp = await callTool(port, token, 'agent1', 'nonexistent_tool');
155
+ expect(resp.error).toContain('Unknown tool');
156
+ });
157
+ it('returns error for missing required args', async () => {
158
+ const resp = await callTool(port, token, 'agent1', 'team_create_task', {});
159
+ expect(resp.error).toContain('Missing required args');
160
+ });
161
+ // --- wake-after-write pattern ---
162
+ it('triggers safeWake after task completion with dependent tasks', async () => {
163
+ // Register agents with process IDs so wake can find them
164
+ session.addAgent('alice', 'proc-alice');
165
+ session.addAgent('bob', 'proc-bob');
166
+ // Create blocking task owned by alice
167
+ const createResp1 = await callTool(port, token, 'alice', 'team_create_task', {
168
+ title: 'Blocker',
169
+ description: 'Blocking task',
170
+ owner: 'alice',
171
+ });
172
+ const blockerId = createResp1.result.id;
173
+ // Create blocked task owned by bob
174
+ await callTool(port, token, 'bob', 'team_create_task', {
175
+ title: 'Blocked',
176
+ description: 'Blocked task',
177
+ owner: 'bob',
178
+ blockedBy: [blockerId],
179
+ });
180
+ // Complete the blocker -- should trigger wake for alice (owner) and bob (unblocked)
181
+ await callTool(port, token, 'alice', 'team_update_task', {
182
+ taskId: blockerId,
183
+ status: 'completed',
184
+ });
185
+ // Give fire-and-forget promises a tick to settle
186
+ await new Promise((resolve) => setTimeout(resolve, 50));
187
+ // The wake calls are fire-and-forget, so we verify indirectly by checking
188
+ // that the blocked task is now pending (unblocked)
189
+ const listResp = await callTool(port, token, 'bob', 'team_list_tasks', { owner: 'bob' });
190
+ const bobTasks = listResp.result;
191
+ expect(bobTasks[0].status).toBe('pending');
192
+ });
193
+ });
194
+ //# sourceMappingURL=meeting-room-mcp-server.test.js.map