joelclaw
npx skills add https://github.com/joelhooks/joelclaw --skill joelclaw
Agent 安装分布
Skill 文档
joelclaw â CLI & Event Bus
The joelclaw CLI is the primary operator interface to the entire joelclaw system: event bus (Inngest), gateway, observability (OTEL), agent loops, subscriptions, and more. Built with @effect/cli, returns HATEOAS JSON envelopes.
If the CLI crashes, that’s the highest priority fix.
Binary: ~/.bun/bin/joelclaw
Source: ~/Code/joelhooks/joelclaw/packages/cli/
Build: bun build packages/cli/src/cli.ts --compile --outfile ~/.bun/bin/joelclaw
Architecture
ââ Colima VM (VZ framework, aarch64) âââââââââââââââââââââââââââââââââ
â Talos v1.12.4 â k8s v1.35.0 (single node, namespace: joelclaw) â
â â
â inngest-0 StatefulSet ports 8288 (API), 8289 (dash) â
â redis-0 StatefulSet port 6379 â
â typesense-0 StatefulSet port 8108 â
â system-bus-worker Deployment port 3111 (110+ functions) â
â docs-api Deployment port 3838 â
â livekit-server Deployment ports 7880, 7881 â
â bluesky-pds Deployment port 3000 â
â â
â â ï¸ Inngest service named inngest-svc (not inngest) â
â k8s auto-injects INNGEST_PORT env collision otherwise â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â NodePort on localhost
Gateway daemon (always-on pi session, Redis event bridge)
NAS "three-body" (ASUSTOR, 10GbE NFS, 64TB RAID5 + NVMe cache)
Vault ~/Vault (Obsidian, PARA method â ADRs, system log, contacts)
Inngest event key: 37aa349b89692d657d276a40e0e47a15
k8s manifests: ~/Code/joelhooks/joelclaw/k8s/
CLI Command Reference
Health & Status
joelclaw status # Health: server + worker + k8s pods
joelclaw inngest status # Inngest server details
joelclaw functions # List all 110+ registered functions
joelclaw refresh # Force re-register with Inngest server
Send Events
joelclaw send "event/name" --data '{"key":"value"}'
joelclaw send "pipeline/video.download" --data '{"url":"https://youtube.com/watch?v=XXX"}'
joelclaw send "agent/story.start" --data '{"prdPath":"/abs/path/prd.json","storyId":"S-1"}'
View Runs
joelclaw runs # Recent 10
joelclaw runs --count 20 --hours 24 # More runs, wider window
joelclaw runs --status FAILED # Just failures
joelclaw run <RUN_ID> # Step trace + errors for one run
View Events
joelclaw events # Last 4 hours
joelclaw events --prefix memory/ --hours 24
joelclaw events --prefix agent/ --hours 24
joelclaw events --count 50 --hours 48
Logs
joelclaw logs # Worker stdout (default 30 lines)
joelclaw logs errors # Worker stderr (stack traces)
joelclaw logs server # Inngest k8s pod logs
joelclaw logs server -n 50 --grep error # Filtered server errors
joelclaw logs worker --grep "observe" # Grep worker logs
Gateway
joelclaw gateway status # Gateway health + session info
joelclaw gateway events # Recent gateway events
joelclaw gateway test # Send test message through gateway
joelclaw gateway restart # Restart gateway daemon
joelclaw gateway stream # Live stream gateway events
Observability (OTEL)
joelclaw otel list --hours 1 # Recent telemetry events
joelclaw otel search "error" --hours 24 # Search OTEL events
joelclaw otel stats --hours 24 # Aggregate stats
Subscriptions (ADR-0127)
joelclaw subscribe list # All feed subscriptions
joelclaw subscribe add <url> [--name N] # Add a feed
joelclaw subscribe remove <url> # Remove a feed
joelclaw subscribe check [--url URL] # Check feeds for new items
joelclaw subscribe summary # Summary of recent items
Semantic Recall
joelclaw recall "query about past context" # Search semantic memory
Discovery
joelclaw discover "https://example.com" --context "why this is interesting"
Agent Loops
# Start a loop
joelclaw loop start --project ~/Code/joelhooks/joelclaw \
--goal "Implement feature X" \
--context ~/Vault/docs/decisions/0XXX.md \
--max-retries 2
# Start with existing PRD
joelclaw loop start --project PATH --prd prd.json --max-retries 2
# Monitor
joelclaw loop status <LOOP_ID>
joelclaw loop status <LOOP_ID> -c # Compact: one line per story
joelclaw loop status <LOOP_ID> -v # Verbose: criteria, output paths
joelclaw watch <LOOP_ID> # Live: polls 15s, exits on completion
joelclaw watch # Auto-detects active loop
# Management
joelclaw loop list # All loops in Redis
joelclaw loop cancel <LOOP_ID> # Stop + cleanup
joelclaw loop nuke dead # Remove completed loops from Redis
Other Commands
joelclaw sleep [on|off|status] # Sleep mode for gateway
joelclaw note <text> # Quick note to Vault
joelclaw vault <query> # Search Vault
joelclaw search <query> # Full-text search
joelclaw email [scan|triage] # Email operations
joelclaw x [post|mentions] # X/Twitter operations
joelclaw nas [status|health] # NAS operations
joelclaw diagnose <topic> # System diagnosis
joelclaw langfuse [traces|costs] # Langfuse analytics
joelclaw inngest sync-worker [--restart] # Worker lifecycle
Output Modes
Most commands support --compact/-c for plain text. Use compact for monitoring.
JSON (default) returns HATEOAS envelopes with next_actions.
Story Pipeline (ADR-0155)
3-stage pipeline: implement â prove â judge. Each story runs through the stages with Inngest durability.
# Fire a single story
joelclaw send agent/story.start -d '{
"prdPath": "/Users/joel/Code/joelhooks/joelclaw/prd.json",
"storyId": "CFP-2"
}'
# â ï¸ ALWAYS use absolute path for prdPath â worker CWD is packages/system-bus/
PRD format (Zod-validated):
{
"name": "Project Name",
"context": {},
"stories": [
{
"id": "STORY-1",
"title": "What to build",
"description": "Details",
"priority": 1,
"acceptance": ["criterion 1", "criterion 2"],
"files": ["path/to/relevant/file.ts"]
}
]
}
Critical:
contextmust be{}or object â NEVER null or string- Every story needs
priority(number) - NEVER set
retries: 0on Inngest functions â breaks restart safety (ADR-0156)
Event Types
Pipelines
| Event | Chain |
|---|---|
pipeline/video.download |
â video-download â transcript-process â content-summarize |
pipeline/transcript.process |
â transcript-process â content-summarize |
content/summarize |
â content-summarize |
content/updated |
â content-sync (git commit vault changes) |
docs/ingest |
â docs-ingest (PDF/markdown â vector store) |
Memory
| Event | Chain |
|---|---|
memory/session.compaction.pending |
â observe-session |
memory/session.ended |
â observe-session |
memory/observations.accumulated |
â reflect |
memory/observations.reflected |
â promote (if proposals pending) |
Agent Loops
| Event | Flow |
|---|---|
agent/story.start |
â story-pipeline (implement â prove â judge) |
agent/loop.started |
â plan â story pipeline â complete |
agent/loop.story.passed |
â plan (next story) |
agent/loop.story.failed |
â plan (retry or next) |
agent/loop.completed |
â complete (merge-back + cleanup) |
Gateway & Channels
| Event | Purpose |
|---|---|
gateway/message.received |
Incoming message from any channel |
gateway/heartbeat |
Gateway health ping |
channel/telegram.callback |
Telegram callback queries |
Subscriptions & Discovery
| Event | Purpose |
|---|---|
discovery/noted |
URL/idea captured â enrichment pipeline |
subscriptions/check |
Poll feeds for new items |
System & Scheduled
| Event | Purpose |
|---|---|
system/log |
System log entry |
system/health.check |
Scheduled health monitoring |
cron/daily-digest |
Morning digest generation |
cron/check-email |
Periodic email scan |
cron/check-calendar |
Calendar check |
cron/nightly-maintenance |
Typesense + system maintenance |
Notifications
| Event | Source |
|---|---|
webhook/github |
GitHub webhook events |
webhook/vercel |
Vercel deploy events |
webhook/todoist |
Todoist webhook events |
webhook/front |
Front webhook events |
Debugging Failed Runs
joelclaw runs --status FAILED # 1. Find the failure
joelclaw run <RUN_ID> # 2. Step trace + inline errors
joelclaw logs errors # 3. Worker stderr
joelclaw logs server --grep error # 4. Inngest server errors
joelclaw otel search "error" --hours 1 # 5. OTEL telemetry
Common Failure Patterns
| Symptom | Cause | Fix |
|---|---|---|
| Events accepted but functions never run | Inngest can’t reach worker | joelclaw refresh, check worker pod |
| “Unable to reach SDK URL” | Worker unreachable from cluster | Restart worker, joelclaw refresh |
| Loop story SKIPPED | Tests/typecheck failed in worktree | Check attempt output |
| Run stuck in RUNNING | Worker crashed mid-step | joelclaw logs errors, restart worker |
INNGEST_PORT env collision |
k8s service named inngest |
Service is inngest-svc â keep this |
| Implement step killed on deploy | Worker restart killed in-flight step | ADR-0156: retries: 2 survives this |
Deploying Worker Changes
Use the publish script â it handles build, push, k8s apply, and rollout:
~/Code/joelhooks/joelclaw/k8s/publish-system-bus-worker.sh
See the sync-system-bus skill for the full deploy workflow.
Key Paths
| What | Path |
|---|---|
| CLI source | packages/cli/src/ |
| CLI commands | packages/cli/src/commands/ |
| CLI binary | ~/.bun/bin/joelclaw |
| Worker source | packages/system-bus/ |
| Inngest functions | packages/system-bus/src/inngest/functions/ |
| Function index (host) | packages/system-bus/src/inngest/functions/index.host.ts |
| Function index (cluster) | packages/system-bus/src/inngest/functions/index.cluster.ts |
| Inference utility | packages/system-bus/src/lib/inference.ts |
| Gateway source | packages/gateway/ |
| k8s manifests | k8s/ |
| Deploy script | k8s/publish-system-bus-worker.sh |
| ADRs | ~/Vault/docs/decisions/ |
| System log | ~/Vault/system/system-log.jsonl |
| Loop attempt output | /tmp/agent-loop/{loopId}/{storyId}-{attempt}.out |
Building the CLI
cd ~/Code/joelhooks/joelclaw
bun build packages/cli/src/cli.ts --compile --outfile ~/.bun/bin/joelclaw
Test after every change:
joelclaw status
joelclaw send --help
joelclaw runs --count 1
CLI commands are in packages/cli/src/commands/, one file per command. Follow the cli-design skill. Heavy deps must be lazy-loaded â top-level import crashes are unacceptable.