{"id":"cf4ac0a4-75bd-45eb-b09a-adbd328b73bd","entityType":"agent","slug":"clawhub-chenkuansun-bullybuddy","name":"Bullybuddy","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chenkuansun-bullybuddy","canonicalPath":"/agent/clawhub-chenkuansun-bullybuddy","generatedAt":"2026-10-10T10:43:33.128Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T08:30:19.691Z","emptyReason":null},"description":"BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input, kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.... Skill: Bullybuddy Owner: chenkuansun Summary: BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input, kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.... Tags: latest:0.7.1 Version history: v0.7.1 | 2026-02-18T15:22:21.579Z | user - Version bump to 0.7.1 with no code or documentation changes. - No file modifications detected; contents remain the same as the previou","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.6K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17a428c2f4x428npg1r78dw85884gye:bullybuddy","sourceUrl":"https://clawhub.ai/chenkuansun/bullybuddy","homepage":"https://clawhub.ai/chenkuansun/skills/bullybuddy","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chenkuansun/bullybuddy","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chenkuansun/skills/bullybuddy","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input, kill, and monitor multiple Claude Code sessions via /bullybuddy slash command...."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:30:19.691Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:30:19.691Z","emptyReason":null},"stars":null,"forks":null,"downloads":1556,"packageName":null,"latestVersion":"0.7.1","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:30:19.690Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T08:30:19.691Z","lastCrawledAt":"2026-10-10T08:30:19.690Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T08:30:19.690Z","lastVerifiedAt":null,"highlights":[{"version":"0.7.1","createdAt":"2026-02-18T15:22:21.579Z","changelog":"- Version bump to 0.7.1 with no code or documentation changes. - No file modifications detected; contents remain the same as the previous version.","fileCount":3,"zipByteSize":4861},{"version":"0.7.0","createdAt":"2026-02-18T15:09:15.168Z","changelog":"Fix stale registry files: publish correct SKILL.md and bullybuddy.sh from project directory","fileCount":3,"zipByteSize":4861},{"version":"0.6.4","createdAt":"2026-02-18T14:55:12.818Z","changelog":"- No changes detected in this version; SKILL.md remains unchanged.","fileCount":3,"zipByteSize":2498},{"version":"0.6.3","createdAt":"2026-02-18T14:47:38.917Z","changelog":"- Simplified script interface: now uses scripts/bb.sh (was scripts/bullybuddy.sh). - SKILL.md significantly shortened—focuses on basic commands, usage, and setup with environment variables. - Old longform explanations, API/WS details, and security notes removed for a concise overview. - Requires BB_URL and BB_TOKEN environment variables to be set for operation.","fileCount":3,"zipByteSize":2498},{"version":"0.6.2","createdAt":"2026-02-18T14:37:28.386Z","changelog":"No user-visible changes detected in this version. - No files were changed between the previous and current version. - No updates to commands, functionality, or documentation.","fileCount":3,"zipByteSize":4892},{"version":"0.6.1","createdAt":"2026-02-18T14:33:02.650Z","changelog":"Fix ClawHub registry publish","fileCount":3,"zipByteSize":4891},{"version":"0.6.0","createdAt":"2026-02-18T12:57:22.458Z","changelog":"Tmux backend for session survival, security hardening, 167 tests, robustness fixes","fileCount":3,"zipByteSize":4891},{"version":"0.5.1","createdAt":"2026-02-12T23:27:06.245Z","changelog":"Fix metadata inconsistencies flagged by security scan","fileCount":3,"zipByteSize":2498}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17a428c2f4x428npg1r78dw85884gye:bullybuddy","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T10:43:33.127Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenkuansun-bullybuddy/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T08:30:19.691Z","emptyReason":null},"readme":"Skill: Bullybuddy\n\nOwner: chenkuansun\n\nSummary: BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input, kill, and monitor multiple Claude Code sessions via /bullybuddy slash command....\n\nTags: latest:0.7.1\n\nVersion history:\n\nv0.7.1 | 2026-02-18T15:22:21.579Z | user\n\n- Version bump to 0.7.1 with no code or documentation changes.\n- No file modifications detected; contents remain the same as the previous version.\n\nv0.7.0 | 2026-02-18T15:09:15.168Z | user\n\nFix stale registry files: publish correct SKILL.md and bullybuddy.sh from project directory\n\nv0.6.4 | 2026-02-18T14:55:12.818Z | auto\n\n- No changes detected in this version; SKILL.md remains unchanged.\n\nv0.6.3 | 2026-02-18T14:47:38.917Z | auto\n\n- Simplified script interface: now uses scripts/bb.sh (was scripts/bullybuddy.sh).\n- SKILL.md significantly shortened—focuses on basic commands, usage, and setup with environment variables.\n- Old longform explanations, API/WS details, and security notes removed for a concise overview.\n- Requires BB_URL and BB_TOKEN environment variables to be set for operation.\n\nv0.6.2 | 2026-02-18T14:37:28.386Z | user\n\nNo user-visible changes detected in this version.\n\n- No files were changed between the previous and current version.\n- No updates to commands, functionality, or documentation.\n\nv0.6.1 | 2026-02-18T14:33:02.650Z | user\n\nFix ClawHub registry publish\n\nv0.6.0 | 2026-02-18T12:57:22.458Z | user\n\nTmux backend for session survival, security hardening, 167 tests, robustness fixes\n\nv0.5.1 | 2026-02-12T23:27:06.245Z | user\n\nFix metadata inconsistencies flagged by security scan\n\nv0.5.0 | 2026-02-12T23:10:28.983Z | auto\n\nNo changes detected in this version.  \nNo updates were made to the skill.\n\nv0.4.1 | 2026-02-12T22:55:05.312Z | auto\n\n- No user-facing changes or updates in this version.\n- Internal release only; all documentation and functionality remain unchanged.\n\nv0.4.0 | 2026-02-12T22:52:10.805Z | auto\n\n- No changes detected in this version.\n- All commands, usage, and documentation remain the same as the previous release.\n\nv0.3.1 | 2026-02-12T22:45:16.022Z | auto\n\n**Summary:** Streamlined skill overview with simplified usage instructions and new script entrypoint.\n\n- Rewrote SKILL.md with concise CLI-focused documentation.\n- Replaced extensive API and implementation details with a simple command table.\n- Environment variable requirements (`BB_URL`, `BB_TOKEN`) now clearly stated.\n- Added reference to new `scripts/bb.sh` helper as main interface.\n- Updated metadata for consistency; removed unused fields.\n\nv0.3.0 | 2026-02-12T19:33:11.312Z | user\n\nJSON5 metadata, auto-discovery, tunnel support, security hardening\n\nv0.2.1 | 2026-02-12T09:51:28.756Z | user\n\nRe-publish with updated bb skill\n\nv0.2.0 | 2026-02-12T09:43:56.665Z | user\n\nClean up suspicious patterns; add server setup instructions\n\nv0.1.1 | 2026-02-11T09:48:25.983Z | user\n\nFix 3D scene initial render resolution\n\nv0.1.0 | 2026-02-11T09:31:21.288Z | user\n\nInitial release\n\nArchive index:\n\nArchive v0.7.1: 3 files, 4861 bytes\n\nFiles: scripts/bullybuddy.sh (4222b), SKILL.md (7092b), _meta.json (129b)\n\nFile v0.7.1:SKILL.md\n\n---\nname: bullybuddy\ndescription: >\n  BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input,\n  kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.\n  Reads auth token from ~/.bullybuddy/connection.json automatically.\nuser-invocable: true\ncommand-dispatch: tool\ncommand-tool: exec\ncommand-arg-mode: raw\nmetadata:\n  openclaw:\n    emoji: \"🦞\"\n    homepage: \"https://github.com/ChenKuanSun/openclaw-bullybuddy\"\n    requires:\n      bins:\n        - bullybuddy\n        - jq\n        - curl\n      config:\n        - \"~/.bullybuddy/connection.json\"\n    install:\n      - id: node\n        kind: node\n        package: openclaw-bullybuddy\n        bins:\n          - bullybuddy\n---\n\n# BullyBuddy\n\nSpawns and manages multiple Claude Code CLI sessions. Dual backend: **tmux** (default, sessions survive server restart) or **node-pty** (fallback). REST API, WebSocket streaming, web dashboard.\n\n## Setup\n\n1. Install the package globally:\n\n```bash\nnpm install -g openclaw-bullybuddy\n```\n\n2. Start the server:\n\n```bash\nbullybuddy server\n```\n\nConnection info is auto-saved to `~/.bullybuddy/connection.json` on startup. The `/bullybuddy` command reads it automatically — no env vars needed.\n\nFor remote access, start with `bullybuddy server --tunnel`. The tunnel URL is available via `/bullybuddy url`.\n\n## /bullybuddy Slash Command\n\n```\n/bullybuddy status          - Server status & session summary\n/bullybuddy list            - List all sessions\n/bullybuddy spawn [cwd] [task] [group] - Create new session\n/bullybuddy send <id> <text> - Send input to session\n/bullybuddy output <id> [lines] - Show session output/transcript\n/bullybuddy kill <id>       - Terminate session\n/bullybuddy url             - Show dashboard URL (local + tunnel)\n/bullybuddy audit [limit]   - View audit log\n/bullybuddy transcript <id> [limit] - View conversation transcript\n/bullybuddy help            - Show help\n```\n\n## Security Notice\n\n- The auth token grants **full control over all spawned Claude Code sessions**, including sending arbitrary input. Treat it as a secret.\n- The `/bullybuddy url` command outputs the dashboard URL with the token embedded. Do not share or log this URL publicly.\n- When using `--tunnel`, the dashboard and API are exposed to the internet via a Cloudflare temporary URL. Anyone with the token can access all sessions remotely.\n- Spawned sessions run Claude Code with your local permissions. If `--dangerously-skip-permissions` is enabled, Claude can execute any command without confirmation.\n\n## Authentication\n\nA random token is generated on each server start and saved to `~/.bullybuddy/connection.json` (mode 0600). CLI and `/bullybuddy` auto-discover it. For the dashboard, the token is included in the URL printed on startup. The connection file is deleted on graceful shutdown.\n\n## API Overview\n\nAll endpoints require the token via `Authorization: Bearer <token>` header or `?token=` query parameter. All responses follow `{ ok: boolean, data?: T, error?: string }`.\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/health` | Server status |\n| `GET` | `/api/sessions` | List sessions (filter by group) |\n| `POST` | `/api/sessions` | Spawn session |\n| `GET` | `/api/sessions/:id` | Session detail with metrics |\n| `DELETE` | `/api/sessions/:id` | Kill session |\n| `POST` | `/api/sessions/:id/input` | Send input to PTY |\n| `POST` | `/api/sessions/:id/resize` | Resize PTY |\n| `POST` | `/api/sessions/:id/task` | Set task metadata |\n| `POST` | `/api/sessions/:id/mute` | Mute notifications |\n| `POST` | `/api/sessions/:id/unmute` | Unmute notifications |\n| `GET` | `/api/groups` | Groups with session counts |\n| `GET` | `/api/summary` | Aggregate state counts and groups |\n| `GET` | `/api/browse` | Browse directories (disabled by default) |\n| `GET` | `/api/audit` | Audit log |\n| `GET` | `/api/sessions/:id/transcript` | Conversation transcript |\n\n### Spawn Request Body\n\n```json\n{\n  \"name\": \"worker-1\",\n  \"group\": \"myproject\",\n  \"cwd\": \"/path/to/repo\",\n  \"task\": \"Implement feature X\",\n  \"args\": [\"--verbose\"],\n  \"cols\": 120,\n  \"rows\": 40,\n  \"skipPermissions\": false\n}\n```\n\nAll fields optional. When `task` is provided, it is automatically sent as input when Claude reaches the idle prompt.\n\n**Note:** When sending input, terminate with `\\r` (carriage return), not `\\n`.\n\n## WebSocket Protocol\n\nConnect to `ws://<host>:<port>/ws?token=<token>`.\n\n### Client Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `subscribe` | `sessionId`, `cols?`, `rows?` | Receive output from session |\n| `unsubscribe` | `sessionId` | Stop receiving output |\n| `input` | `sessionId`, `data` | Send keystrokes to PTY |\n| `resize` | `sessionId`, `cols`, `rows` | Resize PTY |\n\n### Server Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `sessions` | `sessions[]` | Full session list (on connect) |\n| `output` | `sessionId`, `data` | Terminal output chunk |\n| `scrollback` | `sessionId`, `data` | Buffered scrollback on subscribe |\n| `session:created` | `session` | New session spawned |\n| `session:exited` | `sessionId`, `exitCode` | Session terminated |\n| `session:stateChanged` | `sessionId`, `detailedState` | State transition |\n| `error` | `message` | Error (e.g. invalid message) |\n\n## State Detection\n\nBullyBuddy analyzes raw PTY output to detect Claude Code's state in real-time.\n\n| `detailedState` | Meaning |\n|-----------------|---------|\n| `starting` | Session just spawned, Claude loading |\n| `working` | Claude is thinking/editing (spinner visible) |\n| `permission_needed` | Claude waiting for user approval |\n| `idle` | Claude at prompt, ready for input |\n| `compacting` | Compacting conversation history |\n| `error` | Error detected in output |\n\nState transitions are broadcast via WebSocket and reflected in `GET /api/summary`.\n\n## OpenClaw Integration\n\nPoll `GET /api/summary` on an interval to check fleet status. The `sessionsNeedingAttention` field contains IDs of sessions in `permission_needed` or `error` state.\n\n## Remote Access\n\nStart the server with `--tunnel` to create a Cloudflare temporary URL automatically:\n\n```bash\nbullybuddy server --tunnel\n```\n\nThe tunnel URL is printed on startup and saved to `~/.bullybuddy/connection.json`. Use `bullybuddy url` or `/bullybuddy url` to retrieve it anytime.\n\n## CLI Commands\n\n```bash\nbullybuddy server                          # Start server\nbullybuddy server --tunnel                 # Start with Cloudflare tunnel\nbullybuddy url                             # Show dashboard URL (local + tunnel)\nbullybuddy spawn --name worker --group proj  # Spawn session\nbullybuddy list --json                     # List sessions\nbullybuddy send <id> \"Fix the bug\"         # Send input\nbullybuddy attach <id>                     # Interactive terminal\nbullybuddy kill <id>                       # Kill session\nbullybuddy groups                          # List groups\nbullybuddy open                            # Open dashboard\n```\n\n## Script\n\nWhen invoked, run:\n```bash\n{baseDir}/scripts/bullybuddy.sh $ARGUMENTS\n```\n\nFile v0.7.1:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.7.1\",\n  \"publishedAt\": 1771428141579\n}\n\nArchive v0.7.0: 3 files, 4861 bytes\n\nFiles: scripts/bullybuddy.sh (4222b), SKILL.md (7092b), _meta.json (129b)\n\nFile v0.7.0:SKILL.md\n\n---\nname: bullybuddy\ndescription: >\n  BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input,\n  kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.\n  Reads auth token from ~/.bullybuddy/connection.json automatically.\nuser-invocable: true\ncommand-dispatch: tool\ncommand-tool: exec\ncommand-arg-mode: raw\nmetadata:\n  openclaw:\n    emoji: \"🦞\"\n    homepage: \"https://github.com/ChenKuanSun/openclaw-bullybuddy\"\n    requires:\n      bins:\n        - bullybuddy\n        - jq\n        - curl\n      config:\n        - \"~/.bullybuddy/connection.json\"\n    install:\n      - id: node\n        kind: node\n        package: openclaw-bullybuddy\n        bins:\n          - bullybuddy\n---\n\n# BullyBuddy\n\nSpawns and manages multiple Claude Code CLI sessions. Dual backend: **tmux** (default, sessions survive server restart) or **node-pty** (fallback). REST API, WebSocket streaming, web dashboard.\n\n## Setup\n\n1. Install the package globally:\n\n```bash\nnpm install -g openclaw-bullybuddy\n```\n\n2. Start the server:\n\n```bash\nbullybuddy server\n```\n\nConnection info is auto-saved to `~/.bullybuddy/connection.json` on startup. The `/bullybuddy` command reads it automatically — no env vars needed.\n\nFor remote access, start with `bullybuddy server --tunnel`. The tunnel URL is available via `/bullybuddy url`.\n\n## /bullybuddy Slash Command\n\n```\n/bullybuddy status          - Server status & session summary\n/bullybuddy list            - List all sessions\n/bullybuddy spawn [cwd] [task] [group] - Create new session\n/bullybuddy send <id> <text> - Send input to session\n/bullybuddy output <id> [lines] - Show session output/transcript\n/bullybuddy kill <id>       - Terminate session\n/bullybuddy url             - Show dashboard URL (local + tunnel)\n/bullybuddy audit [limit]   - View audit log\n/bullybuddy transcript <id> [limit] - View conversation transcript\n/bullybuddy help            - Show help\n```\n\n## Security Notice\n\n- The auth token grants **full control over all spawned Claude Code sessions**, including sending arbitrary input. Treat it as a secret.\n- The `/bullybuddy url` command outputs the dashboard URL with the token embedded. Do not share or log this URL publicly.\n- When using `--tunnel`, the dashboard and API are exposed to the internet via a Cloudflare temporary URL. Anyone with the token can access all sessions remotely.\n- Spawned sessions run Claude Code with your local permissions. If `--dangerously-skip-permissions` is enabled, Claude can execute any command without confirmation.\n\n## Authentication\n\nA random token is generated on each server start and saved to `~/.bullybuddy/connection.json` (mode 0600). CLI and `/bullybuddy` auto-discover it. For the dashboard, the token is included in the URL printed on startup. The connection file is deleted on graceful shutdown.\n\n## API Overview\n\nAll endpoints require the token via `Authorization: Bearer <token>` header or `?token=` query parameter. All responses follow `{ ok: boolean, data?: T, error?: string }`.\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/health` | Server status |\n| `GET` | `/api/sessions` | List sessions (filter by group) |\n| `POST` | `/api/sessions` | Spawn session |\n| `GET` | `/api/sessions/:id` | Session detail with metrics |\n| `DELETE` | `/api/sessions/:id` | Kill session |\n| `POST` | `/api/sessions/:id/input` | Send input to PTY |\n| `POST` | `/api/sessions/:id/resize` | Resize PTY |\n| `POST` | `/api/sessions/:id/task` | Set task metadata |\n| `POST` | `/api/sessions/:id/mute` | Mute notifications |\n| `POST` | `/api/sessions/:id/unmute` | Unmute notifications |\n| `GET` | `/api/groups` | Groups with session counts |\n| `GET` | `/api/summary` | Aggregate state counts and groups |\n| `GET` | `/api/browse` | Browse directories (disabled by default) |\n| `GET` | `/api/audit` | Audit log |\n| `GET` | `/api/sessions/:id/transcript` | Conversation transcript |\n\n### Spawn Request Body\n\n```json\n{\n  \"name\": \"worker-1\",\n  \"group\": \"myproject\",\n  \"cwd\": \"/path/to/repo\",\n  \"task\": \"Implement feature X\",\n  \"args\": [\"--verbose\"],\n  \"cols\": 120,\n  \"rows\": 40,\n  \"skipPermissions\": false\n}\n```\n\nAll fields optional. When `task` is provided, it is automatically sent as input when Claude reaches the idle prompt.\n\n**Note:** When sending input, terminate with `\\r` (carriage return), not `\\n`.\n\n## WebSocket Protocol\n\nConnect to `ws://<host>:<port>/ws?token=<token>`.\n\n### Client Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `subscribe` | `sessionId`, `cols?`, `rows?` | Receive output from session |\n| `unsubscribe` | `sessionId` | Stop receiving output |\n| `input` | `sessionId`, `data` | Send keystrokes to PTY |\n| `resize` | `sessionId`, `cols`, `rows` | Resize PTY |\n\n### Server Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `sessions` | `sessions[]` | Full session list (on connect) |\n| `output` | `sessionId`, `data` | Terminal output chunk |\n| `scrollback` | `sessionId`, `data` | Buffered scrollback on subscribe |\n| `session:created` | `session` | New session spawned |\n| `session:exited` | `sessionId`, `exitCode` | Session terminated |\n| `session:stateChanged` | `sessionId`, `detailedState` | State transition |\n| `error` | `message` | Error (e.g. invalid message) |\n\n## State Detection\n\nBullyBuddy analyzes raw PTY output to detect Claude Code's state in real-time.\n\n| `detailedState` | Meaning |\n|-----------------|---------|\n| `starting` | Session just spawned, Claude loading |\n| `working` | Claude is thinking/editing (spinner visible) |\n| `permission_needed` | Claude waiting for user approval |\n| `idle` | Claude at prompt, ready for input |\n| `compacting` | Compacting conversation history |\n| `error` | Error detected in output |\n\nState transitions are broadcast via WebSocket and reflected in `GET /api/summary`.\n\n## OpenClaw Integration\n\nPoll `GET /api/summary` on an interval to check fleet status. The `sessionsNeedingAttention` field contains IDs of sessions in `permission_needed` or `error` state.\n\n## Remote Access\n\nStart the server with `--tunnel` to create a Cloudflare temporary URL automatically:\n\n```bash\nbullybuddy server --tunnel\n```\n\nThe tunnel URL is printed on startup and saved to `~/.bullybuddy/connection.json`. Use `bullybuddy url` or `/bullybuddy url` to retrieve it anytime.\n\n## CLI Commands\n\n```bash\nbullybuddy server                          # Start server\nbullybuddy server --tunnel                 # Start with Cloudflare tunnel\nbullybuddy url                             # Show dashboard URL (local + tunnel)\nbullybuddy spawn --name worker --group proj  # Spawn session\nbullybuddy list --json                     # List sessions\nbullybuddy send <id> \"Fix the bug\"         # Send input\nbullybuddy attach <id>                     # Interactive terminal\nbullybuddy kill <id>                       # Kill session\nbullybuddy groups                          # List groups\nbullybuddy open                            # Open dashboard\n```\n\n## Script\n\nWhen invoked, run:\n```bash\n{baseDir}/scripts/bullybuddy.sh $ARGUMENTS\n```\n\nFile v0.7.0:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.7.0\",\n  \"publishedAt\": 1771427355168\n}\n\nArchive v0.6.4: 3 files, 2498 bytes\n\nFiles: scripts/bb.sh (3956b), SKILL.md (978b), _meta.json (129b)\n\nFile v0.6.4:SKILL.md\n\n---\nname: bullybuddy\ndescription: BullyBuddy - Control Claude Code sessions. Commands: status, list, spawn, send, output, kill, audit, transcript.\nmetadata: { \"openclaw\": { \"emoji\": \"🦞\", \"always\": true } }\n---\n\n# BullyBuddy\n\nControl BullyBuddy Claude Code session manager via `/bullybuddy` or `/skill bullybuddy`.\n\n## Usage\n\nRun the script with the subcommand:\n\n```bash\n{baseDir}/scripts/bb.sh <command> [args...]\n```\n\nEnvironment variables `BB_URL` and `BB_TOKEN` must be set.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `help` | Show help |\n| `status` | Server status |\n| `list` | List sessions |\n| `spawn [cwd] [task]` | Create session |\n| `send <id> <text>` | Send input |\n| `output <id>` | Show output |\n| `kill <id>` | Kill session |\n| `audit [n]` | Audit log |\n| `transcript <id>` | Transcript |\n\n## Examples\n\n```\n/bullybuddy status\n/bullybuddy list\n/bullybuddy spawn ~/project \"Fix bug\"\n/bullybuddy send abc123 yes\n/bullybuddy kill abc123\n```\n\nFile v0.6.4:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.6.4\",\n  \"publishedAt\": 1771426512818\n}\n\nArchive v0.6.3: 3 files, 2498 bytes\n\nFiles: scripts/bb.sh (3956b), SKILL.md (978b), _meta.json (129b)\n\nFile v0.6.3:SKILL.md\n\n---\nname: bullybuddy\ndescription: BullyBuddy - Control Claude Code sessions. Commands: status, list, spawn, send, output, kill, audit, transcript.\nmetadata: { \"openclaw\": { \"emoji\": \"🦞\", \"always\": true } }\n---\n\n# BullyBuddy\n\nControl BullyBuddy Claude Code session manager via `/bullybuddy` or `/skill bullybuddy`.\n\n## Usage\n\nRun the script with the subcommand:\n\n```bash\n{baseDir}/scripts/bb.sh <command> [args...]\n```\n\nEnvironment variables `BB_URL` and `BB_TOKEN` must be set.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `help` | Show help |\n| `status` | Server status |\n| `list` | List sessions |\n| `spawn [cwd] [task]` | Create session |\n| `send <id> <text>` | Send input |\n| `output <id>` | Show output |\n| `kill <id>` | Kill session |\n| `audit [n]` | Audit log |\n| `transcript <id>` | Transcript |\n\n## Examples\n\n```\n/bullybuddy status\n/bullybuddy list\n/bullybuddy spawn ~/project \"Fix bug\"\n/bullybuddy send abc123 yes\n/bullybuddy kill abc123\n```\n\nFile v0.6.3:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.6.3\",\n  \"publishedAt\": 1771426058917\n}\n\nArchive v0.6.2: 3 files, 4892 bytes\n\nFiles: scripts/bullybuddy.sh (4222b), SKILL.md (7170b), _meta.json (129b)\n\nFile v0.6.2:SKILL.md\n\n---\nname: bullybuddy\ndescription: >\n  BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input,\n  kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.\n  Reads auth token from ~/.bullybuddy/connection.json automatically.\nuser-invocable: true\ncommand-dispatch: tool\ncommand-tool: exec\ncommand-arg-mode: raw\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"🦞\",\n        \"homepage\": \"https://github.com/ChenKuanSun/openclaw-bullybuddy\",\n        \"requires\": { \"bins\": [\"bullybuddy\", \"claude\", \"jq\", \"curl\"] },\n        \"install\":\n          [\n            {\n              \"id\": \"node\",\n              \"kind\": \"node\",\n              \"package\": \"openclaw-bullybuddy\",\n              \"bins\": [\"bullybuddy\"],\n            },\n          ],\n      },\n  }\n---\n\n# BullyBuddy\n\nSpawns and manages multiple Claude Code CLI sessions. Dual backend: **tmux** (default, sessions survive server restart) or **node-pty** (fallback). REST API, WebSocket streaming, web dashboard.\n\n## Setup\n\n1. Install the package globally:\n\n```bash\nnpm install -g openclaw-bullybuddy\n```\n\n2. Start the server:\n\n```bash\nbullybuddy server\n```\n\nConnection info is auto-saved to `~/.bullybuddy/connection.json` on startup. The `/bullybuddy` command reads it automatically — no env vars needed.\n\nFor remote access, start with `bullybuddy server --tunnel`. The tunnel URL is available via `/bullybuddy url`.\n\n## /bullybuddy Slash Command\n\n```\n/bullybuddy status          - Server status & session summary\n/bullybuddy list            - List all sessions\n/bullybuddy spawn [cwd] [task] [group] - Create new session\n/bullybuddy send <id> <text> - Send input to session\n/bullybuddy output <id> [lines] - Show session output/transcript\n/bullybuddy kill <id>       - Terminate session\n/bullybuddy url             - Show dashboard URL (local + tunnel)\n/bullybuddy audit [limit]   - View audit log\n/bullybuddy transcript <id> [limit] - View conversation transcript\n/bullybuddy help            - Show help\n```\n\n## Security Notice\n\n- The auth token grants **full control over all spawned Claude Code sessions**, including sending arbitrary input. Treat it as a secret.\n- The `/bullybuddy url` command outputs the dashboard URL with the token embedded. Do not share or log this URL publicly.\n- When using `--tunnel`, the dashboard and API are exposed to the internet via a Cloudflare temporary URL. Anyone with the token can access all sessions remotely.\n- Spawned sessions run Claude Code with your local permissions. If `--dangerously-skip-permissions` is enabled, Claude can execute any command without confirmation.\n\n## Authentication\n\nA random token is generated on each server start and saved to `~/.bullybuddy/connection.json` (mode 0600). CLI and `/bullybuddy` auto-discover it. For the dashboard, the token is included in the URL printed on startup. The connection file is deleted on graceful shutdown.\n\n## API Overview\n\nAll endpoints require the token via `Authorization: Bearer <token>` header or `?token=` query parameter. All responses follow `{ ok: boolean, data?: T, error?: string }`.\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/health` | Server status |\n| `GET` | `/api/sessions` | List sessions (filter by group) |\n| `POST` | `/api/sessions` | Spawn session |\n| `GET` | `/api/sessions/:id` | Session detail with metrics |\n| `DELETE` | `/api/sessions/:id` | Kill session |\n| `POST` | `/api/sessions/:id/input` | Send input to PTY |\n| `POST` | `/api/sessions/:id/resize` | Resize PTY |\n| `POST` | `/api/sessions/:id/task` | Set task metadata |\n| `POST` | `/api/sessions/:id/mute` | Mute notifications |\n| `POST` | `/api/sessions/:id/unmute` | Unmute notifications |\n| `GET` | `/api/groups` | Groups with session counts |\n| `GET` | `/api/summary` | Aggregate state counts and groups |\n| `GET` | `/api/browse` | Browse directories (disabled by default) |\n| `GET` | `/api/audit` | Audit log |\n| `GET` | `/api/sessions/:id/transcript` | Conversation transcript |\n\n### Spawn Request Body\n\n```json\n{\n  \"name\": \"worker-1\",\n  \"group\": \"myproject\",\n  \"cwd\": \"/path/to/repo\",\n  \"task\": \"Implement feature X\",\n  \"args\": [\"--verbose\"],\n  \"cols\": 120,\n  \"rows\": 40,\n  \"skipPermissions\": false\n}\n```\n\nAll fields optional. When `task` is provided, it is automatically sent as input when Claude reaches the idle prompt.\n\n**Note:** When sending input, terminate with `\\r` (carriage return), not `\\n`.\n\n## WebSocket Protocol\n\nConnect to `ws://<host>:<port>/ws?token=<token>`.\n\n### Client Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `subscribe` | `sessionId`, `cols?`, `rows?` | Receive output from session |\n| `unsubscribe` | `sessionId` | Stop receiving output |\n| `input` | `sessionId`, `data` | Send keystrokes to PTY |\n| `resize` | `sessionId`, `cols`, `rows` | Resize PTY |\n\n### Server Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `sessions` | `sessions[]` | Full session list (on connect) |\n| `output` | `sessionId`, `data` | Terminal output chunk |\n| `scrollback` | `sessionId`, `data` | Buffered scrollback on subscribe |\n| `session:created` | `session` | New session spawned |\n| `session:exited` | `sessionId`, `exitCode` | Session terminated |\n| `session:stateChanged` | `sessionId`, `detailedState` | State transition |\n| `error` | `message` | Error (e.g. invalid message) |\n\n## State Detection\n\nBullyBuddy analyzes raw PTY output to detect Claude Code's state in real-time.\n\n| `detailedState` | Meaning |\n|-----------------|---------|\n| `starting` | Session just spawned, Claude loading |\n| `working` | Claude is thinking/editing (spinner visible) |\n| `permission_needed` | Claude waiting for user approval |\n| `idle` | Claude at prompt, ready for input |\n| `compacting` | Compacting conversation history |\n| `error` | Error detected in output |\n\nState transitions are broadcast via WebSocket and reflected in `GET /api/summary`.\n\n## OpenClaw Integration\n\nPoll `GET /api/summary` on an interval to check fleet status. The `sessionsNeedingAttention` field contains IDs of sessions in `permission_needed` or `error` state.\n\n## Remote Access\n\nStart the server with `--tunnel` to create a Cloudflare temporary URL automatically:\n\n```bash\nbullybuddy server --tunnel\n```\n\nThe tunnel URL is printed on startup and saved to `~/.bullybuddy/connection.json`. Use `bullybuddy url` or `/bullybuddy url` to retrieve it anytime.\n\n## CLI Commands\n\n```bash\nbullybuddy server                          # Start server\nbullybuddy server --tunnel                 # Start with Cloudflare tunnel\nbullybuddy url                             # Show dashboard URL (local + tunnel)\nbullybuddy spawn --name worker --group proj  # Spawn session\nbullybuddy list --json                     # List sessions\nbullybuddy send <id> \"Fix the bug\"         # Send input\nbullybuddy attach <id>                     # Interactive terminal\nbullybuddy kill <id>                       # Kill session\nbullybuddy groups                          # List groups\nbullybuddy open                            # Open dashboard\n```\n\n## Script\n\nWhen invoked, run:\n```bash\n{baseDir}/scripts/bullybuddy.sh $ARGUMENTS\n```\n\nFile v0.6.2:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.6.2\",\n  \"publishedAt\": 1771425448386\n}\n\nArchive v0.6.1: 3 files, 4891 bytes\n\nFiles: scripts/bullybuddy.sh (4222b), SKILL.md (7170b), _meta.json (129b)\n\nFile v0.6.1:SKILL.md\n\n---\nname: bullybuddy\ndescription: >\n  BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input,\n  kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.\n  Reads auth token from ~/.bullybuddy/connection.json automatically.\nuser-invocable: true\ncommand-dispatch: tool\ncommand-tool: exec\ncommand-arg-mode: raw\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"🦞\",\n        \"homepage\": \"https://github.com/ChenKuanSun/openclaw-bullybuddy\",\n        \"requires\": { \"bins\": [\"bullybuddy\", \"claude\", \"jq\", \"curl\"] },\n        \"install\":\n          [\n            {\n              \"id\": \"node\",\n              \"kind\": \"node\",\n              \"package\": \"openclaw-bullybuddy\",\n              \"bins\": [\"bullybuddy\"],\n            },\n          ],\n      },\n  }\n---\n\n# BullyBuddy\n\nSpawns and manages multiple Claude Code CLI sessions. Dual backend: **tmux** (default, sessions survive server restart) or **node-pty** (fallback). REST API, WebSocket streaming, web dashboard.\n\n## Setup\n\n1. Install the package globally:\n\n```bash\nnpm install -g openclaw-bullybuddy\n```\n\n2. Start the server:\n\n```bash\nbullybuddy server\n```\n\nConnection info is auto-saved to `~/.bullybuddy/connection.json` on startup. The `/bullybuddy` command reads it automatically — no env vars needed.\n\nFor remote access, start with `bullybuddy server --tunnel`. The tunnel URL is available via `/bullybuddy url`.\n\n## /bullybuddy Slash Command\n\n```\n/bullybuddy status          - Server status & session summary\n/bullybuddy list            - List all sessions\n/bullybuddy spawn [cwd] [task] [group] - Create new session\n/bullybuddy send <id> <text> - Send input to session\n/bullybuddy output <id> [lines] - Show session output/transcript\n/bullybuddy kill <id>       - Terminate session\n/bullybuddy url             - Show dashboard URL (local + tunnel)\n/bullybuddy audit [limit]   - View audit log\n/bullybuddy transcript <id> [limit] - View conversation transcript\n/bullybuddy help            - Show help\n```\n\n## Security Notice\n\n- The auth token grants **full control over all spawned Claude Code sessions**, including sending arbitrary input. Treat it as a secret.\n- The `/bullybuddy url` command outputs the dashboard URL with the token embedded. Do not share or log this URL publicly.\n- When using `--tunnel`, the dashboard and API are exposed to the internet via a Cloudflare temporary URL. Anyone with the token can access all sessions remotely.\n- Spawned sessions run Claude Code with your local permissions. If `--dangerously-skip-permissions` is enabled, Claude can execute any command without confirmation.\n\n## Authentication\n\nA random token is generated on each server start and saved to `~/.bullybuddy/connection.json` (mode 0600). CLI and `/bullybuddy` auto-discover it. For the dashboard, the token is included in the URL printed on startup. The connection file is deleted on graceful shutdown.\n\n## API Overview\n\nAll endpoints require the token via `Authorization: Bearer <token>` header or `?token=` query parameter. All responses follow `{ ok: boolean, data?: T, error?: string }`.\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/health` | Server status |\n| `GET` | `/api/sessions` | List sessions (filter by group) |\n| `POST` | `/api/sessions` | Spawn session |\n| `GET` | `/api/sessions/:id` | Session detail with metrics |\n| `DELETE` | `/api/sessions/:id` | Kill session |\n| `POST` | `/api/sessions/:id/input` | Send input to PTY |\n| `POST` | `/api/sessions/:id/resize` | Resize PTY |\n| `POST` | `/api/sessions/:id/task` | Set task metadata |\n| `POST` | `/api/sessions/:id/mute` | Mute notifications |\n| `POST` | `/api/sessions/:id/unmute` | Unmute notifications |\n| `GET` | `/api/groups` | Groups with session counts |\n| `GET` | `/api/summary` | Aggregate state counts and groups |\n| `GET` | `/api/browse` | Browse directories (disabled by default) |\n| `GET` | `/api/audit` | Audit log |\n| `GET` | `/api/sessions/:id/transcript` | Conversation transcript |\n\n### Spawn Request Body\n\n```json\n{\n  \"name\": \"worker-1\",\n  \"group\": \"myproject\",\n  \"cwd\": \"/path/to/repo\",\n  \"task\": \"Implement feature X\",\n  \"args\": [\"--verbose\"],\n  \"cols\": 120,\n  \"rows\": 40,\n  \"skipPermissions\": false\n}\n```\n\nAll fields optional. When `task` is provided, it is automatically sent as input when Claude reaches the idle prompt.\n\n**Note:** When sending input, terminate with `\\r` (carriage return), not `\\n`.\n\n## WebSocket Protocol\n\nConnect to `ws://<host>:<port>/ws?token=<token>`.\n\n### Client Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `subscribe` | `sessionId`, `cols?`, `rows?` | Receive output from session |\n| `unsubscribe` | `sessionId` | Stop receiving output |\n| `input` | `sessionId`, `data` | Send keystrokes to PTY |\n| `resize` | `sessionId`, `cols`, `rows` | Resize PTY |\n\n### Server Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `sessions` | `sessions[]` | Full session list (on connect) |\n| `output` | `sessionId`, `data` | Terminal output chunk |\n| `scrollback` | `sessionId`, `data` | Buffered scrollback on subscribe |\n| `session:created` | `session` | New session spawned |\n| `session:exited` | `sessionId`, `exitCode` | Session terminated |\n| `session:stateChanged` | `sessionId`, `detailedState` | State transition |\n| `error` | `message` | Error (e.g. invalid message) |\n\n## State Detection\n\nBullyBuddy analyzes raw PTY output to detect Claude Code's state in real-time.\n\n| `detailedState` | Meaning |\n|-----------------|---------|\n| `starting` | Session just spawned, Claude loading |\n| `working` | Claude is thinking/editing (spinner visible) |\n| `permission_needed` | Claude waiting for user approval |\n| `idle` | Claude at prompt, ready for input |\n| `compacting` | Compacting conversation history |\n| `error` | Error detected in output |\n\nState transitions are broadcast via WebSocket and reflected in `GET /api/summary`.\n\n## OpenClaw Integration\n\nPoll `GET /api/summary` on an interval to check fleet status. The `sessionsNeedingAttention` field contains IDs of sessions in `permission_needed` or `error` state.\n\n## Remote Access\n\nStart the server with `--tunnel` to create a Cloudflare temporary URL automatically:\n\n```bash\nbullybuddy server --tunnel\n```\n\nThe tunnel URL is printed on startup and saved to `~/.bullybuddy/connection.json`. Use `bullybuddy url` or `/bullybuddy url` to retrieve it anytime.\n\n## CLI Commands\n\n```bash\nbullybuddy server                          # Start server\nbullybuddy server --tunnel                 # Start with Cloudflare tunnel\nbullybuddy url                             # Show dashboard URL (local + tunnel)\nbullybuddy spawn --name worker --group proj  # Spawn session\nbullybuddy list --json                     # List sessions\nbullybuddy send <id> \"Fix the bug\"         # Send input\nbullybuddy attach <id>                     # Interactive terminal\nbullybuddy kill <id>                       # Kill session\nbullybuddy groups                          # List groups\nbullybuddy open                            # Open dashboard\n```\n\n## Script\n\nWhen invoked, run:\n```bash\n{baseDir}/scripts/bullybuddy.sh $ARGUMENTS\n```\n\nFile v0.6.1:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.6.1\",\n  \"publishedAt\": 1771425182650\n}\n\nArchive v0.6.0: 3 files, 4891 bytes\n\nFiles: scripts/bullybuddy.sh (4222b), SKILL.md (7170b), _meta.json (129b)\n\nFile v0.6.0:SKILL.md\n\n---\nname: bullybuddy\ndescription: >\n  BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input,\n  kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.\n  Reads auth token from ~/.bullybuddy/connection.json automatically.\nuser-invocable: true\ncommand-dispatch: tool\ncommand-tool: exec\ncommand-arg-mode: raw\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"🦞\",\n        \"homepage\": \"https://github.com/ChenKuanSun/openclaw-bullybuddy\",\n        \"requires\": { \"bins\": [\"bullybuddy\", \"claude\", \"jq\", \"curl\"] },\n        \"install\":\n          [\n            {\n              \"id\": \"node\",\n              \"kind\": \"node\",\n              \"package\": \"openclaw-bullybuddy\",\n              \"bins\": [\"bullybuddy\"],\n            },\n          ],\n      },\n  }\n---\n\n# BullyBuddy\n\nSpawns and manages multiple Claude Code CLI sessions. Dual backend: **tmux** (default, sessions survive server restart) or **node-pty** (fallback). REST API, WebSocket streaming, web dashboard.\n\n## Setup\n\n1. Install the package globally:\n\n```bash\nnpm install -g openclaw-bullybuddy\n```\n\n2. Start the server:\n\n```bash\nbullybuddy server\n```\n\nConnection info is auto-saved to `~/.bullybuddy/connection.json` on startup. The `/bullybuddy` command reads it automatically — no env vars needed.\n\nFor remote access, start with `bullybuddy server --tunnel`. The tunnel URL is available via `/bullybuddy url`.\n\n## /bullybuddy Slash Command\n\n```\n/bullybuddy status          - Server status & session summary\n/bullybuddy list            - List all sessions\n/bullybuddy spawn [cwd] [task] [group] - Create new session\n/bullybuddy send <id> <text> - Send input to session\n/bullybuddy output <id> [lines] - Show session output/transcript\n/bullybuddy kill <id>       - Terminate session\n/bullybuddy url             - Show dashboard URL (local + tunnel)\n/bullybuddy audit [limit]   - View audit log\n/bullybuddy transcript <id> [limit] - View conversation transcript\n/bullybuddy help            - Show help\n```\n\n## Security Notice\n\n- The auth token grants **full control over all spawned Claude Code sessions**, including sending arbitrary input. Treat it as a secret.\n- The `/bullybuddy url` command outputs the dashboard URL with the token embedded. Do not share or log this URL publicly.\n- When using `--tunnel`, the dashboard and API are exposed to the internet via a Cloudflare temporary URL. Anyone with the token can access all sessions remotely.\n- Spawned sessions run Claude Code with your local permissions. If `--dangerously-skip-permissions` is enabled, Claude can execute any command without confirmation.\n\n## Authentication\n\nA random token is generated on each server start and saved to `~/.bullybuddy/connection.json` (mode 0600). CLI and `/bullybuddy` auto-discover it. For the dashboard, the token is included in the URL printed on startup. The connection file is deleted on graceful shutdown.\n\n## API Overview\n\nAll endpoints require the token via `Authorization: Bearer <token>` header or `?token=` query parameter. All responses follow `{ ok: boolean, data?: T, error?: string }`.\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/health` | Server status |\n| `GET` | `/api/sessions` | List sessions (filter by group) |\n| `POST` | `/api/sessions` | Spawn session |\n| `GET` | `/api/sessions/:id` | Session detail with metrics |\n| `DELETE` | `/api/sessions/:id` | Kill session |\n| `POST` | `/api/sessions/:id/input` | Send input to PTY |\n| `POST` | `/api/sessions/:id/resize` | Resize PTY |\n| `POST` | `/api/sessions/:id/task` | Set task metadata |\n| `POST` | `/api/sessions/:id/mute` | Mute notifications |\n| `POST` | `/api/sessions/:id/unmute` | Unmute notifications |\n| `GET` | `/api/groups` | Groups with session counts |\n| `GET` | `/api/summary` | Aggregate state counts and groups |\n| `GET` | `/api/browse` | Browse directories (disabled by default) |\n| `GET` | `/api/audit` | Audit log |\n| `GET` | `/api/sessions/:id/transcript` | Conversation transcript |\n\n### Spawn Request Body\n\n```json\n{\n  \"name\": \"worker-1\",\n  \"group\": \"myproject\",\n  \"cwd\": \"/path/to/repo\",\n  \"task\": \"Implement feature X\",\n  \"args\": [\"--verbose\"],\n  \"cols\": 120,\n  \"rows\": 40,\n  \"skipPermissions\": false\n}\n```\n\nAll fields optional. When `task` is provided, it is automatically sent as input when Claude reaches the idle prompt.\n\n**Note:** When sending input, terminate with `\\r` (carriage return), not `\\n`.\n\n## WebSocket Protocol\n\nConnect to `ws://<host>:<port>/ws?token=<token>`.\n\n### Client Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `subscribe` | `sessionId`, `cols?`, `rows?` | Receive output from session |\n| `unsubscribe` | `sessionId` | Stop receiving output |\n| `input` | `sessionId`, `data` | Send keystrokes to PTY |\n| `resize` | `sessionId`, `cols`, `rows` | Resize PTY |\n\n### Server Messages\n\n| type | fields | description |\n|------|--------|-------------|\n| `sessions` | `sessions[]` | Full session list (on connect) |\n| `output` | `sessionId`, `data` | Terminal output chunk |\n| `scrollback` | `sessionId`, `data` | Buffered scrollback on subscribe |\n| `session:created` | `session` | New session spawned |\n| `session:exited` | `sessionId`, `exitCode` | Session terminated |\n| `session:stateChanged` | `sessionId`, `detailedState` | State transition |\n| `error` | `message` | Error (e.g. invalid message) |\n\n## State Detection\n\nBullyBuddy analyzes raw PTY output to detect Claude Code's state in real-time.\n\n| `detailedState` | Meaning |\n|-----------------|---------|\n| `starting` | Session just spawned, Claude loading |\n| `working` | Claude is thinking/editing (spinner visible) |\n| `permission_needed` | Claude waiting for user approval |\n| `idle` | Claude at prompt, ready for input |\n| `compacting` | Compacting conversation history |\n| `error` | Error detected in output |\n\nState transitions are broadcast via WebSocket and reflected in `GET /api/summary`.\n\n## OpenClaw Integration\n\nPoll `GET /api/summary` on an interval to check fleet status. The `sessionsNeedingAttention` field contains IDs of sessions in `permission_needed` or `error` state.\n\n## Remote Access\n\nStart the server with `--tunnel` to create a Cloudflare temporary URL automatically:\n\n```bash\nbullybuddy server --tunnel\n```\n\nThe tunnel URL is printed on startup and saved to `~/.bullybuddy/connection.json`. Use `bullybuddy url` or `/bullybuddy url` to retrieve it anytime.\n\n## CLI Commands\n\n```bash\nbullybuddy server                          # Start server\nbullybuddy server --tunnel                 # Start with Cloudflare tunnel\nbullybuddy url                             # Show dashboard URL (local + tunnel)\nbullybuddy spawn --name worker --group proj  # Spawn session\nbullybuddy list --json                     # List sessions\nbullybuddy send <id> \"Fix the bug\"         # Send input\nbullybuddy attach <id>                     # Interactive terminal\nbullybuddy kill <id>                       # Kill session\nbullybuddy groups                          # List groups\nbullybuddy open                            # Open dashboard\n```\n\n## Script\n\nWhen invoked, run:\n```bash\n{baseDir}/scripts/bullybuddy.sh $ARGUMENTS\n```\n\nFile v0.6.0:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.6.0\",\n  \"publishedAt\": 1771419442458\n}\n\nArchive v0.5.1: 3 files, 2498 bytes\n\nFiles: scripts/bb.sh (3956b), SKILL.md (978b), _meta.json (129b)\n\nFile v0.5.1:SKILL.md\n\n---\nname: bullybuddy\ndescription: BullyBuddy - Control Claude Code sessions. Commands: status, list, spawn, send, output, kill, audit, transcript.\nmetadata: { \"openclaw\": { \"emoji\": \"🦞\", \"always\": true } }\n---\n\n# BullyBuddy\n\nControl BullyBuddy Claude Code session manager via `/bullybuddy` or `/skill bullybuddy`.\n\n## Usage\n\nRun the script with the subcommand:\n\n```bash\n{baseDir}/scripts/bb.sh <command> [args...]\n```\n\nEnvironment variables `BB_URL` and `BB_TOKEN` must be set.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `help` | Show help |\n| `status` | Server status |\n| `list` | List sessions |\n| `spawn [cwd] [task]` | Create session |\n| `send <id> <text>` | Send input |\n| `output <id>` | Show output |\n| `kill <id>` | Kill session |\n| `audit [n]` | Audit log |\n| `transcript <id>` | Transcript |\n\n## Examples\n\n```\n/bullybuddy status\n/bullybuddy list\n/bullybuddy spawn ~/project \"Fix bug\"\n/bullybuddy send abc123 yes\n/bullybuddy kill abc123\n```\n\nFile v0.5.1:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.5.1\",\n  \"publishedAt\": 1770938826245\n}\n\nArchive v0.5.0: 3 files, 2497 bytes\n\nFiles: scripts/bb.sh (3956b), SKILL.md (978b), _meta.json (129b)\n\nFile v0.5.0:SKILL.md\n\n---\nname: bullybuddy\ndescription: BullyBuddy - Control Claude Code sessions. Commands: status, list, spawn, send, output, kill, audit, transcript.\nmetadata: { \"openclaw\": { \"emoji\": \"🦞\", \"always\": true } }\n---\n\n# BullyBuddy\n\nControl BullyBuddy Claude Code session manager via `/bullybuddy` or `/skill bullybuddy`.\n\n## Usage\n\nRun the script with the subcommand:\n\n```bash\n{baseDir}/scripts/bb.sh <command> [args...]\n```\n\nEnvironment variables `BB_URL` and `BB_TOKEN` must be set.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `help` | Show help |\n| `status` | Server status |\n| `list` | List sessions |\n| `spawn [cwd] [task]` | Create session |\n| `send <id> <text>` | Send input |\n| `output <id>` | Show output |\n| `kill <id>` | Kill session |\n| `audit [n]` | Audit log |\n| `transcript <id>` | Transcript |\n\n## Examples\n\n```\n/bullybuddy status\n/bullybuddy list\n/bullybuddy spawn ~/project \"Fix bug\"\n/bullybuddy send abc123 yes\n/bullybuddy kill abc123\n```\n\nFile v0.5.0:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.5.0\",\n  \"publishedAt\": 1770937828983\n}\n\nArchive v0.4.1: 3 files, 2497 bytes\n\nFiles: scripts/bb.sh (3956b), SKILL.md (978b), _meta.json (129b)\n\nFile v0.4.1:SKILL.md\n\n---\nname: bullybuddy\ndescription: BullyBuddy - Control Claude Code sessions. Commands: status, list, spawn, send, output, kill, audit, transcript.\nmetadata: { \"openclaw\": { \"emoji\": \"🦞\", \"always\": true } }\n---\n\n# BullyBuddy\n\nControl BullyBuddy Claude Code session manager via `/bullybuddy` or `/skill bullybuddy`.\n\n## Usage\n\nRun the script with the subcommand:\n\n```bash\n{baseDir}/scripts/bb.sh <command> [args...]\n```\n\nEnvironment variables `BB_URL` and `BB_TOKEN` must be set.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `help` | Show help |\n| `status` | Server status |\n| `list` | List sessions |\n| `spawn [cwd] [task]` | Create session |\n| `send <id> <text>` | Send input |\n| `output <id>` | Show output |\n| `kill <id>` | Kill session |\n| `audit [n]` | Audit log |\n| `transcript <id>` | Transcript |\n\n## Examples\n\n```\n/bullybuddy status\n/bullybuddy list\n/bullybuddy spawn ~/project \"Fix bug\"\n/bullybuddy send abc123 yes\n/bullybuddy kill abc123\n```\n\nFile v0.4.1:_meta.json\n\n{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.4.1\",\n  \"publishedAt\": 1770936905312\n}","readmeExcerpt":"Skill: Bullybuddy Owner: chenkuansun Summary: BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input, kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.... Tags: latest:0.7.1 Version history: v0.7.1 | 2026-02-18T15:22:21.579Z | user - Version bump to 0.7.1 with no code or documentation changes. - No file modifications detected; contents remain the same as the previou","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"npm install -g openclaw-bullybuddy"},{"language":"bash","snippet":"bullybuddy server"},{"language":"text","snippet":"/bullybuddy status          - Server status & session summary\n/bullybuddy list            - List all sessions\n/bullybuddy spawn [cwd] [task] [group] - Create new session\n/bullybuddy send <id> <text> - Send input to session\n/bullybuddy output <id> [lines] - Show session output/transcript\n/bullybuddy kill <id>       - Terminate session\n/bullybuddy url             - Show dashboard URL (local + tunnel)\n/bullybuddy audit [limit]   - View audit log\n/bullybuddy transcript <id> [limit] - View conversation transcript\n/bullybuddy help            - Show help"},{"language":"json","snippet":"{\n  \"name\": \"worker-1\",\n  \"group\": \"myproject\",\n  \"cwd\": \"/path/to/repo\",\n  \"task\": \"Implement feature X\",\n  \"args\": [\"--verbose\"],\n  \"cols\": 120,\n  \"rows\": 40,\n  \"skipPermissions\": false\n}"},{"language":"bash","snippet":"bullybuddy server --tunnel"},{"language":"bash","snippet":"bullybuddy server                          # Start server\nbullybuddy server --tunnel                 # Start with Cloudflare tunnel\nbullybuddy url                             # Show dashboard URL (local + tunnel)\nbullybuddy spawn --name worker --group proj  # Spawn session\nbullybuddy list --json                     # List sessions\nbullybuddy send <id> \"Fix the bug\"         # Send input\nbullybuddy attach <id>                     # Interactive terminal\nbullybuddy kill <id>                       # Kill session\nbullybuddy groups                          # List groups\nbullybuddy open                            # Open dashboard"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: bullybuddy\ndescription: >\n  BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input,\n  kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.\n  Reads auth token from ~/.bullybuddy/connection.json automatically.\nuser-invocable: true\ncommand-dispatch: tool\ncommand-tool: exec\ncommand-arg-mode: raw\nmetadata:\n  openclaw:\n    emoji: \"🦞\"\n    homepage: \"https://github.com/ChenKuanSun/openclaw-bullybuddy\"\n    requires:\n      bins:\n        - bullybuddy\n        - jq\n        - curl\n      config:\n        - \"~/.bullybuddy/connection.json\"\n    install:\n      - id: node\n        kind: node\n        package: openclaw-bullybuddy\n        bins:\n          - bullybuddy\n---\n\n# BullyBuddy\n\nSpawns and manages multiple Claude Code CLI sessions. Dual backend: **tmux** (default, sessions survive server restart) or **node-pty** (fallback). REST API, WebSocket streaming, web dashboard.\n\n## Setup\n\n1. Install the package globally:\n\n```bash\nnpm install -g openclaw-bullybuddy\n```\n\n2. Start the server:\n\n```bash\nbullybuddy server\n```\n\nConnection info is auto-saved to `~/.bullybuddy/connection.json` on startup. The `/bullybuddy` command reads it automatically — no env vars needed.\n\nFor remote access, start with `bullybuddy server --tunnel`. The tunnel URL is available via `/bullybuddy url`.\n\n## /bullybuddy Slash Command\n\n```\n/bullybuddy status          - Server status & session summary\n/bullybuddy list            - List all sessions\n/bullybuddy spawn [cwd] [task] [group] - Create new session\n/bullybuddy send <id> <text> - Send input to session\n/bullybuddy output <id> [lines] - Show session output/transcript\n/bullybuddy kill <id>       - Terminate session\n/bullybuddy url             - Show dashboard URL (local + tunnel)\n/bullybuddy audit [limit]   - View audit log\n/bullybuddy transcript <id> [limit] - View conversation transcript\n/bullybuddy help            - Show help\n```\n\n## Security Notice\n\n- The auth token grants **full control over all spawned Claude Code sessions**, including sending arbitrary input. Treat it as a secret.\n- The `/bullybuddy url` command outputs the dashboard URL with the token embedded. Do not share or log this URL publicly.\n- When using `--tunnel`, the dashboard and API are exposed to the internet via a Cloudflare temporary URL. Anyone with the token can access all sessions remotely.\n- Spawned sessions run Claude Code with your local permissions. If `--dangerously-skip-permissions` is enabled, Claude can execute any command without confirmation.\n\n## Authentication\n\nA random token is generated on each server start and saved to `~/.bullybuddy/connection.json` (mode 0600). CLI and `/bullybuddy` auto-discover it. For the dashboard, the token is included in the URL printed on startup. The connection file is deleted on graceful shutdown.\n\n## API Overview\n\nAll endpoints require the token via `Authorization: Bearer <token>` header or `?token=` query parameter. All responses follow `{ ok: boolean, data?: T, error?:"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn75ec9pkqc5v7t1bhbwxdmtv580jqjh\",\n  \"slug\": \"bullybuddy\",\n  \"version\": \"0.7.1\",\n  \"publishedAt\": 1771428141579\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input, kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.... Skill: Bullybuddy Owner: chenkuansun Summary: BullyBuddy — Claude Code session manager CLI wrapper. Spawn, list, send input, kill, and monitor multiple Claude Code sessions via /bullybuddy slash command.... Tags: latest:0.7.1 Version history: v0.7.1 | 2026-02-18T15:22:21.579Z | user - Version bump to 0.7.1 with no code or documentation changes. - No file modifications detected; contents remain the same as the previou","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":839,"uniquenessScore":56,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T08:30:19.691Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T08:30:19.691Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T10:43:33.128Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}