svharness 0.14.2 → 0.14.7

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 (35) hide show
  1. package/README.md +50 -3
  2. package/dist/commands/apply.js +9 -2
  3. package/dist/commands/convert.js +39 -4
  4. package/dist/commands/doctor/check-requirements-fidelity.js +96 -0
  5. package/dist/commands/doctor/check-requirements.js +33 -1
  6. package/dist/commands/doctor/check-specs-depth.js +165 -0
  7. package/dist/commands/doctor/index.js +4 -0
  8. package/dist/commands/init.js +27 -4
  9. package/dist/config/merge-options.js +5 -0
  10. package/dist/config/normalize.js +5 -1
  11. package/dist/core/apply-project-entry.js +8 -1
  12. package/dist/core/harness-yaml-baseline.js +68 -0
  13. package/dist/core/markdown-sheet-split.js +109 -0
  14. package/dist/core/markdown-table-cleanup.js +151 -0
  15. package/dist/core/next-steps.js +15 -2
  16. package/dist/core/repomix-apply-hint.js +68 -0
  17. package/dist/core/repomix-pack.js +5 -0
  18. package/dist/index.js +9 -0
  19. package/package.json +1 -1
  20. package/templates/_shared/apply-skills/harness-apply-skills-main.md +2 -0
  21. package/templates/_shared/build-rules/harness-build-rule-chinese-only.md +2 -2
  22. package/templates/_shared/build-rules/harness-build-rule-orchestrator-flow.md +5 -2
  23. package/templates/_shared/build-rules/harness-build-rule-pre-seal-review.md +7 -1
  24. package/templates/_shared/build-rules/harness-build-rule-requirements-extraction.md +10 -1
  25. package/templates/_shared/build-rules/harness-build-rule-specs-schema.md +8 -4
  26. package/templates/_shared/build-skills/harness-build-skill-pre-seal-review.md +3 -0
  27. package/templates/_shared/build-skills/harness-build-skill-spec-builder.md +48 -7
  28. package/templates/_shared/meta/AGENTS_APPLY.md.ejs +5 -0
  29. package/templates/_shared/meta/harness.yaml.ejs +2 -0
  30. package/templates/_shared/skeleton/requirements/yaml/schema.json +75 -0
  31. package/templates/_shared/skeleton/specs/behavior/schema.json +8 -8
  32. package/templates/_shared/skeleton/specs/interfaces/schema.json +4 -4
  33. package/templates/_shared/skeleton/specs/signals/schema.json +12 -1
  34. package/templates/_shared/skeleton/specs/ui/schema.json +5 -4
  35. package/templates/svharness.config.example.yaml +3 -0
@@ -20,24 +20,28 @@ specs/
20
20
  - 字段增减/重命名时,`schema.json` 与对应 yaml 必须**同一提交**更新,不得分两步。
21
21
  - yaml 中不得出现任何具体 agent 名(qoder/codechat/cursor/claude-code/opencode 等)— 违反 agent-agnostic 铁律。
22
22
 
23
- ## requirements 追溯字段建议(S40/S50 配套)
23
+ ## requirements 追溯字段要求(S40/S50 配套)
24
24
 
25
- 为提升 requirements/specs 完整性,`requirements/yaml/*.requirements.yaml` 的条目建议包含:
25
+ 为提升 requirements/specs 完整性,`requirements/yaml/*.requirements.yaml` 的条目必须包含:
26
26
 
27
+ - `title`: 条目短索引标题(仅用于导航与表格展示)
28
+ - `source_excerpt`: 源文档原文摘录(可多行)
29
+ - `description`: 完整需求陈述(不得弱于 source_excerpt)
27
30
  - `source_anchor`: 可追踪源锚点(如 `SyRD-*`、章节+行号)
28
- - `source_file`: 源文件路径(通常在 `requirements/raw/`)
31
+ - `source_file`: Agent 可读的文本源路径——`requirements/md/<同名>.md`(convert 产物)或 `requirements/raw/` 下的 md/txt/代码文件;禁止引用 xlsx/pdf/docx 等难解析格式
29
32
  - `source_section`: 源章节或表格区域
30
33
  - `aggregates`: 聚合锚点列表(仅在显式聚合时)
31
34
  - `aggregation_reason`: 聚合原因(聚合时必填)
32
35
  - `waived`: 是否作为门禁豁免项
33
36
  - `waived_reason`: 豁免原因(waived 为 true 时必填)
34
37
 
35
- 以上为推荐字段,不改变四域 specs schema 强约束。
38
+ 以上要求与 `requirements/yaml/schema.json` 保持一致;不满足时不得推进到 S50。
36
39
 
37
40
  ## 校验节点
38
41
 
39
42
  - S50_generate_specs 退出前:所有 yaml 逐一过 schema 校验,失败则阶段状态置 FAILED。
40
43
  - 后续阶段读取 specs 时不做 schema 校验(已由 S50 把关),但仍不得修改已冻结字段。
44
+ - specs 内容不得退化为索引式占位(仅 `id`/`name` 且缺少语义字段);发现此类情况应在 S50 判为失败或在 S85 记 Critical。
41
45
 
42
46
  ## 正反例
43
47
 
@@ -62,6 +62,7 @@ profile 提供:`min_depth_score`、`dimension_weights`、`critical_patterns`
62
62
  **阶段合规**:对照 `.harness-build-state.yaml`,S00–S80 在封存前应 DONE(S10_wiki 若不存在则跳过)。
63
63
 
64
64
  **可追溯**:若存在 `requirements/yaml/*.yaml`,每条需求须在已声明 spec 层有映射、`aggregates` 或合法 `waived`。
65
+ **完整性抽检**:随机抽检至少 5 条(或按规模取样),校验 `description` 是否覆盖 `source_excerpt` 中的条件、数值、枚举、时序。
65
66
 
66
67
  **其它**:references/wiki 一致性;构建期表单确认(`harness-build-rule-user-interaction`);中文与 agent-agnostic 扫尾。
67
68
 
@@ -89,6 +90,7 @@ Part A 结论写入报告「Part A 清单」章节,逐项 PASS/WARN/FAIL/N/A
89
90
  - 索引式 ID 占比(如 `CMDID_<模块>_<编号>` 且无 `enum_values`/`can_msg_id`)
90
91
  - 方向分布:仅 `car2hmi` 无 `hmi2car` → WARN/FAIL
91
92
  - 字段深度:仅 id/name/direction/type/traces_to → 索引式
93
+ - 对 `enum` 类型:缺少 `enum_values` 视为深度不足(至少 WARN,可按 profile 记 Critical)
92
94
 
93
95
  **若 profile 提供 `oem_signal_name_patterns`**:计算 OEM 名占比;`< threshold` → 索引式规格(模式 P1,可 Critical)。
94
96
 
@@ -96,6 +98,7 @@ Part A 结论写入报告「Part A 清单」章节,逐项 PASS/WARN/FAIL/N/A
96
98
 
97
99
  - `req_count / state_count` > profile 阈值 → 严重不足(P4)
98
100
  - `transitions < states * 1.5` → WARN
101
+ - `guard` / `action` 为空或出现「见需求」「TBD」占位语义 → WARN/FAIL
99
102
 
100
103
  ### 维度 4:interfaces 契约(仅当存在 specs/interfaces)
101
104
 
@@ -44,10 +44,18 @@ items:
44
44
  - id: REQ-<MODULE>-001
45
45
  category: functional | non-functional | constraint
46
46
  priority: must | should | may
47
- description: "一句话陈述需求"
47
+ title: "短索引标题(用于表格与路由)"
48
+ source_excerpt: |
49
+ 从 source_anchor 对应原文复制的完整摘录(允许多行)。
50
+ 必须保留条件、数值、枚举、时序等关键信息。
51
+ description: |
52
+ 基于 source_excerpt 的完整需求陈述。
53
+ 允许整理语序,但信息集合不得缩小。
48
54
  acceptance: "如何验证该需求满足"
49
55
  source_anchor: "SyRD-..."
50
- source_file: "requirements/raw/<file>"
56
+ # AI 可读文本源(二选一,禁止引用 xlsx/pdf/docx 等难解析格式):
57
+ source_file: "requirements/md/<file>.md" # 原始为 pdf/xlsx/docx 等 → 引用 convert 产物
58
+ # source_file: "requirements/raw/<file>.md" # 或 raw 下本身可读的 md/txt/代码文件
51
59
  source_section: "01_Function Spec"
52
60
  aggregates: []
53
61
  waived: false
@@ -58,10 +66,17 @@ items:
58
66
  规则:
59
67
  - 条目 id **稳定**:一旦产出不得改写,新条目追加。
60
68
  - 有可追踪锚点时默认 1:1 条目化(细不能粗)。
61
- - 每条 `description` 必须是一句清晰陈述,不得写成聚合摘要。
69
+ - `title` 仅作索引;不得把 `title` 充当完整需求描述。
70
+ - `source_excerpt` 必须来自源文档原文;禁止写成「见上文」「同前」等替代语。
71
+ - `description` 必须覆盖 `source_excerpt` 的关键约束;不得删减条件、数值、枚举、时序。
62
72
  - `traces_to` 初始可为空,阶段 B 生成 specs 后回填。
63
- - `source_doc` 与 `source_file` 必须引用真实源文件。
73
+ - `source_doc` 记录原始入库路径(`requirements/raw/<原始文件名>`),用于资产追溯。
74
+ - `source_file` 必须指向 **Agent 可直接读取的文本源**,路径二选一:
75
+ - `requirements/md/<同名>.md` —— 原始为 pdf/xlsx/docx 等时,引用 S30 convert 后的 Markdown;
76
+ - `requirements/raw/<file>` —— 原始本身即为 `.md`、`.txt` 或源代码文件(如 `.kt`、`.xml`、`.proto` 等)。
77
+ - **禁止**将 `requirements/raw/` 下的 xlsx、pdf、docx、图片等 AI 难处理格式写入 `source_file`。
64
78
  - 聚合仅在用户确认后允许,且必须带 `aggregates + aggregation_reason`。
79
+ - 产出后必须校验 `requirements/yaml/schema.json`(若存在);失败不得进入 S50。
65
80
 
66
81
  ### 阶段 B:requirements → specs(规格生成)
67
82
 
@@ -71,7 +86,11 @@ items:
71
86
  2. 读取 `__HARNESS_ROOT__specs/<layer>/schema.json`。
72
87
  3. 生成 `__HARNESS_ROOT__specs/<layer>/<module>.<layer>.yaml`,要求:
73
88
  - 满足 schema(所有 `required` 字段完备、`enum` 取值合法)
74
- - 在本层的语义内回答相关需求条目
89
+ - 在本层语义内完整回答相关需求条目,禁止仅保留索引占位
90
+ - `signals`:除 `id` 外须补全 `name`、`direction`、`type`;`type=enum` 时必须有 `enum_values`
91
+ - `behavior`:`transitions[].guard/action` 应为可执行陈述,禁止「见需求」占位
92
+ - `ui`:`components[].states[].condition` 必须写出具体触发条件并可追溯到 REQ
93
+ - `interfaces`:`methods[].description` 需包含参数语义与返回约束,不得仅列方法名
75
94
  4. 回填 `traces_to`:在 `requirements` 中把 spec 的路径/锚点记回对应条目。
76
95
  5. 校验 YAML 是否通过 schema(优先使用本地校验器;若无,对照 schema 的 `required` 与 `enum` 手动核对)。
77
96
  6. 生成 S40 覆盖率报告:`__HARNESS_ROOT__requirements/coverage-report.yaml`,至少包含:
@@ -80,7 +99,8 @@ items:
80
99
  extraction_strategy: md_primary
81
100
  generated_at: "..."
82
101
  sources:
83
- - file: "requirements/raw/<file>"
102
+ - file: "requirements/md/<file>.md" # 或 requirements/raw/<可读文本文件>
103
+ source_doc: "requirements/raw/<原始文件>" # 可选,保留原始资产路径
84
104
  anchors_total: 100
85
105
  anchors_mapped: 96
86
106
  anchors_waived: 4
@@ -91,6 +111,25 @@ waived:
91
111
  unmapped: []
92
112
  ```
93
113
 
114
+ 7. 生成 S50 规格覆盖率报告:`__HARNESS_ROOT__specs/coverage-report.yaml`,至少包含:
115
+
116
+ ```yaml
117
+ generated_at: "..."
118
+ module: "<module>"
119
+ requirements_total: 120
120
+ requirements_mapped: 116
121
+ requirements_waived: 4
122
+ mapping_ratio: 0.967
123
+ layers:
124
+ - name: signals
125
+ req_mapped: 80
126
+ quality_flags: []
127
+ - name: behavior
128
+ req_mapped: 20
129
+ quality_flags: []
130
+ critical_gaps: []
131
+ ```
132
+
94
133
  ## 状态更新
95
134
 
96
135
  每完成一个模块后:
@@ -101,8 +140,10 @@ unmapped: []
101
140
 
102
141
  在 S40 标 DONE 前必须输出表格并经用户确认:
103
142
 
104
- - 列:`源 ID | YAML REQ ID | 状态(mapped/waived/gap)`
143
+ - 列:`源 ID | YAML REQ ID | excerpt_len | desc_len | 缩略风险 | 状态(mapped/waived/gap)`
144
+ - `缩略风险` 判定建议:`desc_len / excerpt_len < 0.5` 记 WARN;`< 0.25` 记 FAIL。
105
145
  - 若存在 `gap` 且未完成 waiver,**禁止**标记 `S40_extract_requirements: DONE`。
146
+ - 若存在 `source_excerpt` 缺失、`description` 缩略 FAIL、或 schema 校验失败,**禁止**标记 DONE。
106
147
 
107
148
  ## 守则(不得违反)
108
149
 
@@ -100,6 +100,7 @@ __BUILD_MAIN_BRIDGE_HINT__
100
100
  |------|------|------|
101
101
  | `baseline/wiki/` | 项目知识摘要,优先建立上下文 | 只读 |
102
102
  | `baseline/code/` | 权威参考实现 | 只读 |
103
+ | `baseline/repomix/repomix-pack.xml` | 可选:Repomix 整库 XML 快照(仅 build 启用 `--repomix` 时存在;见 `harness.yaml` → `baseline.repomix_pack`) | 只读 |
103
104
  | `specs/signals/` | 信号/协议规格 | 只读 |
104
105
  | `specs/ui/` | UI 规格 | 只读 |
105
106
  | `specs/behavior/` | 行为规格 | 只读 |
@@ -108,6 +109,10 @@ __BUILD_MAIN_BRIDGE_HINT__
108
109
 
109
110
  > `baseline/code/` 是“参考实现”的权威来源。
110
111
  > 你仍需阅读并修改目标项目业务源码来完成交付,但不得把 `baseline/code/` 之外的路径当作规范样本来源。
112
+ >
113
+ > 若存在 `baseline/repomix/repomix-pack.xml`,清单字段为 `harness.yaml` → `baseline.repomix_pack`;`svharness apply` 会在项目根入口与本 skill 中注入详细用法。
114
+
115
+ __REPOMIX_APPLY_HINT__
111
116
 
112
117
  ### 4.3 编码执行
113
118
 
@@ -23,6 +23,7 @@ requirements: # 正式需求(参与条目化)
23
23
  raw: requirements/raw/ # S20_collect_inputs 用户入口
24
24
  md: requirements/md/ # convert 产物
25
25
  yaml: requirements/yaml/ # S40 条目化产出
26
+ schema: requirements/yaml/schema.json # requirements 条目结构校验
26
27
  # requirements 输入路径(可选):可记录外部需求文档来源(文件或目录)。
27
28
  <% if (requirementsPath) { -%>
28
29
  source: "<%= requirementsPath %>"
@@ -42,6 +43,7 @@ references: # 参考资料(不参与条目化)
42
43
  baseline:
43
44
  code: baseline/code/ # 基线代码快照(参考样本)
44
45
  wiki: baseline/wiki/ # 基线工程 wiki
46
+ # repomix_pack: baseline/repomix/repomix-pack.xml # 仅 --repomix 成功后由 CLI 写入
45
47
 
46
48
  # Agent 运行时环境(规则、技能、工具、记忆)。
47
49
  # incoming_* 仅构建期:`svharness build --extra-skills` 将资源暂存于此并生成 manifest,S65 确认后分流写入 rules/skills。
@@ -0,0 +1,75 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "harness://requirements/yaml/schema.json",
4
+ "title": "需求条目 Schema",
5
+ "description": "描述 requirements/yaml 下的结构化需求条目,要求保留原文摘录与完整需求陈述。",
6
+ "type": "object",
7
+ "required": ["module", "source_doc", "extracted_at", "intake_profile", "items"],
8
+ "properties": {
9
+ "module": { "type": "string", "minLength": 1 },
10
+ "source_doc": { "type": "string", "minLength": 1 },
11
+ "extracted_at": { "type": "string", "format": "date-time" },
12
+ "intake_profile": {
13
+ "type": "object",
14
+ "required": ["extraction_strategy"],
15
+ "properties": {
16
+ "extraction_strategy": {
17
+ "type": "string",
18
+ "enum": ["md_primary", "raw_primary", "hybrid", "manual_assisted"]
19
+ }
20
+ },
21
+ "additionalProperties": true
22
+ },
23
+ "items": {
24
+ "type": "array",
25
+ "minItems": 1,
26
+ "items": {
27
+ "type": "object",
28
+ "required": [
29
+ "id",
30
+ "category",
31
+ "priority",
32
+ "title",
33
+ "source_excerpt",
34
+ "description",
35
+ "acceptance",
36
+ "source_anchor",
37
+ "source_file",
38
+ "source_section",
39
+ "aggregates",
40
+ "waived",
41
+ "traces_to"
42
+ ],
43
+ "properties": {
44
+ "id": { "type": "string", "pattern": "^REQ-[A-Z0-9_]+-\\d{3,}$" },
45
+ "category": { "type": "string", "enum": ["functional", "non-functional", "constraint"] },
46
+ "priority": { "type": "string", "enum": ["must", "should", "may"] },
47
+ "title": { "type": "string", "minLength": 2 },
48
+ "source_excerpt": { "type": "string", "minLength": 1 },
49
+ "description": { "type": "string", "minLength": 1 },
50
+ "acceptance": { "type": "string", "minLength": 1 },
51
+ "source_anchor": { "type": "string", "minLength": 1 },
52
+ "source_file": {
53
+ "type": "string",
54
+ "minLength": 1,
55
+ "description": "Agent 可读文本源:requirements/md/<同名>.md(convert 产物)或 requirements/raw/ 下的 md/txt/代码文件;禁止 xlsx/pdf/docx 等"
56
+ },
57
+ "source_section": { "type": "string", "minLength": 1 },
58
+ "aggregates": {
59
+ "type": "array",
60
+ "items": { "type": "string", "minLength": 1 }
61
+ },
62
+ "aggregation_reason": { "type": "string" },
63
+ "waived": { "type": "boolean" },
64
+ "waived_reason": { "type": "string" },
65
+ "traces_to": {
66
+ "type": "array",
67
+ "items": { "type": "string", "minLength": 1 }
68
+ }
69
+ },
70
+ "additionalProperties": true
71
+ }
72
+ }
73
+ },
74
+ "additionalProperties": true
75
+ }
@@ -6,7 +6,7 @@
6
6
  "type": "object",
7
7
  "required": ["module", "version", "states", "transitions"],
8
8
  "properties": {
9
- "module": { "type": "string" },
9
+ "module": { "type": "string", "minLength": 1 },
10
10
  "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
11
11
  "initial_state": { "type": "string" },
12
12
  "states": {
@@ -15,8 +15,8 @@
15
15
  "type": "object",
16
16
  "required": ["name"],
17
17
  "properties": {
18
- "name": { "type": "string" },
19
- "description": { "type": "string" }
18
+ "name": { "type": "string", "minLength": 1 },
19
+ "description": { "type": "string", "minLength": 8 }
20
20
  }
21
21
  }
22
22
  },
@@ -26,11 +26,11 @@
26
26
  "type": "object",
27
27
  "required": ["from", "to", "trigger"],
28
28
  "properties": {
29
- "from": { "type": "string" },
30
- "to": { "type": "string" },
31
- "trigger": { "type": "string" },
32
- "guard": { "type": "string" },
33
- "action": { "type": "string" }
29
+ "from": { "type": "string", "minLength": 1 },
30
+ "to": { "type": "string", "minLength": 1 },
31
+ "trigger": { "type": "string", "minLength": 1 },
32
+ "guard": { "type": "string", "minLength": 4 },
33
+ "action": { "type": "string", "minLength": 4 }
34
34
  }
35
35
  }
36
36
  }
@@ -6,7 +6,7 @@
6
6
  "type": "object",
7
7
  "required": ["module", "version", "interfaces"],
8
8
  "properties": {
9
- "module": { "type": "string" },
9
+ "module": { "type": "string", "minLength": 1 },
10
10
  "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
11
11
  "interfaces": {
12
12
  "type": "array",
@@ -14,7 +14,7 @@
14
14
  "type": "object",
15
15
  "required": ["name", "kind"],
16
16
  "properties": {
17
- "name": { "type": "string" },
17
+ "name": { "type": "string", "minLength": 1 },
18
18
  "kind": { "type": "string", "enum": ["aidl", "http", "ipc", "binder", "custom"] },
19
19
  "methods": {
20
20
  "type": "array",
@@ -22,10 +22,10 @@
22
22
  "type": "object",
23
23
  "required": ["name"],
24
24
  "properties": {
25
- "name": { "type": "string" },
25
+ "name": { "type": "string", "minLength": 1 },
26
26
  "params": { "type": "array", "items": { "type": "object" } },
27
27
  "returns": { "type": "string" },
28
- "description": { "type": "string" }
28
+ "description": { "type": "string", "minLength": 8 }
29
29
  }
30
30
  }
31
31
  }
@@ -15,13 +15,15 @@
15
15
  "required": ["id", "name", "direction", "type"],
16
16
  "properties": {
17
17
  "id": { "type": "string", "pattern": "^CMDID_[A-Z0-9_]+$" },
18
- "name": { "type": "string" },
18
+ "name": { "type": "string", "minLength": 1 },
19
+ "description": { "type": "string", "minLength": 8 },
19
20
  "direction": { "type": "string", "enum": ["car2hmi", "hmi2car", "bidirectional"] },
20
21
  "type": { "type": "string", "enum": ["int", "bool", "enum", "byte-array", "float"] },
21
22
  "length_bytes": { "type": "integer", "minimum": 1 },
22
23
  "default": {},
23
24
  "enum_values": {
24
25
  "type": "array",
26
+ "minItems": 1,
25
27
  "items": { "type": "object", "required": ["value", "meaning"] }
26
28
  },
27
29
  "traces_to": {
@@ -29,6 +31,15 @@
29
31
  "items": { "type": "string" }
30
32
  }
31
33
  },
34
+ "allOf": [
35
+ {
36
+ "if": {
37
+ "properties": { "type": { "const": "enum" } },
38
+ "required": ["type"]
39
+ },
40
+ "then": { "required": ["enum_values"] }
41
+ }
42
+ ],
32
43
  "additionalProperties": true
33
44
  }
34
45
  }
@@ -6,7 +6,7 @@
6
6
  "type": "object",
7
7
  "required": ["module", "version", "components"],
8
8
  "properties": {
9
- "module": { "type": "string" },
9
+ "module": { "type": "string", "minLength": 1 },
10
10
  "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
11
11
  "figma_source": { "type": "string", "format": "uri" },
12
12
  "ue_spec_ref": { "type": "string" },
@@ -16,11 +16,12 @@
16
16
  "type": "object",
17
17
  "required": ["id", "type"],
18
18
  "properties": {
19
- "id": { "type": "string" },
19
+ "id": { "type": "string", "minLength": 1 },
20
20
  "type": {
21
21
  "type": "string",
22
22
  "enum": ["Switch", "Slider", "Button", "Tab", "Checkbox", "RadioButton", "Text", "Image", "Custom"]
23
23
  },
24
+ "description": { "type": "string", "minLength": 8 },
24
25
  "figma_node_id": { "type": "string" },
25
26
  "bound_signal": { "type": "string" },
26
27
  "states": {
@@ -29,9 +30,9 @@
29
30
  "type": "object",
30
31
  "required": ["name"],
31
32
  "properties": {
32
- "name": { "type": "string" },
33
+ "name": { "type": "string", "minLength": 1 },
33
34
  "visual": { "type": "string" },
34
- "condition": { "type": "string" }
35
+ "condition": { "type": "string", "minLength": 4 }
35
36
  }
36
37
  }
37
38
  }
@@ -20,6 +20,9 @@ build:
20
20
  referencesNote: 设计稿与接口文档
21
21
  extraSkills:
22
22
  - ./team-skills/custom-skill
23
+ # Repomix:将 baseline/code 打成单文件 baseline/repomix/repomix-pack.xml(默认 false)
24
+ # 适合:大基线整库鸟瞰、外部单文件上下文工具、封存留档;日常 harness-build 不必开
25
+ repomix: false
23
26
  generateWiki: false
24
27
  wikiLang: zh
25
28
  force: false