svharness 0.13.5 → 0.14.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 (49) hide show
  1. package/README.md +43 -7
  2. package/dist/commands/apply.js +7 -77
  3. package/dist/commands/doctor/check-bootstrap.js +34 -0
  4. package/dist/commands/doctor/check-chinese-heuristic.js +64 -0
  5. package/dist/commands/doctor/check-convert-pairing.js +54 -0
  6. package/dist/commands/doctor/check-empty-dirs.js +59 -0
  7. package/dist/commands/doctor/check-incoming.js +47 -0
  8. package/dist/commands/doctor/check-memory.js +24 -0
  9. package/dist/commands/doctor/check-policy-grep.js +44 -0
  10. package/dist/commands/doctor/check-references.js +78 -0
  11. package/dist/commands/doctor/check-requirements-coverage.js +100 -0
  12. package/dist/commands/doctor/check-requirements.js +72 -0
  13. package/dist/commands/doctor/check-review-report.js +113 -0
  14. package/dist/commands/doctor/check-skills-tasks.js +104 -0
  15. package/dist/commands/doctor/check-specs.js +87 -0
  16. package/dist/commands/doctor/check-state-phases.js +116 -0
  17. package/dist/commands/doctor/check-wiki.js +52 -0
  18. package/dist/commands/doctor/index.js +105 -0
  19. package/dist/commands/doctor/report.js +79 -0
  20. package/dist/commands/doctor/types.js +2 -0
  21. package/dist/commands/doctor/utils.js +180 -0
  22. package/dist/commands/doctor.js +51 -0
  23. package/dist/commands/init.js +6 -3
  24. package/dist/config/index.js +2 -1
  25. package/dist/config/merge-options.js +13 -0
  26. package/dist/core/agent-injector.js +1 -0
  27. package/dist/core/build-project-entry.js +2 -0
  28. package/dist/core/render-meta.js +1 -0
  29. package/dist/core/state.js +29 -5
  30. package/dist/index.js +41 -0
  31. package/dist/utils/skill-md-validate.js +85 -0
  32. package/dist/utils/yaml-safe-path.js +33 -0
  33. package/package.json +3 -2
  34. package/templates/_shared/build-rules/harness-build-rule-convert-check.md +6 -0
  35. package/templates/_shared/build-rules/harness-build-rule-orchestrator-flow.md +21 -3
  36. package/templates/_shared/build-rules/harness-build-rule-pre-seal-review.md +59 -0
  37. package/templates/_shared/build-rules/harness-build-rule-requirements-extraction.md +43 -0
  38. package/templates/_shared/build-rules/harness-build-rule-specs-schema.md +14 -0
  39. package/templates/_shared/build-rules/harness-build-rule-user-interaction.md +8 -0
  40. package/templates/_shared/build-skills/harness-build-harness-data-review.md +16 -0
  41. package/templates/_shared/build-skills/harness-build-skill-orchestrator.md +19 -3
  42. package/templates/_shared/build-skills/harness-build-skill-pre-seal-review.md +213 -0
  43. package/templates/_shared/build-skills/harness-build-skill-spec-builder.md +47 -11
  44. package/templates/_shared/build-skills/harness-build-skills-main.md +3 -1
  45. package/templates/_shared/meta/README.md.ejs +2 -1
  46. package/templates/_shared/meta/task_list.md.ejs +44 -0
  47. package/templates/_shared/skeleton/agent-env/review-profiles/_default.yaml +64 -0
  48. package/templates/_shared/skeleton/agent-env/review-profiles/android-compose.yaml +35 -0
  49. package/templates/svharness.config.example.yaml +8 -0
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: harness-build-skill-spec-builder
3
3
  description: >
4
- 将需求文档转化为结构化 specs。驱动 raw → requirements → specs 两阶段管线,
5
- 并对产物做 specs/*/schema.json 校验。当用户说"条目化需求"、"生成 specs"、"构建 signals/ui/behavior/interfaces specs"、
4
+ 将需求文档转化为结构化 requirements/specs,并执行覆盖率门禁。驱动 inventory → requirements → specs 两阶段管线,
5
+ 并对 S40/S50 的完整性进行阻断校验。当用户说"条目化需求"、"生成 specs"、"构建 signals/ui/behavior/interfaces specs"、
6
6
  "structure requirements"、或由 harness-build-skill-orchestrator 委派给本 skill 时触发。
7
7
  ---
8
8
 
9
9
  # harness-build-skill-spec-builder(规格构建器)
10
10
 
11
- 你每次只处理一个模块,把原始需求转化为**可被 schema 校验通过**的 specs。
11
+ 你每次只处理一个模块,把原始需求转化为可追溯 requirements 与可被 schema 校验通过的 specs。
12
12
 
13
13
  ## 输入
14
14
 
@@ -20,36 +20,48 @@ description: >
20
20
  - `__HARNESS_ROOT__specs/<layer>/schema.json` —— 每一层的校验目标
21
21
  - `__HARNESS_ROOT__harness.yaml` —— 确认哪些层当前激活
22
22
 
23
- ## 两阶段管线
23
+ ## 两阶段管线(S40 / S50)
24
24
 
25
25
  ### 阶段 A:raw → requirements(条目化)
26
26
 
27
27
  执行步骤(强制顺序):
28
- 1. 先对 `requirements/raw/` 执行 `svharness convert` 到 `requirements/md/`,示例:
28
+
29
+ 1. 先完成源清点,输出 `__HARNESS_ROOT__requirements/_work/source-inventory.yaml`:
30
+ - 记录可追踪锚点列表(`anchors[]`)与分类计数(`counts_by_kind`)。
31
+ - 同时声明 `intake_profile.extraction_strategy`:`md_primary | raw_primary | hybrid | manual_assisted`。
32
+ 2. 若 `requirements/md/` 缺失对应产物,先执行 convert(示例):
29
33
  - `svharness convert --input "__HARNESS_ROOT__requirements/raw" --output "__HARNESS_ROOT__" --type requirements`
30
- 2. 校验 `requirements/raw/` 中每个非 `.md`、非 `.gitkeep` 文件,都在 `requirements/md/` 有同基名 `.md` 产物;若缺失,停止条目化并以表单提示用户补齐转换。
31
- 3. 基于 `requirements/md/` 的转换结果进行条目抽取,为 `requirements/raw/` 下每个源文件产出一个 `__HARNESS_ROOT__requirements/yaml/<module>.requirements.yaml`,结构如下:
34
+ 3. 若文档结构损失严重(例如大量 `NaN`、表头错位、锚点缺失),不得硬用 `md_primary`,改用 `raw_primary` `hybrid`。
35
+ 4. 基于选定策略抽取 requirements,为每个模块产出 `__HARNESS_ROOT__requirements/yaml/<module>.requirements.yaml`,结构如下:
32
36
 
33
37
  ```yaml
34
38
  module: <module>
35
39
  source_doc: "requirements/raw/<file>"
36
40
  extracted_at: <ISO8601 日期>
41
+ intake_profile:
42
+ extraction_strategy: md_primary | raw_primary | hybrid | manual_assisted
37
43
  items:
38
44
  - id: REQ-<MODULE>-001
39
45
  category: functional | non-functional | constraint
40
46
  priority: must | should | may
41
47
  description: "一句话陈述需求"
42
48
  acceptance: "如何验证该需求满足"
49
+ source_anchor: "SyRD-..."
50
+ source_file: "requirements/raw/<file>"
51
+ source_section: "01_Function Spec"
52
+ aggregates: []
53
+ waived: false
43
54
  traces_to:
44
55
  - specs/<layer>/<module>.<layer>.yaml#<anchor>
45
56
  ```
46
57
 
47
58
  规则:
48
59
  - 条目 id **稳定**:一旦产出不得改写,新条目追加。
49
- - 每条 `description` 必须是**一句清晰的陈述**。
60
+ - 有可追踪锚点时默认 1:1 条目化(细不能粗)。
61
+ - 每条 `description` 必须是一句清晰陈述,不得写成聚合摘要。
50
62
  - `traces_to` 初始可为空,阶段 B 生成 specs 后回填。
51
- - `source_doc` 必须引用 `requirements/raw/` 下真实文件。
52
- - **禁止跳过转换直接抽取**:不得直接从 `requirements/raw/` 读取 `.xlsx/.pdf/.docx` 等原始文件生成条目,必须通过 `requirements/md/` 中间层。
63
+ - `source_doc` `source_file` 必须引用真实源文件。
64
+ - 聚合仅在用户确认后允许,且必须带 `aggregates + aggregation_reason`。
53
65
 
54
66
  ### 阶段 B:requirements → specs(规格生成)
55
67
 
@@ -62,13 +74,36 @@ items:
62
74
  - 在本层的语义内回答相关需求条目
63
75
  4. 回填 `traces_to`:在 `requirements` 中把 spec 的路径/锚点记回对应条目。
64
76
  5. 校验 YAML 是否通过 schema(优先使用本地校验器;若无,对照 schema 的 `required` 与 `enum` 手动核对)。
77
+ 6. 生成 S40 覆盖率报告:`__HARNESS_ROOT__requirements/coverage-report.yaml`,至少包含:
78
+
79
+ ```yaml
80
+ extraction_strategy: md_primary
81
+ generated_at: "..."
82
+ sources:
83
+ - file: "requirements/raw/<file>"
84
+ anchors_total: 100
85
+ anchors_mapped: 96
86
+ anchors_waived: 4
87
+ coverage_ratio: 0.96
88
+ waived:
89
+ - anchor: "SyRD-..."
90
+ reason: "..."
91
+ unmapped: []
92
+ ```
65
93
 
66
94
  ## 状态更新
67
95
 
68
96
  每完成一个模块后:
69
- - 更新 `__HARNESS_ROOT__.harness-build-state.yaml`(阶段 S40 S50,带每层子状态)。
97
+ - 更新 `__HARNESS_ROOT__.harness-build-state.yaml`(阶段 S40/S50,带 coverage 字段)。
70
98
  - 刷新状态文件与 spec 文件的 `updated_at`。
71
99
 
100
+ ### S40 出口阻断(必须执行)
101
+
102
+ 在 S40 标 DONE 前必须输出表格并经用户确认:
103
+
104
+ - 列:`源 ID | YAML REQ ID | 状态(mapped/waived/gap)`
105
+ - 若存在 `gap` 且未完成 waiver,**禁止**标记 `S40_extract_requirements: DONE`。
106
+
72
107
  ## 守则(不得违反)
73
108
 
74
109
  - **不得无中生有**:所有需求必须来自 `__HARNESS_ROOT__requirements/raw/`。`requirements/raw/` 为空或仅含 `.gitkeep` 时,**必须以表单方式提示用户放入需求文档**,禁止自行生成占位内容。
@@ -85,6 +120,7 @@ items:
85
120
  随 agent 可能为 `.md` 或 `.mdc`):
86
121
 
87
122
  - `harness-build-rule-convert-check` — 本 skill 消费 `requirements/md/` 与 `references/md/`,上游 S30_convert_docs 缺漏时拒绝条目化。
123
+ - `harness-build-rule-requirements-extraction` — S40 提取策略、细粒度要求与覆盖率门禁。
88
124
  - `harness-build-rule-specs-schema` — specs 四域固定、schema.json 必过、字段增减需同步。
89
125
  - `harness-build-rule-orchestrator-flow` — 本 skill 仅服务 S40/S50,禁止跨阶段跳步。
90
126
  - `harness-build-rule-agent-agnostic` — 生成的 requirements/specs YAML 严禁出现具体 agent 名或私有语法。
@@ -37,11 +37,13 @@ skills 等**构建阶段**工作时,你不直接越级写产物,而是先完
37
37
  | id | 职责 | 典型触发 |
38
38
  |----|------|----------|
39
39
  | `harness-build-skill-orchestrator` | 读取状态机、输出状态卡片、阶段推进、更新 `next_action` | 「开始构建 harness」「继续 harness」「harness 进度」 |
40
- | `harness-build-skill-spec-builder` | raw → requirements YAML → specs YAML(schema 校验) | S40 / S50 阶段 |
40
+ | `harness-build-skill-spec-builder` | inventory → requirements YAML → specs YAML(schema + 覆盖率门禁) | S40 / S50 阶段 |
41
41
  | `harness-build-skill-references-intake` | references 转换与结构化索引 | S60 阶段 |
42
42
  | `harness-build-skill-agent-env-merge` | baseline 自动提取确认 + extra-skills/rules 合并写入 | S61 / S65 阶段 |
43
43
  | `harness-build-skill-knowledge-builder` | baseline 样本 + runtime skills/tasks 索引 | S10(子任务) / S70 阶段 |
44
44
  | `harness-build-skill-wiki-writer` | 按 `baseline/wiki/TASKS.md` 逐页撰写 wiki | S10_wiki PENDING |
45
+ | `harness-build-skill-pre-seal-review` | S85 合并审查(Part A 完整性 + Part B 深度质量,`HARNESS-REVIEW-REPORT.md`,C 级门禁) | S85 阶段 |
46
+ | `harness-build-harness-data-review` | **已合并** → 使用 `harness-build-skill-pre-seal-review` | S85(兼容别名) |
45
47
 
46
48
  以上子 skill 的完整正文位于 `__HARNESS_BUILD_SKILLS_DIR__/<id>/` 下(文件名随 Agent 为 `SKILL.md` 或 `SKILL.mdc`)。
47
49
 
@@ -33,7 +33,8 @@
33
33
  7. **S65_customize_agent_env** —— 对 extra-skills/extra-rules(及已确认启用的 baseline 提取候选)执行合并写入;来源可来自 `_incoming/manifest.yaml`;冲突时"建议 → 确认 → 写入"
34
34
  8. **S70_runtime_assets** —— 产出运行期 skills 与 tasks(skills 是能力积木,tasks 是流程模板)
35
35
  9. **S80_seed_memory** —— Agent 播种初始 memory 分类
36
- 10. **S90_finalize** —— `svharnessbuild seal` `bootstrap_mode` 翻转为 false
36
+ 10. **S85_pre_seal_validation** —— `svharness doctor` 硬检查 + 全面语义审查
37
+ 11. **S90_finalize** —— 版本 bump、CHANGELOG、将 `bootstrap_mode` 翻转为 false
37
38
 
38
39
  ## 常用命令
39
40
 
@@ -0,0 +1,44 @@
1
+ # task_list(阶段门禁清单)
2
+
3
+ 本清单在 `svharness build` 初始化时自动生成,用于人类可读的阶段执行与验收跟踪。
4
+
5
+ - 项目:`<%= name %>`
6
+ - 架构:`<%= arch %>`
7
+ - 生成时间:`<%= createdAt %>`
8
+
9
+ ## 同步规则(避免双份真相)
10
+
11
+ 1. 机器状态以 `.harness-build-state.yaml` 为准。
12
+ 2. 本文件作为可读镜像;阶段推进时需同步更新勾选项。
13
+ 3. 如本文件与 state 冲突,以 state 为准并回写本文件。
14
+
15
+ ## S40_extract_requirements 门禁清单
16
+
17
+ - [ ] 已生成并确认 `requirements/_work/source-inventory.yaml`
18
+ - [ ] 已完成细粒度 requirements 条目化(可追踪锚点默认 1:1)
19
+ - [ ] 已生成 `requirements/coverage-report.yaml`
20
+ - [ ] 已处理 `gap/waiver`,且未闭环项已完成用户确认
21
+ - [ ] 满足 DONE 条件后,state 标记 `S40_extract_requirements: DONE`
22
+
23
+ ## S50_generate_specs 门禁清单
24
+
25
+ - [ ] 已产出四域 specs(signals/ui/behavior/interfaces)对应 YAML
26
+ - [ ] REQ → spec 映射已建立(无映射项需显式 N/A 理由)
27
+ - [ ] 已生成 specs 覆盖率结果(写入 state 或报告)
28
+ - [ ] 满足 DONE 条件后,state 标记 `S50_generate_specs: DONE`
29
+
30
+ ## S85_pre_seal_validation 门禁清单
31
+
32
+ - [ ] 已执行 `svharness doctor --mode pre-seal` 且 exit code = 0
33
+ - [ ] 已产出 `HARNESS-REVIEW-REPORT.md`(含 Part A 完整性 + Part B 深度评分)
34
+ - [ ] 报告 frontmatter:`gate_pass: true`,`overall_score >= 5.0`(C 级),`critical_count: 0`
35
+ - [ ] 报告包含:源锚点/REQ→spec 覆盖率、深度 metrics、差距表与 Top-5 修复
36
+ - [ ] 对 doctor warning 给出保留理由或修复说明
37
+ - [ ] 审查结论已用户表单确认
38
+ - [ ] state 已写入 `review_report_path`、`depth_review_score`、`review_gate_pass: true`
39
+ - [ ] 满足 DONE 条件后,state 标记 `S85_pre_seal_validation: DONE`
40
+
41
+ ## 备注
42
+
43
+ - 本文件不替代 state,仅用于可读性与协作审查。
44
+ - 如阶段门禁规则升级,请同步更新本模板与相关 build-rules/build-skills。
@@ -0,0 +1,64 @@
1
+ # 通用深度审查 profile(arch-agnostic)
2
+ # S85 Part B 在未找到 <arch>.yaml 时使用本文件。
3
+ schema_version: "1.0"
4
+ min_depth_score: 5.0
5
+ min_depth_grade: C
6
+
7
+ dimension_weights:
8
+ quantitative_coverage: 0.20
9
+ signals_depth: 0.25
10
+ behavior_states: 0.15
11
+ interfaces_contract: 0.10
12
+ ui_authenticity: 0.15
13
+ source_data_integrity: 0.10
14
+
15
+ # 仅当 harness.yaml specs.layers 含对应 name 时启用该维度
16
+ layer_gates:
17
+ signals: signals_depth
18
+ behavior: behavior_states
19
+ interfaces: interfaces_contract
20
+ ui: ui_authenticity
21
+
22
+ critical_patterns:
23
+ - id: P9
24
+ name: coverage_report_dishonest
25
+ severity: Critical
26
+ description: quantity_coverage=1.0 但 Part B 存在显著定性差距
27
+ - id: P7
28
+ name: bound_reference_broken
29
+ severity: Critical
30
+ description: UI/规格 bound_* 引用不存在的 ID
31
+ - id: P3
32
+ name: source_table_not_extracted
33
+ severity: Critical
34
+ description: 源 MD 大表区段未条目化到 specs(启发式)
35
+ requires_md_section: true
36
+
37
+ heuristics:
38
+ index_signal_id_ratio_threshold: 0.80
39
+ oem_name_ratio_threshold: 0.20
40
+ req_per_state_ratio_warn: 10
41
+ req_per_state_ratio_fail: 20
42
+ nan_count_warn: 100
43
+ methods_empty_ratio_fail: 0.90
44
+ condition_truncated_chars: 80
45
+
46
+ md_section_discovery:
47
+ # 不写死业务表名;用正则发现「大表格区段」
48
+ table_section_title_patterns:
49
+ - "(?i)signal\\s*list"
50
+ - "(?i)信号列表"
51
+ - "(?i)signal\\s*table"
52
+ function_spec_title_patterns:
53
+ - "(?i)function\\s*spec"
54
+ - "(?i)功能规格"
55
+ - "(?i)01_function"
56
+
57
+ report:
58
+ filename: HARNESS-REVIEW-REPORT.md
59
+ frontmatter_required:
60
+ - review_version
61
+ - overall_score
62
+ - overall_grade
63
+ - critical_count
64
+ - gate_pass
@@ -0,0 +1,35 @@
1
+ # android-compose 架构深度审查 profile(叠加 _default.yaml)
2
+ schema_version: "1.0"
3
+ extends: _default.yaml
4
+ arch: android-compose
5
+
6
+ # 车载 / Compose 域专有启发式(仅在本 arch 启用)
7
+ oem_signal_name_patterns:
8
+ - "^P_[A-Z0-9_]+$"
9
+ - "^A_[A-Z0-9_]+$"
10
+ - "^L_[A-Z0-9_]+$"
11
+ - "^PCNOWDSP$"
12
+ - "^PCHGTM"
13
+ - "^CL_[A-Z0-9_]+$"
14
+ - "^M_[A-Z0-9_]+$"
15
+
16
+ index_signal_id_patterns:
17
+ - "^CMDID_CHARGING_"
18
+ - "^Charging_[0-9_]+$"
19
+
20
+ md_section_discovery:
21
+ table_section_title_patterns:
22
+ - "(?i)02[\\\\_]*signal[\\\\_]*list"
23
+ - "(?i)signal\\s*list"
24
+ - "(?i)信号列表"
25
+ syrd_anchor_pattern: "SyRD-[A-Za-z0-9-]+"
26
+
27
+ signals_depth:
28
+ require_hmi2car_when_operate_signals_in_source: true
29
+ prefer_can_msg_id: true
30
+
31
+ additional_critical_patterns:
32
+ - id: P1
33
+ name: index_only_signals
34
+ severity: Critical
35
+ description: 信号规格主要为索引式占位,缺少 OEM 命名或物理/协议字段
@@ -35,6 +35,14 @@ apply:
35
35
  consistency: basic
36
36
  yes: true
37
37
 
38
+ # doctor:封存前硬检查(S85 阶段 Agent 亦须调用)
39
+ doctor:
40
+ harness: ./my-app-harness
41
+ mode: pre-seal
42
+ format: json
43
+ strict: false
44
+ verbose: false
45
+
38
46
  # convert:output 无 harness.yaml 时写入该目录;有 harness.yaml 时写入 <output>/<type>/md/
39
47
  convert:
40
48
  input: