mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-14 02:42:04 +08:00
- Implement Phase 2: Orchestrator Design with detailed steps for generating SKILL.md - Introduce Phase 3: Phase Files Design to create phase files with content fidelity - Establish Phase 4: Validation & Integration to ensure structural completeness and reference integrity - Include comprehensive validation checks for content quality and data flow consistency - Enhance documentation with clear objectives and critical rules for each phase
357 lines
12 KiB
Markdown
357 lines
12 KiB
Markdown
# Phase 1: Requirements Analysis
|
|
|
|
Analyze workflow requirements from various sources (commands, descriptions, requirements docs) to build a structured workflow configuration.
|
|
|
|
## Objective
|
|
|
|
- Identify all phases/steps in the workflow
|
|
- Map data flow between phases
|
|
- Identify agents, tools, and conditional logic
|
|
- Detect source type and extract content accordingly
|
|
- Produce `workflowConfig` object for subsequent phases
|
|
|
|
## Step 1.1: Identify Input Source
|
|
|
|
```javascript
|
|
// Determine what the user provided
|
|
const inputType = detectInputType(userInput);
|
|
// Returns: 'command_set' | 'text_description' | 'requirements_doc' | 'existing_skill'
|
|
```
|
|
|
|
### Source Type Detection
|
|
|
|
| Indicator | Type | Action |
|
|
|-----------|------|--------|
|
|
| Path to `.claude/commands/**/*.md` | `command_set` | Read orchestrator + discover sub-commands |
|
|
| Free text describing workflow | `text_description` | Interactive requirements gathering |
|
|
| Path to `.md` or `.json` requirements | `requirements_doc` | Parse structured requirements |
|
|
| Path to `.claude/skills/**/*.md` | `existing_skill` | Analyze and restructure |
|
|
|
|
## Step 1.2: Source-Specific Analysis
|
|
|
|
### Mode A: Command Set Analysis
|
|
|
|
When source is an existing orchestrator command + sub-commands:
|
|
|
|
```javascript
|
|
// Step A.1: Read orchestrator command
|
|
const orchestratorPath = userInput; // e.g., ".claude/commands/workflow/plan.md"
|
|
const orchestratorContent = Read(orchestratorPath);
|
|
|
|
// Step A.2: Extract frontmatter
|
|
const frontmatter = extractYAMLFrontmatter(orchestratorContent);
|
|
// Fields: name, description, argument-hint, examples, allowed-tools, group
|
|
|
|
// Step A.3: Discover sub-commands by scanning Skill() calls
|
|
const skillCalls = orchestratorContent.match(/Skill\(skill="([^"]+)"/g);
|
|
// e.g., ["workflow:session:start", "workflow:tools:context-gather", ...]
|
|
|
|
// Step A.4: Map Skill() calls to file paths
|
|
// Pattern: "workflow:session:start" → ".claude/commands/workflow/session/start.md"
|
|
// "workflow:tools:context-gather" → ".claude/commands/workflow/tools/context-gather.md"
|
|
const subCommandPaths = skillCalls.map(call => {
|
|
const parts = call.replace('Skill(skill="', '').replace('"', '').split(':');
|
|
return `.claude/commands/${parts.join('/')}.md`;
|
|
});
|
|
|
|
// Step A.5: Read all sub-commands
|
|
const subCommands = [];
|
|
for (const path of subCommandPaths) {
|
|
const content = Read(path);
|
|
const fm = extractYAMLFrontmatter(content);
|
|
subCommands.push({
|
|
path: path,
|
|
content: content,
|
|
frontmatter: fm,
|
|
skillCallName: extractSkillCallName(path),
|
|
bodyContent: removeYAMLFrontmatter(content)
|
|
});
|
|
}
|
|
|
|
// Step A.6: Identify phase ordering from orchestrator execution flow
|
|
// Look for patterns like:
|
|
// "Phase 1: ..." → first Skill() call
|
|
// "Phase 2: ..." → second Skill() call
|
|
// Conditional logic (if/else) → conditional phases
|
|
const phaseOrder = extractPhaseOrder(orchestratorContent, skillCalls);
|
|
```
|
|
|
|
**Key Extraction Points from Orchestrator**:
|
|
|
|
| Section | What to Extract | Maps to |
|
|
|---------|-----------------|---------|
|
|
| Coordinator Role / Overview | Workflow description, execution model | SKILL.md description + Architecture |
|
|
| Core Rules | Orchestration constraints | SKILL.md Core Rules |
|
|
| Execution Process | Phase sequence + conditions | SKILL.md Execution Flow |
|
|
| Data Flow | Inter-phase variables | SKILL.md Data Flow |
|
|
| TodoWrite Pattern | Attachment/collapse examples | SKILL.md TodoWrite Pattern |
|
|
| Input Processing | Structured format rules | SKILL.md Input Processing |
|
|
| Error Handling | Recovery strategies | SKILL.md Error Handling |
|
|
| Coordinator Checklist | Pre/post actions | SKILL.md Coordinator Checklist |
|
|
| Related Commands | Prerequisites/follow-ups | SKILL.md Related Commands |
|
|
| Phase N sections | Phase-specific orchestrator instructions | SKILL.md inline (brief), Phase files (detail) |
|
|
|
|
**Key Extraction Points from Sub-Commands**:
|
|
|
|
| Section | What to Extract | Maps to |
|
|
|---------|-----------------|---------|
|
|
| Full body content | Complete execution detail | Phase file (preserved verbatim) |
|
|
| Agent prompts (Task calls) | Agent delegation logic | Phase file agent sections |
|
|
| Bash command blocks | Shell execution steps | Phase file step sections |
|
|
| Validation/Output sections | Phase outputs | Phase file Output section |
|
|
| Frontmatter | Tools, description | Phase file header context |
|
|
|
|
### Mode B: Text Description Analysis
|
|
|
|
When source is a natural language workflow description:
|
|
|
|
```javascript
|
|
// Interactive requirements gathering
|
|
const basicInfo = AskUserQuestion({
|
|
questions: [
|
|
{
|
|
question: "What is this workflow skill's name? (kebab-case)",
|
|
header: "Name",
|
|
multiSelect: false,
|
|
options: [
|
|
{ label: "Custom name", description: "Enter a custom skill name" },
|
|
{ label: "Auto-generate", description: "Generate from workflow description" }
|
|
]
|
|
},
|
|
{
|
|
question: "How many main phases does this workflow have?",
|
|
header: "Phases",
|
|
multiSelect: false,
|
|
options: [
|
|
{ label: "3 phases", description: "Simple linear workflow" },
|
|
{ label: "4 phases", description: "Standard workflow with validation" },
|
|
{ label: "5+ phases", description: "Complex workflow with conditions" }
|
|
]
|
|
}
|
|
]
|
|
});
|
|
|
|
// For each phase, gather details
|
|
const phases = [];
|
|
for (let i = 0; i < phaseCount; i++) {
|
|
const phaseInfo = AskUserQuestion({
|
|
questions: [
|
|
{
|
|
question: `Phase ${i+1}: What does this phase do?`,
|
|
header: `Phase ${i+1}`,
|
|
multiSelect: false,
|
|
options: [
|
|
{ label: "Session/Init", description: "Initialize session or state" },
|
|
{ label: "Context/Gather", description: "Collect information or analyze" },
|
|
{ label: "Process/Transform", description: "Process data or generate artifacts" },
|
|
{ label: "Validate/Review", description: "Quality check or user review" }
|
|
]
|
|
},
|
|
{
|
|
question: `Phase ${i+1}: Does it use agents?`,
|
|
header: "Agents",
|
|
multiSelect: false,
|
|
options: [
|
|
{ label: "No agents", description: "Direct execution only" },
|
|
{ label: "Single agent", description: "Delegates to one agent" },
|
|
{ label: "Multiple agents", description: "Parallel or sequential agents" }
|
|
]
|
|
}
|
|
]
|
|
});
|
|
phases.push(phaseInfo);
|
|
}
|
|
|
|
// Gather conditional logic
|
|
const conditions = AskUserQuestion({
|
|
questions: [{
|
|
question: "Are any phases conditional (skipped based on previous results)?",
|
|
header: "Conditions",
|
|
multiSelect: false,
|
|
options: [
|
|
{ label: "No conditions", description: "All phases always execute" },
|
|
{ label: "Has conditions", description: "Some phases execute conditionally" }
|
|
]
|
|
}]
|
|
});
|
|
```
|
|
|
|
### Mode C: Requirements Document
|
|
|
|
When source is a structured requirements document:
|
|
|
|
```javascript
|
|
// Read and parse requirements
|
|
const reqContent = Read(requirementsPath);
|
|
|
|
// Extract structured fields
|
|
// Expected format: Markdown with ## sections for each phase
|
|
// Or JSON with phases array
|
|
const requirements = parseRequirements(reqContent);
|
|
```
|
|
|
|
### Mode D: Existing Skill Restructure
|
|
|
|
When source is an existing skill to refactor:
|
|
|
|
```javascript
|
|
// Read existing SKILL.md
|
|
const existingSkill = Read(skillPath);
|
|
|
|
// Scan for phase files
|
|
const existingPhases = Glob(`${skillDir}/phases/*.md`);
|
|
|
|
// Analyze current structure for improvement
|
|
const analysis = analyzeExistingStructure(existingSkill, existingPhases);
|
|
```
|
|
|
|
## Step 1.3: Build Workflow Configuration
|
|
|
|
Regardless of source type, produce a unified `workflowConfig`:
|
|
|
|
```javascript
|
|
const workflowConfig = {
|
|
// Metadata
|
|
skillName: "workflow-plan", // kebab-case
|
|
title: "Workflow Plan", // Human-readable
|
|
description: "5-phase planning...", // One-line description
|
|
triggers: ["workflow:plan"], // Trigger phrases
|
|
allowedTools: ["Task", "AskUserQuestion", "TodoWrite", "Read", "Write", "Edit", "Bash", "Glob", "Grep", "Skill"],
|
|
|
|
// Source information
|
|
source: {
|
|
type: "command_set", // input source type
|
|
orchestratorPath: "...", // original orchestrator file
|
|
subCommandPaths: ["..."] // original sub-command files
|
|
},
|
|
|
|
// Phase definitions
|
|
phases: [
|
|
{
|
|
number: 1,
|
|
name: "Session Discovery",
|
|
slug: "session-discovery", // for filename: 01-session-discovery.md
|
|
description: "Create or discover workflow session",
|
|
sourcePath: ".claude/commands/workflow/session/start.md",
|
|
isConditional: false,
|
|
condition: null,
|
|
usesAgents: false,
|
|
agentTypes: [],
|
|
todoWriteSubTasks: [], // no sub-tasks (atomic phase)
|
|
outputVariables: ["sessionId"],
|
|
outputFiles: ["planning-notes.md"]
|
|
},
|
|
{
|
|
number: 2,
|
|
name: "Context Gathering",
|
|
slug: "context-gathering",
|
|
description: "Gather project context via agents",
|
|
sourcePath: ".claude/commands/workflow/tools/context-gather.md",
|
|
isConditional: false,
|
|
condition: null,
|
|
usesAgents: true,
|
|
agentTypes: ["cli-explore-agent", "context-search-agent"],
|
|
todoWriteSubTasks: [
|
|
"Analyze codebase structure",
|
|
"Identify integration points",
|
|
"Generate context package"
|
|
],
|
|
outputVariables: ["contextPath", "conflictRisk"],
|
|
outputFiles: ["context-package.json"]
|
|
},
|
|
{
|
|
number: 3,
|
|
name: "Conflict Resolution",
|
|
slug: "conflict-resolution",
|
|
description: "Detect and resolve conflicts",
|
|
sourcePath: ".claude/commands/workflow/tools/conflict-resolution.md",
|
|
isConditional: true,
|
|
condition: "conflictRisk >= 'medium'",
|
|
usesAgents: true,
|
|
agentTypes: ["cli-execution-agent"],
|
|
todoWriteSubTasks: [
|
|
"Detect conflicts with CLI analysis",
|
|
"Present conflicts to user",
|
|
"Apply resolution strategies"
|
|
],
|
|
outputVariables: [],
|
|
outputFiles: ["conflict-resolution.json"]
|
|
},
|
|
{
|
|
number: 4,
|
|
name: "Task Generation",
|
|
slug: "task-generation",
|
|
description: "Generate implementation plan and task JSONs",
|
|
sourcePath: ".claude/commands/workflow/tools/task-generate-agent.md",
|
|
isConditional: false,
|
|
condition: null,
|
|
usesAgents: true,
|
|
agentTypes: ["action-planning-agent"],
|
|
todoWriteSubTasks: [], // single agent task
|
|
outputVariables: [],
|
|
outputFiles: ["IMPL_PLAN.md", "IMPL-*.json", "TODO_LIST.md"]
|
|
}
|
|
],
|
|
|
|
// Data flow
|
|
dataFlow: [
|
|
{ from: "input", to: "phase1", variables: ["structuredDescription"] },
|
|
{ from: "phase1", to: "phase2", variables: ["sessionId"] },
|
|
{ from: "phase2", to: "phase3", variables: ["contextPath", "conflictRisk"] },
|
|
{ from: "phase2", to: "phase4", variables: ["contextPath"] },
|
|
{ from: "phase3", to: "phase4", variables: ["resolvedArtifacts"] }
|
|
],
|
|
|
|
// Features
|
|
features: {
|
|
hasAutoMode: true, // --yes flag support
|
|
hasConditionalPhases: true, // some phases may be skipped
|
|
hasTodoWriteSubTasks: true, // phases expand into sub-tasks
|
|
hasPlanningNotes: true, // accumulated state document
|
|
hasPostPhaseUpdates: true, // state updates between phases
|
|
hasMemoryCompaction: true, // compact after heavy phases
|
|
hasUserDecisionGate: true // user choice after final phase
|
|
}
|
|
};
|
|
```
|
|
|
|
## Step 1.4: User Confirmation
|
|
|
|
Present the analyzed structure to the user for confirmation:
|
|
|
|
```javascript
|
|
// Display summary
|
|
console.log(`
|
|
Workflow Analysis Complete:
|
|
Name: ${workflowConfig.skillName}
|
|
Phases: ${workflowConfig.phases.length}
|
|
${workflowConfig.phases.map(p =>
|
|
` ${p.number}. ${p.name}${p.isConditional ? ' (conditional)' : ''}${p.usesAgents ? ` [${p.agentTypes.join(', ')}]` : ''}`
|
|
).join('\n')}
|
|
Data Flow: ${workflowConfig.dataFlow.length} connections
|
|
Features: ${Object.entries(workflowConfig.features).filter(([,v]) => v).map(([k]) => k).join(', ')}
|
|
`);
|
|
|
|
const confirm = AskUserQuestion({
|
|
questions: [{
|
|
question: "Proceed with this workflow structure?",
|
|
header: "Confirm",
|
|
multiSelect: false,
|
|
options: [
|
|
{ label: "Yes, proceed", description: "Generate skill with this structure" },
|
|
{ label: "Modify phases", description: "Adjust phase count or ordering" },
|
|
{ label: "Add features", description: "Enable additional patterns (auto mode, conditions, etc.)" }
|
|
]
|
|
}]
|
|
});
|
|
```
|
|
|
|
## Output
|
|
|
|
- **Variable**: `workflowConfig` (structured configuration object)
|
|
- **TodoWrite**: Mark Phase 1 completed, Phase 2 in_progress
|
|
|
|
## Next Phase
|
|
|
|
Return to orchestrator, then auto-continue to [Phase 2: Orchestrator Design](02-orchestrator-design.md).
|