Repos don't copy this kit; they point at it. Change something here, and it reaches every repo:
| What | Lives in pm-kit | In each repo | How updates propagate |
|---|---|---|---|
| CI steps (lint, typecheck, test, build) | .github/workflows/ci-*.yml (reusable, workflow_call) |
12-line caller .github/workflows/ci.yml → uses: celo-org/pm-kit/...@main |
Instantly — callers run whatever is on main here |
| Issue forms, PR template, shared rules, money-path checklist, renovate.json | templates/ |
.github/…, .claude/shared/… |
sync-templates.yml opens a PR in every repo listed in sync/sync.yml |
Claude commands /file-issue /write-pr /review-pr /post-merge /close-pr /weekly-status /board-audit |
claude-plugin/ (plugin marketplace) |
installed plugin | claude plugin update pm-kit |
| Branch protection | protection/org-ruleset-main.json — one org-level ruleset targeting the 8 repos by name |
— | edit the include list, re-run apply-org-ruleset.sh |
| Merge settings (squash-only, title=commit, auto-merge) + labels | protection/apply-protection.sh, create-labels.sh |
per-repo settings via API | re-run (idempotent) |
CLAUDE.md |
templates/CLAUDE.md.template (starter only) |
repo-owned — imports the synced shared rules with @.claude/shared/engineering-rules.md |
manual; only project-specific content lives there |
- Create this as
celo-org/pm-kit. All target repos are in celo-org, so it can be internal or private — just enable Settings → Actions → General → Access: "Accessible from repositories in the organization" so the reusable workflows can be called. Caveat: PUBLIC repos cannot call reusable workflows in an internal/private pm-kit (GitHub restriction, the access setting cannot override it) — if any target repo is public, pm-kit must be public too, or that repo keeps a self-contained CI workflow. - Wire the template-sync GitHub App (org-owned, no expiry): add repository variable
TEMPLATE_SYNC_APP_CLIENT_IDand repository secretTEMPLATE_SYNC_APP_PRIVATE_KEY(the app's full PEM). The app needs Contents RW + Pull requests RW and must be installed on the target repos. - Pin the reusable workflow ref:
@mainis convenient; for stability tag releases (v1) and point callers at@v1.
Everything in this kit is repo-level except one thing: the Claude commands are installed per person.
- Prereqs: Claude Code and the GitHub CLI (
gh auth login). - Install the commands:
claude plugin marketplace add celo-org/pm-kit claude plugin install pm-kit@pm-kit
- Verify: run
claudein any repo and type/— you should see/file-issue,/write-pr,/review-pr,/post-merge,/close-pr,/weekly-status,/board-audit. - Later updates:
claude plugin update pm-kit.
That's it — CI, templates, shared rules, and branch protection are already wired into the repos and need no per-person configuration.
Each one turns a section of engineering-rules.md into procedure. Every command shows you its output and waits for your confirmation before touching GitHub — they propose, you decide.
| Command | What it does | Rules |
|---|---|---|
/file-issue <description> |
Verifies the claim by running it, clusters by fix boundary (same-diff / different-schedule tests), drafts title + body + labels against the issue form | §1 |
/write-pr [issue] |
Fills the PR template from the branch: what it does and what it does not do, mutation count, Closes vs Refs decided from the acceptance boxes |
§2–3 |
/review-pr <PR> |
Tiers the review by risk, checks the branch out and runs it, attempts to refute every claim in the body. No approve-with-nits | §4 |
/post-merge <PR> |
Compares what GitHub actually closed against what the body said, catches sidebar-link closures, drafts reopens and successor issues | §6 |
/close-pr <PR> <reason> |
Closes without merging while capturing what the work proved, with links pinned to the head SHA | §6 |
/weekly-status [since] |
Drafts the Friday per-product status from merged PRs and closed issues — evidence not impressions, under 300 words, printed in chat and written nowhere | §1 |
/board-audit [repo|all] |
Sorts an open backlog into buckets (stale, missing metadata, duplicates, sprawling, stale PRs), then closes / relabels / reassigns one confirmed bucket at a time. The only command that writes in batch — so deletion is never batched, and anything priority:critical stops the run |
§1 |
The first five work on one issue or PR; the last two work on the whole board. /board-audit resumes across sessions from .claude/board-audit.md.
cd ~/code/<repo> && git checkout -b <handle>/pm-kit-bootstrap
bash ~/code/pm-kit/apply.shThen: fill in CLAUDE.md, ensure lint/test/typecheck scripts exist, open the PR. Then labels + protection:
bash pm-kit/protection/create-labels.sh owner/repo
bash pm-kit/protection/apply-org-ruleset.sh # once, org-level (needs org admin)
bash pm-kit/protection/apply-protection.sh owner/repo # per-repo merge settingsAnd the plugin: claude plugin marketplace add celo-org/pm-kit && claude plugin install pm-kit@pm-kit.
.github/workflows/— reusable CI (ci-node,ci-hardhat,ci-foundry,ci-python,ci-docs-mintlify),verify-release-version,sync-templatescallers/— thin per-repo workflowstemplates/— everything synced into repos, plusCLAUDE.md.templatetemplates/.claude/shared/engineering-rules.md— the merged playbook (issues, PRs, tests, reviews, merging, closing, contradictions log)templates/.claude/shared/money-path-checklist.md— 18 recurring defects for money/security diffstemplates/.claude/shared/tester-mode-pattern.md— run real-money paths in production behind a restricted audience; porting checklistclaude-plugin/— commands;.claude-plugin/marketplace.json— marketplace manifestprotection/—org-ruleset-main.json+apply-org-ruleset.sh(one org ruleset),ruleset-main.json+apply-protection.sh(per-repo fallback + merge settings),create-labels.shtesting/— Vitest scaffold for repos with zero testsSETUP-GUIDE.md— the step-by-step walkthrough
It exists and is the org-wide default for ~300 repositories (Code of Conduct, CONTRIBUTING, SECURITY, Renovate preset). Anything placed there — issue forms, PR template — becomes the default for every celo-org repo without its own. Our templates are team conventions, so they're synced into our eight repos instead. Two things from the org repo we should reuse rather than duplicate: its renovate-config.json preset (extend it in our renovate.json instead of config:recommended if the org preset fits) and SECURITY.md/CONTRIBUTING.md, which repos inherit automatically.