This skill is anexecution-typeworkflow: set up the combined release solution of relizy (sub-packages) + bumpp (root package) for a pnpm monorepo in one go, covering the complete integration chain from repository health check, configuration persistence, dependency alignment, and failure pre-check, to dry-run verification and documentation sync.
Design philosophy
- Local control of tag generation: developers run
pnpm releaselocally to complete all version management with a single command - Cloud handles GitHub Release: after GitHub Actions detects a tag push, it automatically extracts content from CHANGELOG.md to create a Release
- Single push: all tags in the serial main chain (sub-packages + root package) are pushed in one
git push --follow-tagspush - The root package has two valid entry points: the serial main chain uses
release:root+--no-push; standalone root package releases userelease:bumpp+--push - Two tools collaborate: relizy handles sub-packages (independent mode), bumpp handles the root package, each fulfilling its own role
Relationship with package-linter relationship
If you are also creating or normalizing sub-packages at the same time, please first or in parallel refer to the package-linter skill in the repository to ensure package.json / tsup / tsconfig is consistent with the monorepo conventions; this skill focuses on the configuration and decisions of therelease domain.
Runner: you must use @ruan-cat/utils of relizy-runner(creating your own scripts is prohibited)
The compatibility layer (Windows GNU tool completion + automatic preparation of independent baseline tags) is implemented by the @ruan-cat/utils package and invoked via relizy-runner bin .Must notcreate scripts/relizy-runner.ts or any local runner copy in the target repository.
- Authoritative documentation: the relizy-runner documentation in the
relizy-runner --helpand@ruan-cat/utilspackages installed in the target repository shall prevail. - Invocation convention: you must use
package.jsonofbin(such asnpx relizy-runner …/pnpm exec relizy-runner …),Prohibitedto usetsx @ruan-cat/utils/relizy-runnerand other forms that bypass exports. - baseline behavior:
release/bumpWhen an independent baseline tag is missing, annotated bootstrap tags will be created according to the current package.json version. With--no-push, only local tags are kept, and subsequentgit push --follow-tagswill carry them; without--no-push, atomic push is used to push this round of tags. - Write-prohibited behavior:
--dry-runor--no-commitNo tags will be created under this; when the baseline is missing, only manual fallback commands are printed and it stops.
--yes and non-interactive releases
relizy may pop up interactions in processes such as release / bump ; it will hang without a TTY or in CI.In the serial main chain, release:sub and release:root must explicitly write --yes, including package.json scripts, README, and verification commands. The standalone entry point release:bumpp retains bumpp's interactive version selection by default and pushes the root tag immediately via --push ; if the target repository really needs fully non-interactive behavior, then explicitly append --yes。
Release process architecture
pnpm release
│
├── 1. pnpm run release:sub(relizy)
│ ├── 必要时创建本地 annotated baseline tags(--no-push 下不推送)
│ ├── 分析各子包 commits → bump → CHANGELOG → commit → tag
│ └── 不 push(--no-push)
│
├── 2. pnpm run release:root(bumpp)
│ ├── bump 根包 patch → changelogen → commit → tag
│ └── 不 push(--no-push)
│
└── 3. pnpm run git:push
└── git push --follow-tags(一次性推送)
For detailed architecture description, see references/release-workflow-architecture.md。
Used when releasing the root package separately:
pnpm run release:bumpp
├── bumpp 交互式选择根包版本
├── 生成根包 commit + tag
└── 立即 push(--push)
Configuration files written to disk in one go
| File | Purpose | Template |
|---|---|---|
bump.config.ts |
Root package release (bumpp) | templates/bump.config.ts |
changelog.config.ts |
Shared changelog configuration | templates/changelog.config.ts |
changelogithub.config.ts |
changelogithub integration | templates/changelogithub.config.ts |
relizy.config.ts |
Subpackage release (relizy) | templates/relizy.config.ts |
.github/workflows/release.yaml |
GitHub Release automation | templates/release.yaml |
Dependency list
During integration, the following devDependencies must be installed (versions are subject to the latest in the registry):
pnpm add -D bumpp changelogen changelogithub relizy @ruan-cat/commitlint-config @ruan-cat/utils @types/node pnpm-workspace-yaml
Root package scripts template
See templates/package-scripts.mdfor details. Key commands:
{
"release": "pnpm run release:sub && pnpm run release:root && pnpm run git:push",
"release:sub": "relizy-runner release --no-publish --no-provider-release --no-push --yes",
"release:root": "bumpp --no-push --yes --release patch",
"release:bumpp": "bumpp --push",
"changelog:root": "changelogen --output CHANGELOG.md",
"git:push": "git push --follow-tags"
}
Three-layer directory
| Layer | Path | Purpose |
|---|---|---|
| Process and checklist | SKILL.md(this file) |
Phase division, blocking conditions, index |
| Copyable snippets and templates | templates/ |
Configuration file templates, reconnaissance output, confirmation checklist, scripts templates |
| Principles and decision basis | references/ |
Decision tree, pitfalls, verification matrix, failure pre-check, architecture description |
Non-goals (must be observed)
- Do not execute
npm publishby default, and do not enable provider release by default. - Do not write this skill as a dedicated script for a specific private or fixed repository.
- When the
privatestrategy is unconfirmed and the compatibility strategy is undecided , do not blindly write to disk. - Prohibitedto create a local runner script in the target repository.
- Do not confuse
selectivewith "independent version lines for each package".
Standard six-phase process
Task Progress:
- [ ] 阶段 1 — 侦察:收集工作区、锁文件、现有发版工具、tag、private、README/CHANGELOG 边界(用 templates/workspace-discovery.md)
- [ ] 阶段 2 — 确认:仅对高风险项确认(versionMode、全量纳管、private、兼容策略)(用 templates/package-eligibility.md)
- [ ] 阶段 3 — 故障预检:检查是否存在 commit-and-tag-version、conventional-changelog-cli 等遗留根包发版工具(见 references/dependency-conflict-precheck.md)
- [ ] 阶段 4 — 落盘:依赖安装、5 个配置文件写入、根 scripts 配置、必要时最小 tsconfig(用 templates/config-writer.md + 各 templates/*.ts)
- [ ] 阶段 5 — 验证:help、changelog dry-run、release dry-run(见 references/verification-matrix.md)
- [ ] 阶段 6 — 收尾:修改清单、破坏性说明、残余风险、下一步(用 templates/docs-sync.md)
Explicit blocking conditions (must not be skipped)
When any of the following holds,stop automatic writing to disk, and instead only output the plan and user confirmation:
- The user requests "independent versions for each subpackage", yet
selectiveis planned to be used as the independent versioning solution. - The packages planned to be included in relizy involve
private: truechanges, but confirmation has not been obtained. - It is confirmed that
relizy-runnerwill not be used, but manual baseline tag confirmation has not been completed. - On Windows,
grep/head/sedtype failures have been observed, but no compatibility strategy has been chosen. - A legacy root package release tool is detected(such as
commit-and-tag-version、conventional-changelog-cli、standard-version、release-it), but it has not yet been confirmed whether to delete or isolate it (seereferences/dependency-conflict-precheck.md)。
Core decisions (quick reference)
- versionMode: "independent version line for each package" →
independent; "only bump changed packages and share one release semantics" ≠ independent version lines. - Compatibility strategy:Preferred
relizy-runner(Windows GNU tools + automatic baseline tag preparation). - Documentation boundary:
rootChangelogand README updates are two separate chains;formatCmdshould not be broad enough to mistakenly modify the README. - Root package release: handled independently by bumpp,
bump.config.tsdoes not hard-code push; the serial entry pointrelease:rootuses--no-push, the standalone entry pointrelease:bumppuses--push, and through theexecutefunction callschangelogen --output CHANGELOG.md -r <newVersion>。 - GitHub Release: used by CI with
gh release createextracted from CHANGELOG.md, without relying on changelogithub / relizy provider-release.
templates/ index
| File | Purpose |
|---|---|
templates/bump.config.ts |
bumpp root package release configuration template |
templates/changelog.config.ts |
Shared changelog configuration template |
templates/changelogithub.config.ts |
changelogithub configuration template |
templates/relizy.config.ts |
relizy subpackage release configuration template |
templates/release.yaml |
GitHub Actions Release workflow template |
templates/package-scripts.md |
Complete root package scripts template and description |
templates/workspace-discovery.md |
Structured output of reconnaissance results |
templates/package-eligibility.md |
Managed scope and private confirmation |
templates/config-writer.md |
Configuration and script persistence skeleton |
templates/runtime-compat.md |
Compatibility strategy record |
templates/docs-sync.md |
README release section template |
references/ index
| File | Content |
|---|---|
references/overview.md |
Skill knowledge map and recommended implementation order |
references/release-workflow-architecture.md |
Detailed explanation of the relizy + bumpp combined release architecture |
references/dependency-conflict-precheck.md |
Legacy root package release tool pre-check |
references/discovery-checklist.md |
Reconnaissance signal checklist |
references/version-mode-decision.md |
independent / selective / unified version line |
references/config-templates.md |
Configuration slots and file roles |
references/type-compatibility.md |
types and changelogen consolidation |
references/windows-compatibility.md |
relizy-runner / patch / no layer |
references/baseline-tags.md |
Independent mode and package tags |
references/package-visibility.md |
private and scan scope |
references/readme-and-changelog-boundaries.md |
Root CHANGELOG and README |
references/verification-matrix.md |
Verification command matrix |
references/rollback-and-risks.md |
Rollback and stop-loss |
references/validated-archetypes.md |
Prototype comparison and expected decision checklist |
Verification command baseline (run in root directory)
See references/verification-matrix.md。
relizy subpackage verification (using relizy-runner):
pnpm exec relizy-runner --help
pnpm exec relizy-runner changelog --dry-run --yes
pnpm exec relizy-runner release --dry-run --no-publish --no-provider-release --no-push --no-commit --no-clean --yes
bumpp root package verification:
pnpm exec bumpp --help
pnpm exec bumpp --dry-run --release patch
pnpm exec changelogen --output CHANGELOG.md -r 0.0.1
git ls-remote --tags origin "v0.0.1"
Expected root package changelog to generate version heading ## v0.0.1, not range heading ## v0.0.0...main。
If a root package tag already exists locally, but GitHub Actions' release.yaml was not triggered, first check whether the remote tag exists, rather than immediately suspecting the workflow's CHANGELOG extraction logic.
If release:dry or the dry-run in the verification matrix indicates missing independent baseline tags, this is the expected write-protection: dry-run will not create tags. On first integration, use a real release:sub --no-push to automatically create local annotated baseline tags, or manually create them as prompted and then re-run dry-run.
If the output is "no packages to bump" and there are no configuration/cross-platform errors, it should be interpreted asverification passed but there are currently no changes to release。