agent-tempo 1.2.0 → 1.3.1
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.
- package/CLAUDE.md +219 -219
- package/LICENSE +21 -21
- package/README.md +289 -289
- package/assets/icon-dark.svg +9 -9
- package/assets/icon.svg +9 -9
- package/assets/logo-dark.svg +11 -11
- package/assets/logo-light.svg +11 -11
- package/dashboard/README.md +91 -91
- package/dashboard/dist/assets/index-D6Xyje_n.js.map +1 -1
- package/dashboard/dist/index.html +19 -19
- package/dashboard/package.json +47 -47
- package/dist/adapters/copilot/adapter.js +12 -1
- package/dist/cli/global-wrapper.d.ts +19 -0
- package/dist/cli/global-wrapper.js +169 -0
- package/dist/cli/help-text.js +97 -97
- package/dist/cli/startup.js +11 -0
- package/dist/cli/upgrade-command.js +81 -81
- package/dist/cli.js +12 -0
- package/dist/daemon.js +5 -0
- package/dist/scripts/verify-daemon-isolation-guard.js +24 -24
- package/dist/server.js +4 -0
- package/dist/spawn.js +12 -12
- package/dist/tools/coat-check-evict.js +2 -2
- package/dist/tools/coat-check-get.js +2 -2
- package/dist/tools/coat-check-put.js +4 -4
- package/dist/tools/fetch-state.js +2 -2
- package/dist/tools/save-state.js +13 -13
- package/dist/utils/grpc-shutdown-guard.d.ts +52 -0
- package/dist/utils/grpc-shutdown-guard.js +88 -0
- package/examples/agents/tempo-composer.md +56 -56
- package/examples/agents/tempo-conductor.md +117 -117
- package/examples/agents/tempo-critic.md +73 -73
- package/examples/agents/tempo-improv.md +74 -74
- package/examples/agents/tempo-liner.md +75 -75
- package/examples/agents/tempo-roadie.md +61 -61
- package/examples/agents/tempo-soloist.md +71 -71
- package/examples/agents/tempo-tuner.md +94 -94
- package/examples/ensembles/tempo-big-band.yaml +146 -146
- package/examples/ensembles/tempo-dev-team.yaml +58 -58
- package/examples/ensembles/tempo-headless-jam.yaml +77 -77
- package/examples/ensembles/tempo-jam-session.yaml +41 -41
- package/examples/ensembles/tempo-mock-jam.yaml +79 -79
- package/examples/ensembles/tempo-review-squad.yaml +32 -32
- package/package.json +173 -173
- package/packaging/launchd/com.agent.tempo.plist +46 -46
- package/packaging/systemd/agent-tempo.service +32 -32
- package/packaging/windows/install-task.ps1 +71 -71
- package/scenarios/conductor-recruit-mock.yaml +33 -33
- package/scenarios/echo-roundtrip.yaml +15 -15
- package/scenarios/multi-player-handoff.yaml +38 -38
- package/scenarios/recruit-cascade.yaml +38 -38
- package/scenarios/two-player-conversation.yaml +33 -33
- package/workflow-bundle.js +1 -1
- package/dist/activities/claude-stop.d.ts +0 -21
- package/dist/activities/claude-stop.js +0 -94
- package/dist/channel.d.ts +0 -3
- package/dist/channel.js +0 -48
- package/dist/copilot-bridge.d.ts +0 -22
- package/dist/copilot-bridge.js +0 -565
- package/dist/scripts/258-spotcheck.js +0 -303
- package/dist/tools/detach.d.ts +0 -4
- package/dist/tools/detach.js +0 -45
- package/dist/tools/encore.d.ts +0 -4
- package/dist/tools/encore.js +0 -31
- package/dist/tools/pause-ensemble.d.ts +0 -4
- package/dist/tools/pause-ensemble.js +0 -58
- package/dist/tools/resume-ensemble.d.ts +0 -4
- package/dist/tools/resume-ensemble.js +0 -79
- package/dist/tools/stop.d.ts +0 -4
- package/dist/tools/stop.js +0 -29
- package/dist/tui/client.d.ts +0 -6
- package/dist/tui/client.js +0 -9
- package/dist/tui/components/ActivityLog.d.ts +0 -16
- package/dist/tui/components/ActivityLog.js +0 -36
- package/dist/tui/components/CommandOverlay.d.ts +0 -15
- package/dist/tui/components/CommandOverlay.js +0 -34
- package/dist/tui/components/ConductorChat.d.ts +0 -16
- package/dist/tui/components/ConductorChat.js +0 -32
- package/dist/tui/components/EnsembleListView.d.ts +0 -14
- package/dist/tui/components/EnsembleListView.js +0 -32
- package/dist/tui/components/EnsemblePanel.d.ts +0 -12
- package/dist/tui/components/EnsemblePanel.js +0 -40
- package/dist/tui/components/InputBar.d.ts +0 -13
- package/dist/tui/components/InputBar.js +0 -58
- package/dist/tui/components/ScheduleOverlay.d.ts +0 -13
- package/dist/tui/components/ScheduleOverlay.js +0 -113
- package/dist/tui/components/TopBar.d.ts +0 -12
- package/dist/tui/components/TopBar.js +0 -15
- package/dist/tui/core-api.d.ts +0 -26
- package/dist/tui/core-api.js +0 -67
- package/dist/tui/hooks/useEnsembleDiscovery.d.ts +0 -3
- package/dist/tui/hooks/useEnsembleDiscovery.js +0 -30
- package/dist/tui/hooks/useMaestroPoller.d.ts +0 -3
- package/dist/tui/hooks/useMaestroPoller.js +0 -36
- package/dist/tui/hooks/useSendCommand.d.ts +0 -7
- package/dist/tui/hooks/useSendCommand.js +0 -29
- package/dist/utils/bg-preflight.d.ts +0 -25
- package/dist/utils/bg-preflight.js +0 -154
package/assets/logo-light.svg
CHANGED
|
@@ -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>
|
package/dashboard/README.md
CHANGED
|
@@ -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.
|