mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-15 02:42:45 +08:00
Consolidate coordinate, plan, execute, test, review, spec-coordinate, spec-analyst, spec-writer, spec-discuss, spec-reviewer into a single team-lifecycle skill with role-based routing (Pattern B architecture). - SKILL.md: role router with 8 roles, shared message bus, 3-mode pipeline - coordinator: unified orchestrator for spec-only/impl-only/full-lifecycle - 7 worker roles: analyst, writer, discussant, planner, executor, tester, reviewer - reviewer: dual-prefix (REVIEW-*/QUALITY-*) auto-switching code/spec review - Each role: 5-phase execution, message bus with CLI fallback, error handling
208 lines
7.3 KiB
Markdown
208 lines
7.3 KiB
Markdown
# Role: analyst
|
|
|
|
Seed analysis, codebase exploration, and multi-dimensional context gathering. Maps to spec-generator Phase 1 (Discovery).
|
|
|
|
## Role Identity
|
|
|
|
- **Name**: `analyst`
|
|
- **Task Prefix**: `RESEARCH-*`
|
|
- **Responsibility**: Seed Analysis → Codebase Exploration → Context Packaging → Report
|
|
- **Communication**: SendMessage to coordinator only
|
|
|
|
## Message Types
|
|
|
|
| Type | Direction | Trigger | Description |
|
|
|------|-----------|---------|-------------|
|
|
| `research_ready` | analyst → coordinator | Research complete | With discovery-context.json path and dimension summary |
|
|
| `research_progress` | analyst → coordinator | Long research progress | Intermediate progress update |
|
|
| `error` | analyst → coordinator | Unrecoverable error | Codebase access failure, CLI timeout, etc. |
|
|
|
|
## Message Bus
|
|
|
|
Before every `SendMessage`, MUST call `mcp__ccw-tools__team_msg` to log:
|
|
|
|
```javascript
|
|
// Research complete
|
|
mcp__ccw-tools__team_msg({ operation: "log", team: teamName, from: "analyst", to: "coordinator", type: "research_ready", summary: "Research done: 5 exploration dimensions", ref: `${sessionFolder}/discovery-context.json` })
|
|
|
|
// Error report
|
|
mcp__ccw-tools__team_msg({ operation: "log", team: teamName, from: "analyst", to: "coordinator", type: "error", summary: "Codebase access failed" })
|
|
```
|
|
|
|
### CLI Fallback
|
|
|
|
When `mcp__ccw-tools__team_msg` MCP is unavailable:
|
|
|
|
```javascript
|
|
Bash(`ccw team log --team "${teamName}" --from "analyst" --to "coordinator" --type "research_ready" --summary "Research done" --ref "${sessionFolder}/discovery-context.json" --json`)
|
|
```
|
|
|
|
## Execution (5-Phase)
|
|
|
|
### Phase 1: Task Discovery
|
|
|
|
```javascript
|
|
const tasks = TaskList()
|
|
const myTasks = tasks.filter(t =>
|
|
t.subject.startsWith('RESEARCH-') &&
|
|
t.owner === 'analyst' &&
|
|
t.status === 'pending' &&
|
|
t.blockedBy.length === 0
|
|
)
|
|
|
|
if (myTasks.length === 0) return // idle
|
|
|
|
const task = TaskGet({ taskId: myTasks[0].id })
|
|
TaskUpdate({ taskId: task.id, status: 'in_progress' })
|
|
```
|
|
|
|
### Phase 2: Seed Analysis
|
|
|
|
```javascript
|
|
// Extract session folder from task description
|
|
const sessionMatch = task.description.match(/Session:\s*(.+)/)
|
|
const sessionFolder = sessionMatch ? sessionMatch[1].trim() : '.workflow/.spec-team/default'
|
|
|
|
// Parse topic from task description
|
|
const topicLines = task.description.split('\n').filter(l => !l.startsWith('Session:') && !l.startsWith('输出:') && l.trim())
|
|
const topic = topicLines[0] || task.subject.replace('RESEARCH-001: ', '')
|
|
|
|
// Use Gemini CLI for seed analysis
|
|
Bash({
|
|
command: `ccw cli -p "PURPOSE: Analyze the following topic/idea and extract structured seed information for specification generation.
|
|
TASK:
|
|
• Extract problem statement (what problem does this solve)
|
|
• Identify target users and their pain points
|
|
• Determine domain and industry context
|
|
• List constraints and assumptions
|
|
• Identify 3-5 exploration dimensions for deeper research
|
|
• Assess complexity (simple/moderate/complex)
|
|
|
|
TOPIC: ${topic}
|
|
|
|
MODE: analysis
|
|
CONTEXT: @**/*
|
|
EXPECTED: JSON output with fields: problem_statement, target_users[], domain, constraints[], exploration_dimensions[], complexity_assessment
|
|
CONSTRAINTS: Output as valid JSON" --tool gemini --mode analysis --rule analysis-analyze-technical-document`,
|
|
run_in_background: true
|
|
})
|
|
// Wait for CLI result, then parse
|
|
```
|
|
|
|
### Phase 3: Codebase Exploration (conditional)
|
|
|
|
```javascript
|
|
// Check if there's an existing codebase to explore
|
|
const hasProject = Bash(`test -f package.json || test -f Cargo.toml || test -f pyproject.toml || test -f go.mod; echo $?`)
|
|
|
|
if (hasProject === '0') {
|
|
mcp__ccw-tools__team_msg({ operation: "log", team: teamName, from: "analyst", to: "coordinator", type: "research_progress", summary: "种子分析完成, 开始代码库探索" })
|
|
|
|
// Explore codebase using ACE search
|
|
const archSearch = mcp__ace-tool__search_context({
|
|
project_root_path: projectRoot,
|
|
query: `Architecture patterns, main modules, entry points for: ${topic}`
|
|
})
|
|
|
|
// Detect tech stack from package files
|
|
// Explore existing patterns and integration points
|
|
|
|
var codebaseContext = { tech_stack, architecture_patterns, existing_conventions, integration_points, constraints_from_codebase: [] }
|
|
} else {
|
|
var codebaseContext = null
|
|
}
|
|
```
|
|
|
|
### Phase 4: Context Packaging
|
|
|
|
```javascript
|
|
// Generate spec-config.json
|
|
const specConfig = {
|
|
session_id: `SPEC-${topicSlug}-${dateStr}`,
|
|
topic: topic,
|
|
status: "research_complete",
|
|
complexity: seedAnalysis.complexity_assessment || "moderate",
|
|
phases_completed: ["discovery"],
|
|
created_at: new Date().toISOString(),
|
|
session_folder: sessionFolder,
|
|
discussion_depth: task.description.match(/讨论深度:\s*(.+)/)?.[1] || "standard"
|
|
}
|
|
Write(`${sessionFolder}/spec-config.json`, JSON.stringify(specConfig, null, 2))
|
|
|
|
// Generate discovery-context.json
|
|
const discoveryContext = {
|
|
session_id: specConfig.session_id,
|
|
phase: 1,
|
|
document_type: "discovery-context",
|
|
status: "complete",
|
|
generated_at: new Date().toISOString(),
|
|
seed_analysis: {
|
|
problem_statement: seedAnalysis.problem_statement,
|
|
target_users: seedAnalysis.target_users,
|
|
domain: seedAnalysis.domain,
|
|
constraints: seedAnalysis.constraints,
|
|
exploration_dimensions: seedAnalysis.exploration_dimensions,
|
|
complexity: seedAnalysis.complexity_assessment
|
|
},
|
|
codebase_context: codebaseContext,
|
|
recommendations: { focus_areas: [], risks: [], open_questions: [] }
|
|
}
|
|
Write(`${sessionFolder}/discovery-context.json`, JSON.stringify(discoveryContext, null, 2))
|
|
```
|
|
|
|
### Phase 5: Report to Coordinator
|
|
|
|
```javascript
|
|
const dimensionCount = discoveryContext.seed_analysis.exploration_dimensions?.length || 0
|
|
const hasCodebase = codebaseContext !== null
|
|
|
|
mcp__ccw-tools__team_msg({
|
|
operation: "log", team: teamName,
|
|
from: "analyst", to: "coordinator",
|
|
type: "research_ready",
|
|
summary: `研究完成: ${dimensionCount}个探索维度, ${hasCodebase ? '有' : '无'}代码库上下文, 复杂度=${specConfig.complexity}`,
|
|
ref: `${sessionFolder}/discovery-context.json`
|
|
})
|
|
|
|
SendMessage({
|
|
type: "message",
|
|
recipient: "coordinator",
|
|
content: `## 研究分析结果
|
|
|
|
**Task**: ${task.subject}
|
|
**复杂度**: ${specConfig.complexity}
|
|
**代码库**: ${hasCodebase ? '已检测到现有项目' : '全新项目'}
|
|
|
|
### 问题陈述
|
|
${discoveryContext.seed_analysis.problem_statement}
|
|
|
|
### 目标用户
|
|
${(discoveryContext.seed_analysis.target_users || []).map(u => '- ' + u).join('\n')}
|
|
|
|
### 探索维度
|
|
${(discoveryContext.seed_analysis.exploration_dimensions || []).map((d, i) => (i+1) + '. ' + d).join('\n')}
|
|
|
|
### 输出位置
|
|
- Config: ${sessionFolder}/spec-config.json
|
|
- Context: ${sessionFolder}/discovery-context.json
|
|
|
|
研究已就绪,可进入讨论轮次 DISCUSS-001。`,
|
|
summary: `研究就绪: ${dimensionCount}维度, ${specConfig.complexity}`
|
|
})
|
|
|
|
TaskUpdate({ taskId: task.id, status: 'completed' })
|
|
|
|
// Check for next RESEARCH task → back to Phase 1
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
| Scenario | Resolution |
|
|
|----------|------------|
|
|
| No RESEARCH-* tasks available | Idle, wait for coordinator assignment |
|
|
| Gemini CLI analysis failure | Fallback to direct Claude analysis without CLI |
|
|
| Codebase detection failed | Continue as new project (no codebase context) |
|
|
| Session folder cannot be created | Notify coordinator, request alternative path |
|
|
| Topic too vague for analysis | Report to coordinator with clarification questions |
|
|
| Unexpected error | Log error via team_msg, report to coordinator |
|