Problem
Extension developers currently must reference azd Go packages using pseudo versions (e.g., v0.0.0-20250430002405-5fba40c50969) instead of stable, semantically versioned releases. This creates instability, poor developer experience, and makes it difficult to manage dependencies and compatibility.
Root Cause
The azd Go packages were not initially designed to be leveraged by other projects or tools. Our versioning strategy only targeted the built CLI tool itself (the azd binary), not the underlying Go packages that extension developers need to import.
Current State
- Extension developers import azd packages (like
azdext) as dependencies
- These packages use pseudo versions based on git commit hashes (e.g.,
v0.0.0-20250430002405-5fba40c50969)
- No semantic versioning strategy for packages consumed externally
- No clear separation between public APIs (meant for external use) and internal implementation details
- No documented compatibility guarantees or versioning policies
Impact on Extension Developers
- Unstable Dependencies: Pseudo versions tied to specific commits make it unclear what changes are included
- No Compatibility Guarantees: No way to know if upgrading will introduce breaking changes
- Poor Developer Experience: Difficult to understand which version to depend on
- Breaking Changes: No clear signal when APIs change in backward-incompatible ways
- Version Management: Cannot use standard Go module version constraints (e.g.,
^1.2.3)
Proposed Solution Direction
Implement a production-grade semantic versioning strategy for externally consumed Go packages, separate from the CLI tool versioning.
Repository Organization
The repository structure needs reorganization to clearly separate concerns:
-
Core CLI Tool (azd)
- The
azd command-line binary
- Has its own release versioning (e.g., v1.5.0)
- Internal implementation
-
First-Party Extensions
- Extensions that reside in the azure-dev repository
- Maintained by the core team
- Examples: azure.ai.agents, azure.coding-agent, microsoft.azd.extensions
-
Externally Consumed Packages (Public APIs)
- Go packages designed for external consumption by extension developers
- Examples:
azdext package and other public APIs
- Must have semantic versioning (e.g., v1.0.0, v1.1.0, v2.0.0)
- Clear API stability and compatibility guarantees
- Documented versioning policy
-
Internal Packages
- Packages used exclusively by core CLI and internal implementations
- Not intended for external consumption
- Can evolve freely without external compatibility concerns
- Should be clearly marked as internal (e.g., in
internal/ directory)
Acceptance Criteria
Versioning Strategy
Repository Structure
API Stability
Developer Experience
Process & Tooling
Benefits
- Stability: Extension developers can depend on stable, predictable package versions
- Clarity: Clear separation between public and internal APIs
- Compatibility: Semantic versioning provides clear compatibility guarantees
- Developer Experience: Standard Go module version management works as expected
- Evolution: Internal packages can evolve freely without breaking extensions
- Trust: Professional versioning builds confidence in the extension ecosystem
Related Issues
- Extension developer documentation needs
- API stability and compatibility concerns
- Extension framework maturity and production-readiness
Next Steps
- Design detailed versioning strategy and repository organization
- Identify all packages that should be public vs. internal
- Define semver policy (what constitutes major/minor/patch bumps)
- Create migration plan for existing extensions
- Implement repository restructuring
- Update tooling and CI/CD for version management
- Document public API versioning guarantees
Problem
Extension developers currently must reference azd Go packages using pseudo versions (e.g.,
v0.0.0-20250430002405-5fba40c50969) instead of stable, semantically versioned releases. This creates instability, poor developer experience, and makes it difficult to manage dependencies and compatibility.Root Cause
The azd Go packages were not initially designed to be leveraged by other projects or tools. Our versioning strategy only targeted the built CLI tool itself (the
azdbinary), not the underlying Go packages that extension developers need to import.Current State
azdext) as dependenciesv0.0.0-20250430002405-5fba40c50969)Impact on Extension Developers
^1.2.3)Proposed Solution Direction
Implement a production-grade semantic versioning strategy for externally consumed Go packages, separate from the CLI tool versioning.
Repository Organization
The repository structure needs reorganization to clearly separate concerns:
Core CLI Tool (azd)
azdcommand-line binaryFirst-Party Extensions
Externally Consumed Packages (Public APIs)
azdextpackage and other public APIsInternal Packages
internal/directory)Acceptance Criteria
Versioning Strategy
Repository Structure
internal/directory)API Stability
Developer Experience
^1.2.0)Process & Tooling
Benefits
Related Issues
Next Steps