Version Management
Ada uses Semantic Versioning with Conventional Commits for automated changelog generation and version management.
Overview
Version Format
Ada follows Semantic Versioning 2.0.0:
MAJOR.MINOR.PATCH
MAJOR: Breaking changes (API incompatibility)
MINOR: New features (backwards compatible)
PATCH: Bug fixes (backwards compatible)
Examples: 1.8.0, 2.0.1, 1.9.12
Conventional Commits
Commit messages follow Conventional Commits:
Format:
type(scope): subject
Optional body with more details.
Optional footer with BREAKING CHANGE: description
Types:
feat: New feature → MINOR bumpfix: Bug fix → PATCH bumpdocs: Documentation → PATCH bumpstyle: Code style (formatting) → PATCH bumprefactor: Code refactoring → PATCH bumpperf: Performance improvement → MINOR bumptest: Test changes → PATCH bumpchore: Maintenance → PATCH bumpci: CI/CD changes → PATCH bumpbuild: Build system → PATCH bump
BREAKING CHANGE in commit body → MAJOR bump
Examples
Good commit messages:
feat: add Nix flake support
fix(matrix): handle rate limiting errors
docs: update getting started guide
feat(specialists)!: change specialist API
BREAKING CHANGE: SpecialistProtocol now requires async methods
chore: bump version to v1.9.0
Bad commit messages:
updated stuff
Fix bug
WIP
asdf
Version Management Tools
Ada provides three scripts for version management:
version.sh
Main version management tool.
Commands:
./scripts/version.sh current # Show current version
./scripts/version.sh suggest # Suggest next version based on commits
./scripts/version.sh changelog # Generate changelog preview
./scripts/version.sh bump <type> # Bump version and create tag
./scripts/version.sh check # Check for untagged commits
./scripts/version.sh tag <version> # Create tag without bumping files
Examples:
# Check what version we're at
$ ./scripts/version.sh current
1.8.0
# Analyze commits and suggest next version
$ ./scripts/version.sh suggest
Analyzing commits to suggest next version...
Current version: 1.8.0
Latest tag: v1.8.0
Commit analysis:
Breaking changes: 0
Features: 1
Fixes: 0
Performance: 0
Suggestion: MINOR bump → 1.9.0
Reason: New features or performance improvements
To apply:
./scripts/version.sh bump minor "Version 1.9.0"
# Preview changelog for next release
$ ./scripts/version.sh changelog
# Bump version and create tag
$ ./scripts/version.sh bump minor "Changelog Automation"
Bumping version: 1.8.0 → 1.9.0
✓ Updated version to 1.9.0 in:
- pyproject.toml
- ada_main.py
✓ Created tag v1.9.0
Done! Version bumped to v1.9.0
Push with: git push origin trunk --tags
changelog.sh
Generate formatted changelog from git commits.
Usage:
./scripts/changelog.sh [from_version] [to_version]
Examples:
# Generate changelog since last tag
$ ./scripts/changelog.sh v1.8.0 HEAD
## [HEAD] - 2025-12-16
### ✨ Features
- add changelog automation with Conventional Commits
### 📚 Documentation
- create version management guide
---
Total commits: 2
Features: 1 | Fixes: 0 | Docs: 1
# Update CHANGELOG.md with new section
$ ./scripts/changelog.sh v1.8.0 v1.9.0 | cat - CHANGELOG.md > CHANGELOG.md.tmp
$ mv CHANGELOG.md.tmp CHANGELOG.md
validate-commit.sh
Validate commit messages follow Conventional Commits format.
Usage:
# Validate a commit message file
./scripts/validate-commit.sh .git/COMMIT_EDITMSG
# Install as git hook
ln -sf ../../scripts/validate-commit.sh .git/hooks/commit-msg
What it checks:
✅ Type is valid (feat, fix, docs, etc.)
✅ Format is correct (type: subject or type(scope): subject)
⚠️ Subject isn’t too long (warns >72 chars)
⚠️ Subject doesn’t end with period
⚠️ Subject uses imperative mood (lowercase start)
✅ Allows merge commits and reverts
Example validation:
$ echo "feat: add new feature" > /tmp/msg
$ ./scripts/validate-commit.sh /tmp/msg
✓ Valid!
$ echo "Added new feature" > /tmp/msg
$ ./scripts/validate-commit.sh /tmp/msg
❌ Invalid commit message format!
Your commit message must follow Conventional Commits:
type(scope): subject
Examples:
feat: add Nix flake support
fix(matrix): handle rate limiting
docs: update getting started guide
Workflow
Complete Release Workflow
Develop features with conventional commits:
git checkout -b feature/new-thing git commit -m "feat: add amazing new feature" git commit -m "fix: handle edge case" git commit -m "docs: update API reference"
Check status before release:
# What untagged commits do we have? ./scripts/version.sh check # What version should we bump to? ./scripts/version.sh suggest
Preview changelog:
./scripts/version.sh changelog
Bump version and create tag:
# Automatically suggests minor for features ./scripts/version.sh bump minor "Amazing New Feature"
Update CHANGELOG.md:
# Generate and prepend to changelog ./scripts/changelog.sh v1.8.0 v1.9.0 > /tmp/new_section.md cat /tmp/new_section.md CHANGELOG.md > CHANGELOG.md.tmp mv CHANGELOG.md.tmp CHANGELOG.md git add CHANGELOG.md git commit -m "docs: update CHANGELOG for v1.9.0"
Push release:
git push origin trunk --tags
Create GitHub release (optional):
# Use changelog content as release notes gh release create v1.9.0 --title "v1.9.0" --notes-file /tmp/new_section.md
Quick Release (Automated)
For simple releases with good commit messages:
# One-liner: suggest, bump, and update changelog
VERSION=$(./scripts/version.sh suggest | grep "Suggestion" | cut -d→ -f2 | xargs)
./scripts/version.sh bump minor "Version $VERSION"
./scripts/changelog.sh v1.8.0 v$VERSION | cat - CHANGELOG.md > CHANGELOG.md.tmp
mv CHANGELOG.md.tmp CHANGELOG.md
git add CHANGELOG.md
git commit --amend --no-edit
git push origin trunk --tags
Git Hook Setup
Automatically validate commit messages:
# Install commit-msg hook
ln -sf ../../scripts/validate-commit.sh .git/hooks/commit-msg
# Now invalid commits will be rejected:
$ git commit -m "fixed bug"
❌ Invalid commit message format!
$ git commit -m "fix: correct handling of edge case"
✓ Success!
Skip validation when needed:
git commit --no-verify -m "WIP: experimenting"
Best Practices
Commit Messages
Do:
Start with lowercase:
feat: add feature✅Use imperative mood:
fix: resolve issue✅Be specific:
fix(rag): improve memory retrieval✅Include scope:
feat(specialists): add wiki lookup✅Keep subject <72 chars ✅
Don’t:
Start with uppercase:
feat: Add feature❌Use past tense:
feat: added feature❌Be vague:
fix: fixed bug❌End with period:
feat: add feature.❌Write novels:
feat: this adds a really long feature description...❌
Version Bumps
When to bump MAJOR (breaking changes):
API changes requiring code updates
Removing features
Changing behavior incompatibly
Architectural shifts
When to bump MINOR (new features):
New features (backwards compatible)
New specialists
Performance improvements
Deprecations (not removals)
When to bump PATCH (bug fixes):
Bug fixes
Documentation updates
Code refactoring (no behavior change)
Security patches
Scopes
Common scopes in Ada:
specialists: Specialist system changesrag: RAG/memory systemmatrix: Matrix bridgecli: CLI interfaceweb: Web UIapi: API changesllm: LLM integrationdocs: Documentationbuild: Build systemci: CI/CD
Example: feat(specialists): add Wikipedia lookup
Breaking Changes
Mark breaking changes explicitly:
feat(api)!: change chat endpoint response format
BREAKING CHANGE: ChatResponse now returns 'messages' array
instead of 'text' string. Update all API clients.
Migration:
Before: response.text
After: response.messages[0].content
This triggers a MAJOR version bump.
Automation
CI/CD Integration
Validate commits in CI:
# .github/workflows/validate.yml
- name: Validate Commit Messages
run: |
git log --pretty=format:"%s" origin/trunk..HEAD | \
while read msg; do
echo "$msg" | ./scripts/validate-commit.sh /dev/stdin || exit 1
done
Auto-suggest version on PR:
# .github/workflows/suggest-version.yml
- name: Suggest Version
run: ./scripts/version.sh suggest
Pre-commit Hook
Install for all developers:
# In repository
echo '#!/bin/sh' > .git/hooks/commit-msg
echo 'exec ./scripts/validate-commit.sh "$1"' >> .git/hooks/commit-msg
chmod +x .git/hooks/commit-msg
Or use pre-commit framework:
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: validate-commit
name: Validate Commit Message
entry: ./scripts/validate-commit.sh
language: script
stages: [commit-msg]
Troubleshooting
Wrong version suggested
The script analyzes commits since last tag. If suggestion is wrong:
# Check what commits it's seeing
./scripts/version.sh check
# Manually specify version
./scripts/version.sh bump patch "Fix version"
Want to change last tag
If you tagged wrong version:
# Delete tag locally and remotely
git tag -d v1.9.0
git push origin :refs/tags/v1.9.0
# Create correct tag
./scripts/version.sh tag 1.9.0 "Correct version"
git push origin v1.9.0
Forgot to use conventional commits
It’s okay! You can:
1. Use ``suggest`` command anyway (will suggest patch bump)
2. Manually specify version: ``./scripts/version.sh bump minor "Summary"``
3. Start using conventional commits going forward
Reference
Links
Ada Scripts
scripts/version.sh- Version managementscripts/changelog.sh- Changelog generationscripts/validate-commit.sh- Commit message validation
Files
pyproject.toml- Containsversion = "X.Y.Z"ada_main.py- Contains@click.version_option(version="X.Y.Z")CHANGELOG.md- Human-readable changelog.git/hooks/commit-msg- Optional commit validation hook
—
Last Updated: 2025-12-16 Ada Version: 1.8.0