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.
- package/README.md +50 -3
- package/dist/commands/apply.js +9 -2
- package/dist/commands/convert.js +39 -4
- package/dist/commands/doctor/check-requirements-fidelity.js +96 -0
- package/dist/commands/doctor/check-requirements.js +33 -1
- package/dist/commands/doctor/check-specs-depth.js +165 -0
- package/dist/commands/doctor/index.js +4 -0
- package/dist/commands/init.js +27 -4
- package/dist/config/merge-options.js +5 -0
- package/dist/config/normalize.js +5 -1
- package/dist/core/apply-project-entry.js +8 -1
- package/dist/core/harness-yaml-baseline.js +68 -0
- package/dist/core/markdown-sheet-split.js +109 -0
- package/dist/core/markdown-table-cleanup.js +151 -0
- package/dist/core/next-steps.js +15 -2
- package/dist/core/repomix-apply-hint.js +68 -0
- package/dist/core/repomix-pack.js +5 -0
- package/dist/index.js +9 -0
- package/package.json +1 -1
- package/templates/_shared/apply-skills/harness-apply-skills-main.md +2 -0
- package/templates/_shared/build-rules/harness-build-rule-chinese-only.md +2 -2
- package/templates/_shared/build-rules/harness-build-rule-orchestrator-flow.md +5 -2
- package/templates/_shared/build-rules/harness-build-rule-pre-seal-review.md +7 -1
- package/templates/_shared/build-rules/harness-build-rule-requirements-extraction.md +10 -1
- package/templates/_shared/build-rules/harness-build-rule-specs-schema.md +8 -4
- package/templates/_shared/build-skills/harness-build-skill-pre-seal-review.md +3 -0
- package/templates/_shared/build-skills/harness-build-skill-spec-builder.md +48 -7
- package/templates/_shared/meta/AGENTS_APPLY.md.ejs +5 -0
- package/templates/_shared/meta/harness.yaml.ejs +2 -0
- package/templates/_shared/skeleton/requirements/yaml/schema.json +75 -0
- package/templates/_shared/skeleton/specs/behavior/schema.json +8 -8
- package/templates/_shared/skeleton/specs/interfaces/schema.json +4 -4
- package/templates/_shared/skeleton/specs/signals/schema.json +12 -1
- package/templates/_shared/skeleton/specs/ui/schema.json +5 -4
- 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
|
|
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`:
|
|
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
|
-
|
|
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
|
-
|
|
47
|
+
title: "短索引标题(用于表格与路由)"
|
|
48
|
+
source_excerpt: |
|
|
49
|
+
从 source_anchor 对应原文复制的完整摘录(允许多行)。
|
|
50
|
+
必须保留条件、数值、枚举、时序等关键信息。
|
|
51
|
+
description: |
|
|
52
|
+
基于 source_excerpt 的完整需求陈述。
|
|
53
|
+
允许整理语序,但信息集合不得缩小。
|
|
48
54
|
acceptance: "如何验证该需求满足"
|
|
49
55
|
source_anchor: "SyRD-..."
|
|
50
|
-
|
|
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
|
-
-
|
|
69
|
+
- `title` 仅作索引;不得把 `title` 充当完整需求描述。
|
|
70
|
+
- `source_excerpt` 必须来自源文档原文;禁止写成「见上文」「同前」等替代语。
|
|
71
|
+
- `description` 必须覆盖 `source_excerpt` 的关键约束;不得删减条件、数值、枚举、时序。
|
|
62
72
|
- `traces_to` 初始可为空,阶段 B 生成 specs 后回填。
|
|
63
|
-
- `source_doc`
|
|
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/
|
|
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
|