Lightweight breakpoint manager with API, queue worker, and web UI.
- Node.js 18+
npm install
npm run init:dbnpm run devbreakpoints startOr run separately:
npm run start:api
npm run start:workerStart the full system (API + web UI + worker):
breakpoints startCreate a breakpoint (agent):
breakpoints breakpoint create --question "Need approval?" --title "Approval"Check status:
breakpoints breakpoint status <id>Wait for release:
breakpoints breakpoint wait <id> --interval 3Install the babysitter-breakpoint skill:
breakpoints install-skill --target codex --scope globalEnvironment variables:
PORT(default 3185)WEB_PORT(default 3184)DB_PATH(default~/.a5c/breakpoints/db/breakpoints.db)REPO_ROOT(default repo root)AGENT_TOKEN(optional)HUMAN_TOKEN(optional)WORKER_POLL_MS(default 2000)WORKER_BATCH_SIZE(default 10)
Create breakpoint (agent):
curl -X POST http://localhost:3185/api/breakpoints \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{"agentId":"agent-1","title":"Need review","payload":{"summary":"check this"},"tags":["review"],"ttlSeconds":3600}'Check status:
curl http://localhost:3185/api/breakpoints/<id>/statusRelease with feedback (human):
curl -X POST http://localhost:3185/api/breakpoints/<id>/feedback \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $HUMAN_TOKEN" \
-d '{"author":"reviewer","comment":"Looks good","release":true}'To enable context rendering in the UI, include a context.files array in the
breakpoint payload:
{
"context": {
"runId": "run-...",
"files": [
{ "path": "docs/plan.md", "format": "markdown" },
{ "path": "api/routes.js", "format": "code", "language": "javascript" }
]
}
}The API serves file content via:
GET /api/breakpoints/:id/context?path=path/to/file
Only allowlisted extensions are served, and the file must be listed in the breakpoint payload.
Open http://localhost:3184 and provide the human token in the UI.
breakpoints install-skillDefaults to global Codex install. Options:
breakpoints install-skill --target codex --scope global
breakpoints install-skill --target codex --scope local
breakpoints install-skill --target claude --scope global
breakpoints install-skill --target claude --scope local
breakpoints install-skill --target cursor --scope global
breakpoints install-skill --target cursor --scope localGlobal targets use CODEX_HOME or ~/.codex for Codex, and ~/.claude or ~/.cursor for Claude/Cursor. Local installs write to .codex/skills, .claude/skills, or .cursor/skills under the repo root. Restart the app after install.
When installed from npm, the skill is bundled at .codex/skills/babysitter-breakpoint/ inside the package and copied to the target location by breakpoints install-skill.
Create a breakpoint:
breakpoints breakpoint create \
--question "Approve process + inputs + main.js?" \
--run-id run-123 \
--title "Approval needed" \
--file ".a5c/runs/run-123/artifacts/process.md,markdown" \
--file ".a5c/runs/run-123/inputs.json,code,json" \
--file ".a5c/runs/run-123/code/main.js,code,javascript"Wait for release (prints full details when released):
breakpoints breakpoint wait <id> --interval 3- Tags are stored as JSON in SQLite; tag filtering uses a simple string match.
- The queue worker processes TTL expiration jobs; notification jobs are stubbed.