mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-13 02:41:50 +08:00
Fix session management location inference and ccw command usage
This commit addresses multiple issues in session management and command documentation: Session Management Fixes: - Add auto-inference of location from type parameter in session.ts - When --type lite-plan/lite-fix is specified, automatically set location accordingly - Preserve explicit --location parameter when provided - Update session-manager.ts to support type-based location inference - Fix metadata filename selection (session-metadata.json vs workflow-session.json) Command Documentation Fixes: - Add missing --mode analysis parameter (3 locations): * commands/memory/docs.md * commands/workflow/lite-execute.md (2 instances) - Add missing --mode write parameter (4 locations): * commands/workflow/tools/task-generate-agent.md - Remove non-existent subcommands (3 locations): * commands/workflow/session/complete.md (manifest, project) - Update session command syntax to use simplified format: * Changed from 'ccw session manifest read' to 'test -f' checks * Changed from 'ccw session project read' to 'test -f' checks Documentation Updates: - Update lite-plan.md and lite-fix.md to use --type parameter - Update session/start.md to document lite-plan and lite-fix types - Sync all fixes to skills/command-guide/reference directory (84 files) All ccw command usage across the codebase is now consistent and correct. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -149,7 +149,7 @@ Parse user input (supports: number "1", full ID "WFS-auth-system", or partial "a
|
||||
|
||||
#### Step 1.3: Load Session Metadata
|
||||
```bash
|
||||
ccw session read ${sessionId} --type session
|
||||
ccw session ${sessionId} read workflow-session.json
|
||||
```
|
||||
|
||||
**Output**: Store session metadata in memory
|
||||
|
||||
@@ -473,10 +473,10 @@ Detailed plan: ${executionContext.session.artifacts.plan}`)
|
||||
return prompt
|
||||
}
|
||||
|
||||
ccw cli exec "${buildCLIPrompt(batch)}" --tool codex --mode auto
|
||||
ccw cli exec "${buildCLIPrompt(batch)}" --tool codex --mode write
|
||||
```
|
||||
|
||||
**Execution with tracking**:
|
||||
**Execution with fixed IDs** (predictable ID pattern):
|
||||
```javascript
|
||||
// Launch CLI in foreground (NOT background)
|
||||
// Timeout based on complexity: Low=40min, Medium=60min, High=100min
|
||||
@@ -486,15 +486,48 @@ const timeoutByComplexity = {
|
||||
"High": 6000000 // 100 minutes
|
||||
}
|
||||
|
||||
// Generate fixed execution ID: ${sessionId}-${groupId}
|
||||
// This enables predictable ID lookup without relying on resume context chains
|
||||
const sessionId = executionContext?.session?.id || 'standalone'
|
||||
const fixedExecutionId = `${sessionId}-${batch.groupId}` // e.g., "implement-auth-2025-12-13-P1"
|
||||
|
||||
// Check if resuming from previous failed execution
|
||||
const previousCliId = batch.resumeFromCliId || null
|
||||
|
||||
// Build command with fixed ID (and optional resume for continuation)
|
||||
const cli_command = previousCliId
|
||||
? `ccw cli exec "${buildCLIPrompt(batch)}" --tool codex --mode write --id ${fixedExecutionId} --resume ${previousCliId}`
|
||||
: `ccw cli exec "${buildCLIPrompt(batch)}" --tool codex --mode write --id ${fixedExecutionId}`
|
||||
|
||||
bash_result = Bash(
|
||||
command=cli_command,
|
||||
timeout=timeoutByComplexity[planObject.complexity] || 3600000
|
||||
)
|
||||
|
||||
// Execution ID is now predictable: ${fixedExecutionId}
|
||||
// Can also extract from output: "ID: implement-auth-2025-12-13-P1"
|
||||
const cliExecutionId = fixedExecutionId
|
||||
|
||||
// Update TodoWrite when execution completes
|
||||
```
|
||||
|
||||
**Result Collection**: After completion, analyze output and collect result following `executionResult` structure
|
||||
**Resume on Failure** (with fixed ID):
|
||||
```javascript
|
||||
// If execution failed or timed out, offer resume option
|
||||
if (bash_result.status === 'failed' || bash_result.status === 'timeout') {
|
||||
console.log(`
|
||||
⚠️ Execution incomplete. Resume available:
|
||||
Fixed ID: ${fixedExecutionId}
|
||||
Lookup: ccw cli detail ${fixedExecutionId}
|
||||
Resume: ccw cli exec "Continue tasks" --resume ${fixedExecutionId} --tool codex --mode write --id ${fixedExecutionId}-retry
|
||||
`)
|
||||
|
||||
// Store for potential retry in same session
|
||||
batch.resumeFromCliId = fixedExecutionId
|
||||
}
|
||||
```
|
||||
|
||||
**Result Collection**: After completion, analyze output and collect result following `executionResult` structure (include `cliExecutionId` for resume capability)
|
||||
|
||||
### Step 4: Progress Tracking
|
||||
|
||||
@@ -541,15 +574,30 @@ RULES: $(cat ~/.claude/workflows/cli-templates/prompts/analysis/02-review-code-q
|
||||
# - Report findings directly
|
||||
|
||||
# Method 2: Gemini Review (recommended)
|
||||
ccw cli exec "[Shared Prompt Template with artifacts]" --tool gemini
|
||||
ccw cli exec "[Shared Prompt Template with artifacts]" --tool gemini --mode analysis
|
||||
# CONTEXT includes: @**/* @${plan.json} [@${exploration.json}]
|
||||
|
||||
# Method 3: Qwen Review (alternative)
|
||||
ccw cli exec "[Shared Prompt Template with artifacts]" --tool qwen
|
||||
ccw cli exec "[Shared Prompt Template with artifacts]" --tool qwen --mode analysis
|
||||
# Same prompt as Gemini, different execution engine
|
||||
|
||||
# Method 4: Codex Review (autonomous)
|
||||
ccw cli exec "[Verify plan acceptance criteria at ${plan.json}]" --tool codex --mode auto
|
||||
ccw cli exec "[Verify plan acceptance criteria at ${plan.json}]" --tool codex --mode write
|
||||
```
|
||||
|
||||
**Multi-Round Review with Fixed IDs**:
|
||||
```javascript
|
||||
// Generate fixed review ID
|
||||
const reviewId = `${sessionId}-review`
|
||||
|
||||
// First review pass with fixed ID
|
||||
const reviewResult = Bash(`ccw cli exec "[Review prompt]" --tool gemini --mode analysis --id ${reviewId}`)
|
||||
|
||||
// If issues found, continue review dialog with fixed ID chain
|
||||
if (hasUnresolvedIssues(reviewResult)) {
|
||||
// Resume with follow-up questions
|
||||
Bash(`ccw cli exec "Clarify the security concerns you mentioned" --resume ${reviewId} --tool gemini --mode analysis --id ${reviewId}-followup`)
|
||||
}
|
||||
```
|
||||
|
||||
**Implementation Note**: Replace `[Shared Prompt Template with artifacts]` placeholder with actual template content, substituting:
|
||||
@@ -623,8 +671,10 @@ console.log(`✓ Development index: [${category}] ${entry.title}`)
|
||||
| Empty file | File exists but no content | Error: "File is empty: {path}. Provide task description." |
|
||||
| Invalid Enhanced Task JSON | JSON missing required fields | Warning: "Missing required fields. Treating as plain text." |
|
||||
| Malformed JSON | JSON parsing fails | Treat as plain text (expected for non-JSON files) |
|
||||
| Execution failure | Agent/Codex crashes | Display error, save partial progress, suggest retry |
|
||||
| Execution failure | Agent/Codex crashes | Display error, use fixed ID `${sessionId}-${groupId}` for resume: `ccw cli exec "Continue" --resume <fixed-id> --id <fixed-id>-retry` |
|
||||
| Execution timeout | CLI exceeded timeout | Use fixed ID for resume with extended timeout |
|
||||
| Codex unavailable | Codex not installed | Show installation instructions, offer Agent execution |
|
||||
| Fixed ID not found | Custom ID lookup failed | Check `ccw cli history`, verify date directories |
|
||||
|
||||
## Data Structures
|
||||
|
||||
@@ -679,8 +729,20 @@ Collected after each execution call completes:
|
||||
tasksSummary: string, // Brief description of tasks handled
|
||||
completionSummary: string, // What was completed
|
||||
keyOutputs: string, // Files created/modified, key changes
|
||||
notes: string // Important context for next execution
|
||||
notes: string, // Important context for next execution
|
||||
fixedCliId: string | null // Fixed CLI execution ID (e.g., "implement-auth-2025-12-13-P1")
|
||||
}
|
||||
```
|
||||
|
||||
Appended to `previousExecutionResults` array for context continuity in multi-execution scenarios.
|
||||
|
||||
**Fixed ID Pattern**: `${sessionId}-${groupId}` enables predictable lookup without auto-generated timestamps.
|
||||
|
||||
**Resume Usage**: If `status` is "partial" or "failed", use `fixedCliId` to resume:
|
||||
```bash
|
||||
# Lookup previous execution
|
||||
ccw cli detail ${fixedCliId}
|
||||
|
||||
# Resume with new fixed ID for retry
|
||||
ccw cli exec "Continue from where we left off" --resume ${fixedCliId} --tool codex --mode write --id ${fixedCliId}-retry
|
||||
```
|
||||
|
||||
@@ -72,17 +72,60 @@ Phase 5: Dispatch
|
||||
### Phase 1: Intelligent Multi-Angle Diagnosis
|
||||
|
||||
**Session Setup** (MANDATORY - follow exactly):
|
||||
|
||||
**Option 1: Using CLI Command** (Recommended for simplicity):
|
||||
```bash
|
||||
# Generate session ID
|
||||
bug_slug=$(echo "${bug_description}" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]' '-' | cut -c1-40)
|
||||
date_str=$(date -u '+%Y-%m-%d')
|
||||
session_id="${bug_slug}-${date_str}"
|
||||
|
||||
# Initialize lite-fix session (location auto-inferred from type)
|
||||
ccw session init "${session_id}" \
|
||||
--type lite-fix \
|
||||
--content "{\"description\":\"${bug_description}\",\"severity\":\"${severity}\"}"
|
||||
|
||||
|
||||
|
||||
# Get session folder
|
||||
session_folder=".workflow/.lite-fix/${session_id}"
|
||||
echo "Session initialized: ${session_id} at ${session_folder}"
|
||||
```
|
||||
|
||||
**Option 2: Using session_manager Tool** (For programmatic access):
|
||||
```javascript
|
||||
// Helper: Get UTC+8 (China Standard Time) ISO string
|
||||
const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
|
||||
|
||||
const bugSlug = bug_description.toLowerCase().replace(/[^a-z0-9]+/g, '-').substring(0, 40)
|
||||
const dateStr = getUtc8ISOString().substring(0, 10) // Format: 2025-11-29
|
||||
const dateStr = getUtc8ISOString().substring(0, 10) // Format: 2025-12-17
|
||||
|
||||
const sessionId = `${bugSlug}-${dateStr}` // e.g., "user-avatar-upload-fails-2025-11-29"
|
||||
const sessionFolder = `.workflow/.lite-fix/${sessionId}`
|
||||
const sessionId = `${bugSlug}-${dateStr}` // e.g., "user-avatar-upload-fails-2025-12-17"
|
||||
|
||||
bash(`mkdir -p ${sessionFolder} && test -d ${sessionFolder} && echo "SUCCESS: ${sessionFolder}" || echo "FAILED: ${sessionFolder}"`)
|
||||
|
||||
|
||||
const sessionFolder = initResult.result.path
|
||||
console.log(`Session initialized: ${sessionId} at ${sessionFolder}`)
|
||||
```
|
||||
|
||||
**Session File Structure**:
|
||||
- `session-metadata.json` - Session metadata (created at init, contains description, severity, status)
|
||||
- `fix-plan.json` - Actual fix planning content (created later in Phase 3, contains fix tasks, diagnosis results)
|
||||
|
||||
**Metadata Field Usage**:
|
||||
- `description`: Displayed in dashboard session list (replaces session ID as title)
|
||||
- `severity`: Used for fix planning strategy selection (Low/Medium → Direct Claude, High/Critical → Agent)
|
||||
- `created_at`: Displayed in dashboard timeline
|
||||
- `status`: Updated through workflow (diagnosing → fixing → completed)
|
||||
- Custom fields: Any additional fields in metadata are saved and accessible programmatically
|
||||
|
||||
**Accessing Session Data**:
|
||||
```bash
|
||||
# Read session metadata
|
||||
ccw session ${session_id} read session-metadata.json
|
||||
|
||||
# Read fix plan content (after Phase 3 completion)
|
||||
ccw session ${session_id} read fix-plan.json
|
||||
```
|
||||
|
||||
**Diagnosis Decision Logic**:
|
||||
|
||||
@@ -72,17 +72,57 @@ Phase 5: Dispatch
|
||||
### Phase 1: Intelligent Multi-Angle Exploration
|
||||
|
||||
**Session Setup** (MANDATORY - follow exactly):
|
||||
|
||||
**Option 1: Using CLI Command** (Recommended for simplicity):
|
||||
```bash
|
||||
# Generate session ID
|
||||
task_slug=$(echo "${task_description}" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]' '-' | cut -c1-40)
|
||||
date_str=$(date -u '+%Y-%m-%d')
|
||||
session_id="${task_slug}-${date_str}"
|
||||
|
||||
# Initialize lite-plan session (location auto-inferred from type)
|
||||
ccw session init "${session_id}" \
|
||||
--type lite-plan \
|
||||
--content "{\"description\":\"${task_description}\",\"complexity\":\"${complexity}\"}"
|
||||
|
||||
# Get session folder
|
||||
session_folder=".workflow/.lite-plan/${session_id}"
|
||||
echo "Session initialized: ${session_id} at ${session_folder}"
|
||||
```
|
||||
|
||||
**Option 2: Using session_manager Tool** (For programmatic access):
|
||||
```javascript
|
||||
// Helper: Get UTC+8 (China Standard Time) ISO string
|
||||
const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
|
||||
|
||||
const taskSlug = task_description.toLowerCase().replace(/[^a-z0-9]+/g, '-').substring(0, 40)
|
||||
const dateStr = getUtc8ISOString().substring(0, 10) // Format: 2025-11-29
|
||||
const dateStr = getUtc8ISOString().substring(0, 10) // Format: 2025-12-17
|
||||
|
||||
const sessionId = `${taskSlug}-${dateStr}` // e.g., "implement-jwt-refresh-2025-11-29"
|
||||
const sessionFolder = `.workflow/.lite-plan/${sessionId}`
|
||||
const sessionId = `${taskSlug}-${dateStr}` // e.g., "implement-jwt-refresh-2025-12-17"
|
||||
|
||||
bash(`mkdir -p ${sessionFolder} && test -d ${sessionFolder} && echo "SUCCESS: ${sessionFolder}" || echo "FAILED: ${sessionFolder}"`)
|
||||
|
||||
|
||||
const sessionFolder = initResult.result.path
|
||||
console.log(`Session initialized: ${sessionId} at ${sessionFolder}`)
|
||||
```
|
||||
|
||||
**Session File Structure**:
|
||||
- `session-metadata.json` - Session metadata (created at init, contains description, complexity, status)
|
||||
- `plan.json` - Actual planning content (created later in Phase 3, contains tasks, steps, dependencies)
|
||||
|
||||
**Metadata Field Usage**:
|
||||
- `description`: Displayed in dashboard session list (replaces session ID as title)
|
||||
- `complexity`: Used for planning strategy selection (Low → Direct Claude, Medium/High → Agent)
|
||||
- `created_at`: Displayed in dashboard timeline
|
||||
- Custom fields: Any additional fields in metadata are saved and accessible programmatically
|
||||
|
||||
**Accessing Session Data**:
|
||||
```bash
|
||||
# Read session metadata
|
||||
ccw session ${session_id} read session-metadata.json
|
||||
|
||||
# Read plan content (after Phase 3 completion)
|
||||
ccw session ${session_id} read plan.json
|
||||
```
|
||||
|
||||
**Exploration Decision Logic**:
|
||||
|
||||
@@ -112,14 +112,18 @@ After bash validation, the model takes control to:
|
||||
|
||||
1. **Load Context**: Read completed task summaries and changed files
|
||||
```bash
|
||||
# Load implementation summaries
|
||||
ccw session read ${sessionId} --type summary --raw
|
||||
# Load implementation summaries (iterate through .summaries/ directory)
|
||||
for summary in .workflow/active/${sessionId}/.summaries/*.md; do
|
||||
cat "$summary"
|
||||
done
|
||||
|
||||
# Load test results (if available)
|
||||
ccw session read ${sessionId} --type summary --filename "TEST-FIX-*.md" --raw 2>/dev/null
|
||||
for test_summary in .workflow/active/${sessionId}/.summaries/TEST-FIX-*.md 2>/dev/null; do
|
||||
cat "$test_summary"
|
||||
done
|
||||
|
||||
# Get session created_at for git log filter
|
||||
created_at=$(ccw session read ${sessionId} --type session --raw | jq -r .created_at)
|
||||
created_at=$(ccw session ${sessionId} read workflow-session.json | jq -r .created_at)
|
||||
git log --since="$created_at" --name-only --pretty=format: | sort -u
|
||||
```
|
||||
|
||||
@@ -170,11 +174,13 @@ After bash validation, the model takes control to:
|
||||
- Verify all requirements and acceptance criteria met:
|
||||
```bash
|
||||
# Load task requirements and acceptance criteria
|
||||
ccw session read ${sessionId} --type task --raw | jq -r '
|
||||
"Task: " + .id + "\n" +
|
||||
"Requirements: " + (.context.requirements | join(", ")) + "\n" +
|
||||
"Acceptance: " + (.context.acceptance | join(", "))
|
||||
'
|
||||
for task_file in .workflow/active/${sessionId}/.task/*.json; do
|
||||
cat "$task_file" | jq -r '
|
||||
"Task: " + .id + "\n" +
|
||||
"Requirements: " + (.context.requirements | join(", ")) + "\n" +
|
||||
"Acceptance: " + (.context.acceptance | join(", "))
|
||||
'
|
||||
done
|
||||
|
||||
# Check implementation summaries against requirements
|
||||
ccw cli exec "
|
||||
|
||||
@@ -34,7 +34,7 @@ ccw session list --location active
|
||||
#### Step 1.2: Check for Existing Archiving Marker (Resume Detection)
|
||||
```bash
|
||||
# Check if session is already being archived (marker file exists)
|
||||
ccw session read WFS-session-name --type process --filename .archiving 2>/dev/null && echo "RESUMING" || echo "NEW"
|
||||
ccw session WFS-session-name read .process/.archiving 2>/dev/null && echo "RESUMING" || echo "NEW"
|
||||
```
|
||||
|
||||
**If RESUMING**:
|
||||
@@ -47,7 +47,7 @@ ccw session read WFS-session-name --type process --filename .archiving 2>/dev/nu
|
||||
#### Step 1.3: Create Archiving Marker
|
||||
```bash
|
||||
# Mark session as "archiving in progress"
|
||||
ccw session write WFS-session-name --type process --filename .archiving --content ''
|
||||
ccw session WFS-session-name write .process/.archiving ''
|
||||
```
|
||||
**Purpose**:
|
||||
- Prevents concurrent operations on this session
|
||||
@@ -171,8 +171,8 @@ ccw session archive WFS-session-name
|
||||
|
||||
#### Step 3.2: Update Manifest
|
||||
```bash
|
||||
# Read current manifest using ccw (or create empty array if not exists)
|
||||
ccw session read manifest --type manifest --raw 2>/dev/null || echo "[]"
|
||||
# Check if manifest exists
|
||||
test -f .workflow/archives/manifest.json && echo "EXISTS" || echo "NOT_FOUND"
|
||||
```
|
||||
|
||||
**JSON Update Logic**:
|
||||
@@ -221,8 +221,8 @@ rm .workflow/archives/WFS-session-name/.process/.archiving 2>/dev/null || true
|
||||
|
||||
#### Step 4.1: Check Project State Exists
|
||||
```bash
|
||||
# Check project state using ccw
|
||||
ccw session read project --type project 2>/dev/null && echo "EXISTS" || echo "SKIP"
|
||||
# Check if project.json exists
|
||||
test -f .workflow/project.json && echo "EXISTS" || echo "SKIP"
|
||||
```
|
||||
|
||||
**If SKIP**: Output warning and skip Phase 4
|
||||
@@ -249,11 +249,6 @@ const featureId = title.toLowerCase().replace(/[^a-z0-9]+/g, '-').substring(0, 5
|
||||
|
||||
#### Step 4.3: Update project.json
|
||||
|
||||
```bash
|
||||
# Read current project state using ccw
|
||||
ccw session read project --type project --raw
|
||||
```
|
||||
|
||||
**JSON Update Logic**:
|
||||
```javascript
|
||||
// Read existing project.json (created by /workflow:init)
|
||||
|
||||
@@ -30,7 +30,7 @@ ccw session stats WFS-session
|
||||
|
||||
### Step 3: Read Session Metadata
|
||||
```bash
|
||||
ccw session read WFS-session --type session
|
||||
ccw session WFS-session read workflow-session.json
|
||||
# Returns: session_id, status, project, created_at, etc.
|
||||
```
|
||||
|
||||
@@ -39,8 +39,8 @@ ccw session read WFS-session --type session
|
||||
### Basic Operations
|
||||
- **List all sessions**: `ccw session list`
|
||||
- **List active only**: `ccw session list --location active`
|
||||
- **Read session data**: `ccw session read WFS-xxx --type session`
|
||||
- **Get task stats**: `ccw session stats WFS-xxx`
|
||||
- **Read session data**: `ccw session WFS-xxx read workflow-session.json`
|
||||
- **Get task stats**: `ccw session WFS-xxx stats`
|
||||
|
||||
## Simple Output Format
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ ccw session list --location active
|
||||
|
||||
### Step 2: Check Session Status
|
||||
```bash
|
||||
ccw session read WFS-session --type session
|
||||
ccw session WFS-session read workflow-session.json
|
||||
# Check .status field in response
|
||||
```
|
||||
|
||||
@@ -35,17 +35,15 @@ ccw session list --location active
|
||||
|
||||
### Step 4: Update Session Status to Active
|
||||
```bash
|
||||
ccw session status WFS-session active
|
||||
# Or with full update:
|
||||
ccw session update WFS-session --type session --content '{"status":"active","resumed_at":"2025-12-10T08:00:00Z"}'
|
||||
ccw session WFS-session status active
|
||||
```
|
||||
|
||||
## Simple Commands
|
||||
|
||||
### Basic Operations
|
||||
- **List sessions**: `ccw session list --location active`
|
||||
- **Check status**: `ccw session read WFS-xxx --type session`
|
||||
- **Update status**: `ccw session status WFS-xxx active`
|
||||
- **Check status**: `ccw session WFS-xxx read workflow-session.json`
|
||||
- **Update status**: `ccw session WFS-xxx status active`
|
||||
|
||||
### Resume Result
|
||||
```
|
||||
|
||||
@@ -30,10 +30,17 @@ The `--type` parameter classifies sessions for CCW dashboard organization:
|
||||
| `tdd` | TDD-based development | `/workflow:tdd-plan` |
|
||||
| `test` | Test generation/fix sessions | `/workflow:test-fix-gen` |
|
||||
| `docs` | Documentation sessions | `/memory:docs` |
|
||||
| `lite-plan` | Lightweight planning workflow | `/workflow:lite-plan` |
|
||||
| `lite-fix` | Lightweight bug fix workflow | `/workflow:lite-fix` |
|
||||
|
||||
**Special Behavior for `lite-plan` and `lite-fix`**:
|
||||
- These types automatically infer the storage location (`.workflow/.lite-plan/` or `.workflow/.lite-fix/`)
|
||||
- No need to specify `--location` parameter when using these types
|
||||
- Alternative: Use `--location lite-plan` or `--location lite-fix` directly
|
||||
|
||||
**Validation**: If `--type` is provided with invalid value, return error:
|
||||
```
|
||||
ERROR: Invalid session type. Valid types: workflow, review, tdd, test, docs
|
||||
ERROR: Invalid session type. Valid types: workflow, review, tdd, test, docs, lite-plan, lite-fix
|
||||
```
|
||||
|
||||
## Step 0: Initialize Project State (First-time Only)
|
||||
@@ -75,7 +82,7 @@ ccw session list --location active
|
||||
|
||||
### Step 2: Display Session Metadata
|
||||
```bash
|
||||
ccw session read WFS-promptmaster-platform --type session
|
||||
ccw session WFS-promptmaster-platform read workflow-session.json
|
||||
```
|
||||
|
||||
### Step 4: User Decision
|
||||
@@ -102,7 +109,7 @@ ccw session list --location active
|
||||
# Pattern: WFS-{lowercase-slug-from-description}
|
||||
|
||||
# Create session with ccw (creates directories + metadata atomically)
|
||||
ccw session init WFS-implement-oauth2-auth --type workflow --content '{"project":"implement OAuth2 auth","status":"planning"}'
|
||||
ccw session init WFS-implement-oauth2-auth --type workflow
|
||||
```
|
||||
|
||||
**Output**: `SESSION_ID: WFS-implement-oauth2-auth`
|
||||
@@ -113,7 +120,7 @@ ccw session init WFS-implement-oauth2-auth --type workflow --content '{"project"
|
||||
ccw session list --location active
|
||||
|
||||
# Read session metadata for relevance check
|
||||
ccw session read WFS-promptmaster-platform --type session
|
||||
ccw session WFS-promptmaster-platform read workflow-session.json
|
||||
|
||||
# If task contains project keywords → Reuse session
|
||||
# If task unrelated → Create new session (use Step 2a)
|
||||
@@ -149,10 +156,41 @@ ccw session list --location active
|
||||
|
||||
### Step 2: Create Session Structure
|
||||
```bash
|
||||
# Single command creates directories (.process, .task, .summaries) + metadata
|
||||
ccw session init WFS-fix-login-bug --type workflow --content '{"project":"fix login bug","status":"planning"}'
|
||||
# Basic init - creates directories + default metadata
|
||||
ccw session init WFS-fix-login-bug --type workflow
|
||||
|
||||
# Advanced init - with custom metadata
|
||||
ccw session init WFS-oauth-implementation --type workflow --content '{"description":"OAuth2 authentication system","priority":"high","complexity":"medium"}'
|
||||
```
|
||||
|
||||
**Default Metadata** (auto-generated):
|
||||
```json
|
||||
{
|
||||
"session_id": "WFS-fix-login-bug",
|
||||
"type": "workflow",
|
||||
"status": "planning",
|
||||
"created_at": "2025-12-17T..."
|
||||
}
|
||||
```
|
||||
|
||||
**Custom Metadata** (merged with defaults):
|
||||
```json
|
||||
{
|
||||
"session_id": "WFS-oauth-implementation",
|
||||
"type": "workflow",
|
||||
"status": "planning",
|
||||
"created_at": "2025-12-17T...",
|
||||
"description": "OAuth2 authentication system",
|
||||
"priority": "high",
|
||||
"complexity": "medium"
|
||||
}
|
||||
```
|
||||
|
||||
**Field Usage**:
|
||||
- `description`: Displayed in dashboard (replaces session_id as title)
|
||||
- `status`: Can override default "planning" (e.g., "active", "implementing")
|
||||
- Custom fields: Any additional fields are saved and accessible programmatically
|
||||
|
||||
**Output**: `SESSION_ID: WFS-fix-login-bug`
|
||||
|
||||
## Execution Guideline
|
||||
|
||||
@@ -77,18 +77,32 @@ find .workflow/active/ -name "WFS-*" -type d | head -1 | sed 's/.*\///'
|
||||
|
||||
```bash
|
||||
# Load all task JSONs
|
||||
ccw session read {sessionId} --type task
|
||||
for task_file in .workflow/active/{sessionId}/.task/*.json; do
|
||||
cat "$task_file"
|
||||
done
|
||||
|
||||
# Extract task IDs
|
||||
ccw session read {sessionId} --type task --raw | jq -r '.id'
|
||||
for task_file in .workflow/active/{sessionId}/.task/*.json; do
|
||||
cat "$task_file" | jq -r '.id'
|
||||
done
|
||||
|
||||
# Check dependencies - read tasks and filter for IMPL/REFACTOR
|
||||
ccw session read {sessionId} --type task --task-id "IMPL-*" --raw | jq -r '.context.depends_on[]?'
|
||||
ccw session read {sessionId} --type task --task-id "REFACTOR-*" --raw | jq -r '.context.depends_on[]?'
|
||||
for task_file in .workflow/active/{sessionId}/.task/IMPL-*.json; do
|
||||
cat "$task_file" | jq -r '.context.depends_on[]?'
|
||||
done
|
||||
|
||||
for task_file in .workflow/active/{sessionId}/.task/REFACTOR-*.json; do
|
||||
cat "$task_file" | jq -r '.context.depends_on[]?'
|
||||
done
|
||||
|
||||
# Check meta fields
|
||||
ccw session read {sessionId} --type task --raw | jq -r '.meta.tdd_phase'
|
||||
ccw session read {sessionId} --type task --raw | jq -r '.meta.agent'
|
||||
for task_file in .workflow/active/{sessionId}/.task/*.json; do
|
||||
cat "$task_file" | jq -r '.meta.tdd_phase'
|
||||
done
|
||||
|
||||
for task_file in .workflow/active/{sessionId}/.task/*.json; do
|
||||
cat "$task_file" | jq -r '.meta.agent'
|
||||
done
|
||||
```
|
||||
|
||||
**Validation**:
|
||||
@@ -139,7 +153,7 @@ EXPECTED:
|
||||
- Red-Green-Refactor cycle validation
|
||||
- Best practices adherence assessment
|
||||
RULES: Focus on TDD best practices and workflow adherence. Be specific about violations and improvements.
|
||||
" --tool gemini --cd project-root > .workflow/active/{sessionId}/TDD_COMPLIANCE_REPORT.md
|
||||
" --tool gemini --mode analysis --cd project-root > .workflow/active/{sessionId}/TDD_COMPLIANCE_REPORT.md
|
||||
```
|
||||
|
||||
**Output**: TDD_COMPLIANCE_REPORT.md
|
||||
|
||||
@@ -152,7 +152,7 @@ Task(subagent_type="cli-execution-agent", prompt=`
|
||||
- ModuleOverlap conflicts with overlap_analysis
|
||||
- Targeted clarification questions
|
||||
RULES: $(cat ~/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt) | Focus on breaking changes, migration needs, and functional overlaps | Prioritize exploration-identified conflicts | analysis=READ-ONLY
|
||||
" --tool gemini --cd {project_root}
|
||||
" --tool gemini --mode analysis --cd {project_root}
|
||||
|
||||
Fallback: Qwen (same prompt) → Claude (manual analysis)
|
||||
|
||||
|
||||
@@ -28,6 +28,12 @@ Input Parsing:
|
||||
├─ Parse flags: --session
|
||||
└─ Validation: session_id REQUIRED
|
||||
|
||||
Phase 0: User Configuration (Interactive)
|
||||
├─ Question 1: Supplementary materials/guidelines?
|
||||
├─ Question 2: Execution method preference (Agent/CLI/Hybrid)
|
||||
├─ Question 3: CLI tool preference (if CLI selected)
|
||||
└─ Store: userConfig for agent prompt
|
||||
|
||||
Phase 1: Context Preparation & Module Detection (Command)
|
||||
├─ Assemble session paths (metadata, context package, output dirs)
|
||||
├─ Provide metadata (session_id, execution_mode, mcp_capabilities)
|
||||
@@ -57,6 +63,82 @@ Phase 3: Integration (+1 Coordinator, Multi-Module Only)
|
||||
|
||||
## Document Generation Lifecycle
|
||||
|
||||
### Phase 0: User Configuration (Interactive)
|
||||
|
||||
**Purpose**: Collect user preferences before task generation to ensure generated tasks match execution expectations.
|
||||
|
||||
**User Questions**:
|
||||
```javascript
|
||||
AskUserQuestion({
|
||||
questions: [
|
||||
{
|
||||
question: "Do you have supplementary materials or guidelines to include?",
|
||||
header: "Materials",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "No additional materials", description: "Use existing context only" },
|
||||
{ label: "Provide file paths", description: "I'll specify paths to include" },
|
||||
{ label: "Provide inline content", description: "I'll paste content directly" }
|
||||
]
|
||||
},
|
||||
{
|
||||
question: "Select execution method for generated tasks:",
|
||||
header: "Execution",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "Agent (Recommended)", description: "Claude agent executes tasks directly" },
|
||||
{ label: "Hybrid", description: "Agent orchestrates, calls CLI for complex steps" },
|
||||
{ label: "CLI Only", description: "All execution via CLI tools (codex/gemini/qwen)" }
|
||||
]
|
||||
},
|
||||
{
|
||||
question: "If using CLI, which tool do you prefer?",
|
||||
header: "CLI Tool",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "Codex (Recommended)", description: "Best for implementation tasks" },
|
||||
{ label: "Gemini", description: "Best for analysis and large context" },
|
||||
{ label: "Qwen", description: "Alternative analysis tool" },
|
||||
{ label: "Auto", description: "Let agent decide per-task" }
|
||||
]
|
||||
}
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
**Handle Materials Response**:
|
||||
```javascript
|
||||
if (userConfig.materials === "Provide file paths") {
|
||||
// Follow-up question for file paths
|
||||
const pathsResponse = AskUserQuestion({
|
||||
questions: [{
|
||||
question: "Enter file paths to include (comma-separated or one per line):",
|
||||
header: "Paths",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "Enter paths", description: "Provide paths in text input" }
|
||||
]
|
||||
}]
|
||||
})
|
||||
userConfig.supplementaryPaths = parseUserPaths(pathsResponse)
|
||||
}
|
||||
```
|
||||
|
||||
**Build userConfig**:
|
||||
```javascript
|
||||
const userConfig = {
|
||||
supplementaryMaterials: {
|
||||
type: "none|paths|inline",
|
||||
content: [...], // Parsed paths or inline content
|
||||
},
|
||||
executionMethod: "agent|hybrid|cli",
|
||||
preferredCliTool: "codex|gemini|qwen|auto",
|
||||
enableResume: true // Always enable resume for CLI executions
|
||||
}
|
||||
```
|
||||
|
||||
**Pass to Agent**: Include `userConfig` in agent prompt for Phase 2A/2B.
|
||||
|
||||
### Phase 1: Context Preparation & Module Detection (Command Responsibility)
|
||||
|
||||
**Command prepares session paths, metadata, and detects module structure.**
|
||||
@@ -159,10 +241,21 @@ Output:
|
||||
Session ID: {session-id}
|
||||
MCP Capabilities: {exa_code, exa_web, code_index}
|
||||
|
||||
## USER CONFIGURATION (from Phase 0)
|
||||
Execution Method: ${userConfig.executionMethod} // agent|hybrid|cli
|
||||
Preferred CLI Tool: ${userConfig.preferredCliTool} // codex|gemini|qwen|auto
|
||||
Supplementary Materials: ${userConfig.supplementaryMaterials}
|
||||
|
||||
## CLI TOOL SELECTION
|
||||
Determine CLI tool usage per-step based on user's task description:
|
||||
- If user specifies "use Codex/Gemini/Qwen for X" → Add command field to relevant steps
|
||||
- Default: Agent execution (no command field) unless user explicitly requests CLI
|
||||
Based on userConfig.executionMethod:
|
||||
- "agent": No command field in implementation_approach steps
|
||||
- "hybrid": Add command field to complex steps only (agent handles simple steps)
|
||||
- "cli": Add command field to ALL implementation_approach steps
|
||||
|
||||
CLI Resume Support (MANDATORY for all CLI commands):
|
||||
- Use --resume parameter to continue from previous task execution
|
||||
- Read previous task's cliExecutionId from session state
|
||||
- Format: ccw cli exec "[prompt]" --resume ${previousCliId} --tool ${tool} --mode write
|
||||
|
||||
## EXPLORATION CONTEXT (from context-package.exploration_results)
|
||||
- Load exploration_results from context-package.json
|
||||
@@ -186,6 +279,7 @@ Determine CLI tool usage per-step based on user's task description:
|
||||
- Artifacts integration from context package
|
||||
- **focus_paths enhanced with exploration critical_files**
|
||||
- Flow control with pre_analysis steps (include exploration integration_points analysis)
|
||||
- **CLI Execution IDs and strategies (MANDATORY)**
|
||||
|
||||
2. Implementation Plan (IMPL_PLAN.md)
|
||||
- Context analysis and artifact references
|
||||
@@ -197,6 +291,27 @@ Determine CLI tool usage per-step based on user's task description:
|
||||
- Links to task JSONs and summaries
|
||||
- Matches task JSON hierarchy
|
||||
|
||||
## CLI EXECUTION ID REQUIREMENTS (MANDATORY)
|
||||
Each task JSON MUST include:
|
||||
- **cli_execution_id**: Unique ID for CLI execution (format: `{session_id}-{task_id}`)
|
||||
- **cli_execution**: Strategy object based on depends_on:
|
||||
- No deps → `{ "strategy": "new" }`
|
||||
- 1 dep (single child) → `{ "strategy": "resume", "resume_from": "parent-cli-id" }`
|
||||
- 1 dep (multiple children) → `{ "strategy": "fork", "resume_from": "parent-cli-id" }`
|
||||
- N deps → `{ "strategy": "merge_fork", "merge_from": ["id1", "id2", ...] }`
|
||||
|
||||
**CLI Execution Strategy Rules**:
|
||||
1. **new**: Task has no dependencies - starts fresh CLI conversation
|
||||
2. **resume**: Task has 1 parent AND that parent has only this child - continues same conversation
|
||||
3. **fork**: Task has 1 parent BUT parent has multiple children - creates new branch with parent context
|
||||
4. **merge_fork**: Task has multiple parents - merges all parent contexts into new conversation
|
||||
|
||||
**Execution Command Patterns**:
|
||||
- new: `ccw cli exec "[prompt]" --tool [tool] --mode write --id [cli_execution_id]`
|
||||
- resume: `ccw cli exec "[prompt]" --resume [resume_from] --tool [tool] --mode write`
|
||||
- fork: `ccw cli exec "[prompt]" --resume [resume_from] --id [cli_execution_id] --tool [tool] --mode write`
|
||||
- merge_fork: `ccw cli exec "[prompt]" --resume [merge_from.join(',')] --id [cli_execution_id] --tool [tool] --mode write`
|
||||
|
||||
## QUALITY STANDARDS
|
||||
Hard Constraints:
|
||||
- Task count <= 18 (hard limit - request re-scope if exceeded)
|
||||
|
||||
@@ -187,7 +187,7 @@ Task(subagent_type="ui-design-agent",
|
||||
CONTEXT: @**/*.css @**/*.scss @**/*.js @**/*.ts
|
||||
EXPECTED: JSON report listing conflicts with file:line, values, semantic context
|
||||
RULES: Focus on core tokens | Report ALL variants | analysis=READ-ONLY
|
||||
\" --tool gemini --cd ${source}
|
||||
\" --tool gemini --mode analysis --cd ${source}
|
||||
\`\`\`
|
||||
|
||||
**Step 1: Load file list**
|
||||
@@ -302,7 +302,7 @@ Task(subagent_type="ui-design-agent",
|
||||
CONTEXT: @**/*.css @**/*.scss @**/*.js @**/*.ts
|
||||
EXPECTED: JSON report listing frameworks, animation types, file locations
|
||||
RULES: Focus on framework consistency | Map all animations | analysis=READ-ONLY
|
||||
\" --tool gemini --cd ${source}
|
||||
\" --tool gemini --mode analysis --cd ${source}
|
||||
\`\`\`
|
||||
|
||||
**Step 1: Load file list**
|
||||
@@ -381,7 +381,7 @@ Task(subagent_type="ui-design-agent",
|
||||
CONTEXT: @**/*.css @**/*.scss @**/*.js @**/*.ts @**/*.html
|
||||
EXPECTED: JSON report categorizing components, layout patterns, naming conventions
|
||||
RULES: Focus on component reusability | Identify layout systems | analysis=READ-ONLY
|
||||
\" --tool gemini --cd ${source}
|
||||
\" --tool gemini --mode analysis --cd ${source}
|
||||
\`\`\`
|
||||
|
||||
**Step 1: Load file list**
|
||||
|
||||
Reference in New Issue
Block a user