Skip to content

feat: path-based per-plugin release detection#3

Merged
antonbabenko merged 1 commit into
masterfrom
feat/path-based-release
May 16, 2026
Merged

feat: path-based per-plugin release detection#3
antonbabenko merged 1 commit into
masterfrom
feat/path-based-release

Conversation

@antonbabenko
Copy link
Copy Markdown
Owner

Summary

Replace the scope-required release gate with path + type detection.

A commit qualifies for a plugin if it changed release-worthy content under
plugins/<plugin>/ (anything except tests/ and the CI-managed
CHANGELOG.md) OR its subject is scoped to that plugin (back-compat).
The conventional-commit type then sets the bump: feat -> minor,
fix/perf/refactor -> patch, !/BREAKING CHANGE -> major. A plugin
with changes but no typed commit in range is not released.

  • automated-release.yml: touches_plugin() helper; qualify = path OR
    scope; header comment + skip message updated.
  • CLAUDE.md, CONTRIBUTING.md: release tables rewritten to the new model.

Loop-safety

  • Bot chore(release): ... commits are type chore -> no bump even though
    they path-touch the released plugin.
  • The release commit is tagged <plugin>-v<new>; that plugin's next range
    <tag>..HEAD excludes it.
  • Shared .claude-plugin/marketplace.json is outside plugins/<plugin>/,
    so it never counts as a plugin path.

Expected effect on merge (intended)

This PR touches only .github/ + docs (no plugins/<p>/ content), so the
squash commit itself triggers no release. But code-intelligence's range is
still code-intelligence-v0.2.0..HEAD, which contains fc383cc (PR #2,
feat:, changed plugins/code-intelligence/commands/ + .codex-plugin/).
Under the new logic that qualifies -> code-intelligence auto-releases
v0.3.0
on the master push, capturing the doctor command + Codex manifest.
This is the desired retroactive release.

Test plan

  • Embedded release Python compiles (py_compile).
  • Simulation on real git history: fc383cc qualifies code-intelligence
    (feat -> minor); range code-intelligence-v0.2.0..HEAD -> feats=1
    -> minor (0.2.0 -> 0.3.0).
  • Path filter: tests/, CHANGELOG.md, README.md, shared
    .claude-plugin/marketplace.json -> not qualifying; commands/,
    .codex-plugin/ -> qualifying.
  • markdownlint-cli2 README.md CONTRIBUTING.md plugins/**/*.md -> 0.
  • Post-merge: confirm the Automated Release run tags
    code-intelligence-v0.3.0, syncs the three version files, prepends
    CHANGELOG, creates the GitHub Release.

Note

Pre-existing em dash in CONTRIBUTING.md:34 is unrelated to this change
(left untouched, out of scope).

Drop the scope-required release gate. A commit now qualifies for a plugin
if it changed release-worthy content under plugins/<plugin>/ (anything
except tests/ and the CI-managed CHANGELOG.md) OR its subject is scoped to
the plugin (back-compat). The conventional-commit type sets the bump
(feat -> minor, fix/perf/refactor -> patch, !/BREAKING -> major); a plugin
with changes but no typed commit is not released.

Loop-safe: bot 'chore(release)' commits are type chore (no bump) and the
release commit is excluded by the plugin's own tag range. Shared
.claude-plugin/marketplace.json is outside plugins/<plugin>/ so it never
counts as a plugin path.

- automated-release.yml: add touches_plugin(); qualify = path OR scope;
  header comment updated
- CLAUDE.md / CONTRIBUTING.md: release tables rewritten to the path+type
  model

This change touches only .github + docs (no plugins/<p> content) so it
triggers no release itself; once on master the existing in-range fc383cc
(PR #2, feat:, code-intelligence content) releases code-intelligence
0.2.0 -> 0.3.0 as intended.
@antonbabenko antonbabenko merged commit 7d5020b into master May 16, 2026
@antonbabenko antonbabenko deleted the feat/path-based-release branch May 16, 2026 21:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant