Experimental - A spec-kit extension for Azure Verified Module (AVM) maintainers, contributors, and editors.
AVM Spec-Kit provides AI-assisted guardrails for developing Azure Verified Modules. It encodes AVM specifications (BCPNFR for Bicep, TFNFR for Terraform) as a "constitution" that AI coding assistants follow.
This helps you:
- Maintain consistency with AVM specifications
- Reduce context loss in long AI conversations
- Scaffold modules that pass AVM validation on first try
- Keep your development process private while producing polished outputs
This project is an experiment by AVM community members. It is:
- NOT an official Microsoft or AVM project
- NOT endorsed by the AVM core team (yet)
- A proof-of-concept to explore AI-assisted IaC development
We welcome feedback from other AVM maintainers!
| Language | Spec Reference | Status |
|---|---|---|
| Bicep | BCPNFR | β Supported |
| Terraform | TFNFR | π§ Planned |
- Python 3.11+ - Download
- Git - Download
- uv (Python package manager) - See installation below
- An AI coding assistant (GitHub Copilot, Claude, Cursor, etc.)
Choose your platform:
πͺ Windows
Option A: WinGet (Recommended)
winget install --id=astral-sh.uv -eOption B: Scoop
scoop install main/uvOption C: PowerShell installer
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"After installation, restart your terminal or run:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")π macOS
Option A: Homebrew (Recommended)
brew install uvOption B: Shell installer
curl -LsSf https://astral.sh/uv/install.sh | shπ§ Linux
Shell installer
curl -LsSf https://astral.sh/uv/install.sh | shOr if you don't have curl:
wget -qO- https://astral.sh/uv/install.sh | shVerify installation:
uv --versionuv tool install specify-cli --from git+https://github.com/github/spec-kit.gitNote: If you see a PATH warning, follow the instructions or run
uv tool update-shell
Verify installation:
specify checkOption A: Copy just the constitution (minimal)
# In your AVM module directory
mkdir -p .specify/memory
curl -o .specify/memory/constitution.md https://raw.githubusercontent.com/FallenHoot/avm-spec-kit/main/.specify/memory/constitution.md
echo ".specify/" >> .gitignoreOption B: Clone and copy everything
git clone https://github.com/FallenHoot/avm-spec-kit.git
cp -r avm-spec-kit/.specify/ your-avm-module/
echo ".specify/" >> your-avm-module/.gitignoreStart your AI assistant and use these commands:
/avm.module - Define a new AVM module specification
/avm.design - Create architecture decisions and interfaces
/avm.test - Generate E2E test scenarios
/avm.implement - Build the module following AVM patterns
/avm.contribute - Prepare for contributing (check issues, owners, guidelines)
/avm.scan - Scan repos for issues/PRs affecting your module
/avm.dependencies - Check module dependencies for updates
/avm.onboard - Onboard a new module (team, CODEOWNERS, workflow, MAR)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Your AVM Module Repo β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β .specify/ β .gitignore (PRIVATE) β
β βββ memory/ β
β β βββ constitution.md β AVM rules AI must follow β
β β βββ session.md β Your notes (optional) β
β βββ specs/ β
β β βββ my-module.md β Current work in progress β
β βββ templates/ β
β βββ commands/ β /avm.* slash commands β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β avm/ptn/my-module/ β Actual code (PUBLIC) β
β βββ main.bicep β
β βββ README.md β
β βββ tests/e2e/ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key principle: Your learning process stays private. Your polished output goes public.
| Command | Purpose |
|---|---|
/avm.module |
Define a new AVM module specification |
/avm.design |
Create architecture decisions and interfaces |
/avm.test |
Generate E2E test scenarios |
/avm.implement |
Build the module following AVM patterns |
| Command | Purpose |
|---|---|
/avm.contribute |
Prepare for contributing - reviews issues, identifies owners, checks guidelines |
/avm.scan |
Scan AVM repos for issues/PRs affecting your module |
/avm.dependencies |
Check module dependencies for updates and breaking changes |
/avm.onboard |
Onboard a new module β GitHub team, CODEOWNERS, workflow, and registry setup |
/avm.contribute
Issue I'm addressing: https://github.com/Azure/bicep-registry-modules/issues/1234
My proposed changes:
Add support for customer-managed keys to the storage module
Please help me:
1. Review the issue comments and any linked PRs to check if someone else is already working on this
2. Identify the module/code owners I should coordinate with
3. Find any contribution guidelines, specs, or interface standards I need to follow
4. Flag potential scope creep - what's the minimum change needed?
5. Review my PR before I submit (when ready)
The constitution encodes AVM specifications as AI guardrails:
- Semantic versioning requirements
- Required test scenarios (defaults, WAF-aligned)
- Module classification (RES, PTN, UTL)
- Interface requirements (diagnostics, locks, tags, RBAC)
- Parameter naming: camelCase
- Registry path:
br/public:avm/res|ptn/... - Required decorators:
@description(),@metadata() - Output conventions
- Variable naming: snake_case
- Module source:
Azure/avm-res-.../azurerm - Required variables and outputs
| What | Where | Who Sees |
|---|---|---|
| Your AI conversations | Chat tool (Copilot/Claude) | No one |
| Your experiments | .specify/ (gitignored) |
Only you |
| Your mistakes | Local branch | Only you |
| Clean final code | Git commits | Your peers |
This is an experiment! We welcome:
- Feedback from AVM maintainers
- Constitution improvements
- New command templates
- Bug reports
Please open an issue or PR.
Your PATH wasn't updated after installation. Try:
Windows (PowerShell):
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")macOS/Linux:
source ~/.bashrc # or ~/.zshrcOr simply restart your terminal.
The uv tools directory isn't in your PATH. Run:
uv tool update-shellThen restart your terminal.
- Make sure
.specify/templates/commands/exists in your project - Restart your IDE/editor completely
- Check your AI agent supports slash commands (see supported agents)
Back up before upgrading:
cp .specify/memory/constitution.md .specify/memory/constitution-backup.md
specify init --here --force --ai copilot
mv .specify/memory/constitution-backup.md .specify/memory/constitution.md- spec-kit - The foundation this builds on
- Azure Verified Modules - The official AVM program
- bicep-registry-modules - AVM Bicep modules
- Bicep MCP Server - AI tools for Bicep
MIT License - see LICENSE
- GitHub Spec-Kit team for the foundation
- @bvorland for introducing us to Spec-Kit
- AVM Core Team for the specifications
- @johnlokerse for Bicep + AI integration patterns