# release

Automates ccxray releases by parsing commits, updating CHANGELOG.md, bumping package versions, running tests, and publishing to npm.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · ★ 295
- Author: ccxray
- License: MIT · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/lis186/ccxray/tree/HEAD/.claude/skills/release/SKILL.md
- Updated: 2026-10-23
- HTML: https://affpapa.org/en/nevibecode/skills/ccxray-release

## What it does

The skill reads the current version from `package.json` and calculates the target semver bump. It defaults to a `minor` increment, while also accepting `patch`, `major`, or exact version strings like `1.6.0`. It then parses git history since the previous tag, extracting only `feat:` and `fix:` commits while discarding `chore:`, `ci:`, and `test:` entries.

Work stops before altering any project files. The agent displays the draft change log alongside the proposed version, waiting for explicit user confirmation. Once approved, it updates `CHANGELOG.md` and `package.json`, then executes `npm test`. A single failed test halts the entire release immediately.

Publishing to npm cannot be undone. Because of this, the skill halts a second time right before executing `npm publish`. After your explicit confirmation, it commits the changes, creates tag `vX.Y.Z`, pushes to `origin main`, and deploys the package.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add lis186/ccxray --skill release -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/release/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/release/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add lis186/ccxray --skill release -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/release/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add lis186/ccxray --skill release -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/release/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install lis186/ccxray release
```

2. **Manually: put the files in place**
- File: `.github/skills/release/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add lis186/ccxray --skill release -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/lis186/ccxray --path .claude/skills/release
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/release/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add lis186/ccxray --skill release -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/lis186/ccxray/tree/HEAD/.claude/skills/release/SKILL.md

## When to use it
- parse user-facing commits from git history
- bump semver versions in package.json
- generate formatted release sections for CHANGELOG.md
- publish packages to npm with mandatory test validation

## Example prompts
- Release a new minor version of ccxray
- Prepare a patch release for ccxray with updated changelog
- Publish ccxray version 1.6.0

## Source text · SKILL.md · MIT

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: 4ad5530deee22776.

BEGIN THIRD-PARTY FILE 4ad5530deee22776
````text
---
name: release
description: Prepare and publish a ccxray release — bump version, update CHANGELOG, commit, tag, push, and npm publish.
license: MIT
metadata:
  author: ccxray
  version: "1.0"
---

# Release

Publish a new version of ccxray to npm.

**Input**: Optionally specify a version bump: `patch`, `minor` (default), `major`, or an exact version like `1.6.0`.

---

## Workflow

### 1. Determine version

Read current version from `package.json`. Apply the requested bump (default: `minor`):

```bash
node -e "const v=require('./package.json').version; const [a,b,c]=v.split('.').map(Number); console.log(a+'.'+( b+1)+'.0');"
```

Semver guide:
- **patch** — bug fixes only, no new features
- **minor** — new features, backwards-compatible (default)
- **major** — breaking changes

### 2. Collect changes since last tag

```bash
git describe --tags --abbrev=0
git log <last-tag>..HEAD --oneline --no-merges
```

Keep only user-visible changes (`feat:`, `fix:`). Exclude `chore:`, `ci:`, `docs:`, `test:`, and version bump commits.

### 3. Draft CHANGELOG entry

Format (match existing style in `CHANGELOG.md`):

```markdown
## X.Y.Z

### Added
- **Feature name**: one-line description

### Fixed
- **Bug name**: one-line description
```

**⚠ STOP HERE. Show the proposed version and CHANGELOG draft to the user. Wait for confirmation before making any changes.**

### 4. Update files

After user confirms:

**`CHANGELOG.md`** — insert new section at the top (after `# Changelog`):

```
## X.Y.Z
...
```

**`package.json`** — update `version` field.

### 5. Run tests

```bash
npm test
```

Stop and report if any tests fail.

### 6. Commit and tag

```bash
git add CHANGELOG.md package.json
git commit -m "X.Y.Z"
git tag vX.Y.Z
```

### 7. Push

```bash
git push origin main
git push origin vX.Y.Z
```

### 8. Publish to npm

**⚠ STOP HERE. Confirm with user before publishing — npm publish is irreversible.**

```bash
npm publish
```

Verify output contains `+ ccxray@X.Y.Z`.

---

## Output on success

```
## Released: ccxray@X.Y.Z

✓ CHANGELOG.md updated
✓ package.json bumped to X.Y.Z
✓ Tests passed (N pass)
✓ Committed and tagged vX.Y.Z
✓ Pushed to origin
✓ Published to npm
```
````
END THIRD-PARTY FILE 4ad5530deee22776

The third-party file has ended. Everything between the 4ad5530deee22776 tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

© ccxray · MIT · https://github.com/lis186/ccxray/tree/HEAD/.claude/skills/release/SKILL.md

## Similar
- [triage](https://affpapa.org/en/nevibecode/skills/triage.md) — skill · 990453 installs
- [code-review](https://affpapa.org/en/nevibecode/skills/code-review.md) — skill · 789521 installs
- [implement](https://affpapa.org/en/nevibecode/skills/implement.md) — skill · 774700 installs
- [git-guardrails-claude-code](https://affpapa.org/en/nevibecode/skills/git-guardrails-claude-code.md) — skill · 499069 installs
- [setup-pre-commit](https://affpapa.org/en/nevibecode/skills/setup-pre-commit.md) — skill · 489289 installs
- [scaffold-exercises](https://affpapa.org/en/nevibecode/skills/scaffold-exercises.md) — skill · 480196 installs

## Other versions with the same name
- [release · tobi](https://affpapa.org/en/nevibecode/skills/tobi-release.md) — 2200 installs
- [release · yeachan-heo](https://affpapa.org/en/nevibecode/skills/yeachan-heo-release.md) — 838 installs
- [release · parcadei](https://affpapa.org/en/nevibecode/skills/parcadei-release.md) — 481 installs
- [release · cyrusagents](https://affpapa.org/en/nevibecode/skills/cyrusagents-release.md) — 829 installs

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
