rtonneau/grill-plan-ship
v2.8.1MIT
A local development workflow for exploring, planning, implementing, and shipping changes with shared session state.
Changelog
All notable changes to grill-plan-ship. Versions follow semantic versioning.
Unreleased
2.8.1 (2026-10-13)
- Support planned GPS sessions in detached linked worktrees by inferring the pull request base from the branch checked out at the same commit, including non-default branches.
- Report Git inspection failures separately from detached HEAD and preserve prepared write payloads with an accurate recovery hint.
2.8.0 (2026-10-12)
- Share the GPS workflow between Claude Code and Codex, with explicit delegation adapters, configured Codex model mappings and effort validation.
- Route skill arguments without forwarding the subcommand to scripts; run scripts from the target repository root.
- Include portable and Codex compatibility manifests in release version detection, and update this plugin's saved release file list.
- Attribute generated GitHub pull requests and issues to grill-plan-ship for sessions that may span coding agents.
2.7.1 (2026-10-09)
- Every grill question is a click, whichever grill runs.
/gps startnow tells Claude that all grill questions go throughAskUserQuestion, overriding the question format of a delegated skill such asmattpocock-skills:grilling(which asks plain-text❓/➡️rounds). Before, that rule applied only to the built-in grill. Questions go out in calls of up to 4, recommended answer first. - The Jev tests no longer open a local port, so running
npm teston Windows no longer triggers the firewall prompt for node.js. TheGPS_JEV_BASE_URLoverride is removed: the Jev endpoint is fixed.
2.7.0 (2026-10-08)
- Jev-judged ticket Model/Effort hints. When
TYPESAFE_API_KEYis set andjev.enabledis on in.work/gps-config.json,/gps planpipes each drafted ticket into TypeSafe's Jev (jev-hints.js,lib/jev.js) instead of leaving the**Model:**/**Effort:**hint to Claude's own heuristic alone. Jev's version-named answer is collapsed to a family (haiku/sonnet/opus) before it's written, and its raw answer and confidence are kept alongside in a**Model (Jev):**line for audit only.- Projects that never set
TYPESAFE_API_KEYsee no behavior change:jev.enabledstaysfalseand/gps planfalls back to its existing heuristic. - Any Jev failure (disabled, missing key, timeout, network error, bad response) is a warning, not an error; the ticket still gets Claude's own judgment.
/gps configshowsjev.enabled; detected and re-detected exactly likegithub.enabled.- Decision 0005. Why the hint stays optional and family-level: see docs/decisions/0005-jev-model-effort-hints-stay-optional-and-family-level.md.
- Projects that never set
2.6.2
/gps initcreates the CHANGELOG. When the project has none (atchangelog.path, defaultCHANGELOG.md) and the changelog is enabled,/gps init --applywrites one with just a title and commits it in thechore(gps): set up gpscommit. An existing CHANGELOG is never touched.- A title-only CHANGELOG keeps its format open. A CHANGELOG with no entry yet still counts as new: the first release takes plain bullets or
### Added-style sections from the fragments, as it does for a missing file.
2.6.1
- The grill starts
grilling./gps startcallsmattpocock-skills:grillinganddomain-modelingitself instead ofgrill-with-docs, which an agent cannot start. - Every question is a click. Ticket approval, bounded-work approval, model and effort hints, and the session pickers in
/gps statusand/gps finishnow go throughAskUserQuestion.
2.6.0
- Automatic CHANGELOG.
/gps finishnow starts by writing the session's changelog entry as a fragment,.work/changelog/<session-id>.md.- Claude drafts the user-facing bullets and picks the bump; it can't go below the floor the commit types imply, and going higher needs a reason.
- The fragment is its own file and
CHANGELOG.mdis left alone, so parallel sessions never claim the same version and never conflict. It travels in thechore(gps): finishrecord commit, so the pull request shows it. - INDEX.md and the finish output record the bump.
changelog.enabledandchangelog.pathin.work/gps-config.jsonturn it off or move it.
/gps release. Turns the fragments (and any hand-written## Unreleasedbullets) into a version: it suggests one from the fragments' bumps, writes## X.Y.Z (date), bumps the version files, commits the CHANGELOG, the version files and the fragment deletions as onechore(release)commit and tags. An invalid fragment is refused by name. A second question pushes the commit and tag and creates the GitHub Release (release.githubRelease:none,minor+,all). It never runs under/gps auto./gps configand/gps helpshow the new settings and the new command.- Decision 0003. Why sessions write changelog fragments and only
/gps releasesets the version: see docs/decisions/0003-changelog-unreleased-then-release.md.
2.5.1
/gps autorecommends subagent + inline follow-up. When it asks the ship mode, it puts subagent + inline follow-up first as "(Recommended)", whatever the last ship mode was: each ticket's diff is reviewed and the Verification Step re-run in the session before it is committed./gps shipstill recommends the last mode used.- README: no parallel tickets. It now states that no ship mode runs tickets in parallel: both subagent modes dispatch one subagent per ticket, and the next starts only after the previous ticket is committed.
2.5.0
- Shared
.work/. gps now commits only its own paths in.work/:gps-config.json,GLOSSARY.md,adr/andsessions/. It used to commit everything there, so files another skill kept in.work/ended up in gps'schore(gps)commits. Other skills can now keep their files in.work/<skill-name>/and commit them themselves. docs/WORK-DIR.md says what they may read, where they may write, and what gps promises in return. - What other skills can rely on. The contract names four
.session-config.jsonfields that gps keeps stable between versions:feature_name,kind,git.branchandcurrent_phase. It also says when each one can be missing or out of date. - gps's record commit is more robust:
- A tracked
.work/path that the user later git-ignores is still updated, instead of failing the whole commit. - gps never runs
git commitwithout naming the paths to commit, so it can't take the whole index by mistake.
- A tracked
- Decision 0002. Why gps lists the paths it owns instead of committing all of
.work/: see docs/decisions/0002-gps-commits-only-its-own-work-paths.md.
2.4.0
- Effort hints.
/gps plangives each ticket an**Effort:**line (low,medium,high,xhighorinherit) beside its**Model:**line. In the subagent ship modes,dispatch-prompt.jssends the ticket to the subagent for that level (newagents/gps-ticket-low|medium|high|xhigh.md, each settingeffort:), with the model on the call.--effortoverrides a hint,/gps shipshows and confirms<model>/<effort>per ticket, and/gps auto --delegatetakes them as drafted. Inline mode ignores them. - Decision: no
max. Effort hints stop atxhigh.maxis slow and costly for one small ticket, so/gps writerefuses it (split the ticket, or run it inline under/effort max),--effort maxis a usage error, and a hand-editedmaxruns asinheritwith a warning. See docs/decisions/0001-effort-hints-stop-at-xhigh.md. - Fix: the built-in grill uses the project's own domain docs. It always created
.work/GLOSSARY.mdand.work/adr/, even in a project that already keeps a glossary the mattpocock-skills way, which left a parallel copy.domain-doc.jsnow uses a rootGLOSSARY.md, or aCONTEXT.mdthat reads like a glossary (its name before mattpocock-skills renamed it), points at aGLOSSARY-MAP.md/CONTEXT-MAP.mdinstead of creating anything, and numbers ADRs indocs/adr/when it exists. Newdomain-doc.js whereshows which are in use and flags a.work/copy that duplicates them; the grill runs it first.
2.3.2
- The skill pre-approves each script by name in
allowed-toolsinstead of a wildcard overscripts/, so it runs exactly gps's own scripts without a permission prompt and nothing else. - The icon and the workflow diagram ship as PNGs only; their SVG sources moved to the
design-sourcesbranch. - Token usage is no longer reported: gps stops reading Claude Code's transcripts under
~/.claude/projects/, so it reads nothing outside your project. Phase files and commit logs no longer get a Token Usage section, and an existing one is dropped the next time a script rewrites the file.
2.3.1
- Ready for the Claude plugin directory: listing metadata in
plugin.json(display name, a small-planet GPS icon, documentation, support and privacy links),PRIVACY.md, and a README section on everything gps runs, writes and sends. - The developer notes moved from
CLAUDE.mdto.claude/CLAUDE.md, soclaude plugin validate --strictpasses.
2.3.0
/gps help: where you are, what to run next, the workflow on one screen, and any command explained./gps init: optional first-run setup. It checks the project (git, GitHub, helper skills) and commits gps's.gitignoreentries and config on their own, and can remove a.work/ignore line left by an older version.
2.2.0
.work/is committed as the session record, each time in its ownchore(gps)commit: at the plan write, after each ticket and at/gps finish. Per-machine files stay git-ignored./gps finishcommits the final record and pushes it before switching back to the base branch.- A session committed on a branch that isn't checked out is reported with the branch to switch to.
2.1.0
- Built-in grill when neither
grill-with-docsnorbrainstormingis installed, with a project glossary and ADRs in.work/. /gps shipremembers the ship mode per session.- Scripts are pre-approved for the skill, so they run without a permission prompt.
2.0.0
- Script-first rewrite: every deterministic step (session state, templates, validation, git and gh calls) is a Node.js script; the skill keeps only the judgment steps.
/gps auto(with--delegate),/gps clean,/gps config, issue sessions, ship modes and per-ticket model hints.