fix: make GitHub releases canonical for release-please (#295)
This commit is contained in:
8
.github/release-please-config.json
vendored
8
.github/release-please-config.json
vendored
@@ -5,7 +5,7 @@
|
|||||||
".": {
|
".": {
|
||||||
"release-type": "simple",
|
"release-type": "simple",
|
||||||
"package-name": "cli",
|
"package-name": "cli",
|
||||||
"changelog-path": "CHANGELOG.md",
|
"skip-changelog": true,
|
||||||
"extra-files": [
|
"extra-files": [
|
||||||
{
|
{
|
||||||
"type": "json",
|
"type": "json",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
"plugins/compound-engineering": {
|
"plugins/compound-engineering": {
|
||||||
"release-type": "simple",
|
"release-type": "simple",
|
||||||
"package-name": "compound-engineering",
|
"package-name": "compound-engineering",
|
||||||
"changelog-path": "../../CHANGELOG.md",
|
"skip-changelog": true,
|
||||||
"extra-files": [
|
"extra-files": [
|
||||||
{
|
{
|
||||||
"type": "json",
|
"type": "json",
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
"plugins/coding-tutor": {
|
"plugins/coding-tutor": {
|
||||||
"release-type": "simple",
|
"release-type": "simple",
|
||||||
"package-name": "coding-tutor",
|
"package-name": "coding-tutor",
|
||||||
"changelog-path": "../../CHANGELOG.md",
|
"skip-changelog": true,
|
||||||
"extra-files": [
|
"extra-files": [
|
||||||
{
|
{
|
||||||
"type": "json",
|
"type": "json",
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
".claude-plugin": {
|
".claude-plugin": {
|
||||||
"release-type": "simple",
|
"release-type": "simple",
|
||||||
"package-name": "marketplace",
|
"package-name": "marketplace",
|
||||||
"changelog-path": "../CHANGELOG.md",
|
"skip-changelog": true,
|
||||||
"extra-files": [
|
"extra-files": [
|
||||||
{
|
{
|
||||||
"type": "json",
|
"type": "json",
|
||||||
|
|||||||
2
.github/workflows/release-pr.yml
vendored
2
.github/workflows/release-pr.yml
vendored
@@ -39,7 +39,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Maintain release PR
|
- name: Maintain release PR
|
||||||
id: release
|
id: release
|
||||||
uses: googleapis/release-please-action@v4
|
uses: googleapis/release-please-action@v4.4.0
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
config-file: .github/release-please-config.json
|
config-file: .github/release-please-config.json
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ bun run release:validate # check plugin/marketplace consistency
|
|||||||
- **Branching:** Create a feature branch for any non-trivial change. If already on the correct branch for the task, keep using it; do not create additional branches or worktrees unless explicitly requested.
|
- **Branching:** Create a feature branch for any non-trivial change. If already on the correct branch for the task, keep using it; do not create additional branches or worktrees unless explicitly requested.
|
||||||
- **Safety:** Do not delete or overwrite user data. Avoid destructive commands.
|
- **Safety:** Do not delete or overwrite user data. Avoid destructive commands.
|
||||||
- **Testing:** Run `bun test` after changes that affect parsing, conversion, or output.
|
- **Testing:** Run `bun test` after changes that affect parsing, conversion, or output.
|
||||||
- **Release versioning:** Releases are prepared by release automation, not normal feature PRs. The repo now has multiple release components (`cli`, `compound-engineering`, `coding-tutor`, `marketplace`) and one canonical root `CHANGELOG.md`. Use conventional titles such as `feat:` and `fix:` so release automation can classify change intent, but do not hand-bump release-owned versions or changelog entries in routine PRs.
|
- **Release versioning:** Releases are prepared by release automation, not normal feature PRs. The repo now has multiple release components (`cli`, `compound-engineering`, `coding-tutor`, `marketplace`). GitHub release PRs and GitHub Releases are the canonical release-notes surface for new releases; root `CHANGELOG.md` is only a pointer to that history. Use conventional titles such as `feat:` and `fix:` so release automation can classify change intent, but do not hand-bump release-owned versions or hand-author release notes in routine PRs.
|
||||||
- **Output Paths:** Keep OpenCode output at `opencode.json` and `.opencode/{agents,skills,plugins}`. For OpenCode, command go to `~/.config/opencode/commands/<name>.md`; `opencode.json` is deep-merged (never overwritten wholesale).
|
- **Output Paths:** Keep OpenCode output at `opencode.json` and `.opencode/{agents,skills,plugins}`. For OpenCode, command go to `~/.config/opencode/commands/<name>.md`; `opencode.json` is deep-merged (never overwritten wholesale).
|
||||||
- **ASCII-first:** Use ASCII unless the file already contains Unicode.
|
- **ASCII-first:** Use ASCII unless the file already contains Unicode.
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ When changing `plugins/compound-engineering/` content:
|
|||||||
|
|
||||||
- Update substantive docs like `plugins/compound-engineering/README.md` when the plugin behavior, inventory, or usage changes.
|
- Update substantive docs like `plugins/compound-engineering/README.md` when the plugin behavior, inventory, or usage changes.
|
||||||
- Do not hand-bump release-owned versions in plugin or marketplace manifests.
|
- Do not hand-bump release-owned versions in plugin or marketplace manifests.
|
||||||
- Do not hand-add canonical release entries to the root `CHANGELOG.md`.
|
- Do not hand-add release entries to `CHANGELOG.md` or treat it as the canonical source for new releases.
|
||||||
- Run `bun run release:validate` if agents, commands, skills, MCP servers, or release-owned descriptions/counts may have changed.
|
- Run `bun run release:validate` if agents, commands, skills, MCP servers, or release-owned descriptions/counts may have changed.
|
||||||
|
|
||||||
Useful validation commands:
|
Useful validation commands:
|
||||||
|
|||||||
358
CHANGELOG.md
358
CHANGELOG.md
@@ -1,356 +1,14 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
This is the canonical changelog for the repository.
|
Release notes now live in GitHub Releases for this repository:
|
||||||
|
|
||||||
Historical entries below reflect the older repo-wide release model. After the release-please migration cutover, new entries are written here as component-scoped headings such as `compound-engineering vX.Y.Z - YYYY-MM-DD` and `cli vX.Y.Z - YYYY-MM-DD`.
|
https://github.com/EveryInc/compound-engineering-plugin/releases
|
||||||
|
|
||||||
All notable changes to the `@every-env/compound-plugin` CLI tool and other release-owned repo components will be documented in this file.
|
Multi-component releases are published under component-specific tags such as:
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
- `cli-vX.Y.Z`
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
- `compound-engineering-vX.Y.Z`
|
||||||
|
- `coding-tutor-vX.Y.Z`
|
||||||
|
- `marketplace-vX.Y.Z`
|
||||||
|
|
||||||
Historical release numbering below follows the older repository `v*` tag line. Older entries remain intact for continuity.
|
Do not add new release entries here. New release notes are managed by release automation in GitHub.
|
||||||
|
|
||||||
# [2.42.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.41.1...v2.42.0) (2026-03-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* add disable-model-invocation to beta skills and refine descriptions ([72d4b0d](https://github.com/EveryInc/compound-engineering-plugin/commit/72d4b0dfd231d48f63bdf222b07d37ecc5456004))
|
|
||||||
* beta skill naming, plan file suffixes, and promotion checklist ([ac53635](https://github.com/EveryInc/compound-engineering-plugin/commit/ac53635737854c5dd30f8ce083d8a6c6cdfbee99))
|
|
||||||
* preserve skill-style document-review handoffs ([b2b23dd](https://github.com/EveryInc/compound-engineering-plugin/commit/b2b23ddbd336b1da072ede6a728d2c472c39da80))
|
|
||||||
* review fixes — stale refs, skill counts, and validation guidance ([a83e11e](https://github.com/EveryInc/compound-engineering-plugin/commit/a83e11e982e1b5b0b264b6ab63bc74e3a50f7c28))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* add ce:plan-beta and deepen-plan-beta as standalone beta skills ([ad53d3d](https://github.com/EveryInc/compound-engineering-plugin/commit/ad53d3d657ec73712c934b13fa472f8566fbe88f))
|
|
||||||
* align ce-plan question tool guidance ([df4c466](https://github.com/EveryInc/compound-engineering-plugin/commit/df4c466b42a225f0f227a307792d387c21944983))
|
|
||||||
* rewrite ce:plan to separate planning from implementation ([38a47b1](https://github.com/EveryInc/compound-engineering-plugin/commit/38a47b11cae60c0a0baa308ca7b1617685bcf8cf))
|
|
||||||
* teach ce:work to consume decision-first plans ([859ef60](https://github.com/EveryInc/compound-engineering-plugin/commit/859ef601b2908437478c248a204a50b20c832b7e))
|
|
||||||
|
|
||||||
## [2.41.1](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.41.0...v2.41.1) (2026-03-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* sync plugin version to 2.41.0 and correct skill counts ([5bc3a0f](https://github.com/EveryInc/compound-engineering-plugin/commit/5bc3a0f469acd6be8100e3ecca7bc9f7e5512af5))
|
|
||||||
|
|
||||||
# [2.41.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.40.3...v2.41.0) (2026-03-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* tune ce:ideate volume model and presentation format ([3023bfc](https://github.com/EveryInc/compound-engineering-plugin/commit/3023bfc8c1ffba3130db1d53752ba0246866625d))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* add issue-grounded ideation mode to ce:ideate ([0fc6717](https://github.com/EveryInc/compound-engineering-plugin/commit/0fc6717542f05e990becb5f5674411efc8a6a710))
|
|
||||||
* refine ce:ideate skill with per-agent volume model and cross-cutting synthesis ([b762c76](https://github.com/EveryInc/compound-engineering-plugin/commit/b762c7647cffb9a6a1ba27bc439623f59b088ec9))
|
|
||||||
|
|
||||||
## [2.40.3](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.40.2...v2.40.3) (2026-03-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* research agents prefer native tools over shell for repo exploration ([b290690](https://github.com/EveryInc/compound-engineering-plugin/commit/b2906906555810fca176fa4e0153bf080446c486))
|
|
||||||
|
|
||||||
## [2.40.2](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.40.1...v2.40.2) (2026-03-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* harden codex copied skill rewriting ([#285](https://github.com/EveryInc/compound-engineering-plugin/issues/285)) ([6f561f9](https://github.com/EveryInc/compound-engineering-plugin/commit/6f561f94b4397ca6df2ab163e6f1253817bd7cea))
|
|
||||||
|
|
||||||
## [2.40.1](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.40.0...v2.40.1) (2026-03-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **kiro:** parse .mcp.json wrapper key and support remote MCP servers ([#259](https://github.com/EveryInc/compound-engineering-plugin/issues/259)) ([dfff20e](https://github.com/EveryInc/compound-engineering-plugin/commit/dfff20e1adab891b4645a53d0581d4b20577e3f1))
|
|
||||||
|
|
||||||
# [2.40.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.39.0...v2.40.0) (2026-03-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* specific model/harness/version in PR attribution ([#283](https://github.com/EveryInc/compound-engineering-plugin/issues/283)) ([fdbd584](https://github.com/EveryInc/compound-engineering-plugin/commit/fdbd584bac40ca373275b1b339ab81db65ac0958))
|
|
||||||
|
|
||||||
# [2.39.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.38.0...v2.39.0) (2026-03-16)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* drop 'CLI' suffix from Codex and Gemini platform names ([ec8d685](https://github.com/EveryInc/compound-engineering-plugin/commit/ec8d68580f3da65852e72c127cccc6e66326369b))
|
|
||||||
* make brainstorm handoff auto-chain and cross-platform ([637653d](https://github.com/EveryInc/compound-engineering-plugin/commit/637653d2edf89c022b9e312ea02c0ac1a305d741))
|
|
||||||
* restore 'wait for the user's reply' fallback language ([fca3a40](https://github.com/EveryInc/compound-engineering-plugin/commit/fca3a4019c55c76b9f1ad326cc3d284f5007b8f4))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* add leverage check to brainstorm skill ([0100245](https://github.com/EveryInc/compound-engineering-plugin/commit/01002450cd077b800a917625c5eb6d12da061d0b))
|
|
||||||
* instruct brainstorm skill to use platform blocking question tools ([d2c4cee](https://github.com/EveryInc/compound-engineering-plugin/commit/d2c4cee6f9774a5fb2c8ca325c389dadb4a72b1c))
|
|
||||||
* refactor brainstorm skill into requirements-first workflow ([4d80a59](https://github.com/EveryInc/compound-engineering-plugin/commit/4d80a59e51b4b2e99ff8c2443e2a1b039d7475c9))
|
|
||||||
|
|
||||||
# [2.38.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.37.1...v2.38.0) (2026-03-16)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **skill:** align compound-refresh question tool guidance ([c2582fa](https://github.com/EveryInc/compound-engineering-plugin/commit/c2582fab675fe1571f32730634e66411aadc1820))
|
|
||||||
* **skills:** allow direct commit on main as non-default option ([0c333b0](https://github.com/EveryInc/compound-engineering-plugin/commit/0c333b08c9369d359613d030aba0fe16e929a665))
|
|
||||||
* **skills:** autonomous mode adapts to available permissions ([684814d](https://github.com/EveryInc/compound-engineering-plugin/commit/684814d9514a72c59da4d8f309f73ff0f7661d58))
|
|
||||||
* **skills:** enforce branch creation when committing on main ([6969014](https://github.com/EveryInc/compound-engineering-plugin/commit/696901453212aa43cff2400a75cfc6629e79939e))
|
|
||||||
* **skills:** enforce full report output in autonomous mode ([2ae6fc4](https://github.com/EveryInc/compound-engineering-plugin/commit/2ae6fc44580093ff6162fcb48145901a54138e9f))
|
|
||||||
* **skills:** improve ce:compound-refresh interaction and auto-archive behavior ([0dff943](https://github.com/EveryInc/compound-engineering-plugin/commit/0dff9431ceec8a24e576712c48198e8241c24752))
|
|
||||||
* **skills:** include tool constraint in subagent task prompts ([db8c84a](https://github.com/EveryInc/compound-engineering-plugin/commit/db8c84acb4f72c4ce3e1612365ff912fdfe3cea1))
|
|
||||||
* **skills:** prevent auto-archive when problem domain is still active ([4201361](https://github.com/EveryInc/compound-engineering-plugin/commit/42013612bde6e13152ade806ba7f861ce5d38e03))
|
|
||||||
* **skills:** remove prescriptive branch naming in compound-refresh ([e3e7748](https://github.com/EveryInc/compound-engineering-plugin/commit/e3e7748c564a24e74d86fdf847dd499284404cc8))
|
|
||||||
* **skills:** require specific branch names based on what was refreshed ([b7e4391](https://github.com/EveryInc/compound-engineering-plugin/commit/b7e43910fb1a2173e857c4c6b7fa6af9f9ca1be7))
|
|
||||||
* **skills:** specify markdown format for autonomous report output ([c271bd4](https://github.com/EveryInc/compound-engineering-plugin/commit/c271bd4729793de8f3ec2e47dd5fe3e8de65c305))
|
|
||||||
* **skills:** steer compound-refresh subagents toward file tools over shell commands ([187571c](https://github.com/EveryInc/compound-engineering-plugin/commit/187571ce97ca8c840734b4677cceb0a4c37c84bb))
|
|
||||||
* **skills:** strengthen autonomous mode to prevent blocking on user input ([d3aff58](https://github.com/EveryInc/compound-engineering-plugin/commit/d3aff58d9e48c44266f09cf765d85b41bf95a110))
|
|
||||||
* **skills:** use actual branch name in commit options instead of 'this branch' ([a47f7d6](https://github.com/EveryInc/compound-engineering-plugin/commit/a47f7d67a25ff23ce8c2bb85e92fdce85bed3982))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **skills:** add autonomous mode to ce:compound-refresh ([699f484](https://github.com/EveryInc/compound-engineering-plugin/commit/699f484033f3c895c35fea49e147dd1742bc3d43))
|
|
||||||
* **skills:** add ce:compound-refresh skill for learning and pattern maintenance ([bd3088a](https://github.com/EveryInc/compound-engineering-plugin/commit/bd3088a851a3dec999d13f2f78951dfed5d9ac8c))
|
|
||||||
* **skills:** add Phase 5 commit workflow to ce:compound-refresh ([d4c12c3](https://github.com/EveryInc/compound-engineering-plugin/commit/d4c12c39fd04526c05cf484a512f9f73e91f5c3d))
|
|
||||||
* **skills:** add smart triage, drift classification, and replacement subagents to ce:compound-refresh ([95ad09d](https://github.com/EveryInc/compound-engineering-plugin/commit/95ad09d3e7d96367324c6ec7a10767e51d5788e8))
|
|
||||||
|
|
||||||
## [2.37.1](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.37.0...v2.37.1) (2026-03-16)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **compound:** remove overly defensive context budget precheck ([#278](https://github.com/EveryInc/compound-engineering-plugin/issues/278)) ([#279](https://github.com/EveryInc/compound-engineering-plugin/issues/279)) ([84ca52e](https://github.com/EveryInc/compound-engineering-plugin/commit/84ca52efdb198c7c8ae6c94ca06fc02d2c3ef648))
|
|
||||||
|
|
||||||
# [2.37.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.5...v2.37.0) (2026-03-15)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* sync agent-browser skill with upstream vercel-labs/agent-browser ([24860ec](https://github.com/EveryInc/compound-engineering-plugin/commit/24860ec3f1f1e7bfdee0f4408636ada1a3bb8f75))
|
|
||||||
|
|
||||||
## [2.36.5](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.4...v2.36.5) (2026-03-15)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **create-agent-skills:** remove literal dynamic context directives that break skill loading ([4b4d1ae](https://github.com/EveryInc/compound-engineering-plugin/commit/4b4d1ae2707895d6d4fd2e60a64d83ca50f094a6)), closes [anthropics/claude-code#27149](https://github.com/anthropics/claude-code/issues/27149) [#13655](https://github.com/EveryInc/compound-engineering-plugin/issues/13655)
|
|
||||||
|
|
||||||
## [2.36.4](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.3...v2.36.4) (2026-03-14)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **skills:** use fully-qualified agent namespace in Task invocations ([026602e](https://github.com/EveryInc/compound-engineering-plugin/commit/026602e6247d63a83502b80e72cd318232a06af7)), closes [#251](https://github.com/EveryInc/compound-engineering-plugin/issues/251)
|
|
||||||
|
|
||||||
## [2.36.3](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.2...v2.36.3) (2026-03-13)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **targets:** nest colon-separated command names into directories ([a84682c](https://github.com/EveryInc/compound-engineering-plugin/commit/a84682cd35e94b0408f6c6a990af0732c2acf03f)), closes [#226](https://github.com/EveryInc/compound-engineering-plugin/issues/226)
|
|
||||||
|
|
||||||
## [2.36.2](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.1...v2.36.2) (2026-03-13)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **plan:** remove deprecated /technical_review references ([0ab9184](https://github.com/EveryInc/compound-engineering-plugin/commit/0ab91847f278efba45477462d8e93db5f068e058)), closes [#244](https://github.com/EveryInc/compound-engineering-plugin/issues/244)
|
|
||||||
|
|
||||||
## [2.36.1](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.0...v2.36.1) (2026-03-13)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **agents:** update learnings-researcher model from haiku to inherit ([30852b7](https://github.com/EveryInc/compound-engineering-plugin/commit/30852b72937091b0a85c22b7c8c45d513ab49fd1)), closes [#249](https://github.com/EveryInc/compound-engineering-plugin/issues/249)
|
|
||||||
|
|
||||||
# [2.36.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.35.0...v2.36.0) (2026-03-11)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **hooks:** wrap PreToolUse handlers in try-catch to prevent parallel tool call crashes ([598222e](https://github.com/EveryInc/compound-engineering-plugin/commit/598222e11cb2206a2e3347cb5dd38cacdc3830df)), closes [#85](https://github.com/EveryInc/compound-engineering-plugin/issues/85)
|
|
||||||
* **install:** merge config instead of overwriting on opencode target ([1db7680](https://github.com/EveryInc/compound-engineering-plugin/commit/1db76800f91fefcc1bb9c1798ef273ddd0b65f5c)), closes [#125](https://github.com/EveryInc/compound-engineering-plugin/issues/125)
|
|
||||||
* **review:** add serial mode to prevent context limit crashes ([d96671b](https://github.com/EveryInc/compound-engineering-plugin/commit/d96671b9e9ecbe417568b2ce7f7fa4d379c2bec2)), closes [#166](https://github.com/EveryInc/compound-engineering-plugin/issues/166)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **compound:** add context budget precheck and compact-safe mode ([c4b1358](https://github.com/EveryInc/compound-engineering-plugin/commit/c4b13584312058cb8db3ad0f25674805bbb91b2d)), closes [#198](https://github.com/EveryInc/compound-engineering-plugin/issues/198)
|
|
||||||
* **plan:** add daily sequence number to plan filenames ([e94ca04](https://github.com/EveryInc/compound-engineering-plugin/commit/e94ca0409671efcfa2d4a8fcb2d60b79a848fd85)), closes [#135](https://github.com/EveryInc/compound-engineering-plugin/issues/135)
|
|
||||||
* **plugin:** release v2.39.0 with community contributions ([d2ab6c0](https://github.com/EveryInc/compound-engineering-plugin/commit/d2ab6c076882a4dacaa787c0a6f3c9d555d38af0))
|
|
||||||
|
|
||||||
# [2.35.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.7...v2.35.0) (2026-03-10)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **test-browser:** detect dev server port from project config ([94aedd5](https://github.com/EveryInc/compound-engineering-plugin/commit/94aedd5a7b6da4ce48de994b5a137953c0fd21c3)), closes [#164](https://github.com/EveryInc/compound-engineering-plugin/issues/164)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **compound:** add context budget precheck and compact-safe mode ([7266062](https://github.com/EveryInc/compound-engineering-plugin/commit/726606286873c4059261a8c5f1b75c20fe11ac77)), closes [#198](https://github.com/EveryInc/compound-engineering-plugin/issues/198)
|
|
||||||
* **plan:** add daily sequence number to plan filenames ([4fc6ddc](https://github.com/EveryInc/compound-engineering-plugin/commit/4fc6ddc5db3e2b4b398c0ffa0c156e1177b35d05)), closes [#135](https://github.com/EveryInc/compound-engineering-plugin/issues/135)
|
|
||||||
|
|
||||||
## [2.34.7](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.6...v2.34.7) (2026-03-10)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **test-browser:** detect dev server port from project config ([50cb89e](https://github.com/EveryInc/compound-engineering-plugin/commit/50cb89efde7cee7d6dcd42008e6060e1bec44fcc)), closes [#164](https://github.com/EveryInc/compound-engineering-plugin/issues/164)
|
|
||||||
|
|
||||||
## [2.34.6](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.5...v2.34.6) (2026-03-10)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **mcp:** add API key auth support for Context7 server ([c649cfc](https://github.com/EveryInc/compound-engineering-plugin/commit/c649cfc17f895b58babf737dfdec2f6cc391e40a)), closes [#153](https://github.com/EveryInc/compound-engineering-plugin/issues/153)
|
|
||||||
|
|
||||||
## [2.34.5](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.4...v2.34.5) (2026-03-10)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **lfg:** enforce plan phase with explicit step gating ([b07f43d](https://github.com/EveryInc/compound-engineering-plugin/commit/b07f43ddf59cd7f2fe54b2e0a00d2b5b508b7f11)), closes [#227](https://github.com/EveryInc/compound-engineering-plugin/issues/227)
|
|
||||||
|
|
||||||
## [2.34.4](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.3...v2.34.4) (2026-03-04)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **openclaw:** emit empty configSchema in plugin manifests ([4e9899f](https://github.com/EveryInc/compound-engineering-plugin/commit/4e9899f34693711b8997cf73eaa337f0da2321d6)), closes [#224](https://github.com/EveryInc/compound-engineering-plugin/issues/224)
|
|
||||||
|
|
||||||
## [2.34.3](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.2...v2.34.3) (2026-03-03)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **release:** keep changelog header stable ([2fd29ff](https://github.com/EveryInc/compound-engineering-plugin/commit/2fd29ff6ed99583a8539b7a1e876194df5b18dd6))
|
|
||||||
|
|
||||||
## [2.34.2](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.1...v2.34.2) (2026-03-03)
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **release:** add package repository metadata ([eab77bc](https://github.com/EveryInc/compound-engineering-plugin/commit/eab77bc5b5361dc73e2ec8aa4678c8bb6114f6e7))
|
|
||||||
|
|
||||||
## [2.34.1](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.0...v2.34.1) (2026-03-03)
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **release:** align cli versioning with repo tags ([7c58eee](https://github.com/EveryInc/compound-engineering-plugin/commit/7c58eeeec6cf33675cbe2b9639c7d69b92ecef60))
|
|
||||||
|
|
||||||
## [2.34.0] - 2026-03-03
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Sync parity across supported providers** — `sync` now uses a shared target registry and supports MCP sync for Codex, Droid, Gemini, Copilot, Pi, Windsurf, Kiro, and Qwen, with OpenClaw kept validation-gated for skills-only sync.
|
|
||||||
- **Personal command sync** — Personal Claude commands from `~/.claude/commands/` now sync into provider-native command surfaces, including Codex prompts and generated skills, Gemini TOML commands, OpenCode command markdown, Windsurf workflows, and converted skills where that is the closest available equivalent.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- **Global user config targets** — Copilot sync now writes to `~/.copilot/` and Gemini sync writes to `~/.gemini/`, matching current documented user-level config locations.
|
|
||||||
- **Gemini skill deduplication** — Gemini sync now avoids mirroring skills that Gemini already resolves from `~/.agents/skills`, preventing duplicate skill conflict warnings after sync.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- **Safe skill sync replacement** — When a real directory already exists at a symlink target (for example `~/.config/opencode/skills/proof`), sync now logs a warning and skips instead of throwing an error.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [0.12.0] - 2026-03-01
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Auto-detect install targets** — `install --to all` and `convert --to all` auto-detect installed AI coding tools and install to all of them in one command
|
|
||||||
- **Gemini sync** — `sync --target gemini` symlinks personal skills to `.gemini/skills/` and merges MCP servers into `.gemini/settings.json`
|
|
||||||
- **Sync all targets** — `sync --target all` syncs personal config to all detected tools
|
|
||||||
- **Tool detection utility** — Checks config directories for OpenCode, Codex, Droid, Cursor, Pi, and Gemini
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [0.11.0] - 2026-03-01
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **OpenClaw target** — `--to openclaw` converts plugins to OpenClaw format. Agents become `.md` files, commands become `.md` files, pass-through skills copy unchanged, and MCP servers are written to `openclaw-extension.json`. Output goes to `~/.openclaw/extensions/<plugin-name>/` by default. Use `--openclaw-home` to override. ([#217](https://github.com/EveryInc/compound-engineering-plugin/pull/217)) — thanks [@TrendpilotAI](https://github.com/TrendpilotAI)!
|
|
||||||
- **Qwen Code target** — `--to qwen` converts plugins to Qwen Code extension format. Agents become `.yaml` files with Qwen-compatible fields, commands become `.md` files, MCP servers write to `qwen-extension.json`, and a `QWEN.md` context file is generated. Output goes to `~/.qwen/extensions/<plugin-name>/` by default. Use `--qwen-home` to override. ([#220](https://github.com/EveryInc/compound-engineering-plugin/pull/220)) — thanks [@rlam3](https://github.com/rlam3)!
|
|
||||||
- **Windsurf target** — `--to windsurf` converts plugins to Windsurf format. Claude agents become Windsurf skills (`skills/{name}/SKILL.md`), commands become flat workflows (`global_workflows/{name}.md` for global scope, `workflows/{name}.md` for workspace), and pass-through skills copy unchanged. MCP servers write to `mcp_config.json` (machine-readable, merged with existing config). ([#202](https://github.com/EveryInc/compound-engineering-plugin/pull/202)) — thanks [@rburnham52](https://github.com/rburnham52)!
|
|
||||||
- **Global scope support** — New `--scope global|workspace` flag (generic, Windsurf as first adopter). `--to windsurf` defaults to global scope (`~/.codeium/windsurf/`), making installed skills, workflows, and MCP servers available across all projects. Use `--scope workspace` for project-level `.windsurf/` output.
|
|
||||||
- **`mcp_config.json` integration** — Windsurf converter writes proper machine-readable MCP config supporting stdio, Streamable HTTP, and SSE transports. Merges with existing config (user entries preserved, plugin entries take precedence). Written with `0o600` permissions.
|
|
||||||
- **Shared utilities** — Extracted `resolveTargetOutputRoot` to `src/utils/resolve-output.ts` and `hasPotentialSecrets` to `src/utils/secrets.ts` to eliminate duplication.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- **OpenClaw code injection** — `generateEntryPoint` now uses `JSON.stringify()` for all string interpolation (was escaping only `"`, leaving `\n`/`\\` unguarded).
|
|
||||||
- **Qwen `plugin.manifest.name`** — context file header was `# undefined` due to using `plugin.name` (which doesn't exist on `ClaudePlugin`); fixed to `plugin.manifest.name`.
|
|
||||||
- **Qwen remote MCP servers** — curl fallback removed; HTTP/SSE servers are now skipped with a warning (Qwen only supports stdio transport).
|
|
||||||
- **`--openclaw-home` / `--qwen-home` CLI flags** — wired through to `resolveTargetOutputRoot` so custom home directories are respected.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [0.9.1] - 2026-02-20
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- **Remove docs/reports and docs/decisions directories** — only `docs/plans/` is retained as living documents that track implementation progress
|
|
||||||
- **OpenCode commands as Markdown** — commands are now `.md` files with deep-merged config, permissions default to none ([#201](https://github.com/EveryInc/compound-engineering-plugin/pull/201)) — thanks [@0ut5ider](https://github.com/0ut5ider)!
|
|
||||||
- **Fix changelog GitHub link** ([#215](https://github.com/EveryInc/compound-engineering-plugin/pull/215)) — thanks [@XSAM](https://github.com/XSAM)!
|
|
||||||
- **Update Claude Code install command in README** ([#218](https://github.com/EveryInc/compound-engineering-plugin/pull/218)) — thanks [@ianguelman](https://github.com/ianguelman)!
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [0.9.0] - 2026-02-17
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Kiro CLI target** — `--to kiro` converts plugins to `.kiro/` format with custom agent JSON configs, prompt files, skills, steering files, and `mcp.json`. Only stdio MCP servers are supported ([#196](https://github.com/EveryInc/compound-engineering-plugin/pull/196)) — thanks [@krthr](https://github.com/krthr)!
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [0.8.0] - 2026-02-17
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **GitHub Copilot target** — `--to copilot` converts plugins to `.github/` format with `.agent.md` files, `SKILL.md` skills, and `copilot-mcp-config.json`. Also supports `sync --target copilot` ([#192](https://github.com/EveryInc/compound-engineering-plugin/pull/192)) — thanks [@brayanjuls](https://github.com/brayanjuls)!
|
|
||||||
- **Native Cursor plugin support** — Cursor now installs via `/add-plugin compound-engineering` using Cursor's native plugin system instead of CLI conversion ([#184](https://github.com/EveryInc/compound-engineering-plugin/pull/184)) — thanks [@ericzakariasson](https://github.com/ericzakariasson)!
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Cursor CLI conversion target (`--to cursor`) — replaced by native Cursor plugin install
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [0.6.0] - 2026-02-12
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Droid sync target** — `sync --target droid` symlinks personal skills to `~/.factory/skills/`
|
|
||||||
- **Cursor sync target** — `sync --target cursor` symlinks skills to `.cursor/skills/` and merges MCP servers into `.cursor/mcp.json`
|
|
||||||
- **Pi target** — First-class `--to pi` converter with MCPorter config and subagent compatibility ([#181](https://github.com/EveryInc/compound-engineering-plugin/pull/181)) — thanks [@gvkhosla](https://github.com/gvkhosla)!
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- **Bare Claude model alias resolution** — Fixed OpenCode converter not resolving bare model aliases like `claude-sonnet-4-5-20250514` ([#182](https://github.com/EveryInc/compound-engineering-plugin/pull/182)) — thanks [@waltbeaman](https://github.com/waltbeaman)!
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Extracted shared `expandHome` / `resolveTargetHome` helpers to `src/utils/resolve-home.ts`, removing duplication across `convert.ts`, `install.ts`, and `sync.ts`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [0.5.2] - 2026-02-09
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix cursor install defaulting to cwd instead of opencode config dir
|
|
||||||
|
|
||||||
## [0.5.1] - 2026-02-08
|
|
||||||
|
|
||||||
- Initial npm publish
|
|
||||||
|
|||||||
@@ -650,7 +650,7 @@ Use this checklist when adding a new target provider:
|
|||||||
### Documentation
|
### Documentation
|
||||||
- [ ] Create `docs/specs/{target}.md` with format specification
|
- [ ] Create `docs/specs/{target}.md` with format specification
|
||||||
- [ ] Update `README.md` with target in list and usage examples
|
- [ ] Update `README.md` with target in list and usage examples
|
||||||
- [ ] Do not hand-add a release entry; release automation owns canonical changelog updates
|
- [ ] Do not hand-add release notes; release automation owns GitHub release notes and release-owned versions
|
||||||
|
|
||||||
### Version Bumping
|
### Version Bumping
|
||||||
- [ ] Use a conventional `feat:` or `fix:` title so release automation can infer the right bump
|
- [ ] Use a conventional `feat:` or `fix:` title so release automation can infer the right bump
|
||||||
@@ -687,6 +687,6 @@ Use this checklist when adding a new target provider:
|
|||||||
## Related Files
|
## Related Files
|
||||||
|
|
||||||
- `plugins/compound-engineering/.claude-plugin/plugin.json` — Version and component counts
|
- `plugins/compound-engineering/.claude-plugin/plugin.json` — Version and component counts
|
||||||
- `CHANGELOG.md` — Recent additions and patterns
|
- `CHANGELOG.md` — Pointer to canonical GitHub release history
|
||||||
- `README.md` — Usage examples for all targets
|
- `README.md` — Usage examples for all targets
|
||||||
- `docs/solutions/plugin-versioning-requirements.md` — Checklist for releases
|
- `docs/solutions/plugin-versioning-requirements.md` — Checklist for releases
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ This document applies to release-owned plugin metadata and changelog surfaces fo
|
|||||||
|
|
||||||
The broader repo-level release model now lives in:
|
The broader repo-level release model now lives in:
|
||||||
|
|
||||||
- `docs/solutions/workflow/manual-release-please-and-centralized-changelog.md`
|
- `docs/solutions/workflow/manual-release-please-github-releases.md`
|
||||||
|
|
||||||
That doc covers the standing release PR, component ownership across `cli`, `compound-engineering`, `coding-tutor`, and `marketplace`, and the canonical root changelog model. This document stays narrower: it is the plugin-scoped reminder for contributors changing `plugins/compound-engineering/**`.
|
That doc covers the standing release PR, component ownership across `cli`, `compound-engineering`, `coding-tutor`, and `marketplace`, and the GitHub Releases model for published release notes. This document stays narrower: it is the plugin-scoped reminder for contributors changing `plugins/compound-engineering/**`.
|
||||||
|
|
||||||
## Solution
|
## Solution
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ Before committing changes to compound-engineering plugin:
|
|||||||
|
|
||||||
- Plugin version is release-owned: `plugins/compound-engineering/.claude-plugin/plugin.json`
|
- Plugin version is release-owned: `plugins/compound-engineering/.claude-plugin/plugin.json`
|
||||||
- Marketplace entry is release-owned: `.claude-plugin/marketplace.json`
|
- Marketplace entry is release-owned: `.claude-plugin/marketplace.json`
|
||||||
- Changelog release sections are release-owned: root `CHANGELOG.md`
|
- Release notes are release-owned: GitHub release PRs and GitHub Releases
|
||||||
- Readme: `plugins/compound-engineering/README.md`
|
- Readme: `plugins/compound-engineering/README.md`
|
||||||
|
|
||||||
## Example Workflow
|
## Example Workflow
|
||||||
@@ -68,7 +68,7 @@ When adding a new agent:
|
|||||||
|
|
||||||
1. Create the agent file in `plugins/compound-engineering/agents/[category]/`
|
1. Create the agent file in `plugins/compound-engineering/agents/[category]/`
|
||||||
2. Update `plugins/compound-engineering/README.md`
|
2. Update `plugins/compound-engineering/README.md`
|
||||||
3. Leave plugin version selection and canonical changelog generation to release automation
|
3. Leave plugin version selection and canonical release-note generation to release automation
|
||||||
4. Run `bun run release:validate`
|
4. Run `bun run release:validate`
|
||||||
|
|
||||||
## Prevention
|
## Prevention
|
||||||
@@ -86,4 +86,4 @@ This documentation serves as a reminder. When maintainers or agents work on this
|
|||||||
- `plugins/compound-engineering/README.md`
|
- `plugins/compound-engineering/README.md`
|
||||||
- `package.json`
|
- `package.json`
|
||||||
- `CHANGELOG.md`
|
- `CHANGELOG.md`
|
||||||
- `docs/solutions/workflow/manual-release-please-and-centralized-changelog.md`
|
- `docs/solutions/workflow/manual-release-please-github-releases.md`
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: "Manual release-please migration for multi-component plugin and marketplace releases"
|
title: "Manual release-please with GitHub Releases for multi-component plugin and marketplace releases"
|
||||||
category: workflow
|
category: workflow
|
||||||
date: 2026-03-17
|
date: 2026-03-17
|
||||||
created: 2026-03-17
|
created: 2026-03-17
|
||||||
@@ -8,7 +8,7 @@ component: release-automation
|
|||||||
tags:
|
tags:
|
||||||
- release-please
|
- release-please
|
||||||
- semantic-release
|
- semantic-release
|
||||||
- changelog
|
- github-releases
|
||||||
- marketplace
|
- marketplace
|
||||||
- plugin-versioning
|
- plugin-versioning
|
||||||
- ci
|
- ci
|
||||||
@@ -16,7 +16,7 @@ tags:
|
|||||||
- release-process
|
- release-process
|
||||||
---
|
---
|
||||||
|
|
||||||
# Manual release-please migration for multi-component plugin and marketplace releases
|
# Manual release-please with GitHub Releases for multi-component plugin and marketplace releases
|
||||||
|
|
||||||
## Problem
|
## Problem
|
||||||
|
|
||||||
@@ -25,13 +25,13 @@ The repo had one automated release path for the npm CLI, but the actual release
|
|||||||
- root-only `semantic-release`
|
- root-only `semantic-release`
|
||||||
- a local maintainer workflow via `release-docs`
|
- a local maintainer workflow via `release-docs`
|
||||||
- multiple version-bearing metadata files
|
- multiple version-bearing metadata files
|
||||||
- inconsistent changelog ownership
|
- inconsistent release-note ownership
|
||||||
|
|
||||||
That made it hard to batch merges on `main`, hard for multiple maintainers to share release responsibility, and easy for changelogs, plugin manifests, marketplace metadata, and computed counts to drift out of sync.
|
That made it hard to batch merges on `main`, hard for multiple maintainers to share release responsibility, and easy for release notes, plugin manifests, marketplace metadata, and computed counts to drift out of sync.
|
||||||
|
|
||||||
## Root Cause
|
## Root Cause
|
||||||
|
|
||||||
Release intent, component ownership, changelog ownership, and metadata synchronization were split across different systems:
|
Release intent, component ownership, release-note ownership, and metadata synchronization were split across different systems:
|
||||||
|
|
||||||
- PRs merged to `main` were too close to an actual publish event
|
- PRs merged to `main` were too close to an actual publish event
|
||||||
- only the root CLI had a real CI-owned release path
|
- only the root CLI had a real CI-owned release path
|
||||||
@@ -53,11 +53,31 @@ Key decisions:
|
|||||||
- `marketplace`
|
- `marketplace`
|
||||||
- Keep release timing manual: the actual release happens when the generated release PR is merged.
|
- Keep release timing manual: the actual release happens when the generated release PR is merged.
|
||||||
- Keep release PR maintenance automatic on pushes to `main`.
|
- Keep release PR maintenance automatic on pushes to `main`.
|
||||||
- Keep one canonical root `CHANGELOG.md`.
|
- Use GitHub release PRs and GitHub Releases as the canonical release-notes surface for new releases.
|
||||||
- Replace `release-docs` with repo-owned scripts for preview, metadata sync, validation, and root changelog rendering.
|
- Replace `release-docs` with repo-owned scripts for preview, metadata sync, and validation.
|
||||||
- Keep PR title scopes optional; use file paths to determine affected components.
|
- Keep PR title scopes optional; use file paths to determine affected components.
|
||||||
- Make `AGENTS.md` canonical and reduce root `CLAUDE.md` to a compatibility shim.
|
- Make `AGENTS.md` canonical and reduce root `CLAUDE.md` to a compatibility shim.
|
||||||
|
|
||||||
|
## Critical Constraint Discovered
|
||||||
|
|
||||||
|
`release-please` does not allow package changelog paths that traverse upward with `..`.
|
||||||
|
|
||||||
|
The failed first live run exposed this directly:
|
||||||
|
|
||||||
|
- `release-please failed: illegal pathing characters in path: plugins/compound-engineering/../../CHANGELOG.md`
|
||||||
|
|
||||||
|
That means a multi-component repo cannot force subpackage release entries back into one shared root changelog file using `changelog-path` values like:
|
||||||
|
|
||||||
|
- `../../CHANGELOG.md`
|
||||||
|
- `../CHANGELOG.md`
|
||||||
|
|
||||||
|
The practical fix was:
|
||||||
|
|
||||||
|
- set `skip-changelog: true` for all components in `.github/release-please-config.json`
|
||||||
|
- treat GitHub Releases as the canonical release-notes surface
|
||||||
|
- reduce `CHANGELOG.md` to a simple pointer file
|
||||||
|
- add repo validation to catch illegal upward changelog paths before merge
|
||||||
|
|
||||||
## Resulting Release Process
|
## Resulting Release Process
|
||||||
|
|
||||||
After the migration:
|
After the migration:
|
||||||
@@ -68,6 +88,7 @@ After the migration:
|
|||||||
4. Maintainers can inspect the standing release PR or run the manual preview flow.
|
4. Maintainers can inspect the standing release PR or run the manual preview flow.
|
||||||
5. The actual release happens only when the generated release PR is merged.
|
5. The actual release happens only when the generated release PR is merged.
|
||||||
6. npm publish runs only when the `cli` component is part of that release.
|
6. npm publish runs only when the `cli` component is part of that release.
|
||||||
|
7. Component-specific release notes are published via GitHub releases such as `cli-vX.Y.Z` and `compound-engineering-vX.Y.Z`.
|
||||||
|
|
||||||
## Component Rules
|
## Component Rules
|
||||||
|
|
||||||
@@ -117,6 +138,17 @@ This keeps titles simple while still letting the release system decide the corre
|
|||||||
- They use the preview/release override path instead of making fake commits
|
- They use the preview/release override path instead of making fake commits
|
||||||
- The release still goes through the same CI-owned process
|
- The release still goes through the same CI-owned process
|
||||||
|
|
||||||
|
## Release Notes Model
|
||||||
|
|
||||||
|
- Pending release state is visible in one standing release PR.
|
||||||
|
- Published release history is canonical in GitHub Releases.
|
||||||
|
- Component identity is carried by component-specific tags such as:
|
||||||
|
- `cli-vX.Y.Z`
|
||||||
|
- `compound-engineering-vX.Y.Z`
|
||||||
|
- `coding-tutor-vX.Y.Z`
|
||||||
|
- `marketplace-vX.Y.Z`
|
||||||
|
- Root `CHANGELOG.md` is only a pointer to GitHub Releases and is not the canonical source for new releases.
|
||||||
|
|
||||||
## Key Files
|
## Key Files
|
||||||
|
|
||||||
- `.github/release-please-config.json`
|
- `.github/release-please-config.json`
|
||||||
@@ -128,7 +160,6 @@ This keeps titles simple while still letting the release system decide the corre
|
|||||||
- `src/release/metadata.ts`
|
- `src/release/metadata.ts`
|
||||||
- `scripts/release/preview.ts`
|
- `scripts/release/preview.ts`
|
||||||
- `scripts/release/sync-metadata.ts`
|
- `scripts/release/sync-metadata.ts`
|
||||||
- `scripts/release/render-root-changelog.ts`
|
|
||||||
- `scripts/release/validate.ts`
|
- `scripts/release/validate.ts`
|
||||||
- `AGENTS.md`
|
- `AGENTS.md`
|
||||||
- `CLAUDE.md`
|
- `CLAUDE.md`
|
||||||
@@ -138,7 +169,8 @@ This keeps titles simple while still letting the release system decide the corre
|
|||||||
- Keep release authority in CI only.
|
- Keep release authority in CI only.
|
||||||
- Do not reintroduce local maintainer-only release flows or hand-managed version bumps.
|
- Do not reintroduce local maintainer-only release flows or hand-managed version bumps.
|
||||||
- Keep `AGENTS.md` canonical. If a tool still needs `CLAUDE.md`, use it only as a compatibility shim.
|
- Keep `AGENTS.md` canonical. If a tool still needs `CLAUDE.md`, use it only as a compatibility shim.
|
||||||
- Preserve one canonical root `CHANGELOG.md`.
|
- Do not try to force multi-component release notes back into one committed changelog file if the tool does not support it natively.
|
||||||
|
- Validate `.github/release-please-config.json` in CI so unsupported changelog-path values fail before the workflow reaches GitHub Actions.
|
||||||
- Run `bun run release:validate` whenever plugin inventories, release-owned descriptions, or marketplace entries may have changed.
|
- Run `bun run release:validate` whenever plugin inventories, release-owned descriptions, or marketplace entries may have changed.
|
||||||
- Prefer maintained CI actions over custom validation when a generic concern does not need repo-specific logic.
|
- Prefer maintained CI actions over custom validation when a generic concern does not need repo-specific logic.
|
||||||
|
|
||||||
@@ -155,7 +187,7 @@ After merging release-system changes to `main`:
|
|||||||
|
|
||||||
- Verify exactly one standing release PR is created or updated.
|
- Verify exactly one standing release PR is created or updated.
|
||||||
- Confirm ordinary merges to `main` do not publish npm directly.
|
- Confirm ordinary merges to `main` do not publish npm directly.
|
||||||
- Inspect the release PR for correct component selection, versions, metadata updates, and root changelog behavior.
|
- Inspect the release PR for correct component selection, versions, and metadata updates.
|
||||||
|
|
||||||
Before merging a generated release PR:
|
Before merging a generated release PR:
|
||||||
|
|
||||||
@@ -167,7 +199,7 @@ After merging a generated release PR:
|
|||||||
|
|
||||||
- Confirm npm publish runs only when `cli` is part of the release.
|
- Confirm npm publish runs only when `cli` is part of the release.
|
||||||
- Confirm no recursive follow-up release PR appears containing only generated churn.
|
- Confirm no recursive follow-up release PR appears containing only generated churn.
|
||||||
- Confirm root `CHANGELOG.md` and release-owned metadata match the released components.
|
- Confirm the expected component GitHub releases were created and that release-owned metadata matches the released components.
|
||||||
|
|
||||||
## Related Docs
|
## Related Docs
|
||||||
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#!/usr/bin/env bun
|
|
||||||
import { updateRootChangelog } from "../../src/release/metadata"
|
|
||||||
import type { ReleaseComponent } from "../../src/release/types"
|
|
||||||
|
|
||||||
type EntryInput = {
|
|
||||||
component: ReleaseComponent
|
|
||||||
version: string
|
|
||||||
date: string
|
|
||||||
sections: Record<string, string[]>
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseEntries(argv: string[]): EntryInput[] {
|
|
||||||
const jsonIndex = argv.findIndex((arg) => arg === "--entries")
|
|
||||||
if (jsonIndex === -1) return []
|
|
||||||
const raw = argv[jsonIndex + 1]
|
|
||||||
if (!raw) return []
|
|
||||||
return JSON.parse(raw) as EntryInput[]
|
|
||||||
}
|
|
||||||
|
|
||||||
const write = process.argv.includes("--write")
|
|
||||||
const entries = parseEntries(process.argv.slice(2))
|
|
||||||
|
|
||||||
if (entries.length === 0) {
|
|
||||||
console.error("No changelog entries provided. Pass --entries '<json>'.")
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = await updateRootChangelog({
|
|
||||||
entries,
|
|
||||||
write,
|
|
||||||
})
|
|
||||||
|
|
||||||
console.log(`${result.changed ? "update" : "keep"} ${result.path}`)
|
|
||||||
@@ -1,16 +1,32 @@
|
|||||||
#!/usr/bin/env bun
|
#!/usr/bin/env bun
|
||||||
|
import path from "path"
|
||||||
|
import { validateReleasePleaseConfig } from "../../src/release/config"
|
||||||
import { syncReleaseMetadata } from "../../src/release/metadata"
|
import { syncReleaseMetadata } from "../../src/release/metadata"
|
||||||
|
import { readJson } from "../../src/utils/files"
|
||||||
|
|
||||||
|
const releasePleaseConfig = await readJson<{ packages: Record<string, unknown> }>(
|
||||||
|
path.join(process.cwd(), ".github", "release-please-config.json"),
|
||||||
|
)
|
||||||
|
const configErrors = validateReleasePleaseConfig(releasePleaseConfig)
|
||||||
const result = await syncReleaseMetadata({ write: false })
|
const result = await syncReleaseMetadata({ write: false })
|
||||||
const changed = result.updates.filter((update) => update.changed)
|
const changed = result.updates.filter((update) => update.changed)
|
||||||
|
|
||||||
if (changed.length === 0) {
|
if (configErrors.length === 0 && changed.length === 0) {
|
||||||
console.log("Release metadata is in sync.")
|
console.log("Release metadata is in sync.")
|
||||||
process.exit(0)
|
process.exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
console.error("Release metadata drift detected:")
|
if (configErrors.length > 0) {
|
||||||
for (const update of changed) {
|
console.error("Release configuration errors detected:")
|
||||||
console.error(`- ${update.path}`)
|
for (const error of configErrors) {
|
||||||
|
console.error(`- ${error}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changed.length > 0) {
|
||||||
|
console.error("Release metadata drift detected:")
|
||||||
|
for (const update of changed) {
|
||||||
|
console.error(`- ${update.path}`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
process.exit(1)
|
process.exit(1)
|
||||||
|
|||||||
29
src/release/config.ts
Normal file
29
src/release/config.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import path from "path"
|
||||||
|
|
||||||
|
type ReleasePleasePackageConfig = {
|
||||||
|
"changelog-path"?: string
|
||||||
|
"skip-changelog"?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReleasePleaseConfig = {
|
||||||
|
packages: Record<string, ReleasePleasePackageConfig>
|
||||||
|
}
|
||||||
|
|
||||||
|
export function validateReleasePleaseConfig(config: ReleasePleaseConfig): string[] {
|
||||||
|
const errors: string[] = []
|
||||||
|
|
||||||
|
for (const [packagePath, packageConfig] of Object.entries(config.packages)) {
|
||||||
|
const changelogPath = packageConfig["changelog-path"]
|
||||||
|
if (!changelogPath) continue
|
||||||
|
|
||||||
|
const normalized = path.posix.normalize(changelogPath)
|
||||||
|
const segments = normalized.split("/")
|
||||||
|
if (segments.includes("..")) {
|
||||||
|
errors.push(
|
||||||
|
`Package "${packagePath}" uses an unsupported changelog-path "${changelogPath}". release-please does not allow upward-relative paths like "../".`,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors
|
||||||
|
}
|
||||||
@@ -180,39 +180,3 @@ export async function syncReleaseMetadata(options: SyncOptions = {}): Promise<Me
|
|||||||
|
|
||||||
return { updates }
|
return { updates }
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updateRootChangelog(options: {
|
|
||||||
root?: string
|
|
||||||
entries: Array<{ component: ReleaseComponent; version: string; date: string; sections: Record<string, string[]> }>
|
|
||||||
write?: boolean
|
|
||||||
}): Promise<{ path: string; changed: boolean; content: string }> {
|
|
||||||
const root = options.root ?? process.cwd()
|
|
||||||
const changelogPath = path.join(root, "CHANGELOG.md")
|
|
||||||
const existing = await readText(changelogPath)
|
|
||||||
const renderedEntries = options.entries
|
|
||||||
.map((entry) => renderChangelogEntry(entry.component, entry.version, entry.date, entry.sections))
|
|
||||||
.join("\n\n")
|
|
||||||
const next = `${existing.trimEnd()}\n\n${renderedEntries}\n`
|
|
||||||
const changed = next !== existing
|
|
||||||
if (options.write && changed) {
|
|
||||||
await writeText(changelogPath, next)
|
|
||||||
}
|
|
||||||
return { path: changelogPath, changed, content: next }
|
|
||||||
}
|
|
||||||
|
|
||||||
export function renderChangelogEntry(
|
|
||||||
component: ReleaseComponent,
|
|
||||||
version: string,
|
|
||||||
date: string,
|
|
||||||
sections: Record<string, string[]>,
|
|
||||||
): string {
|
|
||||||
const lines = [`## ${component} v${version} - ${date}`]
|
|
||||||
for (const [section, items] of Object.entries(sections)) {
|
|
||||||
if (items.length === 0) continue
|
|
||||||
lines.push("", `### ${section}`)
|
|
||||||
for (const item of items) {
|
|
||||||
lines.push(`- ${item}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lines.join("\n")
|
|
||||||
}
|
|
||||||
|
|||||||
39
tests/release-config.test.ts
Normal file
39
tests/release-config.test.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import { describe, expect, test } from "bun:test"
|
||||||
|
import { validateReleasePleaseConfig } from "../src/release/config"
|
||||||
|
|
||||||
|
describe("release-please config validation", () => {
|
||||||
|
test("rejects upward-relative changelog paths", () => {
|
||||||
|
const errors = validateReleasePleaseConfig({
|
||||||
|
packages: {
|
||||||
|
".": {
|
||||||
|
"changelog-path": "CHANGELOG.md",
|
||||||
|
},
|
||||||
|
"plugins/compound-engineering": {
|
||||||
|
"changelog-path": "../../CHANGELOG.md",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(errors).toHaveLength(1)
|
||||||
|
expect(errors[0]).toContain('Package "plugins/compound-engineering"')
|
||||||
|
expect(errors[0]).toContain("../../CHANGELOG.md")
|
||||||
|
})
|
||||||
|
|
||||||
|
test("allows package-local changelog paths and skipped changelogs", () => {
|
||||||
|
const errors = validateReleasePleaseConfig({
|
||||||
|
packages: {
|
||||||
|
".": {
|
||||||
|
"changelog-path": "CHANGELOG.md",
|
||||||
|
},
|
||||||
|
"plugins/compound-engineering": {
|
||||||
|
"skip-changelog": true,
|
||||||
|
},
|
||||||
|
".claude-plugin": {
|
||||||
|
"changelog-path": "CHANGELOG.md",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(errors).toEqual([])
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { describe, expect, test } from "bun:test"
|
import { describe, expect, test } from "bun:test"
|
||||||
import { buildCompoundEngineeringDescription, renderChangelogEntry } from "../src/release/metadata"
|
import { buildCompoundEngineeringDescription } from "../src/release/metadata"
|
||||||
|
|
||||||
describe("release metadata", () => {
|
describe("release metadata", () => {
|
||||||
test("builds the current compound-engineering manifest description from repo counts", async () => {
|
test("builds the current compound-engineering manifest description from repo counts", async () => {
|
||||||
@@ -8,16 +8,4 @@ describe("release metadata", () => {
|
|||||||
"AI-powered development tools. 29 agents, 44 skills, 1 MCP server for code review, research, design, and workflow automation.",
|
"AI-powered development tools. 29 agents, 44 skills, 1 MCP server for code review, research, design, and workflow automation.",
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
test("renders root changelog entries with component-version headings", () => {
|
|
||||||
const entry = renderChangelogEntry("compound-engineering", "2.43.0", "2026-04-10", {
|
|
||||||
Features: ["Add release preview"],
|
|
||||||
Fixes: ["Correct changelog rendering"],
|
|
||||||
})
|
|
||||||
|
|
||||||
expect(entry).toContain("## compound-engineering v2.43.0 - 2026-04-10")
|
|
||||||
expect(entry).toContain("### Features")
|
|
||||||
expect(entry).toContain("- Add release preview")
|
|
||||||
expect(entry).toContain("### Fixes")
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user