[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71CYA445XCZ10K4VZ273CFW":3,"skill-same:01M71CYA445XCZ10K4VZ273CFW":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":26,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":56,"install":57,"resources":69},"01M71CYA445XCZ10K4VZ273CFW","release",null,"Cut a booping plugin release — verify the version bump against the last published tag, draft public-voiced release notes, merge the release branch into master, tag, and publish the GitHub release. Use when cutting a vX.Y.Z release of this repo.","A\u002Fclaude-booping","A","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1410106?v=4","01M71CY7BJSRZG4WCF4HBN33GN","Anton","01M71CY7C72JKG3D0Q2AF9X8ZN",15,"MIT","https:\u002F\u002Fgithub.com\u002FA\u002Fclaude-booping\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Frelease\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"read","version","use","gh","true","repo","github release","master","git","write","cut","merge","notes","publish","Bash","when","release notes","bump","branch","2026-11-10 10:12:30",false,"---\nname: release\ndescription: Cut a booping plugin release — verify the version bump against the last published tag, draft public-voiced release notes, merge the release branch into master, tag, and publish the GitHub release. Use when cutting a vX.Y.Z release of this repo.\nuser-invocable: true\nallowed-tools:\n  - Read\n  - Write\n  - Bash(git:*)\n  - Bash(gh:*)\n  - Bash(jq:*)\n---\n\n# release — cut a booping plugin release\n\nReleases the `booping` plugin from a `release\u002FX.Y.Z` branch: verifies the version, drafts public release notes, merges to `master`, tags `vX.Y.Z`, and publishes the GitHub release.\n\nRun from the repo root with the `release\u002FX.Y.Z` branch checked out. Default branch is **`master`**. Version is single-source in `.claude-plugin\u002Fplugin.json`.\n\n## Preflight — gather facts\n\nRun these read-only; report the resolved values back before doing anything that writes:\n\n```bash\ngit rev-parse --abbrev-ref HEAD                       # current branch — expect release\u002FX.Y.Z\njq -r .version .claude-plugin\u002Fplugin.json             # the version to ship\ngh release list --limit 1                             # last published release\ngit status --porcelain                                # working tree must be clean\ngit remote                                            # remote name — this repo uses `gh`, NOT origin\n```\n\nResolve: `VERSION` (from plugin.json), `TAG = v$VERSION`, `LAST_TAG` (newest existing `v*` tag), `BRANCH`, and `REMOTE` (the single remote — do not assume `origin`; use whatever `git remote` reports). Substitute `$REMOTE` into every push\u002Ffetch\u002Flog-range below.\n\n## Phase 0 — Verify version + previous release\n\nGate every check; if any fails, stop and report — do not proceed to merge.\n\n1. **Clean tree** — `git status --porcelain` is empty. Dirty tree → stop.\n2. **On the release branch** — `BRANCH` is `release\u002F$VERSION`. If it is `master` or a mismatched `release\u002F*`, stop and ask the user to switch.\n3. **Version bumped** — `$VERSION` is strictly greater than `LAST_TAG` (semver). The bump commit follows the convention `chore(booping): bump plugin version \u003Cprev> → $VERSION`; confirm it exists in `git log master..HEAD`. If plugin.json still equals `LAST_TAG`, stop — the bump is missing.\n4. **Tag is free** — `git tag -l \"$TAG\"` and `gh release view \"$TAG\"` both return nothing. An existing tag\u002Frelease → stop (already released).\n5. **Branch is ahead of master** — fetch first (`git fetch $REMOTE`), then `git log $REMOTE\u002Fmaster..HEAD --oneline` is non-empty (there is something to release).\n\nReport the verification result as a short checklist before continuing.\n\n## Phase 1 — Draft release notes\n\nCompute the release contents from the commit range, then write them in the **public voice** described below.\n\n```bash\ngit fetch $REMOTE\ngit log $REMOTE\u002Fmaster..HEAD --oneline        # commits being released\ngit diff --stat $REMOTE\u002Fmaster..HEAD | tail -1\n```\n\nRead the previous release for voice and structure before drafting:\n\n```bash\ngh release view \"$LAST_TAG\"\n```\n\n### Audience tiering (the core rule)\n\nNotes are for **public plugin users**, not contributors. Classify every commit by who touches it, then order the notes user-first:\n\n1. **Lead paragraph** — one or two sentences: what this release is mainly about.\n2. **⚠️ Breaking change** *(only if any)* — what broke, with a **Migration notes** section at the end.\n3. **User-facing feature sections** (`## Title` each) — capabilities the user interacts with: new\u002Fchanged skills (`\u002Fgroom`, `\u002Fdevelop`, `\u002Finstall`, …), vault\u002Fsetup behaviour, workflow changes. Explain these properly — what it does and why it matters to them.\n4. **`## Other changes`** — a compact bullet list (one line each) for everything internal: refactors, schema\u002Fengine internals, docs, test\u002Fbuild plumbing. No deep explanations here.\n\n### Privacy rules\n\n- The **`booping` CLI** (`render`, `transition`, `build`, `vault-commit`, … and `booping-python\u002F` internals) is **private** — users never invoke it directly. Never give CLI work a feature section or a long write-up. A single compact line under **Other changes** (\"refactored the transition engine\", \"improved render performance\") is the most it gets — unless a change is a large, user-visible performance or reliability win, in which case a brief mention in a feature section is acceptable.\n- Build-time plumbing (`src\u002Ffiles\u002F`, `just build`, config_files, CI) is internal — **Other changes** one-liners only.\n- Do not enumerate per-milestone commit messages. Group related commits into one human-readable point.\n\n### Output\n\nWrite the drafted notes to `\u002Ftmp\u002Frelease-notes-$VERSION.md` and present them in chat. Iterate with the user until they explicitly approve. Do not merge or publish before approval.\n\n## Phase 2 — Merge the release branch to master\n\nOnly after the user approves the notes. Detect whether a PR is open and pick the path:\n\n```bash\ngh pr list --head \"release\u002F$VERSION\" --base master --state open --json number,title\n```\n\n- **PR open** → merge it: `gh pr merge \u003Cnumber> --merge` (creates the merge commit on master). Then `git checkout master && git pull $REMOTE master`.\n- **No PR** → direct merge:\n\n  ```bash\n  git checkout master\n  git pull $REMOTE master\n  git merge --no-ff \"release\u002F$VERSION\" -m \"merge release\u002F$VERSION into master\"\n  git push $REMOTE master\n  ```\n\nConfirm the push succeeded and `master` now contains the release commits (`git log $REMOTE\u002Fmaster..HEAD` is empty afterward).\n\n## Phase 3 — Tag and publish\n\nOn `master`, after the merge landed:\n\n```bash\ngit tag \"$TAG\"\ngit push $REMOTE \"$TAG\"\ngh release create \"$TAG\" --title \"$TAG\" --notes-file \"\u002Ftmp\u002Frelease-notes-$VERSION.md\" --latest\n```\n\nThis publishes immediately (per the chosen workflow). Report the release URL `gh release view \"$TAG\" --json url -q .url` back to the user.\n\n## Hard rules\n\n- **Never publish or push without the version-verify gate passing** (Phase 0). A missing or non-incremented bump aborts the release.\n- **Never merge or publish before the user approves the drafted notes.**\n- **The CLI is private** — it never earns a release-notes feature section.\n- Default branch is `master`, not `main`. The git remote is **not** named `origin` — resolve it with `git remote` and use `$REMOTE`. Tags are `vX.Y.Z`. Version source of truth is `.claude-plugin\u002Fplugin.json` only.\n- If any git\u002Fgh command fails mid-flow, stop and surface the exact error — do not retry blindly or force-push.\n","# release — cut a booping plugin release\n\nReleases the `booping` plugin from a `release\u002FX.Y.Z` branch: verifies the version, drafts public release notes, merges to `master`, tags `vX.Y.Z`, and publishes the GitHub release.\n\nRun from the repo root with the `release\u002FX.Y.Z` branch checked out. Default branch is **`master`**. Version is single-source in `.claude-plugin\u002Fplugin.json`.\n\n## Preflight — gather facts\n\nRun these read-only; report the resolved values back before doing anything that writes:\n\n```bash\ngit rev-parse --abbrev-ref HEAD                       # current branch — expect release\u002FX.Y.Z\njq -r .version .claude-plugin\u002Fplugin.json             # the version to ship\ngh release list --limit 1                             # last published release\ngit status --porcelain                                # working tree must be clean\ngit remote                                            # remote name — this repo uses `gh`, NOT origin\n```\n\nResolve: `VERSION` (from plugin.json), `TAG = v$VERSION`, `LAST_TAG` (newest existing `v*` tag), `BRANCH`, and `REMOTE` (the single remote — do not assume `origin`; use whatever `git remote` reports). Substitute `$REMOTE` into every push\u002Ffetch\u002Flog-range below.\n\n## Phase 0 — Verify version + previous release\n\nGate every check; if any fails, stop and report — do not proceed to merge.\n\n1. **Clean tree** — `git status --porcelain` is empty. Dirty tree → stop.\n2. **On the release branch** — `BRANCH` is `release\u002F$VERSION`. If it is `master` or a mismatched `release\u002F*`, stop and ask the user to switch.\n3. **Version bumped** — `$VERSION` is strictly greater than `LAST_TAG` (semver). The bump commit follows the convention `chore(booping): bump plugin version \u003Cprev> → $VERSION`; confirm it exists in `git log master..HEAD`. If plugin.json still equals `LAST_TAG`, stop — the bump is missing.\n4. **Tag is free** — `git tag -l \"$TAG\"` and `gh release view \"$TAG\"` both return nothing. An existing tag\u002Frelease → stop (already released).\n5. **Branch is ahead of master** — fetch first (`git fetch $REMOTE`), then `git log $REMOTE\u002Fmaster..HEAD --oneline` is non-empty (there is something to release).\n\nReport the verification result as a short checklist before continuing.\n\n## Phase 1 — Draft release notes\n\nCompute the release contents from the commit range, then write them in the **public voice** described below.\n\n```bash\ngit fetch $REMOTE\ngit log $REMOTE\u002Fmaster..HEAD --oneline        # commits being released\ngit diff --stat $REMOTE\u002Fmaster..HEAD | tail -1\n```\n\nRead the previous release for voice and structure before drafting:\n\n```bash\ngh release view \"$LAST_TAG\"\n```\n\n### Audience tiering (the core rule)\n\nNotes are for **public plugin users**, not contributors. Classify every commit by who touches it, then order the notes user-first:\n\n1. **Lead paragraph** — one or two sentences: what this release is mainly about.\n2. **⚠️ Breaking change** *(only if any)* — what broke, with a **Migration notes** section at the end.\n3. **User-facing feature sections** (`## Title` each) — capabilities the user interacts with: new\u002Fchanged skills (`\u002Fgroom`, `\u002Fdevelop`, `\u002Finstall`, …), vault\u002Fsetup behaviour, workflow changes. Explain these properly — what it does and why it matters to them.\n4. **`## Other changes`** — a compact bullet list (one line each) for everything internal: refactors, schema\u002Fengine internals, docs, test\u002Fbuild plumbing. No deep explanations here.\n\n### Privacy rules\n\n- The **`booping` CLI** (`render`, `transition`, `build`, `vault-commit`, … and `booping-python\u002F` internals) is **private** — users never invoke it directly. Never give CLI work a feature section or a long write-up. A single compact line under **Other changes** (\"refactored the transition engine\", \"improved render performance\") is the most it gets — unless a change is a large, user-visible performance or reliability win, in which case a brief mention in a feature section is acceptable.\n- Build-time plumbing (`src\u002Ffiles\u002F`, `just build`, config_files, CI) is internal — **Other changes** one-liners only.\n- Do not enumerate per-milestone commit messages. Group related commits into one human-readable point.\n\n### Output\n\nWrite the drafted notes to `\u002Ftmp\u002Frelease-notes-$VERSION.md` and present them in chat. Iterate with the user until they explicitly approve. Do not merge or publish before approval.\n\n## Phase 2 — Merge the release branch to master\n\nOnly after the user approves the notes. Detect whether a PR is open and pick the path:\n\n```bash\ngh pr list --head \"release\u002F$VERSION\" --base master --state open --json number,title\n```\n\n- **PR open** → merge it: `gh pr merge \u003Cnumber> --merge` (creates the merge commit on master). Then `git checkout master && git pull $REMOTE master`.\n- **No PR** → direct merge:\n\n  ```bash\n  git checkout master\n  git pull $REMOTE master\n  git merge --no-ff \"release\u002F$VERSION\" -m \"merge release\u002F$VERSION into master\"\n  git push $REMOTE master\n  ```\n\nConfirm the push succeeded and `master` now contains the release commits (`git log $REMOTE\u002Fmaster..HEAD` is empty afterward).\n\n## Phase 3 — Tag and publish\n\nOn `master`, after the merge landed:\n\n```bash\ngit tag \"$TAG\"\ngit push $REMOTE \"$TAG\"\ngh release create \"$TAG\" --title \"$TAG\" --notes-file \"\u002Ftmp\u002Frelease-notes-$VERSION.md\" --latest\n```\n\nThis publishes immediately (per the chosen workflow). Report the release URL `gh release view \"$TAG\" --json url -q .url` back to the user.\n\n## Hard rules\n\n- **Never publish or push without the version-verify gate passing** (Phase 0). A missing or non-incremented bump aborts the release.\n- **Never merge or publish before the user approves the drafted notes.**\n- **The CLI is private** — it never earns a release-notes feature section.\n- Default branch is `master`, not `main`. The git remote is **not** named `origin` — resolve it with `git remote` and use `$REMOTE`. Tags are `vX.Y.Z`. Version source of truth is `.claude-plugin\u002Fplugin.json` only.\n- If any git\u002Fgh command fails mid-flow, stop and surface the exact error — do not retry blindly or force-push.\n",{"name":5,"description":7,"allowed-tools":43,"user-invocable":49},[44,45,46,47,48],"Read","Write","Bash(git:*)","Bash(gh:*)","Bash(jq:*)",true,"75b096c11477e344f1326a4e22656deb5aee4d16",".claude\u002Fskills\u002Frelease",2,"https:\u002F\u002Fgithub.com\u002FA\u002Fclaude-booping","https:\u002F\u002Fa.github.io\u002Fclaude-booping\u002F","https:\u002F\u002Fgithub.com\u002FA","2026-10-23 01:15:09",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":49},[59,62,65],{"tool":60,"command":61},"npx","npx skills add A\u002Fclaude-booping --skill release",{"tool":63,"command":64},"bunx","bunx skills add A\u002Fclaude-booping --skill release",{"tool":66,"command":67},"pnpm","pnpm dlx skills add A\u002Fclaude-booping --skill release","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FA\u002Fclaude-booping\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Frelease\u002FSKILL.md",[],[71,94,111],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":38},"01M71CYF69M6GDHBX24TC486YT","playbook","Run a user-authored playbook from the vault: a multi-step guided procedure. Lists available global and local playbooks, selects one by trigger, and drives its steps in order — spawning per-step sub-agents or running inline, pausing at review gates.","https:\u002F\u002Fgithub.com\u002FA\u002Fclaude-booping\u002Fblob\u002Fmaster\u002Fskills\u002Fplaybook\u002FSKILL.md",[],[73,78,79,80,81,82,83,84,85,86,87,88,19,89,90,33,23,91,92,93],"one","user","gates","review","multi","order","inline","vault","run","name","at","review gates","steps","local","trigger","running",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":105,"publishedAt":38},"01M71CYDMAFE968ZF6QZGBQV6T","sample-skill","A sample skill for testing","https:\u002F\u002Fgithub.com\u002FA\u002Fclaude-booping\u002Fblob\u002Fmaster\u002Fbooping-python\u002Ftests\u002F__fixtures__\u002Fplugin-root-minimal\u002Fskills\u002Fsample-skill\u002FSKILL.md",[100],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[106,107,108,33,23,27,109,110],"sample skill","sample","opus","testing","for",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":123,"publishedAt":38},"01M71CYCB1556HT7ZY3JD60HDF","debug-skill","A skill with debug mode enabled","https:\u002F\u002Fgithub.com\u002FA\u002Fclaude-booping\u002Fblob\u002Fmaster\u002Fbooping-python\u002Ftests\u002F__fixtures__\u002Fplugin-root-minimal\u002Fskills\u002Fdebug-skill\u002FSKILL.md",[117,118],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},{"categoryNo":119,"categoryName":120,"taxonomyType":121,"taxonomyTypeDesc":122},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[124,125,126,127,128,129],"debug skill","debug","false","a skill","mode","with"]