| name | cicd |
|---|---|
| description | Steward's CI/CD lane, layered on `agex pr`. Delegates lint / open / read / reply / delta to agex; adds two steward extensions — `status` (SonarCloud quality gate + hotspots + unresolved-thread tally) and `await` (read --wait + status with non-zero exit on Sonar ERROR or unresolved threads). Use when: creating PRs in steward, handling review feedback, polling CI status, or the user says "create PR", "review comments", "address feedback", "resolve threads". Renamed from `pr-review` in steward 0.7.0; rebased on agex in 0.12.0. |
Vendored from steward (canonical upstream:
docs/skill-sources.md); this copy is owned by lepenseur and may diverge.
agex pr (in agentculture/agex-cli) is the upstream for the
five core PR-lifecycle verbs — lint, open, read, reply,
delta. Steward used to vendor parallel scripts for each; in 0.12.0
those vendored copies were dropped in favor of delegating to agex.
What's left in this skill is the steward-specific gating layer:
status— SonarCloud quality gate, OPEN issues, hotspots, deploy preview URL, unresolved-inline-thread tally.await— composesagex pr read --waitwithstatusand gates on SonarERROR/ unresolved threads. The single command to run after pushing a fix when you want "wake me when this PR is triage-able."
Those two are the steward unique surface today. They're filed as a feature ask upstream (agex-cli#41); once they land they migrate out of this skill.
The workflow is encapsulated in scripts/workflow.sh — follow that
(or call agex pr directly).
Hard requirements: agex (>=0.1), gh (GitHub CLI), jq, bash,
python3 (stdlib only), curl (used by pr-status.sh).
Install agex once:
uv tool install agex-cli # or: pip install --user agex-cliSoft requirement: PyYAML is needed only for suffix mode of the
sibling agent-config skill, where it parses Culture's server
manifest. Every cicd script works without it; suffix mode prints a
clear install hint when invoked without it.
Per-machine paths (sibling-project layout) live in
.claude/skills.local.yaml; see the committed .example for the
schema. agex pr delta reads the same file.
scripts/workflow.sh is the entry point. Subcommands:
| Command | What it does |
|---|---|
workflow.sh lint |
agex pr lint --exit-on-violation — portability + alignment-trigger check. |
workflow.sh open [gh-flags] |
agex pr open --delayed-read. Creates the PR, then polls 180s for an initial briefing. --title TITLE required; body via --body-file PATH or stdin. |
workflow.sh read [PR] [--wait N] |
agex pr read. One-shot briefing (CI checks, SonarCloud gate + new issues, all comments, next-step footer). Pass --wait N to poll up to N seconds for required reviewers. |
workflow.sh reply <PR> |
agex pr reply <PR> — batch JSONL replies (stdin) + thread resolve. agex auto-signs from culture.yaml. |
workflow.sh delta |
agex pr delta — sibling alignment dump. |
workflow.sh status <PR> |
Steward extension. pr-status.sh — Sonar gate, OPEN issues, hotspots, unresolved-thread breakdown, deploy preview URL. Authoritative gate for await. |
workflow.sh await <PR> |
Steward extension. agex pr read --wait then status. Exits non-zero on Sonar ERROR or unresolved threads. Tunables: STEWARD_PR_AWAIT_WAIT (default 1800s passed to --wait), STEWARD_PR_AWAIT_SECONDS (legacy fixed pre-sleep, deprecated). |
workflow.sh help |
Print the list. |
You can also call agex pr <verb> directly — workflow.sh is a
typing-saver around the same verbs. The steward status and await
extensions only have shell entry points.
The vendored single-comment helper pr-reply.sh (plus its
_resolve-nick.sh dependency) is still shipped — pinned by
tests/test_pr_reply_signature.py and tests/test_resolve_nick.py,
and useful when a one-off reply doesn't merit batch JSONL. It is not
called by workflow.sh anymore. The vendored portability-lint.sh
is also still shipped — steward doctor's portability check runs it
directly against target repos. Both are scheduled for follow-up
migration to agex.
agex pr read --wait N polls in-session for up to N seconds. The
Anthropic prompt cache has a 5-minute TTL; sleeping past it burns
context every cache miss. Two ways to drive the wait:
- Synchronous —
workflow.sh await <PR>aftergh pr create/workflow.sh open. Fine when readiness is expected within ~5 minutes. - Asynchronous — for longer waits, run
agex pr read --wait NNNinside a background subagent (Agent tool,run_in_background: true) so the main session only pays the cache cost when readiness fires. The subagent's only job is to invokeagex pr read --waitand echo its headline back. The parent triages withworkflow.sh awaitwhen the notification arrives. The user can interrupt with TaskStop.
This pattern was originally borrowed from sibling repo
agentculture/cfafi's poll
skill. The async guidance is also filed upstream
(agex-cli#41).
agex pr emits a "Next step:" footer at the end of every command
that names the right next verb (the same chain agex learn cicd
documents) — follow that rather than memorizing an order. workflow.sh help mirrors the verb table when you need the steward-flavored
extensions (status, await) on top.
Branch naming: fix/<desc>, feat/<desc>, docs/<desc>,
skill/<name>. PR / comment signature: - <nick> (Claude), where
<nick> is resolved by agex from the agent's own culture.yaml
(first agent's suffix), falling back to the git-repo basename. agex
auto-appends the signature on pr open and pr reply only when the
body isn't already signed.
For every comment, decide FIX or PUSHBACK with reasoning.
Default to FIX for: portability complaints (always valid for Steward — recurring bug class), test or doc requests, style nits aligned with workspace conventions.
Default to PUSHBACK for: architecture opinions that conflict with
workspace CLAUDE.md or the all-backends rule; greenfield
false-positives (e.g. "add tests" before there's any source — defer
to a later PR, don't refuse).
If the PR touches CLAUDE.md, culture.yaml, or anything under
.claude/skills/, run workflow.sh delta before declaring FIX or
PUSHBACK on each comment. Note any sibling that needs a follow-up PR
and mention it in your reply.
The lint and the workflow script are always-on. Stack-specific steps are conditional and currently no-op (greenfield repo):
[ -d tests ] && [ -f pyproject.toml ] && uv run pytest tests/ -x -q
[ -f pyproject.toml ] && bump_version_per_project_convention # see project README
[ -f .markdownlint-cli2.yaml ] && markdownlint-cli2 "$(git diff --name-only --cached '*.md')"Revisit each line as the corresponding stack element actually lands.
A pr lint --extra=tests,version,markdown ask is filed upstream
(agex-cli#41).
Every comment must get a reply — no silent fixes. agex pr reply
includes thread-resolve by default. Reference the review-comment IDs
in the fix-up commit message.
The status extension queries SonarCloud directly (it predates the
upstream Sonar integration in agex pr read). Both surfaces are
trustworthy — agex pr read for display in the briefing, status for
the gate. Steward isn't yet a registered mesh agent, so the
post-merge IRC ping that Culture's pr-review includes is still
skipped — that returns when Steward joins the mesh.