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.
Cuts and publishes a Moraine release end to end: version bump PR, tag, GitHub release notes, workflow check and PyPI package verification.
$ npx skills add eric-tramel/moraine --skill release -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install eric-tramel/moraine release --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "release" agent skill from https://github.com/eric-tramel/moraine/tree/main/plugins/moraine-dev/skills/release into .claude/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/eric-tramel/moraine/tree/main/plugins/moraine-dev/skills/releaseType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add eric-tramel/moraine --skill release -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install eric-tramel/moraine release --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/moraine-dev/skills/release .agents/skills/release && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "release" agent skill from https://github.com/eric-tramel/moraine/tree/main/plugins/moraine-dev/skills/release into .agents/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add eric-tramel/moraine --skill release -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install eric-tramel/moraine release --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/moraine-dev/skills/release .cursor/skills/release && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "release" agent skill from https://github.com/eric-tramel/moraine/tree/main/plugins/moraine-dev/skills/release into .cursor/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/eric-tramel/moraine.git --path plugins/moraine-dev/skills/release--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add eric-tramel/moraine --skill release -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install eric-tramel/moraine release --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/moraine-dev/skills/release .gemini/skills/release && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "release" agent skill from https://github.com/eric-tramel/moraine/tree/main/plugins/moraine-dev/skills/release into .gemini/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install eric-tramel/moraine releaseInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add eric-tramel/moraine --skill release -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/moraine-dev/skills/release .github/skills/release && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "release" agent skill from https://github.com/eric-tramel/moraine/tree/main/plugins/moraine-dev/skills/release into .github/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add eric-tramel/moraine --skill release -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install eric-tramel/moraine release --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/moraine-dev/skills/release .opencode/skills/release && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "release" agent skill from https://github.com/eric-tramel/moraine/tree/main/plugins/moraine-dev/skills/release into .opencode/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
releaseCuts 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. 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.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 2fb4aec. It shows what the files ask for, not the result of running them.
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.
Ships 2 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
gitghcurlpython3cargorguvxFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
pypi.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from eric-tramel/moraine at commit 2fb4aec, republished under its Apache-2.0 licence (© eric-tramel). 919 words, ~2,462 tokens.
.claude/skills/release/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.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.
In Codex, make the release a durable goal before doing release work:
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.update_plan.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.
Normalize the argument first:
X.Y.Z and vX.Y.Z both mean VERSION=X.Y.Z and TAG=vX.Y.Z.Before editing:
AGENTS.md.release process Moraine PyPI GitHub tagv0.5.4 release workflow pypi release notespackage-moraine-release release-moraine gh release edit.github/workflows/release-moraine.yml..claude/skills/release-notes/SKILL.md only as the house-format
reference for the GitHub release body.gh auth statusgit fetch origin --prune --tagsgh repo view --json nameWithOwner,defaultBranchRef,urlgit tag --list "$TAG" returns nothing.gh release view "$TAG" fails with not found.curl -fsSL "https://pypi.org/pypi/moraine-cli/$VERSION/json" fails.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:
| Harness | Branch value |
|---|---|
| Codex | codex/release-$TAG |
| Kiro | kiro/release-$TAG |
worktree_root="${MORAINE_WORKTREE_ROOT:-../moraine-worktrees}"
mkdir -p "$worktree_root"
git worktree add -b "$branch" "$worktree_root/release-$TAG" origin/mainGather the changes since the previous stable release:
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,bodyRead PR bodies for user-visible changes. Release notes should explain what a user can do or what is fixed, not just repeat commit titles.
Run the bundled bump script from the release worktree root:
python3 plugins/moraine-dev/skills/release/scripts/bump-version.py "$VERSION"Then inspect the diff. Expected version-only files are normally:
Cargo.lockbindings/python/moraine_conversations/Cargo.lock path-dependency entriesapps/*/Cargo.tomlcrates/*/Cargo.toml.github/workflows/release-moraine.yml example tag, if it still contains
the old tagplugins/moraine/.claude-plugin/plugin.jsonplugins/moraine/.codex-plugin/plugin.jsonMORAINE_INSTALL_VERSION
example for the old tagDo 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.
Always run:
git diff --check
cargo fmt --all -- --check
cargo test --workspace --lockedUse $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:
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.
Create a focused release commit:
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:
prev_tag,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:
gh pr view <number> --json state,mergedAt,mergeCommit,url
git fetch origin main --tags
git log --oneline -1 origin/mainStop before tagging if the PR is not merged into main.
Tag the merge commit on origin/main with an annotated tag:
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:
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,headShaThe tag-triggered publish-pypi job publishes moraine-cli to PyPI
automatically. Manual dispatches default to skip and are not the normal
release path.
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:
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:
gh release edit "$TAG" --notes-file /tmp/moraine-release-notes.mdVerify:
gh release view "$TAG" --json tagName,name,url,body,assets,publishedAt,targetCommitishExpect six GitHub release assets: three platform bundles and three checksum files, unless the workflow has intentionally changed.
Verify the version-specific endpoint, the simple index, aggregate metadata, and an install smoke:
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 --versionExpected 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 and report clearly if:
gh is unavailable or unauthenticated,If a tag has already been pushed, do not delete or recreate it without explicit user instruction.
End with the concrete public evidence:
uvx smoke output,© 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
SKILL.md and 3 other files (scripts) in plugins/moraine-dev/skills/release of eric-tramel/moraine.
Open the folder on GitHubat commit 2fb4aec
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Moraine Release Publisher this skilleric-tramel/moraine | 117 | — | ~2.5k | Automated safety check: Pass | Apache-2.0 | |
| EverOS Release WorkflowEverMind-AI/EverOS | 13k | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Remotion Bits Releaseav/remotion-bits | 487 | — | ~1.2k | Automated safety check: Pass | None | |
| Cline CLI Release Publishercline/cline | 70k | — | ~3.4k | Automated safety check: Warn | Apache-2.0 | |
| Releasehyhmrright/brooks-lint | 1.5k | — | ~1.2k | Automated safety check: Pass | MIT | |
| ClawRouter Release ChecklistBlockRunAI/ClawRouter | 6.6k | — | ~1.4k | Automated safety check: Pass | MIT |
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.
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.
cline/cline
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.
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…
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.
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…
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.
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.
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.
eric-tramel/moraine
Reviews a pull request for idiomatic implementation: use of the language, standard library, ecosystem conventions and the repository's own patterns.
eric-tramel/moraine
Review a PR through the CodeReviewSecurityReview persona. An agent skill from eric-tramel/moraine.
eric-tramel/moraine
Turn a rough feature, bug, refactor, architecture, documentation, or operations idea into a ready-to-implement local plan file.
Works with
Categories
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.