1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# claude-wrapper project config for roba (https://crates.io/crates/roba).
#
# The top level stays safe-by-default: no full_auto, no worktree. Those are
# task-scoped, so they live in the named `worker` profile and only fire when
# you opt in with `--profile worker` (or the `fix` verb). See `roba config
# lint`. Run `roba config explain` to see what is active.
= "opus"
= true
= true
# ---------------------------------------------------------------------------
# Single-issue lifecycle as one profile per phase -- one posture per phase,
# each a distinct roba run. plan and review are read-only; implement (worker)
# is the only one that mutates. The sequencing (plan -> implement -> review ->
# the human merges) is composition you drive, not a chain baked into config.
#
# claude-wrapper's own rule (AGENTS.md): "Do not merge PRs -- the human will
# do it." So these verbs stop at a ready draft PR; the merge is always manual.
# ---------------------------------------------------------------------------
# PLAN -- read-only orientation against recent history. Produce an approach,
# touch nothing. -> roba --profile plan "how should I approach X?"
[]
= true
= 10
# IMPLEMENT -- the task-scoped dispatch posture: bypass tool checks, capped so
# an unattended run self-arrests (the cascade-needs-runway lesson). worktree
# is OFF: claude-wrapper is a Rust crate with a heavy dep tree, so a fresh
# worktree would cold-rebuild `target/` every run; branch in place (or have an
# orchestrator `git worktree add` + `-C` for real parallel isolation).
# roba --profile worker -f task.md
[]
= true
= false
= 80
= 10.0
# REVIEW -- read-only against the working-tree diff.
# roba --profile review "is this safe to merge?"
[]
= true
= true
# ---------------------------------------------------------------------------
# Lifecycle verbs. Each is ONE rich roba run (width), never a multi-step chain
# (depth). issue and review are read-only and bring their own gh context, so
# they take the bare `--readonly` posture; fix is the full_auto implement shot
# and inherits the worker caps. The watch/merge tail stays in gh and is
# MANUAL per AGENTS.md:
# roba fix 664 && gh pr checks <pr> --watch # then the human merges
# ---------------------------------------------------------------------------
# PLAN by issue number: summarize + propose an approach, write no code.
# roba issue 664
[]
= "Summarize a claude-wrapper issue and propose an approach (read-only)"
= ["n"]
= ["--readonly"]
= """
Summarize claude-wrapper issue #${n} and propose an implementation approach.
Cite the files involved (this is a single-crate library; most error/result
work lives in src/error.rs and src/types.rs). Do not write code.
$(gh issue view ${n})
"""
# IMPLEMENT an issue end-to-end, then open a DRAFT PR. full_auto via the
# worker profile -- an explicit, named opt-in.
# roba fix 664
[]
= "Implement a claude-wrapper issue, open a draft PR (full_auto, no merge)"
= ["n"]
= ["--profile", "worker"]
= """
Implement claude-wrapper issue #${n}. Follow AGENTS.md exactly.
- Branch off main (feat/ or fix/ naming); never commit to main.
- thiserror for library errors; the Error enum is #[non_exhaustive], so a new
variant is non-breaking. No em dashes (use --). No emojis.
- Run the FULL gate before pushing: cargo fmt --all -- --check; cargo clippy
--all-targets --all-features -- -D warnings; cargo test --lib --all-features;
cargo test --doc --all-features; cargo test --test fake_claude --all-features.
If the change touches feature-gated code, also verify the feature-combo
builds in AGENTS.md (default / --all-features / --no-default-features
--features "json,sync").
- Commit with a conventional-commit subject. Open a DRAFT PR with the plan as
the body and `Closes #${n}`. Do NOT merge -- the human merges.
- Surface anything that does not fit rather than forcing it.
$(gh issue view ${n})
"""
# REVIEW a PR by number against its own diff (read-only).
# roba review 665
[]
= "Review a claude-wrapper PR by number (read-only)"
= ["pr"]
= ["--readonly"]
= """
Review PR #${pr} in claude-wrapper for correctness and regressions. Cite
file:line. Check it against AGENTS.md conventions (thiserror, no em dashes,
builder-returns-Self, feature-gate hygiene). No style nits.
Title: $(gh pr view ${pr} --json title -q '.title')
$(gh pr diff ${pr})
"""