Files
Claude-Code-Workflow/.codex/skills/codex-issue-plan-execute/phases/actions/action-complete.md
catlog22 8cdd6a8b5f Add execution and planning agent prompts, specifications, and quality standards
- Created execution agent prompt for issue execution with detailed deliverables and validation criteria.
- Developed planning agent prompt to analyze issues and generate structured solution plans.
- Introduced issue handling specifications outlining the workflow and issue structure.
- Established quality standards for evaluating completeness, consistency, correctness, and clarity of solutions.
- Defined solution schema specification detailing the required structure and validation rules for solutions.
- Documented subagent roles and responsibilities, emphasizing the dual-agent strategy for improved workflow efficiency.
2026-01-29 15:15:42 +08:00

5.0 KiB
Raw Blame History

Action: Complete

完成工作流并生成最终报告。

Purpose

序列化最终状态,生成执行摘要,清理临时文件。

Preconditions

  • state.status === "running"
  • 所有 issues 已处理或错误限制达到

Execution

async function execute(state) {
  const workDir = state.work_dir;
  const issues = state.issues || {};

  console.log("\n=== Finalizing Workflow ===");

  // 1. 生成统计信息
  const totalIssues = Object.keys(issues).length;
  const completedCount = Object.values(issues).filter(i => i.status === "completed").length;
  const failedCount = Object.values(issues).filter(i => i.status === "failed").length;
  const pendingCount = totalIssues - completedCount - failedCount;

  const stats = {
    total_issues: totalIssues,
    completed: completedCount,
    failed: failedCount,
    pending: pendingCount,
    success_rate: totalIssues > 0 ? ((completedCount / totalIssues) * 100).toFixed(1) : 0,
    duration_ms: new Date() - new Date(state.created_at)
  };

  console.log("\n=== Summary ===");
  console.log(`Total Issues: ${stats.total_issues}`);
  console.log(`✓ Completed: ${stats.completed}`);
  console.log(`✗ Failed: ${stats.failed}`);
  console.log(`○ Pending: ${stats.pending}`);
  console.log(`Success Rate: ${stats.success_rate}%`);
  console.log(`Duration: ${(stats.duration_ms / 1000).toFixed(1)}s`);

  // 2. 生成详细报告
  const reportLines = [
    "# Execution Report",
    "",
    `## Summary`,
    `- Total Issues: ${stats.total_issues}`,
    `- Completed: ${stats.completed}`,
    `- Failed: ${stats.failed}`,
    `- Pending: ${stats.pending}`,
    `- Success Rate: ${stats.success_rate}%`,
    `- Duration: ${(stats.duration_ms / 1000).toFixed(1)}s`,
    "",
    "## Results by Issue"
  ];

  Object.values(issues).forEach((issue, index) => {
    const status = issue.status === "completed" ? "✓" : issue.status === "failed" ? "✗" : "○";
    reportLines.push(`### ${status} [${index + 1}] ${issue.id}: ${issue.title}`);
    reportLines.push(`- Status: ${issue.status}`);
    if (issue.solution_id) {
      reportLines.push(`- Solution: ${issue.solution_id}`);
    }
    if (issue.planned_at) {
      reportLines.push(`- Planned: ${issue.planned_at}`);
    }
    if (issue.executed_at) {
      reportLines.push(`- Executed: ${issue.executed_at}`);
    }
    if (issue.error) {
      reportLines.push(`- Error: ${issue.error}`);
    }
    reportLines.push("");
  });

  if (state.errors && state.errors.length > 0) {
    reportLines.push("## Errors");
    state.errors.forEach(error => {
      reportLines.push(`- [${error.timestamp}] ${error.action}: ${error.message}`);
    });
    reportLines.push("");
  }

  reportLines.push("## Files Generated");
  reportLines.push(`- Work Directory: ${workDir}`);
  reportLines.push(`- State File: ${workDir}/state.json`);
  reportLines.push(`- Execution Results: ${workDir}/execution-results.json`);
  reportLines.push(`- Solutions: ${workDir}/solutions/`);
  reportLines.push(`- Snapshots: ${workDir}/snapshots/`);

  // 3. 保存报告
  const reportPath = `${workDir}/final-report.md`;
  Write(reportPath, reportLines.join("\n"));

  // 4. 保存最终状态
  const finalState = {
    ...state,
    status: "completed",
    phase: "completed",
    completed_at: new Date().toISOString(),
    completed_actions: [...state.completed_actions, "action-complete"],
    context: {
      ...state.context,
      ...stats
    }
  };

  Write(`${workDir}/state.json`, JSON.stringify(finalState, null, 2));

  // 5. 保存汇总 JSON
  Write(`${workDir}/summary.json`, JSON.stringify({
    status: "completed",
    stats: stats,
    report_file: reportPath,
    work_dir: workDir,
    completed_at: new Date().toISOString()
  }, null, 2));

  // 6. 输出完成消息
  console.log(`\n✓ Workflow completed`);
  console.log(`📄 Report: ${reportPath}`);
  console.log(`📁 Working directory: ${workDir}`);

  return {
    stateUpdates: {
      status: "completed",
      phase: "completed",
      completed_at: new Date().toISOString(),
      completed_actions: [...state.completed_actions, "action-complete"],
      context: finalState.context
    }
  };
}

State Updates

return {
  stateUpdates: {
    status: "completed",
    phase: "completed",
    completed_at: timestamp,
    completed_actions: [...state.completed_actions, "action-complete"],
    context: {
      total_issues: stats.total_issues,
      completed_count: stats.completed,
      failed_count: stats.failed,
      success_rate: stats.success_rate
    }
  }
};

Error Handling

Error Type Recovery
报告生成失败 输出文本摘要到控制台
文件写入失败 继续完成,允许手动保存
权限错误 使用替代目录

Next Actions (Hints)

  • 无(终止状态)
  • 用户可选择:
    • 查看报告:cat {report_path}
    • 恢复并重试失败的 issuescodex issue:plan-execute --resume {work_dir}
    • 清理临时文件:rm -rf {work_dir}