maestro-flow 0.3.8 → 0.3.9

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 (211) hide show
  1. package/.claude/commands/learn-decompose.md +3 -3
  2. package/.claude/commands/learn-follow.md +5 -5
  3. package/.claude/commands/learn-investigate.md +3 -3
  4. package/.claude/commands/learn-retro.md +6 -6
  5. package/.claude/commands/learn-second-opinion.md +3 -3
  6. package/.claude/commands/maestro-analyze.md +123 -99
  7. package/.claude/commands/maestro-brainstorm.md +2 -2
  8. package/.claude/commands/maestro-execute.md +137 -97
  9. package/.claude/commands/maestro-fork.md +111 -0
  10. package/.claude/commands/maestro-init.md +6 -6
  11. package/.claude/commands/maestro-merge.md +77 -0
  12. package/.claude/commands/maestro-milestone-audit.md +72 -60
  13. package/.claude/commands/maestro-milestone-complete.md +67 -59
  14. package/.claude/commands/maestro-milestone-release.md +6 -6
  15. package/.claude/commands/maestro-plan.md +151 -130
  16. package/.claude/commands/maestro-quick.md +4 -4
  17. package/.claude/commands/maestro-roadmap.md +5 -5
  18. package/.claude/commands/maestro-spec-generate.md +5 -5
  19. package/.claude/commands/maestro-ui-design.md +3 -3
  20. package/.claude/commands/maestro-verify.md +106 -87
  21. package/.claude/commands/maestro.md +10 -4
  22. package/.claude/commands/manage-codebase-rebuild.md +4 -4
  23. package/.claude/commands/manage-codebase-refresh.md +1 -1
  24. package/.claude/commands/manage-harvest.md +5 -5
  25. package/.claude/commands/manage-issue-discover.md +1 -1
  26. package/.claude/commands/manage-issue-execute.md +6 -6
  27. package/.claude/commands/manage-issue.md +6 -6
  28. package/.claude/commands/manage-learn.md +2 -2
  29. package/.claude/commands/manage-memory-capture.md +4 -4
  30. package/.claude/commands/manage-memory.md +2 -2
  31. package/.claude/commands/manage-status.md +24 -24
  32. package/.claude/commands/quality-business-test.md +5 -5
  33. package/.claude/commands/quality-debug.md +4 -4
  34. package/.claude/commands/quality-integration-test.md +4 -4
  35. package/.claude/commands/quality-refactor.md +3 -3
  36. package/.claude/commands/quality-retrospective.md +2 -2
  37. package/.claude/commands/quality-review.md +4 -4
  38. package/.claude/commands/quality-sync.md +3 -3
  39. package/.claude/commands/quality-test-gen.md +4 -4
  40. package/.claude/commands/quality-test.md +9 -9
  41. package/.claude/commands/spec-add.md +2 -2
  42. package/.claude/commands/spec-load.md +1 -1
  43. package/.claude/commands/spec-setup.md +5 -5
  44. package/.claude/commands/wiki-connect.md +3 -3
  45. package/.claude/commands/wiki-digest.md +4 -4
  46. package/.codex/skills/maestro-analyze/SKILL.md +52 -14
  47. package/.codex/skills/maestro-execute/SKILL.md +27 -26
  48. package/.codex/skills/maestro-milestone-audit/SKILL.md +103 -209
  49. package/.codex/skills/maestro-milestone-complete/SKILL.md +149 -158
  50. package/.codex/skills/maestro-plan/SKILL.md +47 -17
  51. package/.codex/skills/maestro-roadmap/SKILL.md +3 -2
  52. package/.codex/skills/team-coordinate/roles/coordinator/commands/monitor.md +2 -2
  53. package/.codex/skills/team-executor/roles/executor/commands/monitor.md +1 -1
  54. package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +2 -2
  55. package/.codex/skills/team-lifecycle-v4/specs/knowledge-transfer.md +2 -2
  56. package/.codex/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +1 -1
  57. package/.codex/skills/team-review/roles/coordinator/commands/monitor.md +1 -1
  58. package/.codex/skills/team-tech-debt/roles/coordinator/commands/monitor.md +1 -1
  59. package/.codex/skills/team-testing/roles/coordinator/commands/monitor.md +1 -1
  60. package/README.md +19 -14
  61. package/README.zh-CN.md +16 -12
  62. package/bin/maestro-mcp.js +1 -1
  63. package/chains/_intent-map.json +21 -9
  64. package/chains/_router.json +30 -77
  65. package/chains/brainstorm-driven.json +17 -6
  66. package/chains/full-lifecycle.json +22 -23
  67. package/chains/milestone-close.json +20 -7
  68. package/chains/milestone-fork-merge.json +50 -0
  69. package/chains/roadmap-driven.json +17 -6
  70. package/chains/spec-driven.json +17 -6
  71. package/dashboard/dist/assets/{ArtifactsPage-BmPOu8sO.js → ArtifactsPage-DZNCi6tn.js} +12 -7
  72. package/dashboard/dist/assets/ChatInput-Bvr-FeEq.js +49 -0
  73. package/dashboard/dist/assets/ChatPage-D9zTkJZo.js +22 -0
  74. package/dashboard/dist/assets/CollabPage-B4NAHXS2.js +1 -0
  75. package/dashboard/dist/assets/ExecutionPanel-CFt4LJyq.js +1 -0
  76. package/dashboard/dist/assets/KanbanPage-C8USth6H.js +21 -0
  77. package/dashboard/dist/assets/{MarkdownRenderer-BjZ43aSa.js → MarkdownRenderer-X4af_WNb.js} +1 -1
  78. package/dashboard/dist/assets/McpPage-BKfCVIyU.js +21 -0
  79. package/dashboard/dist/assets/OutputPanel-BlBQFJSW.js +1 -0
  80. package/dashboard/dist/assets/ProblemsPanel-De3DLvoI.js +1 -0
  81. package/dashboard/dist/assets/{RequirementBoardPage-B7yRL0s_.js → RequirementBoardPage-Bf1trzqs.js} +2 -2
  82. package/dashboard/dist/assets/{RequirementPage-D8J_-b6O.js → RequirementPage-Bllxe2XI.js} +10 -5
  83. package/dashboard/dist/assets/{SpecsPage-6lO8v8_C.js → SpecsPage-9lwxKT27.js} +2 -2
  84. package/dashboard/dist/assets/{SupervisorPage-Ds5N378a.js → SupervisorPage-SusdfHFq.js} +1 -1
  85. package/dashboard/dist/assets/{TeamsPage-DrkKr17T.js → TeamsPage-DsuM6OwC.js} +2 -2
  86. package/dashboard/dist/assets/TreeBrowser-Q12qobZs.js +6 -0
  87. package/dashboard/dist/assets/WorkflowPage-D_Fzdy3_.js +6 -0
  88. package/dashboard/dist/assets/{arrow-left-CadP5YgU.js → arrow-left-Bqtb2hle.js} +1 -1
  89. package/dashboard/dist/assets/{check-5xufDzS8.js → check-u6fGOwQO.js} +1 -1
  90. package/dashboard/dist/assets/{chevron-right-CYbpR4ev.js → chevron-right-Csu22t58.js} +1 -1
  91. package/dashboard/dist/assets/{circle-Bm-5Q-Yh.js → circle-CMrkbRNg.js} +1 -1
  92. package/dashboard/dist/assets/{circle-alert-BqcYuT7x.js → circle-alert-c3tH1P4z.js} +1 -1
  93. package/dashboard/dist/assets/{circle-check-big-yyzAFysU.js → circle-check-big-TDSeWstm.js} +1 -1
  94. package/dashboard/dist/assets/{circle-check-DEVzW_lm.js → circle-check-gYxxSYuH.js} +1 -1
  95. package/dashboard/dist/assets/{code-BBdC8Wmw.js → code-CFN2uX9V.js} +1 -1
  96. package/dashboard/dist/assets/{columns-3-CQ9Trztr.js → columns-3-38xIDlzy.js} +1 -1
  97. package/dashboard/dist/assets/{download-DayuF-sn.js → download-DC7KkKyP.js} +1 -1
  98. package/dashboard/dist/assets/{folder-CqXeSKeC.js → folder-CWq_lAnf.js} +1 -1
  99. package/dashboard/dist/assets/index-DWG-WrzT.js +231 -0
  100. package/dashboard/dist/assets/{index-Dru5HYy0.js → index-Do71weNR.js} +1 -1
  101. package/dashboard/dist/assets/index-GUNJodSR.css +1 -0
  102. package/dashboard/dist/assets/{list-DBOD6IUt.js → list-CgIP_2A-.js} +1 -1
  103. package/dashboard/dist/assets/{minus-fQI1Syn2.js → minus-DYoN5UGk.js} +1 -1
  104. package/dashboard/dist/assets/{pen-line-Bkbbngl5.js → pen-line-Bh_WKYHm.js} +1 -1
  105. package/dashboard/dist/assets/{proxy-teW12DdZ.js → proxy-BKxDAKTj.js} +1 -1
  106. package/dashboard/dist/assets/{search-Bq3ygFUW.js → search-SieXnOgr.js} +1 -1
  107. package/dashboard/dist/assets/{shallow-22ZN8sFt.js → shallow-Bme1JY57.js} +1 -1
  108. package/dashboard/dist/assets/{table-BEYtdWc4.js → table-llyEtj-7.js} +1 -1
  109. package/dashboard/dist/assets/terminal-BB3Xfuv5.js +6 -0
  110. package/dashboard/dist/assets/{trash-2-DMqGBgcF.js → trash-2-C8f4vFFM.js} +1 -1
  111. package/dashboard/dist/assets/{zap-9DVkGVtt.js → zap-4uwlzVm0.js} +1 -1
  112. package/dashboard/dist/index.html +2 -2
  113. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +8 -4
  114. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
  115. package/dashboard/dist-server/dashboard/src/server/agents/entry-normalizer.d.ts +1 -0
  116. package/dashboard/dist-server/dashboard/src/server/agents/entry-normalizer.js +2 -1
  117. package/dashboard/dist-server/dashboard/src/server/agents/entry-normalizer.js.map +1 -1
  118. package/dashboard/dist-server/dashboard/src/server/agents/stream-json-adapter.js +20 -10
  119. package/dashboard/dist-server/dashboard/src/server/agents/stream-json-adapter.js.map +1 -1
  120. package/dashboard/dist-server/dashboard/src/server/routes/git.d.ts +2 -0
  121. package/dashboard/dist-server/dashboard/src/server/routes/git.js +79 -0
  122. package/dashboard/dist-server/dashboard/src/server/routes/git.js.map +1 -0
  123. package/dashboard/dist-server/dashboard/src/server/routes/index.js +3 -0
  124. package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
  125. package/dashboard/dist-server/dashboard/src/server/routes/workspace.js +43 -0
  126. package/dashboard/dist-server/dashboard/src/server/routes/workspace.js.map +1 -1
  127. package/dashboard/dist-server/dashboard/src/server/state/state-manager.js +43 -3
  128. package/dashboard/dist-server/dashboard/src/server/state/state-manager.js.map +1 -1
  129. package/dashboard/package.json +59 -59
  130. package/dist/src/cli.js +3 -1
  131. package/dist/src/cli.js.map +1 -1
  132. package/dist/src/commands/{team.d.ts → collab.d.ts} +2 -2
  133. package/dist/src/commands/collab.d.ts.map +1 -0
  134. package/dist/src/commands/{team.js → collab.js} +391 -24
  135. package/dist/src/commands/collab.js.map +1 -0
  136. package/dist/src/commands/msg.d.ts.map +1 -1
  137. package/dist/src/commands/msg.js +4 -3
  138. package/dist/src/commands/msg.js.map +1 -1
  139. package/dist/src/hooks/team-monitor.d.ts.map +1 -1
  140. package/dist/src/hooks/team-monitor.js +16 -0
  141. package/dist/src/hooks/team-monitor.js.map +1 -1
  142. package/dist/src/tools/collab-adapter.d.ts +85 -0
  143. package/dist/src/tools/collab-adapter.d.ts.map +1 -0
  144. package/dist/src/tools/collab-adapter.js +320 -0
  145. package/dist/src/tools/collab-adapter.js.map +1 -0
  146. package/dist/src/tools/namespace-guard.d.ts +2 -0
  147. package/dist/src/tools/namespace-guard.d.ts.map +1 -1
  148. package/dist/src/tools/namespace-guard.js +12 -0
  149. package/dist/src/tools/namespace-guard.js.map +1 -1
  150. package/dist/src/tools/phase-gate-evaluator.d.ts +45 -0
  151. package/dist/src/tools/phase-gate-evaluator.d.ts.map +1 -0
  152. package/dist/src/tools/phase-gate-evaluator.js +42 -0
  153. package/dist/src/tools/phase-gate-evaluator.js.map +1 -0
  154. package/dist/src/tools/team-members.d.ts +18 -0
  155. package/dist/src/tools/team-members.d.ts.map +1 -1
  156. package/dist/src/tools/team-members.js +50 -0
  157. package/dist/src/tools/team-members.js.map +1 -1
  158. package/dist/src/tools/team-tasks.d.ts +120 -0
  159. package/dist/src/tools/team-tasks.d.ts.map +1 -0
  160. package/dist/src/tools/team-tasks.js +365 -0
  161. package/dist/src/tools/team-tasks.js.map +1 -0
  162. package/dist/src/tools/transition-recorder.d.ts +3 -0
  163. package/dist/src/tools/transition-recorder.d.ts.map +1 -1
  164. package/dist/src/tools/transition-recorder.js +52 -1
  165. package/dist/src/tools/transition-recorder.js.map +1 -1
  166. package/dist/src/utils/get-version.d.ts.map +1 -1
  167. package/dist/src/utils/get-version.js +15 -4
  168. package/dist/src/utils/get-version.js.map +1 -1
  169. package/package.json +1 -1
  170. package/templates/config.json +7 -0
  171. package/templates/worktree-scope.json +10 -0
  172. package/templates/worktrees.json +27 -0
  173. package/workflows/analyze.md +86 -36
  174. package/workflows/brainstorm.md +17 -37
  175. package/workflows/execute.md +94 -28
  176. package/workflows/fork.md +309 -0
  177. package/workflows/init.md +10 -1
  178. package/workflows/issue.md +66 -7
  179. package/workflows/maestro-coordinate.md +23 -16
  180. package/workflows/maestro.md +52 -35
  181. package/workflows/merge.md +285 -0
  182. package/workflows/milestone-audit.md +89 -70
  183. package/workflows/milestone-complete.md +89 -156
  184. package/workflows/plan.md +122 -17
  185. package/workflows/retrospective.md +3 -3
  186. package/workflows/roadmap.md +11 -3
  187. package/workflows/spec-generate.md +9 -0
  188. package/workflows/status.md +76 -27
  189. package/workflows/ui-design.md +14 -12
  190. package/workflows/verify.md +44 -8
  191. package/.claude/commands/maestro-phase-add.md +0 -63
  192. package/.claude/commands/maestro-phase-transition.md +0 -75
  193. package/.codex/skills/maestro-phase-add/SKILL.md +0 -154
  194. package/.codex/skills/maestro-phase-transition/SKILL.md +0 -173
  195. package/chains/singles/phase-add.json +0 -31
  196. package/chains/singles/phase-transition.json +0 -23
  197. package/dashboard/dist/assets/ChatInput-CL8YDfOU.js +0 -67
  198. package/dashboard/dist/assets/ChatPage-CT-ozBK2.js +0 -8
  199. package/dashboard/dist/assets/CollabPage-C0rWMden.js +0 -1
  200. package/dashboard/dist/assets/KanbanPage-C6WbAlwI.js +0 -16
  201. package/dashboard/dist/assets/McpPage-BPIXADQi.js +0 -16
  202. package/dashboard/dist/assets/TreeBrowser-g_QUKemL.js +0 -11
  203. package/dashboard/dist/assets/WorkflowPage-X8aNkDEr.js +0 -6
  204. package/dashboard/dist/assets/git-branch-SqFf4Ru5.js +0 -6
  205. package/dashboard/dist/assets/index-D2Mtyw7I.css +0 -1
  206. package/dashboard/dist/assets/index-nufWop4p.js +0 -231
  207. package/dashboard/dist/assets/wrench-B84-zdLI.js +0 -11
  208. package/dist/src/commands/team.d.ts.map +0 -1
  209. package/dist/src/commands/team.js.map +0 -1
  210. package/workflows/phase-add.md +0 -252
  211. package/workflows/phase-transition.md +0 -399
@@ -11,6 +11,7 @@
11
11
  * two concurrent `maestro team join` on different machines never collide on
12
12
  * git merge (vs. a single `members.json` which cannot `merge=union`).
13
13
  */
14
+ export type ProjectRole = string;
14
15
  export interface MemberRecord {
15
16
  uid: string;
16
17
  name: string;
@@ -18,6 +19,7 @@ export interface MemberRecord {
18
19
  host: string;
19
20
  role: 'admin' | 'member';
20
21
  joinedAt: string;
22
+ projectRoles?: ProjectRole[];
21
23
  }
22
24
  /** Absolute path to the human-collab members directory. */
23
25
  export declare function getMembersDir(): string;
@@ -91,4 +93,20 @@ export declare function requireRole(required: 'admin' | 'member'): MemberRecord;
91
93
  export declare function joinTeam(opts?: {
92
94
  role?: 'admin' | 'member';
93
95
  }): MemberRecord;
96
+ /**
97
+ * Add a project role to a member's record. Idempotent — adding a role that
98
+ * already exists is a no-op. Returns the updated record, or null if the
99
+ * member was not found.
100
+ */
101
+ export declare function addProjectRole(uid: string, role: string): MemberRecord | null;
102
+ /**
103
+ * Remove a project role from a member's record. No-op if the role is not
104
+ * present. Returns the updated record, or null if the member was not found.
105
+ */
106
+ export declare function removeProjectRole(uid: string, role: string): MemberRecord | null;
107
+ /**
108
+ * List project roles. When `uid` is provided, returns that member's roles
109
+ * (or an empty array). When omitted, returns a Map of all members' roles.
110
+ */
111
+ export declare function listProjectRoles(uid?: string): ProjectRole[] | Map<string, ProjectRole[]>;
94
112
  //# sourceMappingURL=team-members.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"team-members.d.ts","sourceRoot":"","sources":["../../../src/tools/team-members.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAUD;;;GAGG;AACH,wBAAgB,eAAe,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKxE;AAcD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,yEAAyE;AACzE,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAMD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAkB5C;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAI/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,IAAI,YAAY,GAAG,IAAI,CAQjD;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAQ9C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,YAAY,CAQtE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,GAAG,YAAY,CAkC3E"}
1
+ {"version":3,"file":"team-members.d.ts","sourceRoot":"","sources":["../../../src/tools/team-members.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAC9B;AAMD,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAUD;;;GAGG;AACH,wBAAgB,eAAe,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKxE;AAcD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,yEAAyE;AACzE,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAMD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAkB5C;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAI/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,IAAI,YAAY,GAAG,IAAI,CAQjD;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAQ9C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,YAAY,CAQtE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,GAAG,YAAY,CAkC3E;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAU7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAWhF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAWzF"}
@@ -202,6 +202,56 @@ export function joinTeam(opts) {
202
202
  return record;
203
203
  }
204
204
  // ---------------------------------------------------------------------------
205
+ // Project roles
206
+ // ---------------------------------------------------------------------------
207
+ /**
208
+ * Add a project role to a member's record. Idempotent — adding a role that
209
+ * already exists is a no-op. Returns the updated record, or null if the
210
+ * member was not found.
211
+ */
212
+ export function addProjectRole(uid, role) {
213
+ const member = getMemberByUid(uid);
214
+ if (!member)
215
+ return null;
216
+ const roles = member.projectRoles ?? [];
217
+ if (roles.includes(role))
218
+ return member; // already present
219
+ member.projectRoles = [...roles, role];
220
+ writeFileSync(getMemberFilePath(uid), JSON.stringify(member, null, 2), 'utf-8');
221
+ return member;
222
+ }
223
+ /**
224
+ * Remove a project role from a member's record. No-op if the role is not
225
+ * present. Returns the updated record, or null if the member was not found.
226
+ */
227
+ export function removeProjectRole(uid, role) {
228
+ const member = getMemberByUid(uid);
229
+ if (!member)
230
+ return null;
231
+ const roles = member.projectRoles ?? [];
232
+ const filtered = roles.filter((r) => r !== role);
233
+ if (filtered.length === roles.length)
234
+ return member; // role was not present
235
+ member.projectRoles = filtered.length > 0 ? filtered : undefined;
236
+ writeFileSync(getMemberFilePath(uid), JSON.stringify(member, null, 2), 'utf-8');
237
+ return member;
238
+ }
239
+ /**
240
+ * List project roles. When `uid` is provided, returns that member's roles
241
+ * (or an empty array). When omitted, returns a Map of all members' roles.
242
+ */
243
+ export function listProjectRoles(uid) {
244
+ if (uid !== undefined) {
245
+ const member = getMemberByUid(uid);
246
+ return member?.projectRoles ?? [];
247
+ }
248
+ const map = new Map();
249
+ for (const m of listMembers()) {
250
+ map.set(m.uid, m.projectRoles ?? []);
251
+ }
252
+ return map;
253
+ }
254
+ // ---------------------------------------------------------------------------
205
255
  // Internals
206
256
  // ---------------------------------------------------------------------------
207
257
  function readMemberFile(path) {
@@ -1 +1 @@
1
- {"version":3,"file":"team-members.js","sourceRoot":"","sources":["../../../src/tools/team-members.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team-members.js","sourceRoot":"","sources":["../../../src/tools/team-members.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Human-team task management (team-lite collaboration, Wave 2).
3
+ *
4
+ * Owns `.workflow/collab/tasks/{id}.json` -- per-file task records.
5
+ *
6
+ * Strict namespace separation: this module belongs to the HUMAN collaboration
7
+ * domain (`.workflow/collab/`). It must NEVER touch `.workflow/.team/` which
8
+ * is the agent pipeline message bus owned by `src/tools/team-msg.ts`.
9
+ *
10
+ * Per-file layout is deliberate: each task is a standalone JSON file so that
11
+ * concurrent edits on different machines can merge cleanly via git.
12
+ */
13
+ export type TaskStatus = 'open' | 'assigned' | 'in_progress' | 'pending_review' | 'done' | 'closed';
14
+ export type TaskPriority = 'low' | 'medium' | 'high' | 'critical';
15
+ export type CheckAction = 'confirmed' | 'rejected' | 'commented';
16
+ export interface CheckEntry {
17
+ uid: string;
18
+ action: CheckAction;
19
+ comment?: string;
20
+ ts: string;
21
+ }
22
+ export interface CollabTask {
23
+ id: string;
24
+ title: string;
25
+ description: string;
26
+ status: TaskStatus;
27
+ priority: TaskPriority;
28
+ assignee?: string;
29
+ reporter: string;
30
+ check_log: CheckEntry[];
31
+ tags?: string[];
32
+ external_refs?: Array<{
33
+ type: string;
34
+ id: string;
35
+ url?: string;
36
+ }>;
37
+ created_at: string;
38
+ updated_at: string;
39
+ updated_by: string;
40
+ }
41
+ /** Absolute path to the human-collab tasks directory. */
42
+ export declare function getTasksDir(): string;
43
+ /** Absolute path to a specific task JSON file. */
44
+ export declare function getTaskFilePath(id: string): string;
45
+ /**
46
+ * Atomically read and increment the counter file, returning the next
47
+ * `TASK-XXX` formatted id. Creates the counter file at `1` if absent.
48
+ */
49
+ export declare function getNextTaskId(): string;
50
+ /**
51
+ * Read and validate a task JSON file. Returns null if the file is missing,
52
+ * unparseable, or does not match the CollabTask shape.
53
+ */
54
+ export declare function readTaskFile(filePath: string): CollabTask | null;
55
+ /**
56
+ * Atomic write of a task JSON file with pretty-printing.
57
+ */
58
+ export declare function writeTaskFile(filePath: string, task: CollabTask): void;
59
+ /**
60
+ * Create a new task. Generates the id via auto-increment counter, sets
61
+ * defaults (status=open, timestamps), and writes the JSON file.
62
+ */
63
+ export declare function createTask(opts: {
64
+ title: string;
65
+ description?: string;
66
+ priority?: TaskPriority;
67
+ reporter: string;
68
+ tags?: string[];
69
+ external_refs?: Array<{
70
+ type: string;
71
+ id: string;
72
+ url?: string;
73
+ }>;
74
+ }): CollabTask;
75
+ /**
76
+ * Read a single task by id. Returns null if the task does not exist or the
77
+ * file is invalid.
78
+ */
79
+ export declare function getTask(id: string): CollabTask | null;
80
+ /**
81
+ * Update a task by merging partial fields. Validates status transition if
82
+ * the `status` field is being changed. Throws if the task does not exist or
83
+ * the transition is invalid.
84
+ */
85
+ export declare function updateTask(id: string, partial: Partial<CollabTask>): CollabTask;
86
+ /**
87
+ * List all tasks, optionally filtered by status, assignee, reporter, or
88
+ * priority. Returns tasks sorted by id ascending.
89
+ */
90
+ export declare function listTasks(filters?: {
91
+ status?: TaskStatus;
92
+ assignee?: string;
93
+ reporter?: string;
94
+ priority?: TaskPriority;
95
+ }): CollabTask[];
96
+ /**
97
+ * Delete a task file. Throws if the task does not exist.
98
+ */
99
+ export declare function deleteTask(id: string): void;
100
+ /**
101
+ * Assign a task to a member. If the task is currently `open`, automatically
102
+ * transitions to `assigned`.
103
+ */
104
+ export declare function assignTask(id: string, uid: string): CollabTask;
105
+ /**
106
+ * Update task status with transition validation. Throws if the transition is
107
+ * not allowed by VALID_TRANSITIONS.
108
+ */
109
+ export declare function updateTaskStatus(id: string, newStatus: TaskStatus, updatedBy: string): CollabTask;
110
+ /**
111
+ * Append a check entry to a task's check_log. The timestamp is auto-generated.
112
+ * Existing entries are never modified or removed (append-only).
113
+ */
114
+ export declare function addCheckEntry(id: string, entry: Omit<CheckEntry, 'ts'>): CollabTask;
115
+ /**
116
+ * Validate that a status transition is allowed by VALID_TRANSITIONS.
117
+ * A transition from a status to itself is always allowed (no-op).
118
+ */
119
+ export declare function validateStatusTransition(from: TaskStatus, to: TaskStatus): boolean;
120
+ //# sourceMappingURL=team-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-tasks.d.ts","sourceRoot":"","sources":["../../../src/tools/team-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Human-team task management (team-lite collaboration, Wave 2).
3
+ *
4
+ * Owns `.workflow/collab/tasks/{id}.json` -- per-file task records.
5
+ *
6
+ * Strict namespace separation: this module belongs to the HUMAN collaboration
7
+ * domain (`.workflow/collab/`). It must NEVER touch `.workflow/.team/` which
8
+ * is the agent pipeline message bus owned by `src/tools/team-msg.ts`.
9
+ *
10
+ * Per-file layout is deliberate: each task is a standalone JSON file so that
11
+ * concurrent edits on different machines can merge cleanly via git.
12
+ */
13
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, unlinkSync, } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { getProjectRoot } from '../utils/path-validator.js';
16
+ import { resolveSelf } from './team-members.js';
17
+ import { reportActivity } from './team-activity.js';
18
+ import { notifyAdapters } from './collab-adapter.js';
19
+ // ---------------------------------------------------------------------------
20
+ // Constants
21
+ // ---------------------------------------------------------------------------
22
+ const VALID_TRANSITIONS = {
23
+ 'open': ['assigned', 'closed'],
24
+ 'assigned': ['in_progress', 'open', 'closed'],
25
+ 'in_progress': ['pending_review', 'assigned', 'closed'],
26
+ 'pending_review': ['done', 'in_progress', 'closed'],
27
+ 'done': ['closed', 'pending_review'],
28
+ 'closed': ['open'], // reopen
29
+ };
30
+ // ---------------------------------------------------------------------------
31
+ // Path helpers
32
+ // ---------------------------------------------------------------------------
33
+ /** Absolute path to the human-collab tasks directory. */
34
+ export function getTasksDir() {
35
+ const dir = join(getProjectRoot(), '.workflow', 'collab', 'tasks');
36
+ if (!existsSync(dir))
37
+ mkdirSync(dir, { recursive: true });
38
+ return dir;
39
+ }
40
+ /** Absolute path to a specific task JSON file. */
41
+ export function getTaskFilePath(id) {
42
+ return join(getTasksDir(), `${id}.json`);
43
+ }
44
+ /** Absolute path to the auto-increment counter file. */
45
+ function getCounterFilePath() {
46
+ return join(getTasksDir(), '.counter');
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // Counter / ID generation
50
+ // ---------------------------------------------------------------------------
51
+ /**
52
+ * Atomically read and increment the counter file, returning the next
53
+ * `TASK-XXX` formatted id. Creates the counter file at `1` if absent.
54
+ */
55
+ export function getNextTaskId() {
56
+ const counterPath = getCounterFilePath();
57
+ let next = 1;
58
+ if (existsSync(counterPath)) {
59
+ const raw = readFileSync(counterPath, 'utf-8').trim();
60
+ const parsed = parseInt(raw, 10);
61
+ if (!Number.isNaN(parsed)) {
62
+ next = parsed;
63
+ }
64
+ }
65
+ const id = `TASK-${String(next).padStart(3, '0')}`;
66
+ writeFileSync(counterPath, String(next + 1), 'utf-8');
67
+ return id;
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Internal read/write
71
+ // ---------------------------------------------------------------------------
72
+ /**
73
+ * Read and validate a task JSON file. Returns null if the file is missing,
74
+ * unparseable, or does not match the CollabTask shape.
75
+ */
76
+ export function readTaskFile(filePath) {
77
+ if (!existsSync(filePath))
78
+ return null;
79
+ try {
80
+ const raw = readFileSync(filePath, 'utf-8');
81
+ const parsed = JSON.parse(raw);
82
+ if (typeof parsed.id === 'string' &&
83
+ typeof parsed.title === 'string' &&
84
+ typeof parsed.description === 'string' &&
85
+ typeof parsed.status === 'string' &&
86
+ typeof parsed.priority === 'string' &&
87
+ typeof parsed.reporter === 'string' &&
88
+ Array.isArray(parsed.check_log) &&
89
+ typeof parsed.created_at === 'string' &&
90
+ typeof parsed.updated_at === 'string' &&
91
+ typeof parsed.updated_by === 'string') {
92
+ return parsed;
93
+ }
94
+ return null;
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * Atomic write of a task JSON file with pretty-printing.
102
+ */
103
+ export function writeTaskFile(filePath, task) {
104
+ writeFileSync(filePath, JSON.stringify(task, null, 2), 'utf-8');
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // CRUD operations
108
+ // ---------------------------------------------------------------------------
109
+ /**
110
+ * Create a new task. Generates the id via auto-increment counter, sets
111
+ * defaults (status=open, timestamps), and writes the JSON file.
112
+ */
113
+ export function createTask(opts) {
114
+ const id = getNextTaskId();
115
+ const now = new Date().toISOString();
116
+ const task = {
117
+ id,
118
+ title: opts.title,
119
+ description: opts.description ?? '',
120
+ status: 'open',
121
+ priority: opts.priority ?? 'medium',
122
+ reporter: opts.reporter,
123
+ check_log: [],
124
+ ...(opts.tags && opts.tags.length > 0 ? { tags: opts.tags } : {}),
125
+ ...(opts.external_refs && opts.external_refs.length > 0 ? { external_refs: opts.external_refs } : {}),
126
+ created_at: now,
127
+ updated_at: now,
128
+ updated_by: opts.reporter,
129
+ };
130
+ writeTaskFile(getTaskFilePath(id), task);
131
+ try {
132
+ notifyAdapters({
133
+ type: 'task.created',
134
+ payload: { id: task.id, title: task.title, priority: task.priority, reporter: task.reporter },
135
+ });
136
+ }
137
+ catch { /* fire-and-forget: never block */ }
138
+ return task;
139
+ }
140
+ /**
141
+ * Read a single task by id. Returns null if the task does not exist or the
142
+ * file is invalid.
143
+ */
144
+ export function getTask(id) {
145
+ const filePath = getTaskFilePath(id);
146
+ return readTaskFile(filePath);
147
+ }
148
+ /**
149
+ * Update a task by merging partial fields. Validates status transition if
150
+ * the `status` field is being changed. Throws if the task does not exist or
151
+ * the transition is invalid.
152
+ */
153
+ export function updateTask(id, partial) {
154
+ const task = getTask(id);
155
+ if (!task) {
156
+ throw new Error(`Task not found: ${id}`);
157
+ }
158
+ // Validate status transition if status is being changed.
159
+ if (partial.status !== undefined && partial.status !== task.status) {
160
+ if (!validateStatusTransition(task.status, partial.status)) {
161
+ throw new Error(`Invalid status transition: ${task.status} -> ${partial.status}`);
162
+ }
163
+ }
164
+ const now = new Date().toISOString();
165
+ const updated = {
166
+ ...task,
167
+ ...partial,
168
+ id: task.id, // id is immutable
169
+ created_at: task.created_at, // created_at is immutable
170
+ updated_at: now,
171
+ };
172
+ writeTaskFile(getTaskFilePath(id), updated);
173
+ return updated;
174
+ }
175
+ /**
176
+ * List all tasks, optionally filtered by status, assignee, reporter, or
177
+ * priority. Returns tasks sorted by id ascending.
178
+ */
179
+ export function listTasks(filters) {
180
+ const dir = getTasksDir();
181
+ let entries;
182
+ try {
183
+ entries = readdirSync(dir);
184
+ }
185
+ catch {
186
+ return [];
187
+ }
188
+ const out = [];
189
+ for (const entry of entries) {
190
+ if (!entry.endsWith('.json'))
191
+ continue;
192
+ const task = readTaskFile(join(dir, entry));
193
+ if (!task)
194
+ continue;
195
+ if (filters) {
196
+ if (filters.status !== undefined && task.status !== filters.status)
197
+ continue;
198
+ if (filters.assignee !== undefined && task.assignee !== filters.assignee)
199
+ continue;
200
+ if (filters.reporter !== undefined && task.reporter !== filters.reporter)
201
+ continue;
202
+ if (filters.priority !== undefined && task.priority !== filters.priority)
203
+ continue;
204
+ }
205
+ out.push(task);
206
+ }
207
+ // Sort by id ascending (TASK-001 before TASK-002).
208
+ out.sort((a, b) => a.id.localeCompare(b.id));
209
+ return out;
210
+ }
211
+ /**
212
+ * Delete a task file. Throws if the task does not exist.
213
+ */
214
+ export function deleteTask(id) {
215
+ const filePath = getTaskFilePath(id);
216
+ if (!existsSync(filePath)) {
217
+ throw new Error(`Task not found: ${id}`);
218
+ }
219
+ unlinkSync(filePath);
220
+ }
221
+ // ---------------------------------------------------------------------------
222
+ // Task operations
223
+ // ---------------------------------------------------------------------------
224
+ /**
225
+ * Assign a task to a member. If the task is currently `open`, automatically
226
+ * transitions to `assigned`.
227
+ */
228
+ export function assignTask(id, uid) {
229
+ const task = getTask(id);
230
+ if (!task) {
231
+ throw new Error(`Task not found: ${id}`);
232
+ }
233
+ const newStatus = task.status === 'open' ? 'assigned' : task.status;
234
+ const now = new Date().toISOString();
235
+ const updated = {
236
+ ...task,
237
+ assignee: uid,
238
+ status: newStatus,
239
+ updated_at: now,
240
+ updated_by: uid,
241
+ };
242
+ writeTaskFile(getTaskFilePath(id), updated);
243
+ try {
244
+ const self = resolveSelf();
245
+ if (self) {
246
+ reportActivity({
247
+ user: self.uid,
248
+ host: self.host,
249
+ action: 'task.assigned',
250
+ task_id: task.id,
251
+ target: uid,
252
+ });
253
+ }
254
+ }
255
+ catch { /* hot-path: never throw */ }
256
+ try {
257
+ notifyAdapters({
258
+ type: 'task.assigned',
259
+ payload: { id: task.id, assignee: uid },
260
+ recipients: [uid],
261
+ });
262
+ }
263
+ catch { /* fire-and-forget: never block */ }
264
+ return updated;
265
+ }
266
+ /**
267
+ * Update task status with transition validation. Throws if the transition is
268
+ * not allowed by VALID_TRANSITIONS.
269
+ */
270
+ export function updateTaskStatus(id, newStatus, updatedBy) {
271
+ const task = getTask(id);
272
+ if (!task) {
273
+ throw new Error(`Task not found: ${id}`);
274
+ }
275
+ if (!validateStatusTransition(task.status, newStatus)) {
276
+ throw new Error(`Invalid status transition: ${task.status} -> ${newStatus}`);
277
+ }
278
+ const oldStatus = task.status;
279
+ const now = new Date().toISOString();
280
+ const updated = {
281
+ ...task,
282
+ status: newStatus,
283
+ updated_at: now,
284
+ updated_by: updatedBy,
285
+ };
286
+ writeTaskFile(getTaskFilePath(id), updated);
287
+ try {
288
+ const self = resolveSelf();
289
+ if (self) {
290
+ reportActivity({
291
+ user: self.uid,
292
+ host: self.host,
293
+ action: 'task.status_changed',
294
+ task_id: task.id,
295
+ target: `${oldStatus}->${newStatus}`,
296
+ });
297
+ }
298
+ }
299
+ catch { /* hot-path: never throw */ }
300
+ try {
301
+ notifyAdapters({
302
+ type: 'task.status_changed',
303
+ payload: { id: task.id, from: oldStatus, to: newStatus },
304
+ });
305
+ }
306
+ catch { /* fire-and-forget: never block */ }
307
+ return updated;
308
+ }
309
+ /**
310
+ * Append a check entry to a task's check_log. The timestamp is auto-generated.
311
+ * Existing entries are never modified or removed (append-only).
312
+ */
313
+ export function addCheckEntry(id, entry) {
314
+ const task = getTask(id);
315
+ if (!task) {
316
+ throw new Error(`Task not found: ${id}`);
317
+ }
318
+ const fullEntry = {
319
+ ...entry,
320
+ ts: new Date().toISOString(),
321
+ };
322
+ const now = new Date().toISOString();
323
+ const updated = {
324
+ ...task,
325
+ check_log: [...task.check_log, fullEntry],
326
+ updated_at: now,
327
+ updated_by: entry.uid,
328
+ };
329
+ writeTaskFile(getTaskFilePath(id), updated);
330
+ try {
331
+ const self = resolveSelf();
332
+ if (self) {
333
+ reportActivity({
334
+ user: self.uid,
335
+ host: self.host,
336
+ action: 'task.checked',
337
+ task_id: task.id,
338
+ target: entry.action,
339
+ });
340
+ }
341
+ }
342
+ catch { /* hot-path: never throw */ }
343
+ try {
344
+ notifyAdapters({
345
+ type: 'task.checked',
346
+ payload: { id: task.id, action: entry.action, uid: entry.uid },
347
+ });
348
+ }
349
+ catch { /* fire-and-forget: never block */ }
350
+ return updated;
351
+ }
352
+ // ---------------------------------------------------------------------------
353
+ // Validation
354
+ // ---------------------------------------------------------------------------
355
+ /**
356
+ * Validate that a status transition is allowed by VALID_TRANSITIONS.
357
+ * A transition from a status to itself is always allowed (no-op).
358
+ */
359
+ export function validateStatusTransition(from, to) {
360
+ if (from === to)
361
+ return true;
362
+ const allowed = VALID_TRANSITIONS[from];
363
+ return allowed ? allowed.includes(to) : false;
364
+ }
365
+ //# sourceMappingURL=team-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-tasks.js","sourceRoot":"","sources":["../../../src/tools/team-tasks.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,9 @@ export declare function buildTransitionEntry(opts: BuildTransitionOpts): Transit
42
42
  /**
43
43
  * Append a transition entry to state.json's transition_history[].
44
44
  * Creates the array if it doesn't exist.
45
+ *
46
+ * For phase-completion transitions, evaluates the phase gate first.
47
+ * Throws if the gate blocks and force is false.
45
48
  */
46
49
  export declare function appendTransition(statePath: string, entry: TransitionEntry): void;
47
50
  //# sourceMappingURL=transition-recorder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transition-recorder.d.ts","sourceRoot":"","sources":["../../../src/tools/transition-recorder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAiB/E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAUhF"}
1
+ {"version":3,"file":"transition-recorder.d.ts","sourceRoot":"","sources":["../../../src/tools/transition-recorder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAiB/E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CA+BhF"}