[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C24TSQ8F73SBVP3T7PHZ2X":3,"skill-same:01M6C24TSQ8F73SBVP3T7PHZ2X":53},{"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":25,"linkOnly":26,"markdownContent":27,"markdownBody":28,"frontMatter":29,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":36,"ownerDescription":37,"updatedAt":38,"install":39,"resources":52},"01M6C24TSQ8F73SBVP3T7PHZ2X","creating-a-release",null,"Cut, tag, and publish a new release of this project using release-it. Use when asked to create, cut, tag, or publish a release, or bump the project version.","limenet\u002Flaravel-baseline","limenet","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F474329?v=4","01M6C245N93511GTPJXWYT8EN8","Linus Metzler","01M6C245S4JHJBWSJB6XP1W5K3",2,"MIT","https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline\u002Fblob\u002Fmain\u002Fresources\u002Fstandalone\u002Fskills\u002Fcreating-a-release\u002FSKILL.md",[],[19,20,21,22,23,24],"release","creating a release","create","publish","use","version","2026-11-10 10:12:30",false,"---\nname: creating-a-release\ndescription: Cut, tag, and publish a new release of this project using release-it. Use when asked to create, cut, tag, or publish a release, or bump the project version.\n---\n\n# Creating a release\n\nThis project (per the [limenet\u002Flaravel-baseline](https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline)\nstandards) releases with [release-it](https:\u002F\u002Fgithub.com\u002Frelease-it\u002Frelease-it) and the\n`@release-it\u002Fbumper` plugin. Versioning is semantic and the canonical version lives in\n`composer.json`.\n\n## When to use this skill\n\nUse this when the task is to create, cut, tag, or publish a new release — or otherwise bump the\nproject's version.\n\n## How to release\n\nA release is often started and then left to run unattended — waiting for CI can take a while, and\nthe user may have walked away by the time it ends. So **every question is asked in step 1, before\nany waiting starts.** From step 2 on, do not ask the user anything: whatever would need them then\nis a stop, reported once the task ends.\n\nWork through the steps in order. Do not start the release until step 2 says CI is green.\n\n### 1. Settle everything up front\n\nGather what follows, then put every open question to the user in **one** `AskUserQuestion` call\n(it takes up to four questions). Only once all of them are answered move on to step 2.\n\n1. **Clean working tree.** release-it refuses to run on uncommitted changes. If\n   `git status --porcelain` prints anything, ask how to resolve it — do not commit or stash on\n   the user's behalf.\n2. **Has CI seen `HEAD`?** `git fetch`, then compare `git rev-parse HEAD` with\n   `git rev-parse @{u}`. If `HEAD` has commits the remote does not, no pipeline covers them yet —\n   ask whether to push them.\n3. **The version increment.** How the next version is chosen depends on whether the project uses\n   [Conventional Commits](https:\u002F\u002Fwww.conventionalcommits.org\u002F). It does when `.release-it.json`\n   configures the `@release-it\u002Fconventional-changelog` plugin — check the file, not the commit log.\n\n   - **Conventional Commits** — release-it derives the increment from the commits since the last\n     tag. Pass no increment and ask nothing, unless the user explicitly asked for a specific one.\n   - **No Conventional Commits** — release-it has nothing to derive the increment from, so it has\n     to come from the user. If the request already names `major`, `minor`, or `patch`, use that.\n     Otherwise ask with `AskUserQuestion` — never a plain-text question, which an unattended run\n     would leave sitting in the transcript. Read what is being released first:\n\n     ```bash\n     git log \"$(git describe --tags --abbrev=0)\"..HEAD --oneline\n     ```\n\n     Offer `major`, `minor` and `patch` as the options, put the increment semver suggests for those\n     commits first and mark it `(Recommended)`, and summarise the commits in the question. Do not\n     pick one on the user's behalf.\n4. **Credentials.** Make sure nothing will fail for want of a login after the wait:\n   - the CI CLI for the remote (`git remote get-url origin`) is authenticated — `gh auth status`\n     or `glab auth status`;\n   - the token release-it needs for the remote release is set — `GITHUB_TOKEN` when\n     `.release-it.json` enables `github.release`, `GITLAB_TOKEN` when it enables\n     `gitlab.release`. Check that the variable is non-empty; never print it.\n\n   If either is missing, ask the user to fix it now.\n\nIf the user chose to push, push now — the pipeline that push starts is the one step 2 waits for.\n\n### 2. Wait for CI to be green\n\nA release tags whatever `HEAD` is, so that commit has to have passed CI first.\n\n1. Look up the pipeline for the branch with the CLI matching the remote:\n\n   **GitLab** (`glab`):\n\n   ```bash\n   branch=$(git branch --show-current)\n   glab ci get --branch \"$branch\" --output json --jq '{sha, status}'\n   ```\n\n   If the status is still running (`created`, `waiting_for_resource`, `preparing`, `pending`,\n   `running`, `scheduled`), block until it ends, then read the status again:\n\n   ```bash\n   glab ci status --branch \"$branch\" --wait\n   glab ci get --branch \"$branch\" --output json --jq '{sha, status}'\n   ```\n\n   **GitHub** (`gh`) — one push can start several workflow runs, so check all of them for `HEAD`:\n\n   ```bash\n   gh run list --branch \"$(git branch --show-current)\" --commit \"$(git rev-parse HEAD)\" \\\n     --json databaseId,name,status,conclusion\n   ```\n\n   For every run whose `status` is not `completed`, wait for it:\n\n   ```bash\n   gh run watch \u003CdatabaseId> --exit-status\n   ```\n\n2. Release only when the pipeline for `HEAD` is green — GitLab `success`, or every GitHub run\n   concluded `success` (`skipped` \u002F `neutral` are fine). If it failed or was cancelled, **stop**:\n   report the failing job to the user and do not release.\n\n   If nothing ran for `HEAD` itself — workflow path filters can skip a commit, and GitLab's\n   pipeline `sha` may then belong to an earlier one — the latest pipeline on the branch is the\n   gate instead and has to be green. If the project has no CI at all, say so and proceed.\n\n### 3. Run the release\n\nRun release-it non-interactively — its prompts need a terminal an agent cannot answer. `--ci`\nskips them, and the increment argument stands in for the version prompt:\n\n```bash\n# Conventional Commits, no explicit increment\nnpm run release -- --ci\n\n# Otherwise (or to override), with the increment from step 1\nnpm run release -- minor --ci\n```\n\n`release-it` handles the version bump, git tag, commit, and (if configured) the remote release.\nThe `@release-it\u002Fbumper` plugin writes the chosen version into the `version` field of\n`composer.json`, keeping it the single source of truth. In a WordPress theme an `after:bump` hook\nthen rewrites the `Version:` header of `style.css` to match, so the theme WordPress sees carries the\nsame version and the change lands in the release commit.\n\n### 4. Watch the tag pipeline\n\nPushing the tag usually starts a pipeline of its own — the one that builds, publishes or deploys\nthe release — so the task is not done when release-it exits. Watch it the same way as in step 2,\nfor the tag's commit:\n\n```bash\ntag=$(git describe --tags --abbrev=0)\n```\n\n**GitLab** — the tag is a ref like a branch:\n\n```bash\nglab ci status --branch \"$tag\" --wait\nglab ci get --branch \"$tag\" --output json --jq '{sha, status}'\n```\n\n**GitHub** — list every run for the tagged commit and `gh run watch \u003CdatabaseId> --exit-status`\neach one not yet `completed`:\n\n```bash\ngh run list --commit \"$(git rev-list -n 1 \"$tag\")\" --json databaseId,name,event,headBranch,status,conclusion\n```\n\nA pipeline can take a few seconds to appear after the push; if none shows up, check again a\ncouple of times over about a minute before concluding the project runs nothing on tags — then say\nso. Report the outcome either way. If the tag pipeline fails, report the failing job and stop: the\ntag is already public, so do **not** delete, move or re-create it — fixing the failure is a\nseparate change.\n\n## Conventions\n\n- **Semantic versioning.** The next version is patch \u002F minor \u002F major per semver, chosen as in\n  step 1.\n- **`composer.json` `version` is authoritative.** Do not hand-edit it for a release — let\n  `npm run release` \u002F `@release-it\u002Fbumper` set it.\n- **Never release on red.** A failed or cancelled pipeline for `HEAD` ends the task; fixing it is\n  a separate change.\n- **A release ends with its tag pipeline.** Report how the pipeline the tag started finished, not\n  just that release-it exited.\n\n## Configuration reference\n\nThe relevant config the baseline enforces:\n\n- `package.json` → `scripts.release` = `\"release-it\"`\n- `.release-it.json` → `plugins['@release-it\u002Fbumper'].out` = `{ \"file\": \"composer.json\", \"path\": \"version\" }`\n- WordPress themes: `.release-it.json` → `hooks['after:bump']` includes a command rewriting the\n  `Version:` header of `style.css`\n","# Creating a release\n\nThis project (per the [limenet\u002Flaravel-baseline](https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline)\nstandards) releases with [release-it](https:\u002F\u002Fgithub.com\u002Frelease-it\u002Frelease-it) and the\n`@release-it\u002Fbumper` plugin. Versioning is semantic and the canonical version lives in\n`composer.json`.\n\n## When to use this skill\n\nUse this when the task is to create, cut, tag, or publish a new release — or otherwise bump the\nproject's version.\n\n## How to release\n\nA release is often started and then left to run unattended — waiting for CI can take a while, and\nthe user may have walked away by the time it ends. So **every question is asked in step 1, before\nany waiting starts.** From step 2 on, do not ask the user anything: whatever would need them then\nis a stop, reported once the task ends.\n\nWork through the steps in order. Do not start the release until step 2 says CI is green.\n\n### 1. Settle everything up front\n\nGather what follows, then put every open question to the user in **one** `AskUserQuestion` call\n(it takes up to four questions). Only once all of them are answered move on to step 2.\n\n1. **Clean working tree.** release-it refuses to run on uncommitted changes. If\n   `git status --porcelain` prints anything, ask how to resolve it — do not commit or stash on\n   the user's behalf.\n2. **Has CI seen `HEAD`?** `git fetch`, then compare `git rev-parse HEAD` with\n   `git rev-parse @{u}`. If `HEAD` has commits the remote does not, no pipeline covers them yet —\n   ask whether to push them.\n3. **The version increment.** How the next version is chosen depends on whether the project uses\n   [Conventional Commits](https:\u002F\u002Fwww.conventionalcommits.org\u002F). It does when `.release-it.json`\n   configures the `@release-it\u002Fconventional-changelog` plugin — check the file, not the commit log.\n\n   - **Conventional Commits** — release-it derives the increment from the commits since the last\n     tag. Pass no increment and ask nothing, unless the user explicitly asked for a specific one.\n   - **No Conventional Commits** — release-it has nothing to derive the increment from, so it has\n     to come from the user. If the request already names `major`, `minor`, or `patch`, use that.\n     Otherwise ask with `AskUserQuestion` — never a plain-text question, which an unattended run\n     would leave sitting in the transcript. Read what is being released first:\n\n     ```bash\n     git log \"$(git describe --tags --abbrev=0)\"..HEAD --oneline\n     ```\n\n     Offer `major`, `minor` and `patch` as the options, put the increment semver suggests for those\n     commits first and mark it `(Recommended)`, and summarise the commits in the question. Do not\n     pick one on the user's behalf.\n4. **Credentials.** Make sure nothing will fail for want of a login after the wait:\n   - the CI CLI for the remote (`git remote get-url origin`) is authenticated — `gh auth status`\n     or `glab auth status`;\n   - the token release-it needs for the remote release is set — `GITHUB_TOKEN` when\n     `.release-it.json` enables `github.release`, `GITLAB_TOKEN` when it enables\n     `gitlab.release`. Check that the variable is non-empty; never print it.\n\n   If either is missing, ask the user to fix it now.\n\nIf the user chose to push, push now — the pipeline that push starts is the one step 2 waits for.\n\n### 2. Wait for CI to be green\n\nA release tags whatever `HEAD` is, so that commit has to have passed CI first.\n\n1. Look up the pipeline for the branch with the CLI matching the remote:\n\n   **GitLab** (`glab`):\n\n   ```bash\n   branch=$(git branch --show-current)\n   glab ci get --branch \"$branch\" --output json --jq '{sha, status}'\n   ```\n\n   If the status is still running (`created`, `waiting_for_resource`, `preparing`, `pending`,\n   `running`, `scheduled`), block until it ends, then read the status again:\n\n   ```bash\n   glab ci status --branch \"$branch\" --wait\n   glab ci get --branch \"$branch\" --output json --jq '{sha, status}'\n   ```\n\n   **GitHub** (`gh`) — one push can start several workflow runs, so check all of them for `HEAD`:\n\n   ```bash\n   gh run list --branch \"$(git branch --show-current)\" --commit \"$(git rev-parse HEAD)\" \\\n     --json databaseId,name,status,conclusion\n   ```\n\n   For every run whose `status` is not `completed`, wait for it:\n\n   ```bash\n   gh run watch \u003CdatabaseId> --exit-status\n   ```\n\n2. Release only when the pipeline for `HEAD` is green — GitLab `success`, or every GitHub run\n   concluded `success` (`skipped` \u002F `neutral` are fine). If it failed or was cancelled, **stop**:\n   report the failing job to the user and do not release.\n\n   If nothing ran for `HEAD` itself — workflow path filters can skip a commit, and GitLab's\n   pipeline `sha` may then belong to an earlier one — the latest pipeline on the branch is the\n   gate instead and has to be green. If the project has no CI at all, say so and proceed.\n\n### 3. Run the release\n\nRun release-it non-interactively — its prompts need a terminal an agent cannot answer. `--ci`\nskips them, and the increment argument stands in for the version prompt:\n\n```bash\n# Conventional Commits, no explicit increment\nnpm run release -- --ci\n\n# Otherwise (or to override), with the increment from step 1\nnpm run release -- minor --ci\n```\n\n`release-it` handles the version bump, git tag, commit, and (if configured) the remote release.\nThe `@release-it\u002Fbumper` plugin writes the chosen version into the `version` field of\n`composer.json`, keeping it the single source of truth. In a WordPress theme an `after:bump` hook\nthen rewrites the `Version:` header of `style.css` to match, so the theme WordPress sees carries the\nsame version and the change lands in the release commit.\n\n### 4. Watch the tag pipeline\n\nPushing the tag usually starts a pipeline of its own — the one that builds, publishes or deploys\nthe release — so the task is not done when release-it exits. Watch it the same way as in step 2,\nfor the tag's commit:\n\n```bash\ntag=$(git describe --tags --abbrev=0)\n```\n\n**GitLab** — the tag is a ref like a branch:\n\n```bash\nglab ci status --branch \"$tag\" --wait\nglab ci get --branch \"$tag\" --output json --jq '{sha, status}'\n```\n\n**GitHub** — list every run for the tagged commit and `gh run watch \u003CdatabaseId> --exit-status`\neach one not yet `completed`:\n\n```bash\ngh run list --commit \"$(git rev-list -n 1 \"$tag\")\" --json databaseId,name,event,headBranch,status,conclusion\n```\n\nA pipeline can take a few seconds to appear after the push; if none shows up, check again a\ncouple of times over about a minute before concluding the project runs nothing on tags — then say\nso. Report the outcome either way. If the tag pipeline fails, report the failing job and stop: the\ntag is already public, so do **not** delete, move or re-create it — fixing the failure is a\nseparate change.\n\n## Conventions\n\n- **Semantic versioning.** The next version is patch \u002F minor \u002F major per semver, chosen as in\n  step 1.\n- **`composer.json` `version` is authoritative.** Do not hand-edit it for a release — let\n  `npm run release` \u002F `@release-it\u002Fbumper` set it.\n- **Never release on red.** A failed or cancelled pipeline for `HEAD` ends the task; fixing it is\n  a separate change.\n- **A release ends with its tag pipeline.** Report how the pipeline the tag started finished, not\n  just that release-it exited.\n\n## Configuration reference\n\nThe relevant config the baseline enforces:\n\n- `package.json` → `scripts.release` = `\"release-it\"`\n- `.release-it.json` → `plugins['@release-it\u002Fbumper'].out` = `{ \"file\": \"composer.json\", \"path\": \"version\" }`\n- WordPress themes: `.release-it.json` → `hooks['after:bump']` includes a command rewriting the\n  `Version:` header of `style.css`\n",{"name":5,"description":7},"main","5e0daa3a0ad957378e4e551c5bdeedda5cb5240f","resources\u002Fstandalone\u002Fskills\u002Fcreating-a-release",0,"https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline","https:\u002F\u002Fgithub.com\u002Flimenet","http:\u002F\u002Flinusmetzler.me","run, ride, travel, hike","2026-11-06 16:08:08",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":51},[41,44,47],{"tool":42,"command":43},"npx","npx skills add limenet\u002Flaravel-baseline --skill creating-a-release",{"tool":45,"command":46},"bunx","bunx skills add limenet\u002Flaravel-baseline --skill creating-a-release",{"tool":48,"command":49},"pnpm","pnpm dlx skills add limenet\u002Flaravel-baseline --skill creating-a-release","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline\u002Fblob\u002Fmain\u002Fresources\u002Fstandalone\u002Fskills\u002Fcreating-a-release\u002FSKILL.md",true,[],[54,71,87,92,97,104],{"skillNo":55,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":25},"01M6C24Z6FHC8JGEG4DWY84TKQ","updating-dependencies","Update the project's composer and npm dependencies, review changelogs for their impact on this project, and report majors blocked by semver. Use when asked to update or upgrade dependencies, run the monthly dependency update, or when prompted by the `updatesDependencies` periodic baseline check.","https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline\u002Fblob\u002Fmain\u002Fresources\u002Fstandalone\u002Fskills\u002Fupdating-dependencies\u002FSKILL.md",[],[61,62,63,64,65,66,67,68,69,70,23],"updating dependencies","review","dependency update","run","update","report","semver","npm","baseline","check",{"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":25},"01M6C24WZ5XGG5J9V5ME56NPGM","ignoring-trivy-findings","Add, renew, or prune entries in .trivyignore.yaml — either short-lived because the fixed version is still inside the npm install cooldown, or longer-lived because the upgrade is blocked by a project constraint. Use when the Trivy `security` CI job fails on a vulnerability, when asked to ignore or suppress a Trivy finding, or when reviewing existing Trivy ignores.","https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline\u002Fblob\u002Fmain\u002Fresources\u002Fstandalone\u002Fskills\u002Fignoring-trivy-findings\u002FSKILL.md",[],[78,79,80,68,81,82,83,84,85,86,23,24],"trivy","ignoring trivy findings","security","yaml","ci","vulnerability","prune","short","install",{"skillNo":88,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":25},"01M6C24RK5FJTTRE247968HJ41","https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline\u002Fblob\u002Fmain\u002Fresources\u002Fboost\u002Fskills\u002Fupdating-dependencies\u002FSKILL.md",[],[61,23,68,70,69,64,67,62,63,65,66],{"skillNo":93,"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":94,"categories":95,"keywords":96,"publishedAt":25},"01M6C24PGHWX6N4V6PRRZR2AMS","https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline\u002Fblob\u002Fmain\u002Fresources\u002Fboost\u002Fskills\u002Fignoring-trivy-findings\u002FSKILL.md",[],[79,78,68,80,81,82,83,84,85,86,23,24],{"skillNo":98,"name":5,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":25},"01M6C24MN9B35Y3GF4JYAAX20Z","Cut, tag, and publish a new release of this Laravel project using release-it. Use when asked to create, cut, tag, or publish a release, or bump the project version.","https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline\u002Fblob\u002Fmain\u002Fresources\u002Fboost\u002Fskills\u002Fcreating-a-release\u002FSKILL.md",[],[20,19,21,22,103,23,24],"laravel",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":25},"01M6C24J9YBF299XQMBXBY29ZP","auditing-laravel-idioms","Audit the project's cache, session and request-data usage to confirm modern Laravel idioms (typed cache getters, BackedEnum keys, whenFilledEnum) are followed. Use when asked to audit or check modern Laravel idiom adoption, or when prompted by the `followsModernLaravelIdioms` periodic baseline check.","https:\u002F\u002Fgithub.com\u002Flimenet\u002Flaravel-baseline\u002Fblob\u002Fmain\u002Fresources\u002Fboost\u002Fskills\u002Fauditing-laravel-idioms\u002FSKILL.md",[],[111,103,112,113,114,69,70,115,23,116],"auditing laravel idioms","cache","adoption","data","session","audit"]