kata-plan-phase
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese<execution_context>
@./references/ui-brand.md
</execution_context>
<objective>
Create executable phase prompts (PLAN.md files) for a roadmap phase with integrated research and verification.
Default flow: Research (if needed) → Plan → Verify → Done
Orchestrator role: Parse arguments, validate phase, research domain (unless skipped or exists), spawn kata-planner agent, verify plans with kata-plan-checker, iterate until plans pass or max iterations reached, present results.
Why subagents: Research and planning burn context fast. Verification uses fresh context. User sees the flow between agents in main context.
</objective>
<context>
Phase number: $ARGUMENTS (optional - auto-detects next unplanned phase if not provided)
Flags:
- — Force re-research even if RESEARCH.md exists
--research - — Skip research entirely, go straight to planning
--skip-research - — Gap closure mode (reads VERIFICATION.md, skips research)
--gaps - — Skip planner → checker verification loop
--skip-verify
Normalize phase input in step 2 before any directory lookups.
</context>
<process><execution_context>
@./references/ui-brand.md
</execution_context>
<objective>
为路线图阶段创建可执行的阶段提示(PLAN.md文件),并集成研究与验证环节。
默认流程: 研究(如有需要)→ 规划 → 验证 → 完成
编排器角色: 解析参数,验证阶段,研究领域(除非跳过或已有研究成果),启动kata-planner Agent,使用kata-plan-checker验证规划,迭代直至规划通过或达到最大迭代次数,展示结果。
为何使用子代理: 研究和规划会快速消耗上下文。验证环节使用全新上下文。用户可在主上下文中查看代理间的流转过程。
</objective>
<context>
阶段编号:$ARGUMENTS(可选 - 若未提供则自动检测下一个未规划的阶段)
标志位:
- — 即使RESEARCH.md已存在,强制重新进行研究
--research - — 完全跳过研究环节,直接进入规划阶段
--skip-research - — 缺口补全模式(读取VERIFICATION.md,跳过研究)
--gaps - — 跳过「规划器→校验器」的验证循环
--skip-verify
在进行任何目录查找前,先在步骤2中标准化阶段输入内容。
</context>
<process>1. Validate Environment and Resolve Model Profile
1. 验证环境并解析模型配置文件
bash
ls .planning/ 2>/dev/nullIf not found: Error - user should run first.
/kata-new-projectResolve model profile for agent spawning:
bash
MODEL_PROFILE=$(cat .planning/config.json 2>/dev/null | grep -o '"model_profile"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "balanced")Default to "balanced" if not set.
Model lookup table:
| Agent | quality | balanced | budget |
|---|---|---|---|
| kata-phase-researcher | opus | sonnet | haiku |
| kata-planner | opus | opus | sonnet |
| kata-plan-checker | sonnet | sonnet | haiku |
Store resolved models for use in Task calls below.
bash
ls .planning/ 2>/dev/null若未找到: 错误提示 - 用户应先运行。
/kata-new-project解析用于代理启动的模型配置文件:
bash
MODEL_PROFILE=$(cat .planning/config.json 2>/dev/null | grep -o '"model_profile"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "balanced")若未设置,默认使用"balanced"。
模型查找表:
| Agent | quality | balanced | budget |
|---|---|---|---|
| kata-phase-researcher | opus | sonnet | haiku |
| kata-planner | opus | opus | sonnet |
| kata-plan-checker | sonnet | sonnet | haiku |
存储解析后的模型,供后续Task调用使用。
2. Parse and Normalize Arguments
2. 解析并标准化参数
Extract from $ARGUMENTS:
- Phase number (integer or decimal like )
2.1 - flag to force re-research
--research - flag to skip research
--skip-research - flag for gap closure mode
--gaps - flag to bypass verification loop
--skip-verify
If no phase number: Detect next unplanned phase from roadmap.
Normalize phase to zero-padded format:
bash
undefined从$ARGUMENTS中提取:
- 阶段编号(整数或小数格式,如)
2.1 - 标志位:强制重新研究
--research - 标志位:跳过研究
--skip-research - 标志位:缺口补全模式
--gaps - 标志位:绕过验证循环
--skip-verify
若未提供阶段编号: 从路线图中检测下一个未规划的阶段。
将阶段编号标准化为带前导零的格式:
bash
undefinedNormalize phase number (8 → 08, but preserve decimals like 2.1 → 02.1)
标准化阶段编号(8 → 08,保留小数格式如2.1 → 02.1)
if [[ "$PHASE" =~ ^[0-9]+$ ]]; then
PHASE=$(printf "%02d" "$PHASE")
elif [[ "$PHASE" =~ ^([0-9]+).([0-9]+)$ ]]; then
PHASE=$(printf "%02d.%s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}")
fi
**Check for existing research and plans (uses universal phase discovery):**
```bashif [[ "$PHASE" =~ ^[0-9]+$ ]]; then
PHASE=$(printf "%02d" "$PHASE")
elif [[ "$PHASE" =~ ^([0-9]+).([0-9]+)$ ]]; then
PHASE=$(printf "%02d.%s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}")
fi
**检查是否存在重复的研究和规划文件(使用通用阶段发现机制):**
```bashFind phase directory across state subdirectories
在状态子目录中查找阶段目录
PADDED=$(printf "%02d" "$PHASE" 2>/dev/null || echo "$PHASE")
PHASE_DIR=""
for state in active pending completed; do
PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1)
[ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1)
[ -n "$PHASE_DIR" ] && break
done
PADDED=$(printf "%02d" "$PHASE" 2>/dev/null || echo "$PHASE")
PHASE_DIR=""
for state in active pending completed; do
PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1)
[ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1)
[ -n "$PHASE_DIR" ] && break
done
Fallback: flat directory (backward compatibility for unmigrated projects)
回退方案:平级目录(兼容未迁移的旧项目)
if [ -z "$PHASE_DIR" ]; then
PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1)
[ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1)
fi
if [ -z "$PHASE_DIR" ]; then
PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1)
[ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1)
fi
Collision check: detect duplicate phase numbering that requires migration
冲突检测:检测需要迁移的重复阶段编号
MATCH_COUNT=0
for state in active pending completed; do
MATCH_COUNT=$((MATCH_COUNT + $(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-*" 2>/dev/null | wc -l)))
done
MATCH_COUNT=0
for state in active pending completed; do
MATCH_COUNT=$((MATCH_COUNT + $(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-*" 2>/dev/null | wc -l)))
done
Include flat fallback matches
包含平级目录的匹配结果
MATCH_COUNT=$((MATCH_COUNT + $(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-*" 2>/dev/null | wc -l)))
if [ "$MATCH_COUNT" -gt 1 ]; then
echo "COLLISION: ${MATCH_COUNT} directories match prefix '${PADDED}-*' across phase states."
echo "This project uses old per-milestone phase numbering that must be migrated first."
fi
**If COLLISION detected (MATCH_COUNT > 1):** STOP planning. Invoke `/kata-migrate-phases` to renumber phases to globally sequential numbering. After migration completes, re-invoke `/kata-plan-phase` with the migrated phase number. Do NOT continue with ambiguous phase directories.
```bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-RESEARCH.md" 2>/dev/null
find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/nullMATCH_COUNT=$((MATCH_COUNT + $(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-*" 2>/dev/null | wc -l)))
if [ "$MATCH_COUNT" -gt 1 ]; then
echo "COLLISION: ${MATCH_COUNT} directories match prefix '${PADDED}-*' across phase states."
echo "This project uses old per-milestone phase numbering that must be migrated first."
fi
**若检测到冲突(MATCH_COUNT > 1):** 停止规划。调用`/kata-migrate-phases`将阶段编号迁移为全局连续编号。迁移完成后,使用迁移后的阶段编号重新调用`/kata-plan-phase`。请勿继续处理存在歧义的阶段目录。
```bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-RESEARCH.md" 2>/dev/null
find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null3. Validate Phase
3. 验证阶段
bash
grep -A5 "Phase ${PHASE}:" .planning/ROADMAP.md 2>/dev/nullIf not found: Error with available phases. If found: Extract phase number, name, description.
bash
grep -A5 "Phase ${PHASE}:" .planning/ROADMAP.md 2>/dev/null若未找到: 提示错误并列出可用阶段。若找到: 提取阶段编号、名称和描述。
4. Ensure Phase Directory Exists
4. 确保阶段目录存在
bash
undefinedbash
undefinedPHASE is already normalized (08, 02.1, etc.) from step 2
PHASE已在步骤2中标准化为(08、02.1等)格式
Use universal phase discovery: search active/pending/completed with flat fallback
使用通用阶段发现机制:在active/pending/completed目录中查找,平级目录作为回退
PADDED=$(printf "%02d" "$PHASE" 2>/dev/null || echo "$PHASE")
PHASE_DIR=""
for state in active pending completed; do
PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1)
[ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1)
[ -n "$PHASE_DIR" ] && break
done
PADDED=$(printf "%02d" "$PHASE" 2>/dev/null || echo "$PHASE")
PHASE_DIR=""
for state in active pending completed; do
PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1)
[ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1)
[ -n "$PHASE_DIR" ] && break
done
Fallback: flat directory (backward compatibility for unmigrated projects)
回退方案:平级目录(兼容未迁移的旧项目)
if [ -z "$PHASE_DIR" ]; then
PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1)
[ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1)
fi
if [ -z "$PHASE_DIR" ]; then
Create phase directory in pending/ from roadmap name
PHASE_NAME=$(grep "Phase ${PHASE}:" .planning/ROADMAP.md | sed 's/.Phase [0-9]: //' | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
mkdir -p ".planning/phases/pending/${PHASE}-${PHASE_NAME}"
PHASE_DIR=".planning/phases/pending/${PHASE}-${PHASE_NAME}"
fi
undefinedif [ -z "$PHASE_DIR" ]; then
PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1)
[ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1)
fi
if [ -z "$PHASE_DIR" ]; then
从路线图名称中获取阶段名称,在pending/目录中创建阶段目录
PHASE_NAME=$(grep "Phase ${PHASE}:" .planning/ROADMAP.md | sed 's/.Phase [0-9]: //' | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
mkdir -p ".planning/phases/pending/${PHASE}-${PHASE_NAME}"
PHASE_DIR=".planning/phases/pending/${PHASE}-${PHASE_NAME}"
fi
undefined5. Handle Research
5. 处理研究环节
If flag: Skip research (gap closure uses VERIFICATION.md instead).
--gapsIf flag: Skip to step 6.
--skip-researchCheck config for research setting:
bash
WORKFLOW_RESEARCH=$(cat .planning/config.json 2>/dev/null | grep -o '"research"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")If is AND flag NOT set: Skip to step 6.
workflow.researchfalse--researchOtherwise:
Check for existing research:
bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-RESEARCH.md" 2>/dev/nullIf RESEARCH.md exists AND flag NOT set:
--research- Display:
Using existing research: ${PHASE_DIR}/${PHASE}-RESEARCH.md - Skip to step 6
If RESEARCH.md missing OR flag set:
--researchDisplay stage banner:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► RESEARCHING PHASE {X}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ Spawning researcher...
Proceed to spawn researcher
若使用标志位: 跳过研究环节(缺口补全模式使用VERIFICATION.md替代)。
--gaps若使用标志位: 跳至步骤6。
--skip-research检查配置中的研究设置:
bash
WORKFLOW_RESEARCH=$(cat .planning/config.json 2>/dev/null | grep -o '"research"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")若为且未设置标志位: 跳至步骤6。
workflow.researchfalse--research其他情况:
检查是否存在已有的研究文件:
bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-RESEARCH.md" 2>/dev/null若RESEARCH.md已存在且未设置标志位:
--research- 显示:
Using existing research: ${PHASE_DIR}/${PHASE}-RESEARCH.md - 跳至步骤6
若RESEARCH.md不存在或设置了标志位:
--research显示阶段横幅:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► 正在研究阶段 {X}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ 正在启动研究代理...
启动研究代理
Spawn kata-phase-researcher
启动kata-phase-researcher
Gather context for research prompt:
bash
undefined收集研究提示的上下文:
bash
undefinedGet phase description from roadmap
从路线图中获取阶段描述
PHASE_DESC=$(grep -A3 "Phase ${PHASE}:" .planning/ROADMAP.md)
PHASE_DESC=$(grep -A3 "Phase ${PHASE}:" .planning/ROADMAP.md)
Get requirements if they exist
获取需求(若存在)
REQUIREMENTS=$(cat .planning/REQUIREMENTS.md 2>/dev/null | grep -A100 "## Requirements" | head -50)
REQUIREMENTS=$(cat .planning/REQUIREMENTS.md 2>/dev/null | grep -A100 "## Requirements" | head -50)
Get prior decisions from STATE.md
从STATE.md中获取先前的决策
DECISIONS=$(grep -A20 "### Decisions Made" .planning/STATE.md 2>/dev/null)
DECISIONS=$(grep -A20 "### Decisions Made" .planning/STATE.md 2>/dev/null)
Get phase context if exists
获取阶段上下文(若存在)
PHASE_CONTEXT=$(cat "${PHASE_DIR}/${PHASE}-CONTEXT.md" 2>/dev/null)
Fill research prompt and spawn:
```markdown
<objective>
Research how to implement Phase {phase_number}: {phase_name}
Answer: "What do I need to know to PLAN this phase well?"
</objective>
<context>
**Phase description:**
{phase_description}
**Requirements (if any):**
{requirements}
**Prior decisions:**
{decisions}
**Phase context (if any):**
{phase_context}
</context>
<output>
Write research findings to: {phase_dir}/{phase}-RESEARCH.md
</output>Task(
prompt="<agent-instructions>\n{phase_researcher_instructions_content}\n</agent-instructions>\n\n" + research_prompt,
subagent_type="general-purpose",
model="{researcher_model}",
description="Research Phase {phase}"
)PHASE_CONTEXT=$(cat "${PHASE_DIR}/${PHASE}-CONTEXT.md" 2>/dev/null)
填充研究提示并启动代理:
```markdown
<objective>
研究如何实现阶段 {phase_number}: {phase_name}
核心问题:"要做好该阶段的规划,我需要了解哪些内容?"
</objective>
<context>
**阶段描述:**
{phase_description}
**需求(若有):**
{requirements}
**先前决策:**
{decisions}
**阶段上下文(若有):**
{phase_context}
</context>
<output>
将研究结果写入:{phase_dir}/{phase}-RESEARCH.md
</output>Task(
prompt="<agent-instructions>\n{phase_researcher_instructions_content}\n</agent-instructions>\n\n" + research_prompt,
subagent_type="general-purpose",
model="{researcher_model}",
description="Research Phase {phase}"
)Handle Researcher Return
处理研究代理的返回结果
## RESEARCH COMPLETE- Display:
Research complete. Proceeding to planning... - Continue to step 6
## RESEARCH BLOCKED- Display blocker information
- Offer: 1) Provide more context, 2) Skip research and plan anyway, 3) Abort
- Wait for user response
返回:
## RESEARCH COMPLETE- 显示:
研究完成。正在进入规划环节... - 继续执行步骤6
返回:
## RESEARCH BLOCKED- 显示阻塞信息
- 提供选项:1) 提供更多上下文,2) 跳过研究直接规划,3) 终止流程
- 等待用户响应
6. Check Existing Plans
6. 检查已有的规划文件
bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/nullIf exists: Offer: 1) Continue planning (add more plans), 2) View existing, 3) Replan from scratch. Wait for response.
bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null若存在规划文件: 提供选项:1) 继续规划(添加新规划),2) 查看已有规划,3) 从头重新规划。等待用户响应。
7. Read Context Files
7. 读取上下文文件
Read and store context file contents for the planner agent. The syntax does not work across Task() boundaries - content must be inlined.
@Read these files using the Read tool:
- (required)
.planning/STATE.md - (required)
.planning/ROADMAP.md - (if exists)
.planning/REQUIREMENTS.md - (if exists)
${PHASE_DIR}/*-CONTEXT.md - (if exists)
${PHASE_DIR}/*-RESEARCH.md - (if --gaps mode)
${PHASE_DIR}/*-VERIFICATION.md - (if --gaps mode)
${PHASE_DIR}/*-UAT.md - (relative to skill base directory) — store as
references/planner-instructions.mdplanner_instructions_content - (relative to skill base directory) — store as
references/phase-researcher-instructions.mdphase_researcher_instructions_content - (relative to skill base directory) — store as
references/plan-checker-instructions.mdplan_checker_instructions_content
Store all content for use in the Task prompt below.
读取并存储上下文文件内容,供规划代理使用。Task()边界间无法使用语法,必须将内容内联。
@使用Read工具读取以下文件:
- (必填)
.planning/STATE.md - (必填)
.planning/ROADMAP.md - (若存在)
.planning/REQUIREMENTS.md - (若存在)
${PHASE_DIR}/*-CONTEXT.md - (若存在)
${PHASE_DIR}/*-RESEARCH.md - (若使用--gaps模式)
${PHASE_DIR}/*-VERIFICATION.md - (若使用--gaps模式)
${PHASE_DIR}/*-UAT.md - (相对于技能基础目录)—— 存储为
references/planner-instructions.mdplanner_instructions_content - (相对于技能基础目录)—— 存储为
references/phase-researcher-instructions.mdphase_researcher_instructions_content - (相对于技能基础目录)—— 存储为
references/plan-checker-instructions.mdplan_checker_instructions_content
存储所有内容,供后续Task提示使用。
Extract Linked Issues from STATE.md
从STATE.md中提取关联的问题
After reading the base context files, extract any issues linked to this phase from STATE.md:
bash
undefined读取基础上下文文件后,从STATE.md中提取与该阶段关联的所有问题:
bash
undefinedNormalize phase identifier
标准化阶段标识符
PHASE_DIR_NAME=$(basename "$PHASE_DIR")
PHASE_NUM=$(echo "$PHASE_DIR_NAME" | grep -oE '^[0-9.]+')
PHASE_DIR_NAME=$(basename "$PHASE_DIR")
PHASE_NUM=$(echo "$PHASE_DIR_NAME" | grep -oE '^[0-9.]+')
Extract linked issues from both sections
从两个部分提取关联问题
LINKED_ISSUES=""
LINKED_ISSUES=""
Check Pending Issues (from check-issues "Link to existing phase")
检查待处理问题(来自check-issues的"Link to existing phase")
if grep -q "^### Pending Issues" .planning/STATE.md 2>/dev/null; then
PENDING=$(awk '
/^### Pending Issues/{found=1; next}
/^### |^## /{if(found) exit}
found && /→ Phase/ {
# Match phase number or full phase dir name
if ($0 ~ /→ Phase '"${PHASE_NUM}"'-/ || $0 ~ /→ Phase '"${PHASE_DIR_NAME}"'/) {
print
}
}
' .planning/STATE.md)
[ -n "$PENDING" ] && LINKED_ISSUES="${PENDING}"
fi
if grep -q "^### Pending Issues" .planning/STATE.md 2>/dev/null; then
PENDING=$(awk '
/^### Pending Issues/{found=1; next}
/^### |^## /{if(found) exit}
found && /→ Phase/ {
# 匹配阶段编号或完整阶段目录名称
if ($0 ~ /→ Phase '"${PHASE_NUM}"'-/ || $0 ~ /→ Phase '"${PHASE_DIR_NAME}"'/) {
print
}
}
' .planning/STATE.md)
[ -n "$PENDING" ] && LINKED_ISSUES="${PENDING}"
fi
Check Milestone Scope Issues (from add-milestone issue selection)
检查里程碑范围问题(来自add-milestone的问题选择)
if grep -q "^### Milestone Scope Issues" .planning/STATE.md 2>/dev/null; then
SCOPE=$(awk '
/^### Milestone Scope Issues/{found=1; next}
/^### |^## /{if(found) exit}
found && /→ Phase/ {
if ($0 ~ /→ Phase '"${PHASE_NUM}"'-/ || $0 ~ /→ Phase '"${PHASE_DIR_NAME}"'/) {
print
}
}
' .planning/STATE.md)
[ -n "$SCOPE" ] && LINKED_ISSUES="${LINKED_ISSUES}${SCOPE}"
fi
Build the issue context section for the prompt (only if issues are linked):
```bash
ISSUE_CONTEXT_SECTION=""
if [ -n "$LINKED_ISSUES" ]; then
ISSUE_CONTEXT_SECTION="
**Linked Issues:**
${LINKED_ISSUES}
Note: Set \`source_issue:\` in plan frontmatter for traceability:
- GitHub issues: \`source_issue: github:#N\` (extract from provenance field)
- Local issues: \`source_issue: [file path]\`
"
fiStore ISSUE_CONTEXT_SECTION for use in Step 8 prompt.
if grep -q "^### Milestone Scope Issues" .planning/STATE.md 2>/dev/null; then
SCOPE=$(awk '
/^### Milestone Scope Issues/{found=1; next}
/^### |^## /{if(found) exit}
found && /→ Phase/ {
if ($0 ~ /→ Phase '"${PHASE_NUM}"'-/ || $0 ~ /→ Phase '"${PHASE_DIR_NAME}"'/) {
print
}
}
' .planning/STATE.md)
[ -n "$SCOPE" ] && LINKED_ISSUES="${LINKED_ISSUES}${SCOPE}"
fi
构建提示中的问题上下文部分(仅当存在关联问题时):
```bash
ISSUE_CONTEXT_SECTION=""
if [ -n "$LINKED_ISSUES" ]; then
ISSUE_CONTEXT_SECTION="
**关联问题:**
${LINKED_ISSUES}
注意:在规划的前置元数据中设置\`source_issue:\`以实现可追溯性:
- GitHub问题:\`source_issue: github:#N\`(从来源字段提取)
- 本地问题:\`source_issue: [文件路径]\`
"
fi存储ISSUE_CONTEXT_SECTION,供步骤8的提示使用。
8. Spawn kata-planner Agent
8. 启动kata-planner Agent
Display stage banner:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► PLANNING PHASE {X}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ Spawning planner...
Fill prompt with inlined content and spawn:
markdown
<planning_context>
**Phase:** {phase_number}
**Mode:** {standard | gap_closure}
**Project State:**
{state_content}
**Roadmap:**
{roadmap_content}
**Requirements (if exists):**
{requirements_content}
**Phase Context (if exists):**
{context_content}
**Research (if exists):**
{research_content}
**Linked Issues (from STATE.md):**
{issue_context_section}
**Gap Closure (if --gaps mode):**
{verification_content}
{uat_content}
</planning_context>
<downstream_consumer>
Output consumed by /kata-execute-phase
Plans must be executable prompts with:
- Frontmatter (wave, depends_on, files_modified, autonomous)
- Tasks in XML format
- Verification criteria
- must_haves for goal-backward verification
</downstream_consumer>
<quality_gate>
Before returning PLANNING COMPLETE:
- [ ] PLAN.md files created in phase directory
- [ ] Each plan has valid frontmatter
- [ ] Tasks are specific and actionable
- [ ] Dependencies correctly identified
- [ ] Waves assigned for parallel execution
- [ ] must_haves derived from phase goal
</quality_gate>Task(
prompt="<agent-instructions>\n{planner_instructions_content}\n</agent-instructions>\n\n" + filled_prompt,
subagent_type="general-purpose",
model="{planner_model}",
description="Plan Phase {phase}"
)显示阶段横幅:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► 正在规划阶段 {X}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ 正在启动规划代理...
填充内联内容并启动代理:
markdown
<planning_context>
**阶段:** {phase_number}
**模式:** {标准模式 | 缺口补全模式}
**项目状态:**
{state_content}
**路线图:**
{roadmap_content}
**需求(若存在):**
{requirements_content}
**阶段上下文(若存在):**
{context_content}
**研究结果(若存在):**
{research_content}
**关联问题(来自STATE.md):**
{issue_context_section}
**缺口补全(若使用--gaps模式):**
{verification_content}
{uat_content}
</planning_context>
<downstream_consumer>
输出结果将被`/kata-execute-phase`使用
规划必须是可执行的提示,包含:
- 前置元数据(wave、depends_on、files_modified、autonomous)
- XML格式的任务
- 验证标准
- 用于目标反向验证的must_haves
</downstream_consumer>
<quality_gate>
返回PLANNING COMPLETE前需满足:
- [ ] 已在阶段目录中创建PLAN.md文件
- [ ] 每个规划都有有效的前置元数据
- [ ] 任务具体且可执行
- [ ] 依赖关系已正确识别
- [ ] 已分配用于并行执行的Wave
- [ ] 已从阶段目标推导must_haves
</quality_gate>Task(
prompt="<agent-instructions>\n{planner_instructions_content}\n</agent-instructions>\n\n" + filled_prompt,
subagent_type="general-purpose",
model="{planner_model}",
description="Plan Phase {phase}"
)9. Handle Planner Return
9. 处理规划代理的返回结果
Parse planner output:
## PLANNING COMPLETE- Display:
Planner created {N} plan(s). Files on disk. - If : Skip to step 13
--skip-verify - Check config:
WORKFLOW_PLAN_CHECK=$(cat .planning/config.json 2>/dev/null | grep -o '"plan_check"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true") - If is
workflow.plan_check: Skip to step 13false - Otherwise: Proceed to step 10
## CHECKPOINT REACHED- Present to user, get response, spawn continuation (see step 12)
## PLANNING INCONCLUSIVE- Show what was attempted
- Offer: Add context, Retry, Manual
- Wait for user response
解析规划代理的输出:
返回:
## PLANNING COMPLETE- 显示:
规划代理已创建{N}个规划文件。文件已保存至磁盘。 - 若使用:跳至步骤13
--skip-verify - 检查配置:
WORKFLOW_PLAN_CHECK=$(cat .planning/config.json 2>/dev/null | grep -o '"plan_check"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true") - 若为
workflow.plan_check:跳至步骤13false - 其他情况:继续执行步骤10
返回:
## CHECKPOINT REACHED- 将结果展示给用户,获取响应,启动后续流程(见步骤12)
返回:
## PLANNING INCONCLUSIVE- 展示已尝试的内容
- 提供选项:添加上下文、重试、手动处理
- 等待用户响应
10. Spawn kata-plan-checker Agent
10. 启动kata-plan-checker Agent
Display:
`
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► VERIFYING PLANS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ Spawning plan checker...
Read plans and requirements for the checker:
bash
undefined显示:
`
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► 正在验证规划
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ 正在启动规划校验代理...
读取规划和需求文件,供校验代理使用:
bash
undefinedRead all plans in phase directory
读取阶段目录中的所有规划文件
PLANS_CONTENT=$(cat "${PHASE_DIR}"/*-PLAN.md 2>/dev/null)
PLANS_CONTENT=$(cat "${PHASE_DIR}"/*-PLAN.md 2>/dev/null)
Read requirements (reuse from step 7 if available)
读取需求文件(可复用步骤7中已读取的内容)
REQUIREMENTS_CONTENT=$(cat .planning/REQUIREMENTS.md 2>/dev/null)
Fill checker prompt with inlined content and spawn:
```markdown
<verification_context>
**Phase:** {phase_number}
**Phase Goal:** {goal from ROADMAP}
**Plans to verify:**
{plans_content}
**Requirements (if exists):**
{requirements_content}
</verification_context>
<expected_output>
Return one of:
- ## VERIFICATION PASSED — all checks pass
- ## ISSUES FOUND — structured issue list
</expected_output>Task(
prompt="<agent-instructions>\n{plan_checker_instructions_content}\n</agent-instructions>\n\n" + checker_prompt,
subagent_type="general-purpose",
model="{checker_model}",
description="Verify Phase {phase} plans"
)REQUIREMENTS_CONTENT=$(cat .planning/REQUIREMENTS.md 2>/dev/null)
填充校验提示并启动代理:
```markdown
<verification_context>
**阶段:** {phase_number}
**阶段目标:** {来自ROADMAP的目标}
**待验证的规划:**
{plans_content}
**需求(若存在):**
{requirements_content}
</verification_context>
<expected_output>
返回以下结果之一:
- ## VERIFICATION PASSED — 所有检查通过
- ## ISSUES FOUND — 结构化的问题列表
</expected_output>Task(
prompt="<agent-instructions>\n{plan_checker_instructions_content}\n</agent-instructions>\n\n" + checker_prompt,
subagent_type="general-purpose",
model="{checker_model}",
description="Verify Phase {phase} plans"
)11. Handle Checker Return
11. 处理校验代理的返回结果
If :
## VERIFICATION PASSED- Display:
Plans verified. Checking GitHub integration... - Execute Step 13 now — run the GitHub config check and issue update
If :
## ISSUES FOUND- Display:
Checker found issues: - List issues from checker output
- Check iteration count
- Proceed to step 12
若返回:
## VERIFICATION PASSED- 显示:
规划验证通过。正在检查GitHub集成... - 立即执行步骤13 — 运行GitHub配置检查和问题更新
若返回:
## ISSUES FOUND- 显示:
校验代理发现以下问题: - 列出校验输出中的问题
- 检查迭代次数
- 继续执行步骤12
12. Revision Loop (Max 3 Iterations)
12. 修订循环(最多3次迭代)
Track: (starts at 1 after initial plan + check)
iteration_countIf iteration_count < 3:
Display:
Sending back to planner for revision... (iteration {N}/3)Read current plans for revision context:
bash
PLANS_CONTENT=$(cat "${PHASE_DIR}"/*-PLAN.md 2>/dev/null)Spawn kata-planner with revision prompt:
markdown
<revision_context>
**Phase:** {phase_number}
**Mode:** revision
**Existing plans:**
{plans_content}
**Checker issues:**
{structured_issues_from_checker}
</revision_context>
<instructions>
Make targeted updates to address checker issues.
Do NOT replan from scratch unless issues are fundamental.
Return what changed.
</instructions>Task(
prompt="<agent-instructions>\n{planner_instructions_content}\n</agent-instructions>\n\n" + revision_prompt,
subagent_type="general-purpose",
model="{planner_model}",
description="Revise Phase {phase} plans"
)- After planner returns → spawn checker again (step 10)
- Increment iteration_count
If iteration_count >= 3:
Display:
Max iterations reached. {N} issues remain:- List remaining issues
Offer options:
- Force proceed (execute despite issues)
- Provide guidance (user gives direction, retry)
- Abandon (exit planning)
Wait for user response.
跟踪:(初始规划+校验后从1开始计数)
iteration_count若iteration_count < 3:
显示:
正在将规划返回给代理进行修订...(第{N}/3次迭代)读取当前规划作为修订上下文:
bash
PLANS_CONTENT=$(cat "${PHASE_DIR}"/*-PLAN.md 2>/dev/null)使用修订提示启动kata-planner:
markdown
<revision_context>
**阶段:** {phase_number}
**模式:** 修订
**现有规划:**
{plans_content}
**校验代理发现的问题:**
{structured_issues_from_checker}
</revision_context>
<instructions>
针对校验发现的问题进行针对性更新。
除非问题非常严重,否则请勿从头重新规划。
返回具体的修改内容。
</instructions>Task(
prompt="<agent-instructions>\n{planner_instructions_content}\n</agent-instructions>\n\n" + revision_prompt,
subagent_type="general-purpose",
model="{planner_model}",
description="Revise Phase {phase} plans"
)- 规划代理返回后 → 重新启动校验代理(步骤10)
- 递增iteration_count
若iteration_count >= 3:
显示:
已达到最大迭代次数。剩余{N}个问题:- 列出剩余问题
提供选项:
- 强制继续(忽略问题执行)
- 提供指导(用户给出方向后重试)
- 放弃(退出规划流程)
等待用户响应。
13. GitHub Integration Check
13. GitHub集成检查
Check config guards:
bash
GITHUB_ENABLED=$(cat .planning/config.json 2>/dev/null | grep -o '"enabled"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "false")
ISSUE_MODE=$(cat .planning/config.json 2>/dev/null | grep -o '"issueMode"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "never")If OR :
GITHUB_ENABLED != trueISSUE_MODE = never- Log:
Skipping GitHub issue update (github.enabled=${GITHUB_ENABLED}, issueMode=${ISSUE_MODE}) - Skip to
<offer_next>
If enabled, find phase issue:
bash
undefined检查配置限制:
bash
GITHUB_ENABLED=$(cat .planning/config.json 2>/dev/null | grep -o '"enabled"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "false")
ISSUE_MODE=$(cat .planning/config.json 2>/dev/null | grep -o '"issueMode"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "never")若 或 :
GITHUB_ENABLED != trueISSUE_MODE = never- 日志:
Skipping GitHub issue update (github.enabled=${GITHUB_ENABLED}, issueMode=${ISSUE_MODE}) - 跳至
<offer_next>
若已启用,查找阶段对应的GitHub问题:
bash
undefinedGet milestone version from ROADMAP.md (the one marked "In Progress")
从ROADMAP.md中获取标记为"In Progress"的里程碑版本
VERSION=$(grep -E "^### v[0-9]+.[0-9]+.*(In Progress)" .planning/ROADMAP.md | grep -oE "v[0-9]+.[0-9]+(.[0-9]+)?" | head -1 | tr -d 'v' || echo "")
VERSION=$(grep -E "^### v[0-9]+.[0-9]+.*(In Progress)" .planning/ROADMAP.md | grep -oE "v[0-9]+.[0-9]+(.[0-9]+)?" | head -1 | tr -d 'v' || echo "")
Fallback: try to find any version if no "In Progress" found
回退方案:若未找到"In Progress"的版本,尝试查找任意版本
[ -z "$VERSION" ] && VERSION=$(grep -oE 'v[0-9]+.[0-9]+(.[0-9]+)?' .planning/ROADMAP.md | head -1 | tr -d 'v' || echo "")
if [ -z "$VERSION" ]; then
echo "Warning: Could not determine milestone version. Skipping GitHub issue update."
Continue to offer_next (non-blocking)
fi
[ -z "$VERSION" ] && VERSION=$(grep -oE 'v[0-9]+.[0-9]+(.[0-9]+)?' .planning/ROADMAP.md | head -1 | tr -d 'v' || echo "")
if [ -z "$VERSION" ]; then
echo "警告:无法确定里程碑版本。跳过GitHub问题更新。"
继续执行offer_next(非阻塞)
fi
Find phase issue number
查找阶段对应的问题编号
ISSUE_NUMBER=$(gh issue list
--label "phase"
--milestone "v${VERSION}"
--json number,title
--jq ".[] | select(.title | startswith("Phase ${PHASE}:")) | .number"
2>/dev/null)
--label "phase"
--milestone "v${VERSION}"
--json number,title
--jq ".[] | select(.title | startswith("Phase ${PHASE}:")) | .number"
2>/dev/null)
if [ -z "$ISSUE_NUMBER" ]; then
echo "Warning: Could not find GitHub Issue for Phase ${PHASE}. Skipping checklist update."
Continue to offer_next (non-blocking)
fi
**Build plan checklist from PLAN.md files:**
```bash
PLAN_CHECKLIST=""
PLAN_COUNT=0
for plan_file in $(find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null | sort); do
PLAN_NUM=$(basename "$plan_file" | sed -E 's/.*-([0-9]+)-PLAN\.md/\1/')
# Extract brief objective from plan (first line after <objective>)
PLAN_OBJECTIVE=$(grep -A2 "<objective>" "$plan_file" | head -2 | tail -1 | sed 's/^ *//' | head -c 60)
# Fallback if objective extraction fails
if [ -z "$PLAN_OBJECTIVE" ]; then
PLAN_OBJECTIVE=$(basename "$plan_file" .md | sed 's/-PLAN$//' | sed 's/-/ /g')
fi
PLAN_CHECKLIST="${PLAN_CHECKLIST}- [ ] Plan ${PLAN_NUM}: ${PLAN_OBJECTIVE}
"
PLAN_COUNT=$((PLAN_COUNT + 1))
doneUpdate issue body with plan checklist:
Use the script at relative to this skill's base directory.
./scripts/update-issue-plans.pyConstruct the full path from the "Base directory for this skill" shown at invocation, then run:
bash
undefinedISSUE_NUMBER=$(gh issue list
--label "phase"
--milestone "v${VERSION}"
--json number,title
--jq ".[] | select(.title | startswith("Phase ${PHASE}:")) | .number"
2>/dev/null)
--label "phase"
--milestone "v${VERSION}"
--json number,title
--jq ".[] | select(.title | startswith("Phase ${PHASE}:")) | .number"
2>/dev/null)
if [ -z "$ISSUE_NUMBER" ]; then
echo "警告:未找到阶段${PHASE}对应的GitHub问题。跳过检查清单更新。"
继续执行offer_next(非阻塞)
fi
**从PLAN.md文件构建规划检查清单:**
```bash
PLAN_CHECKLIST=""
PLAN_COUNT=0
for plan_file in $(find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null | sort); do
PLAN_NUM=$(basename "$plan_file" | sed -E 's/.*-([0-9]+)-PLAN\.md/\1/')
# 从规划中提取简短目标(<objective>后的第一行)
PLAN_OBJECTIVE=$(grep -A2 "<objective>" "$plan_file" | head -2 | tail -1 | sed 's/^ *//' | head -c 60)
# 若目标提取失败,使用回退方案
if [ -z "$PLAN_OBJECTIVE" ]; then
PLAN_OBJECTIVE=$(basename "$plan_file" .md | sed 's/-PLAN$//' | sed 's/-/ /g')
fi
PLAN_CHECKLIST="${PLAN_CHECKLIST}- [ ] 规划${PLAN_NUM}:${PLAN_OBJECTIVE}
"
PLAN_COUNT=$((PLAN_COUNT + 1))
done使用规划检查清单更新问题内容:
使用本技能基础目录下的脚本。
./scripts/update-issue-plans.py从调用时显示的"Base directory for this skill"中获取完整路径,然后运行:
bash
undefinedWrite checklist to temp file
将检查清单写入临时文件
printf '%s\n' "$PLAN_CHECKLIST" > /tmp/phase-plan-checklist.md
printf '%s\n' "$PLAN_CHECKLIST" > /tmp/phase-plan-checklist.md
SKILL_BASE_DIR should be set to the base directory from skill invocation header
SKILL_BASE_DIR应设置为技能调用头中显示的基础目录
e.g., SKILL_BASE_DIR="/path/to/skills/plan-phase"
示例:SKILL_BASE_DIR="/path/to/skills/plan-phase"
python3 "${SKILL_BASE_DIR}/scripts/update-issue-plans.py" "$ISSUE_NUMBER" /tmp/phase-plan-checklist.md
&& GITHUB_UPDATE_SUCCESS=true
|| echo "Warning: Script failed, but continuing (non-blocking)"
&& GITHUB_UPDATE_SUCCESS=true
|| echo "Warning: Script failed, but continuing (non-blocking)"
python3 "${SKILL_BASE_DIR}/scripts/update-issue-plans.py" "$ISSUE_NUMBER" /tmp/phase-plan-checklist.md
&& GITHUB_UPDATE_SUCCESS=true
|| echo "警告:脚本执行失败,但将继续流程(非阻塞)"
&& GITHUB_UPDATE_SUCCESS=true
|| echo "警告:脚本执行失败,但将继续流程(非阻塞)"
Clean up
清理临时文件
rm -f /tmp/phase-plan-checklist.md
**Track result for display:**
Store `ISSUE_NUMBER` and `PLAN_COUNT` for display in `<offer_next>` if update succeeded.
**After GitHub check completes (success or skip), proceed to Step 14.**
**Error handling principle:** All GitHub operations are non-blocking. Missing issue, auth issues, or update failures warn but do not stop the planning workflow.rm -f /tmp/phase-plan-checklist.md
**跟踪结果用于展示:**
若更新成功,存储`ISSUE_NUMBER`和`PLAN_COUNT`,用于在`<offer_next>`中展示。
**GitHub检查完成后(无论成功或跳过),继续执行步骤14。**
**错误处理原则:** 所有GitHub操作均为非阻塞。缺失问题、认证问题或更新失败仅会发出警告,不会终止规划工作流。14. Present Final Status
14. 展示最终状态
Display the planning summary and route to .
</process>
<offer_next><offer_next>
Output this markdown directly (not as a code block):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► PHASE {X} PLANNED ✓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Phase {X}: {Name} — {N} plan(s) in {M} wave(s)
| Wave | Plans | What it builds |
|---|---|---|
| 1 | 01, 02 | [objectives] |
| 2 | 03 | [objective] |
Research: {Completed | Used existing | Skipped}
Verification: {Passed | Passed with override | Skipped}
{If GITHUB_UPDATE_SUCCESS=true:}
GitHub Issue: #{ISSUE_NUMBER} updated with {PLAN_COUNT} plan checklist items
───────────────────────────────────────────────────────────────
显示规划摘要,然后进入。
</process>
<offer_next><offer_next>
直接输出以下markdown内容(不要放在代码块中):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► 阶段{X}规划完成 ✓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段{X}:{名称} — 共{M}个Wave,包含{N}个规划
| Wave | 规划编号 | 构建内容 |
|---|---|---|
| 1 | 01、02 | [目标描述] |
| 2 | 03 | [目标描述] |
研究状态:{已完成 | 使用已有研究 | 已跳过}
验证状态:{已通过 | 已通过(用户覆盖) | 已跳过}
{若GITHUB_UPDATE_SUCCESS=true:}
GitHub问题:#{ISSUE_NUMBER} 已更新,添加了{PLAN_COUNT}个规划检查清单项
───────────────────────────────────────────────────────────────
▶ Next Up
▶ 下一步操作
Execute Phase {X} — run all {N} plans
/kata-execute-phase {X}
<sub>/clear first → fresh context window</sub>
───────────────────────────────────────────────────────────────
Also available:
- cat .planning/phases/{phase-dir}/*-PLAN.md — review plans
- /kata-plan-phase {X} --research — re-research first
───────────────────────────────────────────────────────────────
</offer_next>
<success_criteria>
- .planning/ directory validated
- Phase validated against roadmap
- Phase directory created if needed
- Research completed (unless --skip-research or --gaps or exists)
- kata-phase-researcher spawned if research needed
- Existing plans checked
- kata-planner spawned with context (including RESEARCH.md if available)
- Plans created (PLANNING COMPLETE or CHECKPOINT handled)
- kata-plan-checker spawned (unless --skip-verify)
- Verification passed OR user override OR max iterations with user decision
- GitHub issue updated with plan checklist (if github.enabled and issueMode != never)
- User sees status between agent spawns
- User knows next steps (execute or review) </success_criteria>
执行阶段{X} — 运行全部{N}个规划
/kata-execute-phase {X}
<sub>/clear first → 清空上下文窗口,获取全新环境</sub>
───────────────────────────────────────────────────────────────
其他可用操作:
- cat .planning/phases/{phase-dir}/*-PLAN.md — 查看规划内容
- /kata-plan-phase {X} --research — 先重新进行研究,再规划
───────────────────────────────────────────────────────────────
</offer_next>
<success_criteria>
- 已验证.planning/目录存在
- 已对照路线图验证阶段有效性
- 已按需创建阶段目录
- 已完成研究(除非使用--skip-research、--gaps或已有研究)
- 已在需要时启动kata-phase-researcher
- 已检查现有规划
- 已为kata-planner提供上下文(包括可用的RESEARCH.md)
- 已创建规划(PLANNING COMPLETE或已处理CHECKPOINT)
- 已启动kata-plan-checker(除非使用--skip-verify)
- 验证已通过,或用户已覆盖,或已达到最大迭代次数并获取用户决策
- 已更新GitHub问题的规划检查清单(若github.enabled为true且issueMode != never)
- 用户可查看代理启动间的状态
- 用户了解下一步操作(执行或查看规划) </success_criteria>