---
name: create-new-release
description: Create and push a new semver release tag. Asks for release type (patch/minor/major), validates commit exists on remote, bumps version, and pushes the tag.
---

# Create New Release

Create and push a new semantic version release tag.

## Steps

1. **Ask release type**: Use AskUserQuestion to ask if this is a patch, minor, or major release.

2. **Fetch latest tags from remote**:
   ```bash
   git fetch --tags origin
   ```

3. **Get the latest semver tag** (assumes `v` prefix like `v1.2.3`):
   ```bash
   git tag --sort=-version:refname -l 'v*' | head -1
   ```

4. **Parse and bump version** based on user selection:
   - **patch**: `v1.2.3` → `v1.2.4`
   - **minor**: `v1.2.3` → `v1.3.0`
   - **major**: `v1.2.3` → `v2.0.0`

5. **Verify META.json version matches the new tag**:
   Read `META.json` and check that both `version` and `provides.pg_stat_ch.version` match the new version (without the `v` prefix). If they don't match, abort and tell the user to update `META.json` first — PGXN uses this file for the release version.

6. **Validate current commit exists on remote**:
   ```bash
   git fetch origin
   git branch -r --contains HEAD
   ```
   If no remote branch contains HEAD, abort with an error asking the user to push their commits first.

7. **Create and push the tag**:
   ```bash
   git tag -a <new_version> -m "Release <new_version>"
   git push origin <new_version>
   ```

8. **Report success** with the new tag name.

## Version Parsing

Parse version from tag like `v1.2.3`:
- Extract numbers after `v` prefix
- Split by `.` to get major, minor, patch components
- Handle edge case: if no tags exist, start at `v0.1.0`

## Error Handling

- If current commit is not on remote: "Current commit is not pushed to remote. Please push your changes first."
- If tag already exists: "Tag already exists. Please check existing tags."
- If git operations fail: Report the specific error.
