This skill should be used when releasing tunacode-cli to PyPI.

MITAuto-check passedDevelopment

Install Pypi Release

skills CLI
$ npx skills add alchemiststudiosDOTai/tunacode --skill pypi-release -a claude-code

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

GitHub CLI
$ gh skill install alchemiststudiosDOTai/tunacode pypi-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/alchemiststudiosDOTai/tunacode.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/pypi-release .claude/skills/pypi-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
pypi-release
GitHub stars
125
Token cost
~2.2k tokens
SKILL.md length
734 words
Files
6 (incl. scripts, references)
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

This skill should be used when releasing tunacode-cli to PyPI.

  • Works in 6 steps: Bump Version → 5: Update CHANGELOG → MANDATORY - Test the Build Locally → …
  • Tasks that involve CI/CD
  • SKILL.md covers Overview, When to Use This Skill, Core Release Workflow and Troubleshooting, plus 5 more sections
  • Runs Python scripts from its folder; calls git, gh and ruff; needs PYPI_API_TOKEN

What it does

Pypi Release is an agent skill from alchemiststudiosDOTai/tunacode. This skill should be used when releasing tunacode-cli to PyPI. It keeps the existing local release checks, then hands the actual PyPI upload to a GitHub Actions workflow that uses the repository's PYPIAPITOKEN secret.

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `references/common-issues.md`, `references/workflow-structure.md` and `scripts/bump_version.py`).

It sits in Development, covering CI/CD and Git workflow. It works with GitHub Actions, Git, tmux and OpenAI. The repository describes itself as: 🍣 TunaCode AI CLI coding agent with safe git branches, rich tools & multi-LLM support. The licence is MIT.

When your agent uses it

  • Tasks that involve CI/CD
  • Tasks that involve Git workflow

Example prompts

  • “/pypi-release”

Requirements

  • Python 3
  • A credential in PYPI_API_TOKEN

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Bump Version
  2. 5: Update CHANGELOG
  3. MANDATORY - Test the Build Locally
  4. Commit and Push the Release Commit
  5. Trigger the GitHub Actions Publish Workflow
  6. Monitor Workflow

What it can do on your machine

Read from SKILL.md and the folder at commit 1b39d1f. 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 3 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • git
    • gh
    • ruff
    • pytest
    • uv
    • python
    • pip

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

  • Network

    Links to these hosts (documentation or services it may open):

    • pypi.org

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

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • PYPI_API_TOKEN

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

Context cost

Pypi Release loads about 2.2k tokens when it runs, and up to ~4.5k if it reads all its reference files. Until then it costs about 58 tokens; SKILL.md has 734 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~58
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.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 alchemiststudiosDOTai/tunacode at commit 1b39d1f, republished under its MIT licence (© alchemiststudiosDOTai). 734 words, ~2,209 tokens.

Download SKILL.mdSave it as .claude/skills/pypi-release/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
pypi-release
description
This skill should be used when releasing tunacode-cli to PyPI. It keeps the existing local release checks, then hands the actual PyPI upload to a GitHub Actions workflow that uses the repository's PYPI_API_TOKEN secret.

PyPI Release Automation

Overview

Keep the existing local release gates for tunacode-cli, then hand the actual PyPI upload to GitHub Actions. This keeps the release checks local while moving the credentialed publish step into the repository workflow.

When to Use This Skill

Trigger this skill when the user requests:

  • "Release to PyPI"
  • "Publish a new version"
  • "Create a release"
  • "Bump version and release"
  • "Push a new version to PyPI"

Core Release Workflow

The skill provides two approaches: Manual (REQUIRED) and Automated (deprecated - skips critical test step).

WARNING: The automated script is currently discouraged because it skips the mandatory manual test step.

Use the Manual Release workflow below instead to ensure proper testing before release.

Execute the full release workflow with a single script:

~~```bash uv run python skills/pypi-release/scripts/release.py


~~The script performs these steps automatically:~~
1. ~~Pre-flight checks (git status, branch check, linting, tests)~~
2. ~~Version bump~~
3. ~~Git operations (commit, tag, push)~~
4. ~~GitHub release~~
5. ~~Workflow monitoring~~

**Issue:** The automated script does not include the mandatory manual import test (Step 3) which has caused multiple broken releases. Always use the manual workflow.

### Manual Release (REQUIRED - Step-by-Step)

**This is the ONLY recommended workflow. Follow these steps in order:**

#### Step 1: Pre-flight Checks

Verify the repository is ready for release:

```bash
# Check git status (must be clean)
git status

# Verify on master branch
git branch --show-current

# Run linting
ruff check .

# Run tests
source .venv/bin/activate && pytest tests/ -q

# MANDATORY: Run tmux E2E tool tests (all 6 must pass)
uv run pytest tests/system/cli/test_tmux_tools.py -v -m tmux

HARD GATE: If the tmux tool tests fail, DO NOT proceed with the release. These tests verify all 6 tools (bash, read_file, write_file, update_file, discover, web_fetch) work end-to-end in the real TUI. No exceptions.

Step 2: Bump Version

Use the version bumping script:

bash
uv run python skills/pypi-release/scripts/bump_version.py

The script:

  • Reads current version from pyproject.toml
  • Increments the patch number (rightmost digit)
  • Updates four files:
    • pyproject.toml:8 (project version)
    • pyproject.toml:175 (hatch script version)
    • src/tunacode/constants.py:12 (APP_VERSION constant)
    • README.md (version header)
Step 2.5: Update CHANGELOG

REQUIRED: Manually update CHANGELOG.md with the new version entry.

  1. Check commits since last release:

    bash
    git log --oneline $(git describe --tags --abbrev=0)..HEAD --no-merges
  2. Add entry under ## [Unreleased]:

    markdown
    ## [X.Y.Z.W] - YYYY-MM-DD
    
    ### Added
    - New features
    
    ### Changed
    - Changes to existing functionality
    
    ### Fixed
    - Bug fixes
  3. Stage the file:

    bash
    git add CHANGELOG.md
Step 3: MANDATORY - Test the Build Locally

CRITICAL: You MUST test that tunacode actually works before releasing!

Test the import and basic functionality:

bash
# Activate venv and test import
source .venv/bin/activate && python -c "from tunacode.ui.main import app; print('✓ Import successful')"

# Optionally test the CLI starts without errors
python -m tunacode.ui.main --help

If the import fails, DO NOT PROCEED with the release! Fix the issue first, then re-test.

This step prevents releasing broken packages to PyPI (which cannot be undone).

Step 4: Commit and Push the Release Commit

Commit the version changes and push them to master:

bash
# Stage version files (CHANGELOG.md should already be staged from Step 2.5)
git add pyproject.toml src/tunacode/constants.py README.md CHANGELOG.md

# Commit with conventional commit message
git commit -m "chore: bump version to X.Y.Z.W"

# Push to remote
git push origin master
Step 5: Trigger the GitHub Actions Publish Workflow

Run the manual publish workflow after the local checks and release commit have passed:

bash
gh workflow run publish-release.yml --ref master -f version=X.Y.Z.W

This workflow:

  • Checks that pyproject.toml and src/tunacode/constants.py match the requested version
  • Builds the distribution artifacts
  • Runs twine check on the built artifacts
  • Publishes to PyPI using the repository PYPI_API_TOKEN secret
Step 6: Monitor Workflow

Check the status of the GitHub Actions workflow:

bash
# List recent workflow runs
gh run list --workflow=publish-release.yml --limit 1

# Watch workflow in real-time
gh run watch

# View logs if failed
gh run view <run-id> --log-failed

Troubleshooting

Workflow Failures

If the GitHub Actions workflow fails:

  1. Check workflow status:

    bash
    gh run list --workflow=publish-release.yml --limit 1
  2. View failure logs:

    bash
    gh run view <run-id> --log-failed
  3. Common issues: See references/common-issues.md for detailed troubleshooting

Version Consistency Errors

If the workflow reports version mismatch between the requested version and the code:

  1. Verify all four version locations match:

    bash
    grep 'version = ' pyproject.toml
    grep 'APP_VERSION' src/tunacode/constants.py
    grep '^## v' README.md | head -1
  2. Re-run bump_version.py script to sync versions

  3. Push the corrected commit and re-run:

    bash
    git push origin master
    gh workflow run publish-release.yml --ref master -f version=X.Y.Z.W
Show full SKILL.md (331 more words)Show less
Python Version Mismatch

If the workflow fails with Python version errors:

  1. Check .github/workflows/publish-release.yml line 20
  2. Ensure python-version: '3.12' (not '3.x')
  3. Commit the fix and update the tag to include it

Common error message:

ERROR: Package 'tunacode-cli' requires a different Python: 3.14.0 not in '<3.14,>=3.10'

Fix: Pin Python version in workflow to 3.12

Key Files and Locations

Version Files (Must Stay Synchronized)
  1. pyproject.toml:8 - Project version in [project] section
  2. pyproject.toml:175 - Hatch script version
  3. src/tunacode/constants.py:12 - APP_VERSION constant
  4. README.md - Version header (line 40)
  5. CHANGELOG.md - Version history (manual update required)
Workflow Configuration
  • .github/workflows/publish-release.yml - Manual GitHub Actions workflow
    • Triggers with workflow_dispatch
    • Validates the requested version against the checked-out code
    • Builds the distribution and runs twine check
    • Publishes to PyPI using PYPI_API_TOKEN
Scripts
  • scripts/bump_version.py - Atomic version bumping across all files
  • scripts/release.py - Full automated release workflow
References
  • references/common-issues.md - Detailed troubleshooting guide for common problems
  • references/workflow-structure.md - Complete GitHub Actions workflow documentation

Prerequisites

Ensure these are configured before releasing:

  1. GitHub CLI authenticated:

    bash
    gh auth status
  2. PyPI API token configured as PYPI_API_TOKEN in repository secrets

  3. Clean git state - all changes committed

  4. On master branch

  5. Tests passing - pytest tests/

  6. Linting passing - ruff check .

Post-Release Verification

After a successful release:

  1. Verify on PyPI:

  2. Test installation:

    bash
    pip install --upgrade tunacode-cli
    tunacode --version

Debugging Workflow Issues

When the workflow fails, follow this debug process:

  1. Identify the failure point from workflow logs
  2. Consult references/common-issues.md for known problems
  3. Fix the issue (workflow config, version files, etc.)
  4. Push the fix to master:
    bash
    git push origin master
  5. Re-trigger the workflow:
    bash
    gh workflow run publish-release.yml --ref master -f version=X.Y.Z.W
  6. Monitor until success

No Rollback Policy

This skill does not implement automatic rollback. If a release fails:

  1. Diagnose the issue using logs and references
  2. Fix the underlying problem
  3. Push the corrected release commit
  4. Re-run the workflow

Rationale: PyPI releases are immutable once published. The version number cannot be reused. Focus on fixing forward rather than rolling back.

© alchemiststudiosDOTai, MIT. 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 5 other files (scripts, references) in skills/pypi-release of alchemiststudiosDOTai/tunacode.

  • SKILL.md
  • references/common-issues.md
  • references/workflow-structure.md
  • scripts/bump_version.py
  • scripts/local_publish.py
  • scripts/release.py

Open the folder on GitHubat commit 1b39d1f

Compare with similar skills

Pypi Release 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.

Pypi Release compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Pypi Release this skillalchemiststudiosDOTai/tunacode125—~2.2kAutomated safety check: PassMIT
Update Dependenciesalorence/django-modern-rpc111—~1.3kAutomated safety check: PassMIT
npm Package Publisherklaudworks/universal-skills181—~923Automated safety check: PassMIT
Release Lithoxylmahmoud/lithoxyl146—~1.3kAutomated safety check: PassBSD-3-Clause
Python Pypi Package Buildergithub/awesome-copilot40k1 repos~4.6kAutomated safety check: PassMIT
Push and PyPI Releaseliaohch3/claude-tap3.3k—~509Automated safety check: PassMIT

Similar skills

  • Update Dependencies

    alorence/django-modern-rpc

    Routine update of all project dependencies — uv itself, uv.lock (all groups), tool versions pinned in GitHub workflows and .pre-commit-config.yaml (uv, ruff, mypy...), and SHA-pinned GitHub Actions.

    111 GitHub stars~1.3k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • npm Package Publisher

    klaudworks/universal-skills

    Releases an npm package by committing changes, bumping the version with npm version, pushing the tag and checking the GitHub Actions publish.

    181 GitHub stars~923 tokensUpdated 8 mo ago
    DevelopmentAuto-check passed
  • Release Lithoxyl

    mahmoud/lithoxyl

    Walks through releasing the lithoxyl Python package to PyPI: CalVer version bump, tagging, pushing and checking the published release.

    146 GitHub stars~1.3k tokensUpdated 2 mo ago
    DevelopmentAuto-check passed
  • Python Pypi Package Builder

    github/awesome-copilot

    Official

    End-to-end skill for building, testing, linting, versioning, and publishing a production-grade Python library to PyPI.

    40k GitHub starsUsed in 1 repo~4.6k tokens
    DevelopmentAuto-check passed
  • Push and PyPI Release

    liaohch3/claude-tap

    Pushes the current work to GitHub and, when pending commits change code, bumps the version in pyproject.toml so CI publishes a new PyPI release.

    3.3k GitHub stars~509 tokensUpdated 17 days ago
    DevelopmentAuto-check passed
  • CI Automation

    jeremylongshore/tons-of-skills-marketplace

    A skill your agent uses when running GitHub Actions locally, creating task runner recipes, generating changelogs from git history, managing GitHub PRs/issues/releases programmatically, or creating…

    2.8k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check: notes

More from alchemiststudiosDOTai/tunacode

  • Audit Harness

    alchemiststudiosDOTai/tunacode

    A skill your agent uses when auditing HARNESS.md, pre-commit hooks, pre-push hooks, architecture gates, or CI workflows for tunacode-cli.

    125 GitHub stars~769 tokensUpdated 3 days ago
    Auto-check passed

Questions about Pypi Release

What does Pypi Release do?

This skill should be used when releasing tunacode-cli to PyPI. Pypi Release is an agent skill from alchemiststudiosDOTai/tunacode. This skill should be used when releasing tunacode-cli to PyPI.

When should I use Pypi Release?

Pypi Release fits situations like: tasks that involve CI/CD; tasks that involve Git workflow.

How do I install Pypi Release in Claude Code?

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

How do I install Pypi Release in Codex?

Run `npx skills add alchemiststudiosDOTai/tunacode --skill pypi-release -a codex`. Or copy the skill folder (skills/pypi-release in alchemiststudiosDOTai/tunacode) into .agents/skills/pypi-release in your project. Codex loads it when a task matches its description.

Can I use Pypi Release 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 alchemiststudiosDOTai/tunacode --skill pypi-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/pypi-release, .gemini/skills/pypi-release, .github/skills/pypi-release and .opencode/skills/pypi-release in your project.

What does Pypi Release need to run?

Going by SKILL.md and its folder, Pypi Release needs Python for the scripts in its folder, the command-line tools its instructions call (git, gh, ruff, pytest, uv and python) and credentials named PYPI_API_TOKEN. Our summary lists: Python 3; A credential in PYPI_API_TOKEN.

Does Pypi Release access the network?

SKILL.md names 1 domain. As links in the text: pypi.org. This is read from the text; nothing was executed.

Is Pypi Release 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 Pypi Release use?

Pypi Release is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Pypi Release use?

About 2.2k tokens (SKILL.md is roughly 8.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.3k tokens, read only when the agent opens those files.

What are the alternatives to Pypi Release?

Skills that share tags, products or a category with Pypi Release: Update Dependencies (alorence/django-modern-rpc, 111 stars), npm Package Publisher (klaudworks/universal-skills, 181 stars), Release Lithoxyl (mahmoud/lithoxyl, 146 stars) and Python Pypi Package Builder (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Pypi Release?

alchemiststudiosDOTai (a GitHub organization) maintains it in alchemiststudiosDOTai/tunacode, which has 125 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 5, 2026.

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