mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-28 09:23:08 +08:00
- Updated test cycle execution steps to streamline agent execution. - Improved HookDialog component with enhanced validation messages and localization. - Introduced SpecDialog component for better spec management. - Added new hooks for fetching and updating specs list and frontmatter. - Implemented API functions for specs list retrieval and index rebuilding. - Added localization support for new specs settings and hooks. - Enhanced SpecsSettingsPage to manage project and personal specs effectively. - Updated CLI commands to support keyword-based spec loading. - Improved spec index builder to categorize specs by workflow stages.
339 lines
13 KiB
Markdown
339 lines
13 KiB
Markdown
# Phase 2: Context Gathering
|
|
|
|
Gather project context and analyze codebase via context-search-agent with parallel exploration.
|
|
|
|
## Objective
|
|
|
|
- Gather project context using context-search-agent
|
|
- Identify critical files, architecture patterns, and constraints
|
|
- Detect conflict risk level for Phase 3 decision
|
|
- Update planning-notes.md with findings
|
|
|
|
## Core Philosophy
|
|
|
|
- **Agent Delegation**: Delegate all discovery to `context-search-agent` for autonomous execution
|
|
- **Detection-First**: Check for existing context-package before executing
|
|
- **Plan Mode**: Full comprehensive analysis (vs lightweight brainstorm mode)
|
|
- **Standardized Output**: Generate `.workflow/active/{session}/.process/context-package.json`
|
|
|
|
## Execution
|
|
|
|
### Step 2.1: Context-Package Detection
|
|
|
|
**Execute First** - Check if valid package already exists:
|
|
|
|
```javascript
|
|
const contextPackagePath = `.workflow/active/${sessionId}/.process/context-package.json`;
|
|
|
|
if (file_exists(contextPackagePath)) {
|
|
const existing = Read(contextPackagePath);
|
|
|
|
// Validate package belongs to current session
|
|
if (existing?.metadata?.session_id === sessionId) {
|
|
console.log("Valid context-package found for session:", sessionId);
|
|
console.log("Stats:", existing.statistics);
|
|
console.log("Conflict Risk:", existing.conflict_detection.risk_level);
|
|
// Skip execution, store variables and proceed to Step 2.5
|
|
contextPath = contextPackagePath;
|
|
conflictRisk = existing.conflict_detection.risk_level;
|
|
return; // Early exit - skip Steps 2.2-2.4
|
|
}
|
|
}
|
|
```
|
|
|
|
### Step 2.2: Complexity Assessment & Parallel Explore
|
|
|
|
**Only execute if Step 2.1 finds no valid package**
|
|
|
|
```javascript
|
|
// 2.2.1 Complexity Assessment
|
|
function analyzeTaskComplexity(taskDescription) {
|
|
const text = taskDescription.toLowerCase();
|
|
if (/architect|refactor|restructure|modular|cross-module/.test(text)) return 'High';
|
|
if (/multiple|several|integrate|migrate|extend/.test(text)) return 'Medium';
|
|
return 'Low';
|
|
}
|
|
|
|
const ANGLE_PRESETS = {
|
|
architecture: ['architecture', 'dependencies', 'modularity', 'integration-points'],
|
|
security: ['security', 'auth-patterns', 'dataflow', 'validation'],
|
|
performance: ['performance', 'bottlenecks', 'caching', 'data-access'],
|
|
bugfix: ['error-handling', 'dataflow', 'state-management', 'edge-cases'],
|
|
feature: ['patterns', 'integration-points', 'testing', 'dependencies'],
|
|
refactor: ['architecture', 'patterns', 'dependencies', 'testing']
|
|
};
|
|
|
|
function selectAngles(taskDescription, complexity) {
|
|
const text = taskDescription.toLowerCase();
|
|
let preset = 'feature';
|
|
if (/refactor|architect|restructure/.test(text)) preset = 'architecture';
|
|
else if (/security|auth|permission/.test(text)) preset = 'security';
|
|
else if (/performance|slow|optimi/.test(text)) preset = 'performance';
|
|
else if (/fix|bug|error|issue/.test(text)) preset = 'bugfix';
|
|
|
|
const count = complexity === 'High' ? 4 : (complexity === 'Medium' ? 3 : 1);
|
|
return ANGLE_PRESETS[preset].slice(0, count);
|
|
}
|
|
|
|
const complexity = analyzeTaskComplexity(task_description);
|
|
const selectedAngles = selectAngles(task_description, complexity);
|
|
const sessionFolder = `.workflow/active/${sessionId}/.process`;
|
|
|
|
// 2.2.2 Launch Parallel Explore Agents
|
|
const explorationTasks = selectedAngles.map((angle, index) =>
|
|
Task(
|
|
subagent_type="cli-explore-agent",
|
|
run_in_background=false,
|
|
description=`Explore: ${angle}`,
|
|
prompt=`
|
|
## Task Objective
|
|
Execute **${angle}** exploration for task planning context. Analyze codebase from this specific angle to discover relevant structure, patterns, and constraints.
|
|
|
|
## Assigned Context
|
|
- **Exploration Angle**: ${angle}
|
|
- **Task Description**: ${task_description}
|
|
- **Session ID**: ${sessionId}
|
|
- **Exploration Index**: ${index + 1} of ${selectedAngles.length}
|
|
- **Output File**: ${sessionFolder}/exploration-${angle}.json
|
|
|
|
## Agent Initialization
|
|
The cli-explore-agent autonomously executes project structure discovery, schema loading, project context loading, and keyword search as part of its Phase 1 initialization. No manual steps needed.
|
|
|
|
## Exploration Strategy (${angle} focus)
|
|
|
|
**Step 1: Structural Scan** (Bash)
|
|
- Identify modules related to ${angle}
|
|
- Locate files relevant to ${angle} aspect
|
|
- Analyze imports/dependencies from ${angle} perspective
|
|
|
|
**Step 2: Semantic Analysis** (Gemini CLI)
|
|
- How does existing code handle ${angle} concerns?
|
|
- What patterns are used for ${angle}?
|
|
- Where would new code integrate from ${angle} viewpoint?
|
|
|
|
**Step 3: Write Output**
|
|
- Consolidate ${angle} findings into JSON
|
|
- Identify ${angle}-specific clarification needs
|
|
|
|
## Expected Output
|
|
|
|
**File**: ${sessionFolder}/exploration-${angle}.json
|
|
|
|
**Required Fields** (all ${angle} focused):
|
|
- Follow explore-json-schema.json exactly (loaded during agent initialization)
|
|
- All fields scoped to ${angle} perspective
|
|
- Ensure rationale is specific to ${angle} topic (not generic)
|
|
- Include file:line locations in integration_points
|
|
|
|
## Success Criteria
|
|
- [ ] At least 3 relevant files identified with ${angle} rationale
|
|
- [ ] Patterns are actionable (code examples, not generic advice)
|
|
- [ ] Integration points include file:line locations
|
|
- [ ] Constraints are project-specific to ${angle}
|
|
- [ ] JSON output follows schema exactly
|
|
- [ ] clarification_needs includes options + recommended
|
|
|
|
## Output
|
|
Write: ${sessionFolder}/exploration-${angle}.json
|
|
Return: 2-3 sentence summary of ${angle} findings
|
|
`
|
|
)
|
|
);
|
|
|
|
// 2.2.3 Generate Manifest after all complete
|
|
const explorationFiles = bash(`find ${sessionFolder} -name "exploration-*.json" -type f`).split('\n').filter(f => f.trim());
|
|
const explorationManifest = {
|
|
session_id: sessionId,
|
|
task_description,
|
|
timestamp: new Date().toISOString(),
|
|
complexity,
|
|
exploration_count: selectedAngles.length,
|
|
angles_explored: selectedAngles,
|
|
explorations: explorationFiles.map(file => {
|
|
const data = JSON.parse(Read(file));
|
|
return { angle: data._metadata.exploration_angle, file: file.split('/').pop(), path: file, index: data._metadata.exploration_index };
|
|
})
|
|
};
|
|
Write(`${sessionFolder}/explorations-manifest.json`, JSON.stringify(explorationManifest, null, 2));
|
|
```
|
|
|
|
### Step 2.3: Invoke Context-Search Agent
|
|
|
|
**Only execute after Step 2.2 completes**
|
|
|
|
```javascript
|
|
// Load user intent from planning-notes.md (from Phase 1)
|
|
const planningNotesPath = `.workflow/active/${sessionId}/planning-notes.md`;
|
|
let userIntent = { goal: task_description, key_constraints: "None specified" };
|
|
|
|
if (file_exists(planningNotesPath)) {
|
|
const notesContent = Read(planningNotesPath);
|
|
const goalMatch = notesContent.match(/\*\*GOAL\*\*:\s*(.+)/);
|
|
const constraintsMatch = notesContent.match(/\*\*KEY_CONSTRAINTS\*\*:\s*(.+)/);
|
|
if (goalMatch) userIntent.goal = goalMatch[1].trim();
|
|
if (constraintsMatch) userIntent.key_constraints = constraintsMatch[1].trim();
|
|
}
|
|
|
|
Task(
|
|
subagent_type="context-search-agent",
|
|
run_in_background=false,
|
|
description="Gather comprehensive context for plan",
|
|
prompt=`
|
|
## Execution Mode
|
|
**PLAN MODE** (Comprehensive) - Full Phase 1-3 execution with priority sorting
|
|
|
|
## Session Information
|
|
- **Session ID**: ${sessionId}
|
|
- **Task Description**: ${task_description}
|
|
- **Output Path**: .workflow/${sessionId}/.process/context-package.json
|
|
|
|
## User Intent (from Phase 1 - Planning Notes)
|
|
**GOAL**: ${userIntent.goal}
|
|
**KEY_CONSTRAINTS**: ${userIntent.key_constraints}
|
|
|
|
This is the PRIMARY context source - all subsequent analysis must align with user intent.
|
|
|
|
## Exploration Input (from Step 2.2)
|
|
- **Manifest**: ${sessionFolder}/explorations-manifest.json
|
|
- **Exploration Count**: ${explorationManifest.exploration_count}
|
|
- **Angles**: ${explorationManifest.angles_explored.join(', ')}
|
|
- **Complexity**: ${complexity}
|
|
|
|
## Mission
|
|
Execute complete context-search-agent workflow (Phase 1-3) for implementation planning.
|
|
|
|
Key emphasis:
|
|
- Run: ccw spec load --keywords exploration FIRST (per your spec Phase 1.1b)
|
|
- Synthesize exploration results with project context
|
|
- Generate prioritized_context with user_intent alignment
|
|
- Apply specs/*.md constraints during conflict detection
|
|
|
|
Input priority: User Intent > project-tech.json > Exploration results > Code discovery > Web examples
|
|
|
|
## Output Requirements
|
|
|
|
Complete context-package.json must include a **prioritized_context** section:
|
|
```json
|
|
{
|
|
"prioritized_context": {
|
|
"user_intent": { "goal": "...", "scope": "...", "key_constraints": ["..."] },
|
|
"priority_tiers": {
|
|
"critical": [{ "path": "...", "relevance": 0.95, "rationale": "..." }],
|
|
"high": [], "medium": [], "low": []
|
|
},
|
|
"dependency_order": ["module1", "module2", "module3"],
|
|
"sorting_rationale": "Based on user goal alignment, exploration critical files, and dependency graph"
|
|
}
|
|
}
|
|
```
|
|
|
|
All other required fields (metadata, project_context, project_guidelines, assets, dependencies, brainstorm_artifacts, conflict_detection, exploration_results) follow context-search-agent standard output schema.
|
|
|
|
## Planning Notes Record (REQUIRED)
|
|
After completing context-package.json, append to planning-notes.md:
|
|
|
|
**File**: .workflow/active/${sessionId}/planning-notes.md
|
|
**Location**: Under "## Context Findings (Phase 2)" section
|
|
**Format**:
|
|
### [Context-Search Agent] YYYY-MM-DD
|
|
- **Note**: [Brief summary of key findings]
|
|
|
|
Execute autonomously following agent documentation.
|
|
Report completion with statistics.
|
|
`
|
|
)
|
|
```
|
|
|
|
### Step 2.4: Output Verification
|
|
|
|
After agent completes, verify output:
|
|
|
|
```javascript
|
|
// Verify file was created
|
|
const outputPath = `.workflow/active/${sessionId}/.process/context-package.json`;
|
|
if (!file_exists(outputPath)) {
|
|
throw new Error("Agent failed to generate context-package.json");
|
|
}
|
|
|
|
// Store variables for subsequent phases
|
|
contextPath = outputPath;
|
|
|
|
// Verify exploration_results included
|
|
const pkg = JSON.parse(Read(outputPath));
|
|
if (pkg.exploration_results?.exploration_count > 0) {
|
|
console.log(`Exploration results aggregated: ${pkg.exploration_results.exploration_count} angles`);
|
|
}
|
|
|
|
conflictRisk = pkg.conflict_detection?.risk_level || 'low';
|
|
```
|
|
|
|
### TodoWrite Update (Phase 2 in progress - tasks attached)
|
|
|
|
```json
|
|
[
|
|
{"content": "Phase 1: Session Discovery", "status": "completed", "activeForm": "Executing session discovery"},
|
|
{"content": "Phase 2: Context Gathering", "status": "in_progress", "activeForm": "Executing context gathering"},
|
|
{"content": " -> Analyze codebase structure", "status": "in_progress", "activeForm": "Analyzing codebase structure"},
|
|
{"content": " -> Identify integration points", "status": "pending", "activeForm": "Identifying integration points"},
|
|
{"content": " -> Generate context package", "status": "pending", "activeForm": "Generating context package"},
|
|
{"content": "Phase 4: Task Generation", "status": "pending", "activeForm": "Executing task generation"}
|
|
]
|
|
```
|
|
|
|
### TodoWrite Update (Phase 2 completed - tasks collapsed)
|
|
|
|
```json
|
|
[
|
|
{"content": "Phase 1: Session Discovery", "status": "completed", "activeForm": "Executing session discovery"},
|
|
{"content": "Phase 2: Context Gathering", "status": "completed", "activeForm": "Executing context gathering"},
|
|
{"content": "Phase 4: Task Generation", "status": "pending", "activeForm": "Executing task generation"}
|
|
]
|
|
```
|
|
|
|
### Step 2.5: Update Planning Notes
|
|
|
|
After context gathering completes, update planning-notes.md with findings:
|
|
|
|
```javascript
|
|
// Read context-package to extract key findings
|
|
const contextPackage = JSON.parse(Read(contextPath))
|
|
const conflictRisk = contextPackage.conflict_detection?.risk_level || 'low'
|
|
const criticalFiles = (contextPackage.exploration_results?.aggregated_insights?.critical_files || [])
|
|
.slice(0, 5).map(f => f.path)
|
|
const archPatterns = contextPackage.project_context?.architecture_patterns || []
|
|
const constraints = contextPackage.exploration_results?.aggregated_insights?.constraints || []
|
|
|
|
// Append Phase 2 findings to planning-notes.md
|
|
Edit(planningNotesPath, {
|
|
old: '## Context Findings (Phase 2)\n(To be filled by context-gather)',
|
|
new: `## Context Findings (Phase 2)
|
|
|
|
- **CRITICAL_FILES**: ${criticalFiles.join(', ') || 'None identified'}
|
|
- **ARCHITECTURE**: ${archPatterns.join(', ') || 'Not detected'}
|
|
- **CONFLICT_RISK**: ${conflictRisk}
|
|
- **CONSTRAINTS**: ${constraints.length > 0 ? constraints.join('; ') : 'None'}`
|
|
})
|
|
|
|
// Append Phase 2 constraints to consolidated list
|
|
Edit(planningNotesPath, {
|
|
old: '## Consolidated Constraints (Phase 4 Input)',
|
|
new: `## Consolidated Constraints (Phase 4 Input)
|
|
${constraints.map((c, i) => `${i + 2}. [Context] ${c}`).join('\n')}`
|
|
})
|
|
```
|
|
|
|
**Auto-Continue**: Return to user showing Phase 2 results, then auto-continue to Phase 3/4 (depending on `conflictRisk`).
|
|
|
|
## Output
|
|
|
|
- **Variable**: `contextPath` (path to context-package.json)
|
|
- **Variable**: `conflictRisk` (none/low/medium/high)
|
|
- **File**: `context-package.json`
|
|
- **TodoWrite**: Mark Phase 2 completed, determine Phase 3 or Phase 4
|
|
|
|
## Next Phase
|
|
|
|
Return to orchestrator. Orchestrator checks `conflictRisk`:
|
|
- If `conflictRisk >= medium` -> [Phase 3: Conflict Resolution](03-conflict-resolution.md)
|
|
- If `conflictRisk < medium` -> [Phase 4: Task Generation](04-task-generation.md)
|