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.
- package/README.md +43 -7
- package/dist/commands/apply.js +7 -77
- package/dist/commands/doctor/check-bootstrap.js +34 -0
- package/dist/commands/doctor/check-chinese-heuristic.js +64 -0
- package/dist/commands/doctor/check-convert-pairing.js +54 -0
- package/dist/commands/doctor/check-empty-dirs.js +59 -0
- package/dist/commands/doctor/check-incoming.js +47 -0
- package/dist/commands/doctor/check-memory.js +24 -0
- package/dist/commands/doctor/check-policy-grep.js +44 -0
- package/dist/commands/doctor/check-references.js +78 -0
- package/dist/commands/doctor/check-requirements-coverage.js +100 -0
- package/dist/commands/doctor/check-requirements.js +72 -0
- package/dist/commands/doctor/check-review-report.js +113 -0
- package/dist/commands/doctor/check-skills-tasks.js +104 -0
- package/dist/commands/doctor/check-specs.js +87 -0
- package/dist/commands/doctor/check-state-phases.js +116 -0
- package/dist/commands/doctor/check-wiki.js +52 -0
- package/dist/commands/doctor/index.js +105 -0
- package/dist/commands/doctor/report.js +79 -0
- package/dist/commands/doctor/types.js +2 -0
- package/dist/commands/doctor/utils.js +180 -0
- package/dist/commands/doctor.js +51 -0
- package/dist/commands/init.js +6 -3
- package/dist/config/index.js +2 -1
- package/dist/config/merge-options.js +13 -0
- package/dist/core/agent-injector.js +1 -0
- package/dist/core/build-project-entry.js +2 -0
- package/dist/core/render-meta.js +1 -0
- package/dist/core/state.js +29 -5
- package/dist/index.js +41 -0
- package/dist/utils/skill-md-validate.js +85 -0
- package/dist/utils/yaml-safe-path.js +33 -0
- package/package.json +3 -2
- package/templates/_shared/build-rules/harness-build-rule-convert-check.md +6 -0
- package/templates/_shared/build-rules/harness-build-rule-orchestrator-flow.md +21 -3
- package/templates/_shared/build-rules/harness-build-rule-pre-seal-review.md +59 -0
- package/templates/_shared/build-rules/harness-build-rule-requirements-extraction.md +43 -0
- package/templates/_shared/build-rules/harness-build-rule-specs-schema.md +14 -0
- package/templates/_shared/build-rules/harness-build-rule-user-interaction.md +8 -0
- package/templates/_shared/build-skills/harness-build-harness-data-review.md +16 -0
- package/templates/_shared/build-skills/harness-build-skill-orchestrator.md +19 -3
- package/templates/_shared/build-skills/harness-build-skill-pre-seal-review.md +213 -0
- package/templates/_shared/build-skills/harness-build-skill-spec-builder.md +47 -11
- package/templates/_shared/build-skills/harness-build-skills-main.md +3 -1
- package/templates/_shared/meta/README.md.ejs +2 -1
- package/templates/_shared/meta/task_list.md.ejs +44 -0
- package/templates/_shared/skeleton/agent-env/review-profiles/_default.yaml +64 -0
- package/templates/_shared/skeleton/agent-env/review-profiles/android-compose.yaml +35 -0
- 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
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
-
|
|
60
|
+
- 有可追踪锚点时默认 1:1 条目化(细不能粗)。
|
|
61
|
+
- 每条 `description` 必须是一句清晰陈述,不得写成聚合摘要。
|
|
50
62
|
- `traces_to` 初始可为空,阶段 B 生成 specs 后回填。
|
|
51
|
-
- `source_doc`
|
|
52
|
-
-
|
|
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
|
|
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` |
|
|
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. **
|
|
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:
|