@pzy560117/codex-harness 0.1.8 → 0.1.9

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 (42) hide show
  1. package/README.md +1 -1
  2. package/package-source/AGENTS.md +11 -1
  3. package/package-source/docs/codex-harness-engineering/templates/config/rules/agents.md +3 -3
  4. package/package-source/docs/codex-harness-engineering/templates/docs/project-agents-template.md +8 -1
  5. package/package-source/docs/codex-harness-engineering/templates/docs/task-session-strategy.md +3 -0
  6. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/project-agents-template.md +51 -1
  7. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/controller-loop.md +88 -0
  8. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/failure-triage.md +71 -0
  9. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/harness-audit.md +54 -0
  10. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/implement-one-task.md +18 -15
  11. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/repair-one-finding.md +1 -2
  12. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/review-one-task.md +45 -0
  13. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/review-stage1-spec.md +111 -0
  14. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/review-stage2-quality.md +82 -0
  15. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/visual-evaluator.md +80 -0
  16. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/backend-worker.md +41 -0
  17. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/docs-worker.md +28 -0
  18. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/frontend-worker.md +46 -0
  19. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/harness-writer.md +40 -0
  20. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/test-runner.md +27 -0
  21. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/agents.md +6 -3
  22. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/auto-commit/SKILL.md +1 -1
  23. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-plan/SKILL.md +1 -1
  24. package/package-source/docs/codex-harness-engineering/templates/prompts/controller-loop.md +4 -4
  25. package/package-source/docs/codex-harness-engineering/templates/prompts/failure-triage.md +1 -1
  26. package/package-source/docs/codex-harness-engineering/templates/prompts/harness-audit.md +1 -1
  27. package/package-source/docs/codex-harness-engineering/templates/prompts/implement-one-task.md +18 -15
  28. package/package-source/docs/codex-harness-engineering/templates/prompts/repair-one-finding.md +1 -2
  29. package/package-source/docs/codex-harness-engineering/templates/prompts/review-one-task.md +1 -1
  30. package/package-source/docs/codex-harness-engineering/templates/prompts/review-stage1-spec.md +1 -1
  31. package/package-source/docs/codex-harness-engineering/templates/prompts/review-stage2-quality.md +1 -1
  32. package/package-source/docs/codex-harness-engineering/templates/prompts/visual-evaluator.md +1 -1
  33. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/backend-worker.md +2 -2
  34. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/docs-worker.md +2 -2
  35. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/frontend-worker.md +2 -2
  36. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/harness-writer.md +4 -4
  37. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/test-runner.md +1 -1
  38. package/package-source/docs/codex-harness-engineering/templates/runtime/AGENTS.md +45 -50
  39. package/package-source/docs/codex-harness-engineering/templates/runtime/doctor.ps1 +62 -18
  40. package/package-source/install-manifest.json +1 -1
  41. package/package-source/tools/install/install-agent.ps1 +59 -18
  42. package/package.json +1 -1
@@ -23,23 +23,24 @@ Driver 会在本模板后追加 `## Driver Context`,其中包含:
23
23
 
24
24
  1. 先阅读 Driver Context。
25
25
  2. 只读取优先上下文源和任务相关文件;信息不足时再做最小范围扩展检索。
26
- 3. 如果存在 `docs/knowledge/knowledge-catalog.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件),先按任务阶段判断是否需要读取 `docs/knowledge/catalog.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件) 和相关条目;遵守 `knowledge_query_budget`,不要贪婪读取整库。
26
+ 3. 如果存在 `docs/knowledge/knowledge-catalog.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`),先按任务阶段判断是否需要读取 `docs/knowledge/catalog.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`) 和相关条目;遵守 `knowledge_query_budget`,不要贪婪读取整库。
27
27
  4. 先确认 Architecture Constraints Packet:读取任务上下文列出的架构约束 truth source、任务的 `architecture_constraints` 和 `forbidden_implementations`;如果当前任务声明了交付路径,不得用测试替身、local-only adapter 或领域原型替代。
28
- 5. 先确认当前任务对应的 Requirement IDs、验收示例、追溯矩阵、`qa_contract`、测试影响、开发验证和最终验收验证,再对照 Product / Design / Testing / Contract / DEV-PLAN / Knowledge 等 truth source 改文件。
29
- 6. 进入实现前先确认当前任务是 `bugfix`、`feature`、`refactor` 还是 `chore`;如果是 `refactor`,必须先列出“行为不变约束”和允许清理的死代码范围。
30
- 7. 如需使用子代理,先确定子代理角色,再先阅读 `AGENTS.md`、`docs/harness/task-session-strategy.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)、`.codex/rules/agents.md`、`docs/harness/knowledge-architecture.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)、对应 `.agents/skills/*/SKILL.md`(如存在)和必要的深文档,然后只传最小必要上下文给子代理。
28
+ 5. 如果存在 `docs/ai/repo-map.md`、`docs/context/repo-map.md` 或同类代码地图,先从导航文件进入代码结构,再做局部文件读取;不要先全仓盲扫。
29
+ 6. 先确认当前任务对应的 Requirement IDs、验收示例、追溯矩阵、`qa_contract`、测试影响、开发验证和最终验收验证,再对照 Product / Design / Testing / Contract / DEV-PLAN / Knowledge 等 truth source 改文件。
30
+ 7. 如需使用子代理,先确定子代理角色,再先阅读 `AGENTS.md`、`docs/harness/task-session-strategy.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)、`.codex/rules/agents.md`、`docs/harness/knowledge-architecture.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)、对应 `.agents/skills/*/SKILL.md`(如存在)和必要的深文档,然后只传最小必要上下文给子代理。
31
31
  8. 如果当前任务是 `feature_impl`,先确认自然语言测试用例覆盖满足需求类型矩阵;`tdd_contract.red.source_case_ids`、`story_full_chain.source_case_ids` 和 `acceptance_validation.source_case_ids` 均应能回溯到 `docs/testing/NATURAL_LANGUAGE_TEST_CASES.md`,缺失时输出 BLOCKED。
32
- 9. 基于自然语言测试用例执行 TDD RED:只新增或修改聚焦目标行为的测试,不改生产代码;运行 `tdd_contract.red.command`,确认失败原因匹配 `expected_failure`,并把日志保存到 `tdd_contract.red.evidence`。
33
- 10. RED 失败必须证明目标行为缺失,不能是语法错误、导入错误、环境错误、测试数据错误或断言无效;如果 RED 直接通过、失败原因不匹配或无法保存证据,先修正测试或输出 BLOCKED。
34
- 11. RED 证据确认后才实现最小必要业务代码;然后运行 `tdd_contract.green.command`,确认同一聚焦测试通过,并把日志保存到 `tdd_contract.green.evidence`。
35
- 12. GREEN 后才允许重构;重构后运行 `tdd_contract.refactor_guard.command`,并把日志保存到 `tdd_contract.refactor_guard.evidence`。如任务声明 coverage 命令且不是 `not-applicable`,同步运行并记录结果。
36
- 13. 如果 `tdd_contract.policy` `exempted` `not_applicable`,必须在最终回答列明豁免依据和替代证据;不要把“测试后补”伪装成 TDD。
37
- 14. 对非 TDD 任务或 TDD 完成后,按任务步骤实现最小必要改动,并同步更新相关测试、证据路径或测试文档。
38
- 15. 编码过程中运行任务声明的开发验证,例如 affected tests、单元 / 组件、局部 API、契约、类型检查或 lint,并记录 `development_validation` 证据。
39
- 16. 实现完成后、最终回答前,必须从用户、业务闭环或发布候选视角重新运行任务声明的最终验收验证,并记录 `acceptance_validation` fresh evidence;不得把编码中途的小测试直接当作验收证据。
40
- 17. 重构或清理任务结束前,额外检查无用变量、无用函数、无用组件、无用类型、无用 import、临时代码和过期注释是否已按声明范围处理;不能越权删除未确认的兼容逻辑。
41
- 18. 自检是否满足验收标准、测试影响、架构约束、知识引用、forbidden path 约束、自然语言用例来源、TDD 证据、开发验证和最终验收验证。
42
- 19. 在最终回答中给出 Requirement IDs、修改摘要、涉及文件、自然语言用例来源、TDD RED/GREEN/REFACTOR 证据、验证命令、证据路径、开发验证结果、最终验收验证结果、knowledge references、knowledge outputs 和剩余风险。
32
+ 9. 如果任务涉及用户可见行为、路由、表单、权限、状态流转或关键业务闭环,优先确认是否存在 `docs/testing/e2e-plan.md` 或等价 E2E 计划;缺失时应输出 BLOCKED 或先补齐测试计划,而不是直接实现。
33
+ 10. 基于自然语言测试用例执行 TDD RED:只新增或修改聚焦目标行为的测试,不改生产代码;运行 `tdd_contract.red.command`,确认失败原因匹配 `expected_failure`,并把日志保存到 `tdd_contract.red.evidence`。
34
+ 11. RED 失败必须证明目标行为缺失,不能是语法错误、导入错误、环境错误、测试数据错误或断言无效;如果 RED 直接通过、失败原因不匹配或无法保存证据,先修正测试或输出 BLOCKED。
35
+ 12. RED 证据确认后才实现最小必要业务代码;然后运行 `tdd_contract.green.command`,确认同一聚焦测试通过,并把日志保存到 `tdd_contract.green.evidence`。
36
+ 13. GREEN 后才允许重构;重构后运行 `tdd_contract.refactor_guard.command`,并把日志保存到 `tdd_contract.refactor_guard.evidence`。如任务声明 coverage 命令且不是 `not-applicable`,同步运行并记录结果。
37
+ 14. 如果 `tdd_contract.policy` `exempted` 或 `not_applicable`,必须在最终回答列明豁免依据和替代证据;不要把“测试后补”伪装成 TDD
38
+ 15. 对非 TDD 任务或 TDD 完成后,按任务步骤实现最小必要改动,并同步更新相关测试、证据路径或测试文档。
39
+ 16. 编码过程中运行任务声明的开发验证,例如 affected tests、单元 / 组件、局部 API、契约、类型检查或 lint,并记录 `development_validation` 证据。
40
+ 17. 实现完成后、最终回答前,必须从用户、业务闭环或发布候选视角重新运行任务声明的最终验收验证,并记录 `acceptance_validation` fresh evidence;不得把编码中途的小测试直接当作验收证据。
41
+ 18. 实现或验证失败时,不要直接弱化断言或跳过测试;先按 `TEST_CODE_ISSUE`、`PRODUCT_BUG`、`REQUIREMENT_CHANGE`、`ENV_OR_DATA_ISSUE`、`FLAKY` 做一级分类,再决定修复路径。
42
+ 19. 自检是否满足验收标准、测试影响、架构约束、知识引用、forbidden path 约束、自然语言用例来源、TDD 证据、开发验证和最终验收验证。
43
+ 20. 在最终回答中给出 Requirement IDs、修改摘要、涉及文件、自然语言用例来源、TDD RED/GREEN/REFACTOR 证据、验证命令、证据路径、开发验证结果、最终验收验证结果、knowledge references、knowledge outputs 和剩余风险。
43
44
 
44
45
  ## 强制边界
45
46
 
@@ -50,12 +51,14 @@ Driver 会在本模板后追加 `## Driver Context`,其中包含:
50
51
  - 不要执行 `git add`、`git commit`、`git push`、`git reset`、`git checkout`。
51
52
  - 不要修改与当前任务无关的文件。
52
53
  - 不要在没有验收示例或追溯矩阵支撑时自行猜测 P0/P1 业务规则。
54
+ - 不要在存在 `repo-map` / codemap 的大型仓库里跳过导航层直接全仓盲扫。
53
55
  - 不要在缺少 `qa_contract`、测试意图、Oracle、证据路径、开发验证和最终验收验证声明时开始 `feature_impl`;先输出 BLOCKED 或补齐前置测试 truth source。
54
56
  - 不要在 P0/P1 需求缺少 `docs/testing/NATURAL_LANGUAGE_TEST_CASES.md` 自然语言用例覆盖时开始 `feature_impl`。
55
57
  - 不要在自然语言用例未声明需求类型、最少用例数、已写用例数和风险加量理由时开始 `feature_impl`。
56
58
  - 不要在 `tdd_contract.red.source_case_ids` 无法回溯到自然语言测试用例时开始 TDD RED。
57
59
  - 不要让非 TDD 自然语言用例停留在设计文档里;必须映射到故事验收、回归、release 验证或 verify-matrix。
58
60
  - 不要在 `qa_contract.tdd_contract.policy=required` 且缺少 RED 命令、预期失败、测试文件或证据路径时开始 `feature_impl`;先输出 BLOCKED 或补齐 TDD 合同。
61
+ - 不要在高风险用户可见任务缺少 `docs/testing/e2e-plan.md` 或等价 E2E 计划时直接进入实现;先补齐测试计划或输出 BLOCKED。
59
62
  - 不要在 RED 失败证据产生前修改生产代码;如果已经写了生产代码但没有 RED 证据,必须回到测试先行的最小行为闭环,不能把事后测试声称为 TDD。
60
63
  - 不要把语法错误、导入错误、环境错误、测试数据错误、mock 行为或无效断言当作 RED 成功;RED 必须因目标行为缺失而失败。
61
64
  - 不要在 RED 直接通过、GREEN 未复跑同一聚焦命令、重构后未复跑 guard 命令时声称完成 TDD。
@@ -17,7 +17,7 @@
17
17
  - 允许修改的 owned paths
18
18
  - retest command
19
19
 
20
- 如果下面引用的 `docs/knowledge/*` 文件在 thin project 项目根不存在,改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件。
20
+ 如果下面引用的 `docs/knowledge/*` 文件在 thin project 项目根不存在,先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`。
21
21
 
22
22
  ## 修复流程
23
23
 
@@ -36,7 +36,6 @@
36
36
  - 不要改测试来掩盖真实失败,除非 finding 明确指出测试错误。
37
37
  - 不要扩大 owned paths。
38
38
  - 不要提交 Git。
39
- - 不要把单点修复顺手扩展成结构性重构或死代码清理任务。
40
39
 
41
40
  ## 输出格式
42
41
 
@@ -9,7 +9,7 @@
9
9
  - 验收标准: `<acceptance>`
10
10
  - 测试命令: `<test_command>`
11
11
 
12
- 如果下面引用的 `docs/knowledge/*` 文件在 thin project 项目根不存在,改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件。
12
+ 如果下面引用的 `docs/knowledge/*` 文件在 thin project 项目根不存在,先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`。
13
13
 
14
14
  ## 必查项
15
15
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  ## 真相源
14
14
 
15
- 如果下面引用的 `docs/harness/*`、`docs/testing/*` 或 `docs/knowledge/*` 文件在 thin project 项目根不存在,改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件。
15
+ 如果下面引用的 `docs/harness/*`、`docs/testing/*` 或 `docs/knowledge/*` 文件在 thin project 项目根不存在,先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`。
16
16
 
17
17
  - Truth source completeness: `<truth-source-state>`
18
18
  - Product Spec: `<product-spec>`
@@ -8,7 +8,7 @@
8
8
  - 描述: `<task-description>`
9
9
  - 测试命令: `<test-command>`
10
10
 
11
- 如果下面引用的 `docs/harness/*`、`docs/testing/*` 或 `docs/knowledge/*` 文件在 thin project 项目根不存在,改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件。
11
+ 如果下面引用的 `docs/harness/*`、`docs/testing/*` 或 `docs/knowledge/*` 文件在 thin project 项目根不存在,先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`。
12
12
 
13
13
  ## 必查项
14
14
 
@@ -18,7 +18,7 @@
18
18
  - 已运行应用的 URL
19
19
  - 任务验收标准
20
20
 
21
- 如果下面引用的 `docs/knowledge/*` 文件在 thin project 项目根不存在,改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件。
21
+ 如果下面引用的 `docs/knowledge/*` 文件在 thin project 项目根不存在,先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`。
22
22
 
23
23
  ## 评审流程
24
24
 
@@ -7,9 +7,9 @@
7
7
  ## 必读
8
8
 
9
9
  - `AGENTS.md`
10
- - `docs/harness/task-session-strategy.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)
10
+ - `docs/harness/task-session-strategy.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)
11
11
  - `.codex/rules/agents.md`
12
- - `docs/knowledge/knowledge-catalog.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件) 和相关知识条目(如任务阶段或标签相关)
12
+ - `docs/knowledge/knowledge-catalog.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`) 和相关知识条目(如任务阶段或标签相关)
13
13
  - Product truth source
14
14
  - Contract truth source
15
15
  - `contracts/openapi.yaml`
@@ -6,8 +6,8 @@
6
6
 
7
7
  ## 工作规则
8
8
 
9
- - 启动前先阅读 `AGENTS.md`、`docs/harness/task-session-strategy.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)、`.codex/rules/agents.md`、对应 `.agents/skills/*/SKILL.md`(如存在)与相关 truth source。
10
- - 涉及规则、prompt、归档或项目经验时,还要阅读 `docs/harness/rule-governance.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)、`docs/harness/knowledge-architecture.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件) 和 `docs/knowledge/knowledge-catalog.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)。
9
+ - 启动前先阅读 `AGENTS.md`、`docs/harness/task-session-strategy.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)、`.codex/rules/agents.md`、对应 `.agents/skills/*/SKILL.md`(如存在)与相关 truth source。
10
+ - 涉及规则、prompt、归档或项目经验时,还要阅读 `docs/harness/rule-governance.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)、`docs/harness/knowledge-architecture.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`) 和 `docs/knowledge/knowledge-catalog.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)。
11
11
  - 文档必须引用真实存在的路径。
12
12
  - 不要把临时讨论写成长期规则。
13
13
  - 可复用经验优先写入 `docs/knowledge/`,不要直接写进 `AGENTS.md`。
@@ -7,9 +7,9 @@
7
7
  ## 必读
8
8
 
9
9
  - `AGENTS.md`
10
- - `docs/harness/task-session-strategy.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)
10
+ - `docs/harness/task-session-strategy.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)
11
11
  - `.codex/rules/agents.md`
12
- - `docs/knowledge/knowledge-catalog.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件) 和相关知识条目(如任务阶段或标签相关)
12
+ - `docs/knowledge/knowledge-catalog.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`) 和相关知识条目(如任务阶段或标签相关)
13
13
  - Product truth source
14
14
  - Design truth source
15
15
  - `docs/design/image-to-frontend-spec.md`
@@ -7,11 +7,11 @@
7
7
  ## 必读
8
8
 
9
9
  - `AGENTS.md`
10
- - `docs/harness/task-session-strategy.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)
10
+ - `docs/harness/task-session-strategy.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)
11
11
  - `.codex/rules/agents.md`
12
- - `docs/harness/knowledge-architecture.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)
13
- - `docs/harness/rule-governance.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)
14
- - `docs/knowledge/knowledge-catalog.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件) 和 `docs/knowledge/catalog.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)(如存在)
12
+ - `docs/harness/knowledge-architecture.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)
13
+ - `docs/harness/rule-governance.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)
14
+ - `docs/knowledge/knowledge-catalog.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`) 和 `docs/knowledge/catalog.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)(如存在)
15
15
  - 当前任务相关的 truth source
16
16
  - 当前 writer task 和 owned paths
17
17
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  ## 工作规则
8
8
 
9
- - 启动前先阅读 `AGENTS.md`、`docs/harness/task-session-strategy.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)、`.codex/rules/agents.md`、对应 `.agents/skills/*/SKILL.md`(如存在)与相关 truth source。
9
+ - 启动前先阅读 `AGENTS.md`、`docs/harness/task-session-strategy.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)、`.codex/rules/agents.md`、对应 `.agents/skills/*/SKILL.md`(如存在)与相关 truth source。
10
10
  - 按 test matrix 和 task test command 执行。
11
11
  - 记录命令、退出码、日志路径、截图路径和 trace 路径。
12
12
  - 失败时生成 failure findings,不直接修复。
@@ -1,65 +1,54 @@
1
- # AGENTS.md
1
+ ## 模板优先
2
2
 
3
- 本文件只保留每次会话都必须知道的 Harness 入口规则。细节按需读取下方深文档,不把长期协议全部塞进入口文件。
3
+ - 需要影响新项目 bootstrap、生成物结构、默认导航层、默认 prompt、默认规则、默认技能、默认上下文模板时,先修改模板 canonical:
4
+ - `docs/codex-harness-engineering/templates/`
5
+ - `tools/harness/templates/`
6
+ - `docs/codex-harness-engineering/templates/package-assets/`
7
+ - 当前仓库根目录下的活跃文档或脚本,只在它本身就是 canonical,或为了验证模板落地效果、保持当前仓库可运行时再同步修改。
8
+ - 如果一次改动同时涉及根目录活跃文件和模板文件,优先说明哪一份是 canonical,避免只修当前仓库、不修模板源。
4
9
 
5
- ## 模板源目录说明
10
+ ## 任务结构硬门禁
6
11
 
7
- - 当你在模板源仓库维护 `templates/runtime/` 时,本文件也同时代表该目录的本地索引。
8
- - 当前目录主要包含:
9
- - `AGENTS.md`:安装到目标项目根目录的入口规则模板
10
- - `codex-loop.ps1` / `doctor.ps1` / `verify.ps1`:driver 与运行时脚本模板
11
- - `project-task-template.json` / `smoke-task.json` / `task.json` / `progress.txt`:任务与运行状态模板
12
- - `task-run-profile.json`:运行策略模板
13
- - `scripts/`:runtime 自检和队列校验脚本
14
- - 维护该目录时,优先确认这些文件是“安装后运行面”,不要把只适用于模板仓库的局部说明大量混入这里。
12
+ - 未经用户明确同意,不得把标准 `task.json` 模板 phase 压缩成更少任务;正式任务队列至少保留 `ANALYSIS-001`、`TESTCASE-001`、`PLAN-001`。
13
+ - P0/P1 项目禁止跳过 `TESTCASE-001`;缺少 `docs/testing/NATURAL_LANGUAGE_TEST_CASES.md`、`ACCEPTANCE_CRITERIA.md`、`TRACEABILITY_MATRIX.md`、`TEST_DATA_MATRIX.md`、`REGRESSION_PLAN.md`、`verify-matrix.md` 任一项,都不得生成最终 `task.json`。
14
+ - `feature_impl` 没有 `qa_contract` 不得进入正式任务队列;`qa_contract` 没有完整 `tdd_contract`、`development_validation`、`acceptance_validation` 不得开始实现。
15
+ - 单个 `feature_impl` 默认不得覆盖超过 3 条主需求;订单、支付、库存、RBAC 必须拆独立任务;前端和后端不得长期混在同一个 story,除非这是明确的 `release` 任务。
15
16
 
16
- ## 核心入口
17
+ ## 子目录 AGENTS 规则
17
18
 
18
- - 本仓库默认采用 `driver-first`:真实任务进入 `task.json`,由 `tools/harness/codex-loop.ps1` 逐个执行。
19
- - `single task` 是当前唯一自动执行模式;每轮 driver 只处理一个 `passes: false` 且依赖已通过的任务。
20
- - 交互开发模式只负责需求收敛、分析、规划和任务输入;方案确认后,默认回到 `task.json -> tools/harness/codex-loop.ps1`。
21
- - 主控会话不直接维护仓库状态文件;`task.json`、`progress.txt`、`traces/` Git 提交由 runtime 链路推进。
22
- - 长会话续跑前,先重读 `docs/ai/CURRENT_TASK.md`、`docs/ai/repo-map.md` 和相关 truth source;不要只靠聊天记忆继续实现。
23
- - 需要理解代码结构或安装包边界时,先读 `docs/ai/repo-map.md`,再进入具体目录或深文档。
24
- - 需要落盘规则、任务、文档、前端、后端或测试内容时,先确认 truth source,再委派匹配的 writer 子代理或进入 driver 任务。
19
+ - 新增业务目录、模块职责变化、目录入口变化、目录级测试命令变化时,必须检查并更新最接近该目录的子目录 `AGENTS.md`。
20
+ - 目录级 `AGENTS.md` 负责承载局部职责、边界、入口、测试命令、复用模式、坑点和禁止事项;不要把这类规则长期堆在根 `AGENTS.md`。
21
+ - 自动托管区块 `AUTO-MODULE-FACTS` 只补动态事实,不等于目录规则完整;即使 facts 已自动刷新,仍需要有人维护手写的局部规则部分。
22
+ - 如果 `task.json.owned_paths`、`docs/ai/repo-map.md` 或模块边界已经明确某目录是独立模块,而该目录缺少子目录 `AGENTS.md`,应视为至少 `warn`,高风险目录应直接阻断进入正式任务队列或实现阶段。
25
23
 
26
- ## 硬约束
24
+ ## 目录级规则
27
25
 
28
- - 启动前 Git 工作区必须干净,除非用户明确说明哪些改动属于本任务;可再生运行产物只能通过 `runtime.git.non_blocking_dirty_paths` 列白名单。
29
- - 不要伪造完成状态:不得手工把未验证任务标记为 `passes: true`,不得绕过 `test_command`、review gate 或 commit gate。
30
- - 不要删除或改写已有任务描述,除非用户明确要求替换模板示例或重建任务队列。
31
- - 修改后必须运行与改动直接对应的验证;文档改动至少运行 `git diff --check`。
32
- - 测试范围从需求收敛阶段开始定义;P0/P1 需求进入实现前必须有可追溯验收、测试数据和证据路径。
33
- - 未经用户明确同意,不得把标准模板 phase 压缩成更少任务;正式任务队列至少保留 `ANALYSIS-001`、`TESTCASE-001`、`PLAN-001` 三段测试左移与实施计划 phase。
34
- - P0/P1 任务禁止跳过 `TESTCASE-001`;没有自然语言测试用例、测试数据矩阵、回归计划和验证矩阵,不得生成最终 `task.json`。
35
- - `feature_impl` 没有 `qa_contract` 不得进入正式 `task.json`;`qa_contract` 没有完整 `tdd_contract`、开发验证和最终验收验证,不得开始实现。
36
- - 单个 `feature_impl` 默认不得覆盖超过 3 条主需求;订单、支付、库存、RBAC 必须拆成独立任务;前端和后端不得长期混在同一个 story,除非这是明确的 `release` 任务。
37
- - 外部系统、开源栈、第三方平台或真实环境集成需求,完成声明必须包含真实依赖接入、成功态证据和失败态证据。
38
- - 进入实现前必须有当前项目声明的架构约束 truth source,默认路径为 `docs/architecture/constraints.md`,也可由 `task.json.runtime.handoff.truth_sources.architecture` 指向其他路径。
39
- - `feature_impl` 任务必须携带可执行的 `architecture_constraints`、`forbidden_implementations` 和对应验证命令;禁止用测试替身、local-only adapter 或领域原型冒充任务声明的交付路径。
40
- - Stage 1 Review 先审声明的架构约束符合性,再审业务规格;仅当任务要求架构门禁且约束缺失或实现冲突时 FAIL。
41
- - 多 Agent 协作时,禁止多个 Agent 同时修改同一文件或同一组可写路径;必须先按任务、目录、文件组、分支或 PR 隔离。
42
- - 当前轮次结束前必须刷新 `docs/ai/CURRENT_TASK.md` 中的已完成内容、未完成内容、修改文件、测试结果和下一步。
43
- - 阻塞时追加 `progress.txt`,输出 `BLOCKED - 需要人工介入`,然后停止。
44
-
45
- ## 阶段更新规则
46
-
47
- - Stage 01 初始化:更新 `task.json`、`AGENTS.md`、项目路径和验证命令。
48
- - Stage 02 需求收敛:更新 `docs/product/`、Requirement IDs、验收标准和可执行验收示例。
49
- - Stage 03 追溯与架构约束:更新架构约束 truth source、测试追溯矩阵和证据协议。
50
- - Stage 09 DEV-PLAN / 任务拆分:把架构约束、禁止实现和验证命令写入每个相关 `feature_impl`。
51
- - Stage 10-14 实现与集成:只更新任务 owned paths 内的实现、测试和证据。
52
- - Stage 15-16 Review:保持只读审查,输出 findings、证据和 repair queue。
53
- - Stage 17 Verify / Regression:刷新验证证据,不在本阶段第一次补需求或测试范围。
54
- - Archive:更新 `docs/knowledge/`、索引和可复用经验,不升级一次性结论为全局规则。
26
+ - 当某个目录满足以下任一条件时,应优先考虑新增或更新该目录下的 `AGENTS.md`,而不是继续扩充根入口:
27
+ - 目录有独立模块职责或技术栈
28
+ - 目录存在与全仓不同的架构边界
29
+ - 目录有独立入口文件、测试命令或验证方式
30
+ - 目录反复出现相同 review 问题、坑点或禁止事项
31
+ - 子目录 `AGENTS.md` 应重点写:
32
+ - 该目录负责什么 / 不负责什么
33
+ - 入口文件和核心文件
34
+ - 修改前必须先看的文件
35
+ - 本目录的局部架构规则和复用模式
36
+ - 测试 / 构建 / 验证命令
37
+ - 常见坑和禁止事项
38
+ - `docs/ai/repo-map.md` 及模板中的 repo-map 应维护“子目录规则索引”,明确哪些路径已有本地规则、适用于什么场景。
55
39
 
56
40
  ## 必读索引
57
41
 
58
- 如果当前仓库是 thin install 项目,而下面列出的 `docs/harness/*` 或 `docs/knowledge/*` 不在项目根,先读取 `.codex-harness/state/config.json`,再到其中 `packageRoot` 下查同路径文件。
42
+ 如果当前仓库是 thin install 项目,而下面列出的 `docs/harness/*`、`docs/testing/*` 或 `docs/knowledge/*` 不在项目根,先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:
43
+ - `docs/harness/*` -> `docs/codex-harness-engineering/templates/docs/*`
44
+ - `docs/testing/*` -> `docs/codex-harness-engineering/templates/testing/*`
45
+ - `docs/knowledge/*` -> `docs/codex-harness-engineering/templates/knowledge/*`
59
46
 
47
+ - Harness 分层分析索引:`harness-analysis/README.md`
48
+ - Codex Harness Engineering 总览:`docs/codex-harness-engineering/README.md`
49
+ - Codex 宿主自动加载机制:`docs/codex-harness-engineering/codex-host-runtime-and-autoload.md`
50
+ - Codex 自动加载优化清单:`harness-analysis/10-codex-autoload-optimization-checklist.md`
60
51
  - Harness 架构:`docs/harness/architecture.md`
61
- - 代码地图:`docs/ai/repo-map.md`
62
- - 架构摘要:`docs/ai/architecture-brief.md`
63
52
  - 架构约束包:`docs/architecture/constraints.md` 或 `task.json.runtime.handoff.truth_sources.architecture`
64
53
  - 新项目使用:`docs/harness/new-project-usage.md`
65
54
  - Task 会话与 `task.json` 细则:`docs/harness/task-session-strategy.md`
@@ -68,3 +57,9 @@
68
57
  - Trace 格式:`docs/harness/trace-format.md`
69
58
  - 权限策略:`docs/harness/sandbox-policy.md`
70
59
  - Prompt 与知识集成:`docs/harness/prompt-knowledge-integration.md`
60
+
61
+ ## 当前在做的事情
62
+
63
+ - 正在持续分析当前仓库里的 Codex 宿主层、Harness 控制层、安装工程和桥接层。
64
+ - 当前重点是把“哪些内容会被 Codex 自动加载到上下文、哪些只是运行配置、哪些是 Harness runtime 二次读取”彻底拆清。
65
+ - 所有新增分析文档统一落在 `harness-analysis/`,方法论和模板级说明补充到 `docs/codex-harness-engineering/`。
@@ -533,9 +533,6 @@ function Test-DoctorThinLegacyResidue {
533
533
  param([string]$Root)
534
534
 
535
535
  $legacyResiduePaths = @(
536
- "docs\harness",
537
- "docs\testing",
538
- "docs\knowledge",
539
536
  "docs\requirement-prep-kit"
540
537
  )
541
538
 
@@ -578,6 +575,41 @@ function Test-DoctorThinLegacyResidue {
578
575
 
579
576
  return $false
580
577
  }
578
+
579
+ function Test-ProjectScopeInstallSurface {
580
+ param(
581
+ [string]$Root,
582
+ [object]$ManifestSnapshot,
583
+ [ref]$Errors
584
+ )
585
+
586
+ if ($null -eq $ManifestSnapshot) {
587
+ return
588
+ }
589
+
590
+ $entries = @($ManifestSnapshot.entries | Where-Object { [string]$_.scope -eq "project" })
591
+ foreach ($entry in $entries) {
592
+ $destinationRaw = [string]$entry.destination
593
+ if ([string]::IsNullOrWhiteSpace($destinationRaw)) {
594
+ continue
595
+ }
596
+
597
+ $normalizedDestination = $destinationRaw.Replace('/', '\').TrimStart('\')
598
+ $expectsDirectory = $destinationRaw.Trim().Replace('\', '/').EndsWith('/', [System.StringComparison]::Ordinal)
599
+ $targetPath = Join-Path $Root $normalizedDestination
600
+
601
+ if ($expectsDirectory) {
602
+ if (-not (Test-Path -LiteralPath $targetPath -PathType Container)) {
603
+ Add-DoctorError -Errors $Errors -Message "project scope 安装缺少目录: $normalizedDestination"
604
+ }
605
+ continue
606
+ }
607
+
608
+ if (-not (Test-Path -LiteralPath $targetPath -PathType Leaf)) {
609
+ Add-DoctorError -Errors $Errors -Message "project scope 安装缺少文件: $normalizedDestination"
610
+ }
611
+ }
612
+ }
581
613
 
582
614
  function Test-DoctorMissingUserPackage {
583
615
  param([object]$HarnessConfigInfo)
@@ -796,7 +828,7 @@ function Test-PackageLock {
796
828
  }
797
829
  }
798
830
 
799
- function Test-InstallManifestSnapshot {
831
+ function Test-InstallManifestSnapshot {
800
832
  param(
801
833
  [string]$Root,
802
834
  [bool]$RequireSnapshot,
@@ -874,9 +906,6 @@ function Test-ThinProjectSurface {
874
906
  }
875
907
 
876
908
  $legacyResiduePaths = @(
877
- "docs\harness",
878
- "docs\testing",
879
- "docs\knowledge",
880
909
  "docs\requirement-prep-kit"
881
910
  )
882
911
 
@@ -915,6 +944,17 @@ function Test-ThinProjectSurface {
915
944
  }
916
945
  }
917
946
  }
947
+
948
+ function Read-InstallManifestSnapshotOrNull {
949
+ param([string]$Root)
950
+
951
+ $snapshotPath = Join-Path $Root ".codex-harness\manifests\install-manifest.json"
952
+ if (-not (Test-Path -LiteralPath $snapshotPath -PathType Leaf)) {
953
+ return $null
954
+ }
955
+
956
+ return Read-JsonFileOrNull -Path $snapshotPath
957
+ }
918
958
 
919
959
  function Test-HarnessConfig {
920
960
  param(
@@ -1145,21 +1185,25 @@ if ((Test-Path -LiteralPath $specManifestSchemaPath) -and (-not (Test-JsonFile -
1145
1185
  Add-DoctorError -Errors ([ref]$errors) -Message "spec-manifest.schema.json 不是合法 JSON: docs\\spec\\spec-manifest.schema.json"
1146
1186
  }
1147
1187
 
1148
- if ($isNotInstalledProject) {
1149
- Add-DoctorError -Errors ([ref]$errors) -Message "readiness gate 未检测到 harness config 或 legacy vendor,请先安装 project scope。"
1150
- }
1151
- else {
1188
+ if ($isNotInstalledProject) {
1189
+ Add-DoctorError -Errors ([ref]$errors) -Message "readiness gate 未检测到 harness config 或 legacy vendor,请先安装 project scope。"
1190
+ }
1191
+ else {
1152
1192
  if (-not $isVendorProjectInstall) {
1153
1193
  Test-SpecManifest -Root $resolvedProjectRoot -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1154
1194
  }
1155
1195
 
1156
- Test-HarnessConfig -Root $resolvedProjectRoot -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1157
- Test-PackageLock -Root $resolvedProjectRoot -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1158
- if (-not $isThinProjectInstall) {
1159
- Test-InstallManifest -Root $resolvedProjectRoot -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1160
- }
1161
- Test-InstallManifestSnapshot -Root $resolvedProjectRoot -RequireSnapshot:$harnessConfigInfo.Exists -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1162
- }
1196
+ Test-HarnessConfig -Root $resolvedProjectRoot -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1197
+ Test-PackageLock -Root $resolvedProjectRoot -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1198
+ if (-not $isThinProjectInstall) {
1199
+ Test-InstallManifest -Root $resolvedProjectRoot -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1200
+ }
1201
+ Test-InstallManifestSnapshot -Root $resolvedProjectRoot -RequireSnapshot:$harnessConfigInfo.Exists -Errors ([ref]$errors) -Warnings ([ref]$warnings)
1202
+ if ($isThinProjectInstall) {
1203
+ $installManifestSnapshot = Read-InstallManifestSnapshotOrNull -Root $resolvedProjectRoot
1204
+ Test-ProjectScopeInstallSurface -Root $resolvedProjectRoot -ManifestSnapshot $installManifestSnapshot -Errors ([ref]$errors)
1205
+ }
1206
+ }
1163
1207
 
1164
1208
  if (-not (Test-Path -LiteralPath $taskPath)) {
1165
1209
  if ($isNotInstalledProject) {
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": "0.1",
3
3
  "status": "draft",
4
4
  "package": "codex-harness",
5
- "version": "0.1.8",
5
+ "version": "0.1.9",
6
6
  "installModes": [
7
7
  {
8
8
  "name": "user",
@@ -2022,7 +2022,7 @@ function Copy-ManifestEntries {
2022
2022
  }
2023
2023
  }
2024
2024
 
2025
- function Overlay-DirectoryIfPresent {
2025
+ function Overlay-DirectoryIfPresent {
2026
2026
  param(
2027
2027
  [string]$SourceDirectory,
2028
2028
  [string]$DestinationDirectory
@@ -2056,8 +2056,8 @@ function Overlay-DirectoryIfPresent {
2056
2056
  }
2057
2057
  }
2058
2058
 
2059
- function Ensure-ReadmeForSmoke {
2060
- param([string]$Root)
2059
+ function Ensure-ReadmeForSmoke {
2060
+ param([string]$Root)
2061
2061
 
2062
2062
  $readmePath = Join-Path $Root "README.md"
2063
2063
  if (Test-Path -LiteralPath $readmePath) {
@@ -2070,11 +2070,47 @@ function Ensure-ReadmeForSmoke {
2070
2070
  "This README was generated by install-agent.ps1 to support the initial smoke task.",
2071
2071
  "Replace it with project-specific content after harness setup is verified."
2072
2072
  ) | Set-Content -LiteralPath $readmePath -Encoding UTF8
2073
-
2074
- return $readmePath
2075
- }
2076
-
2077
- function Copy-Package {
2073
+
2074
+ return $readmePath
2075
+ }
2076
+
2077
+ function Assert-InstalledProjectScopeSurface {
2078
+ param(
2079
+ [object]$ManifestInfo,
2080
+ [string]$ProjectRoot
2081
+ )
2082
+
2083
+ $projectEntries = @(
2084
+ $ManifestInfo.Entries |
2085
+ Where-Object { [string]$_.Scope -eq "project" }
2086
+ )
2087
+
2088
+ $missingPaths = @()
2089
+ foreach ($entry in $projectEntries) {
2090
+ $targetPath = [string]$entry.TargetPath
2091
+ if ([string]::IsNullOrWhiteSpace($targetPath)) {
2092
+ continue
2093
+ }
2094
+
2095
+ if ($entry.SourceKind -eq "directory") {
2096
+ if (-not (Test-Path -LiteralPath $targetPath -PathType Container)) {
2097
+ $missingPaths += $entry.Destination
2098
+ }
2099
+ continue
2100
+ }
2101
+
2102
+ if (-not (Test-Path -LiteralPath $targetPath -PathType Leaf)) {
2103
+ $missingPaths += $entry.Destination
2104
+ }
2105
+ }
2106
+
2107
+ if ($missingPaths.Count -gt 0) {
2108
+ $details = ($missingPaths | Sort-Object -Unique | ForEach-Object { "- $_" }) -join "`n"
2109
+ throw "project scope 安装后缺少以下真相源或运行文件:`n$details"
2110
+ }
2111
+ }
2112
+
2113
+ function Copy-Package {
2078
2114
  param(
2079
2115
  [string]$SourceRoot,
2080
2116
  [string]$DestinationRoot,
@@ -2399,18 +2435,23 @@ try {
2399
2435
  Write-Step "已写入 package lock: $lockPath"
2400
2436
  }
2401
2437
 
2402
- if ($Mode -eq "project" -or $Mode -eq "vendor") {
2403
- $configPackageRoot = if ($Mode -eq "vendor") { $targetAgentsRoot } elseif ($null -ne $scopeUserPackage) { [string]$scopeUserPackage.PackageRoot } else { $effectiveSourceRoot }
2404
- $configPath = Write-ProjectHarnessConfig `
2405
- -ManifestInfo $installManifestInfo `
2438
+ if ($Mode -eq "project" -or $Mode -eq "vendor") {
2439
+ $configPackageRoot = if ($Mode -eq "vendor") { $targetAgentsRoot } elseif ($null -ne $scopeUserPackage) { [string]$scopeUserPackage.PackageRoot } else { $effectiveSourceRoot }
2440
+ $configPath = Write-ProjectHarnessConfig `
2441
+ -ManifestInfo $installManifestInfo `
2406
2442
  -ProjectRoot $resolvedProjectRoot `
2407
2443
  -InstallScope $Mode `
2408
2444
  -VendorInstalled:($Mode -eq "vendor") `
2409
- -PackageRoot $configPackageRoot
2410
- Write-Step "已写入 harness config: $configPath"
2411
- }
2412
-
2413
- $generatedReadme = $null
2445
+ -PackageRoot $configPackageRoot
2446
+ Write-Step "已写入 harness config: $configPath"
2447
+ }
2448
+
2449
+ if ($Mode -eq "project") {
2450
+ Assert-InstalledProjectScopeSurface -ManifestInfo $installManifestInfo -ProjectRoot $resolvedProjectRoot
2451
+ Write-Step "project scope 真相源与运行文件已按 manifest 落地"
2452
+ }
2453
+
2454
+ $generatedReadme = $null
2414
2455
  if ($InitSmoke) {
2415
2456
  $generatedReadme = Ensure-ReadmeForSmoke -Root $resolvedProjectRoot
2416
2457
  if ($null -ne $generatedReadme) {
@@ -2506,7 +2547,7 @@ try {
2506
2547
  Write-Output ("- powershell -NoProfile -ExecutionPolicy Bypass -File `"{0}`"" -f (Join-Path $resolvedProjectRoot 'tools\harness\codex-loop.ps1'))
2507
2548
  }
2508
2549
  }
2509
- finally {
2550
+ finally {
2510
2551
  if (($null -ne $stagedSourceRoot) -and (Test-Path -LiteralPath $stagedSourceRoot)) {
2511
2552
  Remove-Item -LiteralPath $stagedSourceRoot -Recurse -Force -ErrorAction SilentlyContinue
2512
2553
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pzy560117/codex-harness",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "Codex Harness installer and project runtime CLI",
5
5
  "type": "module",
6
6
  "bin": {