agent-tempo 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/CLAUDE.md +253 -219
  2. package/LICENSE +21 -21
  3. package/README.md +293 -289
  4. package/assets/icon-dark.svg +9 -9
  5. package/assets/icon.svg +9 -9
  6. package/assets/logo-dark.svg +11 -11
  7. package/assets/logo-light.svg +11 -11
  8. package/dashboard/README.md +91 -91
  9. package/dashboard/dist/assets/{index-D6Xyje_n.js → index-jmYe6rmS.js} +2 -2
  10. package/dashboard/dist/assets/index-jmYe6rmS.js.map +1 -0
  11. package/dashboard/dist/index.html +20 -20
  12. package/dashboard/package.json +47 -47
  13. package/dist/activities/outbox.d.ts +30 -1
  14. package/dist/activities/outbox.js +96 -3
  15. package/dist/adapters/base.js +5 -0
  16. package/dist/adapters/copilot/adapter.js +12 -1
  17. package/dist/adapters/index.d.ts +1 -1
  18. package/dist/adapters/index.js +7 -0
  19. package/dist/adapters/pi/adapter.d.ts +2 -0
  20. package/dist/adapters/pi/adapter.js +43 -0
  21. package/dist/adapters/pi/index.d.ts +16 -0
  22. package/dist/adapters/pi/index.js +10 -0
  23. package/dist/cli/global-wrapper.d.ts +19 -0
  24. package/dist/cli/global-wrapper.js +169 -0
  25. package/dist/cli/help-text.js +97 -97
  26. package/dist/cli/startup.js +11 -0
  27. package/dist/cli/upgrade-command.js +81 -81
  28. package/dist/cli.js +12 -0
  29. package/dist/client/core.js +9 -2
  30. package/dist/client/interface.d.ts +6 -0
  31. package/dist/config.d.ts +79 -0
  32. package/dist/config.js +74 -0
  33. package/dist/daemon.js +37 -1
  34. package/dist/http/aggregate.d.ts +22 -1
  35. package/dist/http/aggregate.js +41 -0
  36. package/dist/http/auth.d.ts +94 -8
  37. package/dist/http/auth.js +93 -9
  38. package/dist/http/body.d.ts +4 -1
  39. package/dist/http/body.js +6 -3
  40. package/dist/http/event-bus.js +1 -0
  41. package/dist/http/event-types.d.ts +34 -2
  42. package/dist/http/event-types.js +1 -0
  43. package/dist/http/gate-audit.d.ts +12 -0
  44. package/dist/http/gate-audit.js +95 -0
  45. package/dist/http/gate-registry.d.ts +167 -0
  46. package/dist/http/gate-registry.js +163 -0
  47. package/dist/http/gate-routes.d.ts +48 -0
  48. package/dist/http/gate-routes.js +102 -0
  49. package/dist/http/ingest-registry.d.ts +30 -0
  50. package/dist/http/ingest-registry.js +108 -0
  51. package/dist/http/inner-loop-routes.d.ts +66 -0
  52. package/dist/http/inner-loop-routes.js +182 -0
  53. package/dist/http/inner-loop.d.ts +92 -0
  54. package/dist/http/inner-loop.js +155 -0
  55. package/dist/http/server.d.ts +38 -3
  56. package/dist/http/server.js +211 -6
  57. package/dist/http/snapshot.d.ts +6 -0
  58. package/dist/http/snapshot.js +6 -0
  59. package/dist/pi/cue-pump.d.ts +61 -0
  60. package/dist/pi/cue-pump.js +95 -0
  61. package/dist/pi/extension.d.ts +45 -0
  62. package/dist/pi/extension.js +407 -0
  63. package/dist/pi/gate-client.d.ts +54 -0
  64. package/dist/pi/gate-client.js +136 -0
  65. package/dist/pi/headless.d.ts +85 -0
  66. package/dist/pi/headless.js +224 -0
  67. package/dist/pi/index.d.ts +28 -0
  68. package/dist/pi/index.js +43 -0
  69. package/dist/pi/inner-loop-client.d.ts +67 -0
  70. package/dist/pi/inner-loop-client.js +164 -0
  71. package/dist/pi/inner-loop-publisher.d.ts +187 -0
  72. package/dist/pi/inner-loop-publisher.js +236 -0
  73. package/dist/pi/lazy-proxy.d.ts +37 -0
  74. package/dist/pi/lazy-proxy.js +55 -0
  75. package/dist/pi/mission-control/actions.d.ts +48 -0
  76. package/dist/pi/mission-control/actions.js +98 -0
  77. package/dist/pi/mission-control/board.d.ts +53 -0
  78. package/dist/pi/mission-control/board.js +104 -0
  79. package/dist/pi/mission-control/extension.d.ts +44 -0
  80. package/dist/pi/mission-control/extension.js +251 -0
  81. package/dist/pi/mission-control/index.d.ts +15 -0
  82. package/dist/pi/mission-control/index.js +32 -0
  83. package/dist/pi/mission-control/inner-tail.d.ts +48 -0
  84. package/dist/pi/mission-control/inner-tail.js +76 -0
  85. package/dist/pi/mission-control/pi-ui.d.ts +43 -0
  86. package/dist/pi/mission-control/pi-ui.js +10 -0
  87. package/dist/pi/mission-control/render.d.ts +6 -0
  88. package/dist/pi/mission-control/render.js +95 -0
  89. package/dist/pi/phase-driver.d.ts +74 -0
  90. package/dist/pi/phase-driver.js +122 -0
  91. package/dist/pi/pi-types.d.ts +208 -0
  92. package/dist/pi/pi-types.js +21 -0
  93. package/dist/pi/probe.d.ts +80 -0
  94. package/dist/pi/probe.js +154 -0
  95. package/dist/pi/render-tools.d.ts +17 -0
  96. package/dist/pi/render-tools.js +51 -0
  97. package/dist/pi/reset-pump.d.ts +47 -0
  98. package/dist/pi/reset-pump.js +85 -0
  99. package/dist/pi/tool-capability.d.ts +60 -0
  100. package/dist/pi/tool-capability.js +156 -0
  101. package/dist/pi/workflow-client.d.ts +158 -0
  102. package/dist/pi/workflow-client.js +289 -0
  103. package/dist/pi/zod-to-typebox.d.ts +74 -0
  104. package/dist/pi/zod-to-typebox.js +191 -0
  105. package/dist/scripts/verify-daemon-isolation-guard.js +24 -24
  106. package/dist/server-tools.d.ts +2 -0
  107. package/dist/server-tools.js +50 -46
  108. package/dist/server.js +4 -0
  109. package/dist/spawn.d.ts +55 -0
  110. package/dist/spawn.js +84 -12
  111. package/dist/tools/agent-types.d.ts +2 -2
  112. package/dist/tools/agent-types.js +22 -17
  113. package/dist/tools/attachment-info.d.ts +2 -2
  114. package/dist/tools/attachment-info.js +38 -33
  115. package/dist/tools/broadcast.d.ts +2 -2
  116. package/dist/tools/broadcast.js +69 -64
  117. package/dist/tools/cancel-stage.d.ts +2 -2
  118. package/dist/tools/cancel-stage.js +20 -15
  119. package/dist/tools/clear-state.d.ts +2 -2
  120. package/dist/tools/clear-state.js +25 -20
  121. package/dist/tools/coat-check-evict.d.ts +2 -2
  122. package/dist/tools/coat-check-evict.js +30 -25
  123. package/dist/tools/coat-check-get.d.ts +2 -2
  124. package/dist/tools/coat-check-get.js +39 -34
  125. package/dist/tools/coat-check-list.d.ts +2 -2
  126. package/dist/tools/coat-check-list.js +48 -43
  127. package/dist/tools/coat-check-put.d.ts +2 -2
  128. package/dist/tools/coat-check-put.js +41 -36
  129. package/dist/tools/cue.d.ts +2 -2
  130. package/dist/tools/cue.js +57 -52
  131. package/dist/tools/descriptor.d.ts +72 -0
  132. package/dist/tools/descriptor.js +39 -0
  133. package/dist/tools/destroy.d.ts +2 -2
  134. package/dist/tools/destroy.js +153 -148
  135. package/dist/tools/ensemble.d.ts +2 -2
  136. package/dist/tools/ensemble.js +71 -66
  137. package/dist/tools/evaluate-gate.d.ts +2 -2
  138. package/dist/tools/evaluate-gate.js +33 -27
  139. package/dist/tools/fetch-state.d.ts +2 -2
  140. package/dist/tools/fetch-state.js +43 -38
  141. package/dist/tools/gates.d.ts +2 -2
  142. package/dist/tools/gates.js +39 -34
  143. package/dist/tools/hosts.d.ts +2 -2
  144. package/dist/tools/hosts.js +25 -20
  145. package/dist/tools/listen.d.ts +2 -2
  146. package/dist/tools/listen.js +23 -18
  147. package/dist/tools/load-lineup.d.ts +2 -2
  148. package/dist/tools/load-lineup.js +324 -319
  149. package/dist/tools/migrate.d.ts +2 -2
  150. package/dist/tools/migrate.js +45 -40
  151. package/dist/tools/pause.d.ts +2 -2
  152. package/dist/tools/pause.js +34 -29
  153. package/dist/tools/play.d.ts +2 -2
  154. package/dist/tools/play.js +53 -48
  155. package/dist/tools/quality-gate.d.ts +2 -2
  156. package/dist/tools/quality-gate.js +26 -21
  157. package/dist/tools/recall.d.ts +2 -2
  158. package/dist/tools/recall.js +32 -27
  159. package/dist/tools/recruit.d.ts +2 -2
  160. package/dist/tools/recruit.js +325 -256
  161. package/dist/tools/release.d.ts +2 -2
  162. package/dist/tools/release.js +85 -80
  163. package/dist/tools/report.d.ts +2 -2
  164. package/dist/tools/report.js +28 -23
  165. package/dist/tools/reset.d.ts +3 -0
  166. package/dist/tools/reset.js +51 -0
  167. package/dist/tools/restart.d.ts +2 -2
  168. package/dist/tools/restart.js +51 -46
  169. package/dist/tools/restore.d.ts +2 -2
  170. package/dist/tools/restore.js +76 -71
  171. package/dist/tools/save-lineup.d.ts +2 -2
  172. package/dist/tools/save-lineup.js +32 -27
  173. package/dist/tools/save-state.d.ts +2 -2
  174. package/dist/tools/save-state.js +43 -38
  175. package/dist/tools/schedule.d.ts +2 -2
  176. package/dist/tools/schedule.js +133 -128
  177. package/dist/tools/schedules.d.ts +2 -2
  178. package/dist/tools/schedules.js +41 -36
  179. package/dist/tools/set-ensemble-description.d.ts +2 -2
  180. package/dist/tools/set-ensemble-description.js +26 -21
  181. package/dist/tools/set-name.d.ts +2 -2
  182. package/dist/tools/set-name.js +38 -33
  183. package/dist/tools/set-part.d.ts +2 -2
  184. package/dist/tools/set-part.js +20 -15
  185. package/dist/tools/shutdown.d.ts +2 -2
  186. package/dist/tools/shutdown.js +39 -34
  187. package/dist/tools/stage.d.ts +2 -2
  188. package/dist/tools/stage.js +28 -23
  189. package/dist/tools/stages.d.ts +2 -2
  190. package/dist/tools/stages.js +36 -31
  191. package/dist/tools/unschedule.d.ts +2 -2
  192. package/dist/tools/unschedule.js +30 -25
  193. package/dist/tools/who-am-i.d.ts +2 -2
  194. package/dist/tools/who-am-i.js +36 -31
  195. package/dist/tools/worktree.d.ts +2 -2
  196. package/dist/tools/worktree.js +134 -129
  197. package/dist/tui/index.js +6 -6
  198. package/dist/types.d.ts +47 -2
  199. package/dist/types.js +1 -1
  200. package/dist/utils/default-part.js +1 -0
  201. package/dist/utils/grpc-shutdown-guard.d.ts +52 -0
  202. package/dist/utils/grpc-shutdown-guard.js +88 -0
  203. package/dist/utils/sdk-probe.d.ts +23 -0
  204. package/dist/utils/sdk-probe.js +46 -7
  205. package/dist/worker.d.ts +3 -1
  206. package/dist/worker.js +6 -2
  207. package/dist/workflows/session.js +70 -2
  208. package/dist/workflows/signals.d.ts +32 -2
  209. package/dist/workflows/signals.js +25 -2
  210. package/examples/agents/tempo-composer.md +56 -56
  211. package/examples/agents/tempo-conductor.md +117 -117
  212. package/examples/agents/tempo-critic.md +73 -73
  213. package/examples/agents/tempo-improv.md +74 -74
  214. package/examples/agents/tempo-liner.md +75 -75
  215. package/examples/agents/tempo-roadie.md +61 -61
  216. package/examples/agents/tempo-soloist.md +71 -71
  217. package/examples/agents/tempo-tuner.md +94 -94
  218. package/examples/ensembles/tempo-big-band.yaml +146 -146
  219. package/examples/ensembles/tempo-dev-team.yaml +58 -58
  220. package/examples/ensembles/tempo-headless-jam.yaml +77 -77
  221. package/examples/ensembles/tempo-jam-session.yaml +41 -41
  222. package/examples/ensembles/tempo-mock-jam.yaml +79 -79
  223. package/examples/ensembles/tempo-review-squad.yaml +32 -32
  224. package/package.json +176 -173
  225. package/packaging/launchd/com.agent.tempo.plist +46 -46
  226. package/packaging/systemd/agent-tempo.service +32 -32
  227. package/packaging/windows/install-task.ps1 +71 -71
  228. package/scenarios/conductor-recruit-mock.yaml +33 -33
  229. package/scenarios/echo-roundtrip.yaml +15 -15
  230. package/scenarios/multi-player-handoff.yaml +38 -38
  231. package/scenarios/recruit-cascade.yaml +38 -38
  232. package/scenarios/two-player-conversation.yaml +33 -33
  233. package/workflow-bundle.js +97 -6
  234. package/dashboard/dist/assets/index-D6Xyje_n.js.map +0 -1
  235. package/dist/activities/claude-stop.d.ts +0 -21
  236. package/dist/activities/claude-stop.js +0 -94
  237. package/dist/channel.d.ts +0 -3
  238. package/dist/channel.js +0 -48
  239. package/dist/copilot-bridge.d.ts +0 -22
  240. package/dist/copilot-bridge.js +0 -565
  241. package/dist/scripts/258-spotcheck.js +0 -303
  242. package/dist/tools/detach.d.ts +0 -4
  243. package/dist/tools/detach.js +0 -45
  244. package/dist/tools/encore.d.ts +0 -4
  245. package/dist/tools/encore.js +0 -31
  246. package/dist/tools/helpers.d.ts +0 -21
  247. package/dist/tools/helpers.js +0 -25
  248. package/dist/tools/pause-ensemble.d.ts +0 -4
  249. package/dist/tools/pause-ensemble.js +0 -58
  250. package/dist/tools/resume-ensemble.d.ts +0 -4
  251. package/dist/tools/resume-ensemble.js +0 -79
  252. package/dist/tools/stop.d.ts +0 -4
  253. package/dist/tools/stop.js +0 -29
  254. package/dist/tui/client.d.ts +0 -6
  255. package/dist/tui/client.js +0 -9
  256. package/dist/tui/components/ActivityLog.d.ts +0 -16
  257. package/dist/tui/components/ActivityLog.js +0 -36
  258. package/dist/tui/components/CommandOverlay.d.ts +0 -15
  259. package/dist/tui/components/CommandOverlay.js +0 -34
  260. package/dist/tui/components/ConductorChat.d.ts +0 -16
  261. package/dist/tui/components/ConductorChat.js +0 -32
  262. package/dist/tui/components/EnsembleListView.d.ts +0 -14
  263. package/dist/tui/components/EnsembleListView.js +0 -32
  264. package/dist/tui/components/EnsemblePanel.d.ts +0 -12
  265. package/dist/tui/components/EnsemblePanel.js +0 -40
  266. package/dist/tui/components/InputBar.d.ts +0 -13
  267. package/dist/tui/components/InputBar.js +0 -58
  268. package/dist/tui/components/ScheduleOverlay.d.ts +0 -13
  269. package/dist/tui/components/ScheduleOverlay.js +0 -113
  270. package/dist/tui/components/TopBar.d.ts +0 -12
  271. package/dist/tui/components/TopBar.js +0 -15
  272. package/dist/tui/core-api.d.ts +0 -26
  273. package/dist/tui/core-api.js +0 -67
  274. package/dist/tui/hooks/useEnsembleDiscovery.d.ts +0 -3
  275. package/dist/tui/hooks/useEnsembleDiscovery.js +0 -30
  276. package/dist/tui/hooks/useMaestroPoller.d.ts +0 -3
  277. package/dist/tui/hooks/useMaestroPoller.js +0 -36
  278. package/dist/tui/hooks/useSendCommand.d.ts +0 -7
  279. package/dist/tui/hooks/useSendCommand.js +0 -29
  280. package/dist/utils/bg-preflight.d.ts +0 -25
  281. package/dist/utils/bg-preflight.js +0 -154
@@ -1,9 +1,9 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
2
- <!-- Ultra-minimal metronome icon: triangle + pendulum (dark mode) -->
3
- <!-- Metronome body — single-stroke triangle -->
4
- <path d="M32 8 L14 54 L50 54 Z" stroke="#FAF3EE" stroke-width="3" fill="none" stroke-linejoin="round"/>
5
- <!-- Pendulum arm (angled right) -->
6
- <line x1="32" y1="46" x2="44" y2="14" stroke="#E07A5F" stroke-width="3" stroke-linecap="round"/>
7
- <!-- Pivot dot -->
8
- <circle cx="32" cy="46" r="3" fill="#E07A5F"/>
9
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
2
+ <!-- Ultra-minimal metronome icon: triangle + pendulum (dark mode) -->
3
+ <!-- Metronome body — single-stroke triangle -->
4
+ <path d="M32 8 L14 54 L50 54 Z" stroke="#FAF3EE" stroke-width="3" fill="none" stroke-linejoin="round"/>
5
+ <!-- Pendulum arm (angled right) -->
6
+ <line x1="32" y1="46" x2="44" y2="14" stroke="#E07A5F" stroke-width="3" stroke-linecap="round"/>
7
+ <!-- Pivot dot -->
8
+ <circle cx="32" cy="46" r="3" fill="#E07A5F"/>
9
+ </svg>
package/assets/icon.svg CHANGED
@@ -1,9 +1,9 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
2
- <!-- Ultra-minimal metronome icon: triangle + pendulum -->
3
- <!-- Metronome body — single-stroke triangle -->
4
- <path d="M32 8 L14 54 L50 54 Z" stroke="#1B2838" stroke-width="3" fill="none" stroke-linejoin="round"/>
5
- <!-- Pendulum arm (angled right) -->
6
- <line x1="32" y1="46" x2="44" y2="14" stroke="#E07A5F" stroke-width="3" stroke-linecap="round"/>
7
- <!-- Pivot dot -->
8
- <circle cx="32" cy="46" r="3" fill="#E07A5F"/>
9
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
2
+ <!-- Ultra-minimal metronome icon: triangle + pendulum -->
3
+ <!-- Metronome body — single-stroke triangle -->
4
+ <path d="M32 8 L14 54 L50 54 Z" stroke="#1B2838" stroke-width="3" fill="none" stroke-linejoin="round"/>
5
+ <!-- Pendulum arm (angled right) -->
6
+ <line x1="32" y1="46" x2="44" y2="14" stroke="#E07A5F" stroke-width="3" stroke-linecap="round"/>
7
+ <!-- Pivot dot -->
8
+ <circle cx="32" cy="46" r="3" fill="#E07A5F"/>
9
+ </svg>
@@ -1,11 +1,11 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 140" fill="none">
2
- <!-- Ultra-minimal metronome: triangle outline + pendulum line (dark mode) -->
3
- <!-- Metronome body — single-stroke triangle -->
4
- <path d="M160 18 L122 100 L198 100 Z" stroke="#FAF3EE" stroke-width="3" fill="none" stroke-linejoin="round"/>
5
- <!-- Pendulum arm (angled right ~18deg) -->
6
- <line x1="160" y1="88" x2="182" y2="24" stroke="#E07A5F" stroke-width="3" stroke-linecap="round"/>
7
- <!-- Pivot dot -->
8
- <circle cx="160" cy="88" r="3.5" fill="#E07A5F"/>
9
- <!-- Text -->
10
- <text x="160" y="132" text-anchor="middle" font-family="'JetBrains Mono','SF Mono','Consolas',monospace" font-size="18" font-weight="600" fill="#FAF3EE" letter-spacing="-0.5">agent-tempo</text>
11
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 140" fill="none">
2
+ <!-- Ultra-minimal metronome: triangle outline + pendulum line (dark mode) -->
3
+ <!-- Metronome body — single-stroke triangle -->
4
+ <path d="M160 18 L122 100 L198 100 Z" stroke="#FAF3EE" stroke-width="3" fill="none" stroke-linejoin="round"/>
5
+ <!-- Pendulum arm (angled right ~18deg) -->
6
+ <line x1="160" y1="88" x2="182" y2="24" stroke="#E07A5F" stroke-width="3" stroke-linecap="round"/>
7
+ <!-- Pivot dot -->
8
+ <circle cx="160" cy="88" r="3.5" fill="#E07A5F"/>
9
+ <!-- Text -->
10
+ <text x="160" y="132" text-anchor="middle" font-family="'JetBrains Mono','SF Mono','Consolas',monospace" font-size="18" font-weight="600" fill="#FAF3EE" letter-spacing="-0.5">agent-tempo</text>
11
+ </svg>
@@ -1,11 +1,11 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 140" fill="none">
2
- <!-- Ultra-minimal metronome: triangle outline + pendulum line -->
3
- <!-- Metronome body — single-stroke triangle -->
4
- <path d="M160 18 L122 100 L198 100 Z" stroke="#1B2838" stroke-width="3" fill="none" stroke-linejoin="round"/>
5
- <!-- Pendulum arm (angled right ~18deg) -->
6
- <line x1="160" y1="88" x2="182" y2="24" stroke="#E07A5F" stroke-width="3" stroke-linecap="round"/>
7
- <!-- Pivot dot -->
8
- <circle cx="160" cy="88" r="3.5" fill="#E07A5F"/>
9
- <!-- Text -->
10
- <text x="160" y="132" text-anchor="middle" font-family="'JetBrains Mono','SF Mono','Consolas',monospace" font-size="18" font-weight="600" fill="#1B2838" letter-spacing="-0.5">agent-tempo</text>
11
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 140" fill="none">
2
+ <!-- Ultra-minimal metronome: triangle outline + pendulum line -->
3
+ <!-- Metronome body — single-stroke triangle -->
4
+ <path d="M160 18 L122 100 L198 100 Z" stroke="#1B2838" stroke-width="3" fill="none" stroke-linejoin="round"/>
5
+ <!-- Pendulum arm (angled right ~18deg) -->
6
+ <line x1="160" y1="88" x2="182" y2="24" stroke="#E07A5F" stroke-width="3" stroke-linecap="round"/>
7
+ <!-- Pivot dot -->
8
+ <circle cx="160" cy="88" r="3.5" fill="#E07A5F"/>
9
+ <!-- Text -->
10
+ <text x="160" y="132" text-anchor="middle" font-family="'JetBrains Mono','SF Mono','Consolas',monospace" font-size="18" font-weight="600" fill="#1B2838" letter-spacing="-0.5">agent-tempo</text>
11
+ </svg>
@@ -1,91 +1,91 @@
1
- # agent-tempo dashboard
2
-
3
- A web dashboard for managing agent-tempo ensembles. Bundled into the npm package and served by the daemon at `/dashboard/*`.
4
-
5
- This directory is a **sibling project** to the main `src/` TypeScript build — independent `node_modules`, build artifacts, and tooling. The shared `agent-tempo` source lives at `../src/` and is reachable via the `agent-tempo/*` path alias (configured in `vite.config.ts` and `tsconfig.json`).
6
-
7
- ## Status
8
-
9
- PR-2 of [#340](https://github.com/vinceblank/agent-tempo/issues/340) — Vite + Tailwind 4 scaffold + AppShell + testability infra. The shell renders a brandmark, sidebar, and page header; **no real data is wired yet**. PR-4 introduces `TempoClient` integration; PR-5 fills out the read-only screens.
10
-
11
- ## Stack (locked — see [`docs/adr/0013-web-dashboard.md`](../docs/adr/0013-web-dashboard.md))
12
-
13
- | Layer | Pin |
14
- |---|---|
15
- | React | 19.2.5 |
16
- | Vite | 8.0.10 |
17
- | Tailwind | 4.2.4 (Oxide engine, CSS-first `@theme`) |
18
- | shadcn | 4.5.0 (committed source under `src/components/ui/`) |
19
- | TanStack Query | 5.100.5 |
20
- | React Router | 7.14.2 |
21
- | Zustand | ^5 |
22
- | size-limit | 12.1.0 |
23
- | Tests | Vitest (component) + Playwright (e2e smoke, future) |
24
-
25
- Browser support floor: last two evergreen of Chrome/Edge/Safari/Firefox; **Safari ≥ 16**. Older Safari is excluded because the design tokens use `oklch()` which requires ≥ 15.4; we set the floor at 16 to align CSS and ECMA targets.
26
-
27
- ## Dev workflow
28
-
29
- ```bash
30
- # from repo root
31
- npm --prefix dashboard install # one-time
32
- npm --prefix dashboard run dev # Vite dev server on :5173, proxies /v1/* and /dashboard/api/* to the daemon at 8473
33
- npm --prefix dashboard run build # production bundle → dashboard/dist/
34
- npm --prefix dashboard run lint
35
- npm --prefix dashboard run test
36
- ```
37
-
38
- `npm run build` at the repo root invokes `npm --prefix dashboard run build` as part of the full build pipeline. Target overhead: **+30 s**; if exceeded, the design doc has a fallback (split out as a release-only `build:dashboard`).
39
-
40
- ## Testability
41
-
42
- This dashboard is tested both by Vitest (component tests) and by an autonomous AI agent (the agent-tempo conductor) using `mcp__claude-in-chrome__*` browser automation tools. Tailwind class names are **NOT** a stable test surface; `data-testid` is.
43
-
44
- Every interactive or state-significant element MUST carry a stable `data-testid` attribute.
45
-
46
- ### Naming convention
47
-
48
- `<surface>-<action-or-state>-<identifier>` — kebab-case, lowercased.
49
-
50
- Examples:
51
-
52
- - `data-testid="player-row-tempo-conductor"`
53
- - `data-testid="cue-input"` / `data-testid="cue-submit"`
54
- - `data-testid="broadcast-badge"`
55
- - `data-testid="conductor-indicator"`
56
- - `data-testid="loading"` + `data-resource="ensemble-list"` (loading states)
57
- - `data-testid="error-toast"` + `role="alert"` (errors)
58
- - `data-testid="settings-theme-toggle"` / `data-testid="settings-density-slider"`
59
-
60
- If an element is genuinely test-irrelevant (pure decoration, screen-reader-only utility text), add `data-testid-exempt="<reason>"` instead. The `tests/testid-coverage.test.tsx` Vitest crawl asserts every `button`, `input`, `select`, `textarea`, and `[role="button"]` has either `data-testid` or `data-testid-exempt`.
61
-
62
- ### Banned
63
-
64
- - `window.confirm`, `window.alert`, `window.prompt` — they block claude-in-chrome and pause the autonomous validation driver until a human dismisses them. Use shadcn `AlertDialog` / `Dialog` / Sonner toast instead.
65
- - Native `<dialog>` elements — same blocking behaviour. Use shadcn `Dialog` / `AlertDialog` / `Sheet`.
66
-
67
- ESLint enforces both bans; lint is build-blocking (see `eslint.config.js`).
68
-
69
- ### Console logging
70
-
71
- State transitions, mutations, and SSE events MUST log via `logEvent(action, kvs)` from `src/lib/log.ts`. Output format:
72
-
73
- ```
74
- [agent-tempo:dashboard] <action> key=value key=value
75
- ```
76
-
77
- The conductor's autonomous validation script can `mcp__claude-in-chrome__read_console_messages` with the regex `\[agent-tempo:dashboard\]` to verify state transitions without parsing the DOM. This mirrors the `[agent-tempo:adapter]` shape used by adapter heartbeat logs (#249).
78
-
79
- Debug-level logs are gated by `?debug=1` in the URL or `localStorage.agentTempoDebug = 'true'`.
80
-
81
- ## Design tokens
82
-
83
- The canonical design lives at [`docs/design/dashboard-handoff/`](../docs/design/dashboard-handoff/). Tokens are ported into `src/styles/tokens.css` with the Tailwind 4 `@theme` directive; the §8.1 `--bg-3`/`--muted` swap is documented inline.
84
-
85
- Custom tempo motifs (Metronome, TempoStrip, PhaseDot, PlayerAvatar, TypeBadge, Brandmark) live under `src/components/tempo/` (PR-2 ships only Brandmark; the rest land in PR-4/PR-5).
86
-
87
- ## Reference / fork-and-customize
88
-
89
- This dashboard is structured to be **reasonably forkable** as a starting point against `TempoClient`. Downstream consumers building their own dashboard against agent-tempo can copy this directory, adjust the path alias, and replace `src/components/` to taste while reusing the AppShell + prefs scaffolding.
90
-
91
- Detailed fork notes will land in a follow-up PR once PR-4 wires up `TempoClient` and the integration shape is stable.
1
+ # agent-tempo dashboard
2
+
3
+ A web dashboard for managing agent-tempo ensembles. Bundled into the npm package and served by the daemon at `/dashboard/*`.
4
+
5
+ This directory is a **sibling project** to the main `src/` TypeScript build — independent `node_modules`, build artifacts, and tooling. The shared `agent-tempo` source lives at `../src/` and is reachable via the `agent-tempo/*` path alias (configured in `vite.config.ts` and `tsconfig.json`).
6
+
7
+ ## Status
8
+
9
+ PR-2 of [#340](https://github.com/vinceblank/agent-tempo/issues/340) — Vite + Tailwind 4 scaffold + AppShell + testability infra. The shell renders a brandmark, sidebar, and page header; **no real data is wired yet**. PR-4 introduces `TempoClient` integration; PR-5 fills out the read-only screens.
10
+
11
+ ## Stack (locked — see [`docs/adr/0013-web-dashboard.md`](../docs/adr/0013-web-dashboard.md))
12
+
13
+ | Layer | Pin |
14
+ |---|---|
15
+ | React | 19.2.5 |
16
+ | Vite | 8.0.10 |
17
+ | Tailwind | 4.2.4 (Oxide engine, CSS-first `@theme`) |
18
+ | shadcn | 4.5.0 (committed source under `src/components/ui/`) |
19
+ | TanStack Query | 5.100.5 |
20
+ | React Router | 7.14.2 |
21
+ | Zustand | ^5 |
22
+ | size-limit | 12.1.0 |
23
+ | Tests | Vitest (component) + Playwright (e2e smoke, future) |
24
+
25
+ Browser support floor: last two evergreen of Chrome/Edge/Safari/Firefox; **Safari ≥ 16**. Older Safari is excluded because the design tokens use `oklch()` which requires ≥ 15.4; we set the floor at 16 to align CSS and ECMA targets.
26
+
27
+ ## Dev workflow
28
+
29
+ ```bash
30
+ # from repo root
31
+ npm --prefix dashboard install # one-time
32
+ npm --prefix dashboard run dev # Vite dev server on :5173, proxies /v1/* and /dashboard/api/* to the daemon at 8473
33
+ npm --prefix dashboard run build # production bundle → dashboard/dist/
34
+ npm --prefix dashboard run lint
35
+ npm --prefix dashboard run test
36
+ ```
37
+
38
+ `npm run build` at the repo root invokes `npm --prefix dashboard run build` as part of the full build pipeline. Target overhead: **+30 s**; if exceeded, the design doc has a fallback (split out as a release-only `build:dashboard`).
39
+
40
+ ## Testability
41
+
42
+ This dashboard is tested both by Vitest (component tests) and by an autonomous AI agent (the agent-tempo conductor) using `mcp__claude-in-chrome__*` browser automation tools. Tailwind class names are **NOT** a stable test surface; `data-testid` is.
43
+
44
+ Every interactive or state-significant element MUST carry a stable `data-testid` attribute.
45
+
46
+ ### Naming convention
47
+
48
+ `<surface>-<action-or-state>-<identifier>` — kebab-case, lowercased.
49
+
50
+ Examples:
51
+
52
+ - `data-testid="player-row-tempo-conductor"`
53
+ - `data-testid="cue-input"` / `data-testid="cue-submit"`
54
+ - `data-testid="broadcast-badge"`
55
+ - `data-testid="conductor-indicator"`
56
+ - `data-testid="loading"` + `data-resource="ensemble-list"` (loading states)
57
+ - `data-testid="error-toast"` + `role="alert"` (errors)
58
+ - `data-testid="settings-theme-toggle"` / `data-testid="settings-density-slider"`
59
+
60
+ If an element is genuinely test-irrelevant (pure decoration, screen-reader-only utility text), add `data-testid-exempt="<reason>"` instead. The `tests/testid-coverage.test.tsx` Vitest crawl asserts every `button`, `input`, `select`, `textarea`, and `[role="button"]` has either `data-testid` or `data-testid-exempt`.
61
+
62
+ ### Banned
63
+
64
+ - `window.confirm`, `window.alert`, `window.prompt` — they block claude-in-chrome and pause the autonomous validation driver until a human dismisses them. Use shadcn `AlertDialog` / `Dialog` / Sonner toast instead.
65
+ - Native `<dialog>` elements — same blocking behaviour. Use shadcn `Dialog` / `AlertDialog` / `Sheet`.
66
+
67
+ ESLint enforces both bans; lint is build-blocking (see `eslint.config.js`).
68
+
69
+ ### Console logging
70
+
71
+ State transitions, mutations, and SSE events MUST log via `logEvent(action, kvs)` from `src/lib/log.ts`. Output format:
72
+
73
+ ```
74
+ [agent-tempo:dashboard] <action> key=value key=value
75
+ ```
76
+
77
+ The conductor's autonomous validation script can `mcp__claude-in-chrome__read_console_messages` with the regex `\[agent-tempo:dashboard\]` to verify state transitions without parsing the DOM. This mirrors the `[agent-tempo:adapter]` shape used by adapter heartbeat logs (#249).
78
+
79
+ Debug-level logs are gated by `?debug=1` in the URL or `localStorage.agentTempoDebug = 'true'`.
80
+
81
+ ## Design tokens
82
+
83
+ The canonical design lives at [`docs/design/dashboard-handoff/`](../docs/design/dashboard-handoff/). Tokens are ported into `src/styles/tokens.css` with the Tailwind 4 `@theme` directive; the §8.1 `--bg-3`/`--muted` swap is documented inline.
84
+
85
+ Custom tempo motifs (Metronome, TempoStrip, PhaseDot, PlayerAvatar, TypeBadge, Brandmark) live under `src/components/tempo/` (PR-2 ships only Brandmark; the rest land in PR-4/PR-5).
86
+
87
+ ## Reference / fork-and-customize
88
+
89
+ This dashboard is structured to be **reasonably forkable** as a starting point against `TempoClient`. Downstream consumers building their own dashboard against agent-tempo can copy this directory, adjust the path alias, and replace `src/components/` to taste while reusing the AppShell + prefs scaffolding.
90
+
91
+ Detailed fork notes will land in a follow-up PR once PR-4 wires up `TempoClient` and the integration shape is stable.