Codemap Generator
Generate CODEMAP.md files that help humans and AI agents navigate codebases.
Output Separation
- CODEMAP.md = Auto-generated navigation map (this skill creates/updates)
- ARCHITECTURE.md = Hand-written design decisions (never touch)
Workflow
Phase 1: Project Analysis
-
Count files to determine project size:
- Use Glob with pattern
**/*excluding vendored paths - Exclude:
node_modules/,vendor/,__pycache__/,target/,.terraform/,.* - Count results to determine depth
- Use Glob with pattern
-
Detect project type(s):
- Check for IaC patterns (Terraform, Ansible, K8s, etc.)
- Check for application code (package.json, go.mod, requirements.txt, etc.)
- Projects can be mixed (app + infra)
-
Set depth based on file count: | Files | Depth | Output | |-------|-------|--------| | <50 | shallow | Single root CODEMAP.md | | 50-500 | medium | Root + key directories | | >500 | deep | Root + 2 levels, skip vendored |
Phase 2: Existing File Check
STOP. Check for existing CODEMAP.md before proceeding.
Before generating, check if CODEMAP.md exists.
If exists: Use AskUserQuestion with options:
- Overwrite completely
- Merge/update (preserve manual additions)
- Abort
If not exists: Proceed to generation.
Do NOT proceed to Phase 3 until resolved.
Phase 3: Content Generation
Generate sections based on what's detected:
For Application Code
- Tech Stack - languages, frameworks, key dependencies
- Directory Structure - annotated tree with purpose per directory
- Entry Points - main files, CLI commands, API servers
- Code Architecture Diagram - mermaid showing component relationships
- Key Files Reference - important files with one-line descriptions
For Infrastructure Code
- IaC Stack - Terraform, Ansible, K8s, etc.
- Infrastructure Topology Diagram - mermaid showing resource relationships
- Module/Role Hierarchy Diagram - mermaid showing code organization
- Resource Inventory - what's managed, providers used
For Mixed Repos
Include both sections with clear delineation.
Phase 4: Output
Write CODEMAP.md to project root (and subdirectories if depth warrants).
Detection Patterns
Application Code
| Indicator | Stack |
|-----------|-------|
| package.json | Node.js/JavaScript/TypeScript |
| go.mod | Go |
| Cargo.toml | Rust |
| requirements.txt, pyproject.toml, setup.py | Python |
| pom.xml, build.gradle | Java |
| Gemfile | Ruby |
| composer.json | PHP |
| *.csproj, *.sln | .NET |
Infrastructure as Code
| Indicator | Tool | Analysis Method |
|-----------|------|-----------------|
| *.tf files | Terraform | Parse resources, modules, use terraform graph if initialized |
| playbook*.yml + roles/ | Ansible | Map playbooks → roles → tasks |
| kind: in YAML, kustomization.yaml | Kubernetes | Parse manifests, map services/deployments |
| Chart.yaml | Helm | Parse templates, values |
| Pulumi.yaml | Pulumi | Treat like application code |
| AWSTemplateFormatVersion | CloudFormation | Parse resources, nested stacks |
| docker-compose.yml | Docker Compose | Map services, networks, volumes |
Mermaid Diagram Patterns
Code Architecture (Component Relationships)
graph TD
subgraph "API Layer"
A[REST API]
B[GraphQL]
end
subgraph "Business Logic"
C[Services]
D[Domain Models]
end
subgraph "Data Layer"
E[Repositories]
F[Database]
end
A --> C
B --> C
C --> D
C --> E
E --> F
Infrastructure Topology
graph LR
subgraph "AWS"
ALB[Load Balancer]
subgraph "ECS Cluster"
SVC1[Service A]
SVC2[Service B]
end
RDS[(PostgreSQL)]
REDIS[(Redis)]
end
ALB --> SVC1
ALB --> SVC2
SVC1 --> RDS
SVC2 --> RDS
SVC1 --> REDIS
Module Hierarchy (Terraform)
graph TD
ROOT[Root Module]
ROOT --> VPC[modules/vpc]
ROOT --> ECS[modules/ecs]
ROOT --> RDS[modules/rds]
ECS --> SG[modules/security-groups]
RDS --> SG
Analysis Techniques
Import Graph (AST-based)
For JS/TS:
ast-grep --pattern 'import $_ from "$SOURCE"' --lang ts
ast-grep --pattern 'require("$SOURCE")' --lang js
For Python:
ast-grep --pattern 'from $MODULE import $_' --lang python
ast-grep --pattern 'import $MODULE' --lang python
For Go:
ast-grep --pattern 'import "$PKG"' --lang go
Entry Point Detection
| File Pattern | Type |
|--------------|------|
| main.go, main.py, main.ts | Application entry |
| index.ts, index.js | Module entry |
| cli.py, cli.ts, cmd/ | CLI entry |
| server.ts, app.py, api/ | Server entry |
| *_test.go, *.test.ts, test_*.py | Test entry |
Terraform Resource Parsing
Extract from *.tf:
resourceblocks → managed infrastructuremoduleblocks → dependenciesproviderblocks → cloud targetsdatablocks → external references
If .terraform/ exists and terraform init has been run, can use:
terraform graph | # convert DOT to mermaid
Note: terraform graph requires initialized state. Skip if .terraform/ missing or init incomplete.
Output Template
# Codemap
> Auto-generated navigation map. Last updated: {date}
> For design decisions, see ARCHITECTURE.md (if exists)
## Tech Stack
- **Languages**: {detected languages}
- **Frameworks**: {detected frameworks}
- **Infrastructure**: {detected IaC tools}
## Directory Structure
\`\`\`
{annotated tree}
\`\`\`
## Code Architecture
\`\`\`mermaid
{component diagram}
\`\`\`
## Infrastructure Topology
\`\`\`mermaid
{infra diagram}
\`\`\`
## Entry Points
| Entry | Purpose | Command |
|-------|---------|---------|
| {file} | {purpose} | {how to run} |
## Key Files
| File | Purpose |
|------|---------|
| {path} | {description} |
Edge Cases
- Monorepos: Detect workspace patterns (lerna, nx, turborepo, go workspaces), generate per-package maps
- No clear structure: Generate minimal map with warnings about organization
- Vendored code: Always exclude from analysis (node_modules, vendor, .terraform, pycache)
- Generated code: Detect and label (protobuf, OpenAPI, etc.)