- Phase 3: Added Mermaid diagram generation for system architecture, function modules, algorithms, class diagrams, sequence diagrams, and error flows. - Phase 4: Assembled analysis and diagrams into a structured CPCC-compliant document with section templates and figure numbering. - Phase 5: Developed compliance review process with iterative refinement based on analysis findings and user feedback. - Added CPCC compliance requirements and quality standards for project analysis reports. - Established a comprehensive project analysis skill with detailed execution flow and report types. - Enhanced error handling and recovery mechanisms throughout the analysis phases.
47 KiB
name, description, argument-hint, allowed-tools
| name | description | argument-hint | allowed-tools |
|---|---|---|---|
| analyze | Multi-phase iterative project analysis with user-guided focus, produces architecture/design/method reports through incremental updates | [scope|path] [--type=architecture|design|methods|comprehensive] | Task(*), AskUserQuestion(*), Read(*), Bash(*), Glob(*), Grep(*), TodoWrite(*), Write(*) |
Workflow Docs Analyze Command (/workflow:docs:analyze)
Overview
Iterative project analysis command that guides users through multi-phase analysis to produce tailored project reports. Uses multi-agent collaboration with incremental report updates based on user feedback.
Core Differentiator: Unlike static analysis tools, this command engages in multi-round dialogue to understand user's specific focus areas and iteratively refines reports until user satisfaction.
Report Types
| Type | Focus | Output |
|---|---|---|
architecture |
System structure, module relationships, dependencies | ARCHITECTURE-REPORT.md |
design |
Design patterns, class diagrams, component interactions | DESIGN-REPORT.md |
methods |
Key algorithms, critical paths, core functions explained | METHODS-REPORT.md |
comprehensive |
All above combined | COMPREHENSIVE-REPORT.md |
Execution Philosophy
User-Centric Iteration Model:
- Discover user's actual analysis needs (not assume)
- Explore codebase from multiple angles
- Generate initial report with clear structure
- Iterate based on user feedback until satisfied
- Finalize polished report
Execution Process
Input Parsing:
├─ Parse: scope/path (optional, defaults to project root)
└─ Parse: --type flag (optional, determines initial focus)
Phase 1: Requirements Discovery (AskUserQuestion)
├─ Ask: Report type preference (if not specified)
├─ Ask: Focus areas within chosen type
├─ Ask: Depth level (overview/detailed/deep-dive)
└─ Output: analysis_config object
Phase 2: Project Exploration (cli-explore-agent)
├─ Execute: Parallel exploration by focus areas
├─ Generate: exploration-{angle}.json files
└─ Output: explorations-manifest.json
Phase 3: Deep Analysis (Gemini CLI)
├─ Execute: Multi-dimensional analysis
├─ Generate: analysis-{dimension}.json files
└─ Output: analysis-manifest.json
Phase 4: Initial Report Generation
├─ Synthesize: Merge all analysis results
├─ Generate: {TYPE}-REPORT.md (draft)
└─ Output: Present report to user
Phase 5: Iterative Refinement (Loop)
├─ Ask: User feedback on current report
├─ Decision:
│ ├─ "satisfied" → Finalize and exit
│ ├─ "expand section X" → Deep-dive specific area
│ ├─ "add details on Y" → Augment with new analysis
│ └─ "change focus" → Re-run Phase 3 with new config
└─ Update: Incremental report modification
Finalize:
└─ Output: Final {TYPE}-REPORT.md
5-Phase Execution
Phase 1: Requirements Discovery
Purpose: Understand user's actual analysis needs through interactive questioning
Step 1.1: Initialize TodoWrite
TodoWrite([
{content: "Phase 1: Requirements Discovery", status: "in_progress", activeForm: "Discovering analysis requirements"},
{content: "Phase 2: Project Exploration", status: "pending", activeForm: "Exploring project structure"},
{content: "Phase 3: Deep Analysis", status: "pending", activeForm: "Performing deep analysis"},
{content: "Phase 4: Initial Report Generation", status: "pending", activeForm: "Generating initial report"},
{content: "Phase 5: Iterative Refinement", status: "pending", activeForm: "Refining report based on feedback"}
])
Step 1.2: Report Type Selection (if not specified)
if (!type_specified) {
AskUserQuestion({
questions: [{
question: "What type of project analysis report would you like?",
header: "Report Type",
multiSelect: false,
options: [
{label: "Architecture (Recommended)", description: "System structure, module relationships, layer analysis, dependency graph"},
{label: "Design", description: "Design patterns, class relationships, component interactions, abstraction analysis"},
{label: "Methods", description: "Key algorithms, critical code paths, core function explanations with examples"},
{label: "Comprehensive", description: "All above combined into a complete project analysis"}
]
}]
})
}
Step 1.3: Focus Area Discovery
// Based on report type, ask focused questions
const focusQuestions = {
architecture: {
question: "Which architectural aspects are you most interested in?",
header: "Focus Areas",
multiSelect: true,
options: [
{label: "Layer Structure", description: "How the system is divided into layers (presentation, business, data)"},
{label: "Module Dependencies", description: "How modules depend on and communicate with each other"},
{label: "Entry Points", description: "How requests flow through the system from entry to response"},
{label: "Data Flow", description: "How data moves and transforms across the system"}
]
},
design: {
question: "Which design aspects do you want to understand?",
header: "Design Focus",
multiSelect: true,
options: [
{label: "Design Patterns", description: "Identify and explain patterns used in the codebase"},
{label: "Class Relationships", description: "Inheritance, composition, and associations between classes"},
{label: "Interface Contracts", description: "How components communicate through interfaces/protocols"},
{label: "State Management", description: "How application state is managed and mutated"}
]
},
methods: {
question: "What kind of method analysis do you need?",
header: "Method Focus",
multiSelect: true,
options: [
{label: "Core Algorithms", description: "Key algorithms that define the system's behavior"},
{label: "Critical Paths", description: "Most important execution flows in the application"},
{label: "Public APIs", description: "External-facing methods and their contracts"},
{label: "Complex Logic", description: "Methods with high cyclomatic complexity explained"}
]
}
};
AskUserQuestion({questions: [focusQuestions[selected_type]]})
Step 1.4: Depth Level Selection
AskUserQuestion({
questions: [{
question: "How detailed should the analysis be?",
header: "Depth",
multiSelect: false,
options: [
{label: "Overview (Recommended)", description: "High-level understanding, suitable for onboarding or quick review"},
{label: "Detailed", description: "In-depth analysis with code examples and explanations"},
{label: "Deep-Dive", description: "Exhaustive analysis with implementation details and edge cases"}
]
}]
})
Step 1.5: Store Analysis Config
const analysis_config = {
type: selected_type,
focus_areas: selected_focus_areas,
depth: selected_depth,
scope: scope_path || ".",
timestamp: new Date().toISOString()
};
// Create output directory
const outputDir = `.workflow/.scratchpad/analyze-${Date.now()}`;
bash(`mkdir -p ${outputDir}`);
Write(`${outputDir}/analysis-config.json`, JSON.stringify(analysis_config, null, 2));
TodoWrite: Mark Phase 1 completed, Phase 2 in_progress
Phase 2: Project Exploration
Purpose: Multi-angle exploration based on user's focus areas
Step 2.1: Launch Parallel Explore Agents
const explorationAngles = mapFocusToAngles(analysis_config.focus_areas);
// Examples:
// - "Layer Structure" → ["architecture", "dependencies"]
// - "Design Patterns" → ["patterns", "abstractions"]
// - "Core Algorithms" → ["algorithms", "complexity"]
const explorationTasks = explorationAngles.map((angle, index) =>
Task({
subagent_type: "cli-explore-agent",
run_in_background: false,
description: `Explore: ${angle}`,
prompt: `
## Exploration Objective
Execute **${angle}** exploration for project analysis report.
## Context
- **Angle**: ${angle}
- **Report Type**: ${analysis_config.type}
- **Depth**: ${analysis_config.depth}
- **Scope**: ${analysis_config.scope}
- **Output**: ${outputDir}/exploration-${angle}.json
## Exploration Protocol
**Step 1: Structural Discovery**
- Execute: ccw tool exec get_modules_by_depth '{}'
- Find files relevant to ${angle} using rg/glob
- Map directory structure and module boundaries
**Step 2: Pattern Recognition**
- Identify ${angle}-related patterns and conventions
- Note file naming, organization patterns
- Extract key abstractions
**Step 3: Relationship Mapping**
- Map dependencies and relationships
- Identify integration points
- Note coupling and cohesion patterns
## Output Format
{
"angle": "${angle}",
"findings": {
"structure": [...],
"patterns": [...],
"relationships": [...],
"key_files": [{path, relevance, rationale}]
},
"insights": [...],
"depth_notes": "${analysis_config.depth}-specific observations"
}
Write output to: ${outputDir}/exploration-${angle}.json
`
})
);
Step 2.2: Generate Exploration Manifest
const manifest = {
config: analysis_config,
explorations: explorationAngles.map(angle => ({
angle,
file: `exploration-${angle}.json`
})),
timestamp: new Date().toISOString()
};
Write(`${outputDir}/explorations-manifest.json`, JSON.stringify(manifest, null, 2));
TodoWrite: Mark Phase 2 completed, Phase 3 in_progress
Phase 3: Deep Analysis
Purpose: Use Gemini CLI for in-depth analysis based on exploration results
Step 3.1: Synthesize Exploration Results
// Read all exploration files
const explorations = explorationAngles.map(angle =>
JSON.parse(Read(`${outputDir}/exploration-${angle}.json`))
);
// Extract key files to analyze
const keyFiles = explorations.flatMap(e => e.findings.key_files)
.sort((a, b) => b.relevance - a.relevance)
.slice(0, 20); // Top 20 most relevant files
Step 3.2: Execute Deep Analysis via Gemini CLI
const analysisPrompt = buildAnalysisPrompt(analysis_config, keyFiles);
Bash({
command: `ccw cli -p "
PURPOSE: Generate ${analysis_config.type} analysis report for project
TASK:
• Analyze project structure and patterns from ${analysis_config.type} perspective
• Focus on: ${analysis_config.focus_areas.join(', ')}
• Depth level: ${analysis_config.depth}
• Key files to analyze: ${keyFiles.map(f => f.path).join(', ')}
MODE: analysis
CONTEXT: @**/* | Exploration results from ${outputDir}/
EXPECTED:
- Structured ${analysis_config.type} analysis
- Clear explanations with code references
- Mermaid diagrams where applicable
- Actionable insights
RULES: $(cat ~/.claude/workflows/cli-templates/protocols/analysis-protocol.md) |
Focus on ${analysis_config.focus_areas.join(', ')} |
Depth: ${analysis_config.depth}
" --tool gemini --mode analysis`,
run_in_background: true,
timeout: 600000
});
Step 3.3: Store Analysis Results
// After CLI completes, store structured results
Write(`${outputDir}/deep-analysis.json`, JSON.stringify({
type: analysis_config.type,
focus_areas: analysis_config.focus_areas,
analysis_result: cli_output,
diagrams: extracted_diagrams,
code_references: extracted_references
}, null, 2));
TodoWrite: Mark Phase 3 completed, Phase 3.5 in_progress
Phase 3.5: Diagram Generation
Purpose: Generate Mermaid diagrams based on analysis results, tailored to report type
Step 3.5.1: Determine Required Diagrams
// Map report types to required diagram types
const diagramRequirements = {
architecture: [
{type: 'architecture', format: 'graph TD', name: 'System Architecture'},
{type: 'layers', format: 'graph TD', name: 'Layer Structure'},
{type: 'dependencies', format: 'graph LR', name: 'Module Dependencies'},
{type: 'dataflow', format: 'flowchart LR', name: 'Data Flow'}
],
design: [
{type: 'class', format: 'classDiagram', name: 'Class Diagram'},
{type: 'components', format: 'graph TD', name: 'Component Diagram'},
{type: 'patterns', format: 'graph TD', name: 'Design Patterns'},
{type: 'state', format: 'stateDiagram-v2', name: 'State Management'}
],
methods: [
{type: 'algorithm', format: 'flowchart TD', name: 'Algorithm Flowchart'},
{type: 'sequence', format: 'sequenceDiagram', name: 'Call Sequence'},
{type: 'critical_path', format: 'flowchart LR', name: 'Critical Path'},
{type: 'api', format: 'graph LR', name: 'API Structure'}
],
comprehensive: [
{type: 'architecture', format: 'graph TD', name: 'System Architecture'},
{type: 'class', format: 'classDiagram', name: 'Class Diagram'},
{type: 'sequence', format: 'sequenceDiagram', name: 'Key Sequences'},
{type: 'dataflow', format: 'flowchart LR', name: 'Data Flow'}
]
};
const requiredDiagrams = diagramRequirements[config.type];
bash(`mkdir -p ${outputDir}/diagrams`);
Step 3.5.2: Generate Architecture Diagrams (graph TD)
function generateArchitectureDiagram(analysis) {
let mermaid = 'graph TD\n';
// Subgraphs for layers/modules
const layers = analysis.structure?.layers || extractLayers(analysis);
for (const layer of layers) {
mermaid += ` subgraph ${sanitizeId(layer.name)}["${escapeLabel(layer.name)}"]\n`;
for (const component of layer.components || []) {
mermaid += ` ${sanitizeId(component.id)}["${escapeLabel(component.name)}"]\n`;
}
mermaid += ' end\n';
}
// Connections
const connections = analysis.relationships || [];
for (const conn of connections) {
const label = conn.label ? `|"${escapeLabel(conn.label)}"|` : '';
mermaid += ` ${sanitizeId(conn.from)} -->${label} ${sanitizeId(conn.to)}\n`;
}
// Styling
mermaid += '\n %% Styling\n';
mermaid += ' classDef core fill:#e1f5fe,stroke:#01579b\n';
mermaid += ' classDef external fill:#fff3e0,stroke:#e65100\n';
return mermaid;
}
if (requiredDiagrams.some(d => d.type === 'architecture')) {
const archDiagram = generateArchitectureDiagram(deepAnalysis);
Write(`${outputDir}/diagrams/architecture.mmd`, archDiagram);
}
Step 3.5.3: Generate Layer/Dependency Diagrams
function generateLayerDiagram(analysis) {
let mermaid = 'graph TD\n';
const layers = ['Presentation', 'Application', 'Domain', 'Infrastructure'];
const detectedLayers = analysis.layers || inferLayers(analysis);
for (let i = 0; i < detectedLayers.length; i++) {
const layer = detectedLayers[i];
mermaid += ` subgraph L${i}["${escapeLabel(layer.name)}"]\n`;
mermaid += ` direction LR\n`;
for (const mod of layer.modules || []) {
mermaid += ` ${sanitizeId(mod)}["${escapeLabel(mod)}"]\n`;
}
mermaid += ' end\n';
if (i < detectedLayers.length - 1) {
mermaid += ` L${i} --> L${i + 1}\n`;
}
}
return mermaid;
}
function generateDependencyDiagram(analysis) {
let mermaid = 'graph LR\n';
const modules = analysis.modules || [];
const deps = analysis.dependencies || [];
// Nodes
for (const mod of modules) {
const shape = mod.type === 'core' ? '([' : '[';
const shapeEnd = mod.type === 'core' ? '])' : ']';
mermaid += ` ${sanitizeId(mod.name)}${shape}"${escapeLabel(mod.name)}"${shapeEnd}\n`;
}
// Edges with labels
for (const dep of deps) {
const style = dep.type === 'weak' ? '-.->' : '-->';
const label = dep.count ? `|"${dep.count} refs"|` : '';
mermaid += ` ${sanitizeId(dep.from)} ${style}${label} ${sanitizeId(dep.to)}\n`;
}
return mermaid;
}
if (requiredDiagrams.some(d => d.type === 'layers')) {
Write(`${outputDir}/diagrams/layers.mmd`, generateLayerDiagram(deepAnalysis));
}
if (requiredDiagrams.some(d => d.type === 'dependencies')) {
Write(`${outputDir}/diagrams/dependencies.mmd`, generateDependencyDiagram(deepAnalysis));
}
Step 3.5.4: Generate Class Diagrams (classDiagram)
function generateClassDiagram(analysis) {
let mermaid = 'classDiagram\n';
const entities = analysis.entities || analysis.classes || [];
// Classes with properties and methods
for (const entity of entities.slice(0, 15)) { // Limit for readability
mermaid += ` class ${sanitizeId(entity.name)} {\n`;
// Properties
for (const prop of (entity.properties || []).slice(0, 8)) {
const vis = {public: '+', private: '-', protected: '#'}[prop.visibility] || '+';
mermaid += ` ${vis}${sanitizeType(prop.type)} ${prop.name}\n`;
}
// Methods
for (const method of (entity.methods || []).slice(0, 6)) {
const vis = {public: '+', private: '-', protected: '#'}[method.visibility] || '+';
const params = (method.params || []).map(p => `${p.name}`).join(', ');
mermaid += ` ${vis}${method.name}(${params}) ${sanitizeType(method.returnType || 'void')}\n`;
}
mermaid += ' }\n';
}
// Relationships
const relationships = analysis.relationships || [];
const arrows = {
inheritance: '--|>',
implementation: '..|>',
composition: '*--',
aggregation: 'o--',
association: '-->',
dependency: '..>'
};
for (const rel of relationships) {
const arrow = arrows[rel.type] || '-->';
const label = rel.label ? ` : ${escapeLabel(rel.label)}` : '';
mermaid += ` ${sanitizeId(rel.from)} ${arrow} ${sanitizeId(rel.to)}${label}\n`;
}
return mermaid;
}
if (requiredDiagrams.some(d => d.type === 'class')) {
Write(`${outputDir}/diagrams/class-diagram.mmd`, generateClassDiagram(deepAnalysis));
}
Step 3.5.5: Generate Flowcharts (flowchart TD)
function generateAlgorithmFlowchart(algorithm) {
let mermaid = 'flowchart TD\n';
// Start
mermaid += ` START(["Start: ${escapeLabel(algorithm.name)}"])\n`;
// Input processing
if (algorithm.inputs?.length > 0) {
mermaid += ` INPUT[/"Input: ${algorithm.inputs.map(i => i.name).join(', ')}"/]\n`;
mermaid += ' START --> INPUT\n';
}
// Process steps
let prevNode = algorithm.inputs?.length > 0 ? 'INPUT' : 'START';
for (let i = 0; i < (algorithm.steps || []).length; i++) {
const step = algorithm.steps[i];
const nodeId = `STEP${i}`;
if (step.type === 'decision') {
mermaid += ` ${nodeId}{"${escapeLabel(step.description)}"}\n`;
mermaid += ` ${prevNode} --> ${nodeId}\n`;
if (step.yes_branch) {
mermaid += ` ${nodeId} -->|"Yes"| ${sanitizeId(step.yes_branch)}\n`;
}
if (step.no_branch) {
mermaid += ` ${nodeId} -->|"No"| ${sanitizeId(step.no_branch)}\n`;
}
} else {
mermaid += ` ${nodeId}["${escapeLabel(step.description)}"]\n`;
mermaid += ` ${prevNode} --> ${nodeId}\n`;
}
prevNode = nodeId;
}
// Output and end
mermaid += ` OUTPUT[/"Output: ${escapeLabel(algorithm.output || 'Result')}"/]\n`;
mermaid += ` ${prevNode} --> OUTPUT\n`;
mermaid += ' END_([End])\n';
mermaid += ' OUTPUT --> END_\n';
return mermaid;
}
function generateDataFlowDiagram(analysis) {
let mermaid = 'flowchart LR\n';
const flows = analysis.dataFlows || [];
// Data stores
mermaid += ' subgraph DataStores["Data Stores"]\n';
for (const store of analysis.dataStores || []) {
mermaid += ` ${sanitizeId(store.id)}[("${escapeLabel(store.name)}")]\n`;
}
mermaid += ' end\n';
// Processes
mermaid += ' subgraph Processes["Processes"]\n';
for (const proc of analysis.processes || []) {
mermaid += ` ${sanitizeId(proc.id)}["${escapeLabel(proc.name)}"]\n`;
}
mermaid += ' end\n';
// Flows
for (const flow of flows) {
mermaid += ` ${sanitizeId(flow.from)} -->|"${escapeLabel(flow.data)}"| ${sanitizeId(flow.to)}\n`;
}
return mermaid;
}
// Generate algorithm flowcharts
const algorithms = deepAnalysis.algorithms || [];
for (const algo of algorithms.slice(0, 3)) { // Top 3 algorithms
const flowchart = generateAlgorithmFlowchart(algo);
Write(`${outputDir}/diagrams/algorithm-${sanitizeId(algo.name)}.mmd`, flowchart);
}
if (requiredDiagrams.some(d => d.type === 'dataflow')) {
Write(`${outputDir}/diagrams/dataflow.mmd`, generateDataFlowDiagram(deepAnalysis));
}
Step 3.5.6: Generate Sequence Diagrams (sequenceDiagram)
function generateSequenceDiagram(scenario) {
let mermaid = 'sequenceDiagram\n';
// Title
mermaid += ` title ${escapeLabel(scenario.name)}\n`;
// Participants
for (const actor of scenario.actors || []) {
const type = actor.type === 'external' ? 'actor' : 'participant';
mermaid += ` ${type} ${sanitizeId(actor.id)} as ${escapeLabel(actor.name)}\n`;
}
mermaid += '\n';
// Messages
for (const msg of scenario.messages || []) {
let arrow;
switch (msg.type) {
case 'async': arrow = '->>'; break;
case 'response': arrow = '-->>'; break;
case 'create': arrow = '->>+'; break;
case 'destroy': arrow = '->>-'; break;
default: arrow = '->>';
}
mermaid += ` ${sanitizeId(msg.from)}${arrow}${sanitizeId(msg.to)}: ${escapeLabel(msg.description)}\n`;
// Activations
if (msg.activate) {
mermaid += ` activate ${sanitizeId(msg.to)}\n`;
}
if (msg.deactivate) {
mermaid += ` deactivate ${sanitizeId(msg.from)}\n`;
}
// Notes
if (msg.note) {
mermaid += ` Note over ${sanitizeId(msg.to)}: ${escapeLabel(msg.note)}\n`;
}
}
// Loops and conditions
for (const block of scenario.blocks || []) {
if (block.type === 'loop') {
mermaid += ` loop ${escapeLabel(block.condition)}\n`;
for (const m of block.messages) {
mermaid += ` ${sanitizeId(m.from)}->>${sanitizeId(m.to)}: ${escapeLabel(m.description)}\n`;
}
mermaid += ' end\n';
}
}
return mermaid;
}
// Generate sequence diagrams for key scenarios
const scenarios = deepAnalysis.sequences || deepAnalysis.scenarios || [];
for (const scenario of scenarios.slice(0, 3)) {
const seqDiagram = generateSequenceDiagram(scenario);
Write(`${outputDir}/diagrams/sequence-${sanitizeId(scenario.name)}.mmd`, seqDiagram);
}
Step 3.5.7: Generate State Diagrams (stateDiagram-v2)
function generateStateDiagram(stateAnalysis) {
let mermaid = 'stateDiagram-v2\n';
const states = stateAnalysis.states || [];
const transitions = stateAnalysis.transitions || [];
// States
for (const state of states) {
if (state.type === 'initial') {
mermaid += ` [*] --> ${sanitizeId(state.name)}\n`;
} else if (state.type === 'final') {
mermaid += ` ${sanitizeId(state.name)} --> [*]\n`;
} else if (state.substates) {
mermaid += ` state ${sanitizeId(state.name)} {\n`;
for (const sub of state.substates) {
mermaid += ` ${sanitizeId(sub.name)}\n`;
}
mermaid += ' }\n';
} else {
mermaid += ` ${sanitizeId(state.name)} : ${escapeLabel(state.description || state.name)}\n`;
}
}
// Transitions
for (const trans of transitions) {
const label = trans.event ? ` : ${escapeLabel(trans.event)}` : '';
mermaid += ` ${sanitizeId(trans.from)} --> ${sanitizeId(trans.to)}${label}\n`;
}
return mermaid;
}
if (requiredDiagrams.some(d => d.type === 'state')) {
const stateAnalysis = deepAnalysis.stateManagement || {};
if (stateAnalysis.states?.length > 0) {
Write(`${outputDir}/diagrams/state.mmd`, generateStateDiagram(stateAnalysis));
}
}
Step 3.5.8: Helper Functions & Validation
// Sanitize ID for Mermaid (only alphanumeric and underscore)
function sanitizeId(text) {
return text.replace(/[^a-zA-Z0-9_]/g, '_').replace(/^[0-9]/, '_$&');
}
// Escape special characters in labels
function escapeLabel(text) {
if (!text) return '';
return text
.replace(/"/g, "'")
.replace(/[(){}[\]<>]/g, char => `#${char.charCodeAt(0)};`)
.substring(0, 50); // Limit length
}
// Sanitize type names
function sanitizeType(type) {
if (!type) return 'any';
return type.replace(/[<>]/g, '').replace(/\|/g, ' or ');
}
// Validate all generated diagrams
function validateMermaidDiagrams(diagramDir) {
const files = Glob(`${diagramDir}/*.mmd`);
const results = [];
for (const file of files) {
const content = Read(file);
const issues = [];
// Check for common syntax errors
if (content.includes('undefined')) issues.push('Contains undefined');
if (content.match(/-->.*-->/)) issues.push('Double arrow syntax');
if (!content.match(/^(graph|flowchart|classDiagram|sequenceDiagram|stateDiagram)/m)) {
issues.push('Missing diagram type declaration');
}
// Check for unescaped special chars in labels
const labelMatches = content.match(/\["[^"]*[(){}[\]<>][^"]*"\]/g);
if (labelMatches?.some(m => !m.includes('#'))) {
issues.push('Unescaped special characters in labels');
}
results.push({
file: file.split('/').pop(),
valid: issues.length === 0,
issues
});
}
return results;
}
const validationResults = validateMermaidDiagrams(`${outputDir}/diagrams`);
Write(`${outputDir}/diagrams/validation.json`, JSON.stringify(validationResults, null, 2));
// Log validation summary
const validCount = validationResults.filter(r => r.valid).length;
console.log(`Diagram Validation: ${validCount}/${validationResults.length} passed`);
Step 3.5.9: Generate Diagram Manifest
const diagramManifest = {
report_type: config.type,
generated_at: new Date().toISOString(),
diagrams: requiredDiagrams.map(req => {
const filename = `${req.type}.mmd`;
const exists = file_exists(`${outputDir}/diagrams/${filename}`);
return {
type: req.type,
format: req.format,
name: req.name,
filename: exists ? filename : null,
status: exists ? 'generated' : 'skipped'
};
}),
validation: validationResults
};
Write(`${outputDir}/diagrams/manifest.json`, JSON.stringify(diagramManifest, null, 2));
TodoWrite: Mark Phase 3.5 completed, Phase 4 in_progress
Phase 4: Initial Report Generation
Purpose: Synthesize all analysis into structured report
Step 4.1: Load All Analysis Data and Diagrams
const config = JSON.parse(Read(`${outputDir}/analysis-config.json`));
const explorations = JSON.parse(Read(`${outputDir}/explorations-manifest.json`));
const deepAnalysis = JSON.parse(Read(`${outputDir}/deep-analysis.json`));
const diagramManifest = JSON.parse(Read(`${outputDir}/diagrams/manifest.json`));
// Load all generated diagrams
const diagrams = {};
for (const diag of diagramManifest.diagrams.filter(d => d.status === 'generated')) {
diagrams[diag.type] = Read(`${outputDir}/diagrams/${diag.filename}`);
}
Step 4.2: Generate Report Structure
const reportTemplate = getReportTemplate(config.type);
// Templates define section structure for each report type
const reportSections = {
architecture: [
"# Architecture Report",
"## Executive Summary",
"## System Overview",
"## Layer Analysis",
"## Module Dependencies",
"## Data Flow",
"## Entry Points & Critical Paths",
"## Dependency Graph (Mermaid)",
"## Recommendations"
],
design: [
"# Design Report",
"## Executive Summary",
"## Design Patterns Used",
"## Class Relationships",
"## Interface Contracts",
"## State Management",
"## Component Diagrams (Mermaid)",
"## Design Recommendations"
],
methods: [
"# Key Methods Report",
"## Executive Summary",
"## Core Algorithms",
"## Critical Code Paths",
"## Public API Reference",
"## Complex Logic Breakdown",
"## Sequence Diagrams (Mermaid)",
"## Optimization Suggestions"
],
comprehensive: [
"# Comprehensive Project Analysis",
"## Executive Summary",
"## Architecture Overview",
"## Design Patterns & Principles",
"## Key Methods & Algorithms",
"## System Diagrams",
"## Recommendations & Next Steps"
]
};
Step 4.3: Generate Initial Report
const reportPath = `${outputDir}/${config.type.toUpperCase()}-REPORT.md`;
const report = generateReport(reportSections[config.type], explorations, deepAnalysis);
Write(reportPath, report);
Step 4.4: Present to User
## Initial Report Generated
**Report Type**: ${config.type}
**Focus Areas**: ${config.focus_areas.join(', ')}
**Depth**: ${config.depth}
**Output**: ${reportPath}
### Report Preview
[First 50 lines of report...]
---
**Ready for your feedback.** The report can be refined based on your input.
TodoWrite: Mark Phase 4 completed, Phase 5 in_progress
Phase 5: Iterative Refinement (Discovery-Driven)
Purpose: Generate targeted questions based on agent analysis findings, then refine report based on user responses
Core Philosophy: Questions are NOT predetermined. They emerge from what the agent discovered during analysis.
Step 5.1: Extract Discoveries from Analysis
// Parse deep analysis results for actionable discoveries
function extractDiscoveries(deepAnalysis) {
return {
// Ambiguities: Areas where analysis found multiple interpretations
ambiguities: deepAnalysis.findings.filter(f => f.confidence < 0.7),
// Complexity hotspots: Areas that may need deeper explanation
complexityHotspots: deepAnalysis.findings.filter(f => f.complexity === 'high'),
// Pattern variations: Where code deviates from expected patterns
patternDeviations: deepAnalysis.patterns.filter(p => p.consistency < 0.8),
// Unclear dependencies: Relationships that couldn't be fully traced
unclearDependencies: deepAnalysis.dependencies.filter(d => d.type === 'implicit'),
// Potential issues: Areas flagged for attention
potentialIssues: deepAnalysis.recommendations.filter(r => r.priority === 'investigate'),
// Depth opportunities: Sections that could benefit from expansion
depthOpportunities: deepAnalysis.sections.filter(s => s.has_more_detail)
};
}
const discoveries = extractDiscoveries(deepAnalysis);
Step 5.2: Generate Dynamic Questions Based on Discoveries
function buildDynamicQuestions(discoveries, config) {
const questions = [];
// Question 1: Address ambiguities found
if (discoveries.ambiguities.length > 0) {
const topAmbiguity = discoveries.ambiguities[0];
questions.push({
question: `Analysis found ambiguity in "${topAmbiguity.area}": ${topAmbiguity.description}. Which interpretation is correct?`,
header: "Clarify",
multiSelect: false,
options: topAmbiguity.interpretations.map((interp, i) => ({
label: interp.summary,
description: interp.detail
}))
});
}
// Question 2: Complexity deep-dive selection
if (discoveries.complexityHotspots.length > 0) {
questions.push({
question: `These areas have high complexity. Which would you like explained in more detail?`,
header: "Deep-Dive",
multiSelect: true,
options: discoveries.complexityHotspots.slice(0, 4).map(h => ({
label: h.name,
description: `${h.file}:${h.line} - ${h.brief}`
}))
});
}
// Question 3: Pattern deviation confirmation
if (discoveries.patternDeviations.length > 0) {
const deviation = discoveries.patternDeviations[0];
questions.push({
question: `Found pattern inconsistency: "${deviation.pattern}" is used differently in ${deviation.locations.length} places. Should I analyze this deviation?`,
header: "Patterns",
multiSelect: false,
options: [
{label: "Yes, analyze differences", description: "Add detailed comparison to report"},
{label: "Skip, it's intentional", description: "Note as intentional variation"},
{label: "Flag as tech debt", description: "Add to recommendations section"}
]
});
}
// Question 4: Dependency clarification
if (discoveries.unclearDependencies.length > 0) {
questions.push({
question: `Found ${discoveries.unclearDependencies.length} implicit dependencies. Should I trace them fully?`,
header: "Dependencies",
multiSelect: false,
options: [
{label: "Yes, trace all (Recommended)", description: "Complete dependency graph, may take longer"},
{label: "Only critical paths", description: "Focus on main execution flows"},
{label: "Skip for now", description: "Keep current analysis level"}
]
});
}
// Always include satisfaction check as final question
questions.push({
question: "How would you like to proceed with the current report?",
header: "Action",
multiSelect: false,
options: [
{label: "Continue refining", description: "Apply above selections and show next discoveries"},
{label: "Finalize report", description: "Report meets my needs, generate final version"},
{label: "Change scope", description: "Adjust focus areas or analysis depth"}
]
});
return questions.slice(0, 4); // Max 4 questions per iteration
}
const dynamicQuestions = buildDynamicQuestions(discoveries, config);
AskUserQuestion({questions: dynamicQuestions});
Step 5.3: Process User Responses and Update Analysis
function processResponses(responses, discoveries, deepAnalysis) {
const updates = [];
// Handle ambiguity resolution
if (responses.clarify) {
const resolution = {
area: discoveries.ambiguities[0].area,
resolved_to: responses.clarify,
confidence: 1.0 // User confirmed
};
updates.push({type: 'resolve_ambiguity', data: resolution});
}
// Handle deep-dive requests
if (responses.deepDive && responses.deepDive.length > 0) {
const deepDiveTargets = responses.deepDive;
updates.push({type: 'expand_sections', data: deepDiveTargets});
}
// Handle pattern deviation response
if (responses.patterns) {
updates.push({type: 'pattern_handling', data: responses.patterns});
}
// Handle dependency tracing
if (responses.dependencies) {
updates.push({type: 'dependency_depth', data: responses.dependencies});
}
return updates;
}
const updates = processResponses(user_responses, discoveries, deepAnalysis);
Step 5.4: Incremental Analysis & Report Update
// Execute targeted re-analysis based on user responses
async function applyUpdates(updates, outputDir, config) {
for (const update of updates) {
switch (update.type) {
case 'expand_sections':
// Re-run Gemini CLI for specific sections only
for (const target of update.data) {
Bash({
command: `ccw cli -p "
PURPOSE: Deep-dive analysis of ${target.name}
TASK: Provide detailed explanation of ${target.file}:${target.line}
• Trace execution flow step by step
• Explain complex logic with examples
• Show relationships to other components
MODE: analysis
CONTEXT: @${target.file} | Previous analysis from ${outputDir}/
EXPECTED: Detailed section content for report insertion
RULES: $(cat ~/.claude/workflows/cli-templates/protocols/analysis-protocol.md)
" --tool gemini --mode analysis`,
run_in_background: true
});
}
break;
case 'resolve_ambiguity':
// Update analysis with confirmed interpretation
deepAnalysis.findings = deepAnalysis.findings.map(f =>
f.area === update.data.area
? {...f, interpretation: update.data.resolved_to, confidence: 1.0}
: f
);
break;
case 'dependency_depth':
if (update.data === 'Yes, trace all (Recommended)') {
// Launch dependency tracing agent
Task({
subagent_type: "cli-explore-agent",
description: "Trace full dependencies",
prompt: `Trace all implicit dependencies found in ${outputDir}/deep-analysis.json`
});
}
break;
}
}
}
await applyUpdates(updates, outputDir, config);
// Regenerate report sections affected by updates
const currentReport = Read(reportPath);
const updatedSections = regenerateAffectedSections(currentReport, updates);
Write(reportPath, updatedSections);
Write(`${outputDir}/iterations/v${iteration_count}.md`, currentReport); // Archive previous version
Step 5.5: Check Termination or Continue Loop
iteration_count++;
if (user_responses.action === 'Finalize report') {
// Exit refinement loop
finalized = true;
} else if (user_responses.action === 'Change scope') {
// Return to Phase 1 for scope adjustment
goto Phase1_Step1_3; // Focus area selection
} else {
// Extract new discoveries from updated analysis
const newDiscoveries = extractDiscoveries(deepAnalysis);
if (newDiscoveries.total_count === 0) {
// No more discoveries to clarify
console.log("All ambiguities resolved. Report is comprehensive.");
AskUserQuestion({
questions: [{
question: "No further clarifications needed. Finalize the report?",
header: "Complete",
multiSelect: false,
options: [
{label: "Yes, finalize", description: "Generate final polished report"},
{label: "Add custom section", description: "I want to add something specific"}
]
}]
});
} else {
// Continue with next round of discovery-driven questions
goto Step5.2;
}
}
// Safety limit
if (iteration_count > 7) {
console.log("Maximum refinement iterations reached. Finalizing report.");
finalized = true;
}
Step 5.6: Discovery Summary Between Iterations
// Show user what was learned in this iteration
function summarizeIteration(iteration_count, updates, discoveries) {
return `
### Iteration ${iteration_count} Summary
**Clarifications Applied**: ${updates.filter(u => u.type === 'resolve_ambiguity').length}
**Sections Expanded**: ${updates.filter(u => u.type === 'expand_sections').length}
**Patterns Addressed**: ${updates.filter(u => u.type === 'pattern_handling').length}
**Remaining Discoveries**:
- Ambiguities: ${discoveries.ambiguities.length}
- Complexity hotspots: ${discoveries.complexityHotspots.length}
- Pattern deviations: ${discoveries.patternDeviations.length}
**Report Sections Updated**: [list affected sections]
`;
}
console.log(summarizeIteration(iteration_count, updates, discoveries));
Finalization
Step 6.1: Polish Final Report
// Add metadata and finalize formatting
const finalReport = `
<!-- Generated by /workflow:docs:analyze -->
<!-- Type: ${config.type} | Focus: ${config.focus_areas.join(', ')} | Depth: ${config.depth} -->
<!-- Generated: ${new Date().toISOString()} | Iterations: ${iteration_count} -->
${report_content}
---
*Report generated through ${iteration_count} refinement iterations.*
`;
Write(reportPath, finalReport);
Step 6.2: Summary Output
## Analysis Complete
**Final Report**: ${reportPath}
**Report Type**: ${config.type}
**Focus Areas**: ${config.focus_areas.join(', ')}
**Refinement Iterations**: ${iteration_count}
### Report Contents
- ${section_count} sections
- ${diagram_count} Mermaid diagrams
- ${code_reference_count} code references
### Recommended Next Steps
1. Share report with team members
2. Use findings to guide development decisions
3. Run `/workflow:plan` to create implementation tasks based on recommendations
TodoWrite: Mark Phase 5 completed
TodoWrite Pattern
Dynamic Task Tracking with phase-level visibility:
// Initial state
[
{content: "Phase 1: Requirements Discovery", status: "pending", activeForm: "Discovering analysis requirements"},
{content: "Phase 2: Project Exploration", status: "pending", activeForm: "Exploring project structure"},
{content: "Phase 3: Deep Analysis", status: "pending", activeForm: "Performing deep analysis"},
{content: "Phase 3.5: Diagram Generation", status: "pending", activeForm: "Generating Mermaid diagrams"},
{content: "Phase 4: Initial Report Generation", status: "pending", activeForm: "Generating initial report"},
{content: "Phase 5: Iterative Refinement", status: "pending", activeForm: "Refining report based on feedback"}
]
// During Phase 3.5, show diagram generation progress
[
{content: "Phase 1: Requirements Discovery", status: "completed", activeForm: "Discovering analysis requirements"},
{content: "Phase 2: Project Exploration", status: "completed", activeForm: "Exploring project structure"},
{content: "Phase 3: Deep Analysis", status: "completed", activeForm: "Performing deep analysis"},
{content: "Phase 3.5: Diagram Generation", status: "in_progress", activeForm: "Generating Mermaid diagrams"},
{content: " → Architecture diagram", status: "completed", activeForm: "Generating architecture diagram"},
{content: " → Class diagram", status: "in_progress", activeForm: "Generating class diagram"},
{content: " → Sequence diagrams", status: "pending", activeForm: "Generating sequence diagrams"},
{content: "Phase 4: Initial Report Generation", status: "pending", activeForm: "Generating initial report"},
{content: "Phase 5: Iterative Refinement", status: "pending", activeForm: "Refining report based on feedback"}
]
// During Phase 5 iterations, expand to show current refinement
[
{content: "Phase 1: Requirements Discovery", status: "completed", activeForm: "Discovering analysis requirements"},
{content: "Phase 2: Project Exploration", status: "completed", activeForm: "Exploring project structure"},
{content: "Phase 3: Deep Analysis", status: "completed", activeForm: "Performing deep analysis"},
{content: "Phase 3.5: Diagram Generation", status: "completed", activeForm: "Generating Mermaid diagrams"},
{content: "Phase 4: Initial Report Generation", status: "completed", activeForm: "Generating initial report"},
{content: "Phase 5: Iterative Refinement", status: "in_progress", activeForm: "Refining report based on feedback"},
{content: " → Iteration 2: Expanding Architecture section", status: "in_progress", activeForm: "Expanding section"}
]
Usage Examples
# Interactive analysis (prompts for all preferences)
/workflow:docs:analyze
# Architecture report for specific directory
/workflow:docs:analyze src/core --type=architecture
# Design patterns analysis
/workflow:docs:analyze --type=design
# Comprehensive analysis of entire project
/workflow:docs:analyze --type=comprehensive
# Key methods analysis for API module
/workflow:docs:analyze src/api --type=methods
Output Structure
.workflow/.scratchpad/analyze-{timestamp}/
├── analysis-config.json # User's analysis preferences
├── exploration-{angle}.json # Per-angle exploration results
├── explorations-manifest.json # Exploration summary
├── deep-analysis.json # Gemini CLI analysis output
├── diagrams/ # Generated Mermaid diagrams
│ ├── manifest.json # Diagram generation manifest
│ ├── validation.json # Syntax validation results
│ ├── architecture.mmd # System architecture (graph TD)
│ ├── layers.mmd # Layer structure (graph TD)
│ ├── dependencies.mmd # Module dependencies (graph LR)
│ ├── class-diagram.mmd # Class relationships (classDiagram)
│ ├── dataflow.mmd # Data flow (flowchart LR)
│ ├── algorithm-*.mmd # Algorithm flowcharts (flowchart TD)
│ ├── sequence-*.mmd # Call sequences (sequenceDiagram)
│ └── state.mmd # State transitions (stateDiagram-v2)
├── {TYPE}-REPORT.md # Final report (main output)
└── iterations/ # Refinement history
├── v1-initial.md
├── v2-expanded.md
└── ...
Report Quality Standards
All reports must include:
- Executive Summary: 3-5 key takeaways
- Visual Diagrams: Mermaid syntax for architecture/flow visualization
- Code References:
file:lineformat for easy navigation - Actionable Insights: Specific recommendations, not generic advice
- Consistent Depth: Match user's selected depth level throughout
Quality Gates:
- All focus areas addressed
- Diagrams render correctly (Mermaid syntax valid)
- Code references are accurate (files exist)
- No placeholder content
- Recommendations are project-specific
Error Handling
| Error | Recovery |
|---|---|
| CLI timeout | Reduce scope, retry with fewer files |
| Exploration failure | Fall back to direct file reading |
| User abandons iteration | Save current progress, allow resume |
| Invalid scope path | Prompt user to correct path |
Related Commands
Prerequisite Commands:
- None required (can be run independently)
Follow-up Commands:
/workflow:plan- Create implementation tasks from recommendations/memory:docs- Generate project documentation/workflow:review- Review specific areas identified in analysis
Alternative Commands:
/memory:code-map-memory- For feature-specific code mapping/memory:load- For quick context loading without reports
Mermaid Diagram Specifications
Diagram Types by Report
| Report Type | Diagrams Generated |
|---|---|
architecture |
architecture.mmd, layers.mmd, dependencies.mmd, dataflow.mmd |
design |
class-diagram.mmd, components.mmd, patterns.mmd, state.mmd |
methods |
algorithm-.mmd, sequence-.mmd, critical-path.mmd, api.mmd |
comprehensive |
architecture.mmd, class-diagram.mmd, sequence-*.mmd, dataflow.mmd |
Syntax Rules (Ensuring Valid Diagrams)
// 1. Node IDs: Only alphanumeric and underscore
sanitizeId("User-Service") → "User_Service"
sanitizeId("3rdParty") → "_3rdParty"
// 2. Labels: Escape special characters with HTML entities
escapeLabel("Process(data)") → "Process#40;data#41;"
escapeLabel("Check {valid?}") → "Check #123;valid?#125;"
// 3. Edge labels: Always use double quotes
// ✓ Correct
A -->|"calls(param)"| B
// ✗ Wrong
A -->|calls(param)| B
// 4. Subgraph titles: Use quoted labels
// ✓ Correct
subgraph ServiceLayer["Service Layer (Core)"]
// ✗ Wrong
subgraph ServiceLayer[Service Layer (Core)]
Diagram Format Examples
Architecture (graph TD):
graph TD
subgraph Presentation["Presentation Layer"]
API["API Gateway"]
CLI["CLI Interface"]
end
subgraph Business["Business Layer"]
SVC["Core Services"]
end
API --> SVC
CLI --> SVC
Class Diagram (classDiagram):
classDiagram
class UserService {
+string name
+getUser(id) User
-validate() boolean
}
class Repository {
<<interface>>
+find(id) Entity
}
UserService --> Repository : uses
Sequence Diagram (sequenceDiagram):
sequenceDiagram
participant C as Client
participant S as Server
participant D as Database
C->>S: request(data)
activate S
S->>D: query
D-->>S: result
S-->>C: response
deactivate S
Flowchart (flowchart TD):
flowchart TD
START(["Start"])
INPUT[/"Read input"/]
CHECK{"Valid?"}
PROCESS["Process data"]
OUTPUT[/"Write output"/]
END_(["End"])
START --> INPUT --> CHECK
CHECK -->|"Yes"| PROCESS --> OUTPUT --> END_
CHECK -->|"No"| END_
Validation Checks
The diagram generator validates:
- Diagram type declaration present
- No
undefinedvalues in output - Special characters properly escaped
- No double arrow syntax errors
- Subgraph brackets balanced
- Node IDs are valid identifiers