Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Release

on:
push:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: false

permissions:
contents: write

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}

- name: Detect release tag in commit message
id: detect
run: |
MSG="${{ github.event.head_commit.message }}"
if echo "$MSG" | grep -qE '\[(major|minor|patch)\]'; then
echo "triggered=true" >> "$GITHUB_OUTPUT"
else
echo "triggered=false" >> "$GITHUB_OUTPUT"
fi

- name: Read version
if: steps.detect.outputs.triggered == 'true'
id: version
run: echo "version=$(cat VERSION)" >> "$GITHUB_OUTPUT"

- name: Create and push tag
if: steps.detect.outputs.triggered == 'true'
run: |
git tag "v${{ steps.version.outputs.version }}"
git push origin "v${{ steps.version.outputs.version }}"

- name: Package release artifact
if: steps.detect.outputs.triggered == 'true'
run: zip -r release.zip . --exclude ".git/*" --exclude ".github/*"

- name: Create GitHub Release
if: steps.detect.outputs.triggered == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release create "v${{ steps.version.outputs.version }}" \
release.zip \
--title "Release v${{ steps.version.outputs.version }}" \
--generate-notes
21 changes: 21 additions & 0 deletions .github/workflows/validate-version.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Validate version

on:
pull_request:
branches: [main]

jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Check version consistency
run: |
VERSION=$(cat VERSION)
PLUGIN_VERSION=$(jq -r '.version' .claude-plugin/plugin.json)
if [ "$VERSION" != "$PLUGIN_VERSION" ]; then
echo "::error::Version mismatch: VERSION=$VERSION but .claude-plugin/plugin.json.version=$PLUGIN_VERSION"
exit 1
fi
echo "All versions consistent: $VERSION"
10 changes: 9 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,19 @@ This downloads the pinned upstream tarball and replaces the contents of `skills/

- [ ] `node scripts/validate-claude-plugin.mjs` passes.
- [ ] `claude plugin validate` passes (before directory submission or major releases).
- [ ] Version bumped in [`.claude-plugin/plugin.json`](.claude-plugin/plugin.json) when the plugin changes.
- [ ] No secrets, credentials, or files under `**/local-cache/` committed.
- [ ] If the skill tree changed: `pin` in `.github/scripts/sync-skills-vendor.json` matches the upstream tag the new tree was generated from.
- [ ] Smoke-test: `claude --plugin-dir .` from the repo root.

## Releasing

To cut a release:

1. In your PR, bump `VERSION` and sync `.claude-plugin/plugin.json` `.version` to match. The `validate-version` PR check enforces this.
2. Merge to `main` with `[major]`, `[minor]`, or `[patch]` anywhere in the commit message.

The release workflow reads `VERSION`, creates a `vX.Y.Z` git tag, and publishes a GitHub Release with a repo zip attached. No bot push to `main` — the version bump is part of the PR itself.

### Submitting to the Claude plugin directory

Use [Submitting your plugin](https://claude.com/docs/plugins/submit). Submit the **public GitHub URL** of this repository — the **repository root** is the plugin root (manifest in `.claude-plugin/`, skills committed under `skills/`, vendored from [jfrog/jfrog-skills](https://github.com/jfrog/jfrog-skills)).
Expand Down
1 change: 1 addition & 0 deletions VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0.2.7
Loading