Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
56695e8
feat(review-utils): add sync-dispatch-workflows skill
claude Aug 8, 2026
e0eedd6
chore: `mise run format`
nsheaps Aug 8, 2026
a90c866
refactor(review-utils): reframe skill around the sync mechanism, drop…
claude Aug 8, 2026
38cd339
chore: `mise run format`
nsheaps Aug 8, 2026
b0e6b18
fix(sync-dispatch-workflows): correct doc citation, add prettier-drif…
claude Aug 8, 2026
911a201
chore: `mise run format`
nsheaps Aug 8, 2026
f5229f3
fix(sync-dispatch-workflows): list the exact trigger paths, not a par…
claude Aug 8, 2026
395ac59
fix: re-sync to updated canonical template, document the actual gate
claude Aug 8, 2026
88c199c
chore: `mise run format`
nsheaps Aug 8, 2026
c8270a0
fix(sync-dispatch-workflows): correct ansible/roles/ enumeration
claude Aug 8, 2026
776c4fb
fix: drop converted_to_draft from gate, fix label description length
claude Aug 8, 2026
8d9fde3
chore: `mise run format`
nsheaps Aug 8, 2026
4c74a56
chore(review-utils): move sync-dispatch-workflows skill to nsheaps/.g…
claude Aug 8, 2026
27a583a
fix: update stale ansible/templates source paths after .github restru…
claude Aug 8, 2026
b02326a
docs: update README for .github's mirrored ansible/templates/ layout
claude Aug 10, 2026
c9be791
Merge remote-tracking branch 'origin/main' into claude/review-workflo…
claude Aug 11, 2026
50a8bb8
Merge branch 'main' into claude/review-workflow-multi-repo-ljbuw0
nsheaps Aug 11, 2026
50c3909
fix: stop reverting Source: comment paths to the old flat layout
claude Aug 11, 2026
0b78485
Merge remote-tracking branch 'origin/main' into claude/review-workflo…
claude Aug 11, 2026
22ee0a1
Merge remote-tracking branch 'origin/claude/review-workflow-multi-rep…
claude Aug 11, 2026
35dc7d5
Merge remote-tracking branch 'origin/main' into claude/review-workflo…
claude Aug 11, 2026
8e333ba
Merge branch 'main' into claude/review-workflow-multi-repo-ljbuw0
nsheaps Aug 11, 2026
94d7bca
fix(review-utils): remove drifting templates/dispatch-review.yaml mirror
claude Aug 11, 2026
cef1706
chore: `mise run format`
nsheaps Aug 11, 2026
af26d8f
Merge remote-tracking branch 'origin/main' into claude/review-workflo…
claude Aug 11, 2026
029db65
revert: let renovate keep managing npm:@anthropic-ai/claude-code
claude Aug 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "review-utils",
"version": "0.1.10",
"version": "0.2.0",

Check notice on line 3 in plugins/claude-code/review-utils/.claude-plugin/plugin.json

View workflow job for this annotation

GitHub Actions / version-preview

Pending version bump

review-utils: already bumped to 0.2.0 in this PR (kept on merge to main)
"description": "Self-contained PR-review pipeline: composite GitHub Actions (agent-setup, run-agent), reusable workflow integration, and the review-code skill that drives the review methodology. Replaces the previous scattered setup across nsheaps/agents + nsheaps/.ai-agent-henry.",
"author": {
"name": "Nathan Heaps",
Expand Down
24 changes: 2 additions & 22 deletions plugins/claude-code/review-utils/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,29 +24,9 @@ The reusable workflow that consumers call (`nsheaps/agents/.github/workflows/rev

## Consumer setup

Per-repo `.github/workflows/dispatch-review.yaml` template:

```yaml
name: Dispatch PR Review

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review, labeled]

jobs:
dispatch:
uses: nsheaps/agents/.github/workflows/review-dispatch.yaml@main
secrets:
REVIEW_GITHUB_APP_ID: ${{ secrets.REVIEW_GITHUB_APP_ID }}
REVIEW_GITHUB_APP_PRIVATE_KEY: ${{ secrets.REVIEW_GITHUB_APP_PRIVATE_KEY }}
REVIEW_ANTHROPIC_API_KEY: ${{ secrets.REVIEW_ANTHROPIC_API_KEY }}
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
permissions:
contents: read
pull-requests: write
```
Per-repo `.github/workflows/dispatch-review.yaml` is a thin consumer-side file distributed from `nsheaps/.github`'s `ansible/templates/.github/workflows/dispatch-review.yaml` (source layout there mirrors each file's destination, nested under `ansible/templates/` — see that repo's `docs/file-sync.md`) — see `ansible/config/sync-files.yml` there for the exact `managed_repos` membership (currently every managed repo, `nsheaps/.github` included — it's a normal sync target of its own template since it takes real PRs too). `nsheaps/.github` is the sole source of truth — there is no mirror of this file in `nsheaps/agents`; a prior copy under `templates/` drifted out of sync more than once and was removed for that reason. (A separate, unrelated file, `pr-status-dispatch.yaml`, is distributed by the same sync system but pings `nsheaps/.org`'s PR status digest — a different mechanism, not covered here.)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 nit · P2 · readability

This is a single ~120-word sentence-tangle with three parentheticals and an em-dash chain, doing four separate jobs (where the template lives, path-layout note, membership pointer, why the local mirror is gone, and an aside about pr-status-dispatch.yaml). Splitting into a short paragraph + bullets makes the operational info scannable and lets a reader who just wants "where's the template?" find it in one line:

Suggested change
Per-repo `.github/workflows/dispatch-review.yaml` is a thin consumer-side file distributed from [`nsheaps/.github`'s `ansible/templates/.github/workflows/dispatch-review.yaml`](https://github.com/nsheaps/.github/blob/main/ansible/templates/.github/workflows/dispatch-review.yaml) — the sole source of truth (no mirror in this repo).
- **Layout:** `nsheaps/.github` mirrors each synced file's destination path nested under `ansible/templates/` — see that repo's `docs/file-sync.md`.
- **Membership:** see [`ansible/config/sync-files.yml`](https://github.com/nsheaps/.github/blob/main/ansible/config/sync-files.yml) there for the exact `managed_repos` list (currently every managed repo, `nsheaps/.github` included — it's a normal sync target of its own template since it takes real PRs too).
- **Prior mirror:** a copy under this repo's `templates/` drifted out of sync more than once and was removed.
- **Related but out of scope:** `pr-status-dispatch.yaml` is distributed by the same sync system but pings `nsheaps/.org`'s PR status digest — a different mechanism.

Non-blocking (docs already merged); worth folding into the next README pass.1

Footnotes

  1. 🟡 P2 — nit / polish. Non-blocking style/readability issue.

The full template at `nsheaps/agents/templates/dispatch-review.yaml` is kept in sync with this README.
Propagation is automatic (`nsheaps/.github`'s `sync-all.yaml`, weekly plus on template change). See the `sync-dispatch-workflows` skill in `nsheaps/.github/.claude/skills/` for how the mechanism works, how to change the template or add/remove consumer repos, and how to trigger a sync run rather than hand-patching a repo.

## Skill

Expand Down
32 changes: 16 additions & 16 deletions plugins/claude-code/review-utils/specs/review-dispatch.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,22 @@ DRAFT — landing alongside implementation in PR #165 per the spec-with-impl dir

### Implementation map

| Section | File(s) |
| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Topology — decider | [`.github/workflows/review-dispatch.yaml`](../../../../.github/workflows/review-dispatch.yaml) |
| Topology — receiver | [`.github/workflows/review-receiver.yaml`](../../../../.github/workflows/review-receiver.yaml) |
| Topology — consumer template | [`templates/dispatch-review.yaml`](../../../../templates/dispatch-review.yaml) |
| Topology — receiver template | [`templates/dispatch-receiver-review.yaml`](../../../../templates/dispatch-receiver-review.yaml) |
| Topology — plugin composite | [`../actions/run-agent/action.yaml`](../actions/run-agent/action.yaml) |
| Topology — review-code skill | [`../skills/review-code/SKILL.md`](../skills/review-code/SKILL.md) |
| Trigger events | `templates/dispatch-review.yaml` `on:` block |
| Check-run lifecycle (queued/dispatched/failure) | `review-dispatch.yaml` steps "Post queued check" → "Update check (dispatched\|dispatch failed)" |
| Check-run lifecycle (in_progress/terminal) | `review-receiver.yaml` steps "Update check (in_progress\|terminal\|agent failed)" |
| Approval dismissal | `review-receiver.yaml` step "Dismiss prior approval reviews" |
| Metrics emission (agent side) | `../skills/review-code/SKILL.md` step 11 |
| Metrics path export | `../actions/run-agent/action.yaml` step "Export trigger fields for prompt interpolation" |
| Metrics gate (receiver side) | `review-receiver.yaml` steps "Read agent metrics" + "Compute check conclusion" |
| `if: failure()` safety net | `review-receiver.yaml` step "Update check (agent failed)" + `review-dispatch.yaml` step "Update check (dispatch failed)" |
| Section | File(s) |
| ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Topology — decider | [`.github/workflows/review-dispatch.yaml`](../../../../.github/workflows/review-dispatch.yaml) |
| Topology — receiver | [`.github/workflows/review-receiver.yaml`](../../../../.github/workflows/review-receiver.yaml) |
| Topology — consumer template | [`nsheaps/.github` — `ansible/templates/.github/workflows/dispatch-review.yaml`](https://github.com/nsheaps/.github/blob/main/ansible/templates/.github/workflows/dispatch-review.yaml) (sole source of truth; no mirror in this repo) |
| Topology — receiver template | [`templates/dispatch-receiver-review.yaml`](../../../../templates/dispatch-receiver-review.yaml) |
| Topology — plugin composite | [`../actions/run-agent/action.yaml`](../actions/run-agent/action.yaml) |
| Topology — review-code skill | [`../skills/review-code/SKILL.md`](../skills/review-code/SKILL.md) |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 nit · P2 · consistency

The row above (Topology — consumer template) now links to the canonical file on nsheaps/.github — good. This Trigger events row still references the same file's on: block as a bare code fragment. Same treatment (hyperlink into nsheaps/.github) would make it navigable and keep the two rows consistent — reader clicks once, lands on the actual on: block.

Suggested change
| Topology — review-code skill | [`../skills/review-code/SKILL.md`](../skills/review-code/SKILL.md) |
| Trigger events | [`nsheaps/.github`'s `dispatch-review.yaml` template `on:` block](https://github.com/nsheaps/.github/blob/main/ansible/templates/.github/workflows/dispatch-review.yaml) |

Non-blocking.1

Footnotes

  1. 🟡 P2 — nit / polish. Non-blocking consistency improvement.

| Trigger events | `nsheaps/.github`'s `dispatch-review.yaml` template `on:` block |
| Check-run lifecycle (queued/dispatched/failure) | `review-dispatch.yaml` steps "Post queued check" → "Update check (dispatched\|dispatch failed)" |
| Check-run lifecycle (in_progress/terminal) | `review-receiver.yaml` steps "Update check (in_progress\|terminal\|agent failed)" |
| Approval dismissal | `review-receiver.yaml` step "Dismiss prior approval reviews" |
| Metrics emission (agent side) | `../skills/review-code/SKILL.md` step 11 |
| Metrics path export | `../actions/run-agent/action.yaml` step "Export trigger fields for prompt interpolation" |
| Metrics gate (receiver side) | `review-receiver.yaml` steps "Read agent metrics" + "Compute check conclusion" |
| `if: failure()` safety net | `review-receiver.yaml` step "Update check (agent failed)" + `review-dispatch.yaml` step "Update check (dispatch failed)" |

## Problem

Expand Down
71 changes: 0 additions & 71 deletions templates/dispatch-review.yaml

This file was deleted.

Loading