Merge branch 'main' into agent-fix

This commit is contained in:
Brian
2025-08-16 22:37:54 -04:00
committed by GitHub
11 changed files with 399 additions and 341 deletions

173
.github/workflows/manual-release.yaml vendored Normal file
View File

@@ -0,0 +1,173 @@
name: Manual Release
on:
workflow_dispatch:
inputs:
version_bump:
description: Version bump type
required: true
default: patch
type: choice
options:
- patch
- minor
- major
permissions:
contents: write
packages: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
registry-url: https://registry.npmjs.org
- name: Install dependencies
run: npm ci
- name: Run tests and validation
run: |
npm run validate
npm run format:check
npm run lint
- name: Configure Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Bump version
run: npm run version:${{ github.event.inputs.version_bump }}
- name: Get new version and previous tag
id: version
run: |
echo "new_version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT
echo "previous_tag=$(git describe --tags --abbrev=0)" >> $GITHUB_OUTPUT
- name: Update installer package.json
run: |
sed -i 's/"version": ".*"/"version": "${{ steps.version.outputs.new_version }}"/' tools/installer/package.json
- name: Build project
run: npm run build
- name: Commit version bump
run: |
git add .
git commit -m "release: bump to v${{ steps.version.outputs.new_version }}"
- name: Generate release notes
id: release_notes
run: |
# Get commits since last tag
COMMITS=$(git log ${{ steps.version.outputs.previous_tag }}..HEAD --pretty=format:"- %s" --reverse)
# Categorize commits
FEATURES=$(echo "$COMMITS" | grep -E "^- (feat|Feature)" || true)
FIXES=$(echo "$COMMITS" | grep -E "^- (fix|Fix)" || true)
CHORES=$(echo "$COMMITS" | grep -E "^- (chore|Chore)" || true)
OTHERS=$(echo "$COMMITS" | grep -v -E "^- (feat|Feature|fix|Fix|chore|Chore|release:|Release:)" || true)
# Build release notes
cat > release_notes.md << 'EOF'
## 🚀 What's New in v${{ steps.version.outputs.new_version }}
EOF
if [ ! -z "$FEATURES" ]; then
echo "### ✨ New Features" >> release_notes.md
echo "$FEATURES" >> release_notes.md
echo "" >> release_notes.md
fi
if [ ! -z "$FIXES" ]; then
echo "### 🐛 Bug Fixes" >> release_notes.md
echo "$FIXES" >> release_notes.md
echo "" >> release_notes.md
fi
if [ ! -z "$OTHERS" ]; then
echo "### 📦 Other Changes" >> release_notes.md
echo "$OTHERS" >> release_notes.md
echo "" >> release_notes.md
fi
if [ ! -z "$CHORES" ]; then
echo "### 🔧 Maintenance" >> release_notes.md
echo "$CHORES" >> release_notes.md
echo "" >> release_notes.md
fi
cat >> release_notes.md << 'EOF'
## 📦 Installation
```bash
npx bmad-method install
```
**Full Changelog**: https://github.com/bmadcode/BMAD-METHOD/compare/${{ steps.version.outputs.previous_tag }}...v${{ steps.version.outputs.new_version }}
EOF
# Output for GitHub Actions
echo "RELEASE_NOTES<<EOF" >> $GITHUB_OUTPUT
cat release_notes.md >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Create and push tag
run: |
# Check if tag already exists
if git rev-parse "v${{ steps.version.outputs.new_version }}" >/dev/null 2>&1; then
echo "Tag v${{ steps.version.outputs.new_version }} already exists, skipping tag creation"
else
git tag -a "v${{ steps.version.outputs.new_version }}" -m "Release v${{ steps.version.outputs.new_version }}"
git push origin "v${{ steps.version.outputs.new_version }}"
fi
- name: Push changes to main
run: |
if git push origin HEAD:main 2>/dev/null; then
echo "✅ Successfully pushed to main branch"
else
echo "⚠️ Could not push to main (protected branch). This is expected."
echo "📝 Version bump and tag were created successfully."
fi
- name: Publish to NPM
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npm publish
- name: Create GitHub Release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ steps.version.outputs.new_version }}
release_name: "BMad Method v${{ steps.version.outputs.new_version }}"
body: ${{ steps.release_notes.outputs.RELEASE_NOTES }}
draft: false
prerelease: false
- name: Summary
run: |
echo "🎉 Successfully released v${{ steps.version.outputs.new_version }}!"
echo "📦 Published to NPM with @latest tag"
echo "🏷️ Git tag: v${{ steps.version.outputs.new_version }}"
echo "✅ Users running 'npx bmad-method install' will now get version ${{ steps.version.outputs.new_version }}"
echo ""
echo "📝 Release notes preview:"
cat release_notes.md

View File

@@ -1,148 +0,0 @@
name: Promote to Stable
"on":
workflow_dispatch:
inputs:
version_bump:
description: "Version bump type"
required: true
default: "minor"
type: choice
options:
- patch
- minor
- major
jobs:
promote:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
registry-url: "https://registry.npmjs.org"
- name: Configure Git
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Install dependencies
run: npm ci
- name: Get current version and calculate new version
id: version
run: |
# Get current version from package.json
CURRENT_VERSION=$(node -p "require('./package.json').version")
echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
# Remove beta suffix if present
BASE_VERSION=$(echo $CURRENT_VERSION | sed 's/-beta\.[0-9]\+//')
echo "base_version=$BASE_VERSION" >> $GITHUB_OUTPUT
# Calculate new version based on bump type
IFS='.' read -ra VERSION_PARTS <<< "$BASE_VERSION"
MAJOR=${VERSION_PARTS[0]}
MINOR=${VERSION_PARTS[1]}
PATCH=${VERSION_PARTS[2]}
case "${{ github.event.inputs.version_bump }}" in
"major")
NEW_VERSION="$((MAJOR + 1)).0.0"
;;
"minor")
NEW_VERSION="$MAJOR.$((MINOR + 1)).0"
;;
"patch")
NEW_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
;;
*)
NEW_VERSION="$BASE_VERSION"
;;
esac
# Check if calculated version already exists (either as NPM package or git tag)
while npm view bmad-method@$NEW_VERSION version >/dev/null 2>&1 || git ls-remote --tags origin | grep -q "refs/tags/v$NEW_VERSION"; do
echo "Version $NEW_VERSION already exists, incrementing..."
IFS='.' read -ra NEW_VERSION_PARTS <<< "$NEW_VERSION"
NEW_MAJOR=${NEW_VERSION_PARTS[0]}
NEW_MINOR=${NEW_VERSION_PARTS[1]}
NEW_PATCH=${NEW_VERSION_PARTS[2]}
case "${{ github.event.inputs.version_bump }}" in
"major")
NEW_VERSION="$((NEW_MAJOR + 1)).0.0"
;;
"minor")
NEW_VERSION="$NEW_MAJOR.$((NEW_MINOR + 1)).0"
;;
"patch")
NEW_VERSION="$NEW_MAJOR.$NEW_MINOR.$((NEW_PATCH + 1))"
;;
esac
done
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
echo "Promoting from $CURRENT_VERSION to $NEW_VERSION"
- name: Update package.json versions
run: |
# Update main package.json
npm version ${{ steps.version.outputs.new_version }} --no-git-tag-version
# Update installer package.json
sed -i 's/"version": ".*"/"version": "${{ steps.version.outputs.new_version }}"/' tools/installer/package.json
- name: Update package-lock.json
run: npm install --package-lock-only
- name: Commit stable release
run: |
git add .
git commit -m "release: promote to stable ${{ steps.version.outputs.new_version }}"
- name: Create and push stable tag
run: |
# Create new tag (version check already ensures it doesn't exist)
git tag -a "v${{ steps.version.outputs.new_version }}" -m "Stable release v${{ steps.version.outputs.new_version }}"
# Push the new tag
git push origin "v${{ steps.version.outputs.new_version }}"
- name: Push changes to main
run: |
git push origin HEAD:main
- name: Publish to NPM with stable tag
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
# Publish with the stable (latest) tag
npm publish --tag latest
# Also tag the previous beta version as stable if it exists
if npm view bmad-method@${{ steps.version.outputs.current_version }} version >/dev/null 2>&1; then
npm dist-tag add bmad-method@${{ steps.version.outputs.new_version }} stable || true
fi
- name: Summary
run: |
echo "🎉 Successfully promoted to stable!"
echo "📦 Version: ${{ steps.version.outputs.new_version }}"
echo "🏷️ Git tag: v${{ steps.version.outputs.new_version }}"
echo "✅ Published to NPM with 'latest' tag"
echo "✅ Users running 'npx bmad-method install' will now get version ${{ steps.version.outputs.new_version }}"
echo "🚀 The stable release will be automatically published to NPM via semantic-release"
echo "✅ Users running 'npx bmad-method install' will now get version ${{ steps.version.outputs.new_version }}"

View File

@@ -1,73 +0,0 @@
name: Release
"on":
push:
branches:
- main
workflow_dispatch:
inputs:
version_type:
description: Version bump type
required: true
default: patch
type: choice
options:
- patch
- minor
- major
permissions:
contents: write
issues: write
pull-requests: write
packages: write
jobs:
release:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' || !contains(github.event.head_commit.message, '[skip ci]') }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
registry-url: "https://registry.npmjs.org"
- name: Install dependencies
run: npm ci
- name: Run tests and validation
run: |
npm run validate
npm run format
- name: Debug permissions
run: |
echo "Testing git permissions..."
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
echo "Git config set successfully"
- name: Manual version bump
if: github.event_name == 'workflow_dispatch'
run: npm run version:${{ github.event.inputs.version_type }}
- name: Semantic Release
if: github.event_name == 'push'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npm run release
- name: Clean changelog formatting
if: github.event_name == 'push'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# Remove any Claude Code attribution from changelog
sed -i '/🤖 Generated with \[Claude Code\]/,+2d' CHANGELOG.md || true
# Format and commit if changes exist
npm run format
if ! git diff --quiet CHANGELOG.md; then
git add CHANGELOG.md
git commit -m "chore: clean changelog formatting [skip ci]"
git push
fi

View File

@@ -1,22 +0,0 @@
{
"branches": [
{
"name": "main",
"prerelease": "beta",
"channel": "beta"
}
],
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
[
"@semantic-release/changelog",
{
"changelogFile": "CHANGELOG.md"
}
],
"@semantic-release/npm",
"./tools/semantic-release-sync-installer.js",
"@semantic-release/github"
]
}

View File

@@ -75,6 +75,8 @@ This makes it easy to benefit from the latest improvements, bug fixes, and new a
```bash
npx bmad-method install
# OR explicitly use stable tag:
npx bmad-method@stable install
# OR if you already have BMad installed:
git pull
npm run install:bmad

View File

@@ -1,77 +1,147 @@
# How to Release a New Version
# Versioning and Releases
## Automated Releases (Recommended)
BMad Method uses a simplified release system with manual control and automatic release notes generation.
The easiest way to release new versions is through **automatic semantic releases**. Just commit with the right message format and push and everything else happens automatically.
## 🚀 Release Workflow
### Commit Message Format
### Command Line Release (Recommended)
Use these prefixes to control what type of release happens:
The fastest way to create a release with beautiful release notes:
```bash
fix: resolve CLI argument parsing bug # → patch release (4.1.0 → 4.1.1)
feat: add new agent orchestration mode # → minor release (4.1.0 → 4.2.0)
feat!: redesign CLI interface # → major release (4.1.0 → 5.0.0)
# Preview what will be in the release
npm run preview:release
# Create a release
npm run release:patch # 5.1.0 → 5.1.1 (bug fixes)
npm run release:minor # 5.1.0 → 5.2.0 (new features)
npm run release:major # 5.1.0 → 6.0.0 (breaking changes)
# Watch the release process
npm run release:watch
```
### What Happens Automatically
When you push commits with `fix:` or `feat:`, GitHub Actions will:
1. ✅ Analyze your commit messages
2. ✅ Bump version in `package.json`
3. ✅ Generate changelog
4. ✅ Create git tag
5.**Publish to NPM automatically**
6. ✅ Create GitHub release with notes
### Your Simple Workflow
### One-Liner Release
```bash
# Make your changes
git add .
git commit -m "feat: add team collaboration mode"
git push
# That's it! Release happens automatically 🎉
# Users can now run: npx bmad-method (and get the new version)
npm run preview:release && npm run release:minor && npm run release:watch
```
### Commits That DON'T Trigger Releases
## 📝 What Happens Automatically
These commit types won't create releases (use them for maintenance):
When you trigger a release, the GitHub Actions workflow automatically:
1.**Validates** - Runs tests, linting, and formatting checks
2.**Bumps Version** - Updates `package.json` and installer version
3.**Generates Release Notes** - Categorizes commits since last release:
-**New Features** (`feat:`, `Feature:`)
- 🐛 **Bug Fixes** (`fix:`, `Fix:`)
- 🔧 **Maintenance** (`chore:`, `Chore:`)
- 📦 **Other Changes** (everything else)
4.**Creates Git Tag** - Tags the release version
5.**Publishes to NPM** - With `@latest` tag for user installations
6.**Creates GitHub Release** - With formatted release notes
## 📋 Sample Release Notes
The workflow automatically generates professional release notes like this:
````markdown
## 🚀 What's New in v5.2.0
### ✨ New Features
- feat: add team collaboration mode
- feat: enhance CLI with interactive prompts
### 🐛 Bug Fixes
- fix: resolve installation path issues
- fix: handle edge cases in agent loading
### 🔧 Maintenance
- chore: update dependencies
- chore: improve error messages
## 📦 Installation
```bash
chore: update dependencies # No release
docs: fix typo in readme # No release
style: format code # No release
test: add unit tests # No release
npx bmad-method install
```
````
### Test Your Setup
**Full Changelog**: https://github.com/bmadcode/BMAD-METHOD/compare/v5.1.0...v5.2.0
````
## 🎯 User Installation
After any release, users can immediately get the new version with:
```bash
npm run release:test # Safe to run locally - tests the config
npx bmad-method install # Always gets latest release
```
---
## 📊 Preview Before Release
## Manual Release Methods (Exceptions Only)
⚠️ Only use these methods if you need to bypass the automatic system
### Quick Manual Version Bump
Always preview what will be included in your release:
```bash
npm run version:patch # 4.1.0 → 4.1.1 (bug fixes)
npm run version:minor # 4.1.0 → 4.2.0 (new features)
npm run version:major # 4.1.0 → 5.0.0 (breaking changes)
# Then manually publish:
npm publish
git push && git push --tags
npm run preview:release
```
### Manual GitHub Actions Trigger
This shows:
You can also trigger releases manually through GitHub Actions workflow dispatch if needed.
- Commits since last release
- Categorized changes
- Estimated next version
- Release notes preview
## 🔧 Manual Release (GitHub UI)
You can also trigger releases through GitHub Actions:
1. Go to **GitHub Actions** → **Manual Release**
2. Click **"Run workflow"**
3. Choose version bump type (patch/minor/major)
4. Everything else happens automatically
## 📈 Version Strategy
- **Patch** (5.1.0 → 5.1.1): Bug fixes, minor improvements
- **Minor** (5.1.0 → 5.2.0): New features, enhancements
- **Major** (5.1.0 → 6.0.0): Breaking changes, major redesigns
## 🛠️ Development Workflow
1. **Develop Freely** - Merge PRs to main without triggering releases
2. **Test Unreleased Changes** - Clone repo to test latest main branch
3. **Release When Ready** - Use command line or GitHub Actions to cut releases
4. **Users Get Updates** - Via simple `npx bmad-method install` command
This gives you complete control over when releases happen while automating all the tedious parts like version bumping, release notes, and publishing.
## 🔍 Troubleshooting
### Check Release Status
```bash
gh run list --workflow="Manual Release"
npm view bmad-method dist-tags
git tag -l | sort -V | tail -5
```
### View Latest Release
```bash
gh release view --web
npm view bmad-method versions --json
```
### If Release Fails
- Check GitHub Actions logs: `gh run view <run-id> --log-failed`
- Verify NPM tokens are configured
- Ensure branch protection allows workflow pushes
````

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "bmad-method",
"version": "5.0.0",
"version": "5.1.3",
"description": "Breakthrough Method of Agile AI-driven Development",
"keywords": [
"agile",
@@ -35,8 +35,11 @@
"lint:fix": "eslint . --ext .js,.cjs,.mjs,.yaml --fix",
"list:agents": "node tools/cli.js list:agents",
"prepare": "husky",
"release": "semantic-release",
"release:test": "semantic-release --dry-run --no-ci || echo 'Config test complete - authentication errors are expected locally'",
"preview:release": "node tools/preview-release-notes.js",
"release:major": "gh workflow run \"Manual Release\" -f version_bump=major",
"release:minor": "gh workflow run \"Manual Release\" -f version_bump=minor",
"release:patch": "gh workflow run \"Manual Release\" -f version_bump=patch",
"release:watch": "gh run watch",
"validate": "node tools/cli.js validate",
"version:all": "node tools/bump-all-versions.js",
"version:all:major": "node tools/bump-all-versions.js major",
@@ -80,8 +83,6 @@
},
"devDependencies": {
"@eslint/js": "^9.33.0",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"eslint": "^9.33.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-n": "^17.21.3",
@@ -92,11 +93,13 @@
"lint-staged": "^16.1.1",
"prettier": "^3.5.3",
"prettier-plugin-packagejson": "^2.5.19",
"semantic-release": "^22.0.0",
"yaml-eslint-parser": "^1.2.3",
"yaml-lint": "^1.7.0"
},
"engines": {
"node": ">=20.10.0"
},
"publishConfig": {
"access": "public"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "bmad-method",
"version": "5.0.0",
"version": "5.1.3",
"description": "BMad Method installer - AI-powered Agile development framework",
"keywords": [
"bmad",

66
tools/preview-release-notes.js Executable file
View File

@@ -0,0 +1,66 @@
const { execSync } = require('node:child_process');
const fs = require('node:fs');
// Get the latest stable tag (exclude beta tags)
const allTags = execSync('git tag -l | sort -V', { encoding: 'utf8' }).split('\n').filter(Boolean);
const stableTags = allTags.filter((tag) => !tag.includes('beta'));
const latestTag = stableTags.at(-1) || 'v5.0.0';
// Get commits since last tag
const commits = execSync(`git log ${latestTag}..HEAD --pretty=format:"- %s" --reverse`, {
encoding: 'utf8',
})
.split('\n')
.filter(Boolean);
// Categorize commits
const features = commits.filter((commit) => /^- (feat|Feature)/.test(commit));
const fixes = commits.filter((commit) => /^- (fix|Fix)/.test(commit));
const chores = commits.filter((commit) => /^- (chore|Chore)/.test(commit));
const others = commits.filter(
(commit) => !/^- (feat|Feature|fix|Fix|chore|Chore|release:|Release:)/.test(commit),
);
// Get next version (you can modify this logic)
const currentVersion = require('../package.json').version;
const versionParts = currentVersion.split('.').map(Number);
const nextVersion = `${versionParts[0]}.${versionParts[1] + 1}.0`; // Default to minor bump
console.log(`## 🚀 What's New in v${nextVersion}\n`);
if (features.length > 0) {
console.log('### ✨ New Features');
for (const feature of features) console.log(feature);
console.log('');
}
if (fixes.length > 0) {
console.log('### 🐛 Bug Fixes');
for (const fix of fixes) console.log(fix);
console.log('');
}
if (others.length > 0) {
console.log('### 📦 Other Changes');
for (const other of others) console.log(other);
console.log('');
}
if (chores.length > 0) {
console.log('### 🔧 Maintenance');
for (const chore of chores) console.log(chore);
console.log('');
}
console.log('\n## 📦 Installation\n');
console.log('```bash');
console.log('npx bmad-method install');
console.log('```');
console.log(
`\n**Full Changelog**: https://github.com/bmadcode/BMAD-METHOD/compare/${latestTag}...v${nextVersion}`,
);
console.log(`\n---\n📊 **Summary**: ${commits.length} commits since ${latestTag}`);
console.log(`🏷️ **Previous tag**: ${latestTag}`);
console.log(`🚀 **Next version**: v${nextVersion} (estimated)`);

View File

@@ -1,30 +0,0 @@
/**
* Semantic-release plugin to sync installer package.json version
*/
const fs = require('node:fs');
const path = require('node:path');
// This function runs during the "prepare" step of semantic-release
function prepare(_, { nextRelease, logger }) {
// Define the path to the installer package.json file
const file = path.join(process.cwd(), 'tools/installer/package.json');
// If the file does not exist, skip syncing and log a message
if (!fs.existsSync(file)) return logger.log('Installer package.json not found, skipping');
// Read and parse the package.json file
const package_ = JSON.parse(fs.readFileSync(file, 'utf8'));
// Update the version field with the next release version
package_.version = nextRelease.version;
// Write the updated JSON back to the file
fs.writeFileSync(file, JSON.stringify(package_, null, 2) + '\n');
// Log success message
logger.log(`Synced installer package.json to version ${nextRelease.version}`);
}
// Export the prepare function so semantic-release can use it
module.exports = { prepare };

View File

@@ -31,18 +31,35 @@ async function bumpVersion(type = 'patch') {
process.exit(1);
}
console.log(chalk.yellow('⚠️ Manual version bumping is disabled.'));
console.log(chalk.blue('🤖 This project uses semantic-release for automated versioning.'));
console.log('');
console.log(chalk.bold('To create a new release, use conventional commits:'));
console.log(chalk.cyan(' feat: new feature (minor version bump)'));
console.log(chalk.cyan(' fix: bug fix (patch version bump)'));
console.log(chalk.cyan(' feat!: breaking change (major version bump)'));
console.log('');
console.log(chalk.dim('Example: git commit -m "feat: add new installer features"'));
console.log(chalk.dim('Then push to main branch to trigger automatic release.'));
const currentVersion = getCurrentVersion();
const versionParts = currentVersion.split('.').map(Number);
let newVersion;
return null;
switch (type) {
case 'major': {
newVersion = `${versionParts[0] + 1}.0.0`;
break;
}
case 'minor': {
newVersion = `${versionParts[0]}.${versionParts[1] + 1}.0`;
break;
}
case 'patch': {
newVersion = `${versionParts[0]}.${versionParts[1]}.${versionParts[2] + 1}`;
break;
}
}
console.log(chalk.blue(`Bumping version: ${currentVersion}${newVersion}`));
// Update package.json
const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));
packageJson.version = newVersion;
fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2) + '\n');
console.log(chalk.green(`✓ Updated package.json to ${newVersion}`));
return newVersion;
}
async function main() {