关于 workflow-lite-plan
workflow-lite-plan 是将任务描述转为结构化实施计划的规划技能,面向需要先探索、澄清并确认方案,再交由执行流程实现的工作。它生成探索记录、计划概览和独立任务文件,不直接执行代码。
主要功能
- 01多角度探索代码库
- 02汇总并澄清需求
- 03生成结构化计划与任务文件
- 04确认后移交执行流程
- 05支持自动确认模式
适用场景
- 01为功能开发先制定实施计划
- 02探索跨模块任务的相关代码
- 03澄清需求中的未决事项
- 04将确认后的计划交给执行流程
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ catlog22/ claude-code-workflow --skill workflow-lite-plan安装后在 Claude Code 中输入/workflow-lite-plan确认已加载。
详细介绍
1. 上下文隔离
重要:如果从 analyze-with-file 或 brainstorm-with-file 调用,则之前的会话已完成,其所有阶段指令均已结束,且不得引用。仅遵循本文档中定义的 LP-Phase 1-5。阶段编号与任何先前工作流彼此独立。
2. 输入
<task-description> Task description or path to .md file (required)
| 标记 | 描述 |
|---|---|
-y、--yes | 自动模式:跳过澄清、自动确认计划、自动选择执行方式、跳过审查(整个规划 + 执行工作流) |
--force-explore | 即使任务已有先前分析,也强制进行代码探索 |
注意:工作流偏好(autoYes、forceExplore)必须在技能启动时初始化。如果调用方未提供这些偏好,技能将提示用户选择工作流模式。
3. 输出产物
| 产物 | 描述 |
|---|---|
exploration-{angle}.json | 每个角度的探索结果(根据复杂度生成 1-4 个文件) |
explorations-manifest.json | 所有探索文件的索引 |
planning-context.md | 证据路径 + 综合理解 |
plan.json | 包含 task_ids[] 的计划概览(plan-overview-base-schema.json) |
.task/TASK-*.json | 独立任务文件(每个任务一个) |
输出目录:.workflow/.lite-plan/{task-slug}-{YYYY-MM-DD}/
Agent 用法:所有复杂度 → cli-lite-planning-agent
Schema 参考:~/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.json
4. 阶段摘要
| 阶段 | 核心操作 | 输出 |
|---|---|---|
| LP-0 | 初始化 workflowPreferences | autoYes、forceExplore |
| LP-1 | 复杂度评估 → 并行运行 cli-explore-agents(1-4 个) | exploration-*.json + manifest |
| LP-2 | 汇总并去重 clarification_needs → 多轮 AskUserQuestion | clarificationContext(内存中) |
| LP-3 | cli-lite-planning-agent | plan.json + .task/TASK-*.json |
| LP-4 | 显示计划 → AskUserQuestion(确认 + 执行 + 审查) | userSelection |
| LP-5 | 构建 executionContext → Skill("workflow-lite-execute") | 移交(Mode 1) |
5. LP-Phase 0:初始化工作流偏好
if (typeof workflowPreferences === 'undefined' || workflowPreferences === null) {
workflowPreferences = {
autoYes: false, // false: show LP-Phase 2/4 prompts | true (-y): skip all prompts
forceExplore: false
}
}
6. LP-Phase 1:智能多角度探索
会话设置(必需):
const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
const priorHeader = task_description.match(/^## Prior (?:Analysis|Brainstorm) \((.+?)\)/m)
const taskSlug = (priorHeader ? priorHeader[1] : task_description).toLowerCase().replace(/[^a-z0-9]+/g, '-').substring(0, 40).replace(/^-+|-+$/g, '')
const dateStr = getUtc8ISOString().substring(0, 10)
const sessionId = `${taskSlug}-${dateStr}`
const sessionFolder = `.workflow/.lite-plan/${sessionId}`
bash(`mkdir -p ${sessionFolder} && test -d ${sessionFolder} && echo "SUCCESS: ${sessionFolder}" || echo "FAILED: ${sessionFolder}"`)
TodoWrite 模板(初始状态 — 后续阶段会逐步更新状态):
// Pattern: set phases[0..N-1].status="completed", phases[N].status="in_progress"
// Only full block shown here; subsequent updates follow same structure with status changes
TodoWrite({ todos: [
{ content: `LP-Phase 1: Exploration [${complexity}] ${selectedAngles.length} angles`, status: "in_progress", activeForm: `Exploring: ${selectedAngles.join(', ')}` },
{ content: "LP-Phase 2: Clarification", status: "pending" },
{ content: "LP-Phase 3: Planning [cli-lite-planning-agent]", status: "pending" },
{ content: "LP-Phase 4: Confirmation", status: "pending" },
{ content: "LP-Phase 5: Execution", status: "pending" }
]})
探索决策逻辑:
const hasPriorAnalysis = /##\s*Prior Analysis/i.test(task_description)
const hasHandoffSpec = /```json:handoff-spec/i.test(task_description)
// Parse structured handoff from analyze-with-file or brainstorm-with-file (if present)
let handoffSpec = null
if (hasHandoffSpec) {
const specMatch = task_description.match(/```json:handoff-spec\s*\n([\s\S]*?)\n```/)
if (specMatch) {
handoffSpec = JSON.parse(specMatch[1])
// handoffSpec contains: { source, session_id, session_folder, summary,
// implementation_scope[], code_anchors[], key_files[], key_findings[], decision_context[],
// exploration_artifacts: { exploration_codebase, explorations, perspectives, research, deep_dives[] } }
// implementation_scope[]: { objective, rationale, priority, target_files[], acceptance_criteria[], change_summary }
console.log(`[Handoff] From ${handoffSpec.source} session ${handoffSpec.session_id}`)
console.log(`[Handoff] ${handoffSpec.implementation_scope.length} scoped items with acceptance criteria`)
// Enrich task_description with handoff context for downstream planning agent
// These fields were previously produced but unused — now injected into planning context
if (handoffSpec.summary) {
task_description += `\n\n## Analysis Summary\n${handoffSpec.summary}`
}
if (handoffSpec.key_findings?.length > 0) {
task_description += `\n\n## Key Findings\n${handoffSpec.key_findings.map((f, i) =>
`${i+1}. ${f.point || f} (${f.confidence || 'medium'})`).join('\n')}`
}
if (handoffSpec.decision_context?.length > 0) {
task_description += `\n\n## Decision Context\n${handoffSpec.decision_context.map(d =>
`- **${d.decision || d}**: ${d.reason || ''}`).join('\n')}`
}
if (handoffSpec.code_anchors?.length > 0) {
task_description += `\n\n## Code Anchors\n${handoffSpec.code_anchors.slice(0, 10).map(a =>
`- \`${a.file}:${a.lines}\`: ${a.significance}`).join('\n')}`
}
}
}
// Brainstorm handoff has no code_anchors/key_files — needs exploration for implementation context
const isBrainstormSource = handoffSpec?.source === 'brainstorm-with-file'
const isAnalysisSource = handoffSpec?.source === 'analyze-with-file'
needsExploration = workflowPreferences.forceExplore ? true
: isBrainstormSource ? true // brainstorm explore is lightweight, lite-plan needs deeper exploration
: (hasPriorAnalysis || isAnalysisSource) ? false
: (task.mentions_specific_files ||
task.requires_codebase_context ||
task.needs_architecture_understanding ||
task.modifies_existing_code)
if (!needsExploration) {
// Bridge: Build manifest from analyze session's exploration artifacts
if (isAnalysisSource && handoffSpec?.exploration_artifacts) {
const artifacts = handoffSpec.exploration_artifacts
const explorationEntries = []
let idx = 1
const artifactMapping = [
{ key: 'exploration_codebase', angle: 'codebase-discovery' },
{ key: 'explorations', angle: 'analysis-findings' },
{ key: 'perspectives', angle: 'multi-perspective' },
{ key: 'research', angle: 'external-research' }
]
artifactMapping.forEach(({ key, angle }) => {
if (artifacts[key] && file_exists(artifacts[key])) {
explorationEntries.push({
angle, file: artifacts[key].split('/').pop(),
path: artifacts[key], source_schema: 'analyze', index: idx++
})
}
})
if (artifacts.deep_dives?.length > 0) {
artifacts.deep_dives.forEach(divePath => {
if (file_exists(divePath)) {
const name = divePath.match(/explorations\/(.+)\.json$/)?.[1] || `deep-dive-${idx}`
explorationEntries.push({
angle: name, file: `${name}.json`,
path: divePath, source_schema: 'analyze', index: idx++
})
}
})
}
if (explorationEntries.length > 0) {
Write(`${sessionFolder}/explorations-manifest.json`, JSON.stringify({
session_id: sessionId, task_description, timestamp: getUtc8ISOString(),
complexity, exploration_count: explorationEntries.length,
source: 'analyze-with-file', source_session: handoffSpec.session_id,
explorations: explorationEntries
}, null, 2))
console.log(`[Analyze Bridge] ${explorationEntries.length} artifacts from ${handoffSpec.session_id}`)
}
}
// If no manifest built; LP-Phase 3 loads with safe fallback
proceed_to_next_phase()
}
上下文保护:读取文件 >=50k 个字符时 → 强制设为 needsExploration=true(委派给 cli-explore-agent)
复杂度评估:
const complexity = analyzeTaskComplexity(task_description)
// 'Low': single file, single function, zero cross-module impact (fix typo, rename var, adjust constant)
// 'Medium': multiple files OR integration point OR new pattern (add endpoint, implement feature, refactor)
// 'High': cross-module, architectural, systemic (new subsystem, migration, security overhaul)
// Default bias: uncertain between Low/Medium → choose Medium
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']
}
function selectAngles(taskDescription, count) {
const text = taskDescription.toLowerCase()
let preset = 'feature'
if (/refactor|architect|restructure|modular/.test(text)) preset = 'architecture'
else if (/security|auth|permission|access/.test(text)) preset = 'security'
else if (/performance|slow|optimi|cache/.test(text)) preset = 'performance'
else if (/fix|bug|error|issue|broken/.test(text)) preset = 'bugfix'
return ANGLE_PRESETS[preset].slice(0, count)
}
const selectedAngles = selectAngles(task_description, complexity === 'High' ? 4 : (complexity === 'Medium' ? 3 : 1))
console.log(`Exploration Plan: ${complexity} | ${selectedAngles.join(', ')} | cli-lite-planning-agent`)
启动并行探索:
重要:不得使用 run_in_background: true — 规划前必须获取探索结果。
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.
## Output Location
**Session Folder**: ${sessionFolder}
**Output File**: ${sessionFolder}/exploration-${angle}.json
## Assigned Context
- **Exploration Angle**: ${angle}
- **Task Description**: ${task_description}
- **Exploration Index**: ${index + 1} of ${selectedAngles.length}
## Exploration Strategy (${angle} focus)
**Step 1: Structural Scan** (Bash)
- get_modules_by_depth.sh → identify modules related to ${angle}
- find/rg → 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
**Schema**: explore-json-schema.json (auto-loaded by agent)
- All fields scoped to ${angle} perspective
- Ensure rationale is specific and >10 chars (not generic)
- Include file:line locations in integration_points
- _metadata.exploration_angle: "${angle}"
## Success Criteria
- [ ] get_modules_by_depth.sh executed
- [ ] At least 3 relevant files with specific rationale (>10 chars) + role classification
- [ ] Patterns are actionable (code examples, not generic advice)
- [ ] Integration points include file:line locations
- [ ] Constraints are project-specific to ${angle}
- [ ] JSON follows schema; clarification_needs includes options + recommended
- [ ] Files with relevance >= 0.7 have key_code array + topic_relation
## Execution
**Write**: \`${sessionFolder}/exploration-${angle}.json\`
**Return**: 2-3 sentence summary of ${angle} findings
`
)
)
// Execute all exploration tasks in parallel
自动发现并构建清单:
const explorationFiles = bash(`find ${sessionFolder} -name "exploration-*.json" -type f`)
.split('\n').filter(f => f.trim())
const explorationManifest = {
session_id: sessionId,
task_description: task_description,
timestamp: getUtc8ISOString(),
complexity: complexity,
exploration_count: explorationFiles.length,
explorations: explorationFiles.map(file => {
const data = JSON.parse(Read(file))
return {
angle: data._metadata.exploration_angle,
file: path.basename(file),
path: file,
index: data._metadata.exploration_index
}
})
}
Write(`${sessionFolder}/explorations-manifest.json`, JSON.stringify(explorationManifest, null, 2))
console.log(`Exploration complete: ${explorationManifest.explorations.map(e => e.angle).join(', ')}`)
// TodoWrite:Phase 1 → 已完成,Phase 2 → 进行中
输出:exploration-{angle}.json(1-4 个文件)+ explorations-manifest.json
7. LP-Phase 2:澄清(可选,多轮)
跳过条件:没有探索结果,或所有探索中的 clarification_needs 均为空
重要:AskUserQuestion 每次调用最多只能提 4 个问题。必须执行多轮,直至处理完所有澄清需求。
const manifest = file_exists(`${sessionFolder}/explorations-manifest.json`)
? JSON.parse(Read(`${sessionFolder}/explorations-manifest.json`))
: { exploration_count: 0, explorations: [] }
const explorations = manifest.explorations.map(exp => ({
angle: exp.angle,
data: JSON.parse(Read(exp.path))
}))
// Aggregate from all explorations
const allClarifications = []
explorations.forEach(exp => {
if (exp.data.clarification_needs?.length > 0) {
exp.data.clarification_needs.forEach(need => {
allClarifications.push({ ...need, source_angle: exp.angle })
})
}
})
// Intelligent dedup: merge similar intent across angles, combine options
const dedupedClarifications = intelligentMerge(allClarifications)
if (workflowPreferences.autoYes) {
console.log(`[Auto] Skipping ${dedupedClarifications.length} clarification questions`)
} else if (dedupedClarifications.length > 0) {
const BATCH_SIZE = 4
const totalRounds = Math.ceil(dedupedClarifications.length / BATCH_SIZE)
for (let i = 0; i < dedupedClarifications.length; i += BATCH_SIZE) {
const batch = dedupedClarifications.slice(i, i + BATCH_SIZE)
const currentRound = Math.floor(i / BATCH_SIZE) + 1
console.log(`### Clarification Round ${currentRound}/${totalRounds}`)
AskUserQuestion({
questions: batch.map(need => ({
question: `[${need.source_angle}] ${need.question}\n\nContext: ${need.context}`,
header: need.source_angle.substring(0, 12),
multiSelect: false,
options: need.options.map((opt, index) => ({
label: need.recommended === index ? `${opt} ★` : opt,
description: need.recommended === index ? `Recommended` : `Use ${opt}`
}))
}))
})
// Store batch responses in clarificationContext before next round
}
}
输出:clarificationContext(内存中)
8. LP-Phase 3:规划
重要:LP-Phase 3 仅用于规划 — 不执行代码。所有执行工作都通过 workflow-lite-execute 在 LP-Phase 5 中完成。
执行器分配(生成计划后):
// Priority: 1. User explicit ("用 gemini 分析..." → gemini) | 2. Default → agent
const executorAssignments = {} // { taskId: { executor: 'gemini'|'codex'|'agent', reason } }
const taskFiles = Glob(`${sessionFolder}/.task/TASK-*.json`)
taskFiles.forEach(taskPath => {
const task = JSON.parse(Read(taskPath))
executorAssignments[task.id] = { executor: '...', reason: '...' }
})
调用 cli-lite-planning-agent:
Task(
subagent_type="cli-lite-planning-agent",
run_in_background=false,
description="Generate detailed implementation plan",
prompt=`
Generate implementation plan and write plan.json.
## Output Location
**Session Folder**: ${sessionFolder}
**Output Files**:
- ${sessionFolder}/planning-context.md (evidence + understanding)
- ${sessionFolder}/plan.json (plan overview — NO embedded tasks[])
- ${sessionFolder}/.task/TASK-*.json (independent task files, one per task)
## Project Context (MANDATORY)
Execute: ccw spec load --category planning
**CRITICAL**: All generated tasks MUST comply with constraints in specs/*.md
## Task Description
${task_description}
## Multi-Angle Exploration Context
${manifest.explorations.length > 0
? manifest.explorations.map(exp => `### Exploration: ${exp.angle} (${exp.file})
Path: ${exp.path}
Read this file for detailed ${exp.angle} analysis.`).join('\n\n') + `
Total: ${manifest.exploration_count} | Angles: ${manifest.explorations.map(e => e.angle).join(', ')}
Manifest: ${sessionFolder}/explorations-manifest.json`
: `No exploration files. Task Description contains "## Prior Analysis" — use as primary planning context.`}
## Structured Handoff Spec (from ${handoffSpec?.source || 'upstream workflow'})
${handoffSpec ? `
**Source**: ${handoffSpec.source} session ${handoffSpec.session_id}
**CRITICAL**: Use implementation_scope as PRIMARY input for task generation.
${isBrainstormSource ? '**NOTE**: Brainstorm source — code_anchors/key_files are empty. Use exploration results as primary file context.' : ''}
Each scope item maps to one or more tasks. Acceptance criteria become convergence.criteria.
${JSON.stringify(handoffSpec.implementation_scope, null, 2)}
**Code Anchors** (implementation targets):
${JSON.stringify(handoffSpec.code_anchors?.slice(0, 8), null, 2)}
**Key Findings** (context):
${JSON.stringify(handoffSpec.key_findings?.slice(0, 5), null, 2)}
**Task Generation Rules when handoffSpec present**:
1. Each implementation_scope item → 1 task (group only if tightly coupled)
2. scope.acceptance_criteria[] → task.convergence.criteria[]
3. scope.target_files[] → task.files[] with change from scope.change_summary
4. scope.objective → task.title, scope.rationale → task.description context
5. scope.priority → task ordering (high first)
` : 'No structured handoff spec — use task description and explorations as input.'}
## User Clarifications
${JSON.stringify(clarificationContext) || "None"}
## Complexity Level
${complexity}
## Requirements
- _metadata.exploration_angles: ${JSON.stringify(manifest.explorations.map(e => e.angle))}
- Two-layer output: plan.json (task_ids[], NO tasks[]) + .task/TASK-*.json
- Field names: files[].change (not modification_points), convergence.criteria (not acceptance)
## Task Grouping Rules
1. **Group by feature**: All changes for one feature = one task (even if 3-5 files)
2. **Group by context**: Related functional changes can be grouped together
3. **Minimize agent count**: Group simple unrelated tasks to reduce overhead
4. **Avoid file-per-task**: Do NOT create separate tasks for each file
5. **Substantial tasks**: Each task = 15-60 minutes of work
6. **True dependencies only**: depends_on only when Task B needs Task A's output
7. **Prefer parallel**: Most tasks should be independent
## Execution
1. ccw spec load → 2. Read ALL exploration files → 3. Synthesize + generate
4. Write: planning-context.md, .task/TASK-*.json, plan.json (task_ids[], NO tasks[])
5. Return brief completion summary
`
)
输出:${sessionFolder}/plan.json
// TodoWrite:Phase 3 → 已完成,Phase 4 → 进行中
## 9. LP-Phase 4:任务确认与执行方式选择显示方案:
const plan = JSON.parse(Read(`${sessionFolder}/plan.json`))
const tasks = (plan.task_ids || []).map(id => JSON.parse(Read(`${sessionFolder}/.task/${id}.json`)))
console.log(`
## Implementation Plan
**Summary**: ${plan.summary}
**Approach**: ${plan.approach}
**Tasks** (${tasks.length}):
${tasks.map((t, i) => `${i+1}. ${t.title} (${t.scope || t.files?.[0]?.path || ''})`).join('\n')}
**Complexity**: ${plan.complexity} | **Time**: ${plan.estimated_time} | **Recommended**: ${plan.recommended_execution}
`)
收集确认:
let userSelection
if (workflowPreferences.autoYes) {
console.log(`[Auto] Allow & Execute | Auto | Skip + Skip`)
userSelection = { confirmation: "Allow", execution_method: "Auto", code_review_tool: "Skip", convergence_review_tool: "Skip" }
} else {
// "Other" in Execution allows specifying CLI tools from ~/.claude/cli-tools.json
userSelection = AskUserQuestion({
questions: [
{
question: `Confirm plan and authorize execution? (${tasks.length} tasks, ${plan.complexity})`,
header: "Confirm",
multiSelect: false,
options: [
{ label: "Allow & Execute", description: "Approve plan and begin execution immediately (no further prompts)" },
{ label: "Modify", description: "Adjust before execution" },
{ label: "Cancel", description: "Abort workflow" }
]
},
{
question: "Execution method:",
header: "Execution",
multiSelect: false,
options: [
{ label: "Agent", description: "@code-developer agent" },
{ label: "Codex", description: "codex CLI tool" },
{ label: "Auto", description: `Auto: ${plan.complexity === 'Low' ? 'Agent' : 'Codex'}` }
]
},
{
question: "Code review after execution? (runs in workflow-lite-execute)",
header: "Code Review",
multiSelect: false,
options: [
{ label: "Gemini Review", description: "Gemini CLI: git diff quality review" },
{ label: "Codex Review", description: "Codex CLI: prompt-based code quality review (--mode analysis)" },
{ label: "Agent Review", description: "@code-reviewer agent" },
{ label: "Skip", description: "No code review" }
]
},
{
question: "Convergence review in workflow-lite-test-review phase?",
header: "Convergence Review",
multiSelect: false,
options: [
{ label: "Agent", description: "Agent: verify convergence criteria against implementation" },
{ label: "Gemini", description: "Gemini CLI: convergence verification" },
{ label: "Codex", description: "Codex CLI: convergence verification" },
{ label: "Skip", description: "Skip convergence review, run tests only" }
]
}
]
})
}
// TodoWrite:Phase 4 → completed [${userSelection.execution_method} | CR:${userSelection.code_review_tool} | CVR:${userSelection.convergence_review_tool}],Phase 5 → in_progress
10. LP-Phase 5:移交执行
重要:lite-plan 绝不直接执行代码。所有执行都通过 workflow-lite-execute 完成。
构建 executionContext:
const manifest = file_exists(`${sessionFolder}/explorations-manifest.json`)
? JSON.parse(Read(`${sessionFolder}/explorations-manifest.json`))
: { exploration_count: 0, explorations: [] }
const explorations = {}
manifest.explorations.forEach(exp => {
if (file_exists(exp.path)) explorations[exp.angle] = JSON.parse(Read(exp.path))
})
const plan = JSON.parse(Read(`${sessionFolder}/plan.json`))
executionContext = {
planObject: plan,
taskFiles: (plan.task_ids || []).map(id => ({ id, path: `${sessionFolder}/.task/${id}.json` })),
explorationsContext: explorations,
explorationAngles: manifest.explorations.map(e => e.angle),
explorationManifest: manifest,
clarificationContext: clarificationContext || null,
executionMethod: userSelection.execution_method,
codeReviewTool: userSelection.code_review_tool,
convergenceReviewTool: userSelection.convergence_review_tool,
originalUserInput: task_description,
executorAssignments: executorAssignments, // { taskId: { executor, reason } } — overrides executionMethod
session: {
id: sessionId,
folder: sessionFolder,
artifacts: {
explorations: manifest.explorations.map(exp => ({ angle: exp.angle, path: exp.path })),
explorations_manifest: `${sessionFolder}/explorations-manifest.json`,
plan: `${sessionFolder}/plan.json`,
task_dir: `${sessionFolder}/.task`
}
}
}
移交:
if (!workflowPreferences.autoYes) {
console.log(`Handing off to execution engine. No further prompts.`)
}
// TodoWrite: Phase 5 → completed, add LE-Phase 1 → in_progress
const taskCount = (plan.task_ids || []).length
TodoWrite({ todos: [
{ content: "LP-Phase 1: Exploration", status: "completed" },
{ content: "LP-Phase 2: Clarification", status: "completed" },
{ content: "LP-Phase 3: Planning", status: "completed" },
{ content: `LP-Phase 4: Confirmed [${userSelection.execution_method} | CR:${userSelection.code_review_tool} | CVR:${userSelection.convergence_review_tool}]`, status: "completed" },
{ content: `LP-Phase 5: Handoff → workflow-lite-execute`, status: "completed" },
{ content: `LE-Phase 1: Task Loading [${taskCount} tasks]`, status: "in_progress", activeForm: "Loading tasks" }
]})
Skill("workflow-lite-execute")
// executionContext passed as global variable (Mode 1: In-Memory Plan)
11. 会话文件夹结构
.workflow/.lite-plan/{task-slug}-{YYYY-MM-DD}/
├── exploration-{angle}.json (1-4) # Per-angle exploration
├── explorations-manifest.json # Exploration index
├── planning-context.md # Evidence paths + understanding
├── plan.json # Plan overview (task_ids[])
├── code-review.md # Generated by workflow-lite-execute Step 4
├── test-checklist.json # Generated by workflow-lite-test-review
├── test-review.md # Generated by workflow-lite-test-review
└── .task/
├── TASK-001.json
├── TASK-002.json
└── ...
链路:lite-plan → workflow-lite-execute → workflow-lite-test-review
lite-plan (LP-Phase 1-5)
└─ Skill("workflow-lite-execute") ← executionContext (global)
├─ Step 1-3: Task Execution
├─ Step 4: Code Review (quality/correctness/security)
└─ Step 5: Skill("workflow-lite-test-review") ← testReviewContext (global)
├─ TR-Phase 1: Detect test framework
├─ TR-Phase 2: Convergence verification (plan criteria)
├─ TR-Phase 3-4: Run tests + Auto-fix
└─ TR-Phase 5: Report + Sync specs
12. 错误处理
| 错误 | 解决方案 |
|---|---|
| 探索 Agent 失败 | 跳过探索,仅根据任务描述继续 |
| 规划 Agent 失败 | 降低复杂度后重试,或建议拆分任务 |
| 澄清超时 | 按原样使用探索结果 |
| 确认超时 | 保存上下文并显示恢复说明 |
| 修改循环超过 3 次 | 建议拆分任务或使用 /workflow-plan |
<auto_mode>
当 workflowPreferences.autoYes === true(整个规划与执行工作流)时:
- 澄清:跳过 | 计划确认:允许并执行 | 执行:自动 | 审查:跳过
自动模式通过一次确认授权完整的规划与执行工作流。之后不再提示。 </auto_mode>
<success_criteria>
- 在 LP-Phase 0 初始化工作流偏好设置(autoYes、forceExplore)
- 评估复杂度并恰当选择探索方向
- 启动并行探索 Agent,且 run_in_background=false
- 根据自动发现的文件构建探索清单
- 汇总、去重澄清需求,并按每批 4 项的方式呈现
- 通过 cli-lite-planning-agent 生成计划
- 以双层结构输出计划:plan.json(task_ids[])+ .task/TASK-*.json
- 收集用户确认(或在自动模式下自动批准)
- 完整构建 executionContext,包含所有产物和会话引用
- 通过 Skill("workflow-lite-execute") 将 executionContext 移交给 workflow-lite-execute
- 规划阶段不执行代码——所有执行均推迟至 workflow-lite-execute </success_criteria>