mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-10 02:24:35 +08:00
feat: Add interactive pre-flight checklists for ccw-loop and workflow-plan, including validation and task transformation steps
- Implemented `prep-loop.md` for ccw-loop, detailing source discovery, validation, task transformation, and auto-loop configuration. - Created `prep-plan.md` for workflow planning, covering environment checks, task quality assessment, execution preferences, and final confirmation. - Defined schemas and integration points for `prep-package.json` in both ccw-loop and workflow-plan skills, ensuring proper validation and task handling. - Added error handling mechanisms for various scenarios during the preparation phases.
This commit is contained in:
456
.codex/prompts/prep-loop.md
Normal file
456
.codex/prompts/prep-loop.md
Normal file
@@ -0,0 +1,456 @@
|
||||
---
|
||||
description: "Interactive pre-flight checklist for ccw-loop. Discovers JSONL from collaborative-plan-with-file, analyze-with-file, brainstorm-to-cycle sessions; validates, transforms to ccw-loop task format, writes prep-package.json + tasks.jsonl, then launches the loop."
|
||||
argument-hint: '[SOURCE="<path-to-tasks.jsonl-or-session-folder>"] [MAX_ITER=10]'
|
||||
---
|
||||
|
||||
# Pre-Flight Checklist for CCW Loop
|
||||
|
||||
You are an interactive preparation assistant. Your job is to discover and consume task artifacts from upstream planning/analysis/brainstorm skills, validate them, transform into ccw-loop's task format, and launch an **unattended** development loop. Follow each step sequentially. **Ask the user questions when information is missing.**
|
||||
|
||||
---
|
||||
|
||||
## Step 1: Source Discovery
|
||||
|
||||
### 1.1 Auto-Detect Available Sessions
|
||||
|
||||
Scan for upstream artifacts from the three supported source skills:
|
||||
|
||||
```javascript
|
||||
const projectRoot = Bash('git rev-parse --show-toplevel 2>/dev/null || pwd').trim()
|
||||
|
||||
// Source 1: collaborative-plan-with-file
|
||||
const cplanSessions = Glob(`${projectRoot}/.workflow/.planning/CPLAN-*/tasks.jsonl`)
|
||||
.map(p => ({
|
||||
path: p,
|
||||
source: 'collaborative-plan-with-file',
|
||||
type: 'jsonl',
|
||||
session: p.match(/CPLAN-[^/]+/)?.[0],
|
||||
mtime: fs.statSync(p).mtime
|
||||
}))
|
||||
|
||||
// Source 2: analyze-with-file
|
||||
const anlSessions = Glob(`${projectRoot}/.workflow/.analysis/ANL-*/tasks.jsonl`)
|
||||
.map(p => ({
|
||||
path: p,
|
||||
source: 'analyze-with-file',
|
||||
type: 'jsonl',
|
||||
session: p.match(/ANL-[^/]+/)?.[0],
|
||||
mtime: fs.statSync(p).mtime
|
||||
}))
|
||||
|
||||
// Source 3: brainstorm-to-cycle
|
||||
const bsSessions = Glob(`${projectRoot}/.workflow/.brainstorm/*/cycle-task.md`)
|
||||
.map(p => ({
|
||||
path: p,
|
||||
source: 'brainstorm-to-cycle',
|
||||
type: 'markdown',
|
||||
session: p.match(/\.brainstorm\/([^/]+)/)?.[1],
|
||||
mtime: fs.statSync(p).mtime
|
||||
}))
|
||||
|
||||
const allSources = [...cplanSessions, ...anlSessions, ...bsSessions]
|
||||
.sort((a, b) => b.mtime - a.mtime) // Most recent first
|
||||
```
|
||||
|
||||
### 1.2 Display Discovered Sources
|
||||
|
||||
```
|
||||
可用的上游任务源
|
||||
════════════════
|
||||
|
||||
collaborative-plan-with-file:
|
||||
1. CPLAN-auth-redesign-20260208 tasks.jsonl (5 tasks, 2h ago)
|
||||
2. CPLAN-api-cleanup-20260205 tasks.jsonl (3 days ago)
|
||||
|
||||
analyze-with-file:
|
||||
3. ANL-perf-audit-20260207 tasks.jsonl (8 tasks, 1d ago)
|
||||
|
||||
brainstorm-to-cycle:
|
||||
4. BS-notification-system cycle-task.md (1d ago)
|
||||
|
||||
手动输入:
|
||||
5. 自定义路径 (输入 JSONL 文件路径或任务描述)
|
||||
```
|
||||
|
||||
### 1.3 User Selection
|
||||
|
||||
Ask the user to select a source:
|
||||
|
||||
> "请选择任务来源(输入编号),或输入 JSONL 文件的完整路径:
|
||||
> 也可以输入 'manual' 手动输入任务描述(不使用上游 JSONL)"
|
||||
|
||||
**If `$SOURCE` argument provided**, skip discovery and use directly:
|
||||
|
||||
```javascript
|
||||
if (options.SOURCE) {
|
||||
// Validate path exists
|
||||
if (!fs.existsSync(options.SOURCE)) {
|
||||
console.error(`文件不存在: ${options.SOURCE}`)
|
||||
return
|
||||
}
|
||||
selectedSource = {
|
||||
path: options.SOURCE,
|
||||
source: inferSource(options.SOURCE),
|
||||
type: options.SOURCE.endsWith('.jsonl') ? 'jsonl' : 'markdown'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 2: Source Validation & Task Loading
|
||||
|
||||
### 2.1 For JSONL Sources (collaborative-plan / analyze-with-file)
|
||||
|
||||
```javascript
|
||||
function validateAndLoadJsonl(jsonlPath) {
|
||||
const content = Read(jsonlPath)
|
||||
const lines = content.trim().split('\n').filter(l => l.trim())
|
||||
const tasks = []
|
||||
const errors = []
|
||||
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
try {
|
||||
const task = JSON.parse(lines[i])
|
||||
|
||||
// Required fields check
|
||||
const requiredFields = ['id', 'title', 'description']
|
||||
const missing = requiredFields.filter(f => !task[f])
|
||||
if (missing.length > 0) {
|
||||
errors.push(`Line ${i + 1}: missing fields: ${missing.join(', ')}`)
|
||||
continue
|
||||
}
|
||||
|
||||
// Validate task structure
|
||||
if (task.id && task.title && task.description) {
|
||||
tasks.push(task)
|
||||
}
|
||||
} catch (e) {
|
||||
errors.push(`Line ${i + 1}: invalid JSON: ${e.message}`)
|
||||
}
|
||||
}
|
||||
|
||||
return { tasks, errors, total_lines: lines.length }
|
||||
}
|
||||
```
|
||||
|
||||
Display validation results:
|
||||
|
||||
```
|
||||
JSONL 验证
|
||||
══════════
|
||||
文件: .workflow/.planning/CPLAN-auth-redesign-20260208/tasks.jsonl
|
||||
来源: collaborative-plan-with-file
|
||||
|
||||
✓ 5/5 行解析成功
|
||||
✓ 必需字段完整 (id, title, description)
|
||||
✓ 3 个任务含收敛标准 (convergence)
|
||||
⚠ 2 个任务缺少收敛标准 (将使用默认)
|
||||
|
||||
任务列表:
|
||||
TASK-001 [high] Implement JWT token service (feature, 3 files)
|
||||
TASK-002 [high] Add OAuth2 Google strategy (feature, 2 files)
|
||||
TASK-003 [medium] Create user session middleware (feature, 4 files)
|
||||
TASK-004 [low] Add rate limiting to auth endpoints (enhancement, 2 files)
|
||||
TASK-005 [low] Write integration tests (testing, 5 files)
|
||||
```
|
||||
|
||||
### 2.2 For Markdown Sources (brainstorm-to-cycle)
|
||||
|
||||
```javascript
|
||||
function loadBrainstormTask(mdPath) {
|
||||
const content = Read(mdPath)
|
||||
|
||||
// Extract enriched task description from cycle-task.md
|
||||
// Format: # Generated Task \n\n **Idea**: ... \n\n --- \n\n {enrichedTask}
|
||||
const taskMatch = content.match(/---\s*\n([\s\S]+)$/)
|
||||
const enrichedTask = taskMatch ? taskMatch[1].trim() : content
|
||||
|
||||
// Parse into a single composite task
|
||||
return {
|
||||
tasks: [{
|
||||
id: 'TASK-001',
|
||||
title: extractTitle(content),
|
||||
description: enrichedTask,
|
||||
type: 'feature',
|
||||
priority: 'high',
|
||||
effort: 'large',
|
||||
source: { tool: 'brainstorm-to-cycle', path: mdPath }
|
||||
}],
|
||||
errors: [],
|
||||
is_composite: true // Single large task from brainstorm
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Display:
|
||||
|
||||
```
|
||||
Brainstorm 任务加载
|
||||
══════════════════
|
||||
文件: .workflow/.brainstorm/notification-system/cycle-task.md
|
||||
来源: brainstorm-to-cycle
|
||||
|
||||
ℹ 脑暴输出为复合任务描述(非结构化 JSONL)
|
||||
标题: Build real-time notification system
|
||||
类型: feature (composite)
|
||||
|
||||
是否需要将其拆分为多个子任务?(Y/n)
|
||||
```
|
||||
|
||||
If user selects **Y** (split), analyze the task description and generate sub-tasks:
|
||||
|
||||
```javascript
|
||||
// Analyze and decompose the composite task into 3-7 sub-tasks
|
||||
// Use mcp__ace-tool__search_context to find relevant patterns
|
||||
// Generate structured tasks with convergence criteria
|
||||
```
|
||||
|
||||
If user selects **n** (keep as single), use as-is.
|
||||
|
||||
### 2.3 Validation Gate
|
||||
|
||||
If validation has errors:
|
||||
|
||||
```
|
||||
⚠ 验证发现 {N} 个问题:
|
||||
Line 3: missing fields: description
|
||||
Line 7: invalid JSON
|
||||
|
||||
选项:
|
||||
1. 跳过有问题的行,继续 ({valid_count} 个有效任务)
|
||||
2. 取消,手动修复后重试
|
||||
```
|
||||
|
||||
**Block if 0 valid tasks.** Warn and continue if some tasks invalid.
|
||||
|
||||
---
|
||||
|
||||
## Step 3: Task Transformation
|
||||
|
||||
Transform unified JSONL tasks → ccw-loop `develop.tasks[]` format.
|
||||
|
||||
```javascript
|
||||
function transformToCcwLoopTasks(sourceTasks) {
|
||||
const now = getUtc8ISOString()
|
||||
|
||||
return sourceTasks.map((task, index) => ({
|
||||
// Core fields (ccw-loop native)
|
||||
id: task.id || `task-${String(index + 1).padStart(3, '0')}`,
|
||||
description: task.title
|
||||
? `${task.title}: ${task.description}`
|
||||
: task.description,
|
||||
tool: inferTool(task), // 'gemini' | 'qwen' | 'codex'
|
||||
mode: 'write',
|
||||
status: 'pending',
|
||||
priority: mapPriority(task.priority), // 1 (high) | 2 (medium) | 3 (low)
|
||||
files_changed: (task.files || []).map(f => f.path || f),
|
||||
created_at: now,
|
||||
completed_at: null,
|
||||
|
||||
// Extended fields (preserved from source for agent reference)
|
||||
_source: task.source || { tool: 'manual' },
|
||||
_convergence: task.convergence || null,
|
||||
_type: task.type || 'feature',
|
||||
_effort: task.effort || 'medium',
|
||||
_depends_on: task.depends_on || []
|
||||
}))
|
||||
}
|
||||
|
||||
function inferTool(task) {
|
||||
// Default to gemini for write tasks
|
||||
return 'gemini'
|
||||
}
|
||||
|
||||
function mapPriority(priority) {
|
||||
switch (priority) {
|
||||
case 'high': case 'critical': return 1
|
||||
case 'medium': return 2
|
||||
case 'low': return 3
|
||||
default: return 2
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Display transformed tasks:
|
||||
|
||||
```
|
||||
任务转换
|
||||
════════
|
||||
源格式: unified JSONL (collaborative-plan-with-file)
|
||||
目标格式: ccw-loop develop.tasks
|
||||
|
||||
task-001 [P1] Implement JWT token service: Create JWT service... gemini/write pending
|
||||
task-002 [P1] Add OAuth2 Google strategy: Implement passport... gemini/write pending
|
||||
task-003 [P2] Create user session middleware: Add Express... gemini/write pending
|
||||
task-004 [P3] Add rate limiting to auth endpoints: Implement... gemini/write pending
|
||||
task-005 [P3] Write integration tests: Create test suite... gemini/write pending
|
||||
|
||||
共 5 个任务 (2 high, 1 medium, 2 low)
|
||||
```
|
||||
|
||||
### 3.1 Task Reordering (Optional)
|
||||
|
||||
Ask: "是否需要调整任务顺序或移除某些任务?(输入编号排列如 '1,3,2,5' 或回车保持当前顺序)"
|
||||
|
||||
---
|
||||
|
||||
## Step 4: Auto-Loop Configuration
|
||||
|
||||
### 4.1 Present Defaults
|
||||
|
||||
```
|
||||
自动循环配置
|
||||
════════════
|
||||
模式: 全自动 (develop → debug → validate → complete)
|
||||
最大迭代: $MAX_ITER (默认 10)
|
||||
超时: 10 分钟/action
|
||||
|
||||
收敛标准 (从源任务汇总):
|
||||
${tasksWithConvergence} 个任务含收敛标准 → 自动验证
|
||||
${tasksWithoutConvergence} 个任务无收敛标准 → 使用默认 (测试通过)
|
||||
|
||||
需要调整参数吗?(直接回车使用默认值)
|
||||
```
|
||||
|
||||
### 4.2 Customization (if requested)
|
||||
|
||||
> "请选择要调整的项目:
|
||||
> 1. 最大迭代次数 (当前: 10)
|
||||
> 2. 每个 action 超时 (当前: 10 分钟)
|
||||
> 3. 全部使用默认值"
|
||||
|
||||
---
|
||||
|
||||
## Step 5: Final Confirmation
|
||||
|
||||
```
|
||||
══════════════════════════════════════════════
|
||||
Pre-Flight 检查完成
|
||||
══════════════════════════════════════════════
|
||||
|
||||
来源: collaborative-plan-with-file (CPLAN-auth-redesign-20260208)
|
||||
任务数: 5 个 (2 high, 1 medium, 2 low)
|
||||
验证: ✓ 5/5 任务格式正确
|
||||
收敛: 3/5 任务含收敛标准
|
||||
自动模式: ON (最多 10 次迭代)
|
||||
|
||||
任务摘要:
|
||||
1. [P1] Implement JWT token service
|
||||
2. [P1] Add OAuth2 Google strategy
|
||||
3. [P2] Create user session middleware
|
||||
4. [P3] Add rate limiting to auth endpoints
|
||||
5. [P3] Write integration tests
|
||||
|
||||
══════════════════════════════════════════════
|
||||
```
|
||||
|
||||
Ask: "确认启动?(Y/n)"
|
||||
- If **Y** → proceed to Step 6
|
||||
- If **n** → ask which part to revise
|
||||
|
||||
---
|
||||
|
||||
## Step 6: Write Artifacts
|
||||
|
||||
### 6.1 Write prep-package.json
|
||||
|
||||
Write to `{projectRoot}/.workflow/.loop/prep-package.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"generated_at": "{ISO8601_UTC+8}",
|
||||
"prep_status": "ready",
|
||||
"target_skill": "ccw-loop",
|
||||
|
||||
"environment": {
|
||||
"project_root": "{projectRoot}",
|
||||
"tech_stack": "{detected tech stack}",
|
||||
"test_framework": "{detected test framework}"
|
||||
},
|
||||
|
||||
"source": {
|
||||
"tool": "collaborative-plan-with-file",
|
||||
"session_id": "CPLAN-auth-redesign-20260208",
|
||||
"jsonl_path": "{projectRoot}/.workflow/.planning/CPLAN-auth-redesign-20260208/tasks.jsonl",
|
||||
"task_count": 5,
|
||||
"tasks_with_convergence": 3
|
||||
},
|
||||
|
||||
"tasks": {
|
||||
"total": 5,
|
||||
"by_priority": { "high": 2, "medium": 1, "low": 2 },
|
||||
"by_type": { "feature": 3, "enhancement": 1, "testing": 1 }
|
||||
},
|
||||
|
||||
"auto_loop": {
|
||||
"enabled": true,
|
||||
"no_confirmation": true,
|
||||
"max_iterations": 10,
|
||||
"timeout_per_action_ms": 600000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 Write tasks.jsonl
|
||||
|
||||
Write transformed tasks to `{projectRoot}/.workflow/.loop/prep-tasks.jsonl` (ccw-loop format):
|
||||
|
||||
```javascript
|
||||
const jsonlContent = transformedTasks.map(t => JSON.stringify(t)).join('\n')
|
||||
Write(`${projectRoot}/.workflow/.loop/prep-tasks.jsonl`, jsonlContent)
|
||||
```
|
||||
|
||||
Confirm:
|
||||
|
||||
```
|
||||
✓ prep-package.json → .workflow/.loop/prep-package.json
|
||||
✓ prep-tasks.jsonl → .workflow/.loop/prep-tasks.jsonl
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 7: Launch Loop
|
||||
|
||||
Invoke the skill:
|
||||
|
||||
```
|
||||
$ccw-loop --auto TASK="Execute tasks from {source.tool} session {source.session_id}"
|
||||
```
|
||||
|
||||
其中:
|
||||
- `$ccw-loop` — 展开为 skill 调用
|
||||
- `--auto` — 启用全自动模式
|
||||
- Skill 端会检测 `prep-package.json` 并加载 `prep-tasks.jsonl`
|
||||
|
||||
**Skill 端会做以下检查**(见 Phase 1 Step 1.1):
|
||||
1. 检测 `prep-package.json` 是否存在
|
||||
2. 验证 `prep_status === "ready"`
|
||||
3. 验证 `target_skill === "ccw-loop"`
|
||||
4. 校验 `project_root` 与当前项目一致
|
||||
5. 校验文件时效(24h 内生成)
|
||||
6. 验证 `prep-tasks.jsonl` 存在且可读
|
||||
7. 全部通过 → 加载预构建任务列表;任一失败 → 回退到默认 INIT 行为
|
||||
|
||||
Print:
|
||||
|
||||
```
|
||||
启动 ccw-loop (自动模式)...
|
||||
prep-package.json → Phase 1 自动加载并校验
|
||||
prep-tasks.jsonl → 5 个预构建任务加载到 develop.tasks
|
||||
循环: develop → validate → complete (最多 10 次迭代)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Error Handling
|
||||
|
||||
| 情况 | 处理 |
|
||||
|------|------|
|
||||
| 无可用上游会话 | 提示用户先运行 collaborative-plan / analyze-with-file / brainstorm,或选择手动输入 |
|
||||
| JSONL 格式全部无效 | 报告错误,**不启动 loop** |
|
||||
| JSONL 部分无效 | 警告无效行,用有效任务继续 |
|
||||
| brainstorm cycle-task.md 为空 | 报告错误,建议完成 brainstorm 流程 |
|
||||
| 用户取消确认 | 保存 prep-package.json (prep_status="cancelled"),提示可修改后重新运行 |
|
||||
| Skill 端 prep-package 校验失败 | Skill 打印警告,回退到无 prep 的默认 INIT 行为(不阻塞执行) |
|
||||
Reference in New Issue
Block a user