Files
Claude-Code-Workflow/.codex/skills/ccw-loop/phases/01-session-init.md
catlog22 a4ea817a5f Add orchestration loop phase and workflow execution skill
- Implemented Phase 2: Orchestration Loop for CCW Loop, including executor agent spawning, main loop execution, and iteration management.
- Introduced helper functions for action result parsing and user interaction.
- Created new skill: workflow-execute, coordinating agent execution for workflow tasks with automatic session discovery, parallel task processing, and status tracking.
- Defined execution flow, key design principles, and error handling strategies for the workflow execution process.
2026-02-06 23:58:18 +08:00

3.3 KiB

Phase 1: Session Initialization

Create or resume a development loop, initialize state file and directory structure.

Objective

  • Parse user arguments (TASK, --loop-id, --auto)
  • Create new loop with unique ID OR resume existing loop
  • Initialize directory structure for progress files
  • Create master state file
  • Output: loopId, state, progressDir

Execution

Step 1.1: Parse Arguments

const { loopId: existingLoopId, task, mode = 'interactive' } = options

// Validate mutual exclusivity
if (!existingLoopId && !task) {
  console.error('Either --loop-id or task description is required')
  return { status: 'error', message: 'Missing loopId or task' }
}

// Determine mode
const executionMode = options['--auto'] ? 'auto' : 'interactive'

Step 1.2: Utility Functions

const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()

function readLoopState(loopId) {
  const stateFile = `.workflow/.loop/${loopId}.json`
  if (!fs.existsSync(stateFile)) {
    return null
  }
  return JSON.parse(Read(stateFile))
}

Step 1.3: New Loop Creation

When TASK is provided (no --loop-id):

// Generate unique loop ID
const timestamp = getUtc8ISOString().replace(/[-:]/g, '').split('.')[0]
const random = Math.random().toString(36).substring(2, 10)
const loopId = `loop-v2-${timestamp}-${random}`

console.log(`Creating new loop: ${loopId}`)

Create Directory Structure

mkdir -p .workflow/.loop/${loopId}.progress

Initialize State File

function createLoopState(loopId, taskDescription) {
  const stateFile = `.workflow/.loop/${loopId}.json`
  const now = getUtc8ISOString()

  const state = {
    // API compatible fields
    loop_id: loopId,
    title: taskDescription.substring(0, 100),
    description: taskDescription,
    max_iterations: 10,
    status: 'running',
    current_iteration: 0,
    created_at: now,
    updated_at: now,

    // Skill extension fields (initialized by INIT action)
    skill_state: null
  }

  Write(stateFile, JSON.stringify(state, null, 2))
  return state
}

Step 1.4: Resume Existing Loop

When --loop-id is provided:

const loopId = existingLoopId
const state = readLoopState(loopId)

if (!state) {
  console.error(`Loop not found: ${loopId}`)
  return { status: 'error', message: 'Loop not found' }
}

console.log(`Resuming loop: ${loopId}`)
console.log(`Status: ${state.status}`)

Step 1.5: Control Signal Check

Before proceeding, verify loop status allows continuation:

function checkControlSignals(loopId) {
  const state = readLoopState(loopId)

  switch (state?.status) {
    case 'paused':
      return { continue: false, action: 'pause_exit' }
    case 'failed':
      return { continue: false, action: 'stop_exit' }
    case 'running':
      return { continue: true, action: 'continue' }
    default:
      return { continue: false, action: 'stop_exit' }
  }
}

Output

  • Variable: loopId - Unique loop identifier
  • Variable: state - Initialized or resumed loop state object
  • Variable: progressDir - .workflow/.loop/${loopId}.progress
  • Variable: mode - 'interactive' or 'auto'
  • TodoWrite: Mark Phase 1 completed, Phase 2 in_progress

Next Phase

Return to orchestrator, then auto-continue to Phase 2: Orchestration Loop.