Files
Claude-Code-Workflow/.codex/skills/ccw-loop/phases/actions/action-complete.md
catlog22 2fb1d1243c feat: prioritize user config, do not merge default tools
Changed loadClaudeCliTools() to only load tools explicitly defined
in user config. Previously, DEFAULT_TOOLS_CONFIG.tools was spread
before user tools, causing all default tools to be loaded even if
not present in user config.

User config now has complete control over which tools are loaded.
2026-01-22 23:37:42 +08:00

6.3 KiB

Action: COMPLETE

Complete CCW Loop session and generate summary report.

Purpose

  • Generate completion report
  • Aggregate all phase results
  • Provide follow-up recommendations
  • Offer expansion to issues
  • Mark status as completed

Preconditions

  • state.status === 'running'
  • state.skill_state !== null

Execution Steps

Step 1: Verify Control Signals

const state = JSON.parse(Read(`.workflow/.loop/${loopId}.json`))

if (state.status !== 'running') {
  return {
    action: 'COMPLETE',
    status: 'failed',
    message: `Cannot complete: status is ${state.status}`,
    next_action: state.status === 'paused' ? 'PAUSED' : 'STOPPED'
  }
}

Step 2: Aggregate Statistics

const stats = {
  // Time statistics
  duration: Date.now() - new Date(state.created_at).getTime(),
  iterations: state.current_iteration,

  // Development statistics
  develop: {
    total_tasks: state.skill_state.develop.total,
    completed_tasks: state.skill_state.develop.completed,
    completion_rate: state.skill_state.develop.total > 0
      ? ((state.skill_state.develop.completed / state.skill_state.develop.total) * 100).toFixed(1)
      : 0
  },

  // Debug statistics
  debug: {
    iterations: state.skill_state.debug.iteration,
    hypotheses_tested: state.skill_state.debug.hypotheses.length,
    root_cause_found: state.skill_state.debug.confirmed_hypothesis !== null
  },

  // Validation statistics
  validate: {
    runs: state.skill_state.validate.test_results.length,
    passed: state.skill_state.validate.passed,
    coverage: state.skill_state.validate.coverage,
    failed_tests: state.skill_state.validate.failed_tests.length
  }
}

Step 3: Generate Summary Report

const timestamp = getUtc8ISOString()

const summaryReport = `# CCW Loop Session Summary

**Loop ID**: ${loopId}
**Task**: ${state.description}
**Started**: ${state.created_at}
**Completed**: ${timestamp}
**Duration**: ${formatDuration(stats.duration)}

---

## Executive Summary

${state.skill_state.validate.passed
  ? 'All tests passed, validation successful'
  : state.skill_state.develop.completed === state.skill_state.develop.total
    ? 'Development complete, validation not passed - needs debugging'
    : 'Task partially complete - pending items remain'}

---

## Development Phase

| Metric | Value |
|--------|-------|
| Total Tasks | ${stats.develop.total_tasks} |
| Completed | ${stats.develop.completed_tasks} |
| Completion Rate | ${stats.develop.completion_rate}% |

### Completed Tasks

${state.skill_state.develop.tasks.filter(t => t.status === 'completed').map(t => `
- ${t.description}
  - Files: ${t.files_changed?.join(', ') || 'N/A'}
  - Completed: ${t.completed_at}
`).join('\n')}

### Pending Tasks

${state.skill_state.develop.tasks.filter(t => t.status !== 'completed').map(t => `
- ${t.description}
`).join('\n') || '_None_'}

---

## Debug Phase

| Metric | Value |
|--------|-------|
| Iterations | ${stats.debug.iterations} |
| Hypotheses Tested | ${stats.debug.hypotheses_tested} |
| Root Cause Found | ${stats.debug.root_cause_found ? 'Yes' : 'No'} |

${stats.debug.root_cause_found ? `
### Confirmed Root Cause

${state.skill_state.debug.confirmed_hypothesis}: ${state.skill_state.debug.hypotheses.find(h => h.id === state.skill_state.debug.confirmed_hypothesis)?.description}
` : ''}

---

## Validation Phase

| Metric | Value |
|--------|-------|
| Test Runs | ${stats.validate.runs} |
| Status | ${stats.validate.passed ? 'PASSED' : 'FAILED'} |
| Coverage | ${stats.validate.coverage || 'N/A'}% |
| Failed Tests | ${stats.validate.failed_tests} |

---

## Recommendations

${generateRecommendations(stats, state)}

---

## Session Artifacts

| File | Description |
|------|-------------|
| \`develop.md\` | Development progress timeline |
| \`debug.md\` | Debug exploration and learnings |
| \`validate.md\` | Validation report |
| \`test-results.json\` | Test execution results |

---

*Generated by CCW Loop at ${timestamp}*
`

Write(`${progressDir}/summary.md`, summaryReport)

Step 4: Update State to Completed

state.status = 'completed'
state.completed_at = timestamp
state.updated_at = timestamp
state.skill_state.last_action = 'COMPLETE'
state.skill_state.summary = stats

Write(`.workflow/.loop/${loopId}.json`, JSON.stringify(state, null, 2))

Output Format

ACTION_RESULT:
- action: COMPLETE
- status: success
- message: Loop completed. Duration: {duration}, Iterations: {N}
- state_updates: {
    "status": "completed",
    "completed_at": "{timestamp}"
  }

FILES_UPDATED:
- .workflow/.loop/{loopId}.json: Status set to completed
- .workflow/.loop/{loopId}.progress/summary.md: Summary report generated

NEXT_ACTION_NEEDED: COMPLETED

Expansion Options

After completion, offer expansion to issues:

## Expansion Options

Would you like to create follow-up issues?

1. [test] Add more test cases
2. [enhance] Feature enhancements
3. [refactor] Code refactoring
4. [doc] Documentation updates
5. [none] No expansion needed

Select options (comma-separated) or 'none':

Helper Functions

function formatDuration(ms) {
  const seconds = Math.floor(ms / 1000)
  const minutes = Math.floor(seconds / 60)
  const hours = Math.floor(minutes / 60)

  if (hours > 0) {
    return `${hours}h ${minutes % 60}m`
  } else if (minutes > 0) {
    return `${minutes}m ${seconds % 60}s`
  } else {
    return `${seconds}s`
  }
}

function generateRecommendations(stats, state) {
  const recommendations = []

  if (stats.develop.completion_rate < 100) {
    recommendations.push('- Complete remaining development tasks')
  }

  if (!stats.validate.passed) {
    recommendations.push('- Fix failing tests')
  }

  if (stats.validate.coverage && stats.validate.coverage < 80) {
    recommendations.push(`- Improve test coverage (current: ${stats.validate.coverage}%)`)
  }

  if (recommendations.length === 0) {
    recommendations.push('- Consider code review')
    recommendations.push('- Update documentation')
    recommendations.push('- Prepare for deployment')
  }

  return recommendations.join('\n')
}

Error Handling

Error Type Recovery
Report generation failed Show basic stats, skip file write
Issue creation failed Log error, continue completion

Next Actions

  • None (terminal state)
  • To continue: Use /ccw-loop --loop-id={loopId} to reopen (will set status back to running)