* docs: add ACP thread-bound agents plan doc * docs: expand ACP implementation specification * feat(acp): route ACP sessions through core dispatch and lifecycle cleanup * feat(acp): add /acp commands and Discord spawn gate * ACP: add acpx runtime plugin backend * fix(subagents): defer transient lifecycle errors before announce * Agents: harden ACP sessions_spawn and tighten spawn guidance * Agents: require explicit ACP target for runtime spawns * docs: expand ACP control-plane implementation plan * ACP: harden metadata seeding and spawn guidance * ACP: centralize runtime control-plane manager and fail-closed dispatch * ACP: harden runtime manager and unify spawn helpers * Commands: route ACP sessions through ACP runtime in agent command * ACP: require persisted metadata for runtime spawns * Sessions: preserve ACP metadata when updating entries * Plugins: harden ACP backend registry across loaders * ACPX: make availability probe compatible with adapters * E2E: add manual Discord ACP plain-language smoke script * ACPX: preserve streamed spacing across Discord delivery * Docs: add ACP Discord streaming strategy * ACP: harden Discord stream buffering for thread replies * ACP: reuse shared block reply pipeline for projector * ACP: unify streaming config and adopt coalesceIdleMs * Docs: add temporary ACP production hardening plan * Docs: trim temporary ACP hardening plan goals * Docs: gate ACP thread controls by backend capabilities * ACP: add capability-gated runtime controls and /acp operator commands * Docs: remove temporary ACP hardening plan * ACP: fix spawn target validation and close cache cleanup * ACP: harden runtime dispatch and recovery paths * ACP: split ACP command/runtime internals and centralize policy * ACP: harden runtime lifecycle, validation, and observability * ACP: surface runtime and backend session IDs in thread bindings * docs: add temp plan for binding-service migration * ACP: migrate thread binding flows to SessionBindingService * ACP: address review feedback and preserve prompt wording * ACPX plugin: pin runtime dependency and prefer bundled CLI * Discord: complete binding-service migration cleanup and restore ACP plan * Docs: add standalone ACP agents guide * ACP: route harness intents to thread-bound ACP sessions * ACP: fix spawn thread routing and queue-owner stall * ACP: harden startup reconciliation and command bypass handling * ACP: fix dispatch bypass type narrowing * ACP: align runtime metadata to agentSessionId * ACP: normalize session identifier handling and labels * ACP: mark thread banner session ids provisional until first reply * ACP: stabilize session identity mapping and startup reconciliation * ACP: add resolved session-id notices and cwd in thread intros * Discord: prefix thread meta notices consistently * Discord: unify ACP/thread meta notices with gear prefix * Discord: split thread persona naming from meta formatting * Extensions: bump acpx plugin dependency to 0.1.9 * Agents: gate ACP prompt guidance behind acp.enabled * Docs: remove temp experiment plan docs * Docs: scope streaming plan to holy grail refactor * Docs: refactor ACP agents guide for human-first flow * Docs/Skill: add ACP feature-flag guidance and direct acpx telephone-game flow * Docs/Skill: add OpenCode and Pi to ACP harness lists * Docs/Skill: align ACP harness list with current acpx registry * Dev/Test: move ACP plain-language smoke script and mark as keep * Docs/Skill: reorder ACP harness lists with Pi first * ACP: split control-plane manager into core/types/utils modules * Docs: refresh ACP thread-bound agents plan * ACP: extract dispatch lane and split manager domains * ACP: centralize binding context and remove reverse deps * Infra: unify system message formatting * ACP: centralize error boundaries and session id rendering * ACP: enforce init concurrency cap and strict meta clear * Tests: fix ACP dispatch binding mock typing * Tests: fix Discord thread-binding mock drift and ACP request id * ACP: gate slash bypass and persist cleared overrides * ACPX: await pre-abort cancel before runTurn return * Extension: pin acpx runtime dependency to 0.1.11 * Docs: add pinned acpx install strategy for ACP extension * Extensions/acpx: enforce strict local pinned startup * Extensions/acpx: tighten acp-router install guidance * ACPX: retry runtime test temp-dir cleanup * Extensions/acpx: require proactive ACPX repair for thread spawns * Extensions/acpx: require restart offer after acpx reinstall * extensions/acpx: remove workspace protocol devDependency * extensions/acpx: bump pinned acpx to 0.1.13 * extensions/acpx: sync lockfile after dependency bump * ACPX: make runtime spawn Windows-safe * fix: align doctor-config-flow repair tests with default-account migration (#23580) (thanks @osolmaz)
285 lines
10 KiB
Markdown
285 lines
10 KiB
Markdown
---
|
|
name: coding-agent
|
|
description: 'Delegate coding tasks to Codex, Claude Code, or Pi agents via background process. Use when: (1) building/creating new features or apps, (2) reviewing PRs (spawn in temp dir), (3) refactoring large codebases, (4) iterative coding that needs file exploration. NOT for: simple one-liner fixes (just edit), reading code (use read tool), thread-bound ACP harness requests in chat (for example spawn/run Codex or Claude Code in a Discord thread; use sessions_spawn with runtime:"acp"), or any work in ~/clawd workspace (never spawn agents here). Requires a bash tool that supports pty:true.'
|
|
metadata:
|
|
{
|
|
"openclaw": { "emoji": "🧩", "requires": { "anyBins": ["claude", "codex", "opencode", "pi"] } },
|
|
}
|
|
---
|
|
|
|
# Coding Agent (bash-first)
|
|
|
|
Use **bash** (with optional background mode) for all coding agent work. Simple and effective.
|
|
|
|
## ⚠️ PTY Mode Required!
|
|
|
|
Coding agents (Codex, Claude Code, Pi) are **interactive terminal applications** that need a pseudo-terminal (PTY) to work correctly. Without PTY, you'll get broken output, missing colors, or the agent may hang.
|
|
|
|
**Always use `pty:true`** when running coding agents:
|
|
|
|
```bash
|
|
# ✅ Correct - with PTY
|
|
bash pty:true command:"codex exec 'Your prompt'"
|
|
|
|
# ❌ Wrong - no PTY, agent may break
|
|
bash command:"codex exec 'Your prompt'"
|
|
```
|
|
|
|
### Bash Tool Parameters
|
|
|
|
| Parameter | Type | Description |
|
|
| ------------ | ------- | --------------------------------------------------------------------------- |
|
|
| `command` | string | The shell command to run |
|
|
| `pty` | boolean | **Use for coding agents!** Allocates a pseudo-terminal for interactive CLIs |
|
|
| `workdir` | string | Working directory (agent sees only this folder's context) |
|
|
| `background` | boolean | Run in background, returns sessionId for monitoring |
|
|
| `timeout` | number | Timeout in seconds (kills process on expiry) |
|
|
| `elevated` | boolean | Run on host instead of sandbox (if allowed) |
|
|
|
|
### Process Tool Actions (for background sessions)
|
|
|
|
| Action | Description |
|
|
| ----------- | ---------------------------------------------------- |
|
|
| `list` | List all running/recent sessions |
|
|
| `poll` | Check if session is still running |
|
|
| `log` | Get session output (with optional offset/limit) |
|
|
| `write` | Send raw data to stdin |
|
|
| `submit` | Send data + newline (like typing and pressing Enter) |
|
|
| `send-keys` | Send key tokens or hex bytes |
|
|
| `paste` | Paste text (with optional bracketed mode) |
|
|
| `kill` | Terminate the session |
|
|
|
|
---
|
|
|
|
## Quick Start: One-Shot Tasks
|
|
|
|
For quick prompts/chats, create a temp git repo and run:
|
|
|
|
```bash
|
|
# Quick chat (Codex needs a git repo!)
|
|
SCRATCH=$(mktemp -d) && cd $SCRATCH && git init && codex exec "Your prompt here"
|
|
|
|
# Or in a real project - with PTY!
|
|
bash pty:true workdir:~/Projects/myproject command:"codex exec 'Add error handling to the API calls'"
|
|
```
|
|
|
|
**Why git init?** Codex refuses to run outside a trusted git directory. Creating a temp repo solves this for scratch work.
|
|
|
|
---
|
|
|
|
## The Pattern: workdir + background + pty
|
|
|
|
For longer tasks, use background mode with PTY:
|
|
|
|
```bash
|
|
# Start agent in target directory (with PTY!)
|
|
bash pty:true workdir:~/project background:true command:"codex exec --full-auto 'Build a snake game'"
|
|
# Returns sessionId for tracking
|
|
|
|
# Monitor progress
|
|
process action:log sessionId:XXX
|
|
|
|
# Check if done
|
|
process action:poll sessionId:XXX
|
|
|
|
# Send input (if agent asks a question)
|
|
process action:write sessionId:XXX data:"y"
|
|
|
|
# Submit with Enter (like typing "yes" and pressing Enter)
|
|
process action:submit sessionId:XXX data:"yes"
|
|
|
|
# Kill if needed
|
|
process action:kill sessionId:XXX
|
|
```
|
|
|
|
**Why workdir matters:** Agent wakes up in a focused directory, doesn't wander off reading unrelated files (like your soul.md 😅).
|
|
|
|
---
|
|
|
|
## Codex CLI
|
|
|
|
**Model:** `gpt-5.2-codex` is the default (set in ~/.codex/config.toml)
|
|
|
|
### Flags
|
|
|
|
| Flag | Effect |
|
|
| --------------- | -------------------------------------------------- |
|
|
| `exec "prompt"` | One-shot execution, exits when done |
|
|
| `--full-auto` | Sandboxed but auto-approves in workspace |
|
|
| `--yolo` | NO sandbox, NO approvals (fastest, most dangerous) |
|
|
|
|
### Building/Creating
|
|
|
|
```bash
|
|
# Quick one-shot (auto-approves) - remember PTY!
|
|
bash pty:true workdir:~/project command:"codex exec --full-auto 'Build a dark mode toggle'"
|
|
|
|
# Background for longer work
|
|
bash pty:true workdir:~/project background:true command:"codex --yolo 'Refactor the auth module'"
|
|
```
|
|
|
|
### Reviewing PRs
|
|
|
|
**⚠️ CRITICAL: Never review PRs in OpenClaw's own project folder!**
|
|
Clone to temp folder or use git worktree.
|
|
|
|
```bash
|
|
# Clone to temp for safe review
|
|
REVIEW_DIR=$(mktemp -d)
|
|
git clone https://github.com/user/repo.git $REVIEW_DIR
|
|
cd $REVIEW_DIR && gh pr checkout 130
|
|
bash pty:true workdir:$REVIEW_DIR command:"codex review --base origin/main"
|
|
# Clean up after: trash $REVIEW_DIR
|
|
|
|
# Or use git worktree (keeps main intact)
|
|
git worktree add /tmp/pr-130-review pr-130-branch
|
|
bash pty:true workdir:/tmp/pr-130-review command:"codex review --base main"
|
|
```
|
|
|
|
### Batch PR Reviews (parallel army!)
|
|
|
|
```bash
|
|
# Fetch all PR refs first
|
|
git fetch origin '+refs/pull/*/head:refs/remotes/origin/pr/*'
|
|
|
|
# Deploy the army - one Codex per PR (all with PTY!)
|
|
bash pty:true workdir:~/project background:true command:"codex exec 'Review PR #86. git diff origin/main...origin/pr/86'"
|
|
bash pty:true workdir:~/project background:true command:"codex exec 'Review PR #87. git diff origin/main...origin/pr/87'"
|
|
|
|
# Monitor all
|
|
process action:list
|
|
|
|
# Post results to GitHub
|
|
gh pr comment <PR#> --body "<review content>"
|
|
```
|
|
|
|
---
|
|
|
|
## Claude Code
|
|
|
|
```bash
|
|
# With PTY for proper terminal output
|
|
bash pty:true workdir:~/project command:"claude 'Your task'"
|
|
|
|
# Background
|
|
bash pty:true workdir:~/project background:true command:"claude 'Your task'"
|
|
```
|
|
|
|
---
|
|
|
|
## OpenCode
|
|
|
|
```bash
|
|
bash pty:true workdir:~/project command:"opencode run 'Your task'"
|
|
```
|
|
|
|
---
|
|
|
|
## Pi Coding Agent
|
|
|
|
```bash
|
|
# Install: npm install -g @mariozechner/pi-coding-agent
|
|
bash pty:true workdir:~/project command:"pi 'Your task'"
|
|
|
|
# Non-interactive mode (PTY still recommended)
|
|
bash pty:true command:"pi -p 'Summarize src/'"
|
|
|
|
# Different provider/model
|
|
bash pty:true command:"pi --provider openai --model gpt-4o-mini -p 'Your task'"
|
|
```
|
|
|
|
**Note:** Pi now has Anthropic prompt caching enabled (PR #584, merged Jan 2026)!
|
|
|
|
---
|
|
|
|
## Parallel Issue Fixing with git worktrees
|
|
|
|
For fixing multiple issues in parallel, use git worktrees:
|
|
|
|
```bash
|
|
# 1. Create worktrees for each issue
|
|
git worktree add -b fix/issue-78 /tmp/issue-78 main
|
|
git worktree add -b fix/issue-99 /tmp/issue-99 main
|
|
|
|
# 2. Launch Codex in each (background + PTY!)
|
|
bash pty:true workdir:/tmp/issue-78 background:true command:"pnpm install && codex --yolo 'Fix issue #78: <description>. Commit and push.'"
|
|
bash pty:true workdir:/tmp/issue-99 background:true command:"pnpm install && codex --yolo 'Fix issue #99 from the approved ticket summary. Implement only the in-scope edits and commit after review.'"
|
|
|
|
# 3. Monitor progress
|
|
process action:list
|
|
process action:log sessionId:XXX
|
|
|
|
# 4. Create PRs after fixes
|
|
cd /tmp/issue-78 && git push -u origin fix/issue-78
|
|
gh pr create --repo user/repo --head fix/issue-78 --title "fix: ..." --body "..."
|
|
|
|
# 5. Cleanup
|
|
git worktree remove /tmp/issue-78
|
|
git worktree remove /tmp/issue-99
|
|
```
|
|
|
|
---
|
|
|
|
## ⚠️ Rules
|
|
|
|
1. **Always use pty:true** - coding agents need a terminal!
|
|
2. **Respect tool choice** - if user asks for Codex, use Codex.
|
|
- Orchestrator mode: do NOT hand-code patches yourself.
|
|
- If an agent fails/hangs, respawn it or ask the user for direction, but don't silently take over.
|
|
3. **Be patient** - don't kill sessions because they're "slow"
|
|
4. **Monitor with process:log** - check progress without interfering
|
|
5. **--full-auto for building** - auto-approves changes
|
|
6. **vanilla for reviewing** - no special flags needed
|
|
7. **Parallel is OK** - run many Codex processes at once for batch work
|
|
8. **NEVER start Codex in ~/.openclaw/** - it'll read your soul docs and get weird ideas about the org chart!
|
|
9. **NEVER checkout branches in ~/Projects/openclaw/** - that's the LIVE OpenClaw instance!
|
|
|
|
---
|
|
|
|
## Progress Updates (Critical)
|
|
|
|
When you spawn coding agents in the background, keep the user in the loop.
|
|
|
|
- Send 1 short message when you start (what's running + where).
|
|
- Then only update again when something changes:
|
|
- a milestone completes (build finished, tests passed)
|
|
- the agent asks a question / needs input
|
|
- you hit an error or need user action
|
|
- the agent finishes (include what changed + where)
|
|
- If you kill a session, immediately say you killed it and why.
|
|
|
|
This prevents the user from seeing only "Agent failed before reply" and having no idea what happened.
|
|
|
|
---
|
|
|
|
## Auto-Notify on Completion
|
|
|
|
For long-running background tasks, append a wake trigger to your prompt so OpenClaw gets notified immediately when the agent finishes (instead of waiting for the next heartbeat):
|
|
|
|
```
|
|
... your task here.
|
|
|
|
When completely finished, run this command to notify me:
|
|
openclaw system event --text "Done: [brief summary of what was built]" --mode now
|
|
```
|
|
|
|
**Example:**
|
|
|
|
```bash
|
|
bash pty:true workdir:~/project background:true command:"codex --yolo exec 'Build a REST API for todos.
|
|
|
|
When completely finished, run: openclaw system event --text \"Done: Built todos REST API with CRUD endpoints\" --mode now'"
|
|
```
|
|
|
|
This triggers an immediate wake event — Skippy gets pinged in seconds, not 10 minutes.
|
|
|
|
---
|
|
|
|
## Learnings (Jan 2026)
|
|
|
|
- **PTY is essential:** Coding agents are interactive terminal apps. Without `pty:true`, output breaks or agent hangs.
|
|
- **Git repo required:** Codex won't run outside a git directory. Use `mktemp -d && git init` for scratch work.
|
|
- **exec is your friend:** `codex exec "prompt"` runs and exits cleanly - perfect for one-shots.
|
|
- **submit vs write:** Use `submit` to send input + Enter, `write` for raw data without newline.
|
|
- **Sass works:** Codex responds well to playful prompts. Asked it to write a haiku about being second fiddle to a space lobster, got: _"Second chair, I code / Space lobster sets the tempo / Keys glow, I follow"_ 🦞
|