kld-sdd 2.5.1 → 2.5.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.
package/README.md CHANGED
@@ -1,12 +1,87 @@
1
1
  # kld-sdd
2
2
 
3
- KLD SDD OpenSpec 项目初始化工具 - 一键初始化 AI 编辑器技能,支持完整的 SDD(规格驱动开发)研发工作流。
3
+ KLD SDD OpenSpec 工程增强工具:一键初始化 AI 编辑器技能、语义化文档模板和本地本体运行时,支持完整的 SDD(规格驱动开发)研发工作流。
4
4
 
5
5
  ## 这是什么?
6
6
 
7
7
  **SDD(Specification-Driven Development)** 是一种以文档链驱动 AI 编码的研发方法:先写清楚"要做什么",再让 AI 去实现,避免 AI 乱猜、反复返工。
8
8
 
9
- `kld-sdd` 帮你在项目中一键配置好这套工作流所需的全部 AI 技能,支持 **Cursor、Claude Code、CodeBuddy、Qoder、OpenCode、KunlunZhima、WorkBuddy、Codex** 等编辑器。
9
+ `kld-sdd` 帮你在项目中一键配置好这套工作流所需的全部 AI 技能,支持 **Cursor、Claude Code、CodeBuddy、Qoder、OpenCode、KunlunZhima、WorkBuddy、Codex** 等编辑器。新模板和 Skills 会在产物生成时写入稳定编号与显式关系;本地运行时负责解析、对账和校验这些关系。
10
+
11
+ ## 本体语义闭环
12
+
13
+ KLD-SDD 当前内置三项语义能力:
14
+
15
+ 1. 定义 Change、Capability、STMT、AC、Constraint、Design、Task、Artifact、DocumentSection、OntologySnapshot 的最小本体 Schema。
16
+ 2. 通过模板和 Skills 在产物生成时产生 `CHG/CAP/STMT/AC/CON/DES/TASK` 编号和显式引用。
17
+ 3. 将 Proposal→Spec→Design→Task 解析为本地工作态实例,并在 Check/Archive 阶段校验和固化。
18
+
19
+ 关系链示例:
20
+
21
+ ```text
22
+ CHG contains CAP
23
+ CAP contains STMT
24
+ STMT acceptedBy AC
25
+ STMT constrainedBy CON
26
+ DES realizes STMT
27
+ TASK implements DES / covers STMT / dependsOn TASK
28
+ ART declares Entity
29
+ Entity sourcedFrom SEC
30
+ ```
31
+
32
+ 每个本体实体使用双层身份:
33
+
34
+ - `anchor`:`STMT-ORDER-005` 等人工可读编号,跨迭代保持稳定且删除后不复用。
35
+ - `entity-id`:全局唯一 UUIDv7,同一逻辑实体跨迭代复用。
36
+ - `version-id`:全局唯一 UUIDv7,每次 added/modified/removed 产生新版本;unchanged 复用历史版本。
37
+ - `predecessor-version`:modified/removed 指向同一实体的直接前序版本。
38
+
39
+ UUID 由本地命令生成,不依赖网络、机器号或中央 ID 服务:
40
+
41
+ ```bash
42
+ node skywalk-sdd/log.cjs semantic-identity --delta-state=added
43
+ node skywalk-sdd/log.cjs semantic-identity --delta-state=modified --entity-id=<uuid> --predecessor-version=<uuid>
44
+ node skywalk-sdd/log.cjs semantic-identity --delta-state=unchanged --entity-id=<uuid> --version-id=<uuid>
45
+ ```
46
+
47
+ 项目级校验会同时扫描活动 Change 和 confirmed Archive:不同实体误用同一 UUID、同一版本 UUID 对应不同内容、modified/removed 前序版本断链或同 predecessor 并行分叉都会阻断 Check/Archive。Archive 只有在 manifest、正文 `facts_hash` 与 confirmed snapshot 一致时,才可成为继承来源。
48
+
49
+ 跨迭代 unchanged 不复制历史原文。当前 Spec 只保存实体 UUID、版本 UUID、来源路径、来源内容哈希和需要保留的显式关系;运行时从唯一 confirmed Archive 解析这些引用,与本次差量组成 Effective Graph。modified 实体也不会自动继承前序全部关系,未显式列入 inherited relations 的历史关系不会进入新版本。
50
+
51
+ 当前工作态 Schema 为 `kld-sdd-ontology/v2`。完全没有语义锚点的旧自由文本仍可读取,但已包含 CHG/CAP/STMT/AC/CON/DES/TASK 锚点的 v1 产物需要补齐 UUID 身份字段后才能通过 v2 Check/Archive,避免工具在迁移时猜测实体身份。
52
+
53
+ 本地命令:
54
+
55
+ ```bash
56
+ # 解析与诊断;首次运行会为 Artifact/DocumentSection 分配并持久化结构 UUIDv7 sidecar
57
+ node skywalk-sdd/log.cjs semantic-scan --project=. --change=<name>
58
+
59
+ # 文件与工作态本体实例全量对账
60
+ node skywalk-sdd/log.cjs semantic-reconcile --project=. --change=<name>
61
+
62
+ # 按 simple/full/strict 校验;通过时标记 pending
63
+ node skywalk-sdd/log.cjs semantic-check --project=. --change=<name> --profile=full
64
+
65
+ # 查看工作态实例
66
+ node skywalk-sdd/log.cjs semantic-status --project=. --change=<name>
67
+
68
+ # 可选的文件变化采集与同步
69
+ node skywalk-sdd/log.cjs semantic-observe --project=. --change=<name>
70
+ ```
71
+
72
+ `semantic-observe` 不是 Hook 替代品:它不能阻止 Cursor、Qoder 或人工编辑,也不能在落盘前控制内容。Observer 启动/重启后会重新对账,暂态失败和锁冲突不会推进文件指纹;Check 和 Archive 始终重新执行 `semantic-reconcile`,以处理重复、乱序或丢失的文件事件。
73
+
74
+ 校验 profile:
75
+
76
+ | Profile | 阻断规则 |
77
+ |---|---|
78
+ | `simple` | 强制 STMT→AC;Design/Task 不存在时跳过 |
79
+ | `full` | 强制 STMT→AC→Design→Task 全链和 Task DAG |
80
+ | `strict` | 在 full 基础上要求完整语义来源 |
81
+
82
+ 同一 Change 的 observe/reconcile/check/archive 共用跨进程事务锁。工作态按 revision 目录一次性提交,再原子切换 `current.json`,读取时会拒绝 working/diagnostics/file-index 的 revision 撕裂。
83
+
84
+ Archive 使用两阶段事务:先复制到 staging,从 staging 重新解析正文并生成 manifest、Spec 投影和带 UUIDv7 `OntologySnapshot` 实体的 `archive-ontology.json`,所有步骤成功后才切换为正式 archive。语义校验、快照、manifest 或 Spec 同步失败时,活动 Change 会保留或恢复,不留下伪 confirmed 半成品。
10
85
 
11
86
  ## 快速开始
12
87
 
@@ -38,9 +113,9 @@ opsx-propose → opsx-spec → opsx-design → opsx-task → opsx-check
38
113
  **AI 会做什么**:
39
114
  - 如果你没说清楚,AI 会主动问你 4 个问题(痛点/目标/影响模块/约束)
40
115
  - 推导出变更的 kebab-case 名称,如 `add-user-auth`
41
- - 生成 `propose.md` 并展示摘要让你确认
116
+ - 生成 `proposal.md` 并展示摘要让你确认
42
117
 
43
- **产出**:`openspec/changes/<name>/propose.md`
118
+ **产出**:`openspec/changes/<name>/proposal.md`
44
119
 
45
120
  ---
46
121
 
@@ -51,7 +126,7 @@ opsx-propose → opsx-spec → opsx-design → opsx-task → opsx-check
51
126
  **这是代码生成的唯一依据,必须精确无歧义。**
52
127
 
53
128
  **AI 会做什么**:
54
- - 读取 propose.md,检查上下文是否完整
129
+ - 读取 proposal.md,检查上下文是否完整
55
130
  - 发现模糊描述时主动追问(如"高性能"→ 具体 QPS/RT 是多少?)
56
131
  - 向你确认 API 范围、性能指标、安全要求后,生成 `spec.md`
57
132
 
@@ -98,7 +173,7 @@ opsx-propose → opsx-spec → opsx-design → opsx-task → opsx-check
98
173
  - 100% 覆盖 design.md 的每个模块和接口
99
174
  - 每个任务有明确验收标准和单测要求
100
175
 
101
- **产出**:`openspec/changes/<name>/task.md`
176
+ **产出**:Full 模式为 `openspec/changes/<name>/specs/<capability>/tasks.md`,Simple 模式为根目录 `tasks.md`
102
177
 
103
178
  ---
104
179
 
@@ -114,6 +189,7 @@ opsx-propose → opsx-spec → opsx-design → opsx-task → opsx-check
114
189
  | 完整性 | 4 个文档是否存在,每个文档章节是否完整 |
115
190
  | 一致性 | spec 的 API 在 design 中是否有对应方案;各文档字段命名是否一致 |
116
191
  | 可执行性 | task 的每个任务是否可独立执行;验收标准是否可验证 |
192
+ | 本体追溯 | 编号是否唯一,STMT/AC/DES/TASK 关系是否完整,Task DAG 是否成环 |
117
193
 
118
194
  **发现问题时**,AI 会列出严重问题和警告,并提供三种处理方式供你选择。
119
195
 
@@ -176,10 +252,21 @@ kld-sdd-init --tool codex # 仅配置 Codex
176
252
  ```
177
253
  your-project/
178
254
  ├── openspec-templates/ # openSpec 四文档参考模版
179
- │ ├── propose.md
255
+ │ ├── proposal.md
180
256
  │ ├── spec.md
181
257
  │ ├── design.md
182
- │ └── task.md
258
+ │ └── tasks.md
259
+ ├── skywalk-sdd/
260
+ │ ├── log.cjs # Telemetry + semantic-* 命令入口
261
+ │ ├── ontology/ # 本地本体解析、校验、观察和对账运行时
262
+ │ └── state/ontology/
263
+ │ ├── .locks/<change>.lock # observe/reconcile/check/archive 跨进程锁
264
+ │ └── <change>/
265
+ │ ├── current.json # 当前 revision 原子指针
266
+ │ └── revisions/<revision>/
267
+ │ ├── working-ontology.json
268
+ │ ├── diagnostics.json
269
+ │ └── file-index.json
183
270
  ├── .cursor/
184
271
  │ └── skills/opsx-*/ # SDD skills(扁平一层)
185
272
  ├── .claude/
@@ -810,7 +810,7 @@ npx kld-sdd">复制</button>
810
810
  <li>安装 CLI:<code>npm install -g @tencent-ai/codebuddy-code</code></li>
811
811
  <li>在项目目录运行 <code>codebuddy</code>,企业环境选择 Enterprise Domain 登录</li>
812
812
  <li>输入 <code>/opsx-propose &lt;变更名&gt;</code> 开始 SDD;<code>/skills</code> 查看已加载技能</li>
813
- <li>初始化后运行 <code>/hooks</code> 审核 SDD Hook Pack,审批后门禁生效</li>
813
+ <li>SDD Hook Pack 已随初始化自动生效(lint / 测试 / 危险命令门禁),无需额外配置</li>
814
814
  </ol>
815
815
  <div class="cmd">/opsx-propose add-user-auth</div>
816
816
  <p class="note">项目 Skills 在 <code>.codebuddy/skills/</code>,上下文文件为 <code>CODEBUDDY.md</code>。Windows 可用 <code>Alt+M</code> 切换权限模式;Hooks 比 Prompt 更可靠,适合 lint/test 门禁。</p>
package/lib/init.js CHANGED
@@ -531,7 +531,7 @@ function deployProfileArtifacts(selectedTools = Object.keys(TOOL_CONFIGS), cwd =
531
531
  if (!hookResult.ok) {
532
532
  throw new Error(hookResult.error || `CodeBuddy Hook 部署失败: ${profile.configDir}/settings.json`);
533
533
  }
534
- console.log(` ✓ ${config.name}: 部署 Hook Pack(运行 /hooks 审核后生效)`);
534
+ console.log(` ✓ ${config.name}: 部署 Hook Pack(自动生效)`);
535
535
  }
536
536
 
537
537
  if (profile.hookProvider === 'claude') {
@@ -830,6 +830,15 @@ function deployTelemetryDataDir() {
830
830
  console.log(` ⚠️ Telemetry CLI 源文件缺失: ${telemetrySrc}`);
831
831
  }
832
832
 
833
+ const ontologySrc = path.join(pkgPath, 'skywalk-sdd', 'ontology');
834
+ const ontologyDst = path.join(dataDir, 'ontology');
835
+ if (fs.existsSync(ontologySrc)) {
836
+ copyDir(ontologySrc, ontologyDst);
837
+ console.log(' ✓ 部署 skywalk-sdd/ontology/(本地本体语义运行时)');
838
+ } else {
839
+ console.log(` ⚠️ 本体语义运行时缺失: ${ontologySrc}`);
840
+ }
841
+
833
842
  const worktreeFinishSrc = path.join(pkgPath, 'skywalk-sdd', 'apply-worktree-finish.cjs');
834
843
  const worktreeFinishDst = path.join(dataDir, 'apply-worktree-finish.cjs');
835
844
  if (fs.existsSync(worktreeFinishSrc)) {
@@ -837,7 +846,7 @@ function deployTelemetryDataDir() {
837
846
  console.log(' ✓ 部署 skywalk-sdd/apply-worktree-finish.cjs(Apply 收尾脚本)');
838
847
  }
839
848
 
840
- console.log(' ✓ 调用方式: node skywalk-sdd/log.cjs start|end|metrics');
849
+ console.log(' ✓ 调用方式: node skywalk-sdd/log.cjs start|end|metrics|semantic-identity|semantic-reconcile|semantic-check');
841
850
  console.log(' ✓ Apply worktree: record-base 在 §1.5;收尾 apply-worktree-finish.cjs --change=<name>');
842
851
  console.log('✅ Telemetry 已就绪(数据存储在 skywalk-sdd/,无需配置 MCP)');
843
852
  return true;
@@ -1111,7 +1120,7 @@ async function main() {
1111
1120
  console.log(' ℹ️ KunlunZhima 通过 commands/skills 入口使用 SDD,未启用自动 Hook');
1112
1121
  }
1113
1122
  if (selectedTools.includes('codebuddy')) {
1114
- console.log(' 🪝 .codebuddy/hooks/ # CodeBuddy SDD Hook Pack(运行 /hooks 审核后生效)');
1123
+ console.log(' 🪝 .codebuddy/hooks/ # CodeBuddy SDD Hook Pack(自动生效)');
1115
1124
  }
1116
1125
  if (selectedTools.includes('claude')) {
1117
1126
  console.log(' 🪝 .claude/hooks/ # Claude Code SDD Hook Pack(可选增强)');
@@ -1142,7 +1151,7 @@ async function main() {
1142
1151
  console.log(' 3. 激活 opsx-check 验证文档质量');
1143
1152
  console.log(' 4. 激活 opsx-apply 申请实施,opsx-archive 归档完成');
1144
1153
  if (selectedTools.includes('codebuddy')) {
1145
- console.log(' 5. CodeBuddy 用户:重启会话后运行 /hooks 审核 SDD Hook,审批后门禁生效');
1154
+ console.log(' 5. CodeBuddy 用户:SDD Hook Pack 已随初始化自动部署,门禁自动生效,无需手动配置');
1146
1155
  }
1147
1156
  if (selectedTools.includes('kunlunzhima')) {
1148
1157
  console.log(' 5. KunlunZhima 用户:在 Craft 模式使用 /opsx:propose 等 OPSX 命令(.kunlunzhima/commands/opsx/)');
@@ -62,7 +62,7 @@ const TOOL_PROFILES = Object.freeze({
62
62
  rulesWiring: 'none',
63
63
  templateVariables: {
64
64
  SKILL_RUNTIME_DIR: '.codebuddy/skills',
65
- HOOK_GATE_DESCRIPTION: 'CodeBuddy CLI 已部署 SDD Hook Pack(.codebuddy/hooks + settings.json);运行 /hooks 审核后生效。',
65
+ HOOK_GATE_DESCRIPTION: 'CodeBuddy CLI 已部署 SDD Hook Pack(.codebuddy/hooks + settings.json),初始化后自动生效。',
66
66
  SHELL_GUIDANCE: 'CodeBuddy Hooks 在 Windows 上通过 Git Bash 执行;命令使用 node "$CODEBUDDY_PROJECT_DIR/..." 引用项目路径。',
67
67
  },
68
68
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kld-sdd",
3
- "version": "2.5.1",
3
+ "version": "2.5.2",
4
4
  "description": "KLD SDD OpenSpec 项目初始化工具 - 一键部署 SDD skills",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  "kld-sdd-init": "bin/kld-sdd-init.js"
9
9
  },
10
10
  "scripts": {
11
- "test": "node test/validate-skills-bundle.cjs && node test/tool-profiles.cjs && node test/settings-merge.cjs && node test/command-bridge.cjs && node test/codebuddy-hooks.cjs && node test/skill-content-contract.cjs && node test/init-agent-profiles.cjs"
11
+ "test": "node test/ontology-release-blockers.cjs && node test/ontology-semantic-core.cjs && node test/ontology-identity-versioning.cjs && node test/ontology-state-transaction.cjs && node test/ontology-process-concurrency.cjs && node test/ontology-observer-convergence.cjs && node test/ontology-working-runtime.cjs && node test/ontology-template-contract.cjs && node test/ontology-cli-archive.cjs && node test/validate-skills-bundle.cjs && node test/tool-profiles.cjs && node test/settings-merge.cjs && node test/command-bridge.cjs && node test/codebuddy-hooks.cjs && node test/skill-content-contract.cjs && node test/init-agent-profiles.cjs"
12
12
  },
13
13
  "keywords": [
14
14
  "kld",
@@ -32,6 +32,7 @@
32
32
  "templates/",
33
33
  "kld-sdd-guide.html",
34
34
  "skywalk-sdd/index.cjs",
35
+ "skywalk-sdd/ontology/",
35
36
  "skywalk-sdd/apply-worktree-finish.cjs",
36
37
  "README.md"
37
38
  ]