Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
abce47c
chore(automatic-version-cut-ship-user-decision-2026-08-26-make): reco…
Aug 26, 2026
0cdbf73
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): creat…
Aug 26, 2026
9d3118e
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): compl…
Aug 26, 2026
2be4f8f
chore(automatic-version-cut-ship-user-decision-2026-08-26-make): reco…
Aug 26, 2026
27cb9be
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): creat…
Aug 26, 2026
402a2c7
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): compl…
Aug 26, 2026
ca65b1f
chore(automatic-version-cut-ship-user-decision-2026-08-26-make): reco…
Aug 26, 2026
400c927
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): creat…
Aug 26, 2026
c5c96ab
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): compl…
Aug 26, 2026
f83fc2c
chore(automatic-version-cut-ship-user-decision-2026-08-26-make): reco…
Aug 26, 2026
c9be003
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): resea…
Aug 26, 2026
a4580dc
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): compl…
Aug 26, 2026
d4271ca
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): add M…
Aug 26, 2026
cf92a28
chore(automatic-version-cut-ship-user-decision-2026-08-26-make): reco…
Aug 26, 2026
f3b0434
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): creat…
Aug 26, 2026
95f9869
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): compl…
Aug 26, 2026
b058645
chore(automatic-version-cut-ship-user-decision-2026-08-26-make): reco…
Aug 26, 2026
b5944c9
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): creat…
Aug 26, 2026
916686c
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): compl…
Aug 26, 2026
b98e481
feat(automatic-version-cut-ship-user-decision-2026-08-26-make): add o…
Aug 26, 2026
4fb2cef
feat(automatic-version-cut-ship-user-decision-2026-08-26-make): rewri…
Aug 26, 2026
0b77524
feat(automatic-version-cut-ship-user-decision-2026-08-26-make): widen…
Aug 26, 2026
dc6937d
feat(automatic-version-cut-ship-user-decision-2026-08-26-make): add c…
Aug 26, 2026
14dc0b7
test(automatic-version-cut-ship-user-decision-2026-08-26-make): grep-…
Aug 26, 2026
b0ce16b
feat(automatic-version-cut-ship-user-decision-2026-08-26-make): scaff…
Aug 26, 2026
8f552d9
feat(automatic-version-cut-ship-user-decision-2026-08-26-make): make …
Aug 26, 2026
0cdb0a4
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): imple…
Aug 26, 2026
5d63cc7
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): compl…
Aug 26, 2026
5d22a02
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): merge…
Aug 26, 2026
9d1a2da
fix(automatic-version-cut-ship-user-decision-2026-08-26-make): review…
Aug 26, 2026
8d40b0a
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): verif…
Aug 26, 2026
2e69be0
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): compl…
Aug 26, 2026
5b69eca
chore(automatic-version-cut-ship-user-decision-2026-08-26-make): arch…
Aug 26, 2026
e8accc1
chore(automatic-version-cut-ship-user-decision-2026-08-26-make): rege…
Aug 26, 2026
b759e6a
docs(automatic-version-cut-ship-user-decision-2026-08-26-make): UAT r…
Aug 26, 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
2 changes: 1 addition & 1 deletion .claude/hooks/metta-guard-bash.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ const BLOCKED_TWO_WORD = new Map([
['milestone', new Set(['create', 'close', 'update'])],
['roadmap', new Set(['add', 'reorder', 'next', 'remove'])],
// `release cut` mutates state (version bump, tag, release commit) — Tier-2 scope
// key 'release:cut', minted only by the metta-release skill.
// key 'release:cut', minted by the metta-release and metta-fix-gap skills.
['release', new Set(['cut'])],
]);

Expand Down
2 changes: 1 addition & 1 deletion .claude/hooks/metta-session-mint.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const SKILL_SCOPES = {
// Milestone mutation scopes mint only via metta-backlog; future ship/finalize-driven
// closers need their own scope extension here rather than reusing this one.
'metta-backlog': ['backlog:add', 'backlog:done', 'backlog:promote', 'backlog:migrate', 'milestone:create', 'milestone:close', 'milestone:update'],
'metta-fix-gap': ['fix-gap', 'complete', 'finalize'],
'metta-fix-gap': ['fix-gap', 'complete', 'finalize', 'release:cut'],
'metta-roadmap': ['roadmap:add', 'roadmap:reorder', 'roadmap:next', 'roadmap:remove'],
'metta-release': ['release:cut'],
};
Expand Down
13 changes: 13 additions & 0 deletions .claude/skills/metta-auto/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,19 @@ This gate governs steps 12–13 and the step 14 cleanup: a failed gate stops the
12. `gh pr checks <pr-number> --watch --fail-fast` → wait for all CI checks on the PR to complete before merging. If any check fails or is cancelled, do NOT merge — report the failing check(s) and the PR URL to the user and stop. If gh reports that no checks are reported yet (checks can lag PR creation by a few seconds), wait ~10s and retry the command
13. `gh pr merge <pr-number> --merge` → land the PR immediately, unless the user asked to leave it open for review — in that case stop here and report the PR URL instead of merging
14. Back on `main`: `git pull --ff-only`, then clean up the change branch and worktree

### Post-merge release stage

Post-merge release stage (runs only after the user-approved PR merge, git pull --ff-only, and dist rebuild — never at a PR-open hand-back): resolve the effective release.on_ship mode via metta release status --json, and on auto (or a confirmed prompt) derive the bump, run metta release cut --bump <level> --yes --json, push the release commit and tag with git push --follow-tags origin main, then — only when githubRelease is true — probe gh release view <tag> and publish with gh release create <tag> --verify-tag --notes-file -, treating every failure in this stage as warn-and-continue: report what failed, state that /metta-release cuts it on demand, and never unwind or block the completed ship.

- **Absent config:** if `metta release status --json` fails with `Release configuration is missing`, emit exactly one loud line — `notice: release config absent — skipping the post-merge release cut (configure release: in .metta/config.yaml to enable)` — and continue to hand-back. Not an error, never a ship blocker. Any *other* status failure is warn-and-continue.
- **`off`:** stop the stage immediately; no derivation, no cut, no gh — behavior identical to pre-change ships.
- **`prompt`:** report `<unreleasedChanges> unreleased change(s), recommended bump: <recommendedBump>` and ask via AskUserQuestion **when the context can ask**; in any context that cannot collect an answer (forked skill execution, non-interactive run), fail closed — skip the cut and emit a loud notice that prompt mode could not ask. Decline = no cut, backlog stays for `/metta-release`. Confirm = proceed identically to `auto`.
- **Pre-1.0 major guard:** when `version` < 1.0.0, `recommendedBump` is `major`, and `allowMajorPre1` is `false` → cut `minor` instead and prominently report both the original major derivation and the downgrade ("pre-1.0: derived major downgraded to minor; set release.allow_major_pre_1: true to allow"). `allowMajorPre1: true` or version ≥ 1.0.0 → apply as derived. All three inputs come from the status `--json` echo.
- **Cut:** `metta release cut --bump <level> --yes --json`; on success parse `version`, `tag`, `notes`; the ship report MUST state the released version.
- **Push:** `git push --follow-tags origin main` — the single authorized main push carrying the release commit and tag; never `--force`, never a second unconfirmed push.
- **gh publish (only when `githubRelease` is true):** probe `gh release view <tag>`; if it exists, skip creation (idempotent). Otherwise `gh release create <tag> --verify-tag --title <tag> --notes-file -` with the `notes` string from cut `--json` fed on stdin via a quoted heredoc. Any gh failure (missing binary, unauthenticated, create error): warn naming the cause and the exact manual command `gh release create <tag> --verify-tag`, then continue. `githubRelease: false` → no `gh release` command at all.

15. Report results to user

## Critical: You MUST review, verify, finalize, and ship
Expand Down
12 changes: 12 additions & 0 deletions .claude/skills/metta-fix-gap/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,18 @@ The `## UAT results` section (identical shape in body and comment):
d. `gh pr merge <pr-number> --merge` → land the PR immediately, unless the user asked to leave it open for review — in that case stop here and report the PR URL instead of merging
e. Back on `main`: `git pull --ff-only`, then clean up the change branch and worktree

### Post-merge release stage

Post-merge release stage (runs only after the user-approved PR merge, git pull --ff-only, and dist rebuild — never at a PR-open hand-back): resolve the effective release.on_ship mode via metta release status --json, and on auto (or a confirmed prompt) derive the bump, run metta release cut --bump <level> --yes --json, push the release commit and tag with git push --follow-tags origin main, then — only when githubRelease is true — probe gh release view <tag> and publish with gh release create <tag> --verify-tag --notes-file -, treating every failure in this stage as warn-and-continue: report what failed, state that /metta-release cuts it on demand, and never unwind or block the completed ship.

- **Absent config:** if `metta release status --json` fails with `Release configuration is missing`, emit exactly one loud line — `notice: release config absent — skipping the post-merge release cut (configure release: in .metta/config.yaml to enable)` — and continue to hand-back. Not an error, never a ship blocker. Any *other* status failure is warn-and-continue.
- **`off`:** stop the stage immediately; no derivation, no cut, no gh — behavior identical to pre-change ships.
- **`prompt`:** report `<unreleasedChanges> unreleased change(s), recommended bump: <recommendedBump>` and ask via AskUserQuestion **when the context can ask**; in any context that cannot collect an answer (forked skill execution, non-interactive run), fail closed — skip the cut and emit a loud notice that prompt mode could not ask. Decline = no cut, backlog stays for `/metta-release`. Confirm = proceed identically to `auto`.
- **Pre-1.0 major guard:** when `version` < 1.0.0, `recommendedBump` is `major`, and `allowMajorPre1` is `false` → cut `minor` instead and prominently report both the original major derivation and the downgrade ("pre-1.0: derived major downgraded to minor; set release.allow_major_pre_1: true to allow"). `allowMajorPre1: true` or version ≥ 1.0.0 → apply as derived. All three inputs come from the status `--json` echo.
- **Cut:** `metta release cut --bump <level> --yes --json`; on success parse `version`, `tag`, `notes`; the ship report MUST state the released version.
- **Push:** `git push --follow-tags origin main` — the single authorized main push carrying the release commit and tag; never `--force`, never a second unconfirmed push.
- **gh publish (only when `githubRelease` is true):** probe `gh release view <tag>`; if it exists, skip creation (idempotent). Otherwise `gh release create <tag> --verify-tag --title <tag> --notes-file -` with the `notes` string from cut `--json` fed on stdin via a quoted heredoc. Any gh failure (missing binary, unauthenticated, create error): warn naming the cause and the exact manual command `gh release create <tag> --verify-tag`, then continue. `githubRelease: false` → no `gh release` command at all.

11. **Remove Gap** — `metta gaps remove <gap-slug> --json` → archives gap to `spec/archive/` then removes from `spec/gaps/`. A blocked UAT gate leaves the gap file in place — gap removal only happens after a passed gate and a completed merge.

## --all Mode (batch processing)
Expand Down
12 changes: 12 additions & 0 deletions .claude/skills/metta-fix-issues/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,18 @@ The `## UAT results` section (identical shape in body and comment):
d. `gh pr merge <pr-number> --merge` → land the PR immediately, unless the user asked to leave it open for review — in that case stop here and report the PR URL instead of merging
e. Back on `main`: `git pull --ff-only`, then clean up the change branch and worktree

### Post-merge release stage

Post-merge release stage (runs only after the user-approved PR merge, git pull --ff-only, and dist rebuild — never at a PR-open hand-back): resolve the effective release.on_ship mode via metta release status --json, and on auto (or a confirmed prompt) derive the bump, run metta release cut --bump <level> --yes --json, push the release commit and tag with git push --follow-tags origin main, then — only when githubRelease is true — probe gh release view <tag> and publish with gh release create <tag> --verify-tag --notes-file -, treating every failure in this stage as warn-and-continue: report what failed, state that /metta-release cuts it on demand, and never unwind or block the completed ship.

- **Absent config:** if `metta release status --json` fails with `Release configuration is missing`, emit exactly one loud line — `notice: release config absent — skipping the post-merge release cut (configure release: in .metta/config.yaml to enable)` — and continue to hand-back. Not an error, never a ship blocker. Any *other* status failure is warn-and-continue.
- **`off`:** stop the stage immediately; no derivation, no cut, no gh — behavior identical to pre-change ships.
- **`prompt`:** report `<unreleasedChanges> unreleased change(s), recommended bump: <recommendedBump>` and ask via AskUserQuestion **when the context can ask**; in any context that cannot collect an answer (forked skill execution, non-interactive run), fail closed — skip the cut and emit a loud notice that prompt mode could not ask. Decline = no cut, backlog stays for `/metta-release`. Confirm = proceed identically to `auto`.
- **Pre-1.0 major guard:** when `version` < 1.0.0, `recommendedBump` is `major`, and `allowMajorPre1` is `false` → cut `minor` instead and prominently report both the original major derivation and the downgrade ("pre-1.0: derived major downgraded to minor; set release.allow_major_pre_1: true to allow"). `allowMajorPre1: true` or version ≥ 1.0.0 → apply as derived. All three inputs come from the status `--json` echo.
- **Cut:** `metta release cut --bump <level> --yes --json`; on success parse `version`, `tag`, `notes`; the ship report MUST state the released version.
- **Push:** `git push --follow-tags origin main` — the single authorized main push carrying the release commit and tag; never `--force`, never a second unconfirmed push.
- **gh publish (only when `githubRelease` is true):** probe `gh release view <tag>`; if it exists, skip creation (idempotent). Otherwise `gh release create <tag> --verify-tag --title <tag> --notes-file -` with the `notes` string from cut `--json` fed on stdin via a quoted heredoc. Any gh failure (missing binary, unauthenticated, create error): warn naming the cause and the exact manual command `gh release create <tag> --verify-tag`, then continue. `githubRelease: false` → no `gh release` command at all.

11. **Remove Issue** — `metta fix-issue --remove-issue <issue-slug> --json` → archives issue to `spec/issues/resolved/` then removes from `spec/issues/`. Resolution preserves any frontmatter (priority/order/milestone) through `spec/issues/resolved/` — no skill-side action needed. A blocked UAT gate leaves the issue file in place — issue removal only happens after a passed gate and a completed merge.

## --all Mode (batch processing)
Expand Down
13 changes: 13 additions & 0 deletions .claude/skills/metta-propose/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,19 @@ The `## UAT results` section (identical shape in body and comment):
e. `gh pr checks <pr-number> --watch --fail-fast` → wait for all CI checks on the PR to complete before merging. If any check fails or is cancelled, do NOT merge — report the failing check(s) and the PR URL to the user and stop. If gh reports that no checks are reported yet (checks can lag PR creation by a few seconds), wait ~10s and retry the command
f. `gh pr merge <pr-number> --merge` → land the PR
g. Back on `main`: `git pull --ff-only`, then clean up the change branch and worktree

### Post-merge release stage

Post-merge release stage (runs only after the user-approved PR merge, git pull --ff-only, and dist rebuild — never at a PR-open hand-back): resolve the effective release.on_ship mode via metta release status --json, and on auto (or a confirmed prompt) derive the bump, run metta release cut --bump <level> --yes --json, push the release commit and tag with git push --follow-tags origin main, then — only when githubRelease is true — probe gh release view <tag> and publish with gh release create <tag> --verify-tag --notes-file -, treating every failure in this stage as warn-and-continue: report what failed, state that /metta-release cuts it on demand, and never unwind or block the completed ship.

- **Absent config:** if `metta release status --json` fails with `Release configuration is missing`, emit exactly one loud line — `notice: release config absent — skipping the post-merge release cut (configure release: in .metta/config.yaml to enable)` — and continue to hand-back. Not an error, never a ship blocker. Any *other* status failure is warn-and-continue.
- **`off`:** stop the stage immediately; no derivation, no cut, no gh — behavior identical to pre-change ships.
- **`prompt`:** report `<unreleasedChanges> unreleased change(s), recommended bump: <recommendedBump>` and ask via AskUserQuestion **when the context can ask**; in any context that cannot collect an answer (forked skill execution, non-interactive run), fail closed — skip the cut and emit a loud notice that prompt mode could not ask. Decline = no cut, backlog stays for `/metta-release`. Confirm = proceed identically to `auto`.
- **Pre-1.0 major guard:** when `version` < 1.0.0, `recommendedBump` is `major`, and `allowMajorPre1` is `false` → cut `minor` instead and prominently report both the original major derivation and the downgrade ("pre-1.0: derived major downgraded to minor; set release.allow_major_pre_1: true to allow"). `allowMajorPre1: true` or version ≥ 1.0.0 → apply as derived. All three inputs come from the status `--json` echo.
- **Cut:** `metta release cut --bump <level> --yes --json`; on success parse `version`, `tag`, `notes`; the ship report MUST state the released version.
- **Push:** `git push --follow-tags origin main` — the single authorized main push carrying the release commit and tag; never `--force`, never a second unconfirmed push.
- **gh publish (only when `githubRelease` is true):** probe `gh release view <tag>`; if it exists, skip creation (idempotent). Otherwise `gh release create <tag> --verify-tag --title <tag> --notes-file -` with the `notes` string from cut `--json` fed on stdin via a quoted heredoc. Any gh failure (missing binary, unauthenticated, create error): warn naming the cause and the exact manual command `gh release create <tag> --verify-tag`, then continue. `githubRelease: false` → no `gh release` command at all.

9. Report to user what was done

## Critical: verify, finalize, and open the PR
Expand Down
13 changes: 13 additions & 0 deletions .claude/skills/metta-quick/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,19 @@ On a failed gate, still run steps 11–12 so the failure is visible on GitHub, t
13. `gh pr checks <pr-number> --watch --fail-fast` → wait for all CI checks on the PR to complete before merging. If any check fails or is cancelled, do NOT merge — report the failing check(s) and the PR URL to the user and stop. If gh reports that no checks are reported yet (checks can lag PR creation by a few seconds), wait ~10s and retry the command
14. `gh pr merge <pr-number> --merge` → land the PR immediately, unless the user asked to leave it open for review — in that case stop here and report the PR URL instead of merging
15. Back on `main`: `git pull --ff-only`, then clean up the change branch and worktree

### Post-merge release stage

Post-merge release stage (runs only after the user-approved PR merge, git pull --ff-only, and dist rebuild — never at a PR-open hand-back): resolve the effective release.on_ship mode via metta release status --json, and on auto (or a confirmed prompt) derive the bump, run metta release cut --bump <level> --yes --json, push the release commit and tag with git push --follow-tags origin main, then — only when githubRelease is true — probe gh release view <tag> and publish with gh release create <tag> --verify-tag --notes-file -, treating every failure in this stage as warn-and-continue: report what failed, state that /metta-release cuts it on demand, and never unwind or block the completed ship.

- **Absent config:** if `metta release status --json` fails with `Release configuration is missing`, emit exactly one loud line — `notice: release config absent — skipping the post-merge release cut (configure release: in .metta/config.yaml to enable)` — and continue to hand-back. Not an error, never a ship blocker. Any *other* status failure is warn-and-continue.
- **`off`:** stop the stage immediately; no derivation, no cut, no gh — behavior identical to pre-change ships.
- **`prompt`:** report `<unreleasedChanges> unreleased change(s), recommended bump: <recommendedBump>` and ask via AskUserQuestion **when the context can ask**; in any context that cannot collect an answer (forked skill execution, non-interactive run), fail closed — skip the cut and emit a loud notice that prompt mode could not ask. Decline = no cut, backlog stays for `/metta-release`. Confirm = proceed identically to `auto`.
- **Pre-1.0 major guard:** when `version` < 1.0.0, `recommendedBump` is `major`, and `allowMajorPre1` is `false` → cut `minor` instead and prominently report both the original major derivation and the downgrade ("pre-1.0: derived major downgraded to minor; set release.allow_major_pre_1: true to allow"). `allowMajorPre1: true` or version ≥ 1.0.0 → apply as derived. All three inputs come from the status `--json` echo.
- **Cut:** `metta release cut --bump <level> --yes --json`; on success parse `version`, `tag`, `notes`; the ship report MUST state the released version.
- **Push:** `git push --follow-tags origin main` — the single authorized main push carrying the release commit and tag; never `--force`, never a second unconfirmed push.
- **gh publish (only when `githubRelease` is true):** probe `gh release view <tag>`; if it exists, skip creation (idempotent). Otherwise `gh release create <tag> --verify-tag --title <tag> --notes-file -` with the `notes` string from cut `--json` fed on stdin via a quoted heredoc. Any gh failure (missing binary, unauthenticated, create error): warn naming the cause and the exact manual command `gh release create <tag> --verify-tag`, then continue. `githubRelease: false` → no `gh release` command at all.

16. Report to user what was done

## Critical: You MUST complete ALL steps
Expand Down
Loading
Loading