contrib/dev-release/SKILL.md
Bumps the plugin version across manifest files, commits, and creates a local git tag for rai-agent-skills. Pushing and publishing the GitHub release happen separately, under human review. Use when cutting a release.
npx skillsauth add RelationalAI/rai-agent-skills dev-releaseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Claude Code treats plugin.json version as the plugin cache key — if you ship
code changes without bumping, end users silently keep the cached copy. All three
manifests that carry the plugin version must stay in sync.
The helper script handles the mechanical, local parts (bump manifests, commit, create the tag). It deliberately does not push or publish — those steps happen under human review via the publishing procedure, so the releaser can review repo state and shape release notes before anything user-visible lands on origin.
This workflow targets the canonical repo and assumes:
main in a clone of RelationalAI/rai-agent-skills, with origin
pointing at it.main and permission to create tags + releases on
origin. Only RAI maintainers do — if git push origin prompts for
credentials or gh release create 403s, stop.gh is installed and authenticated.Running against a fork or a feature branch will put the release on the wrong branch/repo. Don't do it.
The plugin version lives in exactly three files — the official plugin metadata
for each supported host (Claude Code, Codex, Cursor). Keep them identical.
Any other version field in the repo is out of scope for this skill.
plugins/rai/.claude-plugin/plugin.jsonplugins/rai/.codex-plugin/plugin.jsonplugins/rai/.cursor-plugin/plugin.jsonAdding or removing a plugin host (e.g. Gemini, a new marketplace) means this list changes. When that happens, update both:
- This skill — the list above, the count in the intro, the
wc -lexpected value in the Manual path verification step, and theOLD/NEWbump loop.- The script — the
FILESarray incontrib/dev-release/scripts/release.sh.A release run with an out-of-date
FILESarray will silently skip the new manifest.
From the repo root:
# default: patch bump
contrib/dev-release/scripts/release.sh
# or pick a bump level
contrib/dev-release/scripts/release.sh minor
contrib/dev-release/scripts/release.sh major
# or specify an exact version
contrib/dev-release/scripts/release.sh 1.2.3
# preview without executing
contrib/dev-release/scripts/release.sh --dry-run minor
The script runs the preflight checks from Assumptions above, asserts that
origin points at RelationalAI/rai-agent-skills (no fork misrouting),
verifies HEAD is not already at the latest release tag (no double-bump after a
partial prior run), reads the current version from the manifests (and fails if
they've drifted), computes the next version, prints a plan, and prompts before
executing the bump → commit → tag sequence. All three steps are local —
nothing is pushed.
Pushing the bump commit and tag, and creating the GitHub release, happen in
the publishing procedure below, under human review. This keeps everything
user-visible — the commit on main, the public tag, and the release — behind
the same go-ahead gate.
After release.sh finishes, the bump commit and tag exist only locally —
nothing is on origin. The agent pushes both and creates the release, but only
after surfacing context, collecting any release-note commentary from the
user, and getting an explicit go-ahead.
Agent steps:
Surface the context so the user can decide what they want to say. Summarize:
git log <prev-tag>..v$NEW --oneline).Invite commentary with a single open question — don't enumerate mechanisms. Something like: "Want to add any commentary to the release notes, or should I publish with just the auto-generated commit log?"
Based on the user's response, pick the matching gh release create
invocation from the reference table below. Do not ask the user to choose
between mechanisms; the agent owns that mapping.
| User intent | Invocation (append -R RelationalAI/rai-agent-skills) |
|--------------------------------------------------------------------|--------------------------------------------------------|
| Short paragraph, provided inline in chat | gh release create v$NEW --generate-notes --notes "<text>" — text becomes header, auto-notes appended |
| Longer notes drafted (or to be drafted) in a file | gh release create v$NEW --generate-notes --notes-file <path> |
| Wants to review/edit the full text before it goes live | gh release create v$NEW --generate-notes --draft, then user edits via web UI or gh release edit and publishes |
| No commentary — just ship the auto commit log | gh release create v$NEW --generate-notes |
Wait for explicit go-ahead before touching origin. Do not push the tag or publish on inferred consent — a "sounds good" about the commentary is not the same as approval to ship.
On go-ahead, push the bump commit + tag together, then create the release:
git push origin HEAD v$NEW
gh release create v$NEW ... # the invocation picked in step 2
Pair these so the commit, tag, and release all land together.
After publishing, spot-check:
gh release view v$NEW -R RelationalAI/rai-agent-skills to confirm body
and assets. Add --web to open in the browser.Never push the tag or run gh release create without explicit go-ahead —
both are user-visible and hard to un-publish cleanly.
If git push origin HEAD v<version> succeeded but gh release create failed,
the tag is on origin with no release attached. Re-run the gh release create
variant chosen in step 2 whenever you're ready. Do NOT re-run release.sh;
its tag-at-HEAD preflight will correctly refuse.
If the script created the bump commit + tag locally but the publishing
procedure never ran (or was deferred), HEAD will be at the new tag.
Re-running release.sh will refuse (the tag-at-HEAD preflight catches this).
Either:
git tag -d v<version> and git reset --hard HEAD^ to drop the
local tag and bump commit, then retry the script.Use these steps only if the script can't run — e.g. you need a one-off change between bump and tag, or you're on a machine where the script's preflight is too strict.
Tags follow vMAJOR.MINOR.PATCH.
| Change | Bump | |------------------------------------------------|-------| | Bug fix, wording, small cleanup | patch | | New skill, new capability inside a skill | minor | | Breaking change, plugin rename, skill removal | major |
Find the latest tag:
git tag --sort=-v:refname | head -1
OLD=1.0.10; NEW=2.0.0
for f in plugins/rai/.claude-plugin/plugin.json \
plugins/rai/.codex-plugin/plugin.json \
plugins/rai/.cursor-plugin/plugin.json; do
sed -i.bak "s/\"version\": \"$OLD\"/\"version\": \"$NEW\"/" "$f" && rm "$f.bak"
done
Verify every non-example manifest is on the new version — expect exactly 3 matches. Any other count means drift or a missed manifest:
grep -rn "\"version\": \"$NEW\"" .claude-plugin .agents .cursor-plugin plugins | grep -v /examples/ | wc -l
# Expect: 3
git add -u
git commit -m "Release v$NEW"
git tag -a "v$NEW" -m "v$NEW"
Nothing is pushed yet. Pushing the bump commit, pushing the tag, and creating the GitHub release all happen together in the publishing procedure (step 4), under human review.
Publishing follows the same agent-driven, human-gated flow as the scripted
path — see Publishing the GitHub release above. The agent surfaces
context, invites optional commentary, waits for go-ahead, and picks the
matching gh release create invocation.
version fields outside the three official plugin manifests
listed above — this skill is scoped to the supported plugin hosts.data-ai
Configure and train graph neural network (GNN) models, generate predictions, evaluate results, and manage trained models. Use when ready to train, generate predictions, evaluate, or manage models; for concepts, data loading, edges, and feature configuration, see `rai-predictive-modeling`.
development
Build graph neural network (GNN) models — concepts, Snowflake data loading, task relationships, graph edges, and PropertyTransformer features. Use for node classification, regression, and link prediction tasks; for training, predictions, and evaluation, see `rai-predictive-training`.
development
Setup and configuration for RelationalAI — first-time install walkthrough and all raiconfig.yaml tuning. Use when installing RAI, connecting to Snowflake, or editing raiconfig.yaml. Not for writing PyRel model code (see rai-pyrel-coding) or solver usage and diagnostics (see rai-prescriptive-solver-management).
testing
Converts natural language business rules into PyRel derived properties — validation, classification, derivation, alerting, and reconciliation. Use whenever a task assigns each entity a new tier, segment, score, or flag, or derives a new property; author it here as a derived property, then query it with rai-querying.