kld-sdd 2.7.8 → 2.8.0
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 +26 -0
- package/USABILITY.md +72 -0
- package/bin/kld-sdd-init.js +718 -34
- package/lib/command-bridge.js +26 -17
- package/lib/deploy-codebuddy-hooks.js +19 -26
- package/lib/deploy-strategy.js +293 -0
- package/lib/hook-gate-core.js +7 -8
- package/lib/hook-install.js +75 -0
- package/lib/init.js +507 -726
- package/lib/maintenance.js +221 -0
- package/lib/managed-hook-hashes.json +24 -0
- package/lib/settings-merge.js +102 -25
- package/lib/skills-bundle.js +5 -5
- package/lib/spec-choice.js +85 -0
- package/lib/tool-profiles.js +2 -2
- package/lib/uninstall.js +453 -0
- package/package.json +7 -4
- package/skywalk-sdd/context-client.cjs +38 -7
- package/skywalk-sdd/index.cjs +153 -27
- package/skywalk-sdd/kb-upload.cjs +224 -82
- package/skywalk-sdd/lib/check-review.cjs +41 -0
- package/skywalk-sdd/lib/shared.cjs +62 -41
- package/skywalk-sdd/lib/test-execution.cjs +130 -0
- package/skywalk-sdd/lib/usage-reporter.cjs +17 -8
- package/skywalk-sdd/ontology/archive-package.cjs +141 -0
- package/skywalk-sdd/ontology/artifact-parser.cjs +24 -3
- package/skywalk-sdd/ontology/cli.cjs +53 -0
- package/skywalk-sdd/ontology/id.cjs +1 -1
- package/skywalk-sdd/ontology/identity-index.cjs +5 -1
- package/skywalk-sdd/ontology/resolve-spec-root.cjs +49 -0
- package/skywalk-sdd/ontology/schema.cjs +6 -0
- package/skywalk-sdd/ontology/sdd-config.cjs +33 -5
- package/skywalk-sdd/ontology/spec-detect.cjs +421 -0
- package/skywalk-sdd/ontology/spec-ontology.cjs +507 -0
- package/skywalk-sdd/ontology/workspace-layout.cjs +65 -17
- package/templates/git-hooks/commit-msg +17 -85
- package/templates/git-hooks/commit-msg-runner.cjs +44 -0
- package/templates/git-hooks/commit-msg-sdd-trailer.cjs +60 -69
- package/templates/git-hooks/consistency-check-core.cjs +92 -261
- package/templates/git-hooks/delivery-check.cjs +231 -0
- package/templates/git-hooks/delivery-snapshot.cjs +181 -0
- package/templates/git-hooks/hooks.config +8 -6
- package/templates/git-hooks/pre-commit +19 -5
- package/templates/git-hooks/pre-commit-consistency-check.cjs +13 -31
- package/templates/git-hooks/pre-push +19 -5
- package/templates/git-hooks/pre-push-consistency-check.cjs +36 -83
- package/templates/hooks/claude/hooks/sdd-post-tool.cjs +2 -2
- package/templates/hooks/codebuddy/hooks/hook-gate-core.cjs +7 -8
- package/templates/hooks/codebuddy/hooks/sdd-post-tool.cjs +2 -2
- package/templates/openspec/proposal.md +1 -1
- package/templates/openspec/spec.md +8 -0
- package/templates/skills/kld-sdd/opsx-apply/SKILL.md +28 -24
- package/templates/skills/kld-sdd/opsx-apply/checklist.md +12 -3
- package/templates/skills/kld-sdd/opsx-apply/reference.md +21 -1
- package/templates/skills/kld-sdd/opsx-archive/SKILL.md +20 -18
- package/templates/skills/kld-sdd/opsx-check/SKILL.md +18 -13
- package/templates/skills/kld-sdd/opsx-check/reference.md +3 -1
- package/templates/skills/kld-sdd/opsx-check/review-template.json +22 -0
- package/templates/skills/kld-sdd/opsx-check/reviewer.md +27 -6
- package/templates/skills/kld-sdd/opsx-consistency-check/SKILL.md +34 -112
- package/templates/skills/kld-sdd/opsx-consistency-check/scripts/scripts.cjs +15 -14
- package/templates/skills/kld-sdd/opsx-kb-config/SKILL.md +82 -61
- package/templates/skills/kld-sdd/opsx-kb-config/reference.md +8 -11
- package/templates/skills/kld-sdd/opsx-kb-ingest/SKILL.md +3 -2
- package/templates/skills/kld-sdd/opsx-kb-ingest/reference.md +2 -2
- package/templates/skills/kld-sdd/opsx-ontology-ingest/SKILL.md +77 -0
- package/templates/skills/kld-sdd/opsx-ontology-query/SKILL.md +5 -4
- package/templates/skills/kld-sdd/opsx-ontology-query/reference.md +14 -1
- package/templates/skills/kld-sdd/opsx-propose/SKILL.md +1 -1
- package/templates/skills/kld-sdd/opsx-propose/interaction-policy.md +9 -0
- package/templates/skills/kld-sdd/opsx-spec/SKILL.md +5 -3
- package/templates/skills/kld-sdd/opsx-task/SKILL.md +2 -2
- package/index.js +0 -13
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reviewer": {
|
|
3
|
+
"reviewer": "<实际评审者>",
|
|
4
|
+
"review_execution_mode": "subagent",
|
|
5
|
+
"reviewer_agent_id": "<真实子代理ID>",
|
|
6
|
+
"parent_session_id": "<主会话ID>",
|
|
7
|
+
"review_session_id": "<评审会话ID>",
|
|
8
|
+
"author_session_id": "<作者会话ID>",
|
|
9
|
+
"reviewer_independence": "independent-review",
|
|
10
|
+
"fallback_reason_code": null,
|
|
11
|
+
"fallback_reason": null
|
|
12
|
+
},
|
|
13
|
+
"items": [
|
|
14
|
+
{
|
|
15
|
+
"id": "<唯一检查项ID>",
|
|
16
|
+
"category": "consistency",
|
|
17
|
+
"status": "passed",
|
|
18
|
+
"evidence": "<实际文件:行号或锚点及检查依据>"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"warning_dispositions": []
|
|
22
|
+
}
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
- 自己读取完整的相关业务文档正文一次;批量读取相互独立的文件,同一文件同一版本复用,输出截断时补读缺失部分。
|
|
9
9
|
- Simple 支持根目录 `spec.md/design.md/tasks.md`;Full 使用 `specs/<capability>/`。兼容 `propose.md/task.md`。
|
|
10
|
-
-
|
|
10
|
+
- 程序已核验结构。身份、UUID、谱系和归档诊断由主 Agent 自行处理,不写入给用户的评审结论。
|
|
11
|
+
- 模型负责产物质量:语义覆盖、design 是否覆盖 spec、tasks 是否拆解 design、业务矛盾、可行性和测试质量。不能把“结构合法”当作“设计正确”,也不能用工具诊断代替这些缺口。
|
|
11
12
|
- 代码只读 design/tasks 实际引用的锚点及其必要依赖;不做全仓 diff、不运行测试。用户提供的上下文文件必须读取。
|
|
12
13
|
- 仅指定 Capability 时,补读 proposal 和明确的跨能力依赖;报告覆盖边界,不能宣称全 Change 已独立评审。全 Change 的程序语义门禁仍执行。
|
|
13
14
|
- 不适用的算法、TDD 或实施后检查写 `N/A` 和理由,不能计成通过;仅在 test-strategy=tdd 时加载下面 TDD 资料。
|
|
@@ -15,10 +16,10 @@
|
|
|
15
16
|
|
|
16
17
|
#### 4.1 完整性检查
|
|
17
18
|
|
|
18
|
-
- [ ] proposal.md
|
|
19
|
+
- [ ] proposal.md 存在,实际业务意图、能力、范围与约束完整;不要求无关空章节
|
|
19
20
|
- [ ] 每个 Capability 都有 spec.md
|
|
20
21
|
- [ ] Full 模式每个 spec.md 都有对应 design.md,每个 design.md 都有对应 tasks.md;Simple 未生成这些文档不误报缺失
|
|
21
|
-
- [ ]
|
|
22
|
+
- [ ] 所有文档保留解析需要的 frontmatter、身份、锚点与关系,内容规模匹配实际变更
|
|
22
23
|
|
|
23
24
|
#### 4.2 一致性检查
|
|
24
25
|
|
|
@@ -91,10 +92,30 @@
|
|
|
91
92
|
- Check 阶段只读,不自动勾选;报告中必须说明这是“任务可能已执行但文档未同步”或“任务真实未完成”的待确认项。
|
|
92
93
|
|
|
93
94
|
|
|
95
|
+
## 长文档分批读取
|
|
96
|
+
|
|
97
|
+
- 单个文件超过 1500 行时必须分段读取(先读前 1500 行,再按需续读缺失部分),避免一次读取撑爆上下文导致输出截断。
|
|
98
|
+
- spec.md / design.md / tasks.md 分多次独立读取,不要把所有文档合并进一次读取;同一文件同一版本只读一次,复用结果。
|
|
99
|
+
|
|
94
100
|
## 返回给主 Agent
|
|
95
101
|
|
|
96
|
-
|
|
102
|
+
**⛔ 返回格式硬约束**:最终回复必须包含且仅包含一个 json 代码块,结构与 [review-template.json](review-template.json) 对齐(`reviewer` 身份块由主 Agent 补齐,评审者不写);JSON 之前的解释文字不得超过 3 行:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"items": [
|
|
107
|
+
{ "id": "<唯一ID>", "category": "consistency", "status": "error", "evidence": "spec.md §3.2 要求…但 design.md 未覆盖(文件+章节定位)" }
|
|
108
|
+
],
|
|
109
|
+
"warning_dispositions": []
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
- `category` ∈ completeness / consistency / executability / tdd_compliance;`status` ∈ passed / error / warning / suggestion / na。
|
|
114
|
+
- 每项必须含 `evidence`(文件+章节定位),na 项写不适用理由;§4.4b 的 DAG 语义警告归入 `warning_dispositions`,不混入 items。
|
|
115
|
+
- 不满足此结构视为 `SUBAGENT_RESULT_INVALID`,主 Agent 会要求补齐一次缺项。
|
|
116
|
+
|
|
117
|
+
内容要求:items 覆盖全部实际执行的检查;检查范围与必要问题说明写在 JSON 前的 ≤3 行解释文字或对应 item 的 evidence 中,不另起段落;身份块由主 Agent 根据真实工具结果补齐,评审者不写。算法归入 consistency,不重复计数;不手算总数,不复述所有通过项,不复制文档全文。
|
|
97
118
|
|
|
98
|
-
|
|
119
|
+
至少有一个实际适用项。未执行项使用 na 并写原因,不能为计数填“全部通过”。任务状态由工具读取,不能伪造 reviewer 或独立性。主 Agent 无需为统计不匹配重新委派评审。
|
|
99
120
|
|
|
100
|
-
|
|
121
|
+
评审期间若发现文件变化,返回受影响路径。只读检查不修文档、不改代码。
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: opsx-consistency-check
|
|
3
|
-
description: "Spec
|
|
4
|
-
argument-hint: "[change-name]
|
|
3
|
+
description: "根据实际代码和 Spec 检查接口、业务规则与错误处理,按输入指纹复用检查回执"
|
|
4
|
+
argument-hint: "[change-name]"
|
|
5
5
|
license: MIT
|
|
6
6
|
metadata:
|
|
7
7
|
author: sdd-team
|
|
8
|
-
version: "
|
|
8
|
+
version: "4.0"
|
|
9
9
|
allowed-tools:
|
|
10
10
|
- Bash
|
|
11
11
|
- Read
|
|
@@ -13,141 +13,63 @@ allowed-tools:
|
|
|
13
13
|
- Edit
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
检查实现是否满足本次业务约定,留下可复核的证据。`opsx-check` 检查文档及其关系;本技能检查代码与 Spec,两者不能互相替代。日常 Git 提交不要求用户手动运行本技能;Apply 在实施收尾时自动调用。
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
## 1. 确定输入并尝试复用
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
1. **采集必须用 hook 同款命令**(步骤 1),禁止手工拼 git diff——两边采集不一致会导致报告盖不住 diff → hook 拦截 → 重新生成仍被拦的死循环
|
|
23
|
-
2. **coveredFiles 必须与实际校验的变更文件完全一致**:path 为工作区相对路径,size/sha256 直接复用采集器输出(LF 归一化已内置),禁止估算、禁止用平台命令重算
|
|
24
|
-
3. **confidence 只能 `high`/`medium`/`low`**(其他值被 hook 判非法拦截);**generatedAt 必须本机本地时间** `YYYY-MM-DD HH:mm:ss`(禁止 UTC,hook 按本地时区做过期判断)
|
|
25
|
-
4. **md + json 成对写入** `openspec/changes/<change-name>/`,单边存在会被判报告不完整并拦截
|
|
26
|
-
5. **只读变更文件本身**,不扩展读 DTO/Model/配置/SQL 等关联文件;缺证据标"待人工核查",不中断补读
|
|
27
|
-
6. **无业务代码变更 → 不生成报告**,输出一句提示即结束(hook 对无业务代码提交直接放行)
|
|
28
|
-
7. 生成前必须先删旧报告(步骤 2c 已内置),全量重新校验,不读旧报告做增量复用
|
|
29
|
-
8. **多仓布局下 `repositories` 必填**:工作区根存在 `.sdd-workspace.yaml` 时,JSON 报告必须含 `repositories` 数组,`path` 为该 change 覆盖的代码仓名(与 `.sdd-workspace.yaml` 的 `code_repos` 条目一致)。单仓布局可省略或留空数组。hook 用此字段剥离 coveredFiles 路径前缀以对齐 diff 路径,缺失会导致路径不匹配 → 误判"无交集" → 报告形同虚设
|
|
30
|
-
|
|
31
|
-
## 执行流程(4 步)
|
|
32
|
-
|
|
33
|
-
### 1. 采集变更文件(脚本,秒级)
|
|
34
|
-
|
|
35
|
-
> **禁止环境预探测**:不要 Test-Path 探测 git 仓、不要列目录确认脚本存在——采集器自动处理单仓/多仓布局(多仓读 `.sdd-workspace.yaml` 的 code_repos 逐仓 diff),命令失败自会报错。首轮回复直接并行发起:① 采集命令 ② `list-changes`(两者无依赖)。
|
|
20
|
+
从当前实施上下文取得明确的 Change 和代码仓。多个活动 Change 不等于本次都要检查;不要按分支名猜测。多仓逐个实际涉及的代码仓运行,使用同一个 Spec 根和 Change;回执按仓库身份分别存储,互不覆盖。
|
|
36
21
|
|
|
37
22
|
```bash
|
|
38
|
-
node <spec-root>/skywalk-sdd/git-hooks/
|
|
39
|
-
node <skill-dir>/scripts/scripts.cjs list-changes
|
|
23
|
+
node "<spec-root>/skywalk-sdd/git-hooks/delivery-check.cjs" prepare --project="<代码仓>" --change=<change> --base=<实施前提交SHA>
|
|
40
24
|
```
|
|
41
25
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- **无业务文件** → 提示"无代码变更,跳过校验"并结束
|
|
45
|
-
- **有业务文件但无活跃 change** → 报错终止,提示先执行 opsx-propose
|
|
46
|
-
- **多 change 且未指定 change-name** → 按 spec 覆盖范围把文件归属到各 change,每个 change 独立出报告;同一文件被多个 change 归属时只在首个 change 完整校验、其余复用结论(coveredFiles 仍完整包含)。**单 change 或已指定 change-name** → 全部文件归入,跳过归属逻辑
|
|
47
|
-
- **用户指定了具体文件** → 交给 `consistency-check-core.cjs --filter` 机械筛选,哈希用 `prepare-report --files-from=<列表文件>` 补算
|
|
48
|
-
|
|
49
|
-
### 2. 读上下文(a/b/c 同一回复并行发起,禁止分批等待)
|
|
50
|
-
|
|
51
|
-
a. **定位并读 spec**:`node <skill-dir>/scripts/scripts.cjs find-specs <change-name>` 拿文件列表,**禁止全量读**(近百个 spec 全读既慢又撑爆上下文)。API 路径由 AI 从已读 Controller 原生提取(任何语言的路由写法都直接认识,禁止用正则 grep 代码提取),再用**字面量片段**(如 `/api/user`;禁止含 `|`、`"`、`\`、`()` 的正则——Windows cmd 会拆解管道符与引号导致 0 命中)grep spec 目录:
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
node <skill-dir>/scripts/scripts.cjs grep-code "/api/user" <openspec-dir> --glob=spec.md -i
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**grep 省略条件(省一轮往返)**:`find-specs` 命中的变更级 spec 文件总数 ≤ 5 个时,跳过 grep 直接读这些文件(变更级 spec 本来就是该 change 的契约文档,命中概率极高);命中 > 5 个或需在全局 spec 中定位时才 grep。只读命中文件;命中 0 → 回退读变更级 spec(`changes/<name>/specs/`),仍不读全局 spec 全集。
|
|
58
|
-
|
|
59
|
-
b. **读代码(按契约角色分层,同一回复并行发起)**:首轮把全部变更文件按契约角色分三层,**全文 Read 与 grep 混排在同一回复一次发齐**(不产生额外往返;禁止的是"grep 定位后再补读"的两段式,不是 grep 本身):
|
|
60
|
-
- **契约核心(全文 Read)**:Controller、DTO/VO/QueryDTO、全局异常处理器(`*Controller`、`*DTO`、`*VO`、`*ExceptionHandler` 等,按语言现场识别)——接口契约的直接载体,必须逐字段比对
|
|
61
|
-
- **契约相关(grep 取证,不读全文)**:Service/ServiceImpl、Repository——只 grep 方法签名 + 响应构造 + 错误码,模式按语言现场定(Java `return`/`Map.of`、Python `return {`/`jsonify`、Go `c.JSON`)
|
|
62
|
-
- **无契约面(grep 确认后跳过)**:Application 启动类、`*Config`/`*Properties`、`*Util`、`BusinessException`、`*Mapper` 接口等——grep 端点声明(路由注解/路径常量)+ 业务错误码字面量,**零命中 → 结论"无契约面",不进入步骤 3 逐字段比对**;有命中 → 升级按上一条 grep 取证处理
|
|
63
|
-
- **前端**(.ts/.tsx/.vue/.js):只 grep API 调用路径 + HTTP 方法,与 spec 路径比对
|
|
64
|
-
- **coveredFiles 不受分层影响**:全部变更文件照常列入报告(硬约束 2),分层只决定"读多深",不决定"盖不盖"
|
|
65
|
-
- **例外**:契约核心文件单文件 ≥ 800 行时,先 grep 定位端点区域,再分段读相关区间
|
|
26
|
+
`--base` 优先使用 Apply 的实施前基线;首次新仓无 HEAD 时可省略,由工具选择空树。后续命令复用 prepare 保存的基线。默认读取工作区;显式检查暂存内容时加 `--scope=index`,不能把工作区内容当作暂存内容。
|
|
66
27
|
|
|
67
|
-
|
|
28
|
+
输出包括 `requiredFiles`、`inputs`、`inputFingerprint`、`preparedFile`、`reviewFile`、`reuseReview`。快照同时绑定代码、Spec、仓库身份与规则版本。指纹相同且覆盖完整时,直接复用,不删除旧报告、不重新调用模型。旧版没有输入指纹的报告需升级生成一次。
|
|
68
29
|
|
|
69
|
-
|
|
30
|
+
当前版本保守地对本仓跟踪文件及非忽略的未跟踪文件取指纹(排除生成目录、SDD 运行时),并包含本 Change 与全局规格;它不是跨仓依赖的自动发现器。检查需要其他仓的依赖时,应在该仓单独验证,并在交付摘要列出其提交。
|
|
70
31
|
|
|
71
|
-
|
|
72
|
-
> - **多 change(≥2 个)→ 必须并行**:每个 change 一个子代理,同一回复全部分派(上限 2 个,两 change 恰好一批)。**禁止**主线程逐 change 串行校验,**禁止**以"宿主并发能力不确定"为由跳过——派发在最坏情况(宿主排队串行)下也只是无收益,结果照常回收,无损害;实测多 change 串行是步骤 3 最大耗时来源(两仓各 5 分钟级推理串行叠加),并行后总耗时取单 change 最大值
|
|
73
|
-
> - **单 change → 按文件量分组**(仅适用于恰好 1 个活跃 change 的场景,不得套用到多 change 的单个 change 上):≤ 15 个文件主线程直接校验(无需子代理);> 15 个按 8-10 个/组分派子代理,逐组执行
|
|
74
|
-
> - **禁止**:主线程自己串行逐文件校验(36 文件 = 36 轮往返,是最大耗时来源);一次回复分派超过 2 个子代理(并发过高导致宿主排队 + 结果交错,实际更慢)
|
|
75
|
-
> - **派发提示必须自带分层读取规则**:子代理不读 SKILL.md,只知派发提示里写的内容——分派时必须把步骤 2b 的三层策略(契约核心全文读 / Service·Repository grep 取证 / 无契约面 grep 确认后跳过)原文写入提示。漏写则子代理退回全量读全文(实测发生:子代理全文读 ServiceImpl/Mapper/Config,上下文膨胀拖慢推理与汇总生成)
|
|
76
|
-
> - 每个子代理完成"读 spec 命中集 + 按契约角色分层读本组代码 + 步骤 3 校验",返回差异清单 + 计数,主线程汇总生成报告;公共文件只在首个归属 change 的子代理中完整校验,其余复用
|
|
32
|
+
## 2. 定向取证
|
|
77
33
|
|
|
78
|
-
|
|
34
|
+
`reuseReview=false` 时,读取 `requiredFiles` 对应的业务实现和相关 Spec。可以比较旧回执与新 `inputs` 确定变化位置,但不能把失效的旧结论直接认作本轮通过。
|
|
79
35
|
|
|
80
|
-
|
|
36
|
+
- 接口:路径、方法、请求与响应字段、错误码逐项对照。
|
|
37
|
+
- 业务规则:本次验收行为、边界条件、状态变化是否实现。
|
|
38
|
+
- 校验规则:必要的参数校验、拒绝条件是否与约定相符。
|
|
39
|
+
- 错误处理:失败路径是否满足调用方约定。
|
|
81
40
|
|
|
82
|
-
|
|
83
|
-
- **spec → code**:spec 定义的路径/方法/参数/响应字段/错误码,代码是否实现且一致
|
|
84
|
-
- **code → spec**:代码中的端点、响应字段 key、业务错误码是否已在 spec 记录(**仅枚举业务契约面**;工具方法、日志、防御性代码、DTO 转换等纯技术实现不枚举、不降级)
|
|
41
|
+
先读变更文件与对应规格,再按实际引用补读 DTO、配置、SQL 或调用方。一次批量读取独立文件;不为凑检查项全量扫描全文,也不禁止必要的依赖阅读。删除文件同样需要核对受影响的契约。
|
|
85
42
|
|
|
86
|
-
|
|
87
|
-
- 响应结构**逐字段**对比,字段名精确匹配(`token` ≠ `accessToken`);`Map.of()`/字典/结构体构造必须提取所有 key 逐一比对
|
|
88
|
-
- 每条差异定位到 `文件:行号 + spec 章节`,不贴代码原文片段
|
|
89
|
-
- 找不到证据的标 ❌/⚠️,不假设一致
|
|
43
|
+
每个结论记录 `代码路径:行号 / Spec路径:章节`。缺依据使用 `not_checked`;有实际冲突使用 `fail`;无该维度使用 `na` 并给出理由。不用 high confidence 代替事实,不把未检查维度固定写成 pass。
|
|
90
44
|
|
|
91
|
-
|
|
92
|
-
- **high**:无差异,或仅技术实现未记录
|
|
93
|
-
- **medium**:辅助性差异(非关键端点/字段缺失或不一致)
|
|
94
|
-
- **low**:关键契约不一致、spec 有关键功能代码没有、代码有业务功能 spec 没有
|
|
45
|
+
## 3. 保存真实检查结果
|
|
95
46
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
结论确定后直接写文件,**禁止**重新核对证据或推演差异。md + json 在**同一回复并行写入**(多 change 的全部报告同批写)。**禁止任何计时打点**(步骤起止时长、执行统计、额外的 `now` 调用)——报告 `generatedAt` 已由步骤 2c 的 prepare-report 输出,流程内不需要其他时间戳;执行时长统计只在用户显式要求时做,默认不做。
|
|
99
|
-
|
|
100
|
-
**JSON**(`consistency-report-result.json`,hook 唯一消费源,schema 固定):
|
|
47
|
+
把检查结果写到 `preparedFile` 同目录的 `review-input.json`,避免临时结果进入代码快照。`inputFingerprint` 原样复制,`reviewedFiles` 只列实际检查过的文件,至少覆盖本次 `requiredFiles`。
|
|
101
48
|
|
|
102
49
|
```json
|
|
103
50
|
{
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"generatedAt": "<YYYY-MM-DD HH:mm:ss 本地时间>",
|
|
107
|
-
"repositories": [
|
|
108
|
-
{ "path": "<代码仓名>" }
|
|
109
|
-
],
|
|
110
|
-
"coveredFiles": [
|
|
111
|
-
{ "path": "<工作区相对路径>", "size": 2341, "sha256": "<64位十六进制>" }
|
|
112
|
-
],
|
|
51
|
+
"inputFingerprint": "<prepare 输出>",
|
|
52
|
+
"reviewedFiles": ["src/order.js"],
|
|
113
53
|
"dimensions": {
|
|
114
|
-
"interfaceContract": {
|
|
115
|
-
"businessRules": {
|
|
116
|
-
"validationRules": {
|
|
117
|
-
"errorCodes": {
|
|
54
|
+
"interfaceContract": {"status": "pass", "evidence": ["src/order.js:12 / spec.md §接口"]},
|
|
55
|
+
"businessRules": {"status": "pass", "evidence": ["src/order.js:28 / spec.md §金额边界"]},
|
|
56
|
+
"validationRules": {"status": "not_checked", "evidence": []},
|
|
57
|
+
"errorCodes": {"status": "na", "reason": "纯计算函数,本次无错误码协议"}
|
|
118
58
|
},
|
|
119
|
-
"
|
|
120
|
-
"totalChecks": 0, "passed": 0, "failed": 0, "warnings": 0,
|
|
121
|
-
"undocumentedBusiness": 0, "undocumentedTechnical": 0, "specMissing": 0, "inconsistent": 0
|
|
122
|
-
}
|
|
59
|
+
"issues": []
|
|
123
60
|
}
|
|
124
61
|
```
|
|
125
62
|
|
|
126
|
-
`
|
|
127
|
-
|
|
128
|
-
**MD**(`consistency-report.md`,极简,禁止凑数空章节):
|
|
129
|
-
|
|
130
|
-
```markdown
|
|
131
|
-
# Spec 一致性校验报告
|
|
132
|
-
|
|
133
|
-
**变更**:<change-name> **生成时间**:<YYYY-MM-DD HH:mm:ss>
|
|
134
|
-
**校验范围**:<N 个文件> **置信度**:<high/medium/low>
|
|
63
|
+
只有无业务代码变化且四个维度都有理由判为 `na` 的文档或非实施变更,才可在回执中追加 `tests: {"status":"na","reason":"具体不适用理由"}`;工具显示测试不适用,不能说测试已通过。
|
|
135
64
|
|
|
136
|
-
|
|
65
|
+
该例包含未检查项,不能通过交付验证。依据实际取证补完,不能只改状态。
|
|
137
66
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
<有差异时列下表:>
|
|
141
|
-
|
|
142
|
-
| # | 类型 | 风险 | 位置 | 描述 | 建议 |
|
|
143
|
-
|---|------|------|------|------|------|
|
|
144
|
-
| 1 | 不一致 | P0 | File.java:42 / spec §2.1 | <差异描述> | <改代码或改 spec> |
|
|
67
|
+
```bash
|
|
68
|
+
node "<spec-root>/skywalk-sdd/git-hooks/delivery-check.cjs" record-review --project="<代码仓>" --change=<change> --input="<review-input.json>"
|
|
145
69
|
```
|
|
146
70
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
---
|
|
71
|
+
工具重算指纹,输入变化时拒绝旧结论。失败或未检查的结果仍会保存并返回非零退出码,便于修复后复核;成功回执写到输出 `reviewFile`,由脚本管理哈希,不手填。回执是 Agent 的可追溯检查记录,不是对业务正确性的数学证明。
|
|
150
72
|
|
|
151
|
-
##
|
|
73
|
+
## 4. 返回实施收尾
|
|
152
74
|
|
|
153
|
-
|
|
75
|
+
报告发现的问题、检查范围与未检查部分。由 Apply 在同一轮继续执行真实测试及 `delivery-check verify`;本技能通过只表示检查回执有效,不表示测试、知识库入库或正式交付已经完成。
|
|
@@ -45,6 +45,11 @@ const crypto = require('crypto');
|
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
47
|
* 解析 spec 仓根目录(含 openspec/ 的目录)。
|
|
48
|
+
*
|
|
49
|
+
* ⚠️ 本函数是**独立实现**,不 require 权威链(`skywalk-sdd/ontology/`)——
|
|
50
|
+
* 本脚本部署在编辑器 skills 目录,运行于代码仓 cwd,spec 仓的运行时实体
|
|
51
|
+
* 可能尚未就绪,跨仓 require 会让技能强依赖运行时。
|
|
52
|
+
*
|
|
48
53
|
* 解析顺序(与权威实现 resolve-spec-root.cjs 的 resolveSpecProjectRoot 对齐):
|
|
49
54
|
* 1. --spec-root= 命令行参数(显式指定,验证 openspec/ 存在)
|
|
50
55
|
* 2. .sdd-spec-root 标记文件(cwd 及祖先目录向上遍历,读内容 resolve)
|
|
@@ -53,6 +58,15 @@ const crypto = require('crypto');
|
|
|
53
58
|
* 5. cwd 或祖先目录存在 .sdd-workspace.yaml → 读 spec_path 解析(多仓场景)
|
|
54
59
|
* 6. 向上逐级父目录找 openspec/(兜底)
|
|
55
60
|
* 找不到返回 null(调用方报错退出,不静默)。
|
|
61
|
+
*
|
|
62
|
+
* 与权威链的已知差异(均为有意保留):
|
|
63
|
+
* - 多一个第 1 步「显式 --spec-root= 参数」——技能允许用户强制指定。
|
|
64
|
+
* - 第 4 步「cwd 有 openspec/」的位置比权威链靠前:本脚本常直接以 spec 根
|
|
65
|
+
* 为 cwd 运行,就近命中更符合预期。
|
|
66
|
+
*
|
|
67
|
+
* ⚠️ 修改本函数时必须同步检查 `skywalk-sdd/ontology/resolve-spec-root.cjs`
|
|
68
|
+
* 与 `spec-detect.cjs`,避免再次出现「技能认某个来源、权威链不认」的漂移
|
|
69
|
+
*(`.sdd-workspace.yaml` 曾长期只有本脚本读,权威链不读,已补齐)。
|
|
56
70
|
*/
|
|
57
71
|
function resolveSpecRoot() {
|
|
58
72
|
// 1. 显式参数
|
|
@@ -439,21 +453,8 @@ function prepareReport(changeDir) {
|
|
|
439
453
|
const specRoot = resolveSpecRoot();
|
|
440
454
|
if (specRoot) dir = path.resolve(specRoot, changeDir);
|
|
441
455
|
}
|
|
442
|
-
//
|
|
443
|
-
const reportFiles = ['consistency-report.md', 'consistency-report-result.json'];
|
|
456
|
+
// Keep previous evidence for comparison/reuse. Explicit clean-reports remains available.
|
|
444
457
|
const cleaned = [];
|
|
445
|
-
for (const f of reportFiles) {
|
|
446
|
-
const fp = path.join(dir, f);
|
|
447
|
-
try {
|
|
448
|
-
if (fs.existsSync(fp)) {
|
|
449
|
-
fs.unlinkSync(fp);
|
|
450
|
-
cleaned.push(fp.replace(/\\/g, '/'));
|
|
451
|
-
}
|
|
452
|
-
} catch (e) {
|
|
453
|
-
console.error('ERROR: failed to delete ' + fp + ': ' + e.message);
|
|
454
|
-
process.exit(1);
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
458
|
// 2. 批量哈希(可选):仅当显式提供 --files-from=/--files= 时执行,绝不读 stdin(防交互式终端挂起)。
|
|
458
459
|
// 无输入源 = "只清理 + 取时间戳"合法模式(哈希已由 --collect --hash 提供时无需重复传入),hashes 输出空数组
|
|
459
460
|
const hashes = [];
|
|
@@ -16,12 +16,11 @@ allowed-tools:
|
|
|
16
16
|
- Write
|
|
17
17
|
- Edit
|
|
18
18
|
---
|
|
19
|
-
|
|
20
19
|
# 本体知识库 · 配置
|
|
21
20
|
|
|
22
21
|
只负责**配置**。一次配置,查询(opsx-ontology-query)、入库(opsx-kb-ingest)、文件夹上传(kb-upload)全部可用。
|
|
23
22
|
|
|
24
|
-
> **📡 共享状态**:配置写入 `kb-state.json
|
|
23
|
+
> **📡 共享状态**:配置写入 `kb-state.json`(**唯一权威位置 = spec 包裹包根目录**),所有 KB 技能共用。任一技能配置后,其他技能自动可用,无需重复输入。
|
|
25
24
|
|
|
26
25
|
> **🖥️ 跨平台执行规则**(Windows 用户必读):
|
|
27
26
|
> - KB 配置涉及 HTTP 请求和 JSON 文件读写,**禁止**在 PowerShell 中使用 `curl`(被别名为 Invoke-WebRequest)→ 用 `Invoke-RestMethod` 或 Node.js 脚本
|
|
@@ -35,11 +34,10 @@ allowed-tools:
|
|
|
35
34
|
|
|
36
35
|
| 场景 | 说明 |
|
|
37
36
|
|------|------|
|
|
38
|
-
| 首次配置 | 输入 API Key →
|
|
39
|
-
| 更换 API Key | 清空 apiKey
|
|
37
|
+
| 首次配置 | 输入 API Key → 选择 Space/KB → 创建 project-identity.json |
|
|
38
|
+
| 更换 API Key | 清空 apiKey,重新输入并验证当前目标权限 |
|
|
40
39
|
| 更换知识库 | 清空 targets,重新选择 Space/KB |
|
|
41
|
-
|
|
|
42
|
-
| 查看当前配置 | 展示已配置的 Space/KB 列表与项目绑定 |
|
|
40
|
+
| 查看当前配置 | 展示已配置的 Space/KB 列表与团队项目身份 |
|
|
43
41
|
| 校验配置 | 探活 API + 校验 project_id 与 spaceKey 一致 |
|
|
44
42
|
|
|
45
43
|
## 配置步骤
|
|
@@ -59,6 +57,34 @@ SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
|
59
57
|
# 或直接用 read_file 工具读取该文件
|
|
60
58
|
```
|
|
61
59
|
|
|
60
|
+
#### 1.1 位置校验(写入前必做)
|
|
61
|
+
|
|
62
|
+
`kb-state.json` 的**唯一权威位置是 spec 包裹包根目录**(`$SPEC_ROOT/kb-state.json`)。
|
|
63
|
+
本步骤在**任何写入之前**执行,防止把配置写到错误位置 —— 一旦写偏,
|
|
64
|
+
后续所有 KB 技能都读不到。
|
|
65
|
+
|
|
66
|
+
校验两件事,任一不通过则**停止写入**并提示用户:
|
|
67
|
+
|
|
68
|
+
1. **`SPEC_ROOT` 必须是 spec 包裹包根**。用统一判据(与 `lib/shared.cjs#isKbStateHostDir`
|
|
69
|
+
同源,即 `ontology/resolve-spec-root.cjs#isSpecPackageRoot`):
|
|
70
|
+
目录名匹配 `*-sdd-specs`,或四结构齐全
|
|
71
|
+
(`modules.yaml` + `sdd.config.yaml` + `openspec/changes` + `openspec/specs/overview.md`),
|
|
72
|
+
或至少含 `openspec/`。
|
|
73
|
+
```bash
|
|
74
|
+
# 临时脚本:const shared = require('<SPEC_ROOT>/skywalk-sdd/lib/shared.cjs');
|
|
75
|
+
# console.log(shared.isKbStateHostDir(process.argv[1]));
|
|
76
|
+
node _tmp-check-host.cjs "$SPEC_ROOT"
|
|
77
|
+
```
|
|
78
|
+
输出 `false` → 报错:`SPEC_ROOT 不是 spec 包裹包根,禁止写入 kb-state.json`,
|
|
79
|
+
并让用户确认 `--project` / `.sdd-spec-root` 是否指向 `*-sdd-specs`。
|
|
80
|
+
|
|
81
|
+
2. **写入路径必须由 `$SPEC_ROOT` 直接拼接**:`"$SPEC_ROOT/kb-state.json"`。
|
|
82
|
+
禁止使用 `../`、`.shared/`、`<ide>/skills/` 等相对偏移构造路径。
|
|
83
|
+
|
|
84
|
+
> 读取侧由 `lib/shared.cjs#loadKbState` 执行同样的位置校验:只接受宿主目录为
|
|
85
|
+
> spec 包裹包根的命中。因此若本步校验通过而后续仍报「KB 未配置」,
|
|
86
|
+
> 优先检查是否写到了非 `$SPEC_ROOT` 的位置。
|
|
87
|
+
|
|
62
88
|
### 2. API Key
|
|
63
89
|
|
|
64
90
|
若 `state.apiKey` 为空或用户要求换密钥:
|
|
@@ -70,27 +96,9 @@ SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
|
70
96
|
|
|
71
97
|
**安全规则**:
|
|
72
98
|
- 完整 apiKey 只写共享 state 文件;聊天里最多显示前缀(如 `sk_sdd_****`)。
|
|
73
|
-
- 401
|
|
99
|
+
- 401:停止本次远程操作,提示验证密钥;403:说明 scope/目标访问权不足。两者均**不**自动清空可能对其他目标仍有效的密钥,不循环重试。
|
|
74
100
|
- **不要** `POST /auth/login`。
|
|
75
101
|
|
|
76
|
-
### 2.5. 监控项目绑定(`projectName`,可留空)
|
|
77
|
-
|
|
78
|
-
实时监控按"用户 / 项目"维度展示 Run:上传事件时服务端会根据 API 密钥解析上传用户,并按此处绑定的项目名称写入投影(服务端校验该用户必须是项目成员,否则项目留空、不阻断上传)。
|
|
79
|
-
|
|
80
|
-
1. 询问用户项目名称;**留空** → 写 `projectName: null`(不绑定),跳到 Step 3。
|
|
81
|
-
2. 非空 → 用共享库做成员预校验(Bearer = 当前 apiKey):
|
|
82
|
-
```js
|
|
83
|
-
// 临时 .cjs 脚本(遵循本文件头部跨平台规则):
|
|
84
|
-
const shared = require('<SPEC_ROOT>/skywalk-sdd/lib/shared.cjs');
|
|
85
|
-
const r = await shared.verifyProjectMembershipViaServer(SPEC_ROOT, '<项目名称>');
|
|
86
|
-
```
|
|
87
|
-
- `member === true` → `shared.setKbProjectName(SPEC_ROOT, '<项目名称>')` 写入,提示绑定生效。
|
|
88
|
-
- `member === false` → 提示"绑定不会生效,上传记录的项目将留空",让用户选择**重填**或**留空**(`setKbProjectName(SPEC_ROOT, null)`);不要直接保存非成员名称。
|
|
89
|
-
- `ok === false`(`reason: 'endpoint_unavailable'`,服务端未上线该端点或不可达)→ 软警告"平台暂不支持项目成员校验,绑定将在上传时由服务端裁决",允许用户选择保存或留空。
|
|
90
|
-
3. 换密钥后原 `projectName` 可能对新密钥用户失效 → 换密钥流程完成后重走本步校验。
|
|
91
|
-
|
|
92
|
-
> 写入位置:`kb-state.json` 的 `projectName` 键(与 api/apiKey 同文件,已 gitignore)。同步代理每次上报批次时重读该配置,改绑/解绑后新事件即按新配置上报,无需重启或迁移。
|
|
93
|
-
|
|
94
102
|
### 3. 选择空间与知识库(支持多选)
|
|
95
103
|
|
|
96
104
|
若 `state.targets` 为空,或用户要求重新选择:
|
|
@@ -103,11 +111,11 @@ SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
|
103
111
|
> **API 返回字段说明**(临时脚本中注意字段名):
|
|
104
112
|
> - Space 列表返回 `spaceId`(camelCase),不是 `id`。临时脚本中使用 `s.spaceId || s.id` 兼容。
|
|
105
113
|
> - Space 列表返回 `spaceKey`(项目标识,非 UUID),用于 `project-identity.json` 的 `project_id`。
|
|
106
|
-
> - KB 列表返回 `kbId
|
|
114
|
+
> - KB 列表返回 **`knowledgeBaseId` + `name`**,不是 `kbId`/`kbName`;需映射后写入 state。详见 [reference.md](reference.md#响应字段映射重要)。
|
|
107
115
|
|
|
108
116
|
### 4. 写入项目身份文件(首次配置 Space 后必做)
|
|
109
117
|
|
|
110
|
-
> `project-identity.json` 是 spec 仓 Git 中的**团队共享**文件,记录 `project_id`(=
|
|
118
|
+
> `project-identity.json` 是 spec 仓 Git 中的**团队共享**文件,记录 `project_id`(= **该 spec 仓所属项目** Space 的 `spaceKey`)。Archive 阶段 `archive-docs` 读取此文件生成 `archive-manifest.json`,kb-ingest / kb-upload 上传时 KB 校验 `project_id === spaceKey`。
|
|
111
119
|
|
|
112
120
|
选择 Space 完成后(Step 3 写入 `targets` 后),执行以下逻辑:
|
|
113
121
|
|
|
@@ -116,70 +124,83 @@ SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
|
116
124
|
SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
117
125
|
```
|
|
118
126
|
2. 检查 `$SPEC_ROOT/skywalk-sdd/project-identity.json` 是否已存在
|
|
119
|
-
3. **不存在** →
|
|
127
|
+
3. **不存在** → 用 AskUserQuestion 询问「**哪个 Space 拥有此 spec 仓**」。
|
|
128
|
+
**不得用 `targets` 列表顺序推断** —— 多个查询目标可能属于不同 Space,
|
|
129
|
+
拥有此 spec 仓的项目未必是第一个。用户指认后创建:
|
|
120
130
|
```json
|
|
121
131
|
{
|
|
122
132
|
"schema_version": "kld-sdd-project-identity/v1",
|
|
123
|
-
"project_id": "
|
|
133
|
+
"project_id": "<用户指认 Space 的 spaceKey>",
|
|
124
134
|
"created_at": "<ISO timestamp>",
|
|
125
|
-
"kb_space_id": "
|
|
126
|
-
"kb_space_name": "
|
|
135
|
+
"kb_space_id": "<该 Space spaceId>",
|
|
136
|
+
"kb_space_name": "<该 Space spaceName>"
|
|
127
137
|
}
|
|
128
138
|
```
|
|
129
139
|
输出:`✓ 已创建 skywalk-sdd/project-identity.json(project_id: <spaceKey>),请提交到 spec 仓 Git 以便团队共享`
|
|
130
|
-
4.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
5. **已存在且一致** → 跳过,不输出
|
|
140
|
+
4. **已存在且与用户本次指认的 Space 一致** → 保留,不输出
|
|
141
|
+
5. **已存在但用户本次指认了不同 Space** → 该 Space 仅作为**只读查询目标**,
|
|
142
|
+
**不改写 `project_id`**。切换查询连接不是改写团队身份的理由;
|
|
143
|
+
若用户确实要把已有事实/历史包迁移到其他 Space/KB,属于另一个明确任务 ——
|
|
144
|
+
不能仅改 project_id、manifest 或 targets 冒充迁移完成
|
|
145
|
+
|
|
146
|
+
### 5. 校验配置(保存后执行)
|
|
138
147
|
|
|
139
|
-
|
|
148
|
+
1. `targets` 可保存多个连接目标。单个目标可直接使用;多个目标时,按用户本次指定的
|
|
149
|
+
Space/KB 选择,查询、同步和上传同时传 `--space-id`、`--kb-id`。缺少明确选择时询问本次
|
|
150
|
+
目标,**不默选首项,不自动广播**。跨目标查询逐个执行并保留来源。
|
|
151
|
+
2. 对本次目标运行 `context-client.cjs --check-only`,说明可达性、权限与检索通道状态。
|
|
152
|
+
断连仍允许本地编写、测试和归档,远程基线核对与正式发布保持未完成。
|
|
140
153
|
|
|
141
|
-
|
|
154
|
+
可用目标只有一个且信息完整时,不添加确认步骤。多目标选择可沿用本轮用户已明确的选择;不用额外持久化一套“默认目标”状态。
|
|
142
155
|
|
|
143
|
-
|
|
156
|
+
## 团队项目身份
|
|
144
157
|
|
|
145
|
-
|
|
146
|
-
2. 清空 `state.targets`
|
|
147
|
-
3. 重走 Step 3(选择空间与知识库)
|
|
148
|
-
4. 重走 Step 4(更新 project-identity.json)
|
|
158
|
+
`skywalk-sdd/project-identity.json` 随 spec 仓提交 Git,`project_id` 必须等于**该 spec 仓所属项目** Space 的 `spaceKey`。
|
|
149
159
|
|
|
150
|
-
|
|
160
|
+
- 文件不存在:为用户已选定的业务项目创建身份。多个查询目标属于不同 Space 时,先明确哪个项目拥有此 spec 仓;不能用目标列表顺序推断。
|
|
161
|
+
- 文件存在且项目一致:保留。
|
|
162
|
+
- 文件存在但选择了不同项目:可以作为只读查询目标,**不能因为切换查询连接就改写团队身份**。已有事实/历史包迁移到其他 Space/KB 属于另一个明确任务,不能仅改 project_id、manifest 或 targets 冒充迁移完成。
|
|
163
|
+
- 一个 Space 下的多个 KB 也分别选择。既有实体身份不能靠原包复制到另一 KB;跨库复用需确认事实归属并按正常流程建立目标身份。
|
|
164
|
+
|
|
165
|
+
创建字段与 API 映射见 [reference.md](reference.md)。机器身份保留完整 UUID;人阅读使用锚点与业务名称,不能截短远程返回的实体或版本 ID。
|
|
166
|
+
|
|
167
|
+
## 更换配置与失败处理
|
|
168
|
+
|
|
169
|
+
- 换密钥:只替换密钥并验证当前目标权限,保留 targets 与团队身份。
|
|
170
|
+
- 换 Space/KB:更新用户指定的连接目标,再核对查询权或入库项目一致性;不清空所有已有连接或自动改写身份。
|
|
171
|
+
- 401:停止本次远程操作,提示验证密钥;403:说明 scope/目标访问权不足。两者均不自动清除可能仍对其他目标有效的密钥,不循环重试。
|
|
172
|
+
- 网络不可用:保留配置,报告原因;可选查询失败不阻止本地流程。不能把不可用报告成“没有事实”或“已完成入库”。
|
|
173
|
+
- 当前七种 Skill 使用统计按本机 Git 身份上报,独立于 Spec 入库。本配置流程无需填写监控项目或访问旧 `/sdd-runs/dimensions`。历史 `projectName` 字段可保留兼容,不作为当前使用统计或业务归属依据。
|
|
151
174
|
|
|
152
175
|
## 查看当前配置
|
|
153
176
|
|
|
154
|
-
读取 `kb-state.json` 并展示:
|
|
177
|
+
读取 `kb-state.json` 与 `project-identity.json` 并展示:
|
|
155
178
|
|
|
156
179
|
```markdown
|
|
157
180
|
### 当前 KB 配置
|
|
158
181
|
- API 地址:{api}
|
|
159
182
|
- 租户:{tenantKey}
|
|
160
183
|
- API Key:{前缀}****(已配置 / 未配置)
|
|
161
|
-
- 项目绑定:{projectName 或 未绑定}
|
|
162
184
|
- 目标 Space/KB:
|
|
163
185
|
1. {spaceName}(spaceKey: {spaceKey})→ {kbName}
|
|
164
186
|
2. ...
|
|
165
187
|
- project-identity.json:{已存在 / 不存在}(project_id: {值})
|
|
188
|
+
- 授权/就绪:{context-client.cjs --check-only 结果}
|
|
166
189
|
```
|
|
167
190
|
|
|
168
|
-
|
|
191
|
+
密钥仅显示“已配置”或脱敏前缀。
|
|
192
|
+
|
|
193
|
+
## 文件与跨平台执行
|
|
169
194
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
| 换空间 / 换知识库 / 重新选择 | 清 targets,重走 Step 3→4 |
|
|
176
|
-
| 看配置 / 当前配置 | 读取 kb-state.json + project-identity.json 并展示 |
|
|
177
|
-
| 校验配置 | 探活 + 校验 project_id === spaceKey |
|
|
195
|
+
- **位置唯一**:`kb-state.json` 只写 `<spec-root>/kb-state.json`(Step 1.1 校验通过后)。
|
|
196
|
+
禁止写 `.shared/`、`<ide>/skills/` 或任何非 spec 根位置。
|
|
197
|
+
- `kb-state.json` 不提交 Git,校验 `.gitignore`;项目身份文件提交 Git。
|
|
198
|
+
- 通过客户端文件工具或 Node.js 写 UTF-8 JSON,无 BOM,并原子替换;勿用 PowerShell 默认编码直接覆盖。
|
|
199
|
+
- PowerShell 的 `curl` 可能是别名,HTTP 用 `Invoke-RestMethod` 或 Node.js;复杂 Node 逻辑写临时 `.cjs` 文件,避免 shell 内联转义。
|
|
178
200
|
|
|
179
201
|
## 硬规则
|
|
180
202
|
|
|
181
|
-
- 无 `apiKey` 不得猜密钥、不得改走 login
|
|
182
|
-
- 无 `targets` 不得臆造 spaceId/kbId。
|
|
203
|
+
- 无 `apiKey` 不得猜密钥、不得改走 login;不调用 `/auth/login` 换取另一身份。
|
|
204
|
+
- 无 `targets` 不得臆造 spaceId/kbId;不猜目标 ID。
|
|
183
205
|
- 完整 apiKey 只写共享 state 文件(`kb-state.json`,spec 仓根目录);聊天里最多显示前缀。
|
|
184
|
-
- 401/403 时清掉 `apiKey`,请用户重贴;勿循环重试。
|
|
185
206
|
- **共享状态**:state 文件与 `opsx-ontology-query`、`opsx-kb-ingest`、`kb-upload` 共用。配置一次,全部生效。
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"api": "http://10.29.213.80:8080/api",
|
|
12
12
|
"tenantKey": "default",
|
|
13
13
|
"apiKey": "sk_sdd_…",
|
|
14
|
-
"projectName":
|
|
14
|
+
"projectName": null,
|
|
15
15
|
"updatedAt": "2026-07-19T12:00:00Z",
|
|
16
16
|
"targets": [
|
|
17
17
|
{
|
|
@@ -30,17 +30,14 @@
|
|
|
30
30
|
| `api` | 是 | API 根,含 `/api` |
|
|
31
31
|
| `tenantKey` | 是 | 列空间用;默认 `default` |
|
|
32
32
|
| `apiKey` | 是 | 控制台创建的 `sk_sdd_…`,scope 建议 `context:read` + `archive:ingest` |
|
|
33
|
-
| `projectName` | 否 |
|
|
33
|
+
| `projectName` | 否 | 历史兼容字段;当前配置流程不要求填写,不作为七种 Skill 使用统计或业务归属依据 |
|
|
34
34
|
| `scopes` | 建议 | API Client scope 列表 |
|
|
35
35
|
| `targets` | 操作前必填 | 多选;可为空仅当尚未完成选择 |
|
|
36
36
|
| `updatedAt` | 建议 | ISO-8601 |
|
|
37
37
|
|
|
38
|
-
##
|
|
38
|
+
## 监控与入库分别验证
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
- 客户端辅助函数:`verifyProjectMembershipViaServer(specRoot, projectName)`(预校验,软返回)、`setKbProjectName(specRoot, projectName|null)`(原子写入/清除),均在 `skywalk-sdd/lib/shared.cjs`。
|
|
42
|
-
- 上传行为:同步代理每次组 batch 时重读 `kb-state.json`;`projectName` 非空 → batch 请求体顶层附带可选 `project_name` 字段(`sdd-progress-batch-v1.schema.json`,1-128 字符);未配置 → 请求体与历史版本完全一致。
|
|
43
|
-
- 环境变量兜底:`ENGINEERING_KB_PROJECT_NAME`(kb-state 无 `projectName` 时生效)。
|
|
40
|
+
当前使用统计由独立 usage reporter 发送本机 Git 用户信息与 Skill 使用事件。Spec 的上传结果由 archive job、当前版本与检索投影验证。`projectName` 的历史辅助函数仍可兼容旧集成,但当前配置流程不再调用旧进度批次或项目成员端点,也不声称填写该字段就会绑定现行使用统计。
|
|
44
41
|
|
|
45
42
|
## `project-identity.json`
|
|
46
43
|
|
|
@@ -73,7 +70,7 @@ Authorization: Bearer sk_sdd_…
|
|
|
73
70
|
- **不要** `POST /auth/login`。
|
|
74
71
|
- Key 在控制台「API 密钥」创建;创建时建议勾选 **读取上下文 / context:read** + **入库 / archive:ingest**(查询与入库都需要)。
|
|
75
72
|
- 如需查看 API Client 当前 scopes,可调用 `GET {api}/v1/spaces/{spaceId}/api-clients/me`,响应字段:`data.name`、`data.scopes`(string[])。
|
|
76
|
-
- 401
|
|
73
|
+
- 401:提示验证密钥;403:核对 scope 和目标空间访问权。保留原配置,不自动清空可能对其他目标有效的密钥,不循环重试。
|
|
77
74
|
|
|
78
75
|
探活与校验(PowerShell 用 `Invoke-RestMethod`,**禁止** `curl`):
|
|
79
76
|
|
|
@@ -96,7 +93,7 @@ GET $API/v1/spaces?tenantKey=$TENANT_KEY
|
|
|
96
93
|
GET $API/v1/spaces/{spaceId}/knowledge-bases
|
|
97
94
|
```
|
|
98
95
|
|
|
99
|
-
API Key
|
|
96
|
+
API Key 的可见范围以实际授权结果为准,可被限制到特定 Space;不能因为配置多个 targets 就认为已获得各目标权限。多个目标必须显式选择,完整目标通过 `--space-id` 与 `--kb-id` 一起传入。
|
|
100
97
|
|
|
101
98
|
### 响应字段映射(重要)
|
|
102
99
|
|
|
@@ -121,7 +118,7 @@ KB API 返回的 JSON 字段名(Java record 序列化)与 `kb-state.json`
|
|
|
121
118
|
|
|
122
119
|
| API 响应字段 (`ResolveCandidate`) | `semantic-identity` 参数 | 注意 |
|
|
123
120
|
|------|------|------|
|
|
124
|
-
| `entityId` | `--entity-id` | KB
|
|
125
|
-
| `entityVersionId` | `--previous-version-id` |
|
|
121
|
+
| `entityId` | `--entity-id` | 保留 KB 返回的完整 UUID(通常带连字符共 36 字符);不得截短 |
|
|
122
|
+
| `entityVersionId` | `--previous-version-id` | 保留实际当前版本的完整 UUID;只有正文实际基于该版本时才作为前驱 |
|
|
126
123
|
|
|
127
124
|
> ⚠️ **常见错误**:直接用 `k.kbId` / `k.kbName` 读取 KB API 响应 → 返回空值。正确写法:`k.knowledgeBaseId` / `k.name`,然后映射到 `kb-state.json` 的 `kbId` / `kbName`。
|