version-control
Skill3 starsChanged 5 days agoMITView on GitHub
Plan and run a release train in the Semantic Markdown repository. Given a list of features for a release (e.g. "1.2.0: link completion, smd fmt, mermaid diagnostics"), create the release branch and one independent branch per feature, develop each in its own worktree, merge feature PRs into the release branch, then — after the release is tagged and published — merge the release branch into main. Use this skill whenever the user gives features for a version, asks to start/plan a release or milestone (including "do the v1.2 items from the roadmap"), asks which branch to work on or where a PR should target, wants to add a feature to an in-flight release, or asks to finish/close a release. Use together with the smd-release skill, which owns compatibility checks, versioning rules and publishing.
- Commits and pushes
3 other projects use a version of this.
Adopted by
Most recently taken up by
- bislink360/styled-markdownword for word, first seen Nov 7, 2026
- jkitchin/knowhowtheir own version, first seen Nov 1, 2026
- cathaysia/skillstheir own version, first seen Oct 23, 2026
Other versions3 projects use a version of this.
Word for word · 1
- bislink360/styled-markdown★ 3100% same
Edited · 0
None found.
Wrote their own version · 2
- jkitchin/knowhow★ 42same name
- cathaysia/skills★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository4 other files it gives its agents.
- smd-releaseSkill
- sonarqube-scanSkill
- semantic-markdown-readerSkill
- semantic-markdown-writerSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
15 rules. About 0 are common, 7 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 8
Every change reaches main through a release branch:
- Very specific: line 25
If the user points at the roadmap ("the v1.2 items"), read that milestone with the semantic-markdown-reader skill (smd agent ROADMAP.smd …
- Very specific: line 28
Check the version against the last tag (▶ smd-release references/versioning.md): new capabilities → minor, fixes only → patch, anything …
- Very specific: line 36
Run it with --dry-run first to show the plan.
- Very specific: line 54
Keep worktree paths short on Windows: node_modules exceeds the path limit under deep temp folders.
- Very specific: line 56
Commit with Conventional Commits (feat(fmt): …) and no AI co-author trailers.
- Distinctive: line 57
Keep each feature independent.
- Very specific: line 59
Keep the feature branch current: when the release branch moves, merge it in (git merge origin/release/vX.Y.Z).
- Very specific: line 69
Use the PR checklist from ▶ smd-release references/branching.md.
- Distinctive: line 71
Squash-merge: after approval: one commit per feature on the release branch.
- Very specific: line 79
Run the full check, node .claude/skills/smd-release/scripts/release-check.mjs (release mode), and the SonarQube gate, node …
- Distinctive: line 87
Verify every registry shows the new version before calling it released (▶ smd-release §7).
- Distinctive: line 92
Delete the release branch and any leftover feature branches.
- Distinctive: line 93
If a later release branch is already open, merge main into it so it picks up anything that changed.
- Distinctive: line 97
Start the patch train from the shipped tag, not from main, so unreleased work can't leak into the hotfix:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Version control: the release train
Every change reaches main through a release branch:
main ──► release/vX.Y.Z ──► feat/a ──┐
├──► feat/b ──┼──(squash PRs)──► release/vX.Y.Z ──► tag vX.Y.Z ──► publish ──(merge commit PR)──► main
└──► fix/c ───┘mainonly ever contains released code, so it always matches the latest tag.release/vX.Y.Zis the integration branch for one version. It is opened at its version: the bump and changelog heading are its first commit.- Each major feature gets its own branch from the release branch, so features are developed, reviewed and dropped independently.
The compatibility gate, versioning rules, changelog format and publishing steps come from the smd-release skill. Follow it at the points marked ▶ smd-release.
1. Plan the release from the feature list
- Pin down the version and the feature list.
- If the user points at the roadmap ("the v1.2 items"), read that milestone with the semantic-markdown-reader skill (
smd agent ROADMAP.smd --section "v1.2…") and take the unchecked items. - Group small related items into one branch per major feature. A branch should be one reviewable PR, one changelog bullet group, and something that can be dropped without affecting the others.
- Name branches
feat/<slug>(user-visible capability),fix/<slug>(bug),docs/<slug>,perf/<slug>,refactor/<slug>orchore/<slug>, all lowercase kebab-case.
- If the user points at the roadmap ("the v1.2 items"), read that milestone with the semantic-markdown-reader skill (
- Check the version against the last tag (▶ smd-release
references/versioning.md): new capabilities → minor, fixes only → patch, anything breaking → major. - Confirm the version and the branch list with the user before creating anything, since branches are pushed to the public repository.
Create them:
node .claude/skills/version-control/scripts/plan-release.mjs 1.2.0 link-completion smd-fmt mermaid-diagnostics fix/preview-scrollRun it with
--dry-runfirst to show the plan. The script:- creates
release/v1.2.0fromorigin/main, or reuses it - commits the version bump and changelog heading on it (
chore(release): start 1.2.0) - creates each feature branch from the release branch head
- pushes everything
- opens a draft tracking PR
release/v1.2.0 → mainwith a checklist
It never touches the current checkout. Re-run it with more features to add them to the same release.
- creates
2. Build each feature on its own branch
Use one worktree per feature so parallel work (other sessions, other agents) never collides:
git worktree add ../wt-feat-smd-fmt feat/smd-fmt cd ../wt-feat-smd-fmt/extension && npm ciKeep worktree paths short on Windows:
node_modulesexceeds the path limit under deep temp folders.- Never switch branches in a checkout someone else may be using. If
git branch --show-currentor the terminal shows another session's branch, use a new worktree. - Commit with Conventional Commits (
feat(fmt): …) and no AI co-author trailers. Every feature PR adds its bullets under the release's version heading inextension/CHANGELOG.md, not under "Unreleased". - Keep each feature independent. Base it on the release branch, never on another feature branch.
- If a feature truly needs another one: merge the first feature's PR into the release branch, then merge the release branch into the dependent feature branch. Don't stack PRs.
- Keep the feature branch current: when the release branch moves, merge it in (
git merge origin/release/vX.Y.Z). Don't rebase shared branches.
3. Merge features into the release branch
Open the PR against the release branch, not
main:gh pr create --base release/v1.2.0 --head feat/smd-fmt --title "feat(fmt): smd fmt and a VS Code formatter"Use the PR checklist from ▶ smd-release
references/branching.md.- CI runs on PRs into
release/**. The compatibility job runsrelease-check.mjs --pragainst the last tag. Review anything it flags (▶ smd-release §2–3). CI does no static analysis, so run the SonarQube gate locally before opening the PR (▶ sonarqube-scan). - Squash-merge after approval: one commit per feature on the release branch. Then tick the feature in the tracking PR's checklist and delete the feature branch.
- A feature that isn't ready by the release date leaves the train. Close its PR, or retarget it to the next release branch once that exists. Don't hold the release for it.
4. Release
On the release branch, once every planned feature is merged or dropped:
- Finish
extension/CHANGELOG.mdfor the version: every ⚠️ breaking change with a migration note, and empty headings removed. - Run the full check,
node .claude/skills/smd-release/scripts/release-check.mjs(release mode), and the SonarQube gate,node .claude/skills/sonarqube-scan/scripts/sonar-scan.mjs(▶ sonarqube-scan, must pass). Get the maintainer's approval of both reports (▶ smd-release §5, mandatory). - Mark the tracking PR ready for review. Its CI runs the release gate as well.
Tag the release branch head (the exact commit that ships). Pushing the tag runs the Release workflow, which builds from the tag, creates the GitHub Release and publishes; then verify each registry (▶ smd-release §6–7):
git tag -a v1.2.0 origin/release/v1.2.0 -m "Semantic Markdown 1.2.0" && git push origin v1.2.0- Verify every registry shows the new version before calling it released (▶ smd-release §7).
5. Merge the release branch into main (after the release)
- Merge the tracking PR
release/vX.Y.Z → mainwith a merge commit, never a squash, so the tagged commit is part ofmain's history andgit describeonmainfinds the tag. - Delete the release branch and any leftover feature branches. The tag keeps the release reachable.
- If a later release branch is already open, merge
maininto it so it picks up anything that changed.
Hotfixes to a shipped version
Start the patch train from the shipped tag, not from main, so unreleased work can't leak into the hotfix:
node .claude/skills/version-control/scripts/plan-release.mjs 1.2.1 fix/preview-scroll --base v1.2.0Then follow the same steps: PR into release/v1.2.1, tag, publish, merge into main (the tracking PR targets main). Afterwards, merge main into any open release branch.
Rules of thumb
| Situation | Do |
| "Where should this PR go?" | Into the open release branch for its version, not main |
| Tooling, CI or docs unrelated to a release | Include it in the current release train as a chore/ or docs/ branch |
| Two releases in flight | Each has its own release/v… branch. Fixes land in the older one first and are merged forward. |
The release branch and main diverged | Merge main into the release branch (never the other way before the release) |
| A branch was merged | Delete it on GitHub and locally |
Scripts
scripts/plan-release.mjs <X.Y.Z> <feature>…: creates the release train (flags:--dry-run,--no-pr,--no-bump,--base <branch|vX.Y.Z>).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

