Skip to main content
Learn strategies for managing multiple plugin versions, rollbacks, and upgrades.

Version Numbering Scheme

Noorle uses integer versioning (v1, v2, v3…) internally, but adopt semantic versioning for external communication.

Semantic Versioning

Format: MAJOR.MINOR.PATCH

Examples

1.0.0 → 1.0.1  (patch fix)
1.0.0 → 1.1.0  (new tool added, backwards compatible)
1.0.0 → 2.0.0  (renamed tools, API changed)

Creating Versions

First Release (v1)

# Create your plugin
noorle plugin new my-plugin

# Build
noorle plugin build

# Upload
noorle plugin push

# Creates v1 as active version

Adding Features (Minor Version)

# Add new tools to src/
# pub fn new_tool() { ... }

# Increment MINOR version in package metadata
# In noorle.yaml, Cargo.toml, package.json, etc.

# Build
noorle plugin build

# Upload
noorle plugin push

# Creates v2 (backwards compatible, new features)

Bug Fixes (Patch Version)

# Fix bugs in existing tools
# Behavior change only, no API changes

# Build
noorle plugin build

# Upload
noorle plugin push

# Creates v3 (backwards compatible, fixes only)

Breaking Changes (Major Version)

# Significant API changes:
# - Rename tools
# - Change parameter names/types
# - Remove deprecated tools
# - Change return types

# Update version
# e.g., 1.2.0 → 2.0.0

# Build and upload
noorle plugin build
noorle plugin push

# Creates v4 (breaking change)
# Previous versions still available

Managing Multiple Versions

Version Lifecycle

Active Version

Only one version is active at a time:
# View active version
noorle plugin info my-plugin --json | jq '.active_version'
# Output: 3

# See all versions
noorle plugin versions my-plugin

# Output:
# Version 1: archived (0 agents)
# Version 2: archived (2 agents)
# Version 3: active (15 agents)

Switching Active Version

# Make v2 active
noorle plugin activate my-plugin --version 2

# All new agents use v2
# Existing agents on v3 continue until updated

Rollback Procedures

Quick Rollback

If a version has critical bugs:
# Issue detected in v3
# Quickly switch to v2

noorle plugin activate my-plugin --version 2

# Agents now use v2
# Users can manually update to v3 when fixed

Gradual Rollback

Rollback specific agents:
# Check which agents use each version
noorle agent list --filter 'plugin:my-plugin'

# Output:
# agent-prod:     my-plugin v3
# agent-staging:  my-plugin v3
# agent-legacy:   my-plugin v2

# Rollback staging agent only
noorle agent update agent-staging --plugin-version 2

# Production stays on v3 for monitoring

Partial Rollout

Test new versions before full rollout:
# Create staging environment
noorle agent create agent-staging \
  --plugin-id my-plugin \
  --plugin-version 3

# Create production environment
noorle agent create agent-prod \
  --plugin-id my-plugin \
  --plugin-version 2

# Test v3 in staging
# If successful, upgrade production
# If problems, keep production on v2

Compatibility Management

Backwards Compatibility

When adding features, maintain compatibility:
// ✅ Compatible: Add optional parameter
pub fn process(input: String, options: Option<String>) -> String {
    // Old code still works (None case)
    // New code uses options
}

// ✅ Compatible: Return new field in object
pub fn get_data(id: String) -> {
    "id": "...",
    "data": "...",
    "new_field": "..."  // New field added
}

// ❌ Breaking: Change required parameter
// pub fn process(input: String, options: String) -> String { }
// Old code breaks

// ❌ Breaking: Remove field from response
// pub fn get_data(id: String) -> {
//     "id": "...",
//     // "data" field removed
// }
// Parsing breaks

Deprecation Warnings

Mark tools for removal:
/// Process data with legacy algorithm.
///
/// ⚠️ **Deprecated in v2.0**
/// Use `process_v2()` instead.
/// Will be removed in v3.0 (2024-12-31)
pub fn process(input: String) -> String {
    log_warning("process() is deprecated, use process_v2()");
    process_v2(input)  // Delegate to new impl
}

pub fn process_v2(input: String) -> String {
    // New implementation
}

Migration Helpers

Provide tools to assist migration:
noorle plugin docs my-plugin --section migration

# Output documentation about:
# - What changed between versions
# - How to migrate code
# - Deprecation timeline

Dependency Management

Pin Dependencies

Keep versions consistent:
# Cargo.toml (Rust)
[dependencies]
serde = "=1.0.195"      # Exact version
reqwest = "~0.11.24"    # Patch updates only
uuid = "^1.6.1"         # Minor/patch updates

# OR package.json (TypeScript)
{
  "dependencies": {
    "axios": "1.6.0",
    "lodash-es": "~4.17.21",
    "uuid": "^9.0.0"
  }
}

Update Strategy

# For patch releases (v1.0.0 → v1.0.1)
cargo update -p serde --precise 1.0.196

# For minor/major (v1.0.0 → v1.1.0)
cargo update

# For pinned versions
cargo add serde=1.0.200

Security Updates

Apply security patches promptly:
# Check for vulnerabilities
cargo audit

# Output:
# Vulnerability: serde 1.0.190
# - Update to 1.0.200 or higher

# Update
cargo update -p serde --precise 1.0.200

# Create patch release
noorle plugin push
# Creates v3.1 (bug fix/security patch)

Long-Term Support

LTS (Long-Term Support) Versions

Designate versions for extended support:
# Declare v2 as LTS with 12-month support
noorle plugin lts my-plugin --version 2 \
  --support-until "2025-03-22" \
  --security-fixes-only

# v2 receives critical fixes only
# Users encouraged to migrate to v3

Sunset Timeline

noorle plugin deprecate my-plugin --version 1 \
  --sunset-date "2024-12-31" \
  --replacement-version 3

# Announcement:
# "v1 will be retired on 2024-12-31
#  Upgrade to v3 before then
#  v2 available as intermediate step"

Retire Version

After sunset:
noorle plugin retire my-plugin --version 1

# v1 no longer available
# Agents on v1 must update to v2+ before next invocation

Maintenance Branches

For Complex Projects

# Main development branch
git checkout main

# Create release branch
git checkout -b v1.2.x
# Fixes go here

# Create maintenance branch
git checkout -b v1.x-maintenance
# Critical security fixes for v1

# Upload from appropriate branch
git checkout v1.2.x
noorle plugin push  # Creates v2 (1.2.x release)

Cherry-Picking Fixes

# Fix bug in main
git commit -m "Fix parsing bug"

# Back-port to v1 maintenance
git checkout v1.x-maintenance
git cherry-pick <commit-hash>
git push

# Build and release v1.1.1
noorle plugin push

Monitoring Version Health

Error Rates by Version

noorle plugin metrics my-plugin

# Output:
# v3 (current): 234ms avg, 0.02% errors, 1250 calls/day
# v2:           240ms avg, 0.05% errors,  220 calls/day
# v1:            N/A (retired)

# v3 healthier than v2 → Safe to keep active

Gradual Adoption

Monitor version adoption:
noorle plugin adoption my-plugin --days 30

# Output:
# v3: 90% agents (2 weeks old)
# v2: 10% agents (legacy)

# Good adoption rate for new version

Version Policy Template

Create a policy for your organization:
# Plugin Versioning Policy

## Semantic Versioning
We use MAJOR.MINOR.PATCH

## Release Cadence
- Patch releases: As needed (bug fixes)
- Minor releases: Monthly (new features)
- Major releases: Quarterly (breaking changes)

## Support Timeline
- Latest version: Full support
- Previous version: Bug/security fixes for 3 months
- Older versions: Security fixes only for 6 months

## Deprecation
- 6 weeks notice before removal
- Migration guide provided
- Previous version available for rollback

## Breaking Changes
- Avoid when possible
- Provide migration path
- Maintain support for previous version

Version Checklist

Before releasing:
  • All tests pass
  • Updated changelog/release notes
  • Verified backwards compatibility (if not major)
  • Documented breaking changes (if applicable)
  • Performance benchmarks acceptable
  • Security audit passed
  • Dependency vulnerabilities resolved
  • File size within limits
  • Metadata complete
  • Team reviewed changes

Next Steps