workflow-lite-plan

安装量: 38
排名: #18768

安装

npx skills add https://github.com/catlog22/claude-code-workflow --skill workflow-lite-plan
Workflow-Lite-Plan
Planning pipeline: explore → clarify → plan → confirm → handoff to lite-execute.
Context Isolation
CRITICAL
If invoked from analyze-with-file (via "执行任务"), the analyze-with-file session is
COMPLETE
and all its phase instructions are FINISHED and MUST NOT be referenced. Only follow LP-Phase 1-5 defined in THIS document. Phase numbers are INDEPENDENT of any prior workflow.
Input
Task description or path to .md file (required)
Flag
Description
-y
,
--yes
Auto mode: Skip clarification, auto-confirm plan, auto-select execution, skip review (entire plan+execute workflow)
--force-explore
Force code exploration even when task has prior analysis
Note
Workflow preferences (
autoYes
,
forceExplore
) must be initialized at skill start. If not provided by caller, skill will prompt user for workflow mode selection.
Output Artifacts
Artifact
Description
exploration-{angle}.json
Per-angle exploration results (1-4 files based on complexity)
explorations-manifest.json
Index of all exploration files
planning-context.md
Evidence paths + synthesized understanding
plan.json
Plan overview with task_ids[] (plan-overview-base-schema.json)
.task/TASK-*.json
Independent task files (one per task)
Output Directory
:
.workflow/.lite-plan/{task-slug}-{YYYY-MM-DD}/
Agent Usage
Low → Direct Claude planning (no agent) | Medium/High →
cli-lite-planning-agent
Schema Reference
:
~/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.json
Auto Mode Defaults
When
workflowPreferences.autoYes === true
(entire plan+execute workflow):
Clarification
Skipped |
Plan Confirmation
Allow & Execute |
Execution
Auto |
Review
Skip Auto mode authorizes the complete plan-and-execute workflow with a single confirmation. No further prompts. Phase Summary Phase Core Action Output LP-0 Initialize workflowPreferences autoYes, forceExplore LP-1 Complexity assessment → parallel cli-explore-agents (1-4) exploration-.json + manifest LP-2 Aggregate + dedup clarification_needs → multi-round AskUserQuestion clarificationContext (in-memory) LP-3 Low: Direct Claude planning / Medium+High: cli-lite-planning-agent plan.json + .task/TASK-.json LP-4 Display plan → AskUserQuestion (Confirm + Execution + Review) userSelection LP-5 Build executionContext → Skill("lite-execute") handoff (Mode 1) Implementation LP-Phase 0: Workflow Preferences Initialization if ( typeof workflowPreferences === 'undefined' || workflowPreferences === null ) { workflowPreferences = { autoYes : false , // false: show LP-Phase 2/4 prompts | true (-y): skip all prompts forceExplore : false } } LP-Phase 1: Intelligent Multi-Angle Exploration Session Setup (MANDATORY): const getUtc8ISOString = ( ) => new Date ( Date . now ( ) + 8 * 60 * 60 * 1000 ) . toISOString ( ) const taskSlug = task_description . toLowerCase ( ) . replace ( / [ ^ a - z 0 - 9 ] + / g , '-' ) . substring ( 0 , 40 ) 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 Template (initial state — subsequent phases update status progressively): // 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 [ ${ planningStrategy } ] , status : "pending" } , { content : "LP-Phase 4: Confirmation" , status : "pending" } , { content : "LP-Phase 5: Execution" , status : "pending" } ] } ) Exploration Decision Logic : const hasPriorAnalysis = /

\s
*
Prior Analysis
/
i
.
test
(
task_description
)
needsExploration
=
workflowPreferences
.
forceExplore
?
true
:
hasPriorAnalysis
?
false
:
(
task
.
mentions_specific_files
||
task
.
requires_codebase_context
||
task
.
needs_architecture_understanding
||
task
.
modifies_existing_code
)
if
(
!
needsExploration
)
{
// manifest absent; LP-Phase 3 loads with safe fallback
proceed_to_next_phase
(
)
}
Context Protection
File reading >=50k chars → force
needsExploration=true
(delegate to cli-explore-agent)
Complexity Assessment
:
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
)
)
// Direct Claude planning ONLY for: Low + no prior analysis + single angle
const
planningStrategy
=
(
complexity
===
'Low'
&&
!
hasPriorAnalysis
&&
selectedAngles
.
length
<=
1
)
?
'Direct Claude Planning'
:
'cli-lite-planning-agent'
console
.
log
(
`
Exploration Plan:
${
complexity
}
|
${
selectedAngles
.
join
(
', '
)
}
|
${
planningStrategy
}
`
)
Launch Parallel Explorations
:
CRITICAL
MUST NOT use run_in_background: true — exploration results are REQUIRED before planning. 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
Auto-discover & Build Manifest
:
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 → completed, Phase 2 → in_progress
Output
:
exploration-{angle}.json
(1-4 files) +
explorations-manifest.json
LP-Phase 2: Clarification (Optional, Multi-Round)
Skip if
No exploration or
clarification_needs
is empty across all explorations
CRITICAL
AskUserQuestion limits max 4 questions per call. MUST execute multiple rounds to exhaust all clarification needs. 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
}
}
Output
:
clarificationContext
(in-memory)
LP-Phase 3: Planning
IMPORTANT
LP-Phase 3 is planning only — NO code execution. All execution happens in LP-Phase 5 via lite-execute. Executor Assignment (after plan generation): // 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 : '...' } } ) Low Complexity — Direct planning by Claude: const schema = Bash ( cat ~/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.json ) const manifest = file_exists ( ${ sessionFolder } /explorations-manifest.json ) ? JSON . parse ( Read ( ${ sessionFolder } /explorations-manifest.json ) ) : { explorations : [ ] } manifest . explorations . forEach ( exp => { console . log ( \n### Exploration: ${ exp . angle } \n ${ Read ( exp . path ) } ) } ) // Generate tasks — MUST incorporate exploration insights // Field names: convergence.criteria (not acceptance), files[].change (not modification_points), test (not verification) const tasks = [ { id : "TASK-001" , title : "..." , description : "..." , depends_on : [ ] , convergence : { criteria : [ "..." ] } , files : [ { path : "..." , change : "..." } ] , implementation : [ "..." ] , test : "..." } ] const taskDir = ${ sessionFolder } /.task Bash ( mkdir -p " ${ taskDir } " ) tasks . forEach ( task => Write ( ${ taskDir } / ${ task . id } .json , JSON . stringify ( task , null , 2 ) ) ) const plan = { summary : "..." , approach : "..." , task_ids : tasks . map ( t => t . id ) , task_count : tasks . length , complexity : "Low" , estimated_time : "..." , recommended_execution : "Agent" , _metadata : { timestamp : getUtc8ISOString ( ) , source : "direct-planning" , planning_mode : "direct" , plan_type : "feature" } } Write ( ${ sessionFolder } /plan.json , JSON . stringify ( plan , null , 2 ) ) // MUST continue to LP-Phase 4 — DO NOT execute code here Medium/High Complexity — Invoke 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)

Schema Reference

Execute: cat ~/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.json

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. ` }

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
  • Follow plan-overview-base-schema.json for plan.json, task-schema.json for .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. Read schema → 2. ccw spec load → 3. Read ALL exploration files → 4. Synthesize + generate
  2. Write: planning-context.md, .task/TASK-*.json, plan.json (task_ids[], NO tasks[])
  3. Return brief completion summary ) Output : ${sessionFolder}/plan.json // TodoWrite: Phase 3 → completed, Phase 4 → in_progress LP-Phase 4: Task Confirmation & Execution Selection Display Plan : 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
}
`
)
Collect Confirmation
:
let
userSelection
if
(
workflowPreferences
.
autoYes
)
{
console
.
log
(
`
[Auto] Allow & Execute | Auto | Skip
`
)
userSelection
=
{
confirmation
:
"Allow"
,
execution_method
:
"Auto"
,
code_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?"
,
header
:
"Review"
,
multiSelect
:
false
,
options
:
[
{
label
:
"Gemini Review"
,
description
:
"Gemini CLI review"
}
,
{
label
:
"Codex Review"
,
description
:
"Git-aware review (prompt OR --uncommitted)"
}
,
{
label
:
"Agent Review"
,
description
:
"@code-reviewer agent"
}
,
{
label
:
"Skip"
,
description
:
"No review"
}
]
}
]
}
)
}
// TodoWrite: Phase 4 → completed
[${userSelection.execution_method} + ${userSelection.code_review_tool}]
, Phase 5 → in_progress
LP-Phase 5: Handoff to Execution
CRITICAL
lite-plan NEVER executes code directly. ALL execution goes through lite-execute. Build 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 , 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 } } } Handoff : 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 } ] , status : "completed" } , { content : LP-Phase 5: Handoff → lite-execute , status : "completed" } , { content : LE-Phase 1: Task Loading [ ${ taskCount } tasks] , status : "in_progress" , activeForm : "Loading tasks" } ] } ) Skill ( "lite-execute" ) // executionContext passed as global variable (Mode 1: In-Memory Plan) Session Folder Structure .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[]) └── .task/ ├── TASK-001.json ├── TASK-002.json └── ... Error Handling Error Resolution Exploration agent failure Skip exploration, continue with task description only Planning agent failure Fallback to direct planning by Claude Clarification timeout Use exploration findings as-is Confirmation timeout Save context, display resume instructions Modify loop > 3 times Suggest breaking task or using /workflow-plan
返回排行榜