.github/skills/azqr-developer/SKILL.md
Expert guidance for developing and contributing to Azure Quick Review (azqr) - A Go-based CLI tool for Azure resource compliance analysis
npx skillsauth add azure/azqr azqr-developerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert guidance for autonomous agents and developers contributing to the Azure Quick Review (azqr) project.
Azure Quick Review (azqr) is a CLI tool written in Go that analyzes Azure resources for compliance with Azure's best practices and recommendations. The tool scans Azure resources using:
# Build the project
make build
# Run all tests (REQUIRED before submitting pull requests)
make test
# Clean build artifacts
make clean
# View all available targets
make help
azqr/
├── cmd/azqr/ # Main CLI application entry point
│ ├── main.go # Application entry point
│ └── commands/ # CLI command implementations (one file per Azure service)
├── cmd/server/ # Server mode implementation
├── internal/ # Internal packages
│ ├── scanner.go # Main scanning logic
│ ├── models/ # Data models and filters
│ ├── renderers/ # Output formatters (Excel, CSV, JSON)
│ ├── scanners/ # Service-specific scanners (one per Azure service)
│ ├── graph/ # Azure Resource Graph queries
│ └── throttling/ # Rate limiting utilities
├── data/ # Static data files
│ └── recommendations.json # Generated recommendations data
├── examples/ # Example configurations and CI/CD pipelines
├── docs/ # Documentation website (Hugo-based)
└── Makefile # Build automation
Scanner, Renderer)All code must support multiple authentication methods:
fmt.Errorf with %w verberrWhen adding a new Azure service, follow this systematic approach:
Create scanner in internal/scanners/<service>/
Add command in cmd/azqr/commands/<service>.go
Update models in internal/models/
Add comprehensive tests
Update documentation
CRITICAL: Always run make test before submitting pull requests. This is non-negotiable.
The test command includes:
golangci-lint) - Code quality checks# Run the full test suite (ALWAYS run before PR)
make test
# Individual test components
make lint # Run linter
make vet # Run go vet
make tidy # Check module tidiness
# Build for current platform
make build
# Build for specific OS/architecture
GOOS=linux GOARCH=amd64 make build
GOOS=windows GOARCH=amd64 make build
# Build Docker image
make build-image
# Build with version information
PRODUCT_VERSION=1.0.0 make build
# Update recommendations.json after adding rules
make json
internal/scanners/<service>/make json to update recommendations.jsonmake testmake testinternal/throttling/ for rate limiting// internal/scanners/<service>/<service>.go
package <service>
import (
"context"
"github.com/Azure/azqr/internal/models"
)
// Scanner implements the service scanner interface
type Scanner struct {
// Scanner fields (config, client, etc.)
}
// Scan performs the compliance scan for the service
func (s *Scanner) Scan(ctx context.Context) ([]models.Recommendation, error) {
// Implementation
// 1. Fetch resources
// 2. Apply recommendation rules
// 3. Return findings
}
// cmd/azqr/commands/<service>.go
package commands
import (
"github.com/spf13/cobra"
)
func init() {
// Register command with root command
}
var <service>Cmd = &cobra.Command{
Use: "<service>",
Short: "Scan <Service Name>",
Long: "Detailed description of what this scanner does",
Run: <service>Run,
}
func <service>Run(cmd *cobra.Command, args []string) {
// Command implementation
// 1. Parse flags
// 2. Initialize scanner
// 3. Run scan
// 4. Output results
}
func TestScanner_Scan(t *testing.T) {
tests := []struct {
name string
setup func() // setup test environment
want int // expected number of recommendations
wantErr bool
}{
{
name: "success case",
setup: func() { /* setup */ },
want: 5,
wantErr: false,
},
{
name: "error case",
setup: func() { /* setup */ },
want: 0,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.setup()
// test implementation
})
}
}
# Set environment variable for detailed logging
export AZURE_SDK_GO_LOGGING=all
# Run with debug flag
./azqr scan --debug
Authentication Failures
Reader on Subscription/Management Group)az account show if using Azure CLI authRate Limiting
Memory Usage
pprofNetwork Connectivity
# Service Principal
AZURE_CLIENT_ID="<service-principal-id>"
AZURE_CLIENT_SECRET="<service-principal-secret>"
AZURE_TENANT_ID="<tenant-id>"
# Credential Chain Configuration
AZURE_TOKEN_CREDENTIALS="dev" # Use Azure CLI/Azure Developer CLI
AZURE_TOKEN_CREDENTIALS="prod" # Use env vars/workload identity/managed identity
AZURE_SDK_GO_LOGGING="all" # Enable detailed SDK logging
make test and ensure all tests pass (100% required)The project currently supports 50+ Azure services including:
When adding new services:
azqr generates reports in multiple formats:
--csv flag)make test before submitting a pull request - This is the most important rulemake json after adding rulestools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.