aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
760 lines (545 loc) • 18.9 kB
Markdown
id: release-management
name: Manage Software Releases
agent: github-devops
category: devops
complexity: high
tools:
- github-cli # Create releases, tags, manage artifacts
- semantic-release # Automate versioning and changelog
checklists:
- github-devops-checklist.md
# Manage Software Releases
## Purpose
To automate the complete software release process, including:
- Semantic versioning (major.minor.patch)
- Changelog generation from commits
- Git tagging
- GitHub/GitLab Release creation
- Package publishing (npm, PyPI, Docker, etc.)
- Release notes generation
## Input
### Required Parameters
- **repository_path**: `string`
- **Description**: Local path or URL of repository
- **Example**: `/path/to/project` or `https://github.com/user/repo`
- **Validation**: Must be valid Git repository
- **release_type**: `string`
- **Description**: Type of release to create
- **Options**: `"auto"` (detect from commits), `"major"`, `"minor"`, `"patch"`, `"prerelease"`
- **Default**: `"auto"`
### Optional Parameters
- **release_branch**: `string`
- **Description**: Branch to release from
- **Default**: `"main"`
- **Note**: Must be default branch for production releases
- **changelog_format**: `string`
- **Description**: Changelog style
- **Options**: `"keep-a-changelog"`, `"angular"`, `"conventional-commits"`
- **Default**: `"conventional-commits"`
- **package_registry**: `array<string>`
- **Description**: Where to publish package
- **Options**: `["npm"]`, `["pypi"]`, `["docker-hub"]`, `["github-packages"]`
- **Default**: Auto-detect from project type
- **dry_run**: `boolean`
- **Description**: Test release without publishing
- **Default**: `false`
- **prerelease_tag**: `string`
- **Description**: Tag for prerelease (if release_type="prerelease")
- **Examples**: `"alpha"`, `"beta"`, `"rc"`
- **Default**: `"beta"`
- **skip_ci**: `boolean`
- **Description**: Skip CI checks (emergency releases only)
- **Default**: `false`
- **Warning**: Only use for critical hotfixes
## Output
- **new_version**: `string`
- **Description**: Version number created
- **Example**: `"2.1.3"`
- **git_tag**: `string`
- **Description**: Git tag created
- **Example**: `"v4.0.4.3"`
- **changelog**: `string`
- **Description**: Generated CHANGELOG.md content for this release
- **release_url**: `string`
- **Description**: URL to GitHub/GitLab Release
- **Example**: `"https://github.com/user/repo/releases/tag/v4.0.4.3"`
- **published_packages**: `array<object>`
- **Description**: Published packages with URLs
- **Structure**: `{ registry, package_name, version, url }`
- **Example**: `[{ registry: "npm", package_name: "aios-core", version: "2.1.3", url: "https://npmjs.com/package/aios-core" }]`
- **release_notes**: `string`
- **Description**: Formatted release notes (for announcements)
- **breaking_changes**: `array<string>`
- **Description**: List of breaking changes (if any)
- **Note**: Empty array if backward compatible
## Process
### Phase 1: Pre-Release Validation (2 min)
1. **Validate Repository State**
- Check if on release branch
- Verify no uncommitted changes
- Ensure branch is up-to-date with remote
- Check CI status (must be passing unless skip_ci=true)
2. **🔴 CRITICAL: Validate Tag Reachability**
- Check which version tags are reachable from HEAD
- Run: `git merge-base --is-ancestor <tag> HEAD` for each tag
- **If NO tags are reachable** → semantic-release will create v1.0.0!
- This can happen after `git filter-repo` rewrites history
- **Resolution**: Create a baseline tag at current package.json version:
```bash
git tag v$(node -p "require('./package.json').version")
git push origin v$(node -p "require('./package.json').version")
```
3. **Analyze Commits Since Last Release**
- Get last version tag (e.g., `v4.0.4.2`)
- Get commits since last tag: `git log v4.0.4.2..HEAD`
- Parse commit messages (Conventional Commits)
4. **Determine Version Bump**
- If `release_type="auto"`:
- **BREAKING CHANGE** in commits → **major** bump (2.1.2 → 3.0.0)
- **feat:** commits → **minor** bump (2.1.2 → 2.2.0)
- **fix:** commits → **patch** bump (2.1.2 → 2.1.3)
- No eligible commits → **HALT** (nothing to release)
- Else: Use specified `release_type`
- Calculate new version: `{major}.{minor}.{patch}`
5. **Check Breaking Changes**
- Scan for `BREAKING CHANGE:` or `!` in commit messages
- Extract breaking change descriptions
- If found and major bump not planned → **WARN** user
### Phase 2: Changelog Generation (2 min)
5. **Generate CHANGELOG.md Updates**
- Group commits by type:
- **Breaking Changes** (⚠️)
- **Features** (✨ feat:)
- **Bug Fixes** (🐛 fix:)
- **Performance** (⚡ perf:)
- **Documentation** (📝 docs:)
- **Refactoring** (♻️ refactor:)
- **Tests** (✅ test:)
- **Chores** (🔧 chore:)
- Format according to `changelog_format`
- Prepend to CHANGELOG.md
**Example Output (Conventional Commits format):**
```markdown
## [2.1.3] - 2025-11-13
### ⚠️ Breaking Changes
- API endpoint `/v1/users` renamed to `/v2/users` (#42)
### ✨ Features
- Add user authentication with OAuth2 (#38)
- Implement rate limiting for API (#40)
### 🐛 Bug Fixes
- Fix memory leak in database connection pool (#39)
- Correct timezone handling in date filters (#41)
### 📝 Documentation
- Update API documentation with new endpoints (#43)
```
6. **Generate Release Notes**
- Extract highlights (most impactful changes)
- Format for social media / announcements
- Include contributor credits
- Add migration guide if breaking changes
### Phase 3: Version Bumping (1 min)
7. **Update Version Files**
- **Node.js**: Update `package.json` version
- **Python**: Update `setup.py` or `pyproject.toml` version
- **Rust**: Update `Cargo.toml` version
- **Go**: Update VERSION file or version constant
- **Docker**: Update Dockerfile labels
8. **Commit Version Changes**
- Create commit: `chore(release): bump version to {new_version}`
- Include updated CHANGELOG.md
- **DO NOT PUSH YET** (will push after tagging)
### Phase 4: Git Tagging & Release (3 min)
9. **Create Git Tag**
- Create annotated tag: `git tag -a v{new_version} -m "Release v{new_version}"`
- Include release notes in tag message
10. **Push to Remote**
- Push commits: `git push origin {release_branch}`
- Push tags: `git push origin v{new_version}`
- Wait for remote to accept
11. **Create GitHub/GitLab Release**
- Use GitHub CLI:
```bash
gh release create v{new_version} \
--title "Release v{new_version}" \
--notes-file release-notes.md \
--latest
```
- Attach build artifacts (if applicable):
- Binary executables
- Docker images
- Tarball archives
### Phase 5: Package Publishing (5 min)
12. **Publish to Package Registries** (if configured)
**npm:**
```bash
npm publish --access public
# Or for scoped packages:
npm publish @scope/package --access public
```
**PyPI:**
```bash
python -m build
twine upload dist/*
```
**Docker Hub:**
```bash
docker build -t user/image:{new_version} .
docker push user/image:{new_version}
docker tag user/image:{new_version} user/image:latest
docker push user/image:latest
```
**GitHub Packages:**
```bash
docker tag image:latest ghcr.io/user/repo:{new_version}
docker push ghcr.io/user/repo:{new_version}
```
13. **Verify Publication**
- Check package registry for new version
- Test installation: `npm install package@{new_version}`
- Confirm download count increments
### Phase 6: Post-Release Tasks (2 min)
14. **Update Documentation**
- If docs versioned, create new version folder
- Update README badges (version, downloads)
- Update CHANGELOG.md link in README
15. **Create Release Announcement**
- Generate social media posts
- Update project website (if applicable)
- Send notification to mailing list / Discord / Slack
16. **Create Post-Release Report**
- Summary of changes
- Links to release, packages, documentation
- Next steps or planned features
## Checklist
### Pre-conditions
- [ ] On correct release branch
- **Validation**: `git branch --show-current === release_branch`
- **Error**: "Not on release branch. Switch to {release_branch} first."
- [ ] No uncommitted changes
- **Validation**: `git status --porcelain` returns empty
- **Error**: "Uncommitted changes detected. Commit or stash before releasing."
- [ ] CI passing (unless skip_ci=true)
- **Validation**: GitHub API check status
- **Error**: "CI checks failing. Fix before releasing or use --skip-ci for emergency."
- [ ] New commits since last release
- **Validation**: `git log {last_tag}..HEAD` not empty
- **Error**: "No new commits since last release. Nothing to release."
### Post-conditions
- [ ] Git tag created and pushed
- **Validation**: `git tag -l v{new_version}` exists remotely
- **Test**: `git ls-remote --tags origin | grep v{new_version}`
- [ ] CHANGELOG.md updated
- **Validation**: File contains new version section
- **Test**: `grep "## \[{new_version}\]" CHANGELOG.md`
- [ ] GitHub Release created
- **Validation**: `gh release view v{new_version}` succeeds
- **Test**: Visit `{release_url}` and verify
- [ ] Package published (if configured)
- **Validation**: Package registry returns new version
- **Test**: `npm view package version` === `{new_version}`
### Acceptance Criteria
- [ ] Release follows semantic versioning
- **Type**: acceptance
- **Test**: Version format is `{major}.{minor}.{patch}` or `{major}.{minor}.{patch}-{prerelease}`
- [ ] Changelog is accurate and complete
- **Type**: acceptance
- **Manual Check**: true
- **Criteria**: All significant changes documented
- [ ] Package is installable
- **Type**: acceptance
- **Test**: Fresh install succeeds: `npm install -g package@{new_version}`
## Templates
### Release Notes Template
````markdown
# Release v{new_version}
**Date**: {release_date}
**Type**: {release_type} ({major|minor|patch})
## Highlights
{top_3_most_impactful_changes}
## What's Changed
{changelog_content}
## Breaking Changes
{breaking_changes_section if any}
### Migration Guide
{migration_steps if breaking changes}
## Contributors
Thank you to all contributors who made this release possible:
{contributor_list with GitHub handles}
## Install
\`\`\`bash
npm install {package_name}@{new_version}
# or
pip install {package_name}=={new_version}
\`\`\`
## Links
- [Full Changelog]({compare_url})
- [Documentation]({docs_url})
- [Issues]({issues_url})
## Execution Modes
**Choose your execution mode:**
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
- Autonomous decision making with logging
- Minimal user interaction
- **Best for:** Simple, deterministic tasks
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
- Explicit decision checkpoints
- Educational explanations
- **Best for:** Learning, complex decisions
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
- Task analysis phase (identify all ambiguities)
- Zero ambiguity execution
- **Best for:** Ambiguous requirements, critical work
**Parameter:** `mode` (optional, default: `interactive`)
## Task Definition (AIOS Task Format V1.0)
```yaml
task: releaseManagement()
responsável: Gage (Automator)
responsavel_type: Agente
atomic_layer: Organism
**Entrada:**
- campo: task
tipo: string
origem: User Input
obrigatório: true
validação: Must be registered task
- campo: parameters
tipo: object
origem: User Input
obrigatório: false
validação: Valid task parameters
- campo: mode
tipo: string
origem: User Input
obrigatório: false
validação: yolo|interactive|pre-flight
**Saída:**
- campo: execution_result
tipo: object
destino: Memory
persistido: false
- campo: logs
tipo: array
destino: File (.ai/logs/*)
persistido: true
- campo: state
tipo: object
destino: State management
persistido: true
```
````
## Pre-Conditions
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
**Checklist:**
```yaml
pre-conditions:
- [ ] Task is registered; required parameters provided; dependencies met
tipo: pre-condition
blocker: true
validação: |
Check task is registered; required parameters provided; dependencies met
error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met"
```
## Post-Conditions
**Purpose:** Validate execution success AFTER task completes
**Checklist:**
```yaml
post-conditions:
- [ ] Task completed; exit code 0; expected outputs created
tipo: post-condition
blocker: true
validação: |
Verify task completed; exit code 0; expected outputs created
error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created"
```
## Acceptance Criteria
**Purpose:** Definitive pass/fail criteria for task completion
**Checklist:**
```yaml
acceptance-criteria:
- [ ] Task completed as expected; side effects documented
tipo: acceptance-criterion
blocker: true
validação: |
Assert task completed as expected; side effects documented
error_message: "Acceptance criterion not met: Task completed as expected; side effects documented"
```
## Scripts
**Agent-specific code for this task:**
- **Script:** execute-task.js
- **Purpose:** Generic task execution wrapper
- **Language:** JavaScript
- **Location:** .aios-core/scripts/execute-task.js
## Error Handling
**Strategy:** retry
**Common Errors:**
1. **Error:** Task Not Found
- **Cause:** Specified task not registered in system
- **Resolution:** Verify task name and registration
- **Recovery:** List available tasks, suggest similar
2. **Error:** Invalid Parameters
- **Cause:** Task parameters do not match expected schema
- **Resolution:** Validate parameters against task definition
- **Recovery:** Provide parameter template, reject execution
3. **Error:** Execution Timeout
- **Cause:** Task exceeds maximum execution time
- **Resolution:** Optimize task or increase timeout
- **Recovery:** Kill task, cleanup resources, log state
## Performance
**Expected Metrics:**
```yaml
duration_expected: 5-15 min (estimated)
cost_estimated: $0.003-0.010
token_usage: ~3,000-10,000 tokens
```
**Optimization Notes:**
- Break into smaller workflows; implement checkpointing; use async processing where possible
## Metadata
```yaml
story: N/A
version: 1.0.0
dependencies:
- N/A
tags:
- automation
- workflow
updated_at: 2025-11-17
```
**Full Changelog**: {compare_url}
```
### Social Media Announcement Template
```
🚀 {package_name} v{new_version} is out!
{highlight_1}
{highlight_2}
{highlight_3}
Install: npm install {package_name}@{new_version}
Release notes: {release_url}
#opensource #release #{package_name}
````
## Tools
- **github-cli**:
- **Version**: 2.0.0
- **Used For**: Create releases, tags, manage repository
- **Required**: true
- **semantic-release**:
- **Version**: 20.0.0
- **Used For**: Automate versioning based on commits
- **Optional**: true (can use manual versioning)
- **conventional-changelog**:
- **Version**: 4.0.0
- **Used For**: Generate CHANGELOG from Conventional Commits
- **Optional**: true
## Performance
- **Duration Expected**: 15 minutes (including publishing)
- **Cost Estimated**: $0 (uses free GitHub Actions, public registries)
- **Cacheable**: false (each release is unique)
- **Parallelizable**: false (sequential process required)
## Error Handling
- **Strategy**: abort
- **Fallback**: N/A (releases cannot be partially done)
- **Retry**:
- **Max Attempts**: 2 (for network failures)
- **Backoff**: linear
- **Backoff MS**: 5000
- **Abort Workflow**: true (release must succeed completely or rollback)
- **Notification**: log + email + Slack (if configured)
- **Rollback**: If publish fails, delete Git tag and revert version bump commit
## Metadata
- **Story**: Epic 10 (Critical Dependency Resolution)
- **Version**: 1.0.0
- **Dependencies**: `github-cli`, optional: `semantic-release`
- **Author**: Brad Frost Clone
- **Created**: 2025-11-13
- **Updated**: 2025-11-13
- **Breaking Changes**: None (new task)
## Usage Examples
### Example 1: Automatic Semantic Release
```bash
aios activate Otto # github-devops agent
aios release create --repo="." --type="auto"
````
**Output**: Analyzes commits, determines version bump, creates release
### Example 2: Major Release (Breaking Changes)
```bash
aios release create \
--repo="." \
--type="major" \
--publish="npm,docker-hub"
```
**Output**: Major version bump (e.g., 2.1.3 → 3.0.0), publishes to npm + Docker
### Example 3: Prerelease (Beta)
```bash
aios release create \
--repo="." \
--type="prerelease" \
--prerelease-tag="beta" \
--branch="develop"
```
**Output**: Beta release (e.g., 2.2.0-beta.1)
### Example 4: Dry Run (Test Release Process)
```bash
aios release create \
--repo="." \
--type="minor" \
--dry-run=true
```
**Output**: Simulates release, shows what would be created, NO actual changes
## Conventional Commits Reminder
For automatic versioning, follow **Conventional Commits** format:
```
<type>(<scope>): <subject>
<body>
<footer>
```
**Types:**
- `feat:` - New feature (MINOR bump)
- `fix:` - Bug fix (PATCH bump)
- `docs:` - Documentation only
- `style:` - Code style changes (formatting)
- `refactor:` - Code refactoring
- `perf:` - Performance improvements
- `test:` - Adding tests
- `chore:` - Maintenance tasks
**Breaking Changes:**
- Add `!` after type: `feat!: ...` (MAJOR bump)
- Or add `BREAKING CHANGE:` in footer (MAJOR bump)
**Examples:**
```
feat(auth): add OAuth2 login support
Implements OAuth2 authentication flow for GitHub, Google, and Microsoft.
Closes #42
```
```
fix(api): correct timezone handling in date filters
Previously, date filters were not respecting user timezone settings.
Fixes #41
```
```
feat!: rename /v1/users to /v2/users
BREAKING CHANGE: API endpoint changed. Update all client calls.
Migration: Replace /v1/users with /v2/users in API calls.
```
**Related Tasks:**
- `ci-cd-configuration` - Set up CI to run before releases
- `pr-automation` - Help users create PRs with proper commit formats
## Handoff
next_agent: @po
next_command: *close-story {story-id}
condition: Release published successfully
alternatives:
- agent: @devops, command: *cleanup, condition: Post-release branch cleanup needed