一键导入
plainx-release
// Releases plainx packages with version suggestions, changelog generation, and git tagging. Use when releasing a package to PyPI.
// Releases plainx packages with version suggestions, changelog generation, and git tagging. Use when releasing a package to PyPI.
Upgrades Plain packages and applies required migration changes. Use when updating to newer package versions.
Captures and analyzes performance traces to identify slow queries and N+1 problems. Use when a page is slow, there are too many queries, or the user asks about performance.
Answer questions about the Plain framework by researching docs and source code. Use when asked "how do I...", "does Plain support...", or "how does X work?" questions.
Check overall database health — schema correctness and operational health. Use when asked to check the database, validate schema, optimize indexes, or diagnose Postgres problems.
Submit a bug report for the Plain framework. Use when the user wants to report a bug, error, or unexpected behavior. Collects context and creates a GitHub issue.
Open a remote Python shell on a production machine via encrypted tunnel. Use when you need to inspect production data, debug issues, run queries, or transfer files.
| name | plainx-release |
| description | Releases plainx packages with version suggestions, changelog generation, and git tagging. Use when releasing a package to PyPI. |
| disable-model-invocation | true |
Release a plainx package with version bumping, changelog generation, and git tagging.
/plainx-release [--major|--minor|--patch]
--major: auto-select major release--minor: auto-select minor release--patch: auto-select patch release| Script | Purpose |
|---|---|
get-package-info | Get package metadata and commits since last release |
Check git status is clean:
git status --porcelain
If not clean, stop and ask user to commit or stash changes.
uv run ./.claude/skills/plainx-release/get-package-info
This outputs JSON with:
name: Package name from pyproject.tomlcurrent_version: Current versionchangelog_path: Path to CHANGELOG.mdlast_tag: Most recent git tag for this packagerepo_url: GitHub URL (extracted from pyproject.toml)commits: List of commits since last tag (excluding tests)If no commits since last release, inform the user and stop.
If current_version is 0.0.0, this is the first release:
uv version <version> to set it directly)--major, --minor, or --patch was passed, auto-select that typeFor first releases (from 0.0.0):
uv version <version>
Where <version> is the chosen version like 0.1.0 or 1.0.0.
For subsequent releases:
uv version --bump <type>
Where <type> is major, minor, or patch.
Get the new version:
uv version --short
Get the file changes since the last release:
git diff <last_tag>..HEAD -- . ":(exclude)tests"
If no last_tag, use the initial commit or recent history.
Read the existing <changelog_path> file.
Prepend a new release entry to the changelog.
For first releases:
## [<new_version>](<repo_url>/releases/v<new_version>) (<today's date>)
Initial release.
- Brief summary of what the package provides
- Key features or capabilities
For subsequent releases:
## [<new_version>](<repo_url>/releases/v<new_version>) (<today's date>)
### What's changed
- Summarize user-facing changes based on the actual diff (not just commit messages)
- Include commit hash links: ([abc1234](<repo_url>/commit/abc1234))
- Skip test changes, internal refactors that don't affect public API
### Upgrade instructions
- Specific steps if any API changed
- If no changes required: "- No changes required."
Guide the user through these steps explicitly:
Stage files:
git add pyproject.toml <changelog_path> uv.lock
Show what will be committed:
git diff --cached --stat
Create commit:
git commit -m "Release v<new_version>"
Create tag:
git tag -a v<new_version> -m "Release v<new_version>"
GitHub Workflow Setup (first release only):
Check if .github/workflows/release.yml exists. If not, ask:
"No release workflow found. Would you like to set up GitHub Actions to publish to PyPI when you push a tag?"
If yes, copy .claude/skills/plainx-release/release-workflow.yml to .github/workflows/release.yml, then amend the commit:
git add .github/workflows/release.yml
git commit --amend --no-edit
git tag -fa v<new_version> -m "Release v<new_version>"
Remind the user to configure PyPI trusted publishing after pushing:
Push commit and tag:
git push && git push --tags
Ask user to confirm before each destructive step (commit, push).
After pushing, wait for the GitHub workflow to publish to PyPI. Once published, ask the user if they want to create a GitHub release:
gh release create v<new_version> --notes "<changelog entry summary>"
Or to use the full changelog entry from the file, extract and pass it manually.
Consider the current version when suggesting release types:
Most packages stay pre-1.0 for a long time. For these packages:
Once a package has reached 1.0, follow semver strictly: