kld-sdd 2.7.8 → 2.8.1

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 (75) hide show
  1. package/README.md +26 -0
  2. package/USABILITY.md +72 -0
  3. package/bin/kld-sdd-init.js +718 -34
  4. package/lib/command-bridge.js +26 -17
  5. package/lib/deploy-codebuddy-hooks.js +19 -26
  6. package/lib/deploy-strategy.js +293 -0
  7. package/lib/hook-gate-core.js +7 -8
  8. package/lib/hook-install.js +75 -0
  9. package/lib/init.js +507 -726
  10. package/lib/maintenance.js +221 -0
  11. package/lib/managed-hook-hashes.json +24 -0
  12. package/lib/settings-merge.js +102 -25
  13. package/lib/skills-bundle.js +5 -5
  14. package/lib/spec-choice.js +85 -0
  15. package/lib/tool-profiles.js +2 -2
  16. package/lib/uninstall.js +453 -0
  17. package/package.json +7 -4
  18. package/skywalk-sdd/context-client.cjs +38 -7
  19. package/skywalk-sdd/index.cjs +153 -27
  20. package/skywalk-sdd/kb-sync-identity.cjs +1 -1
  21. package/skywalk-sdd/kb-upload.cjs +242 -85
  22. package/skywalk-sdd/lib/check-review.cjs +41 -0
  23. package/skywalk-sdd/lib/shared.cjs +62 -41
  24. package/skywalk-sdd/lib/test-execution.cjs +130 -0
  25. package/skywalk-sdd/lib/usage-reporter.cjs +17 -8
  26. package/skywalk-sdd/ontology/archive-package.cjs +141 -0
  27. package/skywalk-sdd/ontology/artifact-parser.cjs +24 -3
  28. package/skywalk-sdd/ontology/cli.cjs +53 -0
  29. package/skywalk-sdd/ontology/id.cjs +1 -1
  30. package/skywalk-sdd/ontology/identity-index.cjs +5 -1
  31. package/skywalk-sdd/ontology/resolve-spec-root.cjs +49 -0
  32. package/skywalk-sdd/ontology/schema.cjs +6 -0
  33. package/skywalk-sdd/ontology/sdd-config.cjs +33 -5
  34. package/skywalk-sdd/ontology/spec-detect.cjs +421 -0
  35. package/skywalk-sdd/ontology/spec-ontology.cjs +507 -0
  36. package/skywalk-sdd/ontology/workspace-layout.cjs +65 -17
  37. package/templates/git-hooks/commit-msg +17 -85
  38. package/templates/git-hooks/commit-msg-runner.cjs +44 -0
  39. package/templates/git-hooks/commit-msg-sdd-trailer.cjs +60 -69
  40. package/templates/git-hooks/consistency-check-core.cjs +92 -261
  41. package/templates/git-hooks/delivery-check.cjs +231 -0
  42. package/templates/git-hooks/delivery-snapshot.cjs +181 -0
  43. package/templates/git-hooks/hooks.config +8 -6
  44. package/templates/git-hooks/pre-commit +19 -5
  45. package/templates/git-hooks/pre-commit-consistency-check.cjs +13 -31
  46. package/templates/git-hooks/pre-push +19 -5
  47. package/templates/git-hooks/pre-push-consistency-check.cjs +36 -83
  48. package/templates/hooks/claude/hooks/sdd-post-tool.cjs +2 -2
  49. package/templates/hooks/codebuddy/hooks/hook-gate-core.cjs +7 -8
  50. package/templates/hooks/codebuddy/hooks/sdd-post-tool.cjs +2 -2
  51. package/templates/openspec/proposal.md +1 -1
  52. package/templates/openspec/spec.md +8 -0
  53. package/templates/skills/kld-sdd/opsx-apply/SKILL.md +28 -24
  54. package/templates/skills/kld-sdd/opsx-apply/checklist.md +12 -3
  55. package/templates/skills/kld-sdd/opsx-apply/reference.md +21 -1
  56. package/templates/skills/kld-sdd/opsx-archive/SKILL.md +20 -18
  57. package/templates/skills/kld-sdd/opsx-check/SKILL.md +18 -13
  58. package/templates/skills/kld-sdd/opsx-check/reference.md +3 -1
  59. package/templates/skills/kld-sdd/opsx-check/review-template.json +22 -0
  60. package/templates/skills/kld-sdd/opsx-check/reviewer.md +27 -6
  61. package/templates/skills/kld-sdd/opsx-consistency-check/SKILL.md +34 -112
  62. package/templates/skills/kld-sdd/opsx-consistency-check/scripts/scripts.cjs +15 -14
  63. package/templates/skills/kld-sdd/opsx-kb-config/SKILL.md +93 -61
  64. package/templates/skills/kld-sdd/opsx-kb-config/reference.md +14 -12
  65. package/templates/skills/kld-sdd/opsx-kb-ingest/SKILL.md +16 -5
  66. package/templates/skills/kld-sdd/opsx-kb-ingest/reference.md +13 -5
  67. package/templates/skills/kld-sdd/opsx-kb-ingest/state.example.json +18 -0
  68. package/templates/skills/kld-sdd/opsx-ontology-ingest/SKILL.md +77 -0
  69. package/templates/skills/kld-sdd/opsx-ontology-query/SKILL.md +5 -4
  70. package/templates/skills/kld-sdd/opsx-ontology-query/reference.md +14 -1
  71. package/templates/skills/kld-sdd/opsx-propose/SKILL.md +1 -1
  72. package/templates/skills/kld-sdd/opsx-propose/interaction-policy.md +9 -0
  73. package/templates/skills/kld-sdd/opsx-spec/SKILL.md +5 -3
  74. package/templates/skills/kld-sdd/opsx-task/SKILL.md +2 -2
  75. package/index.js +0 -13
@@ -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
  {
@@ -21,7 +21,11 @@
21
21
  "kbId": "uuid",
22
22
  "kbName": "默认知识库"
23
23
  }
24
- ]
24
+ ],
25
+ "uploadTarget": {
26
+ "spaceId": "uuid",
27
+ "kbId": "uuid"
28
+ }
25
29
  }
26
30
  ```
27
31
 
@@ -30,17 +34,15 @@
30
34
  | `api` | 是 | API 根,含 `/api` |
31
35
  | `tenantKey` | 是 | 列空间用;默认 `default` |
32
36
  | `apiKey` | 是 | 控制台创建的 `sk_sdd_…`,scope 建议 `context:read` + `archive:ingest` |
33
- | `projectName` | 否 | 监控项目绑定名;`null`/缺失/空白 = 未绑定,上传批次不携带 `project_name` |
37
+ | `projectName` | 否 | 历史兼容字段;当前配置流程不要求填写,不作为七种 Skill 使用统计或业务归属依据 |
34
38
  | `scopes` | 建议 | API Client scope 列表 |
35
39
  | `targets` | 操作前必填 | 多选;可为空仅当尚未完成选择 |
40
+ | `uploadTarget` | 多目标上传前必填 | Spec 的唯一写入位置,必须引用 `targets` 中的一项;不影响多目标查询 |
36
41
  | `updatedAt` | 建议 | ISO-8601 |
37
42
 
38
- ## 监控项目绑定与上传
43
+ ## 监控与入库分别验证
39
44
 
40
- - 配置期预校验:`GET {api}/v1/sdd-runs/dimensions`(Bearer),返回当前密钥用户可见的 `projects[]`;条目名称匹配即视为成员。端点 404/不可达表示服务端尚未上线该能力 → 软警告后可保存,服务端在上传时做权威裁决(非成员项目置空、不阻断)。
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` 时生效)。
45
+ 当前使用统计由独立 usage reporter 发送本机 Git 用户信息与 Skill 使用事件。Spec 的上传结果由 archive job、当前版本与检索投影验证。`projectName` 的历史辅助函数仍可兼容旧集成,但当前配置流程不再调用旧进度批次或项目成员端点,也不声称填写该字段就会绑定现行使用统计。
44
46
 
45
47
  ## `project-identity.json`
46
48
 
@@ -73,7 +75,7 @@ Authorization: Bearer sk_sdd_…
73
75
  - **不要** `POST /auth/login`。
74
76
  - Key 在控制台「API 密钥」创建;创建时建议勾选 **读取上下文 / context:read** + **入库 / archive:ingest**(查询与入库都需要)。
75
77
  - 如需查看 API Client 当前 scopes,可调用 `GET {api}/v1/spaces/{spaceId}/api-clients/me`,响应字段:`data.name`、`data.scopes`(string[])。
76
- - 401/403:清掉 state 里的 `apiKey`,请用户重贴;勿循环重试。
78
+ - 401:提示验证密钥;403:核对 scope 和目标空间访问权。保留原配置,不自动清空可能对其他目标有效的密钥,不循环重试。
77
79
 
78
80
  探活与校验(PowerShell 用 `Invoke-RestMethod`,**禁止** `curl`):
79
81
 
@@ -96,7 +98,7 @@ GET $API/v1/spaces?tenantKey=$TENANT_KEY
96
98
  GET $API/v1/spaces/{spaceId}/knowledge-bases
97
99
  ```
98
100
 
99
- API Key 一般为租户范围;`apiKeySpaceId` 为空时可列出租户下多空间,便于多选。
101
+ API Key 的可见范围以实际授权结果为准,可被限制到特定 Space;不能因为配置多个 targets 就认为已获得各目标权限。查询目标按本次意图明确选择;上传默认读取 `uploadTarget`,只有临时覆盖时才同时传 `--space-id` 与 `--kb-id`。
100
102
 
101
103
  ### 响应字段映射(重要)
102
104
 
@@ -121,7 +123,7 @@ KB API 返回的 JSON 字段名(Java record 序列化)与 `kb-state.json`
121
123
 
122
124
  | API 响应字段 (`ResolveCandidate`) | `semantic-identity` 参数 | 注意 |
123
125
  |------|------|------|
124
- | `entityId` | `--entity-id` | KB 返回完整 UUID(36字符),`semantic-identity` 的 `id.cjs` 会自动归一化为 8-hex 短格式 |
125
- | `entityVersionId` | `--previous-version-id` | 同上,自动归一化 |
126
+ | `entityId` | `--entity-id` | 保留 KB 返回的完整 UUID(通常带连字符共 36 字符);不得截短 |
127
+ | `entityVersionId` | `--previous-version-id` | 保留实际当前版本的完整 UUID;只有正文实际基于该版本时才作为前驱 |
126
128
 
127
129
  > ⚠️ **常见错误**:直接用 `k.kbId` / `k.kbName` 读取 KB API 响应 → 返回空值。正确写法:`k.knowledgeBaseId` / `k.name`,然后映射到 `kb-state.json` 的 `kbId` / `kbName`。
@@ -28,12 +28,22 @@ description: >-
28
28
  Task Progress:
29
29
  - [ ] 1. 读 kb-state.json(spec 仓根目录)
30
30
  - [ ] 2. 无 apiKey 或无 targets → 提示用户运行 /opsx-kb-config 配置知识库
31
- - [ ] 3. 有配置 → 按意图执行入库操作(上传 / 查状态 / 列表 / 重试)
32
- - [ ] 4. 按模板输出结果
31
+ - [ ] 3. 解析上传目标:优先 `uploadTarget`;旧单目标配置兼容;多目标但未指定则停止并提示配置
32
+ - [ ] 4. 有配置 → 按意图执行入库操作(上传 / 查状态 / 列表 / 重试)
33
+ - [ ] 5. 按模板输出结果
33
34
  ```
34
35
 
35
36
  > **KB 配置**(API Key、Space/KB 选择、project-identity.json)由 `opsx-kb-config` 统一负责。如用户需要配置或更换 KB,请引导运行 `/opsx-kb-config`。
36
37
 
38
+ ### 上传目标解析(必须遵守)
39
+
40
+ 1. 用户本次明确同时提供 `--space-id` 与 `--kb-id` 时,作为临时覆盖目标。
41
+ 2. 否则读取 `kb-state.json.uploadTarget`,并确认它仍对应 `targets` 中的一项。
42
+ 3. 历史配置只有一个 `targets` 且没有 `uploadTarget` 时,兼容使用该唯一目标。
43
+ 4. 多个 `targets` 但没有有效 `uploadTarget` 时停止上传,提示在 SDD 助手中选择“Spec 上传知识库”。
44
+
45
+ 禁止直接使用 `targets[0]`,禁止把 Spec 自动广播到多个知识库。调用 `kb-upload.cjs` 时默认不再重复拼接目标参数;脚本会按同一规则读取共享配置。
46
+
37
47
  ### 4. 入库操作
38
48
 
39
49
  路径前缀:`/api/v1/spaces/{spaceId}/knowledge-bases/{kbId}/ingestions`
@@ -79,7 +89,8 @@ curl -sS -X POST "$API/v1/spaces/$SPACE_ID/knowledge-bases/$KB_ID/ingestions/$JO
79
89
 
80
90
  上传的 zip 包必须满足以下条件(否则入库会失败):
81
91
 
82
- - 包含三个必需 JSON 文件:`archive-manifest.json`、`canonical-facts.json`、`conversion-report.json`
92
+ - 当前产物包含:`archive-manifest.json`、`canonical-facts.json`、`spec-ontology.json`、`conversion-report.json`
93
+ - 历史兼容包可不带 `canonical-facts.json`,但必须带 `spec-ontology.json`,且 `compatibility_mode=LEGACY_MATERIALIZED`。重复锚点、非法 UUID、身份冲突、依赖成环、归档版本不一致由上传自动消解;无结构化事实时才是 `pending`。不要让用户处理这些历史诊断。
83
94
  - `canonical-facts.json` 支持 `kld-sdd-canonical-facts/v1` 与 **`v2`**(v2 可选实体级 `external_refs`)
84
95
  - 所有文件需通过 SHA-256 校验(manifest 中记录每个文件的 `content_hash`)
85
96
  - 允许的文件类型:`.md`、`.json`、`.jsonl`、`.yaml`、`.yml`
@@ -195,7 +206,7 @@ node skywalk-sdd/kb-sync-identity.cjs \
195
206
  - 已发布内容修改后,先同步所有受影响文件,再上传。禁止删除 ontology/artifacts 或重建身份以绕过冲突。
196
207
  - 完整 UUID 保留原值,旧短 ID 继续兼容;不得截断真实 UUID。
197
208
 
198
- 上传回执需分别检查事实保存、`publication_status` 和索引状态。HTTP 200 不是成功证明;多 KB 时明确本次 `--space-id` 与 `--kb-id`,不自动广播。
209
+ 上传回执需分别检查事实保存、`publication_status` 和索引状态。HTTP 200 不是成功证明;多 KB 时默认使用配置中的 `uploadTarget`,不自动广播。
199
210
 
200
211
  **其他影响入库的因素**:
201
212
 
@@ -213,7 +224,7 @@ node skywalk-sdd/kb-sync-identity.cjs \
213
224
  |------|-----------|---------|
214
225
  | 输入 | 原始变更目录 | 已打包 zip |
215
226
  | 语义管线 | 自动执行(semantic-scan → reconcile → check) | 无需(zip 已含元数据) |
216
- | 元数据生成 | 自动生成(archive-manifest + canonical-facts + conversion-report) | 无需(zip 已含) |
227
+ | 元数据生成 | 自动生成(manifest + canonical v2 + Spec ontology v1 + report) | 无需(zip 已含) |
217
228
  | 适用场景 | 任意 SDD 阶段入库 | 已有 zip 补传 / 归档后上传 |
218
229
 
219
230
  > 文件夹上传最终也会打包成 zip 走同一上传接口,KB 后端解析逻辑不变。
@@ -2,9 +2,9 @@
2
2
 
3
3
  需要鉴权细节、state 字段或 Archive Package 规格时再读。
4
4
 
5
- ## `.local/state.json`
5
+ ## `kb-state.json`
6
6
 
7
- 路径:`skills/opsx-kb-ingest/.local/state.json`(已 gitignore)。
7
+ 路径:`<spec-root>/kb-state.json`(已 gitignore,所有 KB Skills 共用的唯一权威配置)。
8
8
 
9
9
  ```json
10
10
  {
@@ -20,7 +20,11 @@
20
20
  "kbId": "uuid",
21
21
  "kbName": "默认知识库"
22
22
  }
23
- ]
23
+ ],
24
+ "uploadTarget": {
25
+ "spaceId": "uuid",
26
+ "kbId": "uuid"
27
+ }
24
28
  }
25
29
  ```
26
30
 
@@ -30,6 +34,7 @@
30
34
  | `tenantKey` | 是 | 列空间用;默认 `default` |
31
35
  | `apiKey` | 是 | 控制台创建的 `sk_sdd_…`,scope 至少 `archive:ingest` |
32
36
  | `targets` | 操作前必填 | 多选;可为空仅当尚未完成选择 |
37
+ | `uploadTarget` | 多目标上传前必填 | 默认写入位置,必须引用 `targets` 中的一项;旧单目标配置可省略 |
33
38
  | `updatedAt` | 建议 | ISO-8601 |
34
39
 
35
40
  示例(无密钥)见 [state.example.json](state.example.json)。
@@ -233,8 +238,11 @@ node skywalk-sdd/kb-upload.cjs --package=<zip-path> [--space-id=<id>] [--kb-id=<
233
238
  | `--package=<zip>` | 与 `--folder` 二选一 | 已打包的 zip 路径 |
234
239
  | `--minimum-level` | 否 | 上传最低等级:`propose-spec`(默认)/ `design` / `task` / `full` |
235
240
  | `--validate-only` | 否 | 仅校验不上传 |
236
- | `--space-id=<id>` | 否 | 目标 Space ID(从 kb-state.json targets[0] 读取) |
237
- | `--kb-id=<id>` | 否 | 目标 KB ID(从 kb-state.json targets[0] 读取) |
241
+ | `--space-id=<id>` | 否 | 临时覆盖上传 Space;必须与 `--kb-id` 同时提供。默认读取 `uploadTarget` |
242
+ | `--kb-id=<id>` | 否 | 临时覆盖上传 KB;必须与 `--space-id` 同时提供。默认读取 `uploadTarget` |
243
+
244
+ 上传目标优先级:成对命令行参数 → `kb-state.json.uploadTarget` → 旧版唯一 `targets[0]`。
245
+ 多个 `targets` 没有有效 `uploadTarget` 时直接停止,不能默选首项或广播。
238
246
 
239
247
  ### project_id 解析优先级
240
248
 
@@ -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
+ }
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: opsx-ontology-ingest
3
+ description: >-
4
+ Materializes current or historical SDD artifacts into the Spec ontology protocol,
5
+ reviews compatibility candidates, packages both canonical v2 and Spec ontology v1,
6
+ uploads them to the configured knowledge base, and verifies retrieval.
7
+ argument-hint: "[change-key or archive folder]"
8
+ license: MIT
9
+ compatibility: Requires the kld-sdd ontology runtime; upload requires a configured Engineering KB.
10
+ allowed-tools:
11
+ - Bash
12
+ - Read
13
+ - Write
14
+ - Edit
15
+ ---
16
+
17
+ > **执行方式**:先读 [交互与执行契约](../opsx-propose/interaction-policy.md);同一会话已读则复用。
18
+
19
+ # Spec 本体入库
20
+
21
+ 这是「产物兼容 → 本体物化 → 入库 → 召回验证」的统一入口。用户不需要手工补 UUID,也不需要判断历史产物版本。
22
+
23
+ ## 始终遵守
24
+
25
+ - 不改写历史 Markdown。缺少、非法或互相冲突的身份由上传写进 `ontology/legacy-mapping.json`,并生成稳定 UUID。
26
+ - 重复锚点、非法 UUID、身份冲突、任务依赖成环、归档版本对不上,都由上传自动消解并继续发布。不要停下来请用户处理,也不要改 Markdown 去“修”这些历史诊断。
27
+ - `opsx-check` 仍会报告这些问题。入库和召回不依赖 Check 通过。
28
+ - 正式发布仍校验证据、哈希、版本和租户边界。正文没有结构化事实时只入证据,不发布本体事实。
29
+ - 当前 `canonical-facts/v2` 与 `spec-ontology/v1` 同包产出,支持新旧知识库过渡。
30
+
31
+ ## 执行流程
32
+
33
+ 1. 确定 Spec 仓根目录和 change。
34
+ 2. 执行兼容物化:
35
+
36
+ ```bash
37
+ node skywalk-sdd/ontology/cli.cjs materialize-ontology --project=. --change=<change-key>
38
+ ```
39
+
40
+ 3. 读取结果中的 `compatibility_mode`:
41
+ - `NATIVE`:原生本体产物。
42
+ - `ADAPTED_V2`:当前 SDD v2 产物已无损适配。
43
+ - `LEGACY_MATERIALIZED`:历史产物已生成旁路身份,需审核候选合并。
44
+ - `EVIDENCE_ONLY`:结构不足,只入证据,不发布本体事实。
45
+ 4. 执行本地校验:
46
+
47
+ ```bash
48
+ node skywalk-sdd/ontology/cli.cjs validate-spec-ontology \
49
+ --file=openspec/changes/<change-key>/ontology/spec-ontology.json
50
+ ```
51
+
52
+ 5. 上传本身会自动物化并确认。重复锚点按来源拆开,非法或冲突的 UUID 改成稳定派生身份,依赖成环和归档版本不一致只记入转换说明。不要向用户复述这些诊断,不要要求用户选择合并或补 UUID。完成后直接入库并用 spec-generation 召回验证。
53
+ 6. 仅当用户明确要求先审阅,或正文没有任何结构化事实时,才保留 candidate。此时再运行:
54
+
55
+ ```bash
56
+ node skywalk-sdd/ontology/cli.cjs approve-spec-ontology \
57
+ --file=openspec/changes/<change-key>/ontology/spec-ontology.json
58
+ ```
59
+
60
+ 用户没有要求审阅时不要执行这一步。上传已经自动确认,不要因为重复锚点或身份改写再停下来。
61
+ 7. 通过 `opsx-kb-ingest` 打包上传。正文变化时重新物化并自动确认。已确认本体与当前 Markdown 不一致时不沿用旧确认。
62
+ 8. 通过 `context-client.cjs --mode=spec-generation` 执行一次召回验证。向用户只报告是否入库、是否召回到 current 事实。自动改写过的身份、拆开的重复锚点、忽略的成环和归档差异写在命令输出里,不单独向用户确认。
63
+
64
+ ## 完成后的简报
65
+
66
+ 只向用户说明入库和召回结果。下面这些由工具自动处理,不列入需要用户决定的事项:
67
+
68
+ ```text
69
+ 兼容模式:LEGACY_MATERIALIZED
70
+ 已发布事实:12
71
+ 自动改写身份:3
72
+ 重复锚点已拆分:1
73
+ 归档/成环已忽略:2
74
+ 仅证据:0
75
+ ```
76
+
77
+ 若 KB 不可用,保留已物化产物并标记 `remoteContextVerified=false`;本地编写可继续,入库与发布状态明确为未完成。
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: opsx-ontology-query
3
3
  description: >-
4
- Queries the Engineering KB ontology via API Key (context search, match-requirement,
4
+ Queries the Engineering KB ontology via API Key (Spec-generation context, search, continuity,
5
5
  entity/impact/ontology-view). Prompts for API key and multi-selects spaces/KBs into
6
6
  local skill state. Use when looking up Spec/design facts, Spec reuse, impact, or
7
7
  citation-backed answers from the ontology KB.
@@ -64,7 +64,8 @@ Task Progress:
64
64
  |------|------|
65
65
  | 开放问题 / 相似事实 | `POST …/context/search` |
66
66
  | Continuity / 按外部需求号定位身份 | `POST …/entities/resolve` |
67
- | Spec 复用 / 转换 | `POST …/context/match-requirement` |
67
+ | Spec 生成上下文 | `POST …/context/spec-generation` |
68
+ | 旧服务端兼容 | `POST …/context/match-requirement` |
68
69
  | 对象详情 | `GET …/entities/{id}/current-version` |
69
70
  | 一跳结构 | `GET …/entities/{id}/ontology-view` |
70
71
  | 多跳影响 | `GET …/entities/{id}/impact` |
@@ -76,7 +77,7 @@ Task Progress:
76
77
  **机器意图(SDD 流程 Agent)**:
77
78
 
78
79
  - Continuity(只要身份)→ 优先 `entities/resolve`
79
- - Spec 复用 → `context/match-requirement`,带 external 与/或 `entityId`
80
+ - Spec 复用 → `context/spec-generation`,带 external 与/或 `entityId`;只有端点 404 时退回 `match-requirement`
80
81
  - **KB 可用时禁止**扫描消费方本地 `archive/` 目录当跨迭代继承源;entity-id 必须来自 KB resolve by canonicalKey。KB degraded 时 archive 仅作背景参考,不自动继承身份;保留已有草稿基线,发布前再在线核对
81
82
 
82
83
  命中时关注:`resolution=LINK_EXISTING` 且 `inheritanceAllowed=true`(可继承 n);`removedBindingCount`(已失效绑定 m);`matchType=HISTORICAL_ONLY` 表示仅有失效绑定,不可继承。
@@ -91,7 +92,7 @@ scenario: ^[A-Z0-9_-]+:SCN-[a-z0-9]+(-[a-z0-9]+)*-[0-9]{3}$
91
92
 
92
93
  归一化:trim;requirement/feature 段大写;SCN slug 小写。编号五律摘要:requirement/feature 由外部需求系统铸号(格式不限 REQ-/FEAT- 前缀,白名单 A-Z 0-9 - _);SCN 由 kld-sdd/opsx-spec 铸号;编号≠身份;归属权威在需求系统;历史绑定 append-only。
93
94
 
94
- > 按功能号圈能力(FEAT query)、match-requirement / resolve 完整 curl 示例与响应字段解读 → [reference.md](reference.md)。
95
+ > 按功能号圈能力(FEAT query)、spec-generation / match-requirement / resolve 完整示例与响应字段解读 → [reference.md](reference.md)。
95
96
 
96
97
  ## 输出模板
97
98
 
@@ -154,7 +154,20 @@ curl -sS -X POST "$API/v1/spaces/$SPACE_ID/knowledge-bases/$KB_ID/entities/resol
154
154
 
155
155
  > 此查询只作范围参考,不改变 Continuity 判定优先级。
156
156
 
157
- ## context/match-requirement
157
+ ## context/spec-generation(推荐)
158
+
159
+ `POST {base}/context/spec-generation`
160
+
161
+ 返回面向 Spec 生成的结构化上下文:`matchedCapabilities` / `matchedScenarios` / `businessObjects` / `rules` / `specPatterns` / `answeredFacts` / `clarificationQuestions` / `evidence`。
162
+
163
+ ```bash
164
+ node skywalk-sdd/context-client.cjs --mode=spec-generation \
165
+ --query="用户登录与会话" --target-stage=spec
166
+ ```
167
+
168
+ 若服务端返回 404,客户端自动调用旧 `match-requirement`,并返回 `compatibilityMode=LEGACY_V2`。鉴权失败、超时和服务错误不会伪装成兼容回退。
169
+
170
+ ## context/match-requirement(旧协议)
158
171
 
159
172
  `POST {base}/context/match-requirement`
160
173
 
@@ -268,7 +268,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" --mode=resolve \
268
268
 
269
269
  **以 `openspec-templates/proposal.md` 的结构为骨架**,填充内容到 `outputPath`。
270
270
 
271
- **【质量红线】生成文档必须严格遵循模板结构。**
271
+ **【质量红线】保留模板中解析必需的字段、身份、锚点和关系,按实际变更保留相关章节,不机械复制无关空表和说明。**
272
272
 
273
273
  ### 10. 质量红线自检
274
274
 
@@ -8,6 +8,7 @@
8
8
  - 用户已要求“完成这个需求”“实现并验证”或连续处理时,在授权范围内加载下一阶段技能并继续,Simple / Full 均适用,不反复索要阶段口令。要求“完善文档”不授权实现代码。
9
9
  - 连续推进仍按依赖完成文档、check、apply 和测试;check 未通过不得冒充通过。归档、入库、合并、推送、部署按用户授权分别判断,不能从“实现”推导为已授权发布。
10
10
  - 只在业务目标或验收口径存在实质歧义、多个身份无法判定、真实冲突或新增外部副作用需要授权时询问。先读取用户提供的材料与现有代码,集中提出缺失事实,不把 mode、UUID、内部枚举当作业务问题。
11
+ - 同一轮发现多个冲突或待决策项时,合并成一份清单一次问完(含各自选项与建议),不逐个打断用户。
11
12
  - 自动选择文档形态和测试策略并简短说明理由;沿用已有变更的设置,不因这次默认规则重排存量目录。
12
13
  - 只展示业务差异、必要决策、验证结果和剩余问题。遥测、身份分配、结构化 JSON 由工具和 Agent 维护,不让用户手填,不把自动推断伪记为用户确认。
13
14
 
@@ -26,3 +27,11 @@
26
27
  - 当前 Markdown 身份块和归档格式继续兼容;本规则不声称已经把业务身份迁移到 sidecar。新 ID 由工具生成,旧 ID 不批量改写。
27
28
  - 任务按可验证的行为或交付单元组织,保留依赖和验收,避免按每五分钟、每个字段或每次命令机械拆分。规模以实际风险和依赖判断,不能用估计的工时冒充质量证明。
28
29
  - 默认聚焦当前 Capability;确有跨能力依赖时允许读取相关契约,注明依赖来源,避免全量加载或混写其他能力。多仓各自保留 Git 提交事实,共享 Spec 的关联由工具处理。
30
+
31
+ ## 文档只保留真实决策与契约
32
+
33
+ - 模板用于提示需要考虑的内容,必须保留解析字段、身份、锚点和引用关系;不为填满模板复制教程、空表、重复背景或不适用章节。简单变更直接表达目的、行为、验收、设计决定和可验证任务。
34
+ - 已有全局契约用引用复用;Spec 写行为,Design 只补实现决策,Task 只写交付单元、依赖和验收,不在四份文档重复同一解释。
35
+ - ⛔ 修改已有 SDD 文档禁止整文件覆写(Write 全文重写会冲掉前次修复);必须用 Edit 定向修改或章节末尾追加。仅用户明确要求重构文档结构时例外。
36
+ - 参数边界可用表驱动验收和测试;只有行为、依赖或交付确实不同才拆任务。若项目明确采用 TDD,保留真实 RED→GREEN 证据与顺序,不机械按每个字段或输入值生成一整套任务。
37
+ - Check 的结构合法性由程序负责,模型聚焦业务覆盖与矛盾;结果按实际检查项输出,由 check-record 计算记账字段。
@@ -115,10 +115,11 @@ openspec list
115
115
  **【默认尝试】工程 Spec 知识库上下文(场景身份主战场)**:
116
116
 
117
117
  1. **先加载依赖技能**:确认 `${AGENT_SKILL_DIR}/opsx-ontology-query/SKILL.md` 存在并 Read;使用已有 API Key / target(`kb-state.json`);未配置或未安装仅跳过远程查询,继续正文编写。
118
- 2. 读取 proposal Continuity。对**当前 Capability** 各调一次(「全部」= 循环 N 次,不是一次大查询)——优先走 **`opsx-ontology-query`** 的 `match-requirement`;薄封装仅作参数拼装:
118
+ 2. 读取 proposal Continuity。对**当前 Capability** 各调一次(「全部」= 循环 N 次,不是一次大查询)——优先走 **`opsx-ontology-query`** 的 `spec-generation`;服务端暂未支持时薄封装才退回 `match-requirement` 并标记 `LEGACY_V2`:
119
119
 
120
120
  ```bash
121
121
  node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" \
122
+ --mode=spec-generation \
122
123
  --query="<当前 Capability 的自然语言需求>" \
123
124
  --target-stage=spec \
124
125
  --entity-id="<该 CAP 的 entity_id>" \
@@ -141,7 +142,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" \
141
142
  3. removed 号是墓碑:永不复用、永不重排;序号达 999 → 硬错误,回需求系统拆分需求,不扩位。
142
143
  4. 写完立即用 `cli.cjs external-key --validate … --type scenario` 校验;需求编号前缀必须 ∈ proposal `requirement-refs`。
143
144
  - 场景级「同 SCN key + 同锚点、不同 entity_id」当场问 A/B/C;未决不得进入下一 CAP / design。决议追加到 `ontology/continuity-resolution.json` 的 `scenarios[]`;决议中的 `externalKey` 必须是归一化形态。
144
- - 优先消费 `reuseBundles[].statements`;`designElements` 只作理解上下文,不能写成 Spec 的 How。
145
+ - 优先消费 `matchedCapabilities` / `matchedScenarios` / `businessObjects` / `rules` / `specPatterns`;兼容返回时再读 `reuseBundles[].statements`。`designElements` 只作理解上下文,不能写成 Spec 的 How。
145
146
  - 所有知识库内容均为 advisory;与用户确认 / proposal 冲突时以当前确认与 proposal 为准。
146
147
  - **禁止**铸/改外部需求/功能编号;**禁止**自动重排/回收 SCN。
147
148
 
@@ -181,6 +182,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" \
181
182
  **输出路径**:`changes/<name>/specs/<capability>/spec.md`
182
183
 
183
184
  **【质量红线】需求项格式要求**:
185
+ - 业务对象使用 `#### 业务对象:[OBJ-*]`,只描述影响规则或场景的稳定业务概念;没有明确对象时不强行创建
184
186
  - 需求项使用 `####`(4个#)
185
187
  - 场景使用 `#####`(5个#)
186
188
 
@@ -209,7 +211,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" \
209
211
  ## 本体语义生成契约
210
212
 
211
213
  - 写入 `capability-id: CAP-<CAPABILITY>`,且必须引用 proposal 中真实存在的 CAP ID。
212
- - 新需求、场景和约束分别使用 `STMT-*`、`AC-*`、`CON-*`;分配规则是同前缀同 Capability 当前最大序号 + 1。
214
+ - 业务对象、需求、场景和约束分别使用 `OBJ-*`、`STMT-*`、`AC-*`、`CON-*`;分配规则是同前缀同 Capability 当前最大序号 + 1。
213
215
  - 修改已有实体必须复用原 ID;删除实体只写 removal 语义,不得把编号分配给新实体。
214
216
  - `added` 必须调用 `semantic-identity --delta-state=added` 生成新的实体 UUID 和版本 UUID;禁止通过复制另一需求的 UUID 创建新实体。
215
217
  - `modified/removed` 保留已明确的 `entity-id` 和真实 `predecessor-version`;在线解析当前版本后由工具分配版本。离线可以继续正文,未确认的远程身份登记为待核对,发布前解决;不能从相似归档复制 UUID 或把最新版本编号直接当作实际编辑基线。
@@ -147,7 +147,7 @@ Simple 模式或单文件能力域下,**不要拆成多个同文件任务**。
147
147
 
148
148
  ### 6. 【交互引导】确认任务拆解策略
149
149
 
150
- 向用户确认拆解维度、任务粒度、预计 DAG 层级。**根据 test-strategy 调整 DAG 生成规则**,规则表(tdd / impl-first / none 对应的 DAG 生成规则)见 `./reference.md`「§6 DAG 生成规则表」。
150
+ 依据已授权需求和真实依赖选择拆解维度、任务粒度与 DAG;只就业务歧义询问。**根据 test-strategy 调整 DAG 生成规则**,规则表(tdd / impl-first / none 对应的 DAG 生成规则)见 `./reference.md`「§6 DAG 生成规则表」。
151
151
 
152
152
  **当 test-strategy=tdd 时,必须向用户说明:**
153
153
  > "🧪 TDD 模式将采用红绿重构循环:
@@ -171,7 +171,7 @@ Simple 模式或单文件能力域下,**不要拆成多个同文件任务**。
171
171
  **当 test-strategy=tdd 时,任务生成规则:**
172
172
 
173
173
  ⛔ 核心规则(inline):
174
- 1. 每个场景拆为一个行为点,每个行为点生成一对 RED+GREEN 任务
174
+ 1. 同一行为的输入边界合并为表驱动场景;按独立行为生成 RED+GREEN 任务,保留所有验收变体
175
175
  2. RED 验收标准必须包含"测试运行失败且失败原因正确"
176
176
  3. GREEN 验收标准必须包含"写最少代码让对应 RED 测试通过",禁止捆绑
177
177
  4. GREEN 不得包含未测试的 Controller/Filter/Config
package/index.js DELETED
@@ -1,13 +0,0 @@
1
- /**
2
- * SDD OpenSpec Init - 项目初始化工具
3
- *
4
- * 提供程序化 API 接口
5
- */
6
-
7
- const { main, detectTools, applyTeamConfig } = require('./lib/init');
8
-
9
- module.exports = {
10
- main,
11
- detectTools,
12
- applyTeamConfig
13
- };