Agent skill

Moraine Release Publisher

by eric-tramel in eric-tramel/moraine

Cuts and publishes a Moraine release end to end: version bump PR, tag, GitHub release notes, workflow check and PyPI package verification.

Apache-2.0Auto-check passedDevelopment

Install Moraine Release Publisher

skills CLI
$ npx skills add eric-tramel/moraine --skill release -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install eric-tramel/moraine release --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/moraine-dev/skills/release .claude/skills/release && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
release
GitHub stars
117
Token cost
~2.5k tokens
SKILL.md length
919 words
Files
4 (incl. scripts)
Skills in repo
19
Repo updated
First seen
Licence
Apache-2.0

At a glance

Cuts and publishes a Moraine release end to end: version bump PR, tag, GitHub release notes, workflow check and PyPI package verification.

  • Works in 6 steps: Read the active AGENTS.md. → Use Moraine session search if available.… → Inspect… → …
  • Publishing a new version of the Moraine project
  • SKILL.md covers Goal Contract, Preconditions, Branch And Context and Version Bump, plus 7 more sections
  • Runs Python scripts from its folder; calls git, gh and curl; reaches pypi.org

What it does

Invoked with a version, either as /release in Kiro or through the moraine-dev release command in Codex, the skill means publishing the release, not just planning it. It normalizes the version, refuses ambiguous input or a version older than the latest stable GitHub release, and proves that the tag, GitHub release and PyPI version do not exist yet. Edits happen in a dedicated worktree cut from a fresh origin/main.

The steps cover bumping the release-managed versions with a bump-version.py script, opening and merging the release PR, pushing the tag, writing the GitHub release notes for a general audience, and confirming that the release-moraine workflow succeeds and the moraine-cli package appears on PyPI. In Codex the release is kept as a durable goal and in Kiro as a session checklist, and neither is marked complete until every piece of public evidence exists.

When your agent uses it

  • Publishing a new version of the Moraine project
  • Bumping release-managed version files and merging the release PR
  • Verifying the release workflow and the PyPI package after a tag is pushed

Example prompts

  • “Run the Moraine release process for the new version and verify PyPI afterwards.”
  • “Bump the release-managed versions, merge the release PR and push the tag.”
  • “Rewrite the GitHub release notes for the latest Moraine tag so a general audience can follow them.”

Requirements

  • GitHub CLI (gh) signed in with access to the Moraine repository
  • Git with push access to origin
  • Network access to PyPI for verification

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Read the active AGENTS.md.
  2. Use Moraine session search if available. Start broad, then narrow
  3. Inspect .github/workflows/release-moraine.yml.
  4. Read .claude/skills/release-notes/SKILL.md only as the house-format
  5. Verify tooling
  6. Prove the target is unused

What it can do on your machine

Read from SKILL.md and the folder at commit 2fb4aec. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 2 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • git
    • gh
    • curl
    • python3
    • cargo
    • rg
    • uvx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • pypi.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Moraine Release Publisher loads about 2.5k tokens when it runs. Until then it costs about 122 tokens; SKILL.md has 919 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~122
When it runs · the whole SKILL.md, loaded when a task matches
~2.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from eric-tramel/moraine at commit 2fb4aec, republished under its Apache-2.0 licence (© eric-tramel). 919 words, ~2,462 tokens.

Download SKILL.mdSave it as .claude/skills/release/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
release
description
Cut and publish Moraine releases from a version argument such as /release X.Y.Z in Kiro or a request to use $moraine-dev:release in Codex. Use when Codex or Kiro is asked to run Moraine's release process, bump release-managed versions, create and merge the release PR, push the vX.Y.Z tag, update GitHub release notes for a general audience, verify the release-moraine workflow, and confirm the PyPI moraine-cli package. In Codex, start or continue a durable goal for the release.

Release

Run Moraine releases end to end with the shared moraine-dev contributor workflow. Invoke it as $moraine-dev:release X.Y.Z in Codex or /release X.Y.Z in Kiro. Both forms mean: publish vX.Y.Z, not just prepare a plan.

Goal Contract

In Codex, make the release a durable goal before doing release work:

  • If create_goal is available and there is no active goal, call it with: Cut Moraine vX.Y.Z, including version bump PR, merged code, annotated repo tag, GitHub release notes, release workflow verification, and PyPI package verification.
  • If a goal already exists, continue inside it and keep it current with update_plan.
  • Do not call update_goal(status="complete") until all public release evidence exists: merged PR, pushed tag, successful workflow, GitHub release body/assets, and PyPI moraine-cli artifacts.

In Kiro, maintain an explicit checklist in the session. Do not mark the release complete until the same public release evidence exists.

Preconditions

Normalize the argument first:

  • X.Y.Z and vX.Y.Z both mean VERSION=X.Y.Z and TAG=vX.Y.Z.
  • Refuse ambiguous input, missing versions, or a target older than the latest stable GitHub release.

Before editing:

  1. Read the active AGENTS.md.
  2. Use Moraine session search if available. Start broad, then narrow:
    • release process Moraine PyPI GitHub tag
    • v0.5.4 release workflow pypi release notes
    • package-moraine-release release-moraine gh release edit
  3. Inspect .github/workflows/release-moraine.yml.
  4. Read .claude/skills/release-notes/SKILL.md only as the house-format reference for the GitHub release body.
  5. Verify tooling:
    • gh auth status
    • git fetch origin --prune --tags
    • gh repo view --json nameWithOwner,defaultBranchRef,url
  6. Prove the target is unused:
    • git tag --list "$TAG" returns nothing.
    • gh release view "$TAG" fails with not found.
    • curl -fsSL "https://pypi.org/pypi/moraine-cli/$VERSION/json" fails.

Branch And Context

Do release edits in a dedicated worktree from fresh origin/main unless the user explicitly says otherwise. Set branch using the current harness's convention:

HarnessBranch value
Codexcodex/release-$TAG
Kirokiro/release-$TAG
bash
worktree_root="${MORAINE_WORKTREE_ROOT:-../moraine-worktrees}"
mkdir -p "$worktree_root"
git worktree add -b "$branch" "$worktree_root/release-$TAG" origin/main

Gather the changes since the previous stable release:

bash
prev_tag="$(gh release list --limit 20 --json tagName,isDraft,isPrerelease -q \
  '[.[] | select(.isDraft==false and .isPrerelease==false) | .tagName] | .[0]')"
git log --oneline --decorate "$prev_tag"..origin/main
gh pr list --state merged --base main --limit 50 \
  --json number,title,url,mergedAt,body

Read PR bodies for user-visible changes. Release notes should explain what a user can do or what is fixed, not just repeat commit titles.

Version Bump

Run the bundled bump script from the release worktree root:

bash
python3 plugins/moraine-dev/skills/release/scripts/bump-version.py "$VERSION"

Then inspect the diff. Expected version-only files are normally:

  • Cargo.lock
  • bindings/python/moraine_conversations/Cargo.lock path-dependency entries
  • release-managed apps/*/Cargo.toml
  • release-managed crates/*/Cargo.toml
  • .github/workflows/release-moraine.yml example tag, if it still contains the old tag
  • plugins/moraine/.claude-plugin/plugin.json
  • plugins/moraine/.codex-plugin/plugin.json
  • install docs only if they contain an explicit MORAINE_INSTALL_VERSION example for the old tag

Do not bump the package version in bindings/python/moraine_conversations/Cargo.toml; it is a separate internal Python extension package. Its lockfile must still track the release-managed path dependencies.

Validation

Always run:

bash
git diff --check
cargo fmt --all -- --check
cargo test --workspace --locked

Use $moraine-dev:moraine-sandbox-qa in Codex or /moraine-sandbox-qa in Kiro when the release includes ingest, MCP, monitor, ClickHouse schema, source-format, or stack-behavior changes since the previous tag. If that workflow is unavailable, follow the dev sandbox commands required by AGENTS.md: capture the sandbox id with --quiet, run focused checks inside it, and tear it down before reporting completion.

Typical sandbox checks:

bash
id="$(scripts/dev/sandbox/moraine-sandbox up --quiet)"
scripts/dev/sandbox/moraine-sandbox status "$id"
# Run cargo/test commands inside the sandbox per AGENTS.md, then:
scripts/dev/sandbox/moraine-sandbox down "$id"

If moraine-mcp-core or the MCP tool surface changed, run the strongest available MCP smoke test. Prefer scripts/dev/sandbox/agent-smoke-e2e when its API key prerequisites are present; otherwise run focused MCP crate tests and the project smoke tests that are available.

Release PR

Create a focused release commit:

bash
git add Cargo.lock apps crates .github README.md docs
git commit -m "chore(release): cut $TAG"
git push -u origin "$branch"

Open a PR to main titled chore(release): cut $TAG. The PR body must include:

  • what version was bumped,
  • a concise user-facing summary of changes since prev_tag,
  • validation commands and outcomes,
  • operational impact: tag push will run release-moraine and publish PyPI.

Wait for required checks. Merge only when checks pass. Use the repo's normal merge style, then fetch origin/main and verify the merge commit:

bash
gh pr view <number> --json state,mergedAt,mergeCommit,url
git fetch origin main --tags
git log --oneline -1 origin/main

Stop before tagging if the PR is not merged into main.

Show full SKILL.md (331 more words)Show less

Tag And Workflow

Tag the merge commit on origin/main with an annotated tag:

bash
merge_sha="$(gh pr view <number> --json mergeCommit -q .mergeCommit.oid)"
git tag -a "$TAG" "$merge_sha" -m "$TAG"
git push origin "$TAG"

Then wait for the tag-triggered workflow:

bash
run_id="$(gh run list --workflow release-moraine.yml --event push \
  --branch "$TAG" --limit 1 --json databaseId -q '.[0].databaseId')"
gh run watch "$run_id" --exit-status
gh run view "$run_id" --json status,conclusion,url,name,event,headBranch,headSha

The tag-triggered publish-pypi job publishes moraine-cli to PyPI automatically. Manual dispatches default to skip and are not the normal release path.

GitHub Release Notes

Edit the GitHub release body only after the workflow has completed. Matrix jobs can rewrite generated notes while they upload assets.

Use the house format from .claude/skills/release-notes/SKILL.md, adapted to the release size:

  • Patch release: concise headline, what was fixed, upgrade note only if needed, changelog at the bottom.
  • Feature release: install block, "What's new", "Under the hood", platform support only if it changed, upgrade notes if needed, changelog at the bottom.
  • Always dedupe generated changelog blocks. Keep exactly one Full Changelog compare link.

Write for a general Moraine user. Prefer "Moraine now..." and "You can..." over implementation-first phrasing. Link PRs the first time they are mentioned.

Publish with:

bash
gh release edit "$TAG" --notes-file /tmp/moraine-release-notes.md

Verify:

bash
gh release view "$TAG" --json tagName,name,url,body,assets,publishedAt,targetCommitish

Expect six GitHub release assets: three platform bundles and three checksum files, unless the workflow has intentionally changed.

PyPI Verification

Verify the version-specific endpoint, the simple index, aggregate metadata, and an install smoke:

bash
curl -fsSL -H 'Cache-Control: no-cache' \
  "https://pypi.org/pypi/moraine-cli/$VERSION/json" | \
  python3 -c 'import json,sys; d=json.load(sys.stdin); print(d["info"]["version"], len(d["urls"])); print("\n".join(sorted(f["filename"] for f in d["urls"])))'

curl -fsSL -H 'Cache-Control: no-cache' https://pypi.org/simple/moraine-cli/ |
  rg "moraine_cli-$VERSION"

curl -fsSL -H 'Cache-Control: no-cache' https://pypi.org/pypi/moraine-cli/json |
  python3 -c 'import json,sys; d=json.load(sys.stdin); print(d["info"]["version"]); print(len(d["releases"].get("'"$VERSION"'", [])))'

uvx --refresh-package moraine-cli --from "moraine-cli==$VERSION" moraine --version

Expected PyPI files are three wheels plus the stub sdist. PyPI metadata can lag for a short time; retry with no-cache headers before declaring failure.

Stop Conditions

Stop and report clearly if:

  • target tag or PyPI version already exists,
  • gh is unavailable or unauthenticated,
  • version bump diff touches unexpected files,
  • validation fails,
  • the release PR cannot be merged,
  • the tag workflow fails,
  • the GitHub release is missing assets,
  • PyPI does not publish the expected files after reasonable retries.

If a tag has already been pushed, do not delete or recreate it without explicit user instruction.

Final Report

End with the concrete public evidence:

  • merged release PR URL,
  • tag and tagged commit,
  • release workflow run URL and conclusion,
  • GitHub release URL and asset count,
  • PyPI version URL and file count,
  • uvx smoke output,
  • the final general-audience release notes section or a concise excerpt plus the release link.

© eric-tramel, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (scripts) in plugins/moraine-dev/skills/release of eric-tramel/moraine.

  • SKILL.md
  • agents/openai.yaml
  • scripts/bump-version.py
  • scripts/tests/test_bump_version.py

Open the folder on GitHubat commit 2fb4aec

Compare with similar skills

Moraine Release Publisher next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Moraine Release Publisher compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Moraine Release Publisher this skilleric-tramel/moraine117—~2.5kAutomated safety check: PassApache-2.0
EverOS Release WorkflowEverMind-AI/EverOS13k—~1.3kAutomated safety check: PassApache-2.0
Remotion Bits Releaseav/remotion-bits487—~1.2kAutomated safety check: PassNone
Cline CLI Release Publishercline/cline70k—~3.4kAutomated safety check: WarnApache-2.0
Releasehyhmrright/brooks-lint1.5k—~1.2kAutomated safety check: PassMIT
ClawRouter Release ChecklistBlockRunAI/ClawRouter6.6k—~1.4kAutomated safety check: PassMIT

Similar skills

  • EverOS Release Workflow

    EverMind-AI/EverOS

    Walks through cutting a versioned everos release: bump the version, update the changelog, tag it, and review the drafted GitHub Release page before publishing.

    13k GitHub stars~1.3k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Remotion Bits Release

    av/remotion-bits

    Runs the full release of the remotion-bits package: version bump, changelog, registry build, release commit, GitHub release, docs deploy and npm publish.

    487 GitHub stars~1.2k tokensUpdated 23 days ago
    DevelopmentAuto-check passed
  • Walks through releasing the Cline CLI package to npm: release notes, version bump, matching git tag, and either the GitHub workflow or a local publish.

    70k GitHub stars~3.4k tokensUpdated today
    DevelopmentAuto-check: warnings
  • Release

    hyhmrright/brooks-lint

    Cut a brooks-lint release: set the version in package.json, propagate it across all four plugin manifests and every version-bearing text file (README badges, docs site metadata), write the CHANGELOG…

    1.5k GitHub stars~1.2k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • ClawRouter Release Checklist

    BlockRunAI/ClawRouter

    Walks the agent through every ClawRouter release step in order, from the version bump and changelog entry to build, tests, npm publish, git tag and GitHub release.

    6.6k GitHub stars~1.4k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Kanvibe Release Deploy

    rookedsysc/kanvibe

    A skill your agent uses whenever releasing or deploying KanVibe desktop from a clean, up-to-date dev checkout: ask only for the target version and release-note approval, then let the AI update…

    143 GitHub stars~12k tokensUpdated today
    DevelopmentAuto-check: notes

More from eric-tramel/moraine

All 19 skills in this repo
  • Moraine Release Notes

    eric-tramel/moraine

    Rewrites a moraine GitHub release body into a usage-focused format with install block, what's new, platform table, upgrade notes and one deduplicated changelog.

    117 GitHub stars~2.7k tokensUpdated 3 days ago
    Auto-check passed
  • Multi-Persona Code Review

    eric-tramel/moraine

    Coordinates a delegated review of a Moraine PR or local change by seven focused reviewer subagents, merges their findings and follows up on the fixes.

    117 GitHub stars~1.3k tokensUpdated 3 days ago
    Auto-check passed
  • Elegance-Focused Code Review

    eric-tramel/moraine

    Looks at a pull request for the smallest good design, hunting for simplifications and architectural moves that remove whole classes of problems.

    117 GitHub stars~473 tokensUpdated 3 days ago
    Auto-check passed
  • Idiomatic Code Review

    eric-tramel/moraine

    Reviews a pull request for idiomatic implementation: use of the language, standard library, ecosystem conventions and the repository's own patterns.

    117 GitHub stars~469 tokensUpdated 3 days ago
    Auto-check passed
  • Code Review Security Review

    eric-tramel/moraine

    Review a PR through the CodeReviewSecurityReview persona. An agent skill from eric-tramel/moraine.

    117 GitHub stars~497 tokensUpdated 3 days ago
    Auto-check passed
  • Crystallize

    eric-tramel/moraine

    Turn a rough feature, bug, refactor, architecture, documentation, or operations idea into a ready-to-implement local plan file.

    117 GitHub stars~1.6k tokensUpdated 3 days ago
    Auto-check passed

Works with

Categories

Questions about Moraine Release Publisher

What does Moraine Release Publisher do?

Cuts and publishes a Moraine release end to end: version bump PR, tag, GitHub release notes, workflow check and PyPI package verification. Invoked with a version, either as /release in Kiro or through the moraine-dev release command in Codex, the skill means publishing the release, not just planning it. It normalizes the version, refuses ambiguous input or a version older than the latest stable GitHub release, and proves that the tag, GitHub release and PyPI version do not exist yet.

When should I use Moraine Release Publisher?

Moraine Release Publisher fits situations like: publishing a new version of the Moraine project; bumping release-managed version files and merging the release PR; verifying the release workflow and the PyPI package after a tag is pushed.

How do I install Moraine Release Publisher in Claude Code?

Run `npx skills add eric-tramel/moraine --skill release -a claude-code`. Or copy the skill folder (plugins/moraine-dev/skills/release in eric-tramel/moraine) into .claude/skills/release in your project. Claude Code loads it when a task matches its description.

How do I install Moraine Release Publisher in Codex?

Run `npx skills add eric-tramel/moraine --skill release -a codex`. Or copy the skill folder (plugins/moraine-dev/skills/release in eric-tramel/moraine) into .agents/skills/release in your project. Codex loads it when a task matches its description.

Can I use Moraine Release Publisher in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add eric-tramel/moraine --skill release -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/release, .gemini/skills/release, .github/skills/release and .opencode/skills/release in your project.

What does Moraine Release Publisher need to run?

Going by SKILL.md and its folder, Moraine Release Publisher needs Python for the scripts in its folder and the command-line tools its instructions call (git, gh, curl, python3, cargo and rg). Our summary lists: GitHub CLI (gh) signed in with access to the Moraine repository; Git with push access to origin; Network access to PyPI for verification.

Does Moraine Release Publisher access the network?

SKILL.md names 1 domain. In commands or code: pypi.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Moraine Release Publisher safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Moraine Release Publisher use?

Moraine Release Publisher is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Moraine Release Publisher use?

About 2.5k tokens (SKILL.md is roughly 9.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Moraine Release Publisher?

Skills that share tags, products or a category with Moraine Release Publisher: EverOS Release Workflow (EverMind-AI/EverOS, 13k stars), Remotion Bits Release (av/remotion-bits, 487 stars), Cline CLI Release Publisher (cline/cline, 70k stars) and Release (hyhmrright/brooks-lint, 1.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Moraine Release Publisher?

eric-tramel (a GitHub user) maintains it in eric-tramel/moraine, which has 117 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 5, 2026.

Source: eric-tramel/moraine on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.