Sync mattpocock method skills into neo
neo vendors its method layer from mattpocock/skills
instead of depending on an external plugin at runtime. This skill pulls the
allowlisted skills into skills/<name>/ (flat neo layout) and never touches
neo-owned domain skills or the using-neo router.
In scope
Allowlist is sync-state.json:synced_skills (source path → dest name):
Dest (skills/) |
Upstream source |
tdd |
skills/engineering/tdd |
code-review |
skills/engineering/code-review |
diagnosing-bugs |
skills/engineering/diagnosing-bugs |
domain-modeling |
skills/engineering/domain-modeling |
research |
skills/engineering/research |
prototype |
skills/engineering/prototype |
codebase-design |
skills/engineering/codebase-design |
resolving-merge-conflicts |
skills/engineering/resolving-merge-conflicts |
grilling |
skills/productivity/grilling |
Out of scope (never touched)
- All neo-owned skills:
using-neo, api-spec, e2e-playwright, openapi-doc,
open-collection, confluence-api-doc, markitdown, init-project,
migrate-project, atlassian, gitlab
- Entry skills from mattpocock that neo absorbed into the router
(
grill-with-docs, implement, wayfinder, to-spec, to-tickets, triage, …)
hooks/, agents/, manifests, docs, README
To add a method skill later: append it to synced_skills in sync-state.json,
then re-run. To drop one: remove it from the allowlist and git rm skills/<name>
by hand — the sync never auto-deletes.
Files
assets/sync.py — fetch/clone, 3-way compare, dry-run/apply, advance baseline
sync-state.json — allowlist, upstream URL/path, last synced commit
Workflow
Dry run — always first.
python3 .agents/skills/sync-mattpocock/assets/sync.py
Optional: --upstream <path> if you already have a local clone;
--ref origin/main (default from state); --no-fetch to skip git fetch.
Read the report:
- ADD / UPDATE — files the apply step will write
- LOCAL-KEPT — you edited a vendored file and upstream did not change it; kept
- CONFLICT — both you and upstream changed the same file; merge by hand, re-run
- UPSTREAM-REMOVED — file gone upstream; decide manually (sync never deletes)
- MISSING-UPSTREAM-SKILL — allowlist path not found; fix
sync-state.json
Apply.
python3 .agents/skills/sync-mattpocock/assets/sync.py --apply
Writes add/update files and advances last_synced_commit / last_synced_date.
First run clones into .agents/skills/sync-mattpocock/.upstream-cache/
(gitignored-friendly; re-used on later runs).
Verify (do not skip).
node scripts/validate-skills.js
node scripts/validate-pi-package.js
bash hooks/session-start-test.sh
All green. Spot-check git diff skills/ — only allowlisted method skills should change.
Finish. Review the diff, bump plugin version if you are shipping the update,
then commit (yours to run). Prefer /ship when cutting a release.
Guarantees
- Allowlist-only. Skills not listed in
synced_skills are invisible to the sync.
- Neo-owned hard-blocked. Even a mistaken allowlist entry for
using-neo / domain
skills is rejected up front.
- Never clobbers hand-edits. 3-way compare keeps your change when upstream is quiet;
CONFLICT when both sides moved.
- Never auto-deletes. Removed-upstream files are reported only.
- Idempotent. Dry run against the recorded baseline reports zero pending writes.
When to run
- Upstream mattpocock/skills cut a release you want
- A method skill is missing under
skills/ after a fresh clone
- You expanded
synced_skills and need the new skill on disk
1---2name: sync-mattpocock-23description: Sync the allowlisted method-layer skills from mattpocock/skills into this neo-plugin repo. Use when updating the method layer, pulling tdd/code-review/grilling and related skills, or when the user says "sync mattpocock", "update method skills", or "pull mattpocock skills".4---56# Sync mattpocock method skills into neo78neo vendors its **method layer** from [mattpocock/skills](https://github.com/mattpocock/skills)9instead of depending on an external plugin at runtime. This skill pulls the10allowlisted skills into `skills/<name>/` (flat neo layout) and never touches11neo-owned domain skills or the `using-neo` router.1213## In scope1415Allowlist is `sync-state.json:synced_skills` (source path → dest name):1617| Dest (`skills/`) | Upstream source |18|---|---|19| `tdd` | `skills/engineering/tdd` |20| `code-review` | `skills/engineering/code-review` |21| `diagnosing-bugs` | `skills/engineering/diagnosing-bugs` |22| `domain-modeling` | `skills/engineering/domain-modeling` |23| `research` | `skills/engineering/research` |24| `prototype` | `skills/engineering/prototype` |25| `codebase-design` | `skills/engineering/codebase-design` |26| `resolving-merge-conflicts` | `skills/engineering/resolving-merge-conflicts` |27| `grilling` | `skills/productivity/grilling` |2829## Out of scope (never touched)3031- All neo-owned skills: `using-neo`, `api-spec`, `e2e-playwright`, `openapi-doc`,32 `open-collection`, `confluence-api-doc`, `markitdown`, `init-project`,33 `migrate-project`, `atlassian`, `gitlab`34- Entry skills from mattpocock that neo absorbed into the router35 (`grill-with-docs`, `implement`, `wayfinder`, `to-spec`, `to-tickets`, `triage`, …)36- `hooks/`, `agents/`, manifests, docs, README3738To add a method skill later: append it to `synced_skills` in `sync-state.json`,39then re-run. To drop one: remove it from the allowlist and `git rm skills/<name>`40by hand — the sync never auto-deletes.4142## Files4344- `assets/sync.py` — fetch/clone, 3-way compare, dry-run/apply, advance baseline45- `sync-state.json` — allowlist, upstream URL/path, last synced commit4647## Workflow48491. **Dry run — always first.**5051 ```bash52 python3 .agents/skills/sync-mattpocock/assets/sync.py53 ```5455 Optional: `--upstream <path>` if you already have a local clone;56 `--ref origin/main` (default from state); `--no-fetch` to skip `git fetch`.5758 Read the report:59 - **ADD / UPDATE** — files the apply step will write60 - **LOCAL-KEPT** — you edited a vendored file and upstream did not change it; kept61 - **CONFLICT** — both you and upstream changed the same file; merge by hand, re-run62 - **UPSTREAM-REMOVED** — file gone upstream; decide manually (sync never deletes)63 - **MISSING-UPSTREAM-SKILL** — allowlist path not found; fix `sync-state.json`64652. **Apply.**6667 ```bash68 python3 .agents/skills/sync-mattpocock/assets/sync.py --apply69 ```7071 Writes add/update files and advances `last_synced_commit` / `last_synced_date`.72 First run clones into `.agents/skills/sync-mattpocock/.upstream-cache/`73 (gitignored-friendly; re-used on later runs).74753. **Verify (do not skip).**7677 ```bash78 node scripts/validate-skills.js79 node scripts/validate-pi-package.js80 bash hooks/session-start-test.sh81 ```8283 All green. Spot-check `git diff skills/` — only allowlisted method skills should change.84854. **Finish.** Review the diff, bump plugin version if you are shipping the update,86 then commit (yours to run). Prefer `/ship` when cutting a release.8788## Guarantees8990- **Allowlist-only.** Skills not listed in `synced_skills` are invisible to the sync.91- **Neo-owned hard-blocked.** Even a mistaken allowlist entry for `using-neo` / domain92 skills is rejected up front.93- **Never clobbers hand-edits.** 3-way compare keeps your change when upstream is quiet;94 CONFLICT when both sides moved.95- **Never auto-deletes.** Removed-upstream files are reported only.96- **Idempotent.** Dry run against the recorded baseline reports zero pending writes.9798## When to run99100- Upstream mattpocock/skills cut a release you want101- A method skill is missing under `skills/` after a fresh clone102- You expanded `synced_skills` and need the new skill on disk