feat: Claude Code Monitor — lanes, pipelines and a merged workspace

Internal SmartGift build of a Claude Code monitoring dashboard.

Lanes: a durable unit of parallel agent work, one per working directory,
tracked across session restarts. Managed lanes are git worktrees the
dashboard provisions and can reset or remove behind a three-check destroy
guard and a counted preflight; adopted lanes are directories you already
own and are never destroyable.

Pipelines: a lane moves through pipeline stages. A stage the agent declares
with evidence renders green; a stage inferred from the tool-event stream
renders dashed amber and never counts as done. Detection is forward-only
within a 30-minute window, and never writes the declared stage.

Workspace: one page at /run with a lane grid, the selected lane's pipeline,
and a full Claude console behind a disclosure.
This commit is contained in:
2026-07-29 17:07:45 +07:00
commit 57dc91585d
783 changed files with 221743 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
---
description: Quick connectivity + health probe of the Agent Monitor dashboard.
---
Run a fast health probe against the Agent Monitor dashboard at
`http://localhost:4820`. Do two checks and print OK / FAIL for each.
1. **API + stats** — fetch core stats:
```bash
curl -s -o /dev/null -w '%{http_code}' http://localhost:4820/api/stats
curl -s http://localhost:4820/api/stats
```
PASS if HTTP 200 and the body is valid JSON. From the body, surface
`total_sessions`, `active_sessions`, `total_events`, and `events_today`.
2. **Self-update status** — confirm the update subsystem responds:
```bash
curl -s -o /dev/null -w '%{http_code}' http://localhost:4820/api/updates/status
curl -s http://localhost:4820/api/updates/status
```
PASS if HTTP 200 and valid JSON. Surface whether an update is available and
the current vs latest version if present.
Print a compact report, one line per check:
```
Agent Monitor Doctor
API /api/stats ............ OK (sessions=12 active=1 events=3480 today=57)
/api/updates/status ....... OK (up to date — v1.x.x)
Overall: OK (2/2)
```
Use ✅ OK / ❌ FAIL markers. If any curl fails to connect (non-200 or no
response), mark that check FAIL and end with: "Dashboard unreachable — start it
with `npm start` from the repo root." Keep it to the report only; no extra prose.
+30
View File
@@ -0,0 +1,30 @@
---
description: Export Agent Monitor data (sessions/events/analytics/costs/all) as json/csv/md.
argument-hint: "[sessions|events|analytics|costs|all] [json|csv|md]"
---
Export Agent Monitor data using the dashboard export endpoint. Arguments:
**$ARGUMENTS** — the first token is the data `type`, the second is the `format`.
- `type``sessions | events | analytics | costs | all` (default `all`)
- `format``json | csv | md` (default `json`)
Set `TYPE` and `FORMAT` from the args (apply the defaults if missing), then run:
```bash
TYPE="${1:-all}"; FORMAT="${2:-json}"
curl -s "http://localhost:4820/api/settings/export?type=${TYPE}&format=${FORMAT}" \
-o "ccam-export-${TYPE}.${FORMAT}"
```
Then:
1. Confirm the file was written and report its absolute path and byte size.
2. Preview the result: for `csv`/`md` print the first ~15 lines; for `json`
print a pretty-printed head (e.g. `head -c 1500` or the first array element
plus the record count).
3. Print a one-line summary: `Exported <type> as <format> → <path> (<N> records / <bytes>)`.
If the curl returns a non-200 or an error body, do not claim success — print the
error and remind the user to start the dashboard with `npm start` from the repo
root. Do not delete or overwrite any existing data; this command only reads via
the export endpoint and writes a new export file.
@@ -0,0 +1,33 @@
---
description: Show the latest N ingested events with timestamp, event_type, and tool_name.
argument-hint: "[N]"
---
Show the most recent events from the Agent Monitor dashboard. Argument:
**$ARGUMENTS** — `N`, the number of events to show (default 20).
Fetch recent events and take the newest N:
```bash
N="${1:-20}"
curl -s "http://localhost:4820/api/events?limit=${N}" | jq -r '.[] | "\(.timestamp)\t\(.event_type)\t\(.tool_name // "-")"'
```
The `/api/events` list is returned newest-first; show the most recent `N`.
Render a compact, aligned table — one row per event:
```
TIME EVENT_TYPE TOOL_NAME
2026-06-25T14:03:11Z PostToolUse Bash
2026-06-25T14:03:09Z PreToolUse Bash
2026-06-25T14:02:58Z Stop -
```
Include `event_type` (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart,
SessionEnd, Notification, Compaction, APIError, TurnDuration) and `tool_name`
when present (use `-` for events without a tool). End with a one-line count:
`Showing latest <N> events.`
If the request returns a non-200 or empty body, say so and tell the user to start
the dashboard with `npm start` from the repo root. Read-only — never POST or
modify events.