@pzy560117/codex-harness 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (688) hide show
  1. package/README.md +8 -1
  2. package/lib/commands/init.js +7 -1
  3. package/lib/release/resolve-package-source.js +6 -1
  4. package/package-source/AGENTS.md +57 -0
  5. package/package-source/PACKAGE.md +49 -0
  6. package/package-source/README.md +81 -0
  7. package/package-source/docs/codex-harness-engineering/templates/README.md +20 -0
  8. package/package-source/docs/codex-harness-engineering/templates/bootstrap-codex-harness.ps1 +746 -0
  9. package/package-source/docs/codex-harness-engineering/templates/ci/github-action-codex-review.yml +110 -0
  10. package/package-source/docs/codex-harness-engineering/templates/ci/github-action-codex-task.yml +46 -0
  11. package/package-source/docs/codex-harness-engineering/templates/config/agents/architect.toml +17 -0
  12. package/package-source/docs/codex-harness-engineering/templates/config/agents/backend-worker.toml +14 -0
  13. package/package-source/docs/codex-harness-engineering/templates/config/agents/docs-researcher.toml +13 -0
  14. package/package-source/docs/codex-harness-engineering/templates/config/agents/docs-worker.toml +15 -0
  15. package/package-source/docs/codex-harness-engineering/templates/config/agents/explorer.toml +14 -0
  16. package/package-source/docs/codex-harness-engineering/templates/config/agents/failure-triage.toml +18 -0
  17. package/package-source/docs/codex-harness-engineering/templates/config/agents/frontend-worker.toml +14 -0
  18. package/package-source/docs/codex-harness-engineering/templates/config/agents/harness-writer.toml +15 -0
  19. package/package-source/docs/codex-harness-engineering/templates/config/agents/planner.toml +15 -0
  20. package/package-source/docs/codex-harness-engineering/templates/config/agents/readonly-research.toml +13 -0
  21. package/package-source/docs/codex-harness-engineering/templates/config/agents/reviewer.toml +13 -0
  22. package/package-source/docs/codex-harness-engineering/templates/config/agents/security-reviewer.toml +15 -0
  23. package/package-source/docs/codex-harness-engineering/templates/config/agents/stage1-reviewer.toml +15 -0
  24. package/package-source/docs/codex-harness-engineering/templates/config/agents/stage2-reviewer.toml +16 -0
  25. package/package-source/docs/codex-harness-engineering/templates/config/agents/test-planner.toml +17 -0
  26. package/package-source/docs/codex-harness-engineering/templates/config/agents/test-runner.toml +14 -0
  27. package/package-source/docs/codex-harness-engineering/templates/config/agents/visual-reviewer.toml +15 -0
  28. package/package-source/docs/codex-harness-engineering/templates/config/codex-agent-roles.md +24 -0
  29. package/package-source/docs/codex-harness-engineering/templates/config/codex-config.toml +38 -0
  30. package/package-source/docs/codex-harness-engineering/templates/config/codex-readme.md +67 -0
  31. package/package-source/docs/codex-harness-engineering/templates/config/env-check.ps1 +40 -0
  32. package/package-source/docs/codex-harness-engineering/templates/config/env.example +12 -0
  33. package/package-source/docs/codex-harness-engineering/templates/config/global-AGENTS.md +40 -0
  34. package/package-source/docs/codex-harness-engineering/templates/config/global-config.toml +19 -0
  35. package/package-source/docs/codex-harness-engineering/templates/config/mcp-config.toml +38 -0
  36. package/package-source/docs/codex-harness-engineering/templates/config/rules/agents.md +115 -0
  37. package/package-source/docs/codex-harness-engineering/templates/config/rules/coding-style.md +74 -0
  38. package/package-source/docs/codex-harness-engineering/templates/config/rules/constitution.md +290 -0
  39. package/package-source/docs/codex-harness-engineering/templates/config/rules/git.rules +41 -0
  40. package/package-source/docs/codex-harness-engineering/templates/config/rules/harness.rules +29 -0
  41. package/package-source/docs/codex-harness-engineering/templates/config/rules/patterns.md +59 -0
  42. package/package-source/docs/codex-harness-engineering/templates/config/rules/safety.rules +35 -0
  43. package/package-source/docs/codex-harness-engineering/templates/config/rules/testing.md +34 -0
  44. package/package-source/docs/codex-harness-engineering/templates/context/architecture-brief.md +58 -0
  45. package/package-source/docs/codex-harness-engineering/templates/context/dev-plan.md +160 -0
  46. package/package-source/docs/codex-harness-engineering/templates/context/feature-pack.md +101 -0
  47. package/package-source/docs/codex-harness-engineering/templates/context/repo-map.md +78 -0
  48. package/package-source/docs/codex-harness-engineering/templates/context/service-dependency-matrix.yaml +25 -0
  49. package/package-source/docs/codex-harness-engineering/templates/contracts/README.md +16 -0
  50. package/package-source/docs/codex-harness-engineering/templates/contracts/openapi.yaml +182 -0
  51. package/package-source/docs/codex-harness-engineering/templates/contracts/orval.config.ts +20 -0
  52. package/package-source/docs/codex-harness-engineering/templates/contracts/prism-usage.md +34 -0
  53. package/package-source/docs/codex-harness-engineering/templates/design/ai-image-brief.md +122 -0
  54. package/package-source/docs/codex-harness-engineering/templates/design/assets/README.md +24 -0
  55. package/package-source/docs/codex-harness-engineering/templates/design/component-map.md +31 -0
  56. package/package-source/docs/codex-harness-engineering/templates/design/design-brief.md +178 -0
  57. package/package-source/docs/codex-harness-engineering/templates/design/design-tokens.json +88 -0
  58. package/package-source/docs/codex-harness-engineering/templates/design/frontend-architecture.md +147 -0
  59. package/package-source/docs/codex-harness-engineering/templates/design/image-to-frontend-spec.md +108 -0
  60. package/package-source/docs/codex-harness-engineering/templates/design/screen-states.md +122 -0
  61. package/package-source/docs/codex-harness-engineering/templates/design/ui-image-review.md +60 -0
  62. package/package-source/docs/codex-harness-engineering/templates/design/visual-parity-review.md +124 -0
  63. package/package-source/docs/codex-harness-engineering/templates/docs/architecture-constraints.md +83 -0
  64. package/package-source/docs/codex-harness-engineering/templates/docs/demo-readme.md +73 -0
  65. package/package-source/docs/codex-harness-engineering/templates/docs/frontend-quality-rules.md +138 -0
  66. package/package-source/docs/codex-harness-engineering/templates/docs/governance-auto-repair.md +80 -0
  67. package/package-source/docs/codex-harness-engineering/templates/docs/harness-architecture.md +78 -0
  68. package/package-source/docs/codex-harness-engineering/templates/docs/install-manifest-governance.md +307 -0
  69. package/package-source/docs/codex-harness-engineering/templates/docs/knowledge-architecture.md +219 -0
  70. package/package-source/docs/codex-harness-engineering/templates/docs/knowledge-import.md +108 -0
  71. package/package-source/docs/codex-harness-engineering/templates/docs/knowledge-lint.md +98 -0
  72. package/package-source/docs/codex-harness-engineering/templates/docs/new-project-checklist.md +7 -0
  73. package/package-source/docs/codex-harness-engineering/templates/docs/new-project-usage.md +152 -0
  74. package/package-source/docs/codex-harness-engineering/templates/docs/project-agents-template.md +154 -0
  75. package/package-source/docs/codex-harness-engineering/templates/docs/prompt-knowledge-integration.md +89 -0
  76. package/package-source/docs/codex-harness-engineering/templates/docs/regression-rules.md +45 -0
  77. package/package-source/docs/codex-harness-engineering/templates/docs/requirement-prep-kit/README.md +3 -0
  78. package/package-source/docs/codex-harness-engineering/templates/docs/rule-governance.md +98 -0
  79. package/package-source/docs/codex-harness-engineering/templates/docs/service-dependency-matrix.md +55 -0
  80. package/package-source/docs/codex-harness-engineering/templates/docs/spec-to-ui-to-code-workflow.md +196 -0
  81. package/package-source/docs/codex-harness-engineering/templates/docs/task-session-strategy.md +116 -0
  82. package/package-source/docs/codex-harness-engineering/templates/docs/team-knowledge-sync.md +187 -0
  83. package/package-source/docs/codex-harness-engineering/templates/docs/trace-format.md +74 -0
  84. package/package-source/docs/codex-harness-engineering/templates/governance/branch-protection-checklist.md +50 -0
  85. package/package-source/docs/codex-harness-engineering/templates/governance/feedback-evolution-loop.md +55 -0
  86. package/package-source/docs/codex-harness-engineering/templates/governance/retry-budget.yaml +30 -0
  87. package/package-source/docs/codex-harness-engineering/templates/governance/risk-levels.yaml +53 -0
  88. package/package-source/docs/codex-harness-engineering/templates/governance/sandbox-policy.md +13 -0
  89. package/package-source/docs/codex-harness-engineering/templates/hooks/hook-stop-verify.ps1 +818 -0
  90. package/package-source/docs/codex-harness-engineering/templates/hooks/hooks.json +40 -0
  91. package/package-source/docs/codex-harness-engineering/templates/knowledge/catalog.md +6 -0
  92. package/package-source/docs/codex-harness-engineering/templates/knowledge/decisions/DECISION-HARNESS-001.md +39 -0
  93. package/package-source/docs/codex-harness-engineering/templates/knowledge/guidelines/GUIDELINE-RULES-001.md +30 -0
  94. package/package-source/docs/codex-harness-engineering/templates/knowledge/knowledge-catalog.md +41 -0
  95. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/memory/constitution.md +72 -0
  96. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/scripts/powershell/check-prerequisites.ps1 +148 -0
  97. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/scripts/powershell/common.ps1 +137 -0
  98. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/scripts/powershell/create-new-feature.ps1 +279 -0
  99. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/scripts/powershell/setup-plan.ps1 +61 -0
  100. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/scripts/powershell/update-agent-context.ps1 +448 -0
  101. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/templates/agent-file-template.md +28 -0
  102. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/templates/checklist-template.md +40 -0
  103. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/templates/e2e-plan-template.md +38 -0
  104. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/templates/plan-template.md +393 -0
  105. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/templates/spec-template.md +307 -0
  106. package/package-source/docs/codex-harness-engineering/templates/package-assets/.specify/templates/tasks-template.md +244 -0
  107. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/architecture/constraints.md +98 -0
  108. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/README.md +122 -0
  109. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/START-HERE.md +53 -0
  110. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/agent-ecosystem-practices.md +140 -0
  111. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/best-practices.md +267 -0
  112. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/codex-global-rules-example.md +292 -0
  113. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/goal-templates.md +380 -0
  114. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/README.md +64 -0
  115. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/contracts/openapi.yaml +25 -0
  116. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/contracts/orval.config.ts +20 -0
  117. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/design/ai-image-brief.md +44 -0
  118. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/design/component-map.md +17 -0
  119. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/design/design-brief.md +58 -0
  120. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/design/frontend-architecture.md +107 -0
  121. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/design/image-to-frontend-spec.md +72 -0
  122. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/design/screen-states.md +25 -0
  123. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/design/ui-image-review.md +38 -0
  124. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/product/difficulty-research.md +39 -0
  125. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/product/page-inventory.md +5 -0
  126. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/product/prd-lite.md +41 -0
  127. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/product/requirement-interface-matrix.md +32 -0
  128. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/docs/product/state-matrix.yaml +14 -0
  129. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/packages/api-client/generated/model/Ticket.ts +6 -0
  130. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/packages/api-client/generated/ticket-api.ts +35 -0
  131. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/packages/api-client/http-client.ts +8 -0
  132. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/packages/ui/TicketFilterBar.tsx +72 -0
  133. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/plans/features/ticket-filter.dev-plan.md +48 -0
  134. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/progress.txt +1 -0
  135. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/stories/TicketFilterBar.stories.tsx +33 -0
  136. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/task.json +54 -0
  137. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/traces/DEMO-TICKET-FILTER-001-20260422-120000.json +74 -0
  138. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/verify.ps1 +42 -0
  139. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/global-rules-and-bootstrap.md +415 -0
  140. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/goal-harness-integration-guide.md +364 -0
  141. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/implementation-flow.md +288 -0
  142. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/implementation-guide.md +25 -0
  143. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/mode-matrix.md +57 -0
  144. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/project-agents-template.md +154 -0
  145. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/spec-to-ui-to-code-workflow.md +196 -0
  146. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/superpowers-codex-solo-builder-playbook.md +676 -0
  147. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/design/component-map.md +31 -0
  148. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/design/design-brief.md +178 -0
  149. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/design/design-tokens.json +88 -0
  150. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/design/frontend-architecture.md +147 -0
  151. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/design/image-to-frontend-spec.md +108 -0
  152. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/design/screen-states.md +122 -0
  153. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/design/visual-parity-review.md +124 -0
  154. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/docs/frontend-quality-rules.md +138 -0
  155. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/AGENTS.md +165 -0
  156. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/CHANGELOG.md +149 -0
  157. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/CLAUDE.md +61 -0
  158. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/CODE_OF_CONDUCT.md +83 -0
  159. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/CONTRIBUTING.md +465 -0
  160. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/README.md +1390 -0
  161. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/SECURITY.md +53 -0
  162. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/SPONSORING.md +43 -0
  163. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/SPONSORS.md +59 -0
  164. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/TROUBLESHOOTING.md +446 -0
  165. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/architect.md +232 -0
  166. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/build-error-resolver.md +119 -0
  167. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/chief-of-staff.md +155 -0
  168. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/code-reviewer.md +238 -0
  169. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/cpp-build-resolver.md +91 -0
  170. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/cpp-reviewer.md +79 -0
  171. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/database-reviewer.md +94 -0
  172. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/doc-updater.md +110 -0
  173. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/docs-lookup.md +68 -0
  174. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/e2e-runner.md +110 -0
  175. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/go-build-resolver.md +95 -0
  176. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/go-reviewer.md +83 -0
  177. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/harness-optimizer.md +35 -0
  178. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/java-build-resolver.md +154 -0
  179. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/java-reviewer.md +105 -0
  180. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/kotlin-build-resolver.md +119 -0
  181. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/loop-operator.md +37 -0
  182. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/planner.md +215 -0
  183. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/python-reviewer.md +106 -0
  184. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/pytorch-build-resolver.md +122 -0
  185. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/refactor-cleaner.md +92 -0
  186. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/rust-build-resolver.md +149 -0
  187. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/rust-reviewer.md +95 -0
  188. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/security-reviewer.md +112 -0
  189. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/tdd-guide.md +96 -0
  190. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/agents/typescript-reviewer.md +122 -0
  191. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/aside.md +173 -0
  192. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/build-fix.md +64 -0
  193. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/checkpoint.md +78 -0
  194. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/claw.md +51 -0
  195. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/code-review.md +43 -0
  196. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/context-budget.md +29 -0
  197. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/cpp-build.md +173 -0
  198. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/cpp-review.md +140 -0
  199. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/cpp-test.md +257 -0
  200. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/docs.md +32 -0
  201. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/e2e.md +389 -0
  202. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/eval.md +122 -0
  203. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/evolve.md +194 -0
  204. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/go-build.md +183 -0
  205. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/go-review.md +156 -0
  206. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/go-test.md +274 -0
  207. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/gradle-build.md +72 -0
  208. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/harness-audit.md +72 -0
  209. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/instinct-export.md +67 -0
  210. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/instinct-import.md +117 -0
  211. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/instinct-status.md +59 -0
  212. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/kotlin-build.md +176 -0
  213. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/kotlin-review.md +144 -0
  214. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/kotlin-test.md +315 -0
  215. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/learn-eval.md +117 -0
  216. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/learn.md +70 -0
  217. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/loop-start.md +33 -0
  218. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/loop-status.md +25 -0
  219. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/model-route.md +27 -0
  220. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/multi-backend.md +162 -0
  221. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/multi-execute.md +321 -0
  222. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/multi-frontend.md +162 -0
  223. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/multi-plan.md +278 -0
  224. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/plan.md +118 -0
  225. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/pm2.md +283 -0
  226. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/projects.md +39 -0
  227. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/promote.md +41 -0
  228. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/prompt-optimize.md +37 -0
  229. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/prune.md +31 -0
  230. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/python-review.md +319 -0
  231. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/quality-gate.md +30 -0
  232. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/refactor-clean.md +83 -0
  233. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/resume-session.md +154 -0
  234. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/rules-distill.md +11 -0
  235. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/rust-build.md +189 -0
  236. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/rust-review.md +146 -0
  237. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/rust-test.md +311 -0
  238. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/setup-pm.md +83 -0
  239. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/skill-create.md +176 -0
  240. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/skill-health.md +54 -0
  241. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/tdd.md +330 -0
  242. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/test-coverage.md +69 -0
  243. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/update-codemaps.md +73 -0
  244. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/update-docs.md +86 -0
  245. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/commands/verify.md +60 -0
  246. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/contexts/dev.md +23 -0
  247. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/contexts/research.md +30 -0
  248. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/contexts/review.md +25 -0
  249. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/examples/CLAUDE.md +100 -0
  250. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/examples/django-api-CLAUDE.md +308 -0
  251. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/examples/go-microservice-CLAUDE.md +267 -0
  252. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/examples/rust-api-CLAUDE.md +285 -0
  253. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/examples/saas-nextjs-CLAUDE.md +166 -0
  254. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/examples/user-CLAUDE.md +118 -0
  255. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/hooks/README.md +220 -0
  256. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/plugins/README.md +89 -0
  257. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/the-openclaw-guide.md +471 -0
  258. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/ecc-zh-CN/the-security-guide.md +206 -0
  259. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/external-knowledge/README.md +60 -0
  260. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/external-knowledge/app/Mobile_App_Production_Readiness_Framework_/347/247/273/345/212/250/347/253/257/345/205/250/345/271/263/345/217/260/347/224/237/344/272/247/345/217/257/344/270/212/347/272/277/350/247/204/350/214/203.md +2457 -0
  261. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/external-knowledge/app/catalog.md +33 -0
  262. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/external-knowledge/architecture.md +358 -0
  263. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/external-knowledge/common/AI_Coding_Production_Control_Framework_AI/345/206/231/345/256/214/347/232/204/344/273/243/347/240/201/345/246/202/344/275/225/344/270/215/345/244/261/346/216/247.md +2055 -0
  264. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/external-knowledge/common/catalog.md +34 -0
  265. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/external-knowledge/initial-content.md +296 -0
  266. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/external-knowledge/integration-roadmap.md +221 -0
  267. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/harness/architecture-constraints.md +83 -0
  268. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/harness/frontend-quality-rules.md +138 -0
  269. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/harness/governance-auto-repair.md +80 -0
  270. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/harness/service-dependency-matrix.md +55 -0
  271. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/harness/speckit-requirements-gate.md +260 -0
  272. package/package-source/docs/codex-harness-engineering/templates/package-assets/root/PACKAGE.md +49 -0
  273. package/package-source/docs/codex-harness-engineering/templates/package-assets/root/README.md +52 -0
  274. package/package-source/docs/codex-harness-engineering/templates/package-assets/root/init-project.ps1 +51 -0
  275. package/package-source/docs/codex-harness-engineering/templates/package-assets/root/install-agent-here.ps1 +57 -0
  276. package/package-source/docs/codex-harness-engineering/templates/package-assets/root/install-agent.ps1 +2506 -0
  277. package/package-source/docs/codex-harness-engineering/templates/package-assets/root/install-user.ps1 +29 -0
  278. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/agents.md +115 -0
  279. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/coding-style.md +74 -0
  280. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/constitution.md +290 -0
  281. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/git.rules +41 -0
  282. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/harness.rules +29 -0
  283. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/patterns.md +59 -0
  284. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/safety.rules +35 -0
  285. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/testing.md +34 -0
  286. package/package-source/docs/codex-harness-engineering/templates/package-assets/scripts/ai-workflow/check-ai-sync-drift.ps1 +205 -0
  287. package/package-source/docs/codex-harness-engineering/templates/package-assets/scripts/ai-workflow/sync-ai-config-to-targets.ps1 +826 -0
  288. package/package-source/docs/codex-harness-engineering/templates/package-assets/scripts/ai-workflow/sync-targets.example.json +35 -0
  289. package/package-source/docs/codex-harness-engineering/templates/package-assets/scripts/harness/harness-governance-check.ps1 +366 -0
  290. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/HOW_TO_USE_SKILLS.md +91 -0
  291. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/academic-mermaid-diagrams/SKILL.md +172 -0
  292. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ai-config-git-sync/SKILL.md +152 -0
  293. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ai-config-git-sync/references/command-recipes.md +92 -0
  294. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ai-ui-prompts/SKILL.md +350 -0
  295. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/allure-report/SKILL.md +230 -0
  296. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/allure-report/examples/usage.md +99 -0
  297. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/allure-report/scripts/view-allure.ps1 +28 -0
  298. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/api-auto-testing/SKILL.md +329 -0
  299. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/api-contract-template/SKILL.md +88 -0
  300. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/api-design/SKILL.md +139 -0
  301. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/api-integration/SKILL.md +302 -0
  302. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/architect/SKILL.md +211 -0
  303. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/auto-commit/SKILL.md +322 -0
  304. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/backend-patterns/SKILL.md +582 -0
  305. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/baseline-ui/SKILL.md +85 -0
  306. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/better-icons/SKILL.md +129 -0
  307. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/brand-design-md/README.md +215 -0
  308. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/brand-design-md/SKILL.md +191 -0
  309. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/browser-e2e-testing/SKILL.md +305 -0
  310. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/build-error-resolver/SKILL.md +532 -0
  311. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/build-fix/SKILL.md +34 -0
  312. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/business-rule-spec/SKILL.md +99 -0
  313. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/celery-tasks/SKILL.md +95 -0
  314. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/checkpoint/SKILL.md +79 -0
  315. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/cicd/SKILL.md +167 -0
  316. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/claude-openrouter-clash-debug/SKILL.md +100 -0
  317. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/claude-openrouter-clash-debug/references/windows-openrouter-clash-playbook.md +94 -0
  318. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/claude-openrouter-clash-debug/scripts/diagnose-openrouter-route.ps1 +282 -0
  319. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/claude-openrouter-clash-debug/scripts/ensure-openrouter-rule.ps1 +101 -0
  320. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/clickhouse-io/SKILL.md +429 -0
  321. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/code-review/SKILL.md +171 -0
  322. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/code-reviewer/SKILL.md +104 -0
  323. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/coding-standards/SKILL.md +520 -0
  324. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/consistency-checklist/SKILL.md +57 -0
  325. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/continuous-learning/SKILL.md +80 -0
  326. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/continuous-learning/config.json +18 -0
  327. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/continuous-learning/evaluate-session.sh +60 -0
  328. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/core-rules/SKILL.md +78 -0
  329. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/data-flow-spec/SKILL.md +63 -0
  330. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/database/SKILL.md +147 -0
  331. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/deep-interview/SKILL.md +154 -0
  332. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/django-drf/SKILL.md +97 -0
  333. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/doc-updater/SKILL.md +452 -0
  334. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/docker/SKILL.md +216 -0
  335. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/docx/SKILL.md +105 -0
  336. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/e2e/SKILL.md +364 -0
  337. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/e2e-runner/SKILL.md +708 -0
  338. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/error-handling/SKILL.md +245 -0
  339. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/eval/SKILL.md +125 -0
  340. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/eval-harness/SKILL.md +226 -0
  341. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/example-skill/README.md +37 -0
  342. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/example-skill/SKILL.md +141 -0
  343. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/example-skill/examples/usage.md +76 -0
  344. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/example-skill/resources/config.json +21 -0
  345. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/example-skill/scripts/helper.py +24 -0
  346. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/exception-handling-spec/SKILL.md +88 -0
  347. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/find-skill/SKILL.md +95 -0
  348. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/fixing-accessibility/SKILL.md +136 -0
  349. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/fixing-metadata/SKILL.md +111 -0
  350. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/fixing-motion-performance/SKILL.md +151 -0
  351. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/frontend-design/SKILL.md +58 -0
  352. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/frontend-first-workflow/SKILL.md +187 -0
  353. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/frontend-patterns/SKILL.md +631 -0
  354. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/fullstack-workflow/SKILL.md +85 -0
  355. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/git-workflow/SKILL.md +108 -0
  356. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/git-xianyu-analyzer/SKILL.md +346 -0
  357. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/git-xianyu-analyzer/scripts/download_images.py +112 -0
  358. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/github-research/SKILL.md +213 -0
  359. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/glue-coding/SKILL.md +389 -0
  360. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/glue-coding-workflow/SKILL.md +230 -0
  361. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/harness-surface-sync/SKILL.md +188 -0
  362. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/harness-surface-sync/references/current-repo-sync-matrix.md +110 -0
  363. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/harness-surface-sync/references/stale-patterns.md +65 -0
  364. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/SKILL.md +152 -0
  365. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/agents/openai.yaml +4 -0
  366. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/adapt.md +190 -0
  367. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/animate.md +173 -0
  368. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/audit.md +134 -0
  369. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/bolder.md +113 -0
  370. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/brand.md +104 -0
  371. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/clarify.md +174 -0
  372. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/cognitive-load.md +106 -0
  373. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/color-and-contrast.md +105 -0
  374. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/colorize.md +154 -0
  375. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/craft.md +138 -0
  376. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/critique.md +213 -0
  377. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/delight.md +302 -0
  378. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/distill.md +111 -0
  379. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/document.md +427 -0
  380. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/extract.md +70 -0
  381. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/harden.md +347 -0
  382. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/heuristics-scoring.md +234 -0
  383. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/interaction-design.md +195 -0
  384. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/layout.md +141 -0
  385. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/live.md +513 -0
  386. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/motion-design.md +99 -0
  387. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/onboard.md +234 -0
  388. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/optimize.md +258 -0
  389. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/overdrive.md +130 -0
  390. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/personas.md +178 -0
  391. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/polish.md +232 -0
  392. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/product.md +62 -0
  393. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/quieter.md +99 -0
  394. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/responsive-design.md +114 -0
  395. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/shape.md +136 -0
  396. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/spatial-design.md +100 -0
  397. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/teach.md +137 -0
  398. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/typeset.md +124 -0
  399. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/typography.md +159 -0
  400. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/reference/ux-writing.md +107 -0
  401. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  402. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/command-metadata.json +94 -0
  403. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/design-parser.mjs +820 -0
  404. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/detect-csp.mjs +198 -0
  405. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/is-generated.mjs +69 -0
  406. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/live-accept.mjs +465 -0
  407. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/live-browser.js +4684 -0
  408. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/live-inject.mjs +436 -0
  409. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/live-poll.mjs +187 -0
  410. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/live-server.mjs +679 -0
  411. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/live-wrap.mjs +395 -0
  412. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/live.mjs +247 -0
  413. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/load-context.mjs +93 -0
  414. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  415. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/impeccable/scripts/pin.mjs +214 -0
  416. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/init-autopilot/SKILL.md +143 -0
  417. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/interaction-detail-spec/SKILL.md +98 -0
  418. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/knowledge-base/SKILL.md +87 -0
  419. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/langgraph/SKILL.md +108 -0
  420. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/learn/SKILL.md +75 -0
  421. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/log-analysis-optimization/SKILL.md +247 -0
  422. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/mcp-builder/SKILL.md +50 -0
  423. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/midscene-fix-review/SKILL.md +115 -0
  424. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/midscene-framework/SKILL.md +675 -0
  425. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/midscene-log-analysis/SKILL.md +146 -0
  426. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/mobile-e2e-test-case/SKILL.md +78 -0
  427. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/mock-strategy/SKILL.md +111 -0
  428. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/openspec-apply/SKILL.md +23 -0
  429. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/openspec-architecture-review/SKILL.md +532 -0
  430. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/openspec-archive/SKILL.md +27 -0
  431. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/openspec-proposal/SKILL.md +28 -0
  432. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/orchestrate/SKILL.md +177 -0
  433. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/page-spec-template/SKILL.md +95 -0
  434. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pdf/SKILL.md +116 -0
  435. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/performance/SKILL.md +169 -0
  436. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/plan/SKILL.md +114 -0
  437. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/planner/SKILL.md +119 -0
  438. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/SKILL.md +483 -0
  439. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/html2pptx.md +626 -0
  440. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  441. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  442. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  443. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  444. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  445. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  446. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  447. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  448. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  449. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  450. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  451. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  452. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  453. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  454. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  455. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  456. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  457. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  458. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  459. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  460. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  461. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  462. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  463. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  464. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  465. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  466. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  467. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  468. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  469. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  470. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  471. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  472. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  473. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  474. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  475. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  476. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  477. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  478. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  479. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/scripts/pack.py +159 -0
  480. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/scripts/unpack.py +29 -0
  481. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/scripts/validate.py +69 -0
  482. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  483. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  484. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  485. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  486. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  487. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/ooxml.md +427 -0
  488. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/scripts/html2pptx.js +995 -0
  489. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/scripts/inventory.py +1020 -0
  490. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/scripts/rearrange.py +231 -0
  491. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/scripts/replace.py +385 -0
  492. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/pptx/scripts/thumbnail.py +450 -0
  493. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/prd-writer-skill/SKILL.md +106 -0
  494. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/prd-writer-skill/references/cloudflare-deploy.md +133 -0
  495. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/prd-writer-skill/references/feature-list-template.md +67 -0
  496. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/prd-writer-skill/references/prd-template.md +150 -0
  497. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/prd-writer-skill/references/prompts.md +88 -0
  498. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/prd-writer-skill/references/prototype-guide.md +156 -0
  499. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/prd-writer-skill/references/quality-checklist.md +120 -0
  500. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/project-context-template/SKILL.md +187 -0
  501. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/project-guidelines-example/SKILL.md +350 -0
  502. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/project-planning/SKILL.md +134 -0
  503. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/project-setup/SKILL.md +148 -0
  504. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/prompts-library/SKILL.md +362 -0
  505. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/property-testing/SKILL.md +304 -0
  506. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/qa-e2e-planner/SKILL.md +41 -0
  507. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/qa-e2e-runner/SKILL.md +27 -0
  508. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/qa-mock-cleaner/SKILL.md +29 -0
  509. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/qoder-codex-api-config/SKILL.md +67 -0
  510. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/qoder-codex-api-config/agents/openai.yaml +7 -0
  511. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/qoder-codex-api-config/scripts/configure-qoder-codex-api.ps1 +278 -0
  512. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/refactor-clean/SKILL.md +33 -0
  513. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/refactor-cleaner/SKILL.md +306 -0
  514. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/refactoring/SKILL.md +114 -0
  515. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/requirements-design-template/SKILL.md +825 -0
  516. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/security/SKILL.md +166 -0
  517. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/security-review/SKILL.md +494 -0
  518. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/security-reviewer/SKILL.md +545 -0
  519. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/skill-creator/SKILL.md +356 -0
  520. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/skill-creator/scripts/init_skill.py +303 -0
  521. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/skill-creator/scripts/package_skill.py +110 -0
  522. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/skill-creator/scripts/quick_validate.py +95 -0
  523. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/skill-generator/SKILL.md +491 -0
  524. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/skills-index.md +112 -0
  525. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/spec-based-review/SKILL.md +178 -0
  526. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/spec-review/SKILL.md +395 -0
  527. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-analyze/SKILL.md +144 -0
  528. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-checklist/SKILL.md +126 -0
  529. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-clarify/SKILL.md +108 -0
  530. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-constitution/SKILL.md +83 -0
  531. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-e2e-tasks/SKILL.md +54 -0
  532. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-implement/SKILL.md +143 -0
  533. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-plan/SKILL.md +224 -0
  534. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-specify/SKILL.md +229 -0
  535. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-tasks/SKILL.md +187 -0
  536. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-taskstoissues/SKILL.md +32 -0
  537. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-verify/SKILL.md +142 -0
  538. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/state-management/SKILL.md +164 -0
  539. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/strategic-compact/SKILL.md +63 -0
  540. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/strategic-compact/suggest-compact.sh +52 -0
  541. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/sync-project-root-docs/SKILL.md +143 -0
  542. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/sync-project-root-docs/references/current-repo-notes.md +41 -0
  543. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/sync-project-root-docs/references/github-samples.md +33 -0
  544. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/sync-project-root-docs/scripts/collect-root-doc-facts.ps1 +145 -0
  545. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/taste-skill/SKILL.md +226 -0
  546. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/tdd/SKILL.md +327 -0
  547. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/tdd-guide/SKILL.md +280 -0
  548. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/tdd-workflow/SKILL.md +409 -0
  549. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/test-coverage/SKILL.md +32 -0
  550. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/thesis-writing/SKILL.md +841 -0
  551. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/thesis-writing/references/ai-integrity-and-originality.md +191 -0
  552. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/thesis-writing/references/citation-templates.md +99 -0
  553. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/thesis-writing/references/final-checklist.md +60 -0
  554. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/thesis-writing/references/photographer-booking-paper.md +85 -0
  555. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/thesis-writing/references/template-qingdao-city-university.md +182 -0
  556. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/thesis-writing/references/test-result-templates.md +22 -0
  557. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/thesis-writing/references/thesis-analysis-template.md +63 -0
  558. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/typescript/SKILL.md +152 -0
  559. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/SKILL.md +292 -0
  560. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/charts.csv +26 -0
  561. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/colors.csv +97 -0
  562. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/icons.csv +101 -0
  563. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/landing.csv +31 -0
  564. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/products.csv +97 -0
  565. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  566. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  567. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  568. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  569. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  570. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  571. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  572. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  573. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  574. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  575. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  576. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  577. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  578. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  579. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/styles.csv +68 -0
  580. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/typography.csv +58 -0
  581. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  582. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  583. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  584. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/scripts/core.py +253 -0
  585. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  586. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/ui-ux-pro-max/scripts/search.py +114 -0
  587. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/update-codemaps/SKILL.md +36 -0
  588. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/update-docs/SKILL.md +36 -0
  589. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/verification-loop/SKILL.md +125 -0
  590. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/verify/SKILL.md +64 -0
  591. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/vitest/SKILL.md +248 -0
  592. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/vue-arco/SKILL.md +119 -0
  593. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/webapp-testing/SKILL.md +179 -0
  594. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/xlsx/SKILL.md +142 -0
  595. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/README.md +15 -0
  596. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.analyze.md +149 -0
  597. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.checklist.md +125 -0
  598. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.clarify.md +107 -0
  599. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.constitution.md +82 -0
  600. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.e2e-testing.md +59 -0
  601. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.implement.md +129 -0
  602. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.plan.md +223 -0
  603. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.specify.md +228 -0
  604. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.tasks.md +186 -0
  605. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.taskstoissues.md +31 -0
  606. package/package-source/docs/codex-harness-engineering/templates/package-assets/workflows/speckit.verify.md +130 -0
  607. package/package-source/docs/codex-harness-engineering/templates/product/acceptance-criteria.md +47 -0
  608. package/package-source/docs/codex-harness-engineering/templates/product/difficulty-research.md +47 -0
  609. package/package-source/docs/codex-harness-engineering/templates/product/page-inventory.md +21 -0
  610. package/package-source/docs/codex-harness-engineering/templates/product/prd-lite.md +158 -0
  611. package/package-source/docs/codex-harness-engineering/templates/product/requirement-interface-matrix.md +37 -0
  612. package/package-source/docs/codex-harness-engineering/templates/product/state-matrix.yaml +105 -0
  613. package/package-source/docs/codex-harness-engineering/templates/prompts/controller-loop.md +88 -0
  614. package/package-source/docs/codex-harness-engineering/templates/prompts/failure-triage.md +69 -0
  615. package/package-source/docs/codex-harness-engineering/templates/prompts/harness-audit.md +52 -0
  616. package/package-source/docs/codex-harness-engineering/templates/prompts/implement-one-task.md +148 -0
  617. package/package-source/docs/codex-harness-engineering/templates/prompts/repair-one-finding.md +67 -0
  618. package/package-source/docs/codex-harness-engineering/templates/prompts/review-one-task.md +43 -0
  619. package/package-source/docs/codex-harness-engineering/templates/prompts/review-stage1-spec.md +109 -0
  620. package/package-source/docs/codex-harness-engineering/templates/prompts/review-stage2-quality.md +80 -0
  621. package/package-source/docs/codex-harness-engineering/templates/prompts/visual-evaluator.md +78 -0
  622. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/backend-worker.md +41 -0
  623. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/docs-worker.md +28 -0
  624. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/frontend-worker.md +46 -0
  625. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/harness-writer.md +40 -0
  626. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/test-runner.md +27 -0
  627. package/package-source/docs/codex-harness-engineering/templates/runtime/AGENTS.md +50 -0
  628. package/package-source/docs/codex-harness-engineering/templates/runtime/codex-loop.ps1 +2521 -0
  629. package/package-source/docs/codex-harness-engineering/templates/runtime/doctor.ps1 +1253 -0
  630. package/package-source/docs/codex-harness-engineering/templates/runtime/progress.txt +0 -0
  631. package/package-source/docs/codex-harness-engineering/templates/runtime/project-task-template.json +1047 -0
  632. package/package-source/docs/codex-harness-engineering/templates/runtime/scripts/test-install-modes.ps1 +3 -0
  633. package/package-source/docs/codex-harness-engineering/templates/runtime/scripts/validate-init-queue.ps1 +175 -0
  634. package/package-source/docs/codex-harness-engineering/templates/runtime/scripts/validate-queue-placeholders.ps1 +23 -0
  635. package/package-source/docs/codex-harness-engineering/templates/runtime/smoke-task.json +52 -0
  636. package/package-source/docs/codex-harness-engineering/templates/runtime/task-run-profile.json +86 -0
  637. package/package-source/docs/codex-harness-engineering/templates/runtime/task.json +49 -0
  638. package/package-source/docs/codex-harness-engineering/templates/runtime/verify.ps1 +285 -0
  639. package/package-source/docs/codex-harness-engineering/templates/scripts/ai-workflow/check-ai-sync-drift.ps1 +205 -0
  640. package/package-source/docs/codex-harness-engineering/templates/scripts/harness/harness-governance-check.ps1 +366 -0
  641. package/package-source/docs/codex-harness-engineering/templates/spec/01-spec-guide-and-index.md +32 -0
  642. package/package-source/docs/codex-harness-engineering/templates/spec/02-requirement-sources.md +26 -0
  643. package/package-source/docs/codex-harness-engineering/templates/spec/03-proposal-and-scope.md +36 -0
  644. package/package-source/docs/codex-harness-engineering/templates/spec/04-prd.md +29 -0
  645. package/package-source/docs/codex-harness-engineering/templates/spec/05-user-stories-and-acceptance.md +25 -0
  646. package/package-source/docs/codex-harness-engineering/templates/spec/06-functional-spec.md +33 -0
  647. package/package-source/docs/codex-harness-engineering/templates/spec/07-nfr.md +29 -0
  648. package/package-source/docs/codex-harness-engineering/templates/spec/08-architecture-design.md +31 -0
  649. package/package-source/docs/codex-harness-engineering/templates/spec/09-api-contract.md +37 -0
  650. package/package-source/docs/codex-harness-engineering/templates/spec/10-data-model.md +31 -0
  651. package/package-source/docs/codex-harness-engineering/templates/spec/11-security-design.md +26 -0
  652. package/package-source/docs/codex-harness-engineering/templates/spec/12-implementation-plan.md +23 -0
  653. package/package-source/docs/codex-harness-engineering/templates/spec/13-test-strategy.md +26 -0
  654. package/package-source/docs/codex-harness-engineering/templates/spec/14-rtm.md +24 -0
  655. package/package-source/docs/codex-harness-engineering/templates/spec/spec-manifest.json +27 -0
  656. package/package-source/docs/codex-harness-engineering/templates/spec/spec-manifest.schema.json +40 -0
  657. package/package-source/docs/codex-harness-engineering/templates/testing/ACCEPTANCE_CRITERIA.md +39 -0
  658. package/package-source/docs/codex-harness-engineering/templates/testing/ACCEPTANCE_EXAMPLES.md +37 -0
  659. package/package-source/docs/codex-harness-engineering/templates/testing/EVIDENCE_PROTOCOL.md +48 -0
  660. package/package-source/docs/codex-harness-engineering/templates/testing/NATURAL_LANGUAGE_TEST_CASES.md +689 -0
  661. package/package-source/docs/codex-harness-engineering/templates/testing/REGRESSION_PLAN.md +20 -0
  662. package/package-source/docs/codex-harness-engineering/templates/testing/RISK_BASED_TEST_PLAN.md +16 -0
  663. package/package-source/docs/codex-harness-engineering/templates/testing/TEST_DATA_MATRIX.md +30 -0
  664. package/package-source/docs/codex-harness-engineering/templates/testing/TEST_STRATEGY.md +97 -0
  665. package/package-source/docs/codex-harness-engineering/templates/testing/TRACEABILITY_MATRIX.md +22 -0
  666. package/package-source/docs/codex-harness-engineering/templates/testing/coverage-policy.md +25 -0
  667. package/package-source/docs/codex-harness-engineering/templates/testing/e2e-plan.md +139 -0
  668. package/package-source/docs/codex-harness-engineering/templates/testing/failure-findings.example.json +21 -0
  669. package/package-source/docs/codex-harness-engineering/templates/testing/failure-triage.md +62 -0
  670. package/package-source/docs/codex-harness-engineering/templates/testing/test-data-plan.md +36 -0
  671. package/package-source/docs/codex-harness-engineering/templates/testing/test-matrix.md +26 -0
  672. package/package-source/docs/codex-harness-engineering/templates/testing/test-report.md +41 -0
  673. package/package-source/docs/codex-harness-engineering/templates/testing/verify-matrix.md +46 -0
  674. package/package-source/docs/codex-harness-engineering/templates/trace/eval-case.yaml +24 -0
  675. package/package-source/docs/codex-harness-engineering/templates/trace/trace.json +30 -0
  676. package/package-source/docs/codex-harness-engineering/templates/trace/trace.schema.json +225 -0
  677. package/package-source/install-manifest.json +453 -0
  678. package/package-source/install-manifest.schema.json +80 -0
  679. package/package-source/tools/install/ai-workflow/check-ai-sync-drift.ps1 +205 -0
  680. package/package-source/tools/install/ai-workflow/sync-ai-config-to-targets.ps1 +826 -0
  681. package/package-source/tools/install/ai-workflow/sync-targets.example.json +35 -0
  682. package/package-source/tools/install/bootstrap-codex-harness.ps1 +760 -0
  683. package/package-source/tools/install/env-check.ps1 +40 -0
  684. package/package-source/tools/install/init-project.ps1 +51 -0
  685. package/package-source/tools/install/install-agent-here.ps1 +57 -0
  686. package/package-source/tools/install/install-agent.ps1 +2511 -0
  687. package/package-source/tools/install/install-user.ps1 +29 -0
  688. package/package.json +3 -1
@@ -0,0 +1,2521 @@
1
+ param(
2
+ [string]$ProjectRoot = "",
3
+ [string]$TaskFile = "task.json",
4
+ [string]$ProgressFile = "progress.txt",
5
+ [string]$TraceDir = "traces",
6
+ [string]$CodexCommand = "codex",
7
+ [string]$RunProfileFile = ".codex\\task-run-profile.json",
8
+ [switch]$RunUntilDone,
9
+ [switch]$CaptureJsonEvents
10
+ )
11
+
12
+ Set-StrictMode -Version Latest
13
+ $ErrorActionPreference = "Stop"
14
+ $utf8NoBom = New-Object System.Text.UTF8Encoding($false)
15
+ [Console]::OutputEncoding = $utf8NoBom
16
+ $OutputEncoding = $utf8NoBom
17
+
18
+ if ([string]::IsNullOrWhiteSpace($ProjectRoot)) {
19
+ $ProjectRoot = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "..\.."))
20
+ }
21
+
22
+ function Write-Step {
23
+ <#
24
+ 输出简洁的 driver 状态,避免把 Codex 原始事件流刷满终端。
25
+ #>
26
+ param([string]$Message)
27
+
28
+ $timestamp = Get-Date -Format "HH:mm:ss"
29
+ Write-Host "[$timestamp] $Message"
30
+ }
31
+
32
+ function Get-TextFileContent {
33
+ <#
34
+ 读取 UTF-8 文本文件,文件不存在时返回空字符串。
35
+ #>
36
+ param([string]$Path)
37
+
38
+ if (-not (Test-Path -LiteralPath $Path)) {
39
+ return ""
40
+ }
41
+
42
+ return Get-Content -LiteralPath $Path -Raw -Encoding UTF8
43
+ }
44
+
45
+ function Show-LogTail {
46
+ <#
47
+ 失败时只显示最后几行日志,并保留完整日志文件供排查。
48
+ #>
49
+ param(
50
+ [string]$Path,
51
+ [int]$LineCount = 40
52
+ )
53
+
54
+ if (-not (Test-Path -LiteralPath $Path)) {
55
+ return
56
+ }
57
+
58
+ Write-Output ""
59
+ Write-Output "最近 $LineCount 行日志:"
60
+ Get-Content -LiteralPath $Path -Tail $LineCount -Encoding UTF8
61
+ }
62
+
63
+ function Get-LastNonEmptyLine {
64
+ <#
65
+ 返回日志文件最后一条非空文本,缺失时返回空字符串。
66
+ #>
67
+ param([string]$Path)
68
+
69
+ if (-not (Test-Path -LiteralPath $Path)) {
70
+ return ""
71
+ }
72
+
73
+ $lines = Get-Content -LiteralPath $Path -Tail 20 -Encoding UTF8
74
+ if ($null -eq $lines) {
75
+ return ""
76
+ }
77
+
78
+ foreach ($line in (@($lines)[-1..-([Math]::Min(@($lines).Count, 20))])) {
79
+ if (-not [string]::IsNullOrWhiteSpace($line)) {
80
+ return $line.Trim()
81
+ }
82
+ }
83
+
84
+ return ""
85
+ }
86
+
87
+ function Get-CompactLogPreview {
88
+ <#
89
+ 压缩日志预览,避免心跳消息过长。
90
+ #>
91
+ param(
92
+ [string]$Path,
93
+ [int]$MaxLength = 120
94
+ )
95
+
96
+ $line = Get-LastNonEmptyLine -Path $Path
97
+ if ([string]::IsNullOrWhiteSpace($line)) {
98
+ return ""
99
+ }
100
+
101
+ if ($line.Length -le $MaxLength) {
102
+ return $line
103
+ }
104
+
105
+ return ($line.Substring(0, $MaxLength - 3) + "...")
106
+ }
107
+
108
+ function Get-ObjectPropertyValue {
109
+ <#
110
+ 安全读取对象属性,属性不存在时返回默认值。
111
+ #>
112
+ param(
113
+ [object]$InputObject,
114
+ [string]$Name,
115
+ $Default = $null
116
+ )
117
+
118
+ if ($null -eq $InputObject) {
119
+ return $Default
120
+ }
121
+
122
+ $property = $InputObject.PSObject.Properties[$Name]
123
+ if ($null -eq $property) {
124
+ return $Default
125
+ }
126
+
127
+ return $property.Value
128
+ }
129
+
130
+ function ConvertTo-StringArray {
131
+ <#
132
+ 归一化为字符串数组。
133
+ #>
134
+ param([object]$Value)
135
+
136
+ if ($null -eq $Value) {
137
+ return @()
138
+ }
139
+
140
+ if ($Value -is [string]) {
141
+ if ([string]::IsNullOrWhiteSpace($Value)) {
142
+ return @()
143
+ }
144
+
145
+ return @($Value)
146
+ }
147
+
148
+ if ($Value -is [System.Collections.IEnumerable]) {
149
+ $result = @()
150
+ foreach ($item in $Value) {
151
+ if ($null -eq $item) {
152
+ continue
153
+ }
154
+
155
+ $text = [string]$item
156
+ if (-not [string]::IsNullOrWhiteSpace($text)) {
157
+ $result += $text
158
+ }
159
+ }
160
+
161
+ return $result
162
+ }
163
+
164
+ return @([string]$Value)
165
+ }
166
+
167
+ function Normalize-GitRelativePath {
168
+ <#
169
+ 统一 Git 相对路径,便于做 owned_paths / runtime allowlist 比较。
170
+ #>
171
+ param([string]$Path)
172
+
173
+ $rawValue = if ($null -eq $Path) { "" } else { [string]$Path }
174
+ $value = $rawValue.Trim().Replace('\', '/')
175
+ while ($value.StartsWith('./', [System.StringComparison]::Ordinal)) {
176
+ $value = $value.Substring(2)
177
+ }
178
+
179
+ return $value.TrimStart('/')
180
+ }
181
+
182
+ function Convert-OwnedPathsToPrefixes {
183
+ <#
184
+ 读取当前任务声明的 owned_paths,并转成标准前缀。
185
+ #>
186
+ param([object]$Task)
187
+
188
+ $ownedPaths = ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "owned_paths")
189
+ return @(
190
+ $ownedPaths |
191
+ ForEach-Object { Normalize-GitRelativePath -Path $_ } |
192
+ Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
193
+ )
194
+ }
195
+
196
+ function Convert-GitStatusLineToRelativePaths {
197
+ <#
198
+ 从 porcelain v1 -z record 提取一个或两个受影响路径。
199
+ #>
200
+ param(
201
+ [string]$Line,
202
+ [string]$NextRecord = $null
203
+ )
204
+
205
+ if ([string]::IsNullOrWhiteSpace($Line) -or $Line.Length -lt 4) {
206
+ return @()
207
+ }
208
+
209
+ $statusCode = $Line.Substring(0, 2)
210
+ $relativePath = $Line.Substring(3)
211
+ if ([string]::IsNullOrWhiteSpace($relativePath)) {
212
+ return @()
213
+ }
214
+
215
+ $paths = @()
216
+ $isRenameOrCopy = ($statusCode.IndexOf('R') -ge 0 -or $statusCode.IndexOf('C') -ge 0)
217
+ if ($isRenameOrCopy) {
218
+ $sourcePath = Normalize-GitRelativePath -Path $NextRecord
219
+ $destinationPath = Normalize-GitRelativePath -Path $relativePath
220
+ if (-not [string]::IsNullOrWhiteSpace($sourcePath)) {
221
+ $paths += $sourcePath
222
+ }
223
+ if (-not [string]::IsNullOrWhiteSpace($destinationPath)) {
224
+ $paths += $destinationPath
225
+ }
226
+ return ConvertTo-UniqueStringArray -Items $paths
227
+ }
228
+
229
+ $normalizedPath = Normalize-GitRelativePath -Path $relativePath
230
+ if ([string]::IsNullOrWhiteSpace($normalizedPath)) {
231
+ return @()
232
+ }
233
+
234
+ return @($normalizedPath)
235
+ }
236
+
237
+ function Get-GitStatusPorcelainRecords {
238
+ <#
239
+ 读取 porcelain v1 -z 输出,避免 core.quotePath 的 C-style escape。
240
+ #>
241
+ param([string]$Root)
242
+
243
+ $processInfo = New-Object System.Diagnostics.ProcessStartInfo
244
+ $processInfo.FileName = "git"
245
+ $processInfo.Arguments = "status --porcelain=v1 -z --untracked-files=all"
246
+ $processInfo.WorkingDirectory = $Root
247
+ $processInfo.UseShellExecute = $false
248
+ $processInfo.RedirectStandardOutput = $true
249
+ $processInfo.RedirectStandardError = $true
250
+
251
+ $process = [System.Diagnostics.Process]::Start($processInfo)
252
+ $outputStream = New-Object System.IO.MemoryStream
253
+ $exitCode = $null
254
+ try {
255
+ $process.StandardOutput.BaseStream.CopyTo($outputStream)
256
+ $stderr = $process.StandardError.ReadToEnd()
257
+ $process.WaitForExit()
258
+ $exitCode = $process.ExitCode
259
+ }
260
+ finally {
261
+ $process.Dispose()
262
+ }
263
+
264
+ if ($exitCode -ne 0) {
265
+ throw "无法读取 Git 状态,无法执行 commit ownership gate。$stderr"
266
+ }
267
+
268
+ $text = [System.Text.Encoding]::UTF8.GetString($outputStream.ToArray())
269
+ return @(
270
+ $text.Split([char]0) |
271
+ Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
272
+ )
273
+ }
274
+
275
+ function Test-CommitPathOwnership {
276
+ <#
277
+ 提交前检查 Git 脏文件是否全部落在 owned_paths 或 runtime allowlist 内。
278
+ #>
279
+ param(
280
+ [string]$Root,
281
+ [object]$Task,
282
+ [string[]]$RuntimeAllowedPaths,
283
+ [string[]]$NonBlockingDirtyPaths
284
+ )
285
+
286
+ $allowed = New-Object 'System.Collections.Generic.HashSet[string]' ([System.StringComparer]::OrdinalIgnoreCase)
287
+ foreach ($path in @(
288
+ (Convert-OwnedPathsToPrefixes -Task $Task) +
289
+ (ConvertTo-StringArray -Value $RuntimeAllowedPaths) +
290
+ (ConvertTo-StringArray -Value $NonBlockingDirtyPaths)
291
+ )) {
292
+ $normalized = Normalize-GitRelativePath -Path $path
293
+ if (-not [string]::IsNullOrWhiteSpace($normalized)) {
294
+ $null = $allowed.Add($normalized)
295
+ }
296
+ }
297
+
298
+ $statusLines = @(Get-GitStatusPorcelainRecords -Root $Root)
299
+ $unexpected = New-Object System.Collections.Generic.List[string]
300
+ for ($i = 0; $i -lt @($statusLines).Count; $i++) {
301
+ $line = $statusLines[$i]
302
+ $nextRecord = $null
303
+ if ($line.Length -ge 2) {
304
+ $statusCode = $line.Substring(0, 2)
305
+ if (($statusCode.IndexOf('R') -ge 0 -or $statusCode.IndexOf('C') -ge 0) -and ($i + 1) -lt @($statusLines).Count) {
306
+ $i++
307
+ $nextRecord = $statusLines[$i]
308
+ }
309
+ }
310
+
311
+ foreach ($relativePath in @(Convert-GitStatusLineToRelativePaths -Line $line -NextRecord $nextRecord)) {
312
+ $matched = $false
313
+ foreach ($allowedPath in $allowed) {
314
+ if (
315
+ $relativePath.Equals($allowedPath, [System.StringComparison]::OrdinalIgnoreCase) -or
316
+ $relativePath.StartsWith(($allowedPath.TrimEnd('/') + '/'), [System.StringComparison]::OrdinalIgnoreCase)
317
+ ) {
318
+ $matched = $true
319
+ break
320
+ }
321
+ }
322
+
323
+ if (-not $matched) {
324
+ $unexpected.Add($relativePath)
325
+ }
326
+ }
327
+ }
328
+
329
+ return [PSCustomObject]@{
330
+ Passed = ($unexpected.Count -eq 0)
331
+ UnexpectedPaths = ConvertTo-UniqueStringArray -Items @($unexpected)
332
+ }
333
+ }
334
+
335
+ function ConvertTo-BulletLines {
336
+ <#
337
+ 把数组格式化成多行 bullet,空数组时输出占位。
338
+ #>
339
+ param(
340
+ [string[]]$Items,
341
+ [string]$EmptyText = "- 无"
342
+ )
343
+
344
+ if ($null -eq $Items -or $Items.Count -eq 0) {
345
+ return $EmptyText
346
+ }
347
+
348
+ return ($Items | ForEach-Object { "- $_" }) -join "`n"
349
+ }
350
+
351
+ function ConvertTo-PromptJson {
352
+ <#
353
+ 把任务内的结构化合同序列化进 prompt,避免内层会话只看到字段名称。
354
+ #>
355
+ param(
356
+ [object]$Value,
357
+ [string]$EmptyText = "{}"
358
+ )
359
+
360
+ if ($null -eq $Value) {
361
+ return $EmptyText
362
+ }
363
+
364
+ return ($Value | ConvertTo-Json -Depth 20)
365
+ }
366
+
367
+ function ConvertTo-UniqueStringArray {
368
+ <#
369
+ 去重并保持原始顺序。
370
+ #>
371
+ param([string[]]$Items)
372
+
373
+ $result = @()
374
+ foreach ($item in @(ConvertTo-StringArray -Value $Items)) {
375
+ if ($result -notcontains $item) {
376
+ $result += $item
377
+ }
378
+ }
379
+
380
+ return $result
381
+ }
382
+
383
+ function Get-TaskDefinitionDefaults {
384
+ <#
385
+ 根据任务类型返回默认 gate 和 truth source 约束。
386
+ #>
387
+ param([object]$Task)
388
+
389
+ $taskKind = [string](Get-ObjectPropertyValue -InputObject $Task -Name "task_kind" -Default "harness")
390
+ if ([string]::IsNullOrWhiteSpace($taskKind)) {
391
+ $taskKind = "harness"
392
+ }
393
+
394
+ $defaultGateProfile = "lightweight"
395
+ $defaultTruthSources = @()
396
+
397
+ switch ($taskKind) {
398
+ "harness" {
399
+ $defaultGateProfile = "lightweight"
400
+ $defaultTruthSources = @()
401
+ }
402
+ "smoke" {
403
+ $defaultGateProfile = "lightweight"
404
+ $defaultTruthSources = @()
405
+ }
406
+ "feature_research" {
407
+ $defaultGateProfile = "research_required"
408
+ $defaultTruthSources = @("repo_context")
409
+ }
410
+ "feature_spec" {
411
+ $defaultGateProfile = "research_required"
412
+ $defaultTruthSources = @("repo_context")
413
+ }
414
+ "feature_design" {
415
+ $defaultGateProfile = "spec_required"
416
+ $defaultTruthSources = @("product", "testing")
417
+ }
418
+ "testcase_design" {
419
+ $defaultGateProfile = "spec_required"
420
+ $defaultTruthSources = @("product", "testing")
421
+ }
422
+ "feature_plan" {
423
+ $defaultGateProfile = "spec_required"
424
+ $defaultTruthSources = @("product", "design", "testing", "repo_context")
425
+ }
426
+ "feature_impl" {
427
+ $defaultGateProfile = "spec_required"
428
+ $defaultTruthSources = @("product", "design", "plan", "testing", "repo_context")
429
+ }
430
+ "release" {
431
+ $defaultGateProfile = "release_required"
432
+ $defaultTruthSources = @("product", "design", "plan", "testing", "repo_context")
433
+ }
434
+ "archive" {
435
+ $defaultGateProfile = "lightweight"
436
+ $defaultTruthSources = @("knowledge")
437
+ }
438
+ default {
439
+ $defaultGateProfile = "lightweight"
440
+ $defaultTruthSources = @()
441
+ }
442
+ }
443
+
444
+ $gateProfile = [string](Get-ObjectPropertyValue -InputObject $Task -Name "gate_profile" -Default $defaultGateProfile)
445
+ if ([string]::IsNullOrWhiteSpace($gateProfile)) {
446
+ $gateProfile = $defaultGateProfile
447
+ }
448
+
449
+ $requiredTruthSources = @(ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "required_truth_sources"))
450
+ if ($requiredTruthSources.Count -eq 0) {
451
+ $requiredTruthSources = @($defaultTruthSources)
452
+ }
453
+
454
+ if ($gateProfile -eq "contract_required" -and $requiredTruthSources -notcontains "contract") {
455
+ $requiredTruthSources += "contract"
456
+ }
457
+
458
+ $producesArtifacts = ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "produces_artifacts")
459
+ $phase = [string](Get-ObjectPropertyValue -InputObject $Task -Name "phase" -Default "")
460
+
461
+ return [PSCustomObject]@{
462
+ task_kind = $taskKind
463
+ gate_profile = $gateProfile
464
+ required_truth_sources = ConvertTo-UniqueStringArray -Items $requiredTruthSources
465
+ produces_artifacts = ConvertTo-UniqueStringArray -Items $producesArtifacts
466
+ phase = $phase
467
+ }
468
+ }
469
+
470
+ function Get-DefaultRunProfile {
471
+ <#
472
+ 返回默认 task 会话与子代理策略。
473
+ #>
474
+ return [PSCustomObject]@{
475
+ session = [PSCustomObject]@{
476
+ mode = "fresh-process"
477
+ reuse_previous_chat = $false
478
+ carry_forward_summary = $false
479
+ context_sources = @(
480
+ "AGENTS.md",
481
+ "docs/harness/task-session-strategy.md",
482
+ "docs/harness/architecture.md",
483
+ "docs/harness/knowledge-architecture.md",
484
+ "docs/harness/prompt-knowledge-integration.md",
485
+ "docs/harness/rule-governance.md",
486
+ "docs/harness/regression-rules.md",
487
+ "docs/knowledge/knowledge-catalog.md"
488
+ )
489
+ }
490
+ subagents = [PSCustomObject]@{
491
+ mode = "guided"
492
+ allowed_roles = @(
493
+ "explorer",
494
+ "readonly-research",
495
+ "docs-researcher",
496
+ "planner",
497
+ "architect",
498
+ "reviewer",
499
+ "stage1-reviewer",
500
+ "stage2-reviewer",
501
+ "security-reviewer",
502
+ "test-planner",
503
+ "failure-triage",
504
+ "visual-reviewer",
505
+ "harness-writer",
506
+ "docs-worker",
507
+ "frontend-worker",
508
+ "backend-worker",
509
+ "test-runner"
510
+ )
511
+ max_parallel_roles = 3
512
+ notes = @(
513
+ "Only enable subagents when the task has two or more independent subtasks, or when the controller/session must delegate a file write instead of writing directly.",
514
+ "Subagents must read the matching AGENTS/rules/docs/skills before concluding.",
515
+ "Read-only roles stay read-only and return summaries or concrete results, not full transcripts.",
516
+ "Any repo write outside driver-owned runtime outputs must go to a matching writer role; the controller/main session should not write directly."
517
+ )
518
+ }
519
+ git = [PSCustomObject]@{
520
+ require_clean_workspace = $true
521
+ non_blocking_dirty_paths = @()
522
+ }
523
+ codex = [PSCustomObject]@{
524
+ implementation_sandbox = "danger-full-access"
525
+ review_sandbox = "danger-full-access"
526
+ disable_hooks = $false
527
+ }
528
+ }
529
+ }
530
+
531
+ function Merge-PolicySection {
532
+ <#
533
+ 用覆盖对象更新默认策略对象。
534
+ #>
535
+ param(
536
+ [object]$BaseSection,
537
+ [object]$OverrideSection
538
+ )
539
+
540
+ $merged = [PSCustomObject]@{}
541
+ foreach ($property in $BaseSection.PSObject.Properties) {
542
+ $value = $property.Value
543
+ if ($value -is [System.Array]) {
544
+ $value = @($value)
545
+ }
546
+ Add-Member -InputObject $merged -MemberType NoteProperty -Name $property.Name -Value $value
547
+ }
548
+
549
+ if ($null -eq $OverrideSection) {
550
+ return $merged
551
+ }
552
+
553
+ foreach ($property in $OverrideSection.PSObject.Properties) {
554
+ $value = $property.Value
555
+ if ($value -is [System.Array]) {
556
+ $value = @($value)
557
+ }
558
+
559
+ if ($null -eq $merged.PSObject.Properties[$property.Name]) {
560
+ Add-Member -InputObject $merged -MemberType NoteProperty -Name $property.Name -Value $value
561
+ }
562
+ else {
563
+ $merged.$($property.Name) = $value
564
+ }
565
+ }
566
+
567
+ return $merged
568
+ }
569
+
570
+ function Resolve-RunProfilePath {
571
+ <#
572
+ 解析运行策略文件路径,优先级: 参数 > task.runtime.run_profile。
573
+ #>
574
+ param(
575
+ [string]$Root,
576
+ [string]$ConfiguredPath,
577
+ [object]$TaskDocument
578
+ )
579
+
580
+ $runtime = Get-ObjectPropertyValue -InputObject $TaskDocument -Name "runtime"
581
+ $runtimeProfile = Get-ObjectPropertyValue -InputObject $runtime -Name "run_profile"
582
+ $candidate = $ConfiguredPath
583
+ if ([string]::IsNullOrWhiteSpace($candidate)) {
584
+ $candidate = $runtimeProfile
585
+ }
586
+
587
+ if ([string]::IsNullOrWhiteSpace($candidate)) {
588
+ return $null
589
+ }
590
+
591
+ if ([System.IO.Path]::IsPathRooted($candidate)) {
592
+ return $candidate
593
+ }
594
+
595
+ return Join-Path $Root $candidate
596
+ }
597
+
598
+ function Get-TaskExecutionPolicy {
599
+ <#
600
+ 组合默认 profile、runtime 默认项和 task 覆盖项。
601
+ #>
602
+ param(
603
+ [string]$Root,
604
+ [string]$ConfiguredRunProfilePath,
605
+ [object]$TaskDocument,
606
+ [object]$Task
607
+ )
608
+
609
+ $defaultProfile = Get-DefaultRunProfile
610
+ $resolvedProfilePath = Resolve-RunProfilePath -Root $Root -ConfiguredPath $ConfiguredRunProfilePath -TaskDocument $TaskDocument
611
+ $profileOverrides = $null
612
+ if ($null -ne $resolvedProfilePath -and (Test-Path -LiteralPath $resolvedProfilePath)) {
613
+ $profileOverrides = Get-Content -LiteralPath $resolvedProfilePath -Raw | ConvertFrom-Json
614
+ }
615
+
616
+ $runtime = Get-ObjectPropertyValue -InputObject $TaskDocument -Name "runtime"
617
+ $runtimeSession = Get-ObjectPropertyValue -InputObject $runtime -Name "session"
618
+ $runtimeSubagents = Get-ObjectPropertyValue -InputObject $runtime -Name "subagents"
619
+ $runtimeGit = Get-ObjectPropertyValue -InputObject $runtime -Name "git"
620
+ $runtimeCodex = Get-ObjectPropertyValue -InputObject $runtime -Name "codex"
621
+
622
+ $taskExecution = Get-ObjectPropertyValue -InputObject $Task -Name "execution"
623
+ $taskSession = Get-ObjectPropertyValue -InputObject $taskExecution -Name "session"
624
+ $taskSubagents = Get-ObjectPropertyValue -InputObject $taskExecution -Name "subagents"
625
+ $taskGit = Get-ObjectPropertyValue -InputObject $taskExecution -Name "git"
626
+ $taskCodex = Get-ObjectPropertyValue -InputObject $taskExecution -Name "codex"
627
+
628
+ $session = Merge-PolicySection -BaseSection $defaultProfile.session -OverrideSection (Get-ObjectPropertyValue -InputObject $profileOverrides -Name "session")
629
+ $session = Merge-PolicySection -BaseSection $session -OverrideSection $runtimeSession
630
+ $session = Merge-PolicySection -BaseSection $session -OverrideSection $taskSession
631
+ $session.context_sources = ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $session -Name "context_sources")
632
+
633
+ $subagents = Merge-PolicySection -BaseSection $defaultProfile.subagents -OverrideSection (Get-ObjectPropertyValue -InputObject $profileOverrides -Name "subagents")
634
+ $subagents = Merge-PolicySection -BaseSection $subagents -OverrideSection $runtimeSubagents
635
+ $subagents = Merge-PolicySection -BaseSection $subagents -OverrideSection $taskSubagents
636
+ $subagents.allowed_roles = ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $subagents -Name "allowed_roles")
637
+ $subagents.notes = ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $subagents -Name "notes")
638
+
639
+ $gitPolicy = Merge-PolicySection -BaseSection $defaultProfile.git -OverrideSection (Get-ObjectPropertyValue -InputObject $profileOverrides -Name "git")
640
+ $gitPolicy = Merge-PolicySection -BaseSection $gitPolicy -OverrideSection $runtimeGit
641
+ $gitPolicy = Merge-PolicySection -BaseSection $gitPolicy -OverrideSection $taskGit
642
+ $gitPolicy.non_blocking_dirty_paths = ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $gitPolicy -Name "non_blocking_dirty_paths")
643
+
644
+ $codexPolicy = Merge-PolicySection -BaseSection $defaultProfile.codex -OverrideSection (Get-ObjectPropertyValue -InputObject $profileOverrides -Name "codex")
645
+ $codexPolicy = Merge-PolicySection -BaseSection $codexPolicy -OverrideSection $runtimeCodex
646
+ $codexPolicy = Merge-PolicySection -BaseSection $codexPolicy -OverrideSection $taskCodex
647
+
648
+ $contextFiles = ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "context_files")
649
+ $taskDefaults = Get-TaskDefinitionDefaults -Task $Task
650
+
651
+ return [PSCustomObject]@{
652
+ run_profile_path = $resolvedProfilePath
653
+ session = $session
654
+ subagents = $subagents
655
+ git = $gitPolicy
656
+ codex = $codexPolicy
657
+ context_files = $contextFiles
658
+ task_kind = $taskDefaults.task_kind
659
+ gate_profile = $taskDefaults.gate_profile
660
+ required_truth_sources = $taskDefaults.required_truth_sources
661
+ produces_artifacts = $taskDefaults.produces_artifacts
662
+ phase = $taskDefaults.phase
663
+ }
664
+ }
665
+
666
+ function Invoke-NativeCommandQuiet {
667
+ <#
668
+ 运行原生命令并捕获 stdout/stderr。
669
+ PowerShell 5.1 会把原生命令 stderr 包装成 ErrorRecord;这里避免 warning 触发 Stop。
670
+ #>
671
+ param([scriptblock]$Script)
672
+
673
+ $previousErrorActionPreference = $ErrorActionPreference
674
+ $ErrorActionPreference = "Continue"
675
+ try {
676
+ $output = & $Script 2>&1
677
+ $exitCode = $LASTEXITCODE
678
+ }
679
+ finally {
680
+ $ErrorActionPreference = $previousErrorActionPreference
681
+ }
682
+
683
+ return [PSCustomObject]@{
684
+ ExitCode = $exitCode
685
+ Output = ($output -join "`n")
686
+ }
687
+ }
688
+
689
+ function Test-CodexBlocked {
690
+ <#
691
+ 只识别 Codex 内层按约定输出的固定 BLOCKED 行。
692
+ 不要用宽泛的 "BLOCKED" 匹配,否则英文 blocked/阻塞说明会误判。
693
+ #>
694
+ param([string]$Output)
695
+
696
+ return $Output -cmatch "(?m)^\s*BLOCKED(?:\s+-\s+.*)?\s*$"
697
+ }
698
+
699
+ function Test-RecoverableCodexCompletion {
700
+ <#
701
+ 识别可继续推进的 Codex 完成态:
702
+ - 进程退出码异常或缺失
703
+ - 但 last_message 已存在
704
+ - 且没有触发固定 BLOCKED 标记
705
+ 这类情况交给后续测试和 review 闸门裁决,不在实现阶段直接打成 BLOCKED。
706
+ #>
707
+ param(
708
+ [object]$ExitCode,
709
+ [string]$Output,
710
+ [string]$LastMessage
711
+ )
712
+
713
+ if (($null -ne $ExitCode) -and ([int]$ExitCode -eq 0)) {
714
+ return $false
715
+ }
716
+
717
+ if ([string]::IsNullOrWhiteSpace($LastMessage)) {
718
+ return $false
719
+ }
720
+
721
+ if (Test-CodexBlocked -Output $LastMessage) {
722
+ return $false
723
+ }
724
+
725
+ return $true
726
+ }
727
+
728
+ function Get-TaskDocument {
729
+ <#
730
+ 读取并解析任务文件。
731
+ #>
732
+ param([string]$Path)
733
+
734
+ if (-not (Test-Path -LiteralPath $Path)) {
735
+ throw "找不到任务文件: $Path"
736
+ }
737
+
738
+ return Get-Content -LiteralPath $Path -Raw | ConvertFrom-Json
739
+ }
740
+
741
+ function Select-NextTask {
742
+ <#
743
+ 选择优先级最高且依赖已完成的未通过任务。
744
+ #>
745
+ param([object]$TaskDocument)
746
+
747
+ $completedIds = @{}
748
+ foreach ($task in $TaskDocument.tasks) {
749
+ if ($task.passes -eq $true) {
750
+ $completedIds[$task.id] = $true
751
+ }
752
+ }
753
+
754
+ $candidates = @($TaskDocument.tasks |
755
+ Where-Object { $_.passes -eq $false } |
756
+ Sort-Object priority)
757
+
758
+ foreach ($task in $candidates) {
759
+ $missing = @($task.dependencies | Where-Object { -not $completedIds.ContainsKey($_) })
760
+ if ($missing.Count -eq 0) {
761
+ return $task
762
+ }
763
+ }
764
+
765
+ return $null
766
+ }
767
+
768
+ function Assert-CleanGitWorkspace {
769
+ <#
770
+ 启动前确认 Git 工作区干净,或仅包含允许忽略的非阻塞路径。
771
+ #>
772
+ param(
773
+ [string]$Root,
774
+ [string[]]$NonBlockingPaths = @()
775
+ )
776
+
777
+ $status = & git -c core.quotepath=false -C $Root status --short --untracked-files=all
778
+ if ($LASTEXITCODE -ne 0) {
779
+ throw "当前目录不是有效 Git 仓库: $Root"
780
+ }
781
+
782
+ if (-not $status) {
783
+ return
784
+ }
785
+
786
+ $normalizedAllowedPaths = @()
787
+ foreach ($allowedPath in @(ConvertTo-StringArray -Value $NonBlockingPaths)) {
788
+ $normalized = $allowedPath.Trim()
789
+ if ([string]::IsNullOrWhiteSpace($normalized)) {
790
+ continue
791
+ }
792
+
793
+ $normalized = $normalized.Replace("/", "\")
794
+ if ($normalized.StartsWith(".\")) {
795
+ $normalized = $normalized.Substring(2)
796
+ }
797
+
798
+ $normalizedAllowedPaths += $normalized.TrimStart("\")
799
+ }
800
+
801
+ $disallowedEntries = @()
802
+ foreach ($line in @($status)) {
803
+ if ([string]::IsNullOrWhiteSpace($line)) {
804
+ continue
805
+ }
806
+
807
+ $relativePath = if ($line.Length -ge 4) { $line.Substring(3).Trim() } else { $line.Trim() }
808
+ if ([string]::IsNullOrWhiteSpace($relativePath)) {
809
+ continue
810
+ }
811
+
812
+ $normalizedRelativePath = $relativePath.Replace("/", "\")
813
+ $isAllowed = $false
814
+ foreach ($allowedPath in $normalizedAllowedPaths) {
815
+ if ([string]::IsNullOrWhiteSpace($allowedPath)) {
816
+ continue
817
+ }
818
+
819
+ $directoryPrefix = $allowedPath.TrimEnd("\") + "\"
820
+ if (($normalizedRelativePath -eq $allowedPath) -or $normalizedRelativePath.StartsWith($directoryPrefix, [System.StringComparison]::OrdinalIgnoreCase)) {
821
+ $isAllowed = $true
822
+ break
823
+ }
824
+ }
825
+
826
+ if (-not $isAllowed) {
827
+ $disallowedEntries += $line
828
+ }
829
+ }
830
+
831
+ if ($disallowedEntries.Count -eq 0) {
832
+ return
833
+ }
834
+
835
+ if ($status) {
836
+ $autoCommitSkillPath = Join-Path $Root ".agents\skills\auto-commit\SKILL.md"
837
+ Write-Output "BLOCKED - 需要人工介入"
838
+ Write-Output ""
839
+ Write-Output "当前任务: 未选择"
840
+ Write-Output ""
841
+ Write-Output "阻塞原因:"
842
+ Write-Output "- Git 工作区启动时已有未提交改动。"
843
+ if ($normalizedAllowedPaths.Count -gt 0) {
844
+ Write-Output "- 当前改动不在 non_blocking_dirty_paths 白名单内。"
845
+ }
846
+ Write-Output ""
847
+ Write-Output "检测到的阻塞路径:"
848
+ foreach ($entry in $disallowedEntries) {
849
+ Write-Output "- $entry"
850
+ }
851
+ Write-Output ""
852
+ Write-Output "需要人工操作:"
853
+ Write-Output "1. 提交、暂存或清理这些改动。"
854
+ $nextStepNumber = 2
855
+ if (Test-Path -LiteralPath $autoCommitSkillPath) {
856
+ Write-Output "$nextStepNumber. 如果这些改动就是当前任务的收尾结果、且没有混入用户无关改动,读取 `.agents/skills/auto-commit/SKILL.md` 并执行 Auto Review and Commit 流程。"
857
+ $nextStepNumber++
858
+ }
859
+ if ($normalizedAllowedPaths.Count -gt 0) {
860
+ Write-Output "$nextStepNumber. 如果这些改动属于可忽略运行产物,请把路径加入 runtime.git.non_blocking_dirty_paths。"
861
+ $nextStepNumber++
862
+ }
863
+ Write-Output "$nextStepNumber. 确认没有用户改动会被自动提交混入。"
864
+ exit 2
865
+ }
866
+ }
867
+
868
+ function Invoke-RuntimeDoctor {
869
+ <#
870
+ 在任务执行前检查 runtime 入口、.codex 配置和 harness 深文档是否完整。
871
+ #>
872
+ param([string]$Root)
873
+
874
+ $doctorPath = Join-Path $Root "tools\\harness/doctor.ps1"
875
+ if (-not (Test-Path -LiteralPath $doctorPath)) {
876
+ throw "找不到 runtime doctor: $doctorPath"
877
+ }
878
+
879
+ Push-Location $Root
880
+ try {
881
+ $output = powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\\harness/doctor.ps1 2>&1
882
+ $exitCode = $LASTEXITCODE
883
+ return [PSCustomObject]@{
884
+ ExitCode = $exitCode
885
+ Output = ($output -join "`n")
886
+ }
887
+ }
888
+ finally {
889
+ Pop-Location
890
+ }
891
+ }
892
+
893
+ function Get-PromptTemplate {
894
+ <#
895
+ 优先读取项目内 prompt 模板;不存在时回退到内置模板。
896
+ #>
897
+ param(
898
+ [string]$Root,
899
+ [string]$TemplateName,
900
+ [string]$FallbackTemplate
901
+ )
902
+
903
+ $relativePath = Join-Path ".codex\prompts" $TemplateName
904
+ $fullPath = Join-Path $Root $relativePath
905
+ if (Test-Path -LiteralPath $fullPath) {
906
+ return Get-TextFileContent -Path $fullPath
907
+ }
908
+
909
+ return $FallbackTemplate
910
+ }
911
+
912
+ function New-ImplementationPrompt {
913
+ <#
914
+ 根据任务对象生成给 Codex 的单任务 prompt。
915
+ #>
916
+ param(
917
+ [object]$Task,
918
+ [object]$ExecutionPolicy,
919
+ [string]$TaskSessionId
920
+ )
921
+
922
+ $steps = ($Task.steps | ForEach-Object { "- $_" }) -join "`n"
923
+ $acceptance = ($Task.acceptance | ForEach-Object { "- $_" }) -join "`n"
924
+ $dependencies = @(ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "dependencies"))
925
+ $contextSourcesText = ConvertTo-BulletLines -Items $ExecutionPolicy.session.context_sources
926
+ $contextFilesText = ConvertTo-BulletLines -Items $ExecutionPolicy.context_files -EmptyText "- 无显式任务文件列表;仅按需读取与当前任务直接相关的文件"
927
+ $allowedRoles = @(ConvertTo-StringArray -Value $ExecutionPolicy.subagents.allowed_roles)
928
+ $allowedRolesText = if ($allowedRoles.Count -eq 0) { "none" } else { $allowedRoles -join ", " }
929
+ $subagentNotesText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value $ExecutionPolicy.subagents.notes)
930
+ $requiredTruthSourcesText = ConvertTo-BulletLines -Items $ExecutionPolicy.required_truth_sources -EmptyText "- 无前置 truth source 要求"
931
+ $producesArtifactsText = ConvertTo-BulletLines -Items $ExecutionPolicy.produces_artifacts -EmptyText "- 无显式产物要求"
932
+ $requirementIdsText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "requirement_ids")) -EmptyText "- 未在 task 中显式声明;实现前应先从 TRACEABILITY_MATRIX 或验收示例中确认"
933
+ $architectureConstraintsText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "architecture_constraints")) -EmptyText "- 未在 task 中显式声明;如当前任务需要架构门禁,先从架构约束 truth source 确认"
934
+ $forbiddenImplementationsText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "forbidden_implementations")) -EmptyText "- 未在 task 中显式声明;遵守架构约束 truth source 与项目通用禁止事项"
935
+ $qaContractJson = ConvertTo-PromptJson -Value (Get-ObjectPropertyValue -InputObject $Task -Name "qa_contract")
936
+ $fallbackTemplate = @"
937
+ 你是 Codex 自动实现会话。只处理 Driver Context 中的一个任务。不要修改 task.json、progress.txt、traces/ 或执行 git 命令。先确认验收示例、追溯矩阵和测试影响,再实现最小必要改动;完成后总结修改内容、验证结果和剩余风险。
938
+ "@
939
+ $template = Get-PromptTemplate -Root $ProjectRoot -TemplateName "implement-one-task.md" -FallbackTemplate $fallbackTemplate
940
+
941
+ return @"
942
+ $template
943
+
944
+ ## Driver Context
945
+
946
+ 任务 ID: $($Task.id)
947
+ 任务描述: $($Task.description)
948
+ 任务类型: $($ExecutionPolicy.task_kind)
949
+ Gate Profile: $($ExecutionPolicy.gate_profile)
950
+ Phase: $(if ([string]::IsNullOrWhiteSpace($ExecutionPolicy.phase)) { "未指定" } else { $ExecutionPolicy.phase })
951
+ 优先级: $($Task.priority)
952
+ Requirement IDs:
953
+ $requirementIdsText
954
+ 依赖: $(if ($dependencies.Count -eq 0) { "none" } else { $dependencies -join ", " })
955
+ Task Session ID: $TaskSessionId
956
+
957
+ 会话策略:
958
+ - Session mode: $($ExecutionPolicy.session.mode)
959
+ - Reuse previous chat: $($ExecutionPolicy.session.reuse_previous_chat)
960
+ - Carry forward summary: $($ExecutionPolicy.session.carry_forward_summary)
961
+
962
+ 优先上下文源:
963
+ $contextSourcesText
964
+
965
+ 任务相关文件:
966
+ $contextFilesText
967
+
968
+ 前置 truth source:
969
+ $requiredTruthSourcesText
970
+
971
+ 架构约束:
972
+ $architectureConstraintsText
973
+
974
+ 禁止实现:
975
+ $forbiddenImplementationsText
976
+
977
+ QA Contract:
978
+ ```json
979
+ $qaContractJson
980
+ ```
981
+
982
+ 知识使用:
983
+ - 如果存在 `docs/knowledge/knowledge-catalog.md`,先按任务阶段判断是否需要读取 `docs/knowledge/catalog.md` 和相关条目。
984
+ - 如果引用了知识条目,最终总结必须列出 `knowledge_references`,包含 id、title、used_in 和 path。
985
+ - 如果发现可复用的新经验,最终总结必须列出 `knowledge_outputs` 建议,供 ARCHIVE 任务归档。
986
+
987
+ 预期产物:
988
+ $producesArtifactsText
989
+
990
+ 子代理策略:
991
+ - Mode: $($ExecutionPolicy.subagents.mode)
992
+ - Allowed roles: $allowedRolesText
993
+ - Max parallel roles: $($ExecutionPolicy.subagents.max_parallel_roles)
994
+ - Notes:
995
+ $subagentNotesText
996
+
997
+ 执行步骤:
998
+ $steps
999
+
1000
+ 验收标准:
1001
+ $acceptance
1002
+
1003
+ 测试命令:
1004
+ $($Task.test_command)
1005
+ "@
1006
+ }
1007
+
1008
+ function Get-ExistingRelativePaths {
1009
+ <#
1010
+ 返回工作区内实际存在的相对路径列表。
1011
+ #>
1012
+ param(
1013
+ [string]$Root,
1014
+ [string[]]$RelativePaths
1015
+ )
1016
+
1017
+ $existing = @()
1018
+ foreach ($relativePath in $RelativePaths) {
1019
+ if ([string]::IsNullOrWhiteSpace($relativePath)) {
1020
+ continue
1021
+ }
1022
+
1023
+ $fullPath = Join-Path $Root $relativePath
1024
+ if (Test-Path -LiteralPath $fullPath) {
1025
+ $existing += $relativePath
1026
+ }
1027
+ }
1028
+
1029
+ return $existing
1030
+ }
1031
+
1032
+ function Get-FirstExistingRelativePath {
1033
+ <#
1034
+ 返回候选路径中第一个实际存在的相对路径。
1035
+ #>
1036
+ param(
1037
+ [string]$Root,
1038
+ [string[]]$Candidates
1039
+ )
1040
+
1041
+ foreach ($candidate in @(ConvertTo-StringArray -Value $Candidates)) {
1042
+ $fullPath = Join-Path $Root $candidate
1043
+ if (Test-Path -LiteralPath $fullPath) {
1044
+ return $candidate
1045
+ }
1046
+ }
1047
+
1048
+ return $null
1049
+ }
1050
+
1051
+ function Get-ExistingDevPlans {
1052
+ <#
1053
+ 收集存在的 DEV-PLAN 文件,避免让 reviewer 猜测计划入口。
1054
+ #>
1055
+ param([string]$Root)
1056
+
1057
+ $plansRoot = Join-Path $Root "plans"
1058
+ if (-not (Test-Path -LiteralPath $plansRoot)) {
1059
+ return @()
1060
+ }
1061
+
1062
+ $matches = Get-ChildItem -Path $plansRoot -Recurse -Filter "*.dev-plan.md" -File -ErrorAction SilentlyContinue |
1063
+ Select-Object -First 5
1064
+
1065
+ $paths = @()
1066
+ foreach ($match in $matches) {
1067
+ $paths += $match.FullName.Substring($Root.Length).TrimStart("\", "/")
1068
+ }
1069
+
1070
+ return $paths
1071
+ }
1072
+
1073
+ function Get-TruthSourceState {
1074
+ <#
1075
+ 按 truth source 类型收集已满足和缺失的真相源。
1076
+ #>
1077
+ param(
1078
+ [string]$Root,
1079
+ [string[]]$RequiredTruthSources
1080
+ )
1081
+
1082
+ $states = @()
1083
+ foreach ($truthSource in @(ConvertTo-UniqueStringArray -Items $RequiredTruthSources)) {
1084
+ switch ($truthSource) {
1085
+ "repo_context" {
1086
+ $presentPaths = @()
1087
+ $missingRequirements = @()
1088
+
1089
+ $featurePack = Get-FirstExistingRelativePath -Root $Root -Candidates @(
1090
+ "feature-pack.md",
1091
+ "context\feature-pack.md",
1092
+ "docs\context\feature-pack.md"
1093
+ )
1094
+ if ($null -ne $featurePack) { $presentPaths += $featurePack } else { $missingRequirements += "feature-pack.md | context\\feature-pack.md | docs\\context\\feature-pack.md" }
1095
+
1096
+ $repoMap = Get-FirstExistingRelativePath -Root $Root -Candidates @(
1097
+ "repo-map.md",
1098
+ "context\repo-map.md",
1099
+ "docs\context\repo-map.md",
1100
+ "docs\ai\repo-map.md"
1101
+ )
1102
+ if ($null -ne $repoMap) { $presentPaths += $repoMap } else { $missingRequirements += "repo-map.md | context\\repo-map.md | docs\\context\\repo-map.md | docs\\ai\\repo-map.md" }
1103
+
1104
+ $architectureBrief = Get-FirstExistingRelativePath -Root $Root -Candidates @(
1105
+ "architecture-brief.md",
1106
+ "context\architecture-brief.md",
1107
+ "docs\context\architecture-brief.md",
1108
+ "docs\ai\architecture-brief.md",
1109
+ "docs\architecture\architecture-brief.md"
1110
+ )
1111
+ if ($null -ne $architectureBrief) { $presentPaths += $architectureBrief } else { $missingRequirements += "architecture-brief.md | context\\architecture-brief.md | docs\\context\\architecture-brief.md | docs\\ai\\architecture-brief.md | docs\\architecture\\architecture-brief.md" }
1112
+
1113
+ $states += [PSCustomObject]@{
1114
+ source = $truthSource
1115
+ satisfied = ($missingRequirements.Count -eq 0)
1116
+ present_paths = $presentPaths
1117
+ missing_requirements = $missingRequirements
1118
+ }
1119
+ }
1120
+ "research" {
1121
+ $presentPaths = @()
1122
+ $researchRoot = Join-Path $Root "docs\research"
1123
+ if (Test-Path -LiteralPath $researchRoot) {
1124
+ $presentPaths += @(Get-ChildItem -Path $researchRoot -Recurse -Filter "*.md" -File -ErrorAction SilentlyContinue |
1125
+ ForEach-Object { $_.FullName.Substring($Root.Length).TrimStart("\", "/") })
1126
+ }
1127
+
1128
+ $adrRoot = Join-Path $Root "docs\adr"
1129
+ if (Test-Path -LiteralPath $adrRoot) {
1130
+ $presentPaths += @(Get-ChildItem -Path $adrRoot -Filter "ADR-*.md" -File -ErrorAction SilentlyContinue |
1131
+ ForEach-Object { $_.FullName.Substring($Root.Length).TrimStart("\", "/") })
1132
+ }
1133
+
1134
+ $presentPaths = ConvertTo-UniqueStringArray -Items $presentPaths
1135
+ $missingRequirements = @()
1136
+ if ($presentPaths.Count -eq 0) {
1137
+ $missingRequirements += "docs\\research\\*.md | docs\\adr\\ADR-*.md"
1138
+ }
1139
+
1140
+ $states += [PSCustomObject]@{
1141
+ source = $truthSource
1142
+ satisfied = ($missingRequirements.Count -eq 0)
1143
+ present_paths = $presentPaths
1144
+ missing_requirements = $missingRequirements
1145
+ }
1146
+ }
1147
+ "product" {
1148
+ $requiredPaths = @(
1149
+ "docs\product\prd-lite.md",
1150
+ "docs\product\page-inventory.md",
1151
+ "docs\product\state-matrix.yaml",
1152
+ "docs\product\acceptance-criteria.md",
1153
+ "docs\product\requirement-interface-matrix.md",
1154
+ "docs\product\difficulty-research.md"
1155
+ )
1156
+ $presentPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths $requiredPaths
1157
+ $missingRequirements = @($requiredPaths | Where-Object { $presentPaths -notcontains $_ })
1158
+
1159
+ $states += [PSCustomObject]@{
1160
+ source = $truthSource
1161
+ satisfied = ($missingRequirements.Count -eq 0)
1162
+ present_paths = $presentPaths
1163
+ missing_requirements = $missingRequirements
1164
+ }
1165
+ }
1166
+ "design" {
1167
+ $requiredPaths = @(
1168
+ "docs\design\design-brief.md",
1169
+ "docs\design\component-map.md",
1170
+ "docs\design\screen-states.md",
1171
+ "docs\design\design-tokens.json",
1172
+ "docs\design\ai-image-brief.md",
1173
+ "docs\design\ui-image-review.md",
1174
+ "docs\design\image-to-frontend-spec.md"
1175
+ )
1176
+ $presentPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths $requiredPaths
1177
+ $missingRequirements = @($requiredPaths | Where-Object { $presentPaths -notcontains $_ })
1178
+
1179
+ $states += [PSCustomObject]@{
1180
+ source = $truthSource
1181
+ satisfied = ($missingRequirements.Count -eq 0)
1182
+ present_paths = $presentPaths
1183
+ missing_requirements = $missingRequirements
1184
+ }
1185
+ }
1186
+ "plan" {
1187
+ $presentPaths = Get-ExistingDevPlans -Root $Root
1188
+ $missingRequirements = @()
1189
+ if (@($presentPaths).Count -eq 0) {
1190
+ $missingRequirements += "plans\\**\\*.dev-plan.md"
1191
+ }
1192
+
1193
+ $states += [PSCustomObject]@{
1194
+ source = $truthSource
1195
+ satisfied = ($missingRequirements.Count -eq 0)
1196
+ present_paths = $presentPaths
1197
+ missing_requirements = $missingRequirements
1198
+ }
1199
+ }
1200
+ "architecture" {
1201
+ $requiredPaths = @(
1202
+ "docs\architecture\constraints.md"
1203
+ )
1204
+ $presentPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths $requiredPaths
1205
+ $missingRequirements = @($requiredPaths | Where-Object { $presentPaths -notcontains $_ })
1206
+
1207
+ $states += [PSCustomObject]@{
1208
+ source = $truthSource
1209
+ satisfied = ($missingRequirements.Count -eq 0)
1210
+ present_paths = $presentPaths
1211
+ missing_requirements = $missingRequirements
1212
+ }
1213
+ }
1214
+ "testing" {
1215
+ $requiredPaths = @(
1216
+ "docs\testing\ACCEPTANCE_CRITERIA.md",
1217
+ "docs\testing\ACCEPTANCE_EXAMPLES.md",
1218
+ "docs\testing\NATURAL_LANGUAGE_TEST_CASES.md",
1219
+ "docs\testing\TRACEABILITY_MATRIX.md",
1220
+ "docs\testing\TEST_DATA_MATRIX.md",
1221
+ "docs\testing\test-matrix.md",
1222
+ "docs\testing\verify-matrix.md"
1223
+ )
1224
+ $presentPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths $requiredPaths
1225
+ $missingRequirements = @($requiredPaths | Where-Object { $presentPaths -notcontains $_ })
1226
+
1227
+ $states += [PSCustomObject]@{
1228
+ source = $truthSource
1229
+ satisfied = ($missingRequirements.Count -eq 0)
1230
+ present_paths = $presentPaths
1231
+ missing_requirements = $missingRequirements
1232
+ }
1233
+ }
1234
+ "contract" {
1235
+ $candidatePaths = @(
1236
+ "contracts\openapi.yaml",
1237
+ "docs\harness\install-manifest-governance.md",
1238
+ "docs\agent-package-redesign\migration-plan.md",
1239
+ "docs\agent-package-redesign\target-layering-standard.md"
1240
+ )
1241
+ $presentPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths $candidatePaths
1242
+ $missingRequirements = @()
1243
+ if (@($presentPaths).Count -eq 0) {
1244
+ $missingRequirements += "contracts\\openapi.yaml | docs\\harness\\install-manifest-governance.md | docs\\agent-package-redesign\\migration-plan.md | docs\\agent-package-redesign\\target-layering-standard.md"
1245
+ }
1246
+
1247
+ $states += [PSCustomObject]@{
1248
+ source = $truthSource
1249
+ satisfied = ($missingRequirements.Count -eq 0)
1250
+ present_paths = $presentPaths
1251
+ missing_requirements = $missingRequirements
1252
+ }
1253
+ }
1254
+ "knowledge" {
1255
+ $requiredPaths = @(
1256
+ "docs\knowledge\knowledge-catalog.md",
1257
+ "docs\knowledge\catalog.md"
1258
+ )
1259
+ $presentPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths $requiredPaths
1260
+ $missingRequirements = @($requiredPaths | Where-Object { $presentPaths -notcontains $_ })
1261
+
1262
+ $states += [PSCustomObject]@{
1263
+ source = $truthSource
1264
+ satisfied = ($missingRequirements.Count -eq 0)
1265
+ present_paths = $presentPaths
1266
+ missing_requirements = $missingRequirements
1267
+ }
1268
+ }
1269
+ default {
1270
+ $states += [PSCustomObject]@{
1271
+ source = $truthSource
1272
+ satisfied = $false
1273
+ present_paths = @()
1274
+ missing_requirements = @("unsupported truth source")
1275
+ }
1276
+ }
1277
+ }
1278
+ }
1279
+
1280
+ return $states
1281
+ }
1282
+
1283
+ function Convert-TruthSourceStateToBulletLines {
1284
+ <#
1285
+ 将 truth source 满足情况格式化成多行 bullet。
1286
+ #>
1287
+ param([object[]]$States)
1288
+
1289
+ if ($null -eq $States -or $States.Count -eq 0) {
1290
+ return "- 无前置 truth source 要求"
1291
+ }
1292
+
1293
+ $lines = @()
1294
+ foreach ($state in $States) {
1295
+ $status = if ($state.satisfied) { "OK" } else { "MISSING" }
1296
+ $presentPaths = @($state.present_paths)
1297
+ $missingRequirements = @($state.missing_requirements)
1298
+ $presentText = if ($presentPaths.Count -gt 0) { $presentPaths -join ", " } else { "无" }
1299
+ $missingText = if ($missingRequirements.Count -gt 0) { $missingRequirements -join "; " } else { "无" }
1300
+ $lines += "- [$status] $($state.source): present=$presentText; missing=$missingText"
1301
+ }
1302
+
1303
+ return $lines -join "`n"
1304
+ }
1305
+
1306
+ function Get-ReviewPromptTemplate {
1307
+ <#
1308
+ 优先读取项目内 prompt 模板;不存在时回退到内置模板。
1309
+ #>
1310
+ param(
1311
+ [string]$Root,
1312
+ [string]$TemplateName,
1313
+ [string]$FallbackTemplate
1314
+ )
1315
+
1316
+ return Get-PromptTemplate -Root $Root -TemplateName $TemplateName -FallbackTemplate $FallbackTemplate
1317
+ }
1318
+
1319
+ function Get-ReviewContextPaths {
1320
+ <#
1321
+ 收集两阶段审查需要优先对照的真相源文件。
1322
+ #>
1323
+ param(
1324
+ [string]$Root,
1325
+ [object]$ExecutionPolicy
1326
+ )
1327
+
1328
+ $productPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths @(
1329
+ "docs\product\prd-lite.md",
1330
+ "docs\product\page-inventory.md",
1331
+ "docs\product\state-matrix.yaml",
1332
+ "docs\product\acceptance-criteria.md",
1333
+ "docs\product\requirement-interface-matrix.md",
1334
+ "docs\product\difficulty-research.md"
1335
+ )
1336
+
1337
+ $designPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths @(
1338
+ "docs\design\design-brief.md",
1339
+ "docs\design\component-map.md",
1340
+ "docs\design\screen-states.md",
1341
+ "docs\design\design-tokens.json",
1342
+ "docs\design\ai-image-brief.md",
1343
+ "docs\design\ui-image-review.md",
1344
+ "docs\design\image-to-frontend-spec.md"
1345
+ )
1346
+
1347
+ $contractPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths @(
1348
+ "contracts\openapi.yaml"
1349
+ )
1350
+ $testingPaths = Get-ExistingRelativePaths -Root $Root -RelativePaths @(
1351
+ "docs\testing\ACCEPTANCE_CRITERIA.md",
1352
+ "docs\testing\ACCEPTANCE_EXAMPLES.md",
1353
+ "docs\testing\NATURAL_LANGUAGE_TEST_CASES.md",
1354
+ "docs\testing\TRACEABILITY_MATRIX.md",
1355
+ "docs\testing\TEST_STRATEGY.md",
1356
+ "docs\testing\RISK_BASED_TEST_PLAN.md",
1357
+ "docs\testing\TEST_DATA_MATRIX.md",
1358
+ "docs\testing\EVIDENCE_PROTOCOL.md",
1359
+ "docs\testing\REGRESSION_PLAN.md",
1360
+ "docs\testing\test-matrix.md",
1361
+ "docs\testing\test-data-plan.md",
1362
+ "docs\testing\verify-matrix.md",
1363
+ "docs\testing\failure-triage.md"
1364
+ )
1365
+
1366
+ $planPaths = Get-ExistingDevPlans -Root $Root
1367
+ $contextFiles = Get-ExistingRelativePaths -Root $Root -RelativePaths $ExecutionPolicy.context_files
1368
+ $truthSourceState = Get-TruthSourceState -Root $Root -RequiredTruthSources $ExecutionPolicy.required_truth_sources
1369
+
1370
+ return [PSCustomObject]@{
1371
+ product = $productPaths
1372
+ design = $designPaths
1373
+ contracts = $contractPaths
1374
+ testing = $testingPaths
1375
+ plans = $planPaths
1376
+ task_context = $contextFiles
1377
+ truth_source_state = $truthSourceState
1378
+ missing_truth_sources = @($truthSourceState | Where-Object { -not $_.satisfied } | ForEach-Object { $_.source })
1379
+ }
1380
+ }
1381
+
1382
+ function Get-ReviewVerdict {
1383
+ <#
1384
+ 从 reviewer 输出中提取 PASS / FAIL,未显式给出时返回 UNKNOWN。
1385
+ #>
1386
+ param([string]$Output)
1387
+
1388
+ $sectionMatches = [regex]::Matches($Output, '(?ims)^\s*#{1,6}\s*(?:Final\s+)?Verdict\s*$([\s\S]*?)(?=^\s*#{1,6}\s+\S|\z)')
1389
+ if ($sectionMatches.Count -gt 0) {
1390
+ $lastSection = $sectionMatches[$sectionMatches.Count - 1].Groups[1].Value
1391
+ $sectionVerdict = [regex]::Match($lastSection, '(?im)^\s*(?:[-*]\s*)?(?:Verdict\s*[::]\s*)?(PASS|FAIL)\b')
1392
+ if ($sectionVerdict.Success) {
1393
+ return $sectionVerdict.Groups[1].Value.ToUpperInvariant()
1394
+ }
1395
+ }
1396
+
1397
+ $matches = [regex]::Matches($Output, '(?im)^\s*(?:[-*]\s*)?(?:Final\s+Verdict|Verdict)\s*[::]\s*(PASS|FAIL)\b|^\s*[-*]\s*(PASS|FAIL)\b')
1398
+ if ($matches.Count -gt 0) {
1399
+ $lastMatch = $matches[$matches.Count - 1]
1400
+ foreach ($group in $lastMatch.Groups) {
1401
+ if ($group.Value -in @("PASS", "FAIL")) {
1402
+ return $group.Value.ToUpperInvariant()
1403
+ }
1404
+ }
1405
+ }
1406
+
1407
+ return "UNKNOWN"
1408
+ }
1409
+
1410
+ function New-Stage1ReviewPrompt {
1411
+ <#
1412
+ 生成 Stage 1:Spec / 设计一致性审查 prompt。
1413
+ #>
1414
+ param(
1415
+ [object]$Task,
1416
+ [string]$Root,
1417
+ [object]$ExecutionPolicy,
1418
+ [object]$ReviewContext
1419
+ )
1420
+
1421
+ $fallbackTemplate = @"
1422
+ 你是 Stage 1 Reviewer。只审查当前实现是否符合 Product Spec / Design Brief / 设计稿 / DEV-PLAN,不要讨论代码风格。
1423
+ "@
1424
+
1425
+ $template = Get-ReviewPromptTemplate -Root $Root -TemplateName "review-stage1-spec.md" -FallbackTemplate $fallbackTemplate
1426
+ $productText = ConvertTo-BulletLines -Items $ReviewContext.product
1427
+ $designText = ConvertTo-BulletLines -Items $ReviewContext.design
1428
+ $testingText = ConvertTo-BulletLines -Items $ReviewContext.testing
1429
+ $planText = ConvertTo-BulletLines -Items $ReviewContext.plans
1430
+ $contractText = ConvertTo-BulletLines -Items $ReviewContext.contracts
1431
+ $contextFilesText = ConvertTo-BulletLines -Items $ReviewContext.task_context
1432
+ $truthSourceStateText = Convert-TruthSourceStateToBulletLines -States $ReviewContext.truth_source_state
1433
+ $acceptanceText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value $Task.acceptance)
1434
+ $requirementIdsText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "requirement_ids")) -EmptyText "- 未显式声明 Requirement IDs"
1435
+
1436
+ return @"
1437
+ $template
1438
+
1439
+ ## Driver Context
1440
+
1441
+ - Task ID: $($Task.id)
1442
+ - 描述: $($Task.description)
1443
+ - Task Kind: $($ExecutionPolicy.task_kind)
1444
+ - Gate Profile: $($ExecutionPolicy.gate_profile)
1445
+ - Requirement IDs:
1446
+ $requirementIdsText
1447
+ - 验收标准:
1448
+ $acceptanceText
1449
+
1450
+ 优先真相源:
1451
+
1452
+ ### Product
1453
+ $productText
1454
+
1455
+ ### Design
1456
+ $designText
1457
+
1458
+ ### Testing
1459
+ $testingText
1460
+
1461
+ ### DEV-PLAN
1462
+ $planText
1463
+
1464
+ ### Contract
1465
+ $contractText
1466
+
1467
+ ### Task Context Files
1468
+ $contextFilesText
1469
+
1470
+ ### Truth Source Completeness
1471
+ $truthSourceStateText
1472
+
1473
+ 审查要求:
1474
+ - 只看功能完整性、状态覆盖、与设计和计划的一致性。
1475
+ - 不要重写代码,不要实现新功能。
1476
+ - 对 `feature_plan` / 文档契约任务,如果 Product / DEV-PLAN 为空,但 Task Context Files、Truth Source Completeness、Requirement IDs 和验收标准已经给出等价规格来源,不要仅因 Product / DEV-PLAN 为空判 FAIL。
1477
+ - 如果 Gate Profile 不是 `lightweight`,缺少 required truth source 视为阻塞性问题。
1478
+ - 如果 Gate Profile 是 `lightweight`,可以记录缺口,但不要把 driver 自己负责的状态文件当作失败项。
1479
+
1480
+ 输出要求:
1481
+ - 必须包含 `Verdict: PASS` 或 `Verdict: FAIL`。
1482
+ - 只要存在阻塞性功能/状态/设计偏差,就输出 `Verdict: FAIL`。
1483
+ "@
1484
+ }
1485
+
1486
+ function New-Stage2ReviewPrompt {
1487
+ <#
1488
+ 生成 Stage 2:代码质量 / 测试风险审查 prompt。
1489
+ #>
1490
+ param(
1491
+ [object]$Task,
1492
+ [string]$Root,
1493
+ [object]$ExecutionPolicy,
1494
+ [object]$ReviewContext,
1495
+ [object]$TestResult
1496
+ )
1497
+
1498
+ $fallbackTemplate = @"
1499
+ 你是 Stage 2 Reviewer。Stage 1 已通过。现在只审查代码质量、测试、风险和可维护性,不要重新做需求裁判。
1500
+ "@
1501
+
1502
+ $template = Get-ReviewPromptTemplate -Root $Root -TemplateName "review-stage2-quality.md" -FallbackTemplate $fallbackTemplate
1503
+ $contextFilesText = ConvertTo-BulletLines -Items $ReviewContext.task_context
1504
+ $contractText = ConvertTo-BulletLines -Items $ReviewContext.contracts
1505
+ $testingText = ConvertTo-BulletLines -Items $ReviewContext.testing
1506
+ $requirementIdsText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "requirement_ids")) -EmptyText "- 未显式声明 Requirement IDs"
1507
+ $qaContractJson = ConvertTo-PromptJson -Value (Get-ObjectPropertyValue -InputObject $Task -Name "qa_contract")
1508
+
1509
+ return @"
1510
+ $template
1511
+
1512
+ ## Driver Context
1513
+
1514
+ - Task ID: $($Task.id)
1515
+ - 描述: $($Task.description)
1516
+ - Requirement IDs:
1517
+ $requirementIdsText
1518
+ - 测试命令: $($Task.test_command)
1519
+ - 测试退出码: $($TestResult.ExitCode)
1520
+
1521
+ 任务相关文件:
1522
+ $contextFilesText
1523
+
1524
+ Contract 真相源:
1525
+ $contractText
1526
+
1527
+ Testing 真相源:
1528
+ $testingText
1529
+
1530
+ QA Contract:
1531
+ ```json
1532
+ $qaContractJson
1533
+ ```
1534
+
1535
+ 测试输出摘要:
1536
+ $($TestResult.Output)
1537
+
1538
+ 审查要求:
1539
+ - 只讨论代码质量、测试覆盖、回归风险、安全风险和可维护性。
1540
+ - 不要回到 Stage 1 的需求/设计裁判。
1541
+
1542
+ 输出要求:
1543
+ - 必须包含 `Verdict: PASS` 或 `Verdict: FAIL`。
1544
+ - 只要存在阻塞性质量问题或关键测试缺口,就输出 `Verdict: FAIL`。
1545
+ "@
1546
+ }
1547
+
1548
+ function Invoke-CodexTask {
1549
+ <#
1550
+ 调用 codex exec 运行单任务。
1551
+ 原始输出写入日志文件,终端只显示 driver 摘要。
1552
+ #>
1553
+ param(
1554
+ [string]$Prompt,
1555
+ [string]$Root,
1556
+ [string]$Command,
1557
+ [string]$LogDirectory,
1558
+ [string]$TaskId,
1559
+ [string]$Sandbox = "danger-full-access",
1560
+ [string]$ActivityLabel = "Codex",
1561
+ [int]$HeartbeatSeconds = 20,
1562
+ [bool]$DisableHooks = $false,
1563
+ [switch]$CaptureJsonEvents
1564
+ )
1565
+
1566
+ New-Item -ItemType Directory -Force -Path $LogDirectory | Out-Null
1567
+
1568
+ $safeTimestamp = Get-Date -Format "yyyyMMdd-HHmmss"
1569
+ $promptPath = Join-Path $LogDirectory "$TaskId-$safeTimestamp-prompt.txt"
1570
+ $stdoutPath = Join-Path $LogDirectory "$TaskId-$safeTimestamp-codex-output.log"
1571
+ $stderrPath = Join-Path $LogDirectory "$TaskId-$safeTimestamp-codex-error.log"
1572
+ $lastMessagePath = Join-Path $LogDirectory "$TaskId-$safeTimestamp-codex-final.txt"
1573
+
1574
+ Set-Content -LiteralPath $promptPath -Value $Prompt -Encoding UTF8
1575
+
1576
+ $arguments = @(
1577
+ "exec",
1578
+ "--sandbox",
1579
+ $Sandbox,
1580
+ "--color",
1581
+ "never"
1582
+ )
1583
+ if ($DisableHooks) {
1584
+ $arguments += @(
1585
+ "--disable",
1586
+ "hooks"
1587
+ )
1588
+ }
1589
+ $arguments += @(
1590
+ "--output-last-message",
1591
+ $lastMessagePath,
1592
+ "-C",
1593
+ $Root,
1594
+ "-"
1595
+ )
1596
+ if ($CaptureJsonEvents) {
1597
+ $arguments += "--json"
1598
+ }
1599
+
1600
+ $process = Start-Process `
1601
+ -FilePath $Command `
1602
+ -ArgumentList $arguments `
1603
+ -WorkingDirectory $Root `
1604
+ -RedirectStandardInput $promptPath `
1605
+ -RedirectStandardOutput $stdoutPath `
1606
+ -RedirectStandardError $stderrPath `
1607
+ -NoNewWindow `
1608
+ -PassThru
1609
+
1610
+ Write-Step "$ActivityLabel 已启动,PID=$($process.Id),日志: $stdoutPath"
1611
+
1612
+ $startedAt = Get-Date
1613
+ $lastHeartbeatAt = $startedAt.AddSeconds(-1 * $HeartbeatSeconds)
1614
+ while (-not $process.HasExited) {
1615
+ Start-Sleep -Seconds 2
1616
+ $process.Refresh()
1617
+
1618
+ $now = Get-Date
1619
+ if (($now - $lastHeartbeatAt).TotalSeconds -lt $HeartbeatSeconds) {
1620
+ continue
1621
+ }
1622
+
1623
+ $elapsed = [int]($now - $startedAt).TotalSeconds
1624
+ $preview = Get-CompactLogPreview -Path $stdoutPath
1625
+ if ([string]::IsNullOrWhiteSpace($preview)) {
1626
+ $preview = Get-CompactLogPreview -Path $stderrPath
1627
+ }
1628
+
1629
+ if ([string]::IsNullOrWhiteSpace($preview)) {
1630
+ Write-Step "$ActivityLabel 仍在运行,已耗时 ${elapsed}s,日志: $stdoutPath"
1631
+ }
1632
+ else {
1633
+ Write-Step "$ActivityLabel 仍在运行,已耗时 ${elapsed}s,最近输出: $preview"
1634
+ }
1635
+
1636
+ $lastHeartbeatAt = $now
1637
+ }
1638
+
1639
+ $process.WaitForExit()
1640
+
1641
+ $stdout = Get-TextFileContent -Path $stdoutPath
1642
+ $stderr = Get-TextFileContent -Path $stderrPath
1643
+ $lastMessage = Get-TextFileContent -Path $lastMessagePath
1644
+ $combinedOutput = @($stdout, $stderr, $lastMessage) -join "`n"
1645
+ $reviewOutput = if ([string]::IsNullOrWhiteSpace($lastMessage)) { $combinedOutput } else { $lastMessage }
1646
+
1647
+ return [PSCustomObject]@{
1648
+ ExitCode = $process.ExitCode
1649
+ Output = $combinedOutput
1650
+ ReviewOutput = $reviewOutput
1651
+ LastMessage = $lastMessage
1652
+ StdoutLog = $stdoutPath
1653
+ StderrLog = $stderrPath
1654
+ PromptLog = $promptPath
1655
+ LastMessageLog = $lastMessagePath
1656
+ EventsLog = $(if ($CaptureJsonEvents) { $stdoutPath } else { $null })
1657
+ }
1658
+ }
1659
+
1660
+ function Get-TaskLogDirectory {
1661
+ <#
1662
+ 为当前 task session 创建持久日志目录。
1663
+ #>
1664
+ param(
1665
+ [string]$TraceRoot,
1666
+ [string]$TaskId,
1667
+ [string]$TaskSessionId
1668
+ )
1669
+
1670
+ $taskDirectory = Join-Path $TraceRoot "$TaskId-$TaskSessionId"
1671
+ New-Item -ItemType Directory -Force -Path $taskDirectory | Out-Null
1672
+ return $taskDirectory
1673
+ }
1674
+
1675
+ function Get-TraceLogFiles {
1676
+ <#
1677
+ 汇总当前 task session 已产生的日志文件路径。
1678
+ #>
1679
+ param([object[]]$CodexResults)
1680
+
1681
+ $paths = @()
1682
+ foreach ($result in @($CodexResults)) {
1683
+ if ($null -eq $result) {
1684
+ continue
1685
+ }
1686
+
1687
+ $paths += ConvertTo-StringArray -Value @(
1688
+ $result.StdoutLog,
1689
+ $result.StderrLog,
1690
+ $result.PromptLog,
1691
+ $result.LastMessageLog
1692
+ )
1693
+ }
1694
+
1695
+ return ConvertTo-UniqueStringArray -Items $paths
1696
+ }
1697
+
1698
+ function Add-TraceDurableFields {
1699
+ <#
1700
+ 为 trace payload 补齐 durable trace schema 字段。
1701
+ #>
1702
+ param(
1703
+ [object]$Trace,
1704
+ [string]$SessionDirectory,
1705
+ [switch]$CaptureJsonEvents,
1706
+ [object]$EventsSource,
1707
+ [string[]]$LogFiles
1708
+ )
1709
+
1710
+ Add-Member -InputObject $Trace -MemberType NoteProperty -Name "schema_version" -Value "2.0.0" -Force
1711
+ Add-Member -InputObject $Trace -MemberType NoteProperty -Name "session_dir" -Value $SessionDirectory -Force
1712
+ Add-Member -InputObject $Trace -MemberType NoteProperty -Name "events_file" -Value $(if ($CaptureJsonEvents -and $null -ne $EventsSource) { $EventsSource.EventsLog } else { $null }) -Force
1713
+ Add-Member -InputObject $Trace -MemberType NoteProperty -Name "log_files" -Value @(ConvertTo-StringArray -Value $LogFiles) -Force
1714
+ Add-Member -InputObject $Trace -MemberType NoteProperty -Name "evidence_files" -Value @() -Force
1715
+ if ($null -eq (Get-ObjectPropertyValue -InputObject $Trace -Name "knowledge_references")) {
1716
+ Add-Member -InputObject $Trace -MemberType NoteProperty -Name "knowledge_references" -Value @() -Force
1717
+ }
1718
+ if ($null -eq (Get-ObjectPropertyValue -InputObject $Trace -Name "knowledge_outputs")) {
1719
+ Add-Member -InputObject $Trace -MemberType NoteProperty -Name "knowledge_outputs" -Value @() -Force
1720
+ }
1721
+ if ($null -eq (Get-ObjectPropertyValue -InputObject $Trace -Name "archive_summary")) {
1722
+ Add-Member -InputObject $Trace -MemberType NoteProperty -Name "archive_summary" -Value $null -Force
1723
+ }
1724
+ return $Trace
1725
+ }
1726
+
1727
+ function Invoke-TestCommand {
1728
+ <#
1729
+ 执行任务指定的验证命令,并在需要时持久化测试输出。
1730
+ #>
1731
+ param(
1732
+ [string]$Command,
1733
+ [string]$Root,
1734
+ [string]$LogDirectory = "",
1735
+ [string]$TaskId = "task"
1736
+ )
1737
+
1738
+ Push-Location $Root
1739
+ try {
1740
+ $previousErrorActionPreference = $ErrorActionPreference
1741
+ $ErrorActionPreference = "Continue"
1742
+ try {
1743
+ $output = powershell -NoProfile -Command "& { `$ErrorActionPreference = 'Continue'; $Command }" 2>&1
1744
+ }
1745
+ finally {
1746
+ $ErrorActionPreference = $previousErrorActionPreference
1747
+ }
1748
+ $exitCode = $LASTEXITCODE
1749
+ $outputText = ($output -join "`n")
1750
+ $outputLog = $null
1751
+ if (-not [string]::IsNullOrWhiteSpace($LogDirectory)) {
1752
+ New-Item -ItemType Directory -Force -Path $LogDirectory | Out-Null
1753
+ $safeTimestamp = Get-Date -Format "yyyyMMdd-HHmmss"
1754
+ $outputLog = Join-Path $LogDirectory "$TaskId-test-$safeTimestamp.log"
1755
+ Set-Content -LiteralPath $outputLog -Value $outputText -Encoding UTF8
1756
+ }
1757
+
1758
+ return [PSCustomObject]@{
1759
+ ExitCode = $exitCode
1760
+ Output = $outputText
1761
+ OutputLog = $outputLog
1762
+ }
1763
+ }
1764
+ finally {
1765
+ Pop-Location
1766
+ }
1767
+ }
1768
+
1769
+ function Invoke-FailureTriage {
1770
+ <#
1771
+ 在测试失败后运行只读失败归因链路,输出结构化 triage 结果。
1772
+ #>
1773
+ param(
1774
+ [object]$Task,
1775
+ [string]$Root,
1776
+ [object]$ExecutionPolicy,
1777
+ [object]$ReviewContext,
1778
+ [object]$CodexResult,
1779
+ [object]$Stage1Result,
1780
+ [object]$TestResult,
1781
+ [string]$CodexCommand,
1782
+ [string]$LogDirectory,
1783
+ [switch]$CaptureJsonEvents
1784
+ )
1785
+
1786
+ $template = Get-PromptTemplate -Root $Root -TemplateName "failure-triage.md"
1787
+ $requirementIdsText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $Task -Name "requirement_ids")) -EmptyText "- 未显式声明 Requirement IDs"
1788
+ $acceptanceText = ConvertTo-BulletLines -Items (ConvertTo-StringArray -Value $Task.acceptance)
1789
+ $contextFilesText = ConvertTo-BulletLines -Items $ReviewContext.task_context
1790
+ $testingText = ConvertTo-BulletLines -Items $ReviewContext.testing
1791
+ $truthSourceStateText = Convert-TruthSourceStateToBulletLines -States $ReviewContext.truth_source_state
1792
+ $triageOutputPath = Join-Path $LogDirectory "$($Task.id)-failure-triage.json"
1793
+ $testOutputPathText = if ([string]::IsNullOrWhiteSpace($TestResult.OutputLog)) { "- 无测试日志文件" } else { "- $($TestResult.OutputLog)" }
1794
+
1795
+ $prompt = @"
1796
+ $template
1797
+
1798
+ ## Driver Context
1799
+
1800
+ - Task ID: $($Task.id)
1801
+ - 描述: $($Task.description)
1802
+ - Requirement IDs:
1803
+ $requirementIdsText
1804
+ - 验收标准:
1805
+ $acceptanceText
1806
+ - 失败来源: test
1807
+ - 测试命令: $($Task.test_command)
1808
+ - 测试退出码: $($TestResult.ExitCode)
1809
+
1810
+ ### Task Context Files
1811
+ $contextFilesText
1812
+
1813
+ ### Testing Truth Sources
1814
+ $testingText
1815
+
1816
+ ### Truth Source Completeness
1817
+ $truthSourceStateText
1818
+
1819
+ ### Evidence Files
1820
+ - 实现 stdout: $($CodexResult.StdoutLog)
1821
+ - 实现 stderr: $($CodexResult.StderrLog)
1822
+ - Stage 1 stdout: $($Stage1Result.StdoutLog)
1823
+ - Stage 1 stderr: $($Stage1Result.StderrLog)
1824
+ $testOutputPathText
1825
+
1826
+ ### Raw Test Output
1827
+ ```text
1828
+ $($TestResult.Output)
1829
+ ```
1830
+
1831
+ 输出要求:
1832
+ - 只输出一个合法 JSON 对象。
1833
+ - 必须包含 findings 数组;没有 finding 也要输出空数组。
1834
+ - 优先把失败归类为 `TEST_CODE_ISSUE`、`PRODUCT_BUG`、`REQUIREMENT_CHANGE`、`ENV_OR_DATA_ISSUE` 或 `FLAKY`。
1835
+ "@
1836
+
1837
+ $triageResult = Invoke-CodexTask `
1838
+ -Prompt $prompt `
1839
+ -Root $Root `
1840
+ -Command $CodexCommand `
1841
+ -LogDirectory $LogDirectory `
1842
+ -TaskId "$($Task.id)-failure-triage" `
1843
+ -Sandbox $ExecutionPolicy.codex.review_sandbox `
1844
+ -ActivityLabel "Failure Triage" `
1845
+ -DisableHooks $ExecutionPolicy.codex.disable_hooks `
1846
+ -CaptureJsonEvents:$CaptureJsonEvents
1847
+
1848
+ $triageJson = $triageResult.Output
1849
+ if ([string]::IsNullOrWhiteSpace($triageJson)) {
1850
+ $triageJson = $triageResult.LastMessage
1851
+ }
1852
+
1853
+ $reportPath = $null
1854
+ $parseError = $null
1855
+ if (-not [string]::IsNullOrWhiteSpace($triageJson)) {
1856
+ try {
1857
+ $triageObject = $triageJson | ConvertFrom-Json -ErrorAction Stop
1858
+ $triageObject | ConvertTo-Json -Depth 12 | Set-Content -LiteralPath $triageOutputPath -Encoding UTF8
1859
+ $reportPath = $triageOutputPath
1860
+ }
1861
+ catch {
1862
+ $parseError = $_.Exception.Message
1863
+ }
1864
+ }
1865
+
1866
+ return [PSCustomObject]@{
1867
+ ExitCode = $triageResult.ExitCode
1868
+ Output = $triageResult.Output
1869
+ LastMessage = $triageResult.LastMessage
1870
+ StdoutLog = $triageResult.StdoutLog
1871
+ StderrLog = $triageResult.StderrLog
1872
+ PromptLog = $triageResult.PromptLog
1873
+ LastMessageLog = $triageResult.LastMessageLog
1874
+ ReportPath = $reportPath
1875
+ ParseError = $parseError
1876
+ }
1877
+ }
1878
+
1879
+ function Write-ProgressEntry {
1880
+ <#
1881
+ 追加固定格式的人类可读进度记录。
1882
+ #>
1883
+ param(
1884
+ [string]$Path,
1885
+ [object]$Task,
1886
+ [string]$WorkSummary,
1887
+ [string]$TestSummary,
1888
+ [string]$Notes,
1889
+ [string]$Stage1Summary = "未运行",
1890
+ [string]$Stage2Summary = "未运行"
1891
+ )
1892
+
1893
+ $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm"
1894
+ $entry = @"
1895
+ ## [$timestamp] - Task: $($Task.id) $($Task.description)
1896
+
1897
+ ### 完成的工作:
1898
+ - $WorkSummary
1899
+
1900
+ ### 测试结果:
1901
+ - $TestSummary
1902
+
1903
+ ### 审查结果:
1904
+ - Stage 1: $Stage1Summary
1905
+ - Stage 2: $Stage2Summary
1906
+
1907
+ ### 备注:
1908
+ - $Notes
1909
+ "@
1910
+ Add-Content -LiteralPath $Path -Value $entry
1911
+ }
1912
+
1913
+ function Save-Trace {
1914
+ <#
1915
+ 保存机器可读 trace。
1916
+ #>
1917
+ param(
1918
+ [string]$Directory,
1919
+ [object]$Trace
1920
+ )
1921
+
1922
+ New-Item -ItemType Directory -Force -Path $Directory | Out-Null
1923
+ $safeTimestamp = Get-Date -Format "yyyyMMdd-HHmmss"
1924
+ $path = Join-Path $Directory "$($Trace.task_id)-$safeTimestamp.json"
1925
+ $Trace | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $path -Encoding UTF8
1926
+ return $path
1927
+ }
1928
+
1929
+ function Set-TaskPassed {
1930
+ <#
1931
+ 将指定任务标记为通过并写回 JSON。
1932
+ #>
1933
+ param(
1934
+ [object]$TaskDocument,
1935
+ [string]$TaskId,
1936
+ [string]$Path
1937
+ )
1938
+
1939
+ foreach ($task in $TaskDocument.tasks) {
1940
+ if ($task.id -eq $TaskId) {
1941
+ $task.passes = $true
1942
+ }
1943
+ }
1944
+
1945
+ $TaskDocument | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $Path -Encoding UTF8
1946
+ }
1947
+
1948
+ function Get-TaskExecutionMode {
1949
+ <#
1950
+ 返回任务执行模式。默认 single。
1951
+ #>
1952
+ param([object]$Task)
1953
+
1954
+ $execution = Get-ObjectPropertyValue -InputObject $Task -Name "execution"
1955
+ $mode = Get-ObjectPropertyValue -InputObject $execution -Name "mode"
1956
+ if ([string]::IsNullOrWhiteSpace($mode)) {
1957
+ $mode = Get-ObjectPropertyValue -InputObject $Task -Name "mode" -Default "single"
1958
+ }
1959
+
1960
+ return ([string]$mode).Trim().ToLowerInvariant()
1961
+ }
1962
+
1963
+ function Invoke-OneTask {
1964
+ <#
1965
+ 执行单个任务闭环。
1966
+ #>
1967
+ param(
1968
+ [string]$TaskPath,
1969
+ [string]$ProgressPath,
1970
+ [string]$TracePath
1971
+ )
1972
+
1973
+ $startedAt = Get-Date
1974
+ $taskDocument = Get-TaskDocument -Path $TaskPath
1975
+ $task = Select-NextTask -TaskDocument $taskDocument
1976
+
1977
+ if ($null -eq $task) {
1978
+ return [PSCustomObject]@{
1979
+ Status = "idle"
1980
+ TaskId = $null
1981
+ }
1982
+ }
1983
+
1984
+ $executionPolicy = Get-TaskExecutionPolicy -Root $ProjectRoot -ConfiguredRunProfilePath $RunProfileFile -TaskDocument $taskDocument -Task $task
1985
+ $requireCleanWorkspace = Get-ObjectPropertyValue -InputObject $executionPolicy.git -Name "require_clean_workspace" -Default $true
1986
+ $nonBlockingDirtyPaths = ConvertTo-StringArray -Value (Get-ObjectPropertyValue -InputObject $executionPolicy.git -Name "non_blocking_dirty_paths")
1987
+ if ($requireCleanWorkspace) {
1988
+ Assert-CleanGitWorkspace -Root $ProjectRoot -NonBlockingPaths $nonBlockingDirtyPaths
1989
+ }
1990
+
1991
+ $taskSessionId = [guid]::NewGuid().ToString("N")
1992
+ $taskLogDirectory = Get-TaskLogDirectory -TraceRoot $TracePath -TaskId $task.id -TaskSessionId $taskSessionId
1993
+ $taskMode = Get-TaskExecutionMode -Task $task
1994
+ if ($taskMode -ne "single") {
1995
+ Write-ProgressEntry -Path $ProgressPath -Task $task -WorkSummary "未识别的执行模式。" -TestSummary "未运行测试。" -Notes "execution.mode = $taskMode。允许值: single。" -Stage1Summary "NOT_RUN - 未进入 Stage 1。" -Stage2Summary "NOT_RUN - 未进入 Stage 2。"
1996
+ $tracePayload = [PSCustomObject]@{
1997
+ task_id = $task.id
1998
+ task_session_id = $taskSessionId
1999
+ task_kind = "unknown"
2000
+ agent = "codex-loop"
2001
+ started_at = $startedAt.ToString("o")
2002
+ ended_at = (Get-Date).ToString("o")
2003
+ status = "blocked"
2004
+ failed_stage = "execution_mode"
2005
+ stage1_review = [PSCustomObject]@{
2006
+ verdict = "NOT_RUN"
2007
+ exit_code = $null
2008
+ summary = "未进入 Stage 1 审查。"
2009
+ }
2010
+ stage2_review = [PSCustomObject]@{
2011
+ verdict = "NOT_RUN"
2012
+ exit_code = $null
2013
+ summary = "未进入 Stage 2 审查。"
2014
+ }
2015
+ blocked_reason = "未知 execution.mode: $taskMode"
2016
+ commands = @()
2017
+ logs = @{}
2018
+ }
2019
+ Add-TraceDurableFields -Trace $tracePayload -SessionDirectory $taskLogDirectory -CaptureJsonEvents:$CaptureJsonEvents -EventsSource $null -LogFiles @() | Out-Null
2020
+ Save-Trace -Directory $TracePath -Trace $tracePayload | Out-Null
2021
+ Write-Step "BLOCKED: 未知 execution.mode: $taskMode"
2022
+ return [PSCustomObject]@{
2023
+ Status = "blocked"
2024
+ TaskId = $task.id
2025
+ ExitCode = 2
2026
+ }
2027
+ }
2028
+
2029
+ $initialReviewContext = Get-ReviewContextPaths -Root $ProjectRoot -ExecutionPolicy $executionPolicy
2030
+ if ($executionPolicy.gate_profile -ne "lightweight" -and $initialReviewContext.missing_truth_sources.Count -gt 0) {
2031
+ $truthSourceSummary = Convert-TruthSourceStateToBulletLines -States $initialReviewContext.truth_source_state
2032
+ $blockedReason = "缺少前置 truth sources: $($initialReviewContext.missing_truth_sources -join ', ')"
2033
+ Write-ProgressEntry -Path $ProgressPath -Task $task -WorkSummary "未进入实现阶段,前置 truth source 检查未通过。" -TestSummary "未运行测试。" -Notes "$blockedReason`n$truthSourceSummary" -Stage1Summary "NOT_RUN - truth source precheck 未通过。" -Stage2Summary "NOT_RUN - 未进入 Stage 2 审查。"
2034
+ $tracePayload = [PSCustomObject]@{
2035
+ task_id = $task.id
2036
+ task_session_id = $taskSessionId
2037
+ task_kind = $executionPolicy.task_kind
2038
+ gate_profile = $executionPolicy.gate_profile
2039
+ required_truth_sources = $executionPolicy.required_truth_sources
2040
+ truth_source_state = $initialReviewContext.truth_source_state
2041
+ agent = "codex"
2042
+ started_at = $startedAt.ToString("o")
2043
+ ended_at = (Get-Date).ToString("o")
2044
+ status = "blocked"
2045
+ test_command = $task.test_command
2046
+ failed_stage = "truth_source_precheck"
2047
+ stage1_review = [PSCustomObject]@{
2048
+ verdict = "NOT_RUN"
2049
+ exit_code = $null
2050
+ summary = "truth source precheck 未通过。"
2051
+ }
2052
+ stage2_review = [PSCustomObject]@{
2053
+ verdict = "NOT_RUN"
2054
+ exit_code = $null
2055
+ summary = "未进入 Stage 2 审查。"
2056
+ }
2057
+ session_policy = $executionPolicy.session
2058
+ subagent_policy = $executionPolicy.subagents
2059
+ context_files = $executionPolicy.context_files
2060
+ run_profile_path = $executionPolicy.run_profile_path
2061
+ review_context = $initialReviewContext
2062
+ commands = @(@{ cmd = "truth_source_precheck"; exit_code = 1 })
2063
+ blocked_reason = $blockedReason
2064
+ final_message = $blockedReason
2065
+ logs = @{}
2066
+ }
2067
+ Add-TraceDurableFields -Trace $tracePayload -SessionDirectory $taskLogDirectory -CaptureJsonEvents:$CaptureJsonEvents -EventsSource $null -LogFiles @() | Out-Null
2068
+ Save-Trace -Directory $TracePath -Trace $tracePayload | Out-Null
2069
+ Write-Step "BLOCKED: 前置 truth source 检查未通过。"
2070
+ Write-Output $truthSourceSummary
2071
+ return [PSCustomObject]@{
2072
+ Status = "blocked"
2073
+ TaskId = $task.id
2074
+ ExitCode = 2
2075
+ }
2076
+ }
2077
+
2078
+ Write-Step "选择任务: $($task.id) $($task.description)"
2079
+ Write-Step "启动新 task 会话: $taskSessionId ($($executionPolicy.session.mode))"
2080
+
2081
+ $prompt = New-ImplementationPrompt -Task $task -ExecutionPolicy $executionPolicy -TaskSessionId $taskSessionId
2082
+ Write-Step "Codex 执行中,完整日志将写入 $taskLogDirectory"
2083
+ $codexResult = Invoke-CodexTask -Prompt $prompt -Root $ProjectRoot -Command $CodexCommand -LogDirectory $taskLogDirectory -TaskId $task.id -Sandbox $executionPolicy.codex.implementation_sandbox -ActivityLabel "实现阶段" -DisableHooks $executionPolicy.codex.disable_hooks -CaptureJsonEvents:$CaptureJsonEvents
2084
+ $codexBlocked = Test-CodexBlocked -Output $codexResult.LastMessage
2085
+ $codexRecoverableCompletion = Test-RecoverableCodexCompletion -ExitCode $codexResult.ExitCode -Output $codexResult.Output -LastMessage $codexResult.LastMessage
2086
+
2087
+ if ($codexRecoverableCompletion -and $codexResult.ExitCode -ne 0) {
2088
+ Write-Step "检测到可继续推进的 Codex 完成态,忽略异常退出码并继续后续闸门。详情见: $($codexResult.StdoutLog)"
2089
+ }
2090
+
2091
+ if ((($codexResult.ExitCode -ne 0) -and (-not $codexRecoverableCompletion)) -or $codexBlocked) {
2092
+ Write-ProgressEntry -Path $ProgressPath -Task $task -WorkSummary "Codex 会话未完成。" -TestSummary "未运行测试。" -Notes "Codex 输出包含失败或 BLOCKED,请人工查看。" -Stage1Summary "NOT_RUN - 未进入 Stage 1 审查。" -Stage2Summary "NOT_RUN - 未进入 Stage 2 审查。"
2093
+ $tracePayload = [PSCustomObject]@{
2094
+ task_id = $task.id
2095
+ task_session_id = $taskSessionId
2096
+ task_kind = $executionPolicy.task_kind
2097
+ gate_profile = $executionPolicy.gate_profile
2098
+ required_truth_sources = $executionPolicy.required_truth_sources
2099
+ truth_source_state = $initialReviewContext.truth_source_state
2100
+ agent = "codex"
2101
+ started_at = $startedAt.ToString("o")
2102
+ ended_at = (Get-Date).ToString("o")
2103
+ status = "blocked"
2104
+ test_command = $task.test_command
2105
+ failed_stage = $null
2106
+ stage1_review = [PSCustomObject]@{
2107
+ verdict = "NOT_RUN"
2108
+ exit_code = $null
2109
+ summary = "未进入 Stage 1 审查。"
2110
+ }
2111
+ stage2_review = [PSCustomObject]@{
2112
+ verdict = "NOT_RUN"
2113
+ exit_code = $null
2114
+ summary = "未进入 Stage 2 审查。"
2115
+ }
2116
+ session_policy = $executionPolicy.session
2117
+ subagent_policy = $executionPolicy.subagents
2118
+ context_files = $executionPolicy.context_files
2119
+ run_profile_path = $executionPolicy.run_profile_path
2120
+ review_context = $initialReviewContext
2121
+ commands = @(@{ cmd = "codex exec"; exit_code = $codexResult.ExitCode })
2122
+ blocked_reason = "Codex 会话未完成。"
2123
+ final_message = $codexResult.Output
2124
+ logs = @{
2125
+ stdout = $codexResult.StdoutLog
2126
+ stderr = $codexResult.StderrLog
2127
+ prompt = $codexResult.PromptLog
2128
+ last_message = $codexResult.LastMessageLog
2129
+ }
2130
+ }
2131
+ Add-TraceDurableFields -Trace $tracePayload -SessionDirectory $taskLogDirectory -CaptureJsonEvents:$CaptureJsonEvents -EventsSource $codexResult -LogFiles (Get-TraceLogFiles -CodexResults @($codexResult)) | Out-Null
2132
+ Save-Trace -Directory $TracePath -Trace $tracePayload | Out-Null
2133
+ Write-Step "BLOCKED: Codex 会话未完成。完整日志: $($codexResult.StdoutLog)"
2134
+ Show-LogTail -Path $codexResult.StderrLog
2135
+ Show-LogTail -Path $codexResult.StdoutLog
2136
+ return [PSCustomObject]@{
2137
+ Status = "blocked"
2138
+ TaskId = $task.id
2139
+ ExitCode = 2
2140
+ }
2141
+ }
2142
+
2143
+ $reviewContext = Get-ReviewContextPaths -Root $ProjectRoot -ExecutionPolicy $executionPolicy
2144
+
2145
+ Write-Step "实现完成,开始 Stage 1 审查。"
2146
+ $stage1Prompt = New-Stage1ReviewPrompt -Task $task -Root $ProjectRoot -ExecutionPolicy $executionPolicy -ReviewContext $reviewContext
2147
+ $stage1Result = Invoke-CodexTask -Prompt $stage1Prompt -Root $ProjectRoot -Command $CodexCommand -LogDirectory $taskLogDirectory -TaskId "$($task.id)-stage1" -Sandbox $executionPolicy.codex.review_sandbox -ActivityLabel "Stage 1 审查" -DisableHooks $executionPolicy.codex.disable_hooks -CaptureJsonEvents:$CaptureJsonEvents
2148
+ $stage1Verdict = Get-ReviewVerdict -Output $stage1Result.ReviewOutput
2149
+ $stage1RecoverableCompletion = Test-RecoverableCodexCompletion -ExitCode $stage1Result.ExitCode -Output $stage1Result.Output -LastMessage $stage1Result.LastMessage
2150
+
2151
+ if ($stage1RecoverableCompletion -and $stage1Result.ExitCode -ne 0) {
2152
+ Write-Step "Stage 1 审查存在可继续推进的异常退出码,按 verdict 继续裁决。"
2153
+ }
2154
+
2155
+ if ((($stage1Result.ExitCode -ne 0) -and (-not $stage1RecoverableCompletion)) -or $stage1Verdict -ne "PASS") {
2156
+ Write-ProgressEntry -Path $ProgressPath -Task $task -WorkSummary "Codex 已完成实现,但 Stage 1 审查未通过。" -TestSummary "未运行测试。" -Notes "请先修复 Spec / 设计 / 状态偏差,再重新运行 driver。" -Stage1Summary "$stage1Verdict - 审查未通过。" -Stage2Summary "NOT_RUN - 未进入 Stage 2 审查。"
2157
+ $tracePayload = [PSCustomObject]@{
2158
+ task_id = $task.id
2159
+ task_session_id = $taskSessionId
2160
+ task_kind = $executionPolicy.task_kind
2161
+ gate_profile = $executionPolicy.gate_profile
2162
+ required_truth_sources = $executionPolicy.required_truth_sources
2163
+ truth_source_state = $reviewContext.truth_source_state
2164
+ agent = "codex"
2165
+ started_at = $startedAt.ToString("o")
2166
+ ended_at = (Get-Date).ToString("o")
2167
+ status = "failed"
2168
+ test_command = $task.test_command
2169
+ failed_stage = "stage1_review"
2170
+ stage1_review = [PSCustomObject]@{
2171
+ verdict = $stage1Verdict
2172
+ exit_code = $stage1Result.ExitCode
2173
+ summary = "Stage 1 审查未通过。"
2174
+ }
2175
+ stage2_review = [PSCustomObject]@{
2176
+ verdict = "NOT_RUN"
2177
+ exit_code = $null
2178
+ summary = "未进入 Stage 2 审查。"
2179
+ }
2180
+ session_policy = $executionPolicy.session
2181
+ subagent_policy = $executionPolicy.subagents
2182
+ context_files = $executionPolicy.context_files
2183
+ run_profile_path = $executionPolicy.run_profile_path
2184
+ review_context = $reviewContext
2185
+ commands = @(
2186
+ @{ cmd = "codex exec"; exit_code = $codexResult.ExitCode },
2187
+ @{ cmd = "stage1 review"; exit_code = $stage1Result.ExitCode; verdict = $stage1Verdict }
2188
+ )
2189
+ final_message = $stage1Result.Output
2190
+ logs = @{
2191
+ implementation_stdout = $codexResult.StdoutLog
2192
+ implementation_stderr = $codexResult.StderrLog
2193
+ implementation_prompt = $codexResult.PromptLog
2194
+ implementation_last_message = $codexResult.LastMessageLog
2195
+ stage1_stdout = $stage1Result.StdoutLog
2196
+ stage1_stderr = $stage1Result.StderrLog
2197
+ stage1_prompt = $stage1Result.PromptLog
2198
+ stage1_last_message = $stage1Result.LastMessageLog
2199
+ }
2200
+ }
2201
+ Add-TraceDurableFields -Trace $tracePayload -SessionDirectory $taskLogDirectory -CaptureJsonEvents:$CaptureJsonEvents -EventsSource $codexResult -LogFiles (Get-TraceLogFiles -CodexResults @($codexResult, $stage1Result)) | Out-Null
2202
+ Save-Trace -Directory $TracePath -Trace $tracePayload | Out-Null
2203
+ Write-Step "FAILED: Stage 1 审查未通过。Verdict = $stage1Verdict"
2204
+ Show-LogTail -Path $stage1Result.StdoutLog
2205
+ return [PSCustomObject]@{
2206
+ Status = "failed"
2207
+ TaskId = $task.id
2208
+ ExitCode = 1
2209
+ }
2210
+ }
2211
+
2212
+ Write-Step "Stage 1 审查通过,开始运行测试。"
2213
+ $testResult = Invoke-TestCommand -Command $task.test_command -Root $ProjectRoot -LogDirectory $taskLogDirectory -TaskId $task.id
2214
+
2215
+ if ($testResult.ExitCode -ne 0) {
2216
+ Write-Step "测试失败,开始自动失败归因。"
2217
+ $triageResult = Invoke-FailureTriage -Task $task -Root $ProjectRoot -ExecutionPolicy $executionPolicy -ReviewContext $reviewContext -CodexResult $codexResult -Stage1Result $stage1Result -TestResult $testResult -CodexCommand $CodexCommand -LogDirectory $taskLogDirectory -CaptureJsonEvents:$CaptureJsonEvents
2218
+ $triageNote = if ($null -ne $triageResult.ReportPath) { "failure triage: $($triageResult.ReportPath)" } elseif (-not [string]::IsNullOrWhiteSpace($triageResult.ParseError)) { "failure triage parse failed: $($triageResult.ParseError)" } else { "failure triage did not produce a structured report" }
2219
+ Write-ProgressEntry -Path $ProgressPath -Task $task -WorkSummary "Codex 已产生改动。" -TestSummary "测试失败,退出码 $($testResult.ExitCode)。" -Notes "禁止标记 passes=true,请人工查看 trace;$triageNote" -Stage1Summary "PASS - 审查通过。" -Stage2Summary "NOT_RUN - 未进入 Stage 2 审查。"
2220
+ $tracePayload = [PSCustomObject]@{
2221
+ task_id = $task.id
2222
+ task_session_id = $taskSessionId
2223
+ task_kind = $executionPolicy.task_kind
2224
+ gate_profile = $executionPolicy.gate_profile
2225
+ required_truth_sources = $executionPolicy.required_truth_sources
2226
+ truth_source_state = $reviewContext.truth_source_state
2227
+ agent = "codex"
2228
+ started_at = $startedAt.ToString("o")
2229
+ ended_at = (Get-Date).ToString("o")
2230
+ status = "failed"
2231
+ test_command = $task.test_command
2232
+ failed_stage = "test_command"
2233
+ stage1_review = [PSCustomObject]@{
2234
+ verdict = "PASS"
2235
+ exit_code = $stage1Result.ExitCode
2236
+ summary = "Stage 1 审查通过。"
2237
+ }
2238
+ stage2_review = [PSCustomObject]@{
2239
+ verdict = "NOT_RUN"
2240
+ exit_code = $null
2241
+ summary = "未进入 Stage 2 审查。"
2242
+ }
2243
+ session_policy = $executionPolicy.session
2244
+ subagent_policy = $executionPolicy.subagents
2245
+ context_files = $executionPolicy.context_files
2246
+ run_profile_path = $executionPolicy.run_profile_path
2247
+ review_context = $reviewContext
2248
+ commands = @(
2249
+ @{ cmd = "codex exec"; exit_code = $codexResult.ExitCode },
2250
+ @{ cmd = "stage1 review"; exit_code = $stage1Result.ExitCode; verdict = $stage1Verdict },
2251
+ @{ cmd = $task.test_command; exit_code = $testResult.ExitCode },
2252
+ @{ cmd = "failure triage"; exit_code = $triageResult.ExitCode; report = $triageResult.ReportPath }
2253
+ )
2254
+ final_message = $codexResult.Output
2255
+ logs = @{
2256
+ implementation_stdout = $codexResult.StdoutLog
2257
+ implementation_stderr = $codexResult.StderrLog
2258
+ implementation_prompt = $codexResult.PromptLog
2259
+ implementation_last_message = $codexResult.LastMessageLog
2260
+ stage1_stdout = $stage1Result.StdoutLog
2261
+ stage1_stderr = $stage1Result.StderrLog
2262
+ stage1_prompt = $stage1Result.PromptLog
2263
+ stage1_last_message = $stage1Result.LastMessageLog
2264
+ test_output = $testResult.OutputLog
2265
+ failure_triage_stdout = $triageResult.StdoutLog
2266
+ failure_triage_stderr = $triageResult.StderrLog
2267
+ failure_triage_prompt = $triageResult.PromptLog
2268
+ failure_triage_last_message = $triageResult.LastMessageLog
2269
+ }
2270
+ failure_triage_report = $triageResult.ReportPath
2271
+ failure_triage_parse_error = $triageResult.ParseError
2272
+ }
2273
+ Add-TraceDurableFields -Trace $tracePayload -SessionDirectory $taskLogDirectory -CaptureJsonEvents:$CaptureJsonEvents -EventsSource $codexResult -LogFiles (@(Get-TraceLogFiles -CodexResults @($codexResult, $stage1Result, $triageResult)) + @(ConvertTo-StringArray -Value $testResult.OutputLog) + @(ConvertTo-StringArray -Value $triageResult.ReportPath)) | Out-Null
2274
+ Save-Trace -Directory $TracePath -Trace $tracePayload | Out-Null
2275
+ Write-Step "FAILED: 测试失败,退出码 $($testResult.ExitCode)。"
2276
+ Write-Output ""
2277
+ Write-Output "测试输出:"
2278
+ Write-Output $testResult.Output
2279
+ Write-Output ""
2280
+ Write-Output "Failure triage:"
2281
+ Write-Output $triageNote
2282
+ Write-Output ""
2283
+ Write-Output "Codex 完整日志: $($codexResult.StdoutLog)"
2284
+ return [PSCustomObject]@{
2285
+ Status = "failed"
2286
+ TaskId = $task.id
2287
+ ExitCode = 1
2288
+ }
2289
+ }
2290
+
2291
+ Write-Step "测试通过,开始 Stage 2 审查。"
2292
+ $stage2Prompt = New-Stage2ReviewPrompt -Task $task -Root $ProjectRoot -ExecutionPolicy $executionPolicy -ReviewContext $reviewContext -TestResult $testResult
2293
+ $stage2Result = Invoke-CodexTask -Prompt $stage2Prompt -Root $ProjectRoot -Command $CodexCommand -LogDirectory $taskLogDirectory -TaskId "$($task.id)-stage2" -Sandbox $executionPolicy.codex.review_sandbox -ActivityLabel "Stage 2 审查" -DisableHooks $executionPolicy.codex.disable_hooks -CaptureJsonEvents:$CaptureJsonEvents
2294
+ $stage2Verdict = Get-ReviewVerdict -Output $stage2Result.ReviewOutput
2295
+ $stage2RecoverableCompletion = Test-RecoverableCodexCompletion -ExitCode $stage2Result.ExitCode -Output $stage2Result.Output -LastMessage $stage2Result.LastMessage
2296
+
2297
+ if ($stage2RecoverableCompletion -and $stage2Result.ExitCode -ne 0) {
2298
+ Write-Step "Stage 2 审查存在可继续推进的异常退出码,按 verdict 继续裁决。"
2299
+ }
2300
+
2301
+ if ((($stage2Result.ExitCode -ne 0) -and (-not $stage2RecoverableCompletion)) -or $stage2Verdict -ne "PASS") {
2302
+ Write-ProgressEntry -Path $ProgressPath -Task $task -WorkSummary "Codex 已完成实现并通过测试,但 Stage 2 审查未通过。" -TestSummary "测试命令通过。" -Notes "请先修复代码质量或测试缺口,再重新运行 driver。" -Stage1Summary "PASS - 审查通过。" -Stage2Summary "$stage2Verdict - 审查未通过。"
2303
+ $tracePayload = [PSCustomObject]@{
2304
+ task_id = $task.id
2305
+ task_session_id = $taskSessionId
2306
+ task_kind = $executionPolicy.task_kind
2307
+ gate_profile = $executionPolicy.gate_profile
2308
+ required_truth_sources = $executionPolicy.required_truth_sources
2309
+ truth_source_state = $reviewContext.truth_source_state
2310
+ agent = "codex"
2311
+ started_at = $startedAt.ToString("o")
2312
+ ended_at = (Get-Date).ToString("o")
2313
+ status = "failed"
2314
+ test_command = $task.test_command
2315
+ failed_stage = "stage2_review"
2316
+ stage1_review = [PSCustomObject]@{
2317
+ verdict = "PASS"
2318
+ exit_code = $stage1Result.ExitCode
2319
+ summary = "Stage 1 审查通过。"
2320
+ }
2321
+ stage2_review = [PSCustomObject]@{
2322
+ verdict = $stage2Verdict
2323
+ exit_code = $stage2Result.ExitCode
2324
+ summary = "Stage 2 审查未通过。"
2325
+ }
2326
+ session_policy = $executionPolicy.session
2327
+ subagent_policy = $executionPolicy.subagents
2328
+ context_files = $executionPolicy.context_files
2329
+ run_profile_path = $executionPolicy.run_profile_path
2330
+ review_context = $reviewContext
2331
+ commands = @(
2332
+ @{ cmd = "codex exec"; exit_code = $codexResult.ExitCode },
2333
+ @{ cmd = "stage1 review"; exit_code = $stage1Result.ExitCode; verdict = $stage1Verdict },
2334
+ @{ cmd = $task.test_command; exit_code = $testResult.ExitCode },
2335
+ @{ cmd = "stage2 review"; exit_code = $stage2Result.ExitCode; verdict = $stage2Verdict }
2336
+ )
2337
+ final_message = $stage2Result.Output
2338
+ logs = @{
2339
+ implementation_stdout = $codexResult.StdoutLog
2340
+ implementation_stderr = $codexResult.StderrLog
2341
+ implementation_prompt = $codexResult.PromptLog
2342
+ implementation_last_message = $codexResult.LastMessageLog
2343
+ stage1_stdout = $stage1Result.StdoutLog
2344
+ stage1_stderr = $stage1Result.StderrLog
2345
+ stage1_prompt = $stage1Result.PromptLog
2346
+ stage1_last_message = $stage1Result.LastMessageLog
2347
+ stage2_stdout = $stage2Result.StdoutLog
2348
+ stage2_stderr = $stage2Result.StderrLog
2349
+ stage2_prompt = $stage2Result.PromptLog
2350
+ stage2_last_message = $stage2Result.LastMessageLog
2351
+ test_output = $testResult.OutputLog
2352
+ }
2353
+ }
2354
+ Add-TraceDurableFields -Trace $tracePayload -SessionDirectory $taskLogDirectory -CaptureJsonEvents:$CaptureJsonEvents -EventsSource $codexResult -LogFiles (@(Get-TraceLogFiles -CodexResults @($codexResult, $stage1Result, $stage2Result)) + @(ConvertTo-StringArray -Value $testResult.OutputLog)) | Out-Null
2355
+ Save-Trace -Directory $TracePath -Trace $tracePayload | Out-Null
2356
+ Write-Step "FAILED: Stage 2 审查未通过。Verdict = $stage2Verdict"
2357
+ Show-LogTail -Path $stage2Result.StdoutLog
2358
+ return [PSCustomObject]@{
2359
+ Status = "failed"
2360
+ TaskId = $task.id
2361
+ ExitCode = 1
2362
+ }
2363
+ }
2364
+
2365
+ $changedFiles = & git -C $ProjectRoot status --short
2366
+ $tracePayload = [PSCustomObject]@{
2367
+ task_id = $task.id
2368
+ task_session_id = $taskSessionId
2369
+ task_kind = $executionPolicy.task_kind
2370
+ gate_profile = $executionPolicy.gate_profile
2371
+ required_truth_sources = $executionPolicy.required_truth_sources
2372
+ truth_source_state = $reviewContext.truth_source_state
2373
+ agent = "codex"
2374
+ started_at = $startedAt.ToString("o")
2375
+ ended_at = (Get-Date).ToString("o")
2376
+ status = "passed"
2377
+ test_command = $task.test_command
2378
+ failed_stage = $null
2379
+ stage1_review = [PSCustomObject]@{
2380
+ verdict = "PASS"
2381
+ exit_code = $stage1Result.ExitCode
2382
+ summary = "Stage 1 审查通过。"
2383
+ }
2384
+ stage2_review = [PSCustomObject]@{
2385
+ verdict = "PASS"
2386
+ exit_code = $stage2Result.ExitCode
2387
+ summary = "Stage 2 审查通过。"
2388
+ }
2389
+ session_policy = $executionPolicy.session
2390
+ subagent_policy = $executionPolicy.subagents
2391
+ context_files = $executionPolicy.context_files
2392
+ run_profile_path = $executionPolicy.run_profile_path
2393
+ review_context = $reviewContext
2394
+ commands = @(
2395
+ @{ cmd = "codex exec"; exit_code = $codexResult.ExitCode },
2396
+ @{ cmd = "stage1 review"; exit_code = $stage1Result.ExitCode; verdict = $stage1Verdict },
2397
+ @{ cmd = $task.test_command; exit_code = $testResult.ExitCode },
2398
+ @{ cmd = "stage2 review"; exit_code = $stage2Result.ExitCode; verdict = $stage2Verdict }
2399
+ )
2400
+ files_changed = $changedFiles
2401
+ final_message = $stage2Result.Output
2402
+ logs = @{
2403
+ implementation_stdout = $codexResult.StdoutLog
2404
+ implementation_stderr = $codexResult.StderrLog
2405
+ implementation_prompt = $codexResult.PromptLog
2406
+ implementation_last_message = $codexResult.LastMessageLog
2407
+ stage1_stdout = $stage1Result.StdoutLog
2408
+ stage1_stderr = $stage1Result.StderrLog
2409
+ stage1_prompt = $stage1Result.PromptLog
2410
+ stage1_last_message = $stage1Result.LastMessageLog
2411
+ stage2_stdout = $stage2Result.StdoutLog
2412
+ stage2_stderr = $stage2Result.StderrLog
2413
+ stage2_prompt = $stage2Result.PromptLog
2414
+ stage2_last_message = $stage2Result.LastMessageLog
2415
+ test_output = $testResult.OutputLog
2416
+ }
2417
+ }
2418
+ Add-TraceDurableFields -Trace $tracePayload -SessionDirectory $taskLogDirectory -CaptureJsonEvents:$CaptureJsonEvents -EventsSource $codexResult -LogFiles (@(Get-TraceLogFiles -CodexResults @($codexResult, $stage1Result, $stage2Result)) + @(ConvertTo-StringArray -Value $testResult.OutputLog)) | Out-Null
2419
+ $ownershipResult = Test-CommitPathOwnership -Root $ProjectRoot -Task $task -RuntimeAllowedPaths @(
2420
+ $TaskFile,
2421
+ $ProgressFile,
2422
+ "$TraceDir/",
2423
+ "traces/",
2424
+ "artifacts/"
2425
+ ) -NonBlockingDirtyPaths $nonBlockingDirtyPaths
2426
+ if (-not $ownershipResult.Passed) {
2427
+ Write-ProgressEntry -Path $ProgressPath -Task $task -WorkSummary "实现、测试和审查已完成,但 commit ownership gate 未通过。" -TestSummary "测试命令通过。" -Notes ("unexpected paths: " + ($ownershipResult.UnexpectedPaths -join ", ")) -Stage1Summary "PASS - 审查通过。" -Stage2Summary "PASS - 审查通过。"
2428
+ Add-Member -InputObject $tracePayload -MemberType NoteProperty -Name "unexpected_paths" -Value $ownershipResult.UnexpectedPaths -Force
2429
+ $tracePayload.failed_stage = "commit_path_ownership"
2430
+ $tracePayload.status = "failed"
2431
+ $tracePayload.blocked_reason = "changed paths 超出 owned_paths / runtime allowlist"
2432
+ $tracePayload.files_changed = & git -C $ProjectRoot status --short
2433
+ $tracePayload.ended_at = (Get-Date).ToString("o")
2434
+ Save-Trace -Directory $TracePath -Trace $tracePayload | Out-Null
2435
+ Write-Step "FAILED: commit ownership gate 未通过。"
2436
+ Write-Output ("Unexpected paths: " + ($ownershipResult.UnexpectedPaths -join ", "))
2437
+ return [PSCustomObject]@{
2438
+ Status = "failed"
2439
+ TaskId = $task.id
2440
+ ExitCode = 1
2441
+ }
2442
+ }
2443
+
2444
+ Set-TaskPassed -TaskDocument $taskDocument -TaskId $task.id -Path $TaskPath
2445
+ Write-ProgressEntry -Path $ProgressPath -Task $task -WorkSummary "完成当前任务并更新 task.json。" -TestSummary "Stage 1、测试命令、Stage 2 全部通过。" -Notes "可继续运行 driver 处理下一个任务。" -Stage1Summary "PASS - 审查通过。" -Stage2Summary "PASS - 审查通过。"
2446
+ $tracePayload.files_changed = & git -C $ProjectRoot status --short
2447
+ $tracePayload.ended_at = (Get-Date).ToString("o")
2448
+ $traceFile = Save-Trace -Directory $TracePath -Trace $tracePayload
2449
+
2450
+ $gitAddResult = Invoke-NativeCommandQuiet -Script { & git -C $ProjectRoot add --all }
2451
+ if ($gitAddResult.ExitCode -ne 0) {
2452
+ Write-Step "FAILED: git add 失败。"
2453
+ Write-Output $gitAddResult.Output
2454
+ return [PSCustomObject]@{
2455
+ Status = "failed"
2456
+ TaskId = $task.id
2457
+ ExitCode = $gitAddResult.ExitCode
2458
+ }
2459
+ }
2460
+
2461
+ $gitCommitResult = Invoke-NativeCommandQuiet -Script { & git -C $ProjectRoot commit -m "feat: $($task.description) - completed $($task.id)" }
2462
+ if ($gitCommitResult.ExitCode -ne 0) {
2463
+ Write-Step "FAILED: git commit 失败。"
2464
+ Write-Output $gitCommitResult.Output
2465
+ return [PSCustomObject]@{
2466
+ Status = "failed"
2467
+ TaskId = $task.id
2468
+ ExitCode = $gitCommitResult.ExitCode
2469
+ }
2470
+ }
2471
+
2472
+ $gitHashResult = Invoke-NativeCommandQuiet -Script { & git -C $ProjectRoot rev-parse --short HEAD }
2473
+ if ($gitHashResult.ExitCode -ne 0) {
2474
+ Write-Step "FAILED: 无法读取 commit hash。"
2475
+ Write-Output $gitHashResult.Output
2476
+ return [PSCustomObject]@{
2477
+ Status = "failed"
2478
+ TaskId = $task.id
2479
+ ExitCode = $gitHashResult.ExitCode
2480
+ }
2481
+ }
2482
+
2483
+ $commitHash = $gitHashResult.Output.Trim()
2484
+ Write-Step "任务完成: $($task.id)"
2485
+ Write-Output "Commit: $commitHash"
2486
+ Write-Output "Trace: $traceFile"
2487
+ Write-Output "Codex 日志: $($codexResult.StdoutLog)"
2488
+
2489
+ return [PSCustomObject]@{
2490
+ Status = "passed"
2491
+ TaskId = $task.id
2492
+ ExitCode = 0
2493
+ }
2494
+ }
2495
+
2496
+ $taskPath = Join-Path $ProjectRoot $TaskFile
2497
+ $progressPath = Join-Path $ProjectRoot $ProgressFile
2498
+ $tracePath = Join-Path $ProjectRoot $TraceDir
2499
+
2500
+ Write-Step "运行 runtime doctor。"
2501
+ $doctorResult = Invoke-RuntimeDoctor -Root $ProjectRoot
2502
+ if ($doctorResult.ExitCode -ne 0) {
2503
+ Write-Step "BLOCKED: runtime doctor 未通过。"
2504
+ Write-Output $doctorResult.Output
2505
+ exit 2
2506
+ }
2507
+ Write-Step "Runtime doctor 通过。"
2508
+
2509
+ do {
2510
+ $iteration = @(Invoke-OneTask -TaskPath $taskPath -ProgressPath $progressPath -TracePath $tracePath) | Select-Object -Last 1
2511
+
2512
+ if ($iteration.Status -eq "idle") {
2513
+ Write-Output "全部任务已完成或没有依赖满足的任务。"
2514
+ exit 0
2515
+ }
2516
+
2517
+ if ($iteration.Status -ne "passed") {
2518
+ exit $iteration.ExitCode
2519
+ }
2520
+ }
2521
+ while ($RunUntilDone)