kld-sdd 2.8.0 → 2.8.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.
@@ -1,10 +1,15 @@
1
+
2
+ <!-- KB_CONFIG_CONTRACT: team-personal-direct-v1 -->
3
+ > **配置统一入口(优先于下文历史 API 示例)**:调用 `skywalk-sdd/lib/kb-config.cjs` 的 `readProjectConfig(specRoot)` 获取有效配置。`kb.config.json` 是可提交 Git 的团队地址、读取范围和上传位置;`kb-state.json` 只保存个人 Key 和个人补充读取范围,必须忽略 Git。团队配置存在时不能直接读取/改写个人文件来覆盖团队选择。保存通过 `saveProjectConfig(root, config, {team:true/false, revision})`,仅明确修改团队公共选项时传 team:true。禁止回显 Key。
4
+ > 日常上传直接运行 `node <spec-root>/skywalk-sdd/kb-ingest.cjs --project=<spec-root> --change=<change目录名>`;列出状态用 `--list`。脚本读取本地 Markdown,生成本体 JSON 并直接上传,不生成 ZIP、不依赖 AI、不要求先归档。不重复传 Space/KB 参数,不直接发裸上传 HTTP。旧 ZIP 仅供已有归档包兼容。
5
+
1
6
  # 本体入库 · 参考
2
7
 
3
8
  需要鉴权细节、state 字段或 Archive Package 规格时再读。
4
9
 
5
- ## `.local/state.json`
10
+ ## 旧项目单文件格式示例(未启用团队共享)
6
11
 
7
- 路径:`skills/opsx-kb-ingest/.local/state.json`(已 gitignore)。
12
+ 路径:`<spec-root>/kb-state.json`(已 gitignore,个人凭据文件;团队地址和目标以 kb.config.json 为准,必须通过 kb-config.cjs 合并读取)。
8
13
 
9
14
  ```json
10
15
  {
@@ -20,7 +25,11 @@
20
25
  "kbId": "uuid",
21
26
  "kbName": "默认知识库"
22
27
  }
23
- ]
28
+ ],
29
+ "uploadTarget": {
30
+ "spaceId": "uuid",
31
+ "kbId": "uuid"
32
+ }
24
33
  }
25
34
  ```
26
35
 
@@ -30,6 +39,7 @@
30
39
  | `tenantKey` | 是 | 列空间用;默认 `default` |
31
40
  | `apiKey` | 是 | 控制台创建的 `sk_sdd_…`,scope 至少 `archive:ingest` |
32
41
  | `targets` | 操作前必填 | 多选;可为空仅当尚未完成选择 |
42
+ | `uploadTarget` | 多目标上传前必填 | 默认写入位置,必须引用 `targets` 中的一项;旧单目标配置可省略 |
33
43
  | `updatedAt` | 建议 | ISO-8601 |
34
44
 
35
45
  示例(无密钥)见 [state.example.json](state.example.json)。
@@ -68,7 +78,17 @@ API Key 一般为租户范围;`apiKeySpaceId` 为空时可列出租户下多
68
78
 
69
79
  路径前缀:`/api/v1/spaces/{spaceId}/knowledge-bases/{kbId}/ingestions`
70
80
 
71
- ### 上传 zip 包
81
+ ### 日常直接入库
82
+
83
+ - `POST {base}/spec-status`:按 Change ID 核对远端快照及来源指纹。
84
+ - `POST {base}/prepare`:获取本次涉及事实的版本基线。
85
+ - `POST {base}/direct`:发送 `{schemaVersion:"kld-sdd-direct-ingest/v1",files:{"proposal.md":"…",…}}`。内存中生成本体、来源清单与 SHA-256,不写 ZIP。
86
+
87
+ 用户不手工构造上述请求,统一调用 kb-ingest.cjs。旧文件夹命令转到同一实现。
88
+ `--require-review` 只保存候选;相同候选不会重复上传。用户明确审阅并授权发布后,运行同一命令加 `--confirm-review`;仅确认原文完全相同的远端候选,不跳过并发核对。
89
+ 服务端基线冲突整体回滚,提示先同步团队 Spec,不覆盖 current。
90
+
91
+ ### 兼容已有 zip 包(不是日常入库入口)
72
92
 
73
93
  ```bash
74
94
  POST {base}/ingestions
@@ -101,7 +121,7 @@ GET {base}/ingestions/{jobId}
101
121
  POST {base}/ingestions/{jobId}/retry
102
122
  ```
103
123
 
104
- 仅 `status=failed` 的任务可重试;后端会重新解析原始上传的 zip 包。
124
+ 仅 `status=failed` 的任务可重试;后端会重新解析原始请求(直接 JSON 或旧 ZIP)。
105
125
 
106
126
  ## IngestionJobDto 响应字段
107
127
 
@@ -173,7 +193,7 @@ requirement 条目可选 `feature_id`(同 feature 文法);配对关系随
173
193
 
174
194
  修正必须回到 kld-sdd(复用历史身份或换新锚点),重新 check → 归档 → 入库;禁止在 KB 改绑。
175
195
 
176
- ## Archive Package 规格
196
+ ## 旧 Archive Package 规格(仅兼容已有 ZIP)
177
197
 
178
198
  ### 必需文件
179
199
 
@@ -218,7 +238,7 @@ requirement 条目可选 `feature_id`(同 feature 文法);配对关系随
218
238
  # 仅校验
219
239
  node skywalk-sdd/kb-upload.cjs --validate-only --folder=<path> [--minimum-level=propose-spec]
220
240
 
221
- # 文件夹上传(自动语义管线 + 元数据生成 + 打包 + 上传)
241
+ # 文件夹上传(读取本地文档 + 本体 JSON + 直接上传)
222
242
  node skywalk-sdd/kb-upload.cjs --folder=<path> [--minimum-level=propose-spec] [--space-id=<id>] [--kb-id=<id>]
223
243
 
224
244
  # zip 包上传
@@ -233,13 +253,19 @@ node skywalk-sdd/kb-upload.cjs --package=<zip-path> [--space-id=<id>] [--kb-id=<
233
253
  | `--package=<zip>` | 与 `--folder` 二选一 | 已打包的 zip 路径 |
234
254
  | `--minimum-level` | 否 | 上传最低等级:`propose-spec`(默认)/ `design` / `task` / `full` |
235
255
  | `--validate-only` | 否 | 仅校验不上传 |
236
- | `--space-id=<id>` | 否 | 目标 Space ID;单目标可读取配置,多目标时与 --kb-id 一起显式提供 |
237
- | `--kb-id=<id>` | 否 | 目标 KB ID;单目标可读取配置,多目标时与 --space-id 一起显式提供 |
256
+ | `--space-id=<id>` | 否 | 临时指定上传 Space(改投还需 `--override-upload-target`);必须与 `--kb-id` 同时提供。默认读取 `uploadTarget` |
257
+ | `--kb-id=<id>` | 否 | 临时指定上传 KB(改投还需 `--override-upload-target`);必须与 `--space-id` 同时提供。默认读取 `uploadTarget` |
258
+
259
+ 上传目标:默认统一解析器返回的 `config.uploadTarget`;没有团队文件的旧项目对应 `kb-state.json.uploadTarget`;仅缺少该字段的旧单目标配置兼容唯一目标。字段为 null 表示未选择上传库,不能回退。
260
+ 成对参数与已保存目标不同会报 `UPLOAD_TARGET_CONFLICT`;只有用户明确临时改投并增加 `--override-upload-target` 才覆盖,且不得超出 targets。
261
+ 多个 `targets` 没有有效 `uploadTarget` 时直接停止,不能默选首项或广播。
238
262
 
239
263
  ### project_id 解析优先级
240
264
 
241
265
  1. `$SPEC_ROOT/skywalk-sdd/project-identity.json` 的 `project_id` 字段
242
- 2. 都没有 → 报错:`请运行 /opsx-kb-config 配置知识库`
266
+ 2. 文件不存在且已选上传目标包含服务端 `spaceKey` → 首次上传自动创建,不能从读取目标顺序推断
267
+ 3. 旧离线归档的 `UNCONFIGURED` 临时身份且无 kb_space_id → 自动绑定已选上传库并保留原临时 ID;不改写历史归档
268
+ 4. 已有文件损坏、已绑定项目归属不符,或缺少 spaceKey → 停止并提示具体配置问题;不覆盖团队身份
243
269
 
244
270
  ### 上传等级校验
245
271
 
@@ -249,3 +275,5 @@ node skywalk-sdd/kb-upload.cjs --package=<zip-path> [--space-id=<id>] [--kb-id=<
249
275
  | `design` | + design.md |
250
276
  | `task` | + tasks.md |
251
277
  | `full` | 全部 4 个 + ontology 状态完整 |
278
+
279
+ `--check-config`:只核对实际读取的配置与上传目标,输出不含密钥;不修改文件。
@@ -0,0 +1,18 @@
1
+ {
2
+ "api": "http://10.29.213.80:8080/api",
3
+ "tenantKey": "default",
4
+ "apiKey": "",
5
+ "targets": [
6
+ {
7
+ "spaceId": "space-uuid",
8
+ "spaceKey": "project-key",
9
+ "spaceName": "项目空间",
10
+ "kbId": "knowledge-base-uuid",
11
+ "kbName": "Spec 知识库"
12
+ }
13
+ ],
14
+ "uploadTarget": {
15
+ "spaceId": "space-uuid",
16
+ "kbId": "knowledge-base-uuid"
17
+ }
18
+ }
@@ -30,7 +30,7 @@ allowed-tools:
30
30
 
31
31
  ## 执行流程
32
32
 
33
- 1. 确定 Spec 仓根目录和 change。
33
+ 1. 确定 Spec 仓根目录和 change。配置只读 `<spec-root>/kb-state.json`,通过 `kb-upload.cjs --project=<spec-root> --check-config` 核对上传位置;不创建 Skill 私有 state,也不把查询 targets 首项当上传库。已有配置直接复用,项目身份缺失且上传目标含 spaceKey 时由上传器首次创建。
34
34
  2. 执行兼容物化:
35
35
 
36
36
  ```bash
@@ -19,6 +19,11 @@ allowed-tools:
19
19
  - Edit
20
20
  ---
21
21
 
22
+ <!-- KB_CONFIG_CONTRACT: team-personal-direct-v1 -->
23
+ > **配置统一入口(优先于下文历史 API 示例)**:调用 `skywalk-sdd/lib/kb-config.cjs` 的 `readProjectConfig(specRoot)` 获取有效配置。`kb.config.json` 是可提交 Git 的团队地址、读取范围和上传位置;`kb-state.json` 只保存个人 Key 和个人补充读取范围,必须忽略 Git。团队配置存在时不能直接读取/改写个人文件来覆盖团队选择。保存通过 `saveProjectConfig(root, config, {team:true/false, revision})`,仅明确修改团队公共选项时传 team:true。禁止回显 Key。
24
+ > 日常上传直接运行 `node <spec-root>/skywalk-sdd/kb-ingest.cjs --project=<spec-root> --change=<change目录名>`;列出状态用 `--list`。脚本读取本地 Markdown,生成本体 JSON 并直接上传,不生成 ZIP、不依赖 AI、不要求先归档。不重复传 Space/KB 参数,不直接发裸上传 HTTP。旧 ZIP 仅供已有归档包兼容。
25
+
26
+
22
27
  > **执行方式**:先读 [交互与执行契约](../opsx-propose/interaction-policy.md);同一会话已读则复用。用户已授权连续处理时按范围推进,不重复索要阶段口令;只请求单阶段时完成即停。
23
28
 
24
29
  # 本体知识库 · 查询
@@ -31,23 +36,22 @@ allowed-tools:
31
36
  ## ⚠️ 数据边界(必读)
32
37
 
33
38
  ```
34
- SDD 流程:Propose → Spec → Design → Task → Check → Apply → Archive → kb-ingest
35
- ↑
36
- 此刻之前,当前变更不在 KB 中
39
+ 本地 Spec → 用户选择入库 → 服务端发布为 current → 后续需求可召回
40
+ 归档可以在前或在后;未发布的本地改动不自动进入 KB。
37
41
  ```
38
42
 
39
43
  - Propose → Check 阶段查 KB = 查**历史上下文**(上一次入库的状态)
40
44
  - 当前变更的 added/modified 实体在 KB 中**不存在**或**只有旧版本**
41
45
  - 当前变更内部一致性 → **本地文件 + semantic-check**,不查 KB
42
- - 只有 Archive → kb-ingest 后,当前变更才进入 KB(Phase 3 验证)
46
+ - 只有显式入库并发布为 current 后,本地版本才进入 KB;候选待审核不算发布。
43
47
 
44
48
  ## Session 启动(同一连续任务复用)
45
49
 
46
- > **📡 共享状态**:本技能与 `opsx-kb-ingest`、`kb-upload` **共用同一份 KB 配置**(`kb-state.json`,位于 spec 仓根目录)。KB 配置(API Key + Space/KB 选择 + project-identity.json)由 `opsx-kb-config` 统一负责。
50
+ > **📡 共享状态**:本技能与 `opsx-kb-ingest`、`kb-upload` **共用同一个有效配置解析器**(Spec 根目录的团队 `kb.config.json` + 个人 `kb-state.json`)。KB 配置(API Key + Space/KB 选择 + project-identity.json)由 `opsx-kb-config` 统一负责。
47
51
 
48
52
  ```
49
53
  Task Progress:
50
- - [ ] 1. 读 kb-state.json(spec 仓根目录)
54
+ - [ ] 1. 调用 readProjectConfig(specRoot).config(不要直接读个人文件)
51
55
  - [ ] 2. 无 apiKey 或无 targets → 记录未配置,本地工作继续;用户明确要配置时才进入 /opsx-kb-config
52
56
  - [ ] 3. 有唯一或已明确选择的目标 → 按意图查询;多个目标未明确时先澄清本次查询范围,不默认选第一个
53
57
  - [ ] 4. 按模板输出;无命中不编造
@@ -115,7 +119,7 @@ scenario: ^[A-Z0-9_-]+:SCN-[a-z0-9]+(-[a-z0-9]+)*-[0-9]{3}$
115
119
  - 无 `apiKey` 不得猜密钥、不得改走 login。
116
120
  - 无 `targets` 不得臆造 spaceId/kbId。
117
121
  - 无命中 → 写明「无当前依据」,禁止编造条款。
118
- - 完整 apiKey 只写共享 state 文件(`kb-state.json`,spec 仓根目录);聊天里最多显示前缀(如 `sk_sdd_****`)。
122
+ - 完整 apiKey 只写个人 state 文件(`kb-state.json`,spec 仓根目录);聊天里最多显示前缀(如 `sk_sdd_****`)。
119
123
  - **共享状态**:state 文件与 `opsx-kb-ingest` 共用。配置一次,两个 skill 都生效。
120
124
 
121
125
  ## 用户口令
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **触发时机**:opsx-propose 创建变更前 / opsx-spec 生成规格前
4
4
  > **加载方式**:SDD skill 在对应阶段 `Read` 本文件
5
- > **前置条件**:`.local/state.json` 已完成 Session 启动(apiKey + targets 就绪)
5
+ > **前置条件**:`<spec-root>/kb-state.json` 已完成 Session 启动(apiKey + targets 就绪)
6
6
  >
7
7
  > ⚠️ **数据边界**:当前变更尚未入库,KB 中只有历史变更数据。
8
8
  > 本阶段 KB 查询的目的:**用历史上下文辅助当前变更的决策**(身份决议、影响预评、历史 AC 查询、Spec 复用)。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **触发时机**:opsx-design / opsx-task / opsx-check 阶段
4
4
  > **加载方式**:SDD skill 在对应阶段 `Read` 本文件
5
- > **前置条件**:`.local/state.json` 已完成 Session 启动
5
+ > **前置条件**:`<spec-root>/kb-state.json` 已完成 Session 启动
6
6
  >
7
7
  > ⚠️ **数据边界**:当前变更尚未入库(Archive → kb-ingest 之前),KB 中只有历史变更数据。
8
8
  > 本阶段所有 KB 查询都是查**历史上下文**,用于辅助决策,不能用于验证当前变更的内部一致性。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **触发时机**:开发者手动查询 / Agent 按需加载
4
4
  > **加载方式**:任意阶段可 `Read` 本文件
5
- > **前置条件**:`.local/state.json` 已完成 Session 启动
5
+ > **前置条件**:`<spec-root>/kb-state.json` 已完成 Session 启动
6
6
 
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **触发时机**:治理流程 / 定期巡检 / opsx-check 深度验证
4
4
  > **加载方式**:治理角色按需 `Read` 本文件
5
- > **前置条件**:`.local/state.json` 已完成 Session 启动
5
+ > **前置条件**:`<spec-root>/kb-state.json` 已完成 Session 启动
6
6
  >
7
7
  > ✅ conformance / drift API **已实现**,但需要先通过 `POST /evidence-ingestions` 入库代码证据后才有数据。
8
8
  > 无 evidence 时返回 `{"integrationStatus":"not_integrated","reports":[]}`,Agent 遇到此状态应提示用户"需先入库 evidence",不当作错误。
@@ -1,10 +1,15 @@
1
+
2
+ <!-- KB_CONFIG_CONTRACT: team-personal-direct-v1 -->
3
+ > **配置统一入口(优先于下文历史 API 示例)**:调用 `skywalk-sdd/lib/kb-config.cjs` 的 `readProjectConfig(specRoot)` 获取有效配置。`kb.config.json` 是可提交 Git 的团队地址、读取范围和上传位置;`kb-state.json` 只保存个人 Key 和个人补充读取范围,必须忽略 Git。团队配置存在时不能直接读取/改写个人文件来覆盖团队选择。保存通过 `saveProjectConfig(root, config, {team:true/false, revision})`,仅明确修改团队公共选项时传 team:true。禁止回显 Key。
4
+ > 日常上传直接运行 `node <spec-root>/skywalk-sdd/kb-ingest.cjs --project=<spec-root> --change=<change目录名>`;列出状态用 `--list`。脚本读取本地 Markdown,生成本体 JSON 并直接上传,不生成 ZIP、不依赖 AI、不要求先归档。不重复传 Space/KB 参数,不直接发裸上传 HTTP。旧 ZIP 仅供已有归档包兼容。
5
+
1
6
  # 本体查询 · 参考
2
7
 
3
8
  需要鉴权细节、state 字段、API curl 示例或响应字段时再读。
4
9
 
5
- ## `.local/state.json`
10
+ ## 旧项目单文件格式示例(未启用团队共享)
6
11
 
7
- 路径:`skills/opsx-ontology-query/.local/state.json`(已 gitignore)。
12
+ 路径:`<spec-root>/kb-state.json`(已 gitignore),与托盘、配置和入库 Skill 共用;不读取 Skill 私有 state。`targets` 可多选用于读取;`uploadTarget` 仅用于写入,查询不得修改它。
8
13
 
9
14
  ```json
10
15
  {
@@ -42,7 +47,7 @@ Authorization: Bearer sk_sdd_…
42
47
 
43
48
  - **不要** `POST /auth/login`。
44
49
  - Key 在控制台「API 密钥」创建;创建时勾选 **读取上下文 / context:read**(查询够用)。
45
- - 401/403:清掉 state 里的 `apiKey`,请用户重贴;勿循环重试。
50
+ - 401/403:停止本次操作并提示检查密钥或权限;保留 apiKey、targets 和 uploadTarget,不自动清空配置,不循环重试。
46
51
 
47
52
  探活与校验:
48
53