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
# roba's own project config. The top level stays safe-by-default: no
# full_auto, no anonymous worktree. A top-level worktree auto-applies to
# every run and silently defeats `-c`/`--resume`, and a top-level
# full_auto bypasses every permission check; both are task-scoped knobs
# that belong in a named profile. See `roba config lint`.
= "opus"
= true
= true
# ---------------------------------------------------------------------------
# Single-issue lifecycle as one profile per phase. Each phase is a DISTINCT
# roba run with its own permission posture (plan and review are read-only;
# implement is the one that mutates). The sequencing -- plan, implement,
# review, then watch/merge -- is composition you drive, not a chain baked
# into config: roba is the per-phase worker, the orchestration lives a layer
# up (a script, a skill, or you at the prompt). The watch/merge tail spans
# turns (CI is wall-clock minutes), so it stays in `gh`, never an alias.
# ---------------------------------------------------------------------------
# PLAN -- read-only orientation against recent history. Produce an approach,
# touch nothing. -> roba --profile plan "how should I approach X?"
[]
= true
= 10
# IMPLEMENT -- task-scoped dispatch posture: bypass tool checks, run in a
# fresh git worktree, capped so an unattended run self-arrests (the
# cascade-needs-runway lesson). Opt in per run with `roba --profile worker`.
[]
= true
= true
= 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 rather than a
# context-embedding profile; `fix` is the full_auto implement shot and
# inherits the worker caps. Watch/merge stays in gh:
# roba fix 357 && gh pr checks <pr> --watch && gh pr merge <pr> --squash
# ---------------------------------------------------------------------------
# PLAN by issue number: summarize + propose an approach, write no code.
# roba issue 357
[]
= "Summarize a roba issue and propose an approach (read-only)"
= ["n"]
= ["--readonly"]
= """
Summarize roba issue #${n} and propose an implementation approach.
Cite the files involved. Do not write code.
$(gh issue view ${n})
"""
# IMPLEMENT an issue end-to-end in a worktree, then open a draft PR.
# full_auto via the worker profile -- an explicit, named unsafe setting.
# roba fix 357
[]
= "Implement a roba issue in a worktree, open a draft PR (full_auto)"
= ["n"]
= ["--profile", "worker"]
= """
Implement roba issue #${n}. Follow AGENTS.md: branch, implement, run the gates
(cargo fmt --check, clippy -D warnings, test --lib, test --test cli, cargo doc),
commit with a conventional-commit subject, and open a draft PR with the plan as
the body. 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 356
[]
= "Review a roba PR by number (read-only)"
= ["pr"]
= ["--readonly"]
= """
Review PR #${pr} in roba for correctness and regressions. Cite file:line.
Check it against AGENTS.md conventions. No style nits.
Title: $(gh pr view ${pr} --json title -q '.title')
$(gh pr diff ${pr})
"""