Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
52 changes: 52 additions & 0 deletions .claude/skills/upstream-check/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
name: upstream-check
description: Compare Matt Pocock's skills repo against the commit this plugin's ported skills were taken from, and list what is new, changed, or gone. Explicit invocation only.
disable-model-invocation: true
---

# Upstream check

The plugin's `grill`, `build`, `spec`, `routine`, `wayfinder`, `handoff`,
`research`, `wait-what`, `teach`, `writing-for-agents`, `domain-modeling`,
`diagnosing-bugs`, and `resolving-merge-conflicts` skills were rewritten
from `github.com/mattpocock/skills`. This skill says what has changed there
since, so you can decide what to fold in.

`UPSTREAM.md` next to this file records the upstream commit the port was
taken from, and the map from each upstream skill to the plugin skill it
became. Read it first.

## Steps

1. Get the current upstream commit and the list of skill folders:

```sh
gh api repos/mattpocock/skills/commits/main --jq .sha
gh api 'repos/mattpocock/skills/git/trees/main?recursive=1' --jq '.tree[] | select(.path | endswith("/SKILL.md")) | .path'
```

2. List the skill folders at the recorded commit the same way, with the
recorded SHA in place of `main`. Compare the two lists. A folder only in
the new list is a new skill. A folder only in the old list was removed.

3. For every upstream skill that `UPSTREAM.md` maps to a plugin skill, and
for every skill the user asked about, diff its folder between the two
commits:

```sh
gh api repos/mattpocock/skills/compare/<recorded-sha>...<current-sha> --jq '.files[] | select(.filename | startswith("skills/")) | .filename'
```

Fetch the changed `SKILL.md` at both commits with
`gh api repos/mattpocock/skills/contents/<path>?ref=<sha>` and read the
difference.

4. Report, in this order: new skills with a one-line gist each, changed
skills with what changed and whether the plugin's version already covers
it, and removed skills. Say when nothing changed.

5. Offer to update the recorded SHA and date in `UPSTREAM.md`. Do it only
on a yes.

Nothing here touches the plugin's skills. Folding a change in is its own
task.
27 changes: 27 additions & 0 deletions .claude/skills/upstream-check/UPSTREAM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Upstream record

The port was taken from `github.com/mattpocock/skills` at commit
`3cca18b368ae95cdbdebbff572ccafa662551015`, dated 2026-09-04, and checked
on 2026-09-14.

| Upstream skill | Plugin skill |
|---|---|
| `productivity/grilling`, `productivity/grill-me`, `engineering/grill-with-docs` | `grill` |
| `engineering/implement`, `engineering/tdd`, `in-progress/implement-spec` | `build` |
| `engineering/to-spec`, `engineering/to-tickets` | `spec` |
| `in-progress/loop-me` | `routine` |
| `engineering/wayfinder` | `wayfinder` |
| `productivity/handoff`, `in-progress/claude-handoff` | `handoff` |
| `engineering/research` | `research` |
| `productivity/wait-what` | `wait-what` |
| `productivity/teach` | `teach` |
| `productivity/writing-for-agents` | `writing-for-agents` |
| `engineering/domain-modeling` | `domain-modeling` |
| `engineering/diagnosing-bugs` | `diagnosing-bugs` |
| `engineering/resolving-merge-conflicts` | `resolving-merge-conflicts` |

Not ported: `code-review` (its check of the diff against the ask lives in
`build`), `codebase-design`, `prototype`, `triage`, `wizard`, `retro`,
`to-questionnaire`, `ask-matt`, `improve-codebase-architecture`,
`setup-matt-pocock-skills`, and everything under `misc/` and the
`writing-*` folders under `in-progress/`.
26 changes: 22 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Paste this loader rather than the body of `scripts/cloud-bootstrap.sh`, so the l

```bash
#!/bin/bash
# rev: 35
# rev: 36
curl -fsSL https://raw.githubusercontent.com/gborges0727/claude-plugins/main/scripts/cloud-bootstrap.sh | bash || true
exit 0
```
Expand Down Expand Up @@ -71,18 +71,36 @@ Every PR bumps the `rev`, in the snippet above and in `scripts/cloud-bootstrap.s
| `codex-delegate` | Skill | Handing a subtask to the Codex CLI on one of four rungs (Luna, Sol, Astra at medium, or the user-summoned Astra at xhigh), so ChatGPT-plan quota pays for it instead of Claude tokens. Each lane is a `codex exec` command run in the background, so a fan-out starts every lane at once. Needs the `codex` binary on PATH and signed in |
| `model-routing-review` | Skill | Explicit invocation only. Re-derives the delegation ladder from today's catalog, prices, and scores, rewrites [docs/model-routing.md](docs/model-routing.md), and lists every file the ladder change touches |
| `pair-debate` | Skill | Explicit invocation only. Puts Fable 5.1 and GPT-6 Astra, both at xhigh, in a room to work one hard problem as peers. `scripts/debate.py` runs the conversation in the background: blind drafts, an argued definition of done the user approves, then alternating turns in one shared worktree until both agree. The session reports events and reruns the agreed check at the end |
| `grill` | Skill | Explicit invocation only. Interviews the user in rounds, every askable question at once with a recommended answer, until no decision is open. Runs `domain-modeling` alongside when the repo has a `CONTEXT.md` |
| `build` | Skill | Explicit invocation only. Builds what the conversation (or a named spec or issue) asked for, one failing test then the smallest passing code, then a review by `opus-medium` against the ask and the repo's own review instructions. Commits only when told. A spec with tickets fans out one worktree per ticket |
| `spec` | Skill | Explicit invocation only. Writes the conversation up as a spec under `docs/specs/`, and splits it into end-to-end tickets only when the work will not fit one session |
| `routine` | Skill | Explicit invocation only. Grills the user into a spec for one recurring routine (trigger, check-in, brief), under `docs/routines/` |
| `wayfinder` | Skill | Explicit invocation only. For work too big for one session: a map file of open questions under `docs/specs/<slug>/`, answered one session at a time |
| `handoff` | Skill | Explicit invocation only. Writes the conversation up for a fresh session under `docs/handoff/`, or into Bear, and starts the session when asked |
| `research` | Skill | Sends a background agent (`opus-medium`, or Codex Sol when Codex is on) to answer a question from primary sources into a cited file under `docs/research/` |
| `wait-what` | Skill | Explicit invocation only. Says the last message again in plain English, context first |
| `teach` | Skill | Explicit invocation only. Teaches a topic over many sessions from files in the current directory. Lessons publish as Claude artifacts |
| `writing-for-agents` | Skill | How to structure a skill, a `CLAUDE.md`, or any document an agent reads: what stays in the main file, what goes behind a pointer, and how each step says when it is done |
| `domain-modeling` | Skill | Keeps `CONTEXT.md` and `docs/adr/` sharp during a design discussion |
| `diagnosing-bugs` | Skill | A method for hard bugs: build a fast check that fails on this bug first, then shrink, list suspects, probe, fix with a regression test, clean up |
| `resolving-merge-conflicts` | Skill | Resolves an in-progress merge or rebase by reading why each side changed and keeping both intents |
| `reference/output-locations.md` | Reference | The one rule for where the document-writing skills put their files, read from the repo's `.claude/gborges-standard.json` with `docs/` as the default |
| `add-to-git` | Command | Explicit invocation only, never model-triggered |
| `setup-repo` | Command | Writes `.claude/gborges-standard.json` at a repo's root, the per-repo `docs` folder and `tracker` choice the document-writing skills read. Wraps `scripts/setup-repo.sh` |
| `setup` | Command | Writes `~/.claude/gborges-standard.json`, the per-machine switches for Fable access and Codex delegation, the `attribution` key in `~/.claude/settings.json` that stops Claude Code asking for AI attribution, and the Codex CLI's own model, subagent, and status line config under `~/.codex`. Wraps `scripts/setup.sh`, which does the same with no model turn |
| `sonnet-medium` | Agent | Sonnet 5 at medium effort. Edits and runs with a command check in the brief, parallel copies of one such task, and fetching a named doc page |
| `opus-medium` | Agent | Opus 5 at medium effort. The default, and the floor for anything that reads code to reach a conclusion |
| `opus-xhigh` | Agent | Opus 5 at xhigh effort. One escalation step for a task that failed below it, and the stand-in for Fable on an account without it |
| `fable-xhigh` | Agent | Fable 5.1 at xhigh effort. Runs only when the user's message names Fable. See [docs/subagent-routing.md](docs/subagent-routing.md) for the routing rule and the cost reasoning |
| `frontend-design` | Dependency | From `claude-plugins-official` |
| `mattpocock-skills` | Dependency | From `claude-plugins-official` |
| `context7` | Dependency | From `claude-plugins-official` |

Dependencies resolve to the same identifiers a user-scope install uses, so a machine that already has them does not get a second copy.

### Skills adapted from Matt Pocock

Thirteen of the skills (`grill`, `build`, `spec`, `routine`, `wayfinder`, `handoff`, `research`, `wait-what`, `teach`, `writing-for-agents`, `domain-modeling`, `diagnosing-bugs`, and `resolving-merge-conflicts`) started as skills in [mattpocock/skills](https://github.com/mattpocock/skills), MIT licensed, copyright Matt Pocock. They were rewritten here in plain English, merged where two did one job, and cut loose from any issue tracker. The commit they were taken from is recorded in `.claude/skills/upstream-check/UPSTREAM.md`, and the `upstream-check` skill in this repo lists what has changed there since.

## Codex

The same plugin folder installs into the Codex CLI. Codex reads its own
Expand Down Expand Up @@ -152,7 +170,7 @@ own, and a file at it would fire twice.

| Component | Codex | Notes |
|---|---|---|
| The five skills | Yes | `SKILL.md` loads unchanged on both hosts |
| The skills | Yes | `SKILL.md` loads unchanged on both hosts |
| `plain-english.md` | Yes, through a hook | Codex has no output styles. `codex-session-style.py` returns the style body as `SessionStart` context |
| `strip-attribution.py` | Yes | Codex passes the same `tool_name` and `tool_input` fields and accepts the same `updatedInput` reply |
| `flag-server-attribution.py` | Yes | Same `PostToolUse` contract |
Expand All @@ -161,7 +179,7 @@ own, and a file at it would fire twice.
| `route-spawns.py` | Yes, on a different event | Codex spawns subagents through a tool no `Agent` matcher catches, and fires `SubagentStart`. `--subagent-start` answers that event with the same rules block as context |
| `add-to-git` | No | A Claude command. Codex loads skills, not commands |
| The four agents | No | Claude Code agents. `codex-session-style.py` drops the style's Subagents section so Codex never gets sent to a name it cannot resolve |
| The three dependencies | No | `frontend-design`, `mattpocock-skills`, and `context7` live in a Claude marketplace that Codex cannot install from |
| The two dependencies | No | `frontend-design` and `context7` live in a Claude marketplace that Codex cannot install from |

The style arrives as about 6,300 characters of session context, which is the
one real cost of the Codex path. `WRITING_VOICE_STYLE=0` turns it off, and
Expand Down
25 changes: 6 additions & 19 deletions docs/codex-parity.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ below ran on the home desktop that day.

| Piece | The one copy | How Codex reads it |
|---|---|---|
| Writing rules, hooks, five skills | this repo's `plugins/gborges-standard` | the `gborges` marketplace, installed with `codex plugin add` |
| Writing rules, hooks, skills | this repo's `plugins/gborges-standard` | the `gborges` marketplace, installed with `codex plugin add` |
| Machine notes (SSH, colima, GitHub, Taildrop, 1Password) | `~/.claude/CLAUDE.md` | `~/.codex/AGENTS.md` is a symlink to it |
| Model routing and status line | `scripts/setup.sh --codex-config on` | it writes `~/.codex/config.toml` and `~/.codex/agents` |
| Per-machine switches (Fable, Codex delegation) | `~/.claude/gborges-standard.json` | the Codex hooks read the same file |
Expand Down Expand Up @@ -124,24 +124,11 @@ ln -s ~/.claude/plugins/marketplaces/swiftui-agent-skill/swiftui-pro swiftui-pro
Those three point at git checkouts that Claude Code updates in place, so
the links never break.

The mattpocock plugin is different. Claude Code fetches it into a
versioned cache folder, and its manifest loads 25 of the 35 skill folders
it ships. This loop links the same 25:

```sh
m=~/.claude/plugins/cache/claude-plugins-official/mattpocock-skills/1.2.3
cd ~/.agents/skills
for s in $(python3 -c "import json;print(' '.join(json.load(open('$m/.claude-plugin/plugin.json'))['skills']))"); do
ln -s "$m/$s" "$(basename $s)"
done
```

Those 25 links break when Claude Code moves the plugin past 1.2.3, because
the cache path carries the version. Re-run the loop with the new version
when `ls -la ~/.agents/skills | grep mattpocock` shows dangling links.

`use-railway` was already in `~/.agents/skills`, so the folder ends at 29
skills.
The skills that used to come from the mattpocock plugin now ship inside
`gborges-standard`, so the Codex plugin install above covers them. A
machine that still has links named after those skills in `~/.agents/skills`
should delete them, or Codex lists two of each. `use-railway` was already
in `~/.agents/skills`, so the folder ends at four skills.

## Write the model setup and status line

Expand Down
5 changes: 2 additions & 3 deletions plugins/gborges-standard/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "gborges-standard",
"displayName": "Gabe's standard set",
"description": "Standard Claude Code setup used across all of Gabe Borges' repos. Applies the Plain English output style everywhere, strips AI-attribution footers from GitHub writes, appends the writing rules to subagent prompts, keeps Codex calls off GPT-6 Astra unless the user named it, re-injects the writing rules reminder with every user message, and bundles the writing-voice, read-aloud-prep, bear-notes, codex-delegate, model-routing-review, and pair-debate skills, four routed subagents (sonnet-medium, opus-medium, opus-xhigh, and the user-summoned fable-xhigh), the add-to-git and setup commands, and the frontend-design, mattpocock-skills, and context7 plugins.",
"version": "1.29.0",
"description": "Standard Claude Code setup used across all of Gabe Borges' repos. Applies the Plain English output style everywhere, strips AI-attribution footers from GitHub writes, appends the writing rules to subagent prompts, keeps Codex calls off GPT-6 Astra unless the user named it, re-injects the writing rules reminder with every user message, and bundles the writing-voice, read-aloud-prep, bear-notes, codex-delegate, model-routing-review, and pair-debate skills, the grill, build, spec, routine, wayfinder, handoff, research, wait-what, teach, writing-for-agents, domain-modeling, diagnosing-bugs, and resolving-merge-conflicts skills rewritten in plain English from Matt Pocock's set, four routed subagents (sonnet-medium, opus-medium, opus-xhigh, and the user-summoned fable-xhigh), the add-to-git, setup, and setup-repo commands, and the frontend-design and context7 plugins.",
"version": "1.30.0",
"author": {
"name": "Gabe Borges",
"email": "gbborges@proton.me"
Expand All @@ -13,7 +13,6 @@
"hooks": "./hooks/claude-hooks.json",
"dependencies": [
{ "name": "frontend-design", "marketplace": "claude-plugins-official" },
{ "name": "mattpocock-skills", "marketplace": "claude-plugins-official" },
{ "name": "context7", "marketplace": "claude-plugins-official" }
]
}
6 changes: 3 additions & 3 deletions plugins/gborges-standard/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "gborges-standard",
"version": "1.29.0",
"description": "Standard Codex setup used across all of Gabe Borges' repos. Injects the Plain English rules at session start and into every subagent, strips AI-attribution footers from GitHub writes, re-injects the writing rules reminder with every user message, and ships the writing-voice, read-aloud-prep, bear-notes, codex-delegate, model-routing-review, and pair-debate skills.",
"version": "1.30.0",
"description": "Standard Codex setup used across all of Gabe Borges' repos. Injects the Plain English rules at session start and into every subagent, strips AI-attribution footers from GitHub writes, re-injects the writing rules reminder with every user message, and ships the writing-voice, read-aloud-prep, bear-notes, codex-delegate, model-routing-review, and pair-debate skills, plus grill, build, spec, routine, wayfinder, handoff, research, wait-what, teach, writing-for-agents, domain-modeling, diagnosing-bugs, and resolving-merge-conflicts.",
"author": {
"name": "Gabe Borges",
"email": "gbborges@proton.me",
Expand All @@ -16,7 +16,7 @@
"interface": {
"displayName": "Gabe's standard set",
"shortDescription": "Plain English writing rules, hooks, and skills",
"longDescription": "Carries Gabe Borges' working conventions into Codex: the Plain English writing rules at session start and on every subagent spawn, AI-attribution stripping on GitHub writes, a per-turn reminder of the rules, and the writing-voice, read-aloud-prep, bear-notes, codex-delegate, model-routing-review, and pair-debate skills.",
"longDescription": "Carries Gabe Borges' working conventions into Codex: the Plain English writing rules at session start and on every subagent spawn, AI-attribution stripping on GitHub writes, a per-turn reminder of the rules, and the writing-voice, read-aloud-prep, bear-notes, codex-delegate, model-routing-review, and pair-debate skills, plus the thirteen skills rewritten from Matt Pocock's set (grill, build, spec, and the rest).",
"developerName": "Gabe Borges",
"category": "Productivity",
"capabilities": ["Read", "Write"],
Expand Down
32 changes: 32 additions & 0 deletions plugins/gborges-standard/commands/setup-repo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
description: Ask where this repo keeps agent-written documents and whether specs become GitHub issues, then write .claude/gborges-standard.json at the repo root.
disable-model-invocation: true
---

# Setup repo

## Step 1: Ask

Call AskUserQuestion once with both questions in the one call.

Ask which folder specs, research notes, handoffs, wayfinder maps, and
routine specs go under. Offer "docs" (the default) and let the user type
another folder name. Each skill writes under its own subfolder there, for
example `docs/specs/` and `docs/handoff/`.

Ask whether specs and tickets should also become GitHub issues. Offer "Files
only" (the skills write files under the docs folder and touch GitHub only
when asked) and "GitHub issues" (the `spec` and `wayfinder` skills also open
one issue per spec, ticket, map, or question). Files only is the default.

## Step 2: Write the file

Turn the answers into a folder name and `files` or `github`, then run:

```bash
bash "${CLAUDE_PLUGIN_ROOT}/scripts/setup-repo.sh" --docs <folder> --tracker <files|github>
```

## Step 3: Report

Print the `Wrote ...` line the script printed. Say nothing else.
3 changes: 2 additions & 1 deletion plugins/gborges-standard/output-styles/plain-english.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ Spend words on clarity, save them on scope.
would have flagged, then trail the rest in a plain mention. "The company
page is still open. I also filed five smaller questions."
- Never close a claim with a motto that restates it ("that distinction
matters", "green is the gate, not a suggestion"). Never introduce a
matters", "green is the gate, not a suggestion", "the file is the
signal"). Never introduce a
restatement ("in other words", "put differently"). Say the claim once.
- Repeated rhythm is not content. Fragments echoing one shape ("No gimmicks.
No hacks. No filler.") and ladders that escalate ("Five became fifty.
Expand Down
Loading
Loading