playbook/antigravity-awesome-skills/skills/ecl-harness-engineer/references/architecture-diagrams.md

421 lines
11 KiB
Markdown

# Architecture Diagram Templates
Auto-generated Mermaid diagrams for visualizing codebase structure. These diagrams are derived
from actual code analysis — not hand-drawn, not aspirational. Every diagram should reflect
what the code **actually does**, not what the author wishes it did.
## Table of Contents
- [How to Generate Diagrams](#how-to-generate-diagrams)
- [Package Dependency Graph](#1-package-dependency-graph)
- [Data Flow Diagram](#2-data-flow-diagram)
- [Component Relationship Diagram](#3-component-relationship-diagram)
- [Call Hierarchy Diagram](#4-call-hierarchy-diagram)
- [Interface Implementation Map](#5-interface-implementation-map)
- [Module Boundary Diagram](#6-module-boundary-diagram)
- [Sequence Diagram for Key Flows](#7-sequence-diagram-for-key-flows)
---
## How to Generate Diagrams
Diagrams are generated by analyzing actual code, not by guessing. Follow this process:
### For Go projects
```bash
# List all packages and their imports
go list -json ./... | jq '{ImportPath, Imports}'
# Find interfaces and their implementations
grep -rn 'type.*interface' --include='*.go' .
grep -rn 'func.*) .*(' --include='*.go' . | head -50
# Map package dependencies
go list -m -json all
```
### For TypeScript/Node projects
```bash
# Find all imports
grep -rn "from ['\"]" --include='*.ts' src/
# Find interfaces and classes
grep -rn "export interface\|export class\|export type" --include='*.ts' src/
# Check package.json dependencies
cat package.json | jq '.dependencies, .devDependencies'
```
### For Python projects
```bash
# Find all imports
grep -rn "^from \|^import " --include='*.py' src/
# Find classes and their bases
grep -rn "class .*:" --include='*.py' src/
# Check dependency declarations
cat pyproject.toml # or requirements.txt
```
After gathering this data, generate the appropriate Mermaid diagrams below.
---
## 1. Package Dependency Graph
Shows which packages depend on which. The most important diagram for understanding architecture.
### Template
````markdown
```mermaid
graph TD
subgraph "Layer 5 — Entry Points"
CMD[cmd/]
end
subgraph "Layer 4 — Interfaces"
UI[ui/]
SDK[sdk/]
API[api/]
end
subgraph "Layer 3 — Business Logic"
CORE[core/]
SVC[services/]
end
subgraph "Layer 2 — Infrastructure"
CFG[config/]
LOG[logging/]
end
subgraph "Layer 1 — Utilities"
UTIL[utils/]
end
subgraph "Layer 0 — Types"
TYPES[types/]
end
CMD --> UI
CMD --> API
UI --> CORE
SDK --> CORE
API --> SVC
CORE --> CFG
CORE --> UTIL
SVC --> CFG
CFG --> TYPES
UTIL --> TYPES
LOG --> TYPES
style TYPES fill:#e8f5e9
style UTIL fill:#e3f2fd
style CFG fill:#e3f2fd
style LOG fill:#e3f2fd
style CORE fill:#fff3e0
style SVC fill:#fff3e0
style UI fill:#fce4ec
style SDK fill:#fce4ec
style API fill:#fce4ec
style CMD fill:#f3e5f5
```
````
### Generation Guidance
When generating this diagram from real code:
1. Run `go list -json ./...` (or equivalent for your language)
2. For each package, extract its internal imports
3. Group packages by their layer assignment (from lint-deps rules)
4. Draw edges for each internal import relationship
5. Color by layer level (green=L0, blue=L1-2, orange=L3, pink=L4, purple=L5)
Important: only include **internal** dependencies, not stdlib or third-party.
---
## 2. Data Flow Diagram
Shows how data moves through the system end-to-end.
### Template
````markdown
```mermaid
flowchart LR
INPUT["User Input<br/><i>CLI args / HTTP request</i>"]
PARSE["Parse & Validate<br/><code>cmd/parse.go</code>"]
LOGIC["Business Logic<br/><code>core/processor.go</code>"]
STORE["Storage Layer<br/><code>storage/db.go</code>"]
OUTPUT["Output<br/><i>stdout / HTTP response</i>"]
INPUT --> PARSE
PARSE --> LOGIC
LOGIC --> STORE
STORE --> LOGIC
LOGIC --> OUTPUT
subgraph "Config"
CFG["config/config.go"]
end
CFG -.-> PARSE
CFG -.-> LOGIC
CFG -.-> STORE
```
````
### Generation Guidance
To map data flow accurately:
1. Find entry points (`main()`, HTTP handlers, CLI command handlers)
2. Trace what happens to user input step by step
3. Note which files/functions are involved at each step — include the actual file path
4. Identify where data is transformed, stored, or returned
5. Show config/logging as dotted lines (support infrastructure, not primary flow)
---
## 3. Component Relationship Diagram
Shows the major components and their interactions. Best for projects with clear module boundaries.
### Template
````markdown
```mermaid
graph TB
subgraph "Public API Surface"
REST["REST API<br/><code>api/router.go:25</code>"]
GRPC["gRPC Service<br/><code>api/grpc/server.go:18</code>"]
CLI_CMD["CLI Commands<br/><code>cmd/root.go:42</code>"]
end
subgraph "Core Domain"
AUTH["Auth Service<br/><code>core/auth/service.go:15</code>"]
USER["User Service<br/><code>core/user/service.go:22</code>"]
BILLING["Billing Engine<br/><code>core/billing/engine.go:30</code>"]
end
subgraph "Infrastructure"
DB["Database<br/><code>infra/postgres/client.go:10</code>"]
CACHE["Cache<br/><code>infra/redis/client.go:8</code>"]
QUEUE["Message Queue<br/><code>infra/queue/producer.go:12</code>"]
end
REST --> AUTH
REST --> USER
GRPC --> BILLING
CLI_CMD --> USER
AUTH --> DB
AUTH --> CACHE
USER --> DB
BILLING --> DB
BILLING --> QUEUE
```
````
### Generation Guidance
1. Identify major service/component boundaries
2. For each component, find the primary file and line where it's defined
3. Map method calls between components (grep for cross-package function calls)
4. Group by architectural layer
---
## 4. Call Hierarchy Diagram
Shows the function call chain for critical code paths.
### Template
````markdown
```mermaid
graph TD
A["main()<br/><code>main.go:15</code>"]
B["cmd.Execute()<br/><code>cmd/root.go:42</code>"]
C["runCommand()<br/><code>cmd/run.go:28</code>"]
D["service.Process()<br/><code>core/service.go:55</code>"]
E["validator.Check()<br/><code>core/validate.go:12</code>"]
F["store.Save()<br/><code>storage/store.go:33</code>"]
G["reporter.Output()<br/><code>output/report.go:20</code>"]
A --> B
B --> C
C --> D
D --> E
D --> F
D --> G
E -->|"validation error"| C
F -->|"storage error"| D
```
````
### Generation Guidance
1. Start from the entry point of the flow you want to document
2. Use LSP `outgoingCalls` to trace the call chain, or grep for function invocations
3. Include the file and line number for each function
4. Show error paths as labeled edges
5. Keep it to 8-12 nodes max — if more complex, split into sub-diagrams
---
## 5. Interface Implementation Map
Shows which types implement which interfaces. Critical for understanding extensibility.
### Template
````markdown
```mermaid
classDiagram
class Provider {
<<interface>>
+Execute(ctx, input) Result, error
+Name() string
+SupportsStream() bool
}
class OpenAIProvider {
-client *openai.Client
-model string
+Execute(ctx, input) Result, error
+Name() string
+SupportsStream() bool
}
class AnthropicProvider {
-client *anthropic.Client
-model string
+Execute(ctx, input) Result, error
+Name() string
+SupportsStream() bool
}
class MockProvider {
-responses []Result
+Execute(ctx, input) Result, error
+Name() string
+SupportsStream() bool
}
Provider <|.. OpenAIProvider : implements
Provider <|.. AnthropicProvider : implements
Provider <|.. MockProvider : implements
note for Provider "Defined in core/types/provider.go:18"
note for OpenAIProvider "Defined in providers/openai/provider.go:25"
note for AnthropicProvider "Defined in providers/anthropic/provider.go:22"
note for MockProvider "Defined in testing/mock_provider.go:10"
```
````
### Generation Guidance
1. Find all interfaces: `grep -rn 'type.*interface' --include='*.go'`
2. Find implementations by matching method signatures
3. For each implementation, list its struct fields (private) and methods (public)
4. Add source file location as notes
5. Focus on the most important interfaces — don't try to diagram everything
---
## 6. Module Boundary Diagram
Shows public vs internal API surface. Useful for library/SDK projects.
### Template
````markdown
```mermaid
graph TB
subgraph "Public API (exported)"
PUB_TYPES["Types<br/><code>pkg/types.go</code><br/><i>Config, Options, Result</i>"]
PUB_FUNC["Functions<br/><code>pkg/client.go</code><br/><i>New(), Run(), Close()</i>"]
PUB_IFACE["Interfaces<br/><code>pkg/interfaces.go</code><br/><i>Provider, Store</i>"]
end
subgraph "Internal (unexported)"
INT_CORE["Core Logic<br/><code>internal/core/</code>"]
INT_PARSE["Parsing<br/><code>internal/parse/</code>"]
INT_UTIL["Utilities<br/><code>internal/util/</code>"]
end
PUB_FUNC --> INT_CORE
PUB_FUNC --> INT_PARSE
INT_CORE --> INT_UTIL
INT_PARSE --> INT_UTIL
style PUB_TYPES fill:#c8e6c9
style PUB_FUNC fill:#c8e6c9
style PUB_IFACE fill:#c8e6c9
style INT_CORE fill:#ffecb3
style INT_PARSE fill:#ffecb3
style INT_UTIL fill:#ffecb3
```
````
---
## 7. Sequence Diagram for Key Flows
Shows time-ordered interactions between components for specific user scenarios.
### Template
````markdown
```mermaid
sequenceDiagram
participant User
participant CLI as CLI (cmd/run.go)
participant Auth as Auth Service (core/auth/)
participant DB as Database (storage/)
participant API as External API
User->>CLI: run --project my-app
CLI->>Auth: Authenticate(token)
Auth->>DB: GetUser(token)
DB-->>Auth: User{id, role}
Auth-->>CLI: AuthResult{ok, user}
CLI->>API: FetchProject("my-app")
API-->>CLI: ProjectData{...}
CLI-->>User: Display results
```
````
### Generation Guidance
1. Pick the 3-5 most common/important user flows
2. Trace the complete sequence from user input to final output
3. Include actual component names and file paths
4. Show both success and error paths
5. Keep each sequence to 10-15 messages max
---
## Diagram Selection Guide
Not every project needs all seven diagram types. Choose based on what matters:
| Project Type | Recommended Diagrams |
|---|---|
| CLI tool | Package Dependency, Data Flow, Call Hierarchy |
| Web API | Package Dependency, Component Relationship, Sequence |
| Library/SDK | Package Dependency, Interface Implementation, Module Boundary |
| Microservice | Component Relationship, Data Flow, Sequence |
| Monolith | Package Dependency, Component Relationship, Interface Implementation |
## Diagram Quality Checklist
Every generated diagram should pass these checks:
- [ ] **Grounded in code**: Every node references an actual file/package (not aspirational)
- [ ] **File references**: Include `code>file:line</code>` where possible
- [ ] **No orphan nodes**: Every node has at least one connection
- [ ] **Layered layout**: Higher-level components at top, lower at bottom
- [ ] **Color coding**: Consistent colors across diagrams in the same project
- [ ] **Reasonable size**: 5-15 nodes per diagram; split if larger
- [ ] **Updated date**: Note when the diagram was last regenerated