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
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026-present vinceblank
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026-present vinceblank
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,289 +1,293 @@
1
- <p align="center">
2
- <picture>
3
- <source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.svg">
4
- <source media="(prefers-color-scheme: light)" srcset="assets/logo-light.svg">
5
- <img alt="agent-tempo" src="assets/logo-light.svg" height="140">
6
- </picture>
7
- </p>
8
- <p align="center">
9
- <strong>Many agents, one tempo.</strong>
10
- </p>
11
- <p align="center">
12
- <a href="https://www.npmjs.com/package/agent-tempo"><img src="https://img.shields.io/npm/v/agent-tempo.svg" alt="npm version"></a>
13
- <a href="https://github.com/vinceblank/agent-tempo/actions/workflows/ci.yml"><img src="https://github.com/vinceblank/agent-tempo/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
14
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"></a>
15
- </p>
16
-
17
- Multiple Claude Code sessions discover each other, exchange messages in real time, and coordinate work — across machines, not just localhost.
18
-
19
- Each session registers as a **player** in Temporal. Players discover each other with `ensemble`, send messages with `cue`, and coordinate via a **conductor** that connects to external interfaces like Discord, Telegram, or the built-in TUI.
20
-
21
- 📖 **[Full documentation](docs/README.md)**
22
-
23
- ## Why agent-tempo?
24
-
25
- - **Crash-safe durability** — Sessions are Temporal workflows. Crashes, restarts, and network blips don't lose messages or drop coordination state.
26
- - **Instant signaling** — Temporal signals deliver messages with no polling. Players receive cues the moment they're sent, regardless of which machine they're on.
27
- - **Built-in scheduling** — One-shot and recurring message schedules without any external infrastructure.
28
- - **Extensible agent types** — Define reusable player roles as `.md` files. Ship lineups that assemble entire teams in one command.
29
-
30
- ## Features
31
-
32
- | | |
33
- |---|---|
34
- | 🔁 **Ensemble Lineups** | YAML configs that define a full team and recruit them all in one command |
35
- | ⏰ **Scheduling** | One-shot and recurring message schedules with fan-out and failure notifications |
36
- | 🎭 **Player Types** | Reusable agent definitions with 8 shipped types and three-tier lookup |
37
- | 🖥️ **Terminal UI** | Chat-focused TUI with slash commands, overlays, and interactive wizards |
38
- | 🌐 **Cross-machine** | Any session that can reach your Temporal server can join the ensemble |
39
- | ⏸️ **Hold / Pause / Resume** | Pre-warm a full team before delivering tasks; pause and resume mid-session |
40
- | 🤖 **Headless adapters** | Copilot bridge, Claude API, OpenCode, and Claude Code headless (`claude -p` subprocess — bills against your Claude Code subscription, no Console API key needed) — mix providers and headless agents in the same ensemble |
41
-
42
- ## Installation
43
-
44
- ```bash
45
- npm install -g agent-tempo
46
- ```
47
-
48
- **Prerequisites**: [Node.js](https://nodejs.org/) 20 LTS, 22 LTS, or 24 LTS, [Temporal CLI](https://docs.temporal.io/cli), [Claude Code](https://claude.ai/code)
49
-
50
- ## Quick Start
51
-
52
- One command handles everything:
53
-
54
- ```bash
55
- cd your-project
56
- agent-tempo up
57
- ```
58
-
59
- This starts Temporal, registers the MCP server, launches the daemon, and opens a conductor session. Then add players:
60
-
61
- ```bash
62
- agent-tempo status # see who's active
63
- ```
64
-
65
- Or use the TUI to recruit players, or ask the conductor to `recruit` from inside Claude Code.
66
-
67
- ### Manual setup
68
-
69
- ```bash
70
- agent-tempo server # start Temporal dev server
71
- agent-tempo init # register MCP server globally
72
- agent-tempo preflight # verify environment
73
- agent-tempo up # launch conductor via auto-provisioning
74
- ```
75
-
76
- ## Upgrading
77
-
78
- ```bash
79
- agent-tempo upgrade
80
- ```
81
-
82
- Stops the daemon, installs the latest version, and restarts automatically. To upgrade to a specific version:
83
-
84
- ```bash
85
- agent-tempo upgrade 0.22.0
86
- ```
87
-
88
- ## Stopping & Tear Down
89
-
90
- ```bash
91
- # Terminate all sessions in an ensemble
92
- agent-tempo destroy my-ensemble
93
-
94
- # Tear down everything (all sessions, schedulers, and Maestro workflows)
95
- agent-tempo down --all
96
-
97
- # Tear down and terminate all workflows in one step
98
- agent-tempo down --destroy -y
99
-
100
- # Stop the background daemon
101
- agent-tempo daemon stop
102
- ```
103
-
104
- 📖 [Full CLI reference → docs/cli.md](docs/cli.md)
105
-
106
- ---
107
-
108
- ## Core Concepts
109
-
110
- - **Player** — A Claude Code session registered as a Temporal workflow
111
- - **Conductor** — Required orchestration hub (one per ensemble); receives `report` calls and connects to external interfaces. Lineup schema enforces its presence.
112
- - **Ensemble** — A named group of players isolated from other ensembles; defaults to `default`
113
- - **Cue** — A message sent to a player by name via Temporal signal
114
- - **Lineup** — A YAML file that defines a full team and recruits them in one step
115
- - **Player Type** — A reusable agent definition (`.md` with YAML frontmatter) that gives a player a named role
116
-
117
- Players in one ensemble cannot see or message players in another. Launch `agent-tempo` to open the TUI and switch between ensembles, or target a specific ensemble directly:
118
-
119
- ```bash
120
- agent-tempo up frontend # provision and launch conductor in "frontend"
121
- agent-tempo up backend # provision and launch conductor in "backend"
122
- ```
123
-
124
- ## MCP Tools
125
-
126
- Tools available inside Claude Code sessions connected to agent-tempo:
127
-
128
- | Tool | Description |
129
- |------|-------------|
130
- | `ensemble` | Discover active sessions |
131
- | `cue` | Send a message to a player by name |
132
- | `recruit` | Spawn a new Claude Code session |
133
- | `report` | Send updates to the conductor |
134
- | `broadcast` | Send a message to all active players |
135
- | `recall` | Read your own message history |
136
- | `who_am_i` | Get your identity, role, and player type |
137
-
138
- 📖 [Full tools reference docs/tools.md](docs/tools.md) (includes `schedule`, `stage`, `quality_gate`, `worktree`, and all others)
139
-
140
- ## CLI
141
-
142
- ```bash
143
- agent-tempo # launch TUI (auto-provisions on first run)
144
- agent-tempo up [ensemble] # provision infrastructure and launch conductor
145
- agent-tempo down [--destroy] # tear down infrastructure (--destroy also terminates workflows)
146
- agent-tempo status [ensemble] # list active sessions
147
- agent-tempo destroy <ensemble> # terminate all sessions in an ensemble
148
- agent-tempo restore <ensemble> # restore orphaned sessions on this host
149
- agent-tempo hosts # list daemons polling this Temporal namespace (--all/--json)
150
- agent-tempo recall <name> # read a player's message history (--limit/--offset/--preview/--json)
151
- agent-tempo attachment-info <name> # inspect a session's phase, holder, lease, and heartbeat age
152
- agent-tempo release [ensemble] # release held players (unlock + deliver tasks)
153
- agent-tempo daemon <sub> # manage the worker daemon
154
- agent-tempo upgrade # update to latest
155
- ```
156
-
157
- Run `agent-tempo --help` or `agent-tempo <command> --help` for all flags.
158
-
159
- 📖 [Full CLI reference → docs/cli.md](docs/cli.md)
160
-
161
- ## Ensemble Lineups
162
-
163
- Define reusable team configurations as YAML files and load them in one command:
164
-
165
- ```yaml
166
- name: my-project
167
- conductor:
168
- instructions: "Coordinate the frontend and backend teams"
169
- players:
170
- - name: frontend
171
- type: tempo-soloist
172
- workDir: /repos/my-app
173
- instructions: "Build the React dashboard"
174
- - name: backend
175
- type: tempo-soloist
176
- workDir: /repos/my-api
177
- instructions: "Implement the REST endpoints"
178
- schedules:
179
- - name: status-check
180
- message: "Report your current progress"
181
- target: all
182
- every: 30m
183
- ```
184
-
185
- ```bash
186
- agent-tempo up --lineup my-project.yaml # load from CLI
187
- ```
188
-
189
- Or from inside a session: *"Load the my-project lineup"*
190
-
191
- 📖 [Lineups, player types, and shipped examples → docs/ensembles.md](docs/ensembles.md)
192
-
193
- ## Player Types
194
-
195
- Player types are reusable agent definitions `.md` files with YAML frontmatter. Reference them by name in lineups:
196
-
197
- ```yaml
198
- players:
199
- - name: arch
200
- type: tempo-composer
201
- - name: eng
202
- type: tempo-soloist
203
- ```
204
-
205
- Eight types ship out of the box: `tempo-conductor`, `tempo-composer`, `tempo-soloist`, `tempo-tuner`, `tempo-critic`, `tempo-roadie`, `tempo-improv`, `tempo-liner`. Five lineup presets are included: `tempo-big-band`, `tempo-dev-team`, `tempo-review-squad`, `tempo-jam-session`, `tempo-mock-jam`.
206
-
207
- ```bash
208
- agent-tempo agent-types list # discover available types
209
- agent-tempo agent-types init # copy shipped types to ~/.claude/agents/
210
- ```
211
-
212
- 📖 [Player types deep dive docs/ensembles.md](docs/ensembles.md)
213
-
214
- ## Configuration
215
-
216
- ```bash
217
- agent-tempo config # interactive setup (Temporal address, namespace, API key)
218
- ```
219
-
220
- Settings persist in `~/.agent-tempo/config.json`. Resolution order: CLI flags → env vars → config file → Temporal CLI config → defaults.
221
-
222
- Key environment variables:
223
-
224
- | Variable | Default | Description |
225
- |----------|---------|-------------|
226
- | `TEMPORAL_ADDRESS` | `localhost:7233` | Temporal server address |
227
- | `TEMPORAL_NAMESPACE` | `default` | Temporal namespace |
228
- | `TEMPORAL_API_KEY` | *(none)* | Temporal Cloud API key |
229
- | `CLAUDE_TEMPO_ENSEMBLE` | `default` | Ensemble name |
230
-
231
- 📖 [Full configuration reference docs/configuration.md](docs/configuration.md)
232
-
233
- ## Terminal UI
234
-
235
- ```bash
236
- agent-tempo tui # multi-ensemble home screen
237
- agent-tempo tui --ensemble my-ensemble # direct ensemble mode
238
- ```
239
-
240
- The TUI provides a chat-focused shell for managing your ensemble:
241
-
242
- - **Ensemble chat feed** — live aggregated view of conductor + player traffic; type bare text to message the conductor, `@player message` to message directly
243
- - **Slash commands** — `/recruit`, `/status`, `/schedule`, `/gates`, `/stages`, `/worktree`, `/go` (release held), `/pause`, `/play`, `/shutdown`, `/restore`, `/home`, and more; type `/help` for the full list
244
- - **Interactive overlays and wizards** — step-by-step flows for recruiting players, creating schedules, and managing ensembles
245
-
246
- 📖 [TUI reference docs/tui.md](docs/tui.md)
247
-
248
- ## Copilot Integration
249
-
250
- > **Experimental** subject to breaking changes.
251
-
252
- GitHub Copilot CLI sessions can join an ensemble using `--agent copilot`. Recruit one from the TUI:
253
-
254
- ```
255
- /recruit copilot-1 --agent copilot
256
- ```
257
-
258
- 📖 [Copilot bridge setup and limitations → docs/copilot.md](docs/copilot.md)
259
-
260
- ## Worker Daemon
261
-
262
- The daemon runs Temporal workers as a background process — it starts automatically on first use. Manage it explicitly with `agent-tempo daemon start|stop|status|logs`.
263
-
264
- 📖 [Daemon reference → docs/daemon.md](docs/daemon.md)
265
-
266
- ## Development
267
-
268
- ```bash
269
- git clone https://github.com/vinceblank/agent-tempo.git
270
- cd agent-tempo && npm install
271
-
272
- npm run build # compile TypeScript + pre-bundle workflows
273
- npm test # run tests
274
- npm link # link CLI for local testing
275
- ```
276
-
277
- > **Important**: Run `npm run build` after changing workflow code (`src/workflows/`). The build pre-bundles workflows into `workflow-bundle.js` so all workers use identical code.
278
-
279
- ## Contributing
280
-
281
- See [CLAUDE.md](CLAUDE.md) for project structure, conventions, and development setup. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the three-layer session model (workflow / adapter / process). Pull requests welcome run `npm test` before submitting.
282
-
283
- ## Known Limitations
284
-
285
- - **`recruit` requires manual acknowledgment** Recruited sessions show a Claude Code confirmation prompt that must be acknowledged in the spawned terminal. This will be resolved once agent-tempo is a published approved channel plugin. Copilot bridge sessions are not affected.
286
-
287
- ## License
288
-
289
- MIT
1
+ <p align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.svg">
4
+ <source media="(prefers-color-scheme: light)" srcset="assets/logo-light.svg">
5
+ <img alt="agent-tempo" src="assets/logo-light.svg" height="140">
6
+ </picture>
7
+ </p>
8
+ <p align="center">
9
+ <strong>Many agents, one tempo.</strong>
10
+ </p>
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/agent-tempo"><img src="https://img.shields.io/npm/v/agent-tempo.svg" alt="npm version"></a>
13
+ <a href="https://github.com/vinceblank/agent-tempo/actions/workflows/ci.yml"><img src="https://github.com/vinceblank/agent-tempo/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
14
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"></a>
15
+ </p>
16
+
17
+ Multiple Claude Code sessions discover each other, exchange messages in real time, and coordinate work — across machines, not just localhost.
18
+
19
+ Each session registers as a **player** in Temporal. Players discover each other with `ensemble`, send messages with `cue`, and coordinate via a **conductor** that connects to external interfaces like Discord, Telegram, or the built-in TUI.
20
+
21
+ 📖 **[Full documentation](docs/README.md)**
22
+
23
+ ## Why agent-tempo?
24
+
25
+ - **Crash-safe durability** — Sessions are Temporal workflows. Crashes, restarts, and network blips don't lose messages or drop coordination state.
26
+ - **Instant signaling** — Temporal signals deliver messages with no polling. Players receive cues the moment they're sent, regardless of which machine they're on.
27
+ - **Built-in scheduling** — One-shot and recurring message schedules without any external infrastructure.
28
+ - **Extensible agent types** — Define reusable player roles as `.md` files. Ship lineups that assemble entire teams in one command.
29
+
30
+ ## Features
31
+
32
+ | | |
33
+ |---|---|
34
+ | 🔁 **Ensemble Lineups** | YAML configs that define a full team and recruit them all in one command |
35
+ | ⏰ **Scheduling** | One-shot and recurring message schedules with fan-out and failure notifications |
36
+ | 🎭 **Player Types** | Reusable agent definitions with 8 shipped types and three-tier lookup |
37
+ | 🖥️ **Terminal UI** | Chat-focused TUI with slash commands, overlays, and interactive wizards |
38
+ | 🌐 **Cross-machine** | Any session that can reach your Temporal server can join the ensemble |
39
+ | ⏸️ **Hold / Pause / Resume** | Pre-warm a full team before delivering tasks; pause and resume mid-session |
40
+ | 🤖 **Headless adapters** | Copilot bridge, Claude API, OpenCode, Claude Code headless (`claude -p` — bills against your Claude Code subscription), and Pi AI — mix providers and headless agents in the same ensemble |
41
+
42
+ ## Installation
43
+
44
+ ```bash
45
+ npm install -g agent-tempo
46
+ # or without a global install:
47
+ npx agent-tempo
48
+ ```
49
+
50
+ **Prerequisites**: [Node.js](https://nodejs.org/) 20 LTS, 22 LTS, or 24 LTS, [Temporal CLI](https://docs.temporal.io/cli), [Claude Code](https://claude.ai/code)
51
+
52
+ > **No-global-install path**: On first run, `agent-tempo` auto-provisions `~/.agent-tempo/bin/agent-tempo` so subsequent invocations don't need `npx`. If that directory isn't on your PATH, a one-time hint is printed to stderr with the exact export line to add to your shell profile.
53
+
54
+ ## Quick Start
55
+
56
+ One command handles everything:
57
+
58
+ ```bash
59
+ cd your-project
60
+ agent-tempo up
61
+ ```
62
+
63
+ This starts Temporal, registers the MCP server, launches the daemon, and opens a conductor session. Then add players:
64
+
65
+ ```bash
66
+ agent-tempo status # see who's active
67
+ ```
68
+
69
+ Or use the TUI to recruit players, or ask the conductor to `recruit` from inside Claude Code.
70
+
71
+ ### Manual setup
72
+
73
+ ```bash
74
+ agent-tempo server # start Temporal dev server
75
+ agent-tempo init # register MCP server globally
76
+ agent-tempo preflight # verify environment
77
+ agent-tempo up # launch conductor via auto-provisioning
78
+ ```
79
+
80
+ ## Upgrading
81
+
82
+ ```bash
83
+ agent-tempo upgrade
84
+ ```
85
+
86
+ Stops the daemon, installs the latest version, and restarts automatically. To upgrade to a specific version:
87
+
88
+ ```bash
89
+ agent-tempo upgrade 0.22.0
90
+ ```
91
+
92
+ ## Stopping & Tear Down
93
+
94
+ ```bash
95
+ # Terminate all sessions in an ensemble
96
+ agent-tempo destroy my-ensemble
97
+
98
+ # Tear down everything (all sessions, schedulers, and Maestro workflows)
99
+ agent-tempo down --all
100
+
101
+ # Tear down and terminate all workflows in one step
102
+ agent-tempo down --destroy -y
103
+
104
+ # Stop the background daemon
105
+ agent-tempo daemon stop
106
+ ```
107
+
108
+ 📖 [Full CLI reference → docs/cli.md](docs/cli.md)
109
+
110
+ ---
111
+
112
+ ## Core Concepts
113
+
114
+ - **Player** — A Claude Code session registered as a Temporal workflow
115
+ - **Conductor** — Required orchestration hub (one per ensemble); receives `report` calls and connects to external interfaces. Lineup schema enforces its presence.
116
+ - **Ensemble** — A named group of players isolated from other ensembles; defaults to `default`
117
+ - **Cue** A message sent to a player by name via Temporal signal
118
+ - **Lineup** — A YAML file that defines a full team and recruits them in one step
119
+ - **Player Type** — A reusable agent definition (`.md` with YAML frontmatter) that gives a player a named role
120
+
121
+ Players in one ensemble cannot see or message players in another. Launch `agent-tempo` to open the TUI and switch between ensembles, or target a specific ensemble directly:
122
+
123
+ ```bash
124
+ agent-tempo up frontend # provision and launch conductor in "frontend"
125
+ agent-tempo up backend # provision and launch conductor in "backend"
126
+ ```
127
+
128
+ ## MCP Tools
129
+
130
+ Tools available inside Claude Code sessions connected to agent-tempo:
131
+
132
+ | Tool | Description |
133
+ |------|-------------|
134
+ | `ensemble` | Discover active sessions |
135
+ | `cue` | Send a message to a player by name |
136
+ | `recruit` | Spawn a new Claude Code session |
137
+ | `report` | Send updates to the conductor |
138
+ | `broadcast` | Send a message to all active players |
139
+ | `recall` | Read your own message history |
140
+ | `who_am_i` | Get your identity, role, and player type |
141
+
142
+ 📖 [Full tools reference → docs/tools.md](docs/tools.md) (includes `schedule`, `stage`, `quality_gate`, `worktree`, and all others)
143
+
144
+ ## CLI
145
+
146
+ ```bash
147
+ agent-tempo # launch TUI (auto-provisions on first run)
148
+ agent-tempo up [ensemble] # provision infrastructure and launch conductor
149
+ agent-tempo down [--destroy] # tear down infrastructure (--destroy also terminates workflows)
150
+ agent-tempo status [ensemble] # list active sessions
151
+ agent-tempo destroy <ensemble> # terminate all sessions in an ensemble
152
+ agent-tempo restore <ensemble> # restore orphaned sessions on this host
153
+ agent-tempo hosts # list daemons polling this Temporal namespace (--all/--json)
154
+ agent-tempo recall <name> # read a player's message history (--limit/--offset/--preview/--json)
155
+ agent-tempo attachment-info <name> # inspect a session's phase, holder, lease, and heartbeat age
156
+ agent-tempo release [ensemble] # release held players (unlock + deliver tasks)
157
+ agent-tempo daemon <sub> # manage the worker daemon
158
+ agent-tempo upgrade # update to latest
159
+ ```
160
+
161
+ Run `agent-tempo --help` or `agent-tempo <command> --help` for all flags.
162
+
163
+ 📖 [Full CLI reference docs/cli.md](docs/cli.md)
164
+
165
+ ## Ensemble Lineups
166
+
167
+ Define reusable team configurations as YAML files and load them in one command:
168
+
169
+ ```yaml
170
+ name: my-project
171
+ conductor:
172
+ instructions: "Coordinate the frontend and backend teams"
173
+ players:
174
+ - name: frontend
175
+ type: tempo-soloist
176
+ workDir: /repos/my-app
177
+ instructions: "Build the React dashboard"
178
+ - name: backend
179
+ type: tempo-soloist
180
+ workDir: /repos/my-api
181
+ instructions: "Implement the REST endpoints"
182
+ schedules:
183
+ - name: status-check
184
+ message: "Report your current progress"
185
+ target: all
186
+ every: 30m
187
+ ```
188
+
189
+ ```bash
190
+ agent-tempo up --lineup my-project.yaml # load from CLI
191
+ ```
192
+
193
+ Or from inside a session: *"Load the my-project lineup"*
194
+
195
+ 📖 [Lineups, player types, and shipped examples docs/ensembles.md](docs/ensembles.md)
196
+
197
+ ## Player Types
198
+
199
+ Player types are reusable agent definitions — `.md` files with YAML frontmatter. Reference them by name in lineups:
200
+
201
+ ```yaml
202
+ players:
203
+ - name: arch
204
+ type: tempo-composer
205
+ - name: eng
206
+ type: tempo-soloist
207
+ ```
208
+
209
+ Eight types ship out of the box: `tempo-conductor`, `tempo-composer`, `tempo-soloist`, `tempo-tuner`, `tempo-critic`, `tempo-roadie`, `tempo-improv`, `tempo-liner`. Six lineup presets are included: `tempo-big-band`, `tempo-dev-team`, `tempo-review-squad`, `tempo-jam-session`, `tempo-mock-jam`, `tempo-headless-jam`.
210
+
211
+ ```bash
212
+ agent-tempo agent-types list # discover available types
213
+ agent-tempo agent-types init # copy shipped types to ~/.claude/agents/
214
+ ```
215
+
216
+ 📖 [Player types deep dive → docs/ensembles.md](docs/ensembles.md)
217
+
218
+ ## Configuration
219
+
220
+ ```bash
221
+ agent-tempo config # interactive setup (Temporal address, namespace, API key)
222
+ ```
223
+
224
+ Settings persist in `~/.agent-tempo/config.json`. Resolution order: CLI flags → env vars → config file → Temporal CLI config → defaults.
225
+
226
+ Key environment variables:
227
+
228
+ | Variable | Default | Description |
229
+ |----------|---------|-------------|
230
+ | `TEMPORAL_ADDRESS` | `localhost:7233` | Temporal server address |
231
+ | `TEMPORAL_NAMESPACE` | `default` | Temporal namespace |
232
+ | `TEMPORAL_API_KEY` | *(none)* | Temporal Cloud API key |
233
+ | `CLAUDE_TEMPO_ENSEMBLE` | `default` | Ensemble name |
234
+
235
+ 📖 [Full configuration reference → docs/configuration.md](docs/configuration.md)
236
+
237
+ ## Terminal UI
238
+
239
+ ```bash
240
+ agent-tempo tui # multi-ensemble home screen
241
+ agent-tempo tui --ensemble my-ensemble # direct ensemble mode
242
+ ```
243
+
244
+ The TUI provides a chat-focused shell for managing your ensemble:
245
+
246
+ - **Ensemble chat feed** — live aggregated view of conductor + player traffic; type bare text to message the conductor, `@player message` to message directly
247
+ - **Slash commands** — `/recruit`, `/status`, `/schedule`, `/gates`, `/stages`, `/worktree`, `/go` (release held), `/pause`, `/play`, `/shutdown`, `/restore`, `/home`, and more; type `/help` for the full list
248
+ - **Interactive overlays and wizards** — step-by-step flows for recruiting players, creating schedules, and managing ensembles
249
+
250
+ 📖 [TUI reference docs/tui.md](docs/tui.md)
251
+
252
+ ## Copilot Integration
253
+
254
+ > **Experimental** — subject to breaking changes.
255
+
256
+ GitHub Copilot CLI sessions can join an ensemble using `--agent copilot`. Recruit one from the TUI:
257
+
258
+ ```
259
+ /recruit copilot-1 --agent copilot
260
+ ```
261
+
262
+ 📖 [Copilot bridge setup and limitations docs/copilot.md](docs/copilot.md)
263
+
264
+ ## Worker Daemon
265
+
266
+ The daemon runs Temporal workers as a background process — it starts automatically on first use. Manage it explicitly with `agent-tempo daemon start|stop|status|logs`.
267
+
268
+ 📖 [Daemon reference → docs/daemon.md](docs/daemon.md)
269
+
270
+ ## Development
271
+
272
+ ```bash
273
+ git clone https://github.com/vinceblank/agent-tempo.git
274
+ cd agent-tempo && npm install
275
+
276
+ npm run build # compile TypeScript + pre-bundle workflows
277
+ npm test # run tests
278
+ npm link # link CLI for local testing
279
+ ```
280
+
281
+ > **Important**: Run `npm run build` after changing workflow code (`src/workflows/`). The build pre-bundles workflows into `workflow-bundle.js` so all workers use identical code.
282
+
283
+ ## Contributing
284
+
285
+ See [CLAUDE.md](CLAUDE.md) for project structure, conventions, and development setup. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the three-layer session model (workflow / adapter / process). Pull requests welcome run `npm test` before submitting.
286
+
287
+ ## Known Limitations
288
+
289
+ - **`recruit` requires manual acknowledgment** — Recruited sessions show a Claude Code confirmation prompt that must be acknowledged in the spawned terminal. This will be resolved once agent-tempo is a published approved channel plugin. Copilot bridge sessions are not affected.
290
+
291
+ ## License
292
+
293
+ MIT