kld-sdd 2.6.12 → 2.6.14

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 (91) hide show
  1. package/README.md +29 -7
  2. package/kld-sdd-guide.html +428 -159
  3. package/lib/init.js +37 -7
  4. package/package.json +5 -2
  5. package/skywalk-sdd/index.cjs +2668 -415
  6. package/skywalk-sdd/metrics-v3.cjs +1153 -0
  7. package/skywalk-sdd/ontology/archive-package.cjs +120 -3
  8. package/skywalk-sdd/ontology/identity-index.cjs +9 -2
  9. package/skywalk-sdd/ontology/ontology-paths.cjs +73 -0
  10. package/skywalk-sdd/ontology/resolve-spec-root.cjs +20 -80
  11. package/skywalk-sdd/ontology/runtime.cjs +32 -22
  12. package/skywalk-sdd/ontology/structural-identity.cjs +11 -2
  13. package/skywalk-sdd/ontology/traceability-validator.cjs +16 -8
  14. package/skywalk-sdd/ontology/working-artifacts.cjs +4 -2
  15. package/skywalk-sdd/reporting/change-report-model.cjs +309 -0
  16. package/skywalk-sdd/reporting/change-report-renderer.cjs +425 -0
  17. package/skywalk-sdd/runtime-metadata.cjs +21 -0
  18. package/templates/hooks/claude/hooks/sdd-apply-test-gate.cjs +39 -9
  19. package/templates/hooks/claude/hooks/sdd-post-tool.cjs +87 -8
  20. package/templates/hooks/claude/hooks/sdd-prompt.cjs +3 -1
  21. package/templates/hooks/codebuddy/hooks/sdd-apply-test-gate.cjs +39 -9
  22. package/templates/hooks/codebuddy/hooks/sdd-post-tool.cjs +87 -9
  23. package/templates/hooks/codebuddy/hooks/sdd-prompt.cjs +3 -1
  24. package/templates/skills/kld-sdd/opsx-apply/SKILL.md +14 -13
  25. package/templates/skills/kld-sdd/opsx-apply/checklist.md +20 -20
  26. package/templates/skills/kld-sdd/opsx-apply/implementer-prompt.md +12 -12
  27. package/templates/skills/kld-sdd/opsx-apply/reference.md +32 -31
  28. package/templates/skills/kld-sdd/opsx-archive/SKILL.md +44 -6
  29. package/templates/skills/kld-sdd/opsx-archive/checklist.md +5 -2
  30. package/templates/skills/kld-sdd/opsx-check/SKILL.md +21 -13
  31. package/templates/skills/kld-sdd/opsx-check/checklist.md +8 -7
  32. package/templates/skills/kld-sdd/opsx-design/SKILL.md +1 -1
  33. package/templates/skills/kld-sdd/opsx-design/checklist.md +1 -1
  34. package/templates/skills/kld-sdd/opsx-kb-ingest/SKILL.md +14 -0
  35. package/templates/skills/kld-sdd/opsx-ontology-query/SKILL.md +31 -0
  36. package/templates/skills/kld-sdd/opsx-propose/SKILL.md +12 -4
  37. package/templates/skills/kld-sdd/opsx-propose/reference.md +29 -3
  38. package/templates/skills/kld-sdd/opsx-rules/reference.md +3 -1
  39. package/templates/skills/kld-sdd/opsx-spec/SKILL.md +2 -2
  40. package/templates/skills/kld-sdd/opsx-spec/checklist.md +1 -1
  41. package/templates/skills/kld-sdd/opsx-task/SKILL.md +10 -10
  42. package/templates/skills/kld-sdd/opsx-task/checklist.md +3 -3
  43. package/templates/skills/kld-sdd/opsx-task/reference.md +3 -3
  44. package/templates/skills/kld-sdd/opsx-test/SKILL.md +7 -5
  45. package/templates/skills/kld-sdd/{opsx-tdd-anti-patterns → tdd-anti-patterns}/SKILL.md +4 -4
  46. package/templates/skills/kld-sdd/{opsx-tdd-anti-patterns → tdd-anti-patterns}/reference.md +4 -4
  47. package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/SKILL.md +13 -13
  48. package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/checklist.md +5 -5
  49. package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/reference.md +12 -12
  50. package/templates/skills/kld-sdd/{opsx-tdd-metrics → tdd-metrics}/SKILL.md +3 -3
  51. package/templates/skills/kld-sdd/{opsx-tdd-metrics → tdd-metrics}/checklist.md +2 -2
  52. package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/SKILL.md +2 -2
  53. package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/parameterized-testing.md +1 -1
  54. package/templates/skills/kld-sdd/{opsx-tdd-review → tdd-review}/SKILL.md +5 -5
  55. package/templates/skills/kld-sdd/{opsx-tdd-review → tdd-review}/checklist.md +5 -5
  56. package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/SKILL.md +3 -3
  57. package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/non-tdd-modules.md +1 -1
  58. package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/refactor-checklist.md +1 -1
  59. package/templates/skills/kld-sdd/tdd-rules/rules/test-skeleton-telemetry.md +19 -0
  60. package/templates/skills/kld-sdd/opsx-tdd-rules/rules/test-skeleton-telemetry.md +0 -19
  61. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/cause-effect-clarity.md +0 -0
  62. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/clean-test-data.md +0 -0
  63. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/existing-test-awareness.md +0 -0
  64. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/given-when-then.md +0 -0
  65. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/good-test-qualities.md +0 -0
  66. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/mock-boundary.md +0 -0
  67. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/naming-conventions.md +0 -0
  68. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/no-logic-in-tests.md +0 -0
  69. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/one-test-one-scenario.md +0 -0
  70. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/prefer-public-apis.md +0 -0
  71. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/test-behaviors-not-methods.md +0 -0
  72. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/argument-matching.md +0 -0
  73. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/controller-test-rules.md +0 -0
  74. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/domain-service-rules.md +0 -0
  75. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/java-test-template.md +0 -0
  76. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/json-serialization.md +0 -0
  77. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/logging-rules.md +0 -0
  78. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/post-generation/compilation-verification.md +0 -0
  79. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/post-generation/execution-verification.md +0 -0
  80. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/python/py-test-template.md +0 -0
  81. /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/typescript/ts-test-template.md +0 -0
  82. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/controller-strategy.md +0 -0
  83. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/dag-generation-rules.md +0 -0
  84. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/des-step-annotation.md +0 -0
  85. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/exception-path-coverage.md +0 -0
  86. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/green-scope-declaration.md +0 -0
  87. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/green-yagni-fence.md +0 -0
  88. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/multi-validation-split.md +0 -0
  89. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/task-type-definitions.md +0 -0
  90. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/tdd-strategy-selection.md +0 -0
  91. /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/test-execution-gate.md +0 -0
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>kld-sdd · 从入门到入土 — SDD 规格驱动开发完整指南</title>
7
- <meta name="description" content="kld-sdd 完整使用指南:从 SDD 理念、安装初始化,到 11opsx 技能的完整研发工作流。">
7
+ <meta name="description" content="kld-sdd 完整使用指南:13 个可调用 opsx 技能、6TDD 配套包、本体语义闭环、工程知识库与 SkyWalk V3 提效评估。">
8
8
  <style>
9
9
  /* ─────────────────────────────────────────────────────────
10
10
  设计令牌:Terminal × Blueprint
@@ -20,7 +20,7 @@
20
20
  --border-soft:#1a2233;
21
21
  --text:#e9ecf4;
22
22
  --text-2:#a6afc4;
23
- --text-3:#6c7690;
23
+ --text-3:#8993aa;
24
24
  --accent:#5eead4;
25
25
  --accent-ink:#0a0d14;
26
26
  --accent-2:#818cf8;
@@ -65,12 +65,24 @@ body::before{
65
65
  a{color:var(--accent);text-decoration:none}
66
66
  a:hover{text-decoration:underline}
67
67
  code{font-family:var(--mono);font-size:.88em}
68
+ button,a{outline-offset:3px}
69
+ button:focus-visible,a:focus-visible{outline:2px solid var(--accent)}
70
+ .skip-link{
71
+ position:fixed;left:18px;top:12px;z-index:100;
72
+ padding:8px 12px;border-radius:8px;background:var(--accent);color:var(--accent-ink);
73
+ font-family:var(--mono);font-size:.82rem;font-weight:700;transform:translateY(-160%);
74
+ }
75
+ .skip-link:focus{transform:none;text-decoration:none}
76
+ .sr-only{
77
+ position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
78
+ clip:rect(0,0,0,0);white-space:nowrap;border:0;
79
+ }
68
80
 
69
81
  /* ─────────────────────────────────────────────────────────
70
82
  布局骨架
71
83
  ───────────────────────────────────────────────────────── */
72
84
  .wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px;position:relative;z-index:1}
73
- section{position:relative;z-index:1;padding:88px 0;border-top:1px solid var(--border-soft)}
85
+ section{position:relative;z-index:1;padding:88px 0;border-top:1px solid var(--border-soft);scroll-margin-top:72px}
74
86
  section:first-of-type{border-top:none}
75
87
  .sec-head{display:flex;align-items:baseline;gap:18px;margin-bottom:8px;flex-wrap:wrap}
76
88
  .sec-num{
@@ -220,13 +232,14 @@ header.nav{
220
232
  .stage{
221
233
  flex:1 0 auto;min-width:108px;cursor:pointer;text-align:center;
222
234
  padding:16px 10px;border-radius:var(--r-md);border:1px solid transparent;
223
- transition:all .2s;position:relative;
235
+ transition:all .2s;position:relative;background:transparent;color:inherit;font:inherit;
236
+ appearance:none;-webkit-appearance:none;
224
237
  }
225
238
  .stage:hover{background:var(--surface-2);border-color:var(--border)}
226
239
  .stage.active{background:var(--surface-3);border-color:var(--accent);box-shadow:var(--glow)}
227
240
  .stage .ic{font-size:1.4rem;margin-bottom:6px;display:block}
228
- .stage .nm{font-family:var(--mono);font-size:.82rem;font-weight:600;color:var(--text)}
229
- .stage .rl{font-size:.72rem;color:var(--text-3);margin-top:2px}
241
+ .stage .nm{display:block;font-family:var(--mono);font-size:.82rem;font-weight:600;color:var(--text)}
242
+ .stage .rl{display:block;font-size:.72rem;color:var(--text-3);margin-top:2px}
230
243
  .arrow{flex:0 0 auto;display:flex;align-items:center;color:var(--text-3);font-size:1.1rem;padding:0 2px}
231
244
  .helpers{display:flex;gap:12px;justify-content:center;margin-top:20px;flex-wrap:wrap}
232
245
  .helper{
@@ -276,6 +289,7 @@ header.nav{
276
289
  padding:4px 9px;border-radius:6px;cursor:pointer;opacity:0;transition:all .18s;
277
290
  }
278
291
  .codeblock:hover .copy{opacity:1}
292
+ .codeblock .copy:focus-visible{opacity:1}
279
293
  .codeblock .copy:hover{color:var(--accent);border-color:var(--accent)}
280
294
  .k-c{color:var(--text-3)} .k-p{color:var(--accent)} .k-s{color:var(--accent-3)} .k-f{color:var(--sky)} .k-o{color:var(--text-2)}
281
295
 
@@ -285,6 +299,7 @@ table.tbl thead th{background:var(--surface-2);font-family:var(--mono);font-size
285
299
  table.tbl tbody tr:last-child td{border-bottom:none}
286
300
  table.tbl tbody tr:hover{background:var(--surface)}
287
301
  table.tbl .yes{color:var(--green)} table.tbl .mono{font-family:var(--mono);font-size:.84rem;color:var(--accent)}
302
+ table.tbl caption{text-align:left;color:var(--text-3);font-size:.82rem;margin-bottom:8px}
288
303
 
289
304
  .tree{
290
305
  font-family:var(--mono);font-size:.85rem;line-height:1.9;color:var(--text-2);
@@ -306,6 +321,44 @@ table.tbl .yes{color:var(--green)} table.tbl .mono{font-family:var(--mono);font-
306
321
  .step .c .d{color:var(--text-2);font-size:.94rem;margin-top:2px}
307
322
  .step .c code{background:var(--surface-2);padding:1px 7px;border-radius:5px;color:var(--accent);font-size:.85rem}
308
323
 
324
+ /* 能力概览 / 指标卡 */
325
+ .callout{
326
+ margin-top:24px;padding:16px 18px;border:1px solid rgba(94,234,212,.28);
327
+ border-radius:var(--r-md);background:linear-gradient(135deg,rgba(94,234,212,.06),rgba(129,140,248,.04));
328
+ color:var(--text-2);font-size:.94rem;
329
+ }
330
+ .callout b{color:var(--text)}
331
+ .feature-grid,.metric-grid{
332
+ display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-top:28px;
333
+ }
334
+ .feature-card,.metric{
335
+ border:1px solid var(--border);border-radius:var(--r-lg);background:var(--surface);
336
+ padding:22px 24px;
337
+ }
338
+ .feature-card .eyebrow,.metric .key{
339
+ font-family:var(--mono);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;color:var(--accent);
340
+ }
341
+ .feature-card h3,.metric h4{margin:7px 0 8px;font-size:1rem}
342
+ .feature-card p,.metric p{margin:0;color:var(--text-2);font-size:.9rem}
343
+ .metric .value{font-family:var(--mono);font-size:1.18rem;font-weight:700;color:var(--text);margin:5px 0}
344
+ .metric-grid .metric:last-child{grid-column:1/-1}
345
+ .skill-pack-grid{
346
+ display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:20px;
347
+ }
348
+ .skill-pack{
349
+ border:1px solid var(--border-soft);border-radius:var(--r-md);background:var(--surface);
350
+ padding:16px 18px;
351
+ }
352
+ .skill-pack code{color:var(--accent);font-size:.8rem}
353
+ .skill-pack p{margin:7px 0 0;color:var(--text-2);font-size:.84rem;line-height:1.55}
354
+ @media (max-width:760px){
355
+ .feature-grid,.metric-grid{grid-template-columns:1fr}
356
+ .skill-pack-grid{grid-template-columns:1fr}
357
+ }
358
+ @media (max-width:640px){
359
+ .hero h1 .dim{display:block;font-size:.72em;margin-top:5px}
360
+ }
361
+
309
362
  /* 双栏角色 */
310
363
  .roles{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:30px}
311
364
  .role{border:1px solid var(--border);border-radius:var(--r-lg);padding:24px;background:var(--surface)}
@@ -358,6 +411,7 @@ table.tbl .yes{color:var(--green)} table.tbl .mono{font-family:var(--mono);font-
358
411
  font-family:var(--sans);font-size:1rem;font-weight:600;padding:18px 22px;cursor:pointer;
359
412
  display:flex;justify-content:space-between;align-items:center;gap:14px;
360
413
  }
414
+ .faq-q:hover{background:var(--surface-2)}
361
415
  .faq-q .chev{color:var(--text-3);transition:transform .2s;flex-shrink:0}
362
416
  .faq-item.open .faq-q .chev{transform:rotate(45deg);color:var(--accent)}
363
417
  .faq-a{max-height:0;overflow:hidden;transition:max-height .3s ease;color:var(--text-2);font-size:.94rem}
@@ -389,6 +443,7 @@ footer .meta .sep{color:var(--border)}
389
443
  background:var(--surface);border-bottom:1px solid var(--border);padding:12px 24px;gap:2px;
390
444
  }
391
445
  }
446
+ @media (max-width:420px){.nav-cta{display:none}}
392
447
 
393
448
  /* 窄屏:长内容表格改为可水平滚动,避免撑破 body */
394
449
  @media (max-width:720px){
@@ -397,14 +452,21 @@ footer .meta .sep{color:var(--border)}
397
452
  .tree{ font-size:.78rem }
398
453
  }
399
454
 
455
+ @media (hover:none){
456
+ .codeblock .copy{opacity:1}
457
+ }
458
+
400
459
  @media (prefers-reduced-motion:reduce){
401
460
  *{animation:none!important;transition:none!important;scroll-behavior:auto!important}
402
461
  .reveal{opacity:1;transform:none}
403
462
  }
404
463
  </style>
464
+ <noscript><style>.reveal{opacity:1;transform:none}</style></noscript>
405
465
  </head>
406
466
  <body>
407
467
 
468
+ <a class="skip-link" href="#main">跳到正文</a>
469
+
408
470
  <!-- 旅程进度轴 -->
409
471
  <div class="journey-rail" aria-hidden="true"><div class="fill" id="railFill"></div></div>
410
472
 
@@ -412,34 +474,37 @@ footer .meta .sep{color:var(--border)}
412
474
  <header class="nav">
413
475
  <div class="wrap nav-inner">
414
476
  <div class="brand"><span class="dot"></span><span>kld-sdd</span></div>
415
- <nav class="nav-links" id="navLinks">
416
- <a href="#why">为什么</a>
477
+ <nav class="nav-links" id="navLinks" aria-label="页面导航">
417
478
  <a href="#install">安装</a>
418
479
  <a href="#workflow">工作流</a>
419
480
  <a href="#skills">技能</a>
420
- <a href="#docs">文档链</a>
421
- <a href="#structure">目录</a>
422
- <a href="#editors">编辑器</a>
481
+ <a href="#semantic">语义</a>
482
+ <a href="#docs">产物</a>
483
+ <a href="#editors">Agent</a>
484
+ <a href="#telemetry">度量</a>
423
485
  <a href="#faq">FAQ</a>
424
486
  </nav>
425
487
  <a class="nav-cta" href="#install">开始初始化</a>
426
- <button class="menu-btn" id="menuBtn" aria-label="菜单">☰</button>
488
+ <button type="button" class="menu-btn" id="menuBtn" aria-label="打开页面导航" aria-controls="navLinks" aria-expanded="false">☰</button>
427
489
  </div>
428
490
  </header>
429
491
 
492
+ <main id="main">
493
+
430
494
  <!-- Hero -->
431
495
  <section class="hero" id="top">
432
496
  <div class="wrap">
433
- <div class="tag">规格驱动开发 · 一键部署 SDD 工作流</div>
497
+ <div class="tag">规格驱动开发 · 语义闭环 · 可度量交付</div>
434
498
  <h1>kld-sdd<br><span class="grad">从入门到入土</span> <span class="dim">完整指南</span></h1>
435
- <p class="pitch"><b>SDD(Specification-Driven Development)</b>是一种以文档链驱动 AI 编码的研发方法:先写清楚"要做什么",再让 AI 去实现——避免 AI 乱猜、反复返工。<code>kld-sdd</code> 帮你在项目里一键配好这套工作流所需的全部 AI 技能。</p>
499
+ <p class="pitch"><b>SDD(Specification-Driven Development)</b>是一种以文档链驱动 AI 编码的研发方法:先写清楚“要做什么”,再让 AI 去实现。<code>kld-sdd</code> 不只部署技能,还把文档转换为可校验的本体事实,并用 SkyWalk V3 追踪交付效率与质量。</p>
436
500
  <div class="ctas">
437
501
  <a class="btn btn-primary" href="#install">$ npx kld-sdd</a>
438
502
  <a class="btn btn-ghost" href="#workflow">查看完整工作流 →</a>
439
503
  </div>
440
504
  <div class="hero-meta">
441
505
  <span>作者:郑浩天</span>
442
- <span>更新:2026-07-11</span>
506
+ <span>能力基线:v2.6.X</span>
507
+ <span>更新:2026-07-28</span>
443
508
  </div>
444
509
 
445
510
  <div class="term">
@@ -457,15 +522,15 @@ footer .meta .sep{color:var(--border)}
457
522
  <span class="o">║ 内置 openSpec 标准模版 ║</span><br>
458
523
  <span class="o">╚════════════════════════════════════════╝</span><br>
459
524
  <span class="o">请选择您使用的 AI 编辑器(按提示选择即可)</span><br>
460
- <span class="ok">✅ 初始化完成!已部署 11opsx-* skills</span><span class="cursor"></span>
525
+ <span class="ok">✅ 已部署 19skill 目录(13 个入口 + 6 个 TDD 配套)</span><span class="cursor"></span>
461
526
  </div>
462
527
  </div>
463
528
 
464
529
  <div class="stats">
465
- <div class="stat"><div class="n">10</div><div class="l">opsx skills</div></div>
466
- <div class="stat"><div class="n">8</div><div class="l">AI 编辑器</div></div>
467
- <div class="stat"><div class="n">4</div><div class="l">文档契约链</div></div>
468
- <div class="stat"><div class="n">MIT</div><div class="l">开源协议</div></div>
530
+ <div class="stat"><div class="n">13+6</div><div class="l">可调用技能 + TDD 配套</div></div>
531
+ <div class="stat"><div class="n">8</div><div class="l">AI Agent 适配</div></div>
532
+ <div class="stat"><div class="n">v2</div><div class="l">Ontology Schema</div></div>
533
+ <div class="stat"><div class="n">V3</div><div class="l">提效评估模型</div></div>
469
534
  </div>
470
535
  </div>
471
536
  </section>
@@ -512,10 +577,11 @@ footer .meta .sep{color:var(--border)}
512
577
  <h2 class="sec-title">安装与初始化</h2>
513
578
  </div>
514
579
  <p class="sec-sub reveal">无需全局安装,进入项目目录后执行 <code>npx kld-sdd</code> 即可。Node.js ≥ 14。</p>
580
+ <div class="callout reveal"><b>按需部署:</b>交互模式可选择 1 个或全部 8 个 Agent;自动化场景可用 <code>--tool codex</code>、逗号分隔的多选或 <code>--tool all</code>,不会为未选择的 Agent 创建专属目录。</div>
515
581
 
516
582
  <div class="reveal">
517
583
  <div class="codeblock">
518
- <button class="copy" data-copy="cd your-project
584
+ <button type="button" class="copy" data-copy="cd your-project
519
585
  npx kld-sdd">复制</button>
520
586
  <pre><span class="k-c"># 进入项目目录,一行命令完成初始化</span>
521
587
  <span class="k-p">➜</span> <span class="k-s">cd</span> your-project
@@ -523,11 +589,31 @@ npx kld-sdd">复制</button>
523
589
  </div>
524
590
  </div>
525
591
 
592
+ <div class="reveal" style="margin-top:16px">
593
+ <div class="codeblock">
594
+ <button class="copy" type="button" data-copy="npx kld-sdd --tool codex
595
+ npx kld-sdd --tool cursor,claude
596
+ npx kld-sdd --tool all
597
+ npx kld-sdd --skip-openspec
598
+ npx kld-sdd --skip-template
599
+ npx kld-sdd --help
600
+ npx kld-sdd --version">复制</button>
601
+ <pre><span class="k-c"># 常用非交互选项</span>
602
+ <span class="k-p">➜</span> <span class="k-s">npx</span> <span class="k-f">kld-sdd</span> --tool codex
603
+ <span class="k-p">➜</span> <span class="k-s">npx</span> <span class="k-f">kld-sdd</span> --tool cursor,claude
604
+ <span class="k-p">➜</span> <span class="k-s">npx</span> <span class="k-f">kld-sdd</span> --tool all
605
+ <span class="k-p">➜</span> <span class="k-s">npx</span> <span class="k-f">kld-sdd</span> --skip-openspec
606
+ <span class="k-p">➜</span> <span class="k-s">npx</span> <span class="k-f">kld-sdd</span> --skip-template <span class="k-c"># 跳过 skills、运行时与手册部署</span>
607
+ <span class="k-p">➜</span> <span class="k-s">npx</span> <span class="k-f">kld-sdd</span> --help
608
+ <span class="k-p">➜</span> <span class="k-s">npx</span> <span class="k-f">kld-sdd</span> --version</pre>
609
+ </div>
610
+ </div>
611
+
526
612
  <div class="steps">
527
613
  <div class="step reveal"><div class="n">1</div><div class="c"><b>选择编辑器</b><div class="d">运行 <code>npx kld-sdd</code> 后,按交互提示选择你使用的 AI 编辑器(如 Cursor、Claude Code、昆仑智码等)即可。</div></div></div>
528
- <div class="step reveal"><div class="n">2</div><div class="c"><b>运行 openspec init</b><div class="d">自动检测并安装 <code>@fission-ai/openspec</code>,生成变更目录结构。</div></div></div>
529
- <div class="step reveal"><div class="n">3</div><div class="c"><b>部署 opsx skills</b><div class="d">扁平一层部署到 <code>.*/skills/opsx-*/</code>,清理原生 openspec 命令与旧版嵌套 bundle。</div></div></div>
530
- <div class="step reveal"><div class="n">4</div><div class="c"><b>部署遥测与门禁</b><div class="d">部署 <code>skywalk-sdd/log.cjs</code>、Git hooks 质量门禁、CI 兜底模板(仅 Git 项目),并初始化全局 <code>overview.md</code>。</div></div></div>
614
+ <div class="step reveal"><div class="n">2</div><div class="c"><b>运行 openspec init</b><div class="d">先检测 <code>@fission-ai/openspec</code>;缺失时询问是否安装,确认后生成变更目录结构。</div></div></div>
615
+ <div class="step reveal"><div class="n">3</div><div class="c"><b>部署 19 个 skill 目录</b><div class="d">13 个可调用入口 + 6 个 TDD 配套包,扁平部署到所选 Agent 的 <code>skills/opsx-*/</code>,同时清理旧版嵌套 bundle。</div></div></div>
616
+ <div class="step reveal"><div class="n">4</div><div class="c"><b>部署语义、度量与门禁运行时</b><div class="d">部署 <code>log.cjs</code>、<code>metrics-v3.cjs</code>、<code>context-client.cjs</code>、<code>ontology/</code>、Git/CI 门禁模板,以及 Claude/CodeBuddy 专属 Hook Pack。</div></div></div>
531
617
  <div class="step reveal"><div class="n">5</div><div class="c"><b>更新 .gitignore</b><div class="d">自动忽略个人配置、telemetry 数据、worktree 临时目录。</div></div></div>
532
618
  </div>
533
619
  </div>
@@ -540,39 +626,41 @@ npx kld-sdd">复制</button>
540
626
  <span class="sec-num">§ 2</span>
541
627
  <h2 class="sec-title">核心工作流</h2>
542
628
  </div>
543
- <p class="sec-sub reveal">8 个阶段技能按顺序串成文档链 → 代码链 → 归档链。点击下方任一阶段,跳转查看详情。</p>
629
+ <p class="sec-sub reveal">8 个阶段技能按顺序串成文档链 → 代码链 → 归档链;5 个辅助入口贯穿检索、规则和知识闭环。点击任一阶段可跳转到详情。</p>
544
630
 
545
631
  <div class="pipeline reveal">
546
632
  <div class="pipeline-hint">▼ 点击阶段查看详解 ▼</div>
547
633
  <div class="flow" id="flow">
548
- <div class="stage" data-target="sk-propose"><span class="ic">🎯</span><div class="nm">propose</div><div class="rl">Why</div></div>
634
+ <button class="stage" type="button" data-target="sk-propose"><span class="ic">🎯</span><span class="nm">propose</span><span class="rl">Why</span></button>
549
635
  <span class="arrow">→</span>
550
- <div class="stage" data-target="sk-spec"><span class="ic">📐</span><div class="nm">spec</div><div class="rl">What</div></div>
636
+ <button class="stage" type="button" data-target="sk-spec"><span class="ic">📐</span><span class="nm">spec</span><span class="rl">What</span></button>
551
637
  <span class="arrow">→</span>
552
- <div class="stage" data-target="sk-design"><span class="ic">🏗️</span><div class="nm">design</div><div class="rl">How</div></div>
638
+ <button class="stage" type="button" data-target="sk-design"><span class="ic">🏗️</span><span class="nm">design</span><span class="rl">How</span></button>
553
639
  <span class="arrow">→</span>
554
- <div class="stage" data-target="sk-task"><span class="ic">🧩</span><div class="nm">task</div><div class="rl">Do</div></div>
640
+ <button class="stage" type="button" data-target="sk-task"><span class="ic">🧩</span><span class="nm">task</span><span class="rl">Do</span></button>
555
641
  <span class="arrow">→</span>
556
- <div class="stage" data-target="sk-check"><span class="ic">🔍</span><div class="nm">check</div><div class="rl">Verify</div></div>
642
+ <button class="stage" type="button" data-target="sk-check"><span class="ic">🔍</span><span class="nm">check</span><span class="rl">Verify</span></button>
557
643
  <span class="arrow">→</span>
558
- <div class="stage" data-target="sk-apply"><span class="ic">⚡</span><div class="nm">apply</div><div class="rl">Apply</div></div>
644
+ <button class="stage" type="button" data-target="sk-apply"><span class="ic">⚡</span><span class="nm">apply</span><span class="rl">Apply</span></button>
559
645
  <span class="arrow">→</span>
560
- <div class="stage" data-target="sk-test"><span class="ic">🧪</span><div class="nm">test</div><div class="rl">Test</div></div>
646
+ <button class="stage" type="button" data-target="sk-test"><span class="ic">🧪</span><span class="nm">test</span><span class="rl">Test</span></button>
561
647
  <span class="arrow">→</span>
562
- <div class="stage" data-target="sk-archive"><span class="ic">📦</span><div class="nm">archive</div><div class="rl">Archive</div></div>
648
+ <button class="stage" type="button" data-target="sk-archive"><span class="ic">📦</span><span class="nm">archive</span><span class="rl">Archive</span></button>
563
649
  </div>
564
650
  <div class="helpers">
565
651
  <span class="helper"><span class="ic">🧭</span> opsx-explore · 浏览变更状态</span>
566
652
  <span class="helper"><span class="ic">📚</span> opsx-knowledge · 业务知识库检索</span>
567
653
  <span class="helper"><span class="ic">📜</span> opsx-rules · 生成/更新 Agent 规则</span>
654
+ <span class="helper"><span class="ic">🔗</span> opsx-ontology-query · 工程 KB 查询</span>
655
+ <span class="helper"><span class="ic">⬆️</span> opsx-kb-ingest · Archive 入库</span>
568
656
  </div>
569
657
  </div>
570
658
 
571
659
  <div class="steps" style="margin-top:36px">
572
- <div class="step reveal"><div class="n">A</div><div class="c"><b>文档链(规划)</b><div class="d"><code>propose → spec → design → task</code> 把需求逐步精化为可执行契约,每步产出一份 markdown。</div></div></div>
573
- <div class="step reveal"><div class="n">B</div><div class="c"><b>门禁(验证)</b><div class="d"><code>check</code> 在写代码前验证文档链的完整性/一致性/可执行性——只读检查,不修改文档。</div></div></div>
660
+ <div class="step reveal"><div class="n">A</div><div class="c"><b>文档链(规划)</b><div class="d"><code>propose → spec → design → task</code> 把需求逐步精化为可执行契约;每次写入后立即对账为 draft 工作态本体。</div></div></div>
661
+ <div class="step reveal"><div class="n">B</div><div class="c"><b>门禁(验证)</b><div class="d"><code>check</code> 对原始文档做只读检查,同时全量重建可再生的本体 JSON,验证 STMT → AC → DES → TASK 追溯链。</div></div></div>
574
662
  <div class="step reveal"><div class="n">C</div><div class="c"><b>实施链(执行)</b><div class="d"><code>apply → test</code> 按 DAG 依赖顺序逐任务实现,编译/测试门禁逐任务拦截,实时更新 tasks.md。</div></div></div>
575
- <div class="step reveal"><div class="n">D</div><div class="c"><b>归档(收口)</b><div class="d"><code>archive</code> 真实移入 archive 目录,同步正式 specs,生成最终中文度量报告(md+html)。</div></div></div>
663
+ <div class="step reveal"><div class="n">D</div><div class="c"><b>归档(收口)</b><div class="d"><code>archive</code> 真实移入 archive 目录,同步正式 specs,基于 V3 Report Model 生成最终中文度量报告(md+html+json)。</div></div></div>
576
664
  </div>
577
665
  </div>
578
666
  </section>
@@ -582,32 +670,33 @@ npx kld-sdd">复制</button>
582
670
  <div class="wrap">
583
671
  <div class="sec-head reveal">
584
672
  <span class="sec-num">§ 3</span>
585
- <h2 class="sec-title">11 个技能详解</h2>
673
+ <h2 class="sec-title">13 个可调用技能 + 6 个 TDD 配套包</h2>
586
674
  </div>
587
- <p class="sec-sub reveal">初始化后部署为扁平一层:<code>.claude/skills/opsx-*/SKILL.md</code> 激活即用 <code>/opsx-propose</code>。</p>
675
+ <p class="sec-sub reveal">8 个阶段入口 + 5 个辅助/知识入口组成可调用层;另有 6 个 <code>opsx-tdd-*</code> 配套包被主流程按需引用,不进入斜杠命令清单。所有目录都以扁平一层部署到所选 Agent。</p>
676
+ <div class="callout reveal"><b>为什么是 13 + 6:</b><code>OPSX_SKILL_DIRS</code> 定义 13 个命令元数据;初始化会复制模板目录中的全部 19 个 skill 目录。KunlunZhima 为 13 个入口生成 command bridge,其余 6 个只作为 TDD 规则与检查依赖。</div>
588
677
 
589
678
  <div class="skills-grid">
590
679
  <div class="skill reveal" id="sk-propose" style="border-left-color:#5eead4">
591
680
  <div class="top"><span class="idx">01</span><h3>opsx-propose <span class="arg">&lt;变更名称&gt;</span></h3><span class="role">Why · 业务意图</span></div>
592
- <p>创建业务意图文档,明确"为什么要做这件事"。把产品需求转化为结构化的业务意图文档。</p>
593
- <p>没说清楚时,AI 会主动问 4 个问题:<b>痛点 / 目标 / 影响模块 / 约束</b>,并推导出 kebab-case 变更名(如 <code>add-user-auth</code>),生成 propose.md 后展示摘要让你确认。</p>
594
- <div class="out">openspec/changes/&lt;name&gt;/propose.md</div>
681
+ <p>创建业务意图文档,明确“为什么做”。除痛点、目标、影响模块与约束外,还会让你确认 <b>Full / Simple 模式、测试策略和 change-type</b>(config / document / report / composite / other),并写入稳定的 <code>change-id</code>。</p>
682
+ <p>若提供 REQ / FEAT 外部编号,会通过 <code>opsx-ontology-query</code> Continuity 查询,识别新增、延续或迭代能力;不会把本地 archive 当成跨迭代权威。</p>
683
+ <div class="out">proposal.md + artifacts/proposal.ontology.json + ontology/working-ontology.json</div>
595
684
  </div>
596
685
 
597
686
  <div class="skill reveal" id="sk-spec" style="border-left-color:#38bdf8">
598
687
  <div class="top"><span class="idx">02</span><h3>opsx-spec <span class="arg">&lt;变更名称&gt;</span></h3><span class="role">What · 技术契约</span></div>
599
688
  <p>创建技术契约文档,明确"要实现什么 API 和规范"。<b>这是代码生成的唯一依据,必须精确无歧义。</b></p>
600
- <p>读取 propose.md,发现模糊描述时主动追问(如"高性能" → 具体 QPS/RT 是多少?),确认 API 范围、性能指标、安全要求后生成 spec.md。</p>
689
+ <p>读取 proposal.md,发现模糊描述时主动追问(如“高性能” → 具体 QPS/RT 是多少?),确认 API 范围、性能指标与安全要求;场景写入稳定 STMT / AC 身份和可选 <code>external-ref</code>。</p>
601
690
  <div class="red"><b>质量红线:</b>所有参数有类型、必填标记、范围约束、示例值;性能指标是具体数字(如 <code>&lt; 100ms P99</code>);边界场景覆盖正常流程 + 所有异常流程。</div>
602
- <div class="out">openspec/changes/&lt;name&gt;/specs/&lt;capability&gt;/spec.md</div>
691
+ <div class="out">Full: specs/&lt;capability&gt;/spec.md;Simple: spec.md;同步 spec.ontology.json</div>
603
692
  </div>
604
693
 
605
694
  <div class="skill reveal" id="sk-design" style="border-left-color:#60a5fa">
606
695
  <div class="top"><span class="idx">03</span><h3>opsx-design <span class="arg">&lt;变更名称&gt;</span></h3><span class="role">How · 实现方案</span></div>
607
- <p>创建技术实现方案,明确"怎么做"——聚焦本业务,不写全局架构。读取 propose + spec,分析约束和设计难点;存在多种方案时列出让你选择。</p>
696
+ <p>创建技术实现方案,明确“怎么做”——聚焦本业务,不写全局架构。读取 proposal + spec,分析约束和设计难点;存在多种方案时列出让你选择。</p>
608
697
  <div class="red"><b>质量红线:</b>不写全局中间件或框架选型(那是项目级的事);接口调用明确到具体接口名和调用方式;数据库表结构到字段级别(类型、长度、索引)。</div>
609
698
  <p>产出包含:时序图、模块设计、数据表结构、异常处理。</p>
610
- <div class="out">openspec/changes/&lt;name&gt;/specs/&lt;capability&gt;/design.md</div>
699
+ <div class="out">design.md + design.ontology.json(DES realizes STMT)</div>
611
700
  </div>
612
701
 
613
702
  <div class="skill reveal" id="sk-task" style="border-left-color:#818cf8">
@@ -615,7 +704,7 @@ npx kld-sdd">复制</button>
615
704
  <p>将 design.md 拆解为 AI 可执行的原子任务列表。<b>每个任务的标准:AI 能在 5 分钟内完成。</b></p>
616
705
  <p>统计需要覆盖的实现点(API 数、模块数、数据表数),预估任务总数并确认拆解策略;发现循环依赖、复杂算法等风险时主动告知。</p>
617
706
  <div class="red"><b>质量红线:</b>100% 覆盖 spec 的每个 API 和约束;100% 覆盖 design 的每个模块和接口;每个任务有明确验收标准和单测要求。</div>
618
- <div class="out">openspec/changes/&lt;name&gt;/specs/&lt;capability&gt;/tasks.md</div>
707
+ <div class="out">tasks.md + tasks.ontology.json(TASK implements / covers / dependsOn)</div>
619
708
  </div>
620
709
 
621
710
  <div class="skill reveal" id="sk-check" style="border-left-color:#a78bfa">
@@ -626,9 +715,10 @@ npx kld-sdd">复制</button>
626
715
  <li><b>一致性</b>:spec 的 API 在 design 中是否有对应方案;字段命名是否一致</li>
627
716
  <li><b>算法正确性</b>:数据流转无矛盾,异常覆盖边界,性能满足 spec 约束</li>
628
717
  <li><b>可执行性</b>:每个任务 ≤ 5 分钟,DAG 无循环依赖,代码锚点存在</li>
718
+ <li><b>语义追溯</b>:全量 reconcile 后验证 STMT → AC → DES → TASK、外部编号与身份版本链</li>
629
719
  </ul>
630
- <p>Check 是<b>只读检查</b>,不修改任何文档;发现问题时列出严重问题和警告,并推荐修复命令(不自动执行)。</p>
631
- <div class="out">结构化检查报告(通过 / 警告 / 失败)+ 修复建议</div>
720
+ <p>Check 不修改 proposal/spec/design/tasks 原文,但会原子刷新可再生的本体 JSON。检查结果记录 reviewer 独立性:跨会话独立评审的 Q3 可标为 <code>verified</code>,自评则为 <code>provisional</code>。</p>
721
+ <div class="out">结构化检查结果 + pending 本体 revision + 修复建议</div>
632
722
  </div>
633
723
 
634
724
  <div class="skill reveal" id="sk-apply" style="border-left-color:#c084fc">
@@ -639,6 +729,7 @@ npx kld-sdd">复制</button>
639
729
  <li><b>隔离红线</b>:⛔ 禁止加载同级其他 Capability 的文档</li>
640
730
  <li><b>DAG 依赖拦截</b>:前置任务未完成则拦截,同层独立任务可并行派发子代理</li>
641
731
  <li><b>逐任务门禁</b>:每完成一个任务,编译检查 + 测试门禁必须通过,立即更新 tasks.md checkbox</li>
732
+ <li><b>TDD 纪律包</b>:当 <code>test-strategy=tdd</code> 时加载 core / rules / quality / anti-patterns / review</li>
642
733
  <li><b>可选 worktree 并行</b>:解耦的 capability 各自 worktree 加速,做完按依赖合并回集成分支</li>
643
734
  </ul>
644
735
  <div class="red"><b>Git 只读策略:</b>禁止为度量自动 <code>git init/add/commit</code> 或创建分支;非 Git 项目用 <code>vcs_mode=no-git</code> 继续执行,不得中断。</div>
@@ -653,20 +744,21 @@ npx kld-sdd">复制</button>
653
744
  <li><code>impl-first</code> → 警告:强制补跑测试</li>
654
745
  <li><code>none</code> → 跳过</li>
655
746
  </ul>
656
- <p>Claude Code 的 <code>sdd-apply-test-gate.cjs</code> 会在 <code>log.cjs end</code>、worktree 收尾、会话 Stop 时自动校验——无真实测试证据则阻断。</p>
747
+ <p>Claude Code 与 CodeBuddy Hook Pack 会在阶段结束、worktree 收尾或会话停止时校验真实测试证据;其他 Agent 由 Skill 自检和 Git/CI 证据门禁兜底。</p>
657
748
  <div class="out">测试执行结果 + telemetry 证据(非占位数据)</div>
658
749
  </div>
659
750
 
660
751
  <div class="skill reveal" id="sk-archive" style="border-left-color:#d8b4fe">
661
752
  <div class="top"><span class="idx">08</span><h3>opsx-archive <span class="arg">&lt;变更名称&gt;</span></h3><span class="role">Archive · 归档收口</span></div>
662
- <p>安全结束变更生命周期:真实归档文档、同步正式 specs、记录 archive telemetry,并生成最终中文度量报告。</p>
753
+ <p>通过两阶段事务安全结束变更生命周期:先在 staging 重新解析与校验,成功后才切换正式 archive;同步正式 specs、确认本体快照并生成度量报告。</p>
663
754
  <ul class="tight">
664
755
  <li>询问归档原因:已完成 / 取消 / 搁置 / 其他</li>
665
- <li>运行 <code>doctor</code> 自检,<code>severe_issues</code> 阻断归档</li>
756
+ <li>运行 <code>doctor</code>、<code>semantic-reconcile</code> 与 <code>semantic-check</code>,阻断严重问题</li>
666
757
  <li>扫描 tasks 完成状态,未勾选项写入报告(不阻断归档)</li>
667
- <li>一步执行 <code>archive-docs</code>:移动目录 + 同步 specs + 生成报告</li>
758
+ <li>生成 confirmed snapshot、canonical facts、manifest、conversion report 与相邻 zip 包</li>
759
+ <li>加载 <code>opsx-kb-ingest</code> 上传 Archive Package,成功后写入入库回执</li>
668
760
  </ul>
669
- <div class="out">archive/&lt;日期&gt;-&lt;name&gt;/ + report.md + report.html + execution-log.md</div>
761
+ <div class="out">archive/&lt;日期&gt;-&lt;name&gt;/reports/&lt;name&gt;-report.{md,html,json} + logs/execution-log.md + 相邻 &lt;日期&gt;-&lt;name&gt;.zip</div>
670
762
  </div>
671
763
 
672
764
  <div class="skill reveal" id="sk-explore" style="border-left-color:#5eead4">
@@ -686,7 +778,92 @@ npx kld-sdd">复制</button>
686
778
  <p>扫描项目结构后,为已部署的 Agent 生成 5 主题规则(架构/编码/测试/数据安全/Git 提交),或对比现有规则输出更新建议。各 Agent 规则位置与格式不同(.md / .mdc),skill 按落位矩阵自动写入。</p>
687
779
  <div class="out">按 Agent 落位的规则文件 + 更新建议表</div>
688
780
  </div>
781
+
782
+ <div class="skill reveal" id="sk-ontology-query" style="border-left-color:#38bdf8">
783
+ <div class="top"><span class="idx">12</span><h3>opsx-ontology-query</h3><span class="role">依赖 · 工程知识查询</span></div>
784
+ <p>通过 API Key 查询 Engineering KB 的本体事实,支持上下文检索、外部需求号解析、Spec 复用、实体详情、一跳结构与多跳影响分析。<code>propose</code> 与 <code>spec</code> 将它作为 Continuity / 场景身份的硬依赖。</p>
785
+ <p>首次使用会引导选择 Space 与知识库,并把密钥和目标写入 gitignored 的 <code>.local/state.json</code>;无命中时明确返回“无当前依据”,不会编造 UUID 或事实。</p>
786
+ <div class="out">带引用的工程事实、复用包、身份解析或影响分析</div>
787
+ </div>
788
+
789
+ <div class="skill reveal" id="sk-kb-ingest" style="border-left-color:#818cf8">
790
+ <div class="top"><span class="idx">13</span><h3>opsx-kb-ingest</h3><span class="role">依赖 · Archive 入库</span></div>
791
+ <p>通过 API Key 将归档 zip 上传到 Engineering KB,支持上传、任务状态、任务列表与失败重试。上传前校验 manifest、canonical facts、SHA-256、外部编号作用域与 project/space 身份。</p>
792
+ <p>同一 <code>archive_id + content_hash</code> 幂等;冲突或编号不合法时整包回滚,并引导回到 kld-sdd 修正,而不是在知识库里现场改绑。</p>
793
+ <div class="out">入库 Job 结果 + ingest-receipt.json(归档流程成功时)</div>
794
+ </div>
795
+ </div>
796
+
797
+ <div class="callout reveal"><b>6 个 TDD 配套包不会单独出现在命令菜单:</b>它们随 13 个入口一起部署,由 <code>propose/task/check/apply/test</code> 根据测试策略渐进加载,避免每次把整套测试规则塞进上下文。</div>
798
+ <div class="skill-pack-grid">
799
+ <div class="skill-pack reveal"><code>opsx-tdd-core</code><p>红 → 绿 → 重构铁律、执行门禁与完成自检。</p></div>
800
+ <div class="skill-pack reveal"><code>opsx-tdd-rules</code><p>DAG、Controller 策略、任务类型与测试证据规则库。</p></div>
801
+ <div class="skill-pack reveal"><code>opsx-tdd-quality</code><p>Mock 边界、命名、Given-When-Then 与语言模板。</p></div>
802
+ <div class="skill-pack reveal"><code>opsx-tdd-anti-patterns</code><p>RED/GREEN 阶段 16 类测试反模式检测与修复。</p></div>
803
+ <div class="skill-pack reveal"><code>opsx-tdd-review</code><p>独立审查测试是否真正覆盖关键行为和异常路径。</p></div>
804
+ <div class="skill-pack reveal"><code>opsx-tdd-metrics</code><p>按需量化隔离、命名、可测试性与覆盖率缺口。</p></div>
805
+ </div>
806
+ </div>
807
+ </section>
808
+
809
+ <!-- 本体语义闭环 -->
810
+ <section id="semantic">
811
+ <div class="wrap">
812
+ <div class="sec-head reveal">
813
+ <span class="sec-num">§ 4</span>
814
+ <h2 class="sec-title">本体语义与工程知识闭环</h2>
815
+ </div>
816
+ <p class="sec-sub reveal">Markdown 仍是人类可读的事实源;Ontology v2 把 Change、Capability、STMT、AC、Constraint、Design、Task、Artifact、DocumentSection 与 OntologySnapshot 物化为稳定身份、版本链和显式关系,让 Check 能确定性验证、Archive 能安全入库。</p>
817
+
818
+ <div class="feature-grid">
819
+ <article class="feature-card reveal">
820
+ <div class="eyebrow">Identity</div>
821
+ <h3>人工锚点 + 双层 UUID 版本身份</h3>
822
+ <p><code>CHG/CAP/STMT/AC/CON/DES/TASK</code> 便于人读;<code>entity-id</code> 跨迭代复用,<code>version-id</code> 随修改演进,<code>predecessor-version</code> 阻止版本断链与分叉。</p>
823
+ </article>
824
+ <article class="feature-card reveal">
825
+ <div class="eyebrow">Materialize</div>
826
+ <h3>写完即生成工作态事实</h3>
827
+ <p>propose/spec/design/task 每次写入后立即 reconcile,产出 <code>artifacts/**/*.ontology.json</code>、<code>ontology/artifact-index.json</code> 与 <code>ontology/working-ontology.json</code>,状态为 draft/pending,尚不能直接入库。</p>
828
+ </article>
829
+ <article class="feature-card reveal">
830
+ <div class="eyebrow">Traceability</div>
831
+ <h3>跨文档关系可计算</h3>
832
+ <p><code>CHG contains CAP → STMT acceptedBy AC → DES realizes STMT → TASK implements/covers DES/STMT</code>;Task DAG、悬空引用、重号和外部编号作用域都可被门禁检查。</p>
833
+ </article>
834
+ <article class="feature-card reveal">
835
+ <div class="eyebrow">Archive Package</div>
836
+ <h3>confirmed 快照 → 知识库</h3>
837
+ <p>Archive 两阶段事务生成 <code>archive-ontology.json</code>、<code>canonical-facts.json</code>、转换报告、manifest 与 SHA-256 zip;随后由 <code>opsx-kb-ingest</code> 幂等入库。</p>
838
+ </article>
839
+ </div>
840
+
841
+ <div class="callout reveal"><b>跨迭代真相源:</b>历史身份和可复用 Spec 以 Engineering KB current facts 为准;<code>opsx-ontology-query</code> 负责 Continuity、复用和影响查询。消费方不得扫描本地 <code>archive/</code> 后自行复制 UUID。</div>
842
+
843
+ <div class="codeblock reveal">
844
+ <button class="copy" type="button" data-copy="node skywalk-sdd/log.cjs semantic-identity --delta-state=added
845
+ node skywalk-sdd/log.cjs semantic-reconcile --project=. --change=add-user-auth
846
+ node skywalk-sdd/log.cjs semantic-check --project=. --change=add-user-auth --profile=full
847
+ node skywalk-sdd/log.cjs semantic-status --project=. --change=add-user-auth
848
+ node skywalk-sdd/log.cjs semantic-observe --project=. --change=add-user-auth">复制</button>
849
+ <pre><span class="k-c"># 身份、对账、门禁与状态</span>
850
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">semantic-identity</span> --delta-state=added
851
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">semantic-reconcile</span> --project=. --change=add-user-auth
852
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">semantic-check</span> --project=. --change=add-user-auth --profile=full
853
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">semantic-status</span> --project=. --change=add-user-auth
854
+ <span class="k-c"># observe 只是可选同步优化,不替代 Check / Archive 的全量对账</span>
855
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">semantic-observe</span> --project=. --change=add-user-auth</pre>
689
856
  </div>
857
+
858
+ <table class="tbl reveal">
859
+ <caption>语义校验 profile(<code>auto</code> 会从 proposal 的 mode 推断)</caption>
860
+ <thead><tr><th scope="col">Profile</th><th scope="col">适用形态</th><th scope="col">阻断重点</th></tr></thead>
861
+ <tbody>
862
+ <tr><td class="mono">simple</td><td>单能力、轻量变更</td><td>强制 STMT → AC;Design/Task 不存在时跳过</td></tr>
863
+ <tr><td class="mono">full</td><td>多 Capability 完整链</td><td>强制 STMT → AC → DES → TASK 全链与 Task DAG</td></tr>
864
+ <tr><td class="mono">strict</td><td>高可信归档</td><td>在 full 基础上要求完整语义来源与身份连续性</td></tr>
865
+ </tbody>
866
+ </table>
690
867
  </div>
691
868
  </section>
692
869
 
@@ -694,24 +871,26 @@ npx kld-sdd">复制</button>
694
871
  <section id="docs">
695
872
  <div class="wrap">
696
873
  <div class="sec-head reveal">
697
- <span class="sec-num">§ 4</span>
874
+ <span class="sec-num">§ 5</span>
698
875
  <h2 class="sec-title">文档链与产物</h2>
699
876
  </div>
700
- <p class="sec-sub reveal">每个阶段都有明确的输入与产出,形成可追溯的文档→代码→报告链。</p>
877
+ <p class="sec-sub reveal">每个阶段都有明确输入、人工可读产物与可再生语义产物,最终形成文档 → 本体 → 代码 → 报告 → 知识库的闭环。</p>
701
878
 
702
879
  <table class="tbl reveal">
703
- <thead><tr><th>阶段</th><th>回答</th><th>输入</th><th>产出</th></tr></thead>
880
+ <caption>核心生命周期的输入与主要产物</caption>
881
+ <thead><tr><th scope="col">阶段</th><th scope="col">回答</th><th scope="col">输入</th><th scope="col">产出</th></tr></thead>
704
882
  <tbody>
705
- <tr><td class="mono">propose</td><td>Why</td><td>产品需求</td><td class="mono">propose.md</td></tr>
706
- <tr><td class="mono">spec</td><td>What</td><td class="mono">propose.md</td><td class="mono">spec.md</td></tr>
707
- <tr><td class="mono">design</td><td>How</td><td class="mono">propose + spec</td><td class="mono">design.md</td></tr>
883
+ <tr><td class="mono">propose</td><td>Why</td><td>产品需求 + Continuity</td><td class="mono">proposal.md + proposal.ontology.json</td></tr>
884
+ <tr><td class="mono">spec</td><td>What</td><td class="mono">proposal.md + KB context</td><td class="mono">spec.md + spec.ontology.json</td></tr>
885
+ <tr><td class="mono">design</td><td>How</td><td class="mono">proposal + spec + overview</td><td class="mono">design.md + design.ontology.json</td></tr>
708
886
  <tr><td class="mono">task</td><td>Do</td><td class="mono">design.md</td><td class="mono">tasks.md</td></tr>
709
- <tr><td class="mono">check</td><td>Verify</td><td class="mono">四文档链</td><td>检查报告(通过/警告/失败)</td></tr>
887
+ <tr><td class="mono">check</td><td>Verify</td><td class="mono">四文档链 + working ontology</td><td>check_result + pending revision + 诊断</td></tr>
710
888
  <tr><td class="mono">apply</td><td>Apply</td><td class="mono">overview→proposal→spec/design/tasks</td><td>代码 + 测试 + checkbox 更新</td></tr>
711
889
  <tr><td class="mono">test</td><td>Test</td><td>代码 + test-strategy</td><td>测试证据(telemetry)</td></tr>
712
- <tr><td class="mono">archive</td><td>Archive</td><td>变更全量</td><td class="mono">archive/ + report.md/.html + execution-log.md</td></tr>
890
+ <tr><td class="mono">archive</td><td>Archive</td><td>变更全量 + confirmed ontology</td><td class="mono">archive/&lt;date&gt;-&lt;name&gt;/ + reports/ + logs/ + 相邻 zip</td></tr>
713
891
  </tbody>
714
892
  </table>
893
+ <div class="callout reveal"><b>Full 与 Simple:</b><code>proposal.md</code> 始终在变更根目录;Full 把 spec/design/tasks 放在 <code>specs/&lt;capability&gt;/</code>,Simple 则放在变更根目录。归档目录重名时会安全使用 <code>-2</code>、<code>-3</code> 后缀。</div>
715
894
  </div>
716
895
  </section>
717
896
 
@@ -719,39 +898,44 @@ npx kld-sdd">复制</button>
719
898
  <section id="structure">
720
899
  <div class="wrap">
721
900
  <div class="sec-head reveal">
722
- <span class="sec-num">§ 5</span>
901
+ <span class="sec-num">§ 6</span>
723
902
  <h2 class="sec-title">初始化后的目录结构</h2>
724
903
  </div>
725
- <p class="sec-sub reveal">运行 <code>npx kld-sdd</code> 后,你的项目会长出这些目录。</p>
904
+ <p class="sec-sub reveal">运行 <code>npx kld-sdd</code> 后,会部署共享运行时与所选 Agent 的技能目录;下面只展开关键结构。</p>
726
905
 
727
906
  <div class="tree reveal"><span class="dir">your-project/</span>
728
907
  ├── <span class="dir">openspec/</span>
908
+ │ ├── <span class="file">kld-sdd操作手册.html</span> <span class="cmt"># 本指南的项目内副本</span>
729
909
  │ ├── <span class="dir">specs/</span>
730
- │ │ └── <span class="file">overview.md</span> <span class="cmt"># 全局架构约束(数据字典、接口规范)</span>
731
- │ └── <span class="dir">changes/</span> <span class="cmt"># 变更工作区</span>
732
- └── <span class="dir">&lt;change-name&gt;/</span> <span class="cmt"># propose/spec/design/tasks 落在此处</span>
733
- ├── <span class="dir">openspec-templates/</span> <span class="cmt"># 四文档参考模版(供参考)</span>
734
- │ ├── <span class="file">propose.md</span>
735
- │ ├── <span class="file">spec.md</span>
736
- │ ├── <span class="file">design.md</span>
737
- └── <span class="file">tasks.md</span>
738
- ├── <span class="dir">.claude/</span>
739
- ├── <span class="dir">skills/opsx-*/</span> <span class="cmt"># SDD skills(扁平一层,Claude 可识别)</span>
740
- ├── <span class="dir">hooks/sdd-*.cjs</span> <span class="cmt"># Claude Code 门禁 hook(可选增强)</span>
741
- └── <span class="file">settings.json</span> <span class="cmt"># hook 配置(含三层门禁绑定)</span>
742
- ├── <span class="dir">.cursor/skills/opsx-*/</span> <span class="cmt"># Cursor 技能</span>
743
- ├── <span class="dir">.codebuddy/skills/opsx-*/</span> <span class="cmt"># CodeBuddy 技能</span>
744
- ├── <span class="dir">.kunlunzhima/</span> <span class="cmt"># 昆仑智码</span>
745
- ├── <span class="dir">skills/opsx-*/</span> <span class="cmt"># SDD skills(扁平一层)</span>
746
- │ └── <span class="dir">commands/opsx/</span> <span class="cmt"># OPSX command bridge(轻量入口,指向对应 Skill)</span>
747
- ├── <span class="dir">.agents/skills/opsx-*/</span> <span class="cmt"># Codex 项目级技能</span>
748
- └── <span class="dir">skywalk-sdd/</span> <span class="cmt"># Telemetry 数据目录</span>
749
- ├── <span class="file">log.cjs</span> <span class="cmt"># 本地 Telemetry CLI</span>
750
- ├── <span class="dir">events/</span> <span class="cmt"># 事件数据(gitignored)</span>
751
- ├── <span class="dir">state/</span> <span class="cmt"># 活跃阶段状态(gitignored)</span>
752
- └── <span class="dir">git-hooks/ · ci/</span> <span class="cmt"># 质量门禁 / CI 兜底模板</span></div>
753
-
754
- <p class="lead reveal" style="margin-top:24px;font-size:.9rem">提示:Claude Code 只识别 <code>.claude/skills/&lt;skill-name&gt;/SKILL.md</code> 这一层;嵌套在 <code>skills/kld-sdd/opsx-*</code> 下不会被 <code>/</code> 菜单发现,所以 kld-sdd 部署时强制扁平化并清理旧版嵌套 bundle。昆仑智码用户可在 IDE 中使用 <code>.kunlunzhima/commands/opsx/</code> 下的 OPSX 命令入口。</p>
910
+ │ │ └── <span class="file">overview.md</span> <span class="cmt"># 全局架构约束</span>
911
+ │ └── <span class="dir">changes/</span>
912
+ ├── <span class="dir">&lt;change-name&gt;/</span> <span class="cmt"># 活跃变更</span>
913
+ │ │ ├── <span class="file">proposal.md</span> <span class="cmt"># mode / change-id / change-type / test-strategy</span>
914
+ ├── <span class="dir">specs/&lt;capability&gt;/</span> <span class="cmt"># Full:spec / design / tasks</span>
915
+ ├── <span class="file">spec · design · tasks.md</span> <span class="cmt"># Simple:根目录三文档</span>
916
+ ├── <span class="dir">ontology/</span> <span class="cmt"># working-ontology · artifact-index · diagnostics · file-index · identities · continuity-resolution</span>
917
+ ├── <span class="dir">artifacts/**/*.ontology.json</span>
918
+ │ │ └── <span class="file">logs/execution-log.md</span>
919
+ └── <span class="dir">archive/</span>
920
+ ├── <span class="dir">&lt;date&gt;-&lt;name&gt;/</span>
921
+ ├── <span class="dir">reports/</span> <span class="cmt"># &lt;name&gt;-report.{md,html,json}</span>
922
+ │ │ ├── <span class="dir">logs/</span>
923
+ │ │ └── <span class="file">archive-ontology · canonical-facts · conversion-report · archive-manifest.json</span>
924
+ │ └── <span class="file">&lt;date&gt;-&lt;name&gt;.zip</span> <span class="cmt"># 相邻 Archive Package</span>
925
+ ├── <span class="dir">openspec-templates/</span> <span class="cmt"># proposal/spec/design/tasks/overview + continuity 示例</span>
926
+ ├── <span class="dir">.claude/</span> <span class="cmt"># skills + hooks + settings</span>
927
+ ├── <span class="dir">.cursor/skills/ · .qoder/skills/ · .workbuddy/skills/</span>
928
+ ├── <span class="dir">.codebuddy/</span> <span class="cmt"># skills + hooks + settings</span>
929
+ ├── <span class="dir">.kunlunzhima/</span> <span class="cmt"># skills + commands/opsx bridge</span>
930
+ ├── <span class="dir">.opencode/skills/</span> <span class="cmt"># skills-only,不部署 command bridge</span>
931
+ ├── <span class="dir">.agents/skills/</span> <span class="cmt"># Codex 项目级技能</span>
932
+ └── <span class="dir">skywalk-sdd/</span>
933
+ ├── <span class="file">log.cjs · metrics-v3.cjs · context-client.cjs</span>
934
+ ├── <span class="dir">ontology/</span> · <span class="file">apply-worktree-finish.cjs</span>
935
+ ├── <span class="dir">events/ · state/</span> <span class="cmt"># 门禁信号源,gitignored</span>
936
+ └── <span class="dir">git-hooks/ · ci/</span> <span class="cmt"># Git / CI 兜底模板</span></div>
937
+
938
+ <div class="callout reveal"><b>部署原则:</b>13 个可调用入口与 6 个 TDD 配套包会复制到每个已选择 Agent 的 skill 目录。只有 Claude Code 与 CodeBuddy 同时获得自动 Hook Pack;OpenCode 采用 skills-only,昆仑智码额外获得 13 个轻量 command bridge。</div>
755
939
  </div>
756
940
  </section>
757
941
 
@@ -759,22 +943,23 @@ npx kld-sdd">复制</button>
759
943
  <section id="editors">
760
944
  <div class="wrap">
761
945
  <div class="sec-head reveal">
762
- <span class="sec-num">§ 6</span>
946
+ <span class="sec-num">§ 7</span>
763
947
  <h2 class="sec-title">支持的 AI 编辑器</h2>
764
948
  </div>
765
- <p class="sec-sub reveal">8 个编辑器统一使用 <code>SKILL.md</code> 技能格式,初始化时自动创建目录。下方为各编辑器的简要上手方式。</p>
949
+ <p class="sec-sub reveal">8 Agent profile 统一使用 <code>SKILL.md</code>;只部署初始化时选中的 profile,并自动创建对应目录。</p>
766
950
 
767
951
  <table class="tbl reveal">
768
- <thead><tr><th>编辑器</th><th>技能目录</th><th>技能支持</th><th>自动创建</th></tr></thead>
952
+ <caption>8 个 Agent 的技能入口、自动 Hook 与规则接线</caption>
953
+ <thead><tr><th scope="col">Agent</th><th scope="col">技能 / 入口</th><th scope="col">自动 Hook</th><th scope="col">规则接线</th></tr></thead>
769
954
  <tbody>
770
- <tr><td>Cursor</td><td class="mono">.cursor/skills/</td><td class="yes">✅</td><td>已存在时</td></tr>
771
- <tr><td>Claude Code</td><td class="mono">.claude/skills/</td><td class="yes">✅</td><td>已存在时</td></tr>
772
- <tr><td>CodeBuddy</td><td class="mono">.codebuddy/skills/</td><td class="yes">✅</td><td class="yes">自动</td></tr>
773
- <tr><td>Qoder</td><td class="mono">.qoder/skills/</td><td class="yes">✅</td><td class="yes">自动</td></tr>
774
- <tr><td>OpenCode</td><td class="mono">.opencode/skills/</td><td class="yes">✅</td><td class="yes">自动</td></tr>
775
- <tr><td>昆仑智码(KunlunZhima)</td><td class="mono">.kunlunzhima/skills/ + commands/opsx/</td><td class="yes">✅</td><td class="yes">自动</td></tr>
776
- <tr><td>WorkBuddy</td><td class="mono">.workbuddy/skills/</td><td class="yes">✅</td><td class="yes">自动</td></tr>
777
- <tr><td>Codex</td><td class="mono">.agents/skills/</td><td class="yes">✅</td><td class="yes">自动</td></tr>
955
+ <tr><td>Cursor</td><td class="mono">.cursor/skills/</td><td>—</td><td class="mono">.cursor/rules/*.mdc</td></tr>
956
+ <tr><td>Claude Code</td><td class="mono">.claude/skills/</td><td class="yes">L1 + L2</td><td class="mono">.claude/rules/*.md</td></tr>
957
+ <tr><td>CodeBuddy</td><td class="mono">.codebuddy/skills/</td><td class="yes">L1 + L2</td><td class="mono">.codebuddy/rules/*.md</td></tr>
958
+ <tr><td>Qoder</td><td class="mono">.qoder/skills/</td><td>—</td><td class="mono">.qoder/rules/*.md</td></tr>
959
+ <tr><td>OpenCode</td><td class="mono">.opencode/skills/(skills-only)</td><td>—</td><td class="mono">opencode.json instructions</td></tr>
960
+ <tr><td>昆仑智码</td><td class="mono">.kunlunzhima/skills/ + commands/opsx/</td><td>—</td><td class="mono">.kunlunzhima/.rules/*.mdc</td></tr>
961
+ <tr><td>WorkBuddy</td><td class="mono">.workbuddy/skills/</td><td>—</td><td class="mono">.workbuddy/rules/*.md + 上下文索引</td></tr>
962
+ <tr><td>Codex</td><td class="mono">.agents/skills/</td><td>—</td><td class="mono">AGENTS.md managed marker</td></tr>
778
963
  </tbody>
779
964
  </table>
780
965
 
@@ -788,7 +973,7 @@ npx kld-sdd">复制</button>
788
973
  <li>按工作流依次执行 spec → design → task → check → apply</li>
789
974
  </ol>
790
975
  <div class="cmd">/opsx-propose add-user-auth</div>
791
- <p class="note">技能从 <code>.cursor/skills/opsx-*/</code> 自动加载;未部署自动 Hook,apply 前请确认已完成 check。</p>
976
+ <p class="note">技能从 <code>.cursor/skills/opsx-*/</code> 自动加载;规则由 <code>.cursor/rules/*.mdc</code> 原生加载。没有 L1/L2 Hook,apply 仍有通用 L3 自检与 Git/CI 证据门禁。</p>
792
977
  </div>
793
978
 
794
979
  <div class="editor-card reveal" id="ed-claude">
@@ -800,7 +985,7 @@ npx kld-sdd">复制</button>
800
985
  <li>按顺序走完 propose → spec → design → task → check → apply → archive</li>
801
986
  </ol>
802
987
  <div class="cmd">/opsx-propose add-user-auth</div>
803
- <p class="note">已部署 <code>.claude/hooks/</code> 三层门禁(L1 Skill / L2 写入 / L3 自检),apply 前自动校验 check 状态。</p>
988
+ <p class="note">自动部署 <code>.claude/hooks/</code> L1 Skill / L2 写入门禁,并保守合并 <code>settings.json</code>;L3 是所有 Agent 共用的 skill 自检。</p>
804
989
  </div>
805
990
 
806
991
  <div class="editor-card featured reveal" id="ed-codebuddy">
@@ -813,7 +998,7 @@ npx kld-sdd">复制</button>
813
998
  <li>SDD Hook Pack 已随初始化自动生效(lint / 测试 / 危险命令门禁),无需额外配置</li>
814
999
  </ol>
815
1000
  <div class="cmd">/opsx-propose add-user-auth</div>
816
- <p class="note">项目 Skills 在 <code>.codebuddy/skills/</code>,上下文文件为 <code>CODEBUDDY.md</code>。Windows 可用 <code>Alt+M</code> 切换权限模式;Hooks Prompt 更可靠,适合 lint/test 门禁。</p>
1001
+ <p class="note">项目 Skills 在 <code>.codebuddy/skills/</code>,上下文文件为 <code>CODEBUDDY.md</code>。初始化会自动部署 L1/L2 Hook Pack 并保守合并设置;L3 自检仍由 skill 执行。</p>
817
1002
  </div>
818
1003
 
819
1004
  <div class="editor-card featured reveal" id="ed-kunlunzhima">
@@ -822,11 +1007,11 @@ npx kld-sdd">复制</button>
822
1007
  <ol>
823
1008
  <li>从企业平台安装 VSIX 插件,登录后打开项目</li>
824
1009
  <li>切换到 <b>Craft</b> 模式(Win: <code>Alt+I</code>)进行多文件编码</li>
825
- <li>在对话中输入 <code>/opsx-propose</code> 等 OPSX 命令,或从 <code>.kunlunzhima/commands/opsx/</code> 入口调用</li>
1010
+ <li>在对话中输入 <code>/opsx:propose</code> 等 OPSX 命令,或从 <code>.kunlunzhima/commands/opsx/</code> 入口调用</li>
826
1011
  <li>设置 → Skills 可查看/管理已加载的项目技能</li>
827
1012
  </ol>
828
- <div class="cmd">/opsx-propose add-user-auth</div>
829
- <p class="note">项目 Skills 在 <code>.kunlunzhima/skills/</code>,命令 bridge <code>.kunlunzhima/commands/opsx/</code>(指向对应 SKILL.md)。项目上下文文件为 <code>KunLunZhiMa.md</code>;IDE 无自动 Hook,质量靠 Skill 自检与 check 阶段保障。纯问答用 Ask 模式(<code>Alt+L</code>)。</p>
1013
+ <div class="cmd">/opsx:propose add-user-auth</div>
1014
+ <p class="note">项目 Skills 在 <code>.kunlunzhima/skills/</code>,13 个 command bridge 位于 <code>.kunlunzhima/commands/opsx/</code>。规则使用 <code>.kunlunzhima/.rules/*.mdc</code>;无自动 Hook,使用 L3 自检与 Git/CI 证据门禁。</p>
830
1015
  </div>
831
1016
 
832
1017
  <div class="editor-card reveal" id="ed-qoder">
@@ -838,7 +1023,7 @@ npx kld-sdd">复制</button>
838
1023
  <li>按工作流推进各阶段技能</li>
839
1024
  </ol>
840
1025
  <div class="cmd">/opsx-propose add-user-auth</div>
841
- <p class="note">技能从 <code>.qoder/skills/opsx-*/</code> 加载;未部署自动 Hook。</p>
1026
+ <p class="note">技能从 <code>.qoder/skills/opsx-*/</code> 加载,规则从 <code>.qoder/rules/*.md</code> 原生加载;未部署自动 Hook。</p>
842
1027
  </div>
843
1028
 
844
1029
  <div class="editor-card reveal" id="ed-opencode">
@@ -851,7 +1036,7 @@ npx kld-sdd">复制</button>
851
1036
  <li>按 propose → spec → design → task → check → apply 推进</li>
852
1037
  </ol>
853
1038
  <div class="cmd">/opsx-propose add-user-auth</div>
854
- <p class="note">技能在 <code>.opencode/skills/opsx-*/</code>;OpenCode skill 注册为 <code>/opsx-*</code> 斜杠命令。未部署 Hook。若同时 init Claude/Codex,OpenCode 也会读取 <code>.claude/skills</code> / <code>.agents/skills</code>,同名 skill 可能冲突;纯 OpenCode 可设 <code>OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=true</code>。</p>
1039
+ <p class="note">技能在 <code>.opencode/skills/opsx-*/</code>,不部署独立 command bridge;规则接入 <code>opencode.json</code> instructions。若同时 init Claude/Codex,OpenCode 也可能读取其 skill,同名冲突时可设 <code>OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=true</code>。</p>
855
1040
  </div>
856
1041
 
857
1042
  <div class="editor-card reveal" id="ed-workbuddy">
@@ -863,7 +1048,7 @@ npx kld-sdd">复制</button>
863
1048
  <li>按 propose → spec → design → task → check → apply 推进</li>
864
1049
  </ol>
865
1050
  <div class="cmd">/opsx-propose add-user-auth</div>
866
- <p class="note">技能从 <code>.workbuddy/skills/opsx-*/</code> 加载。</p>
1051
+ <p class="note">技能从 <code>.workbuddy/skills/opsx-*/</code> 加载;规则部署到 <code>.workbuddy/rules/*.md</code>,并使用上下文文件索引作兼容接线。</p>
867
1052
  </div>
868
1053
 
869
1054
  <div class="editor-card reveal" id="ed-codex">
@@ -871,11 +1056,11 @@ npx kld-sdd">复制</button>
871
1056
  <p>项目级 Agent,skills 部署在 <code>.agents/skills/</code> 供 Codex 会话引用。</p>
872
1057
  <ol>
873
1058
  <li>在项目根启动 Codex Agent 会话</li>
874
- <li>输入 <code>/opsx-propose &lt;变更名&gt;</code> 或引用对应 Skill</li>
1059
+ <li>输入 <code>$opsx-propose</code>、引用对应 Skill,或直接用自然语言说明要创建的变更</li>
875
1060
  <li>按 SDD 工作流逐阶段执行</li>
876
1061
  </ol>
877
- <div class="cmd">/opsx-propose add-user-auth</div>
878
- <p class="note">初始化会自动创建 <code>.agents/skills/opsx-*/</code>;未部署自动 Hook。</p>
1062
+ <div class="cmd">$opsx-propose add-user-auth</div>
1063
+ <p class="note">初始化会创建 <code>.agents/skills/opsx-*/</code>;<code>opsx-rules</code> 通过 AGENTS.md managed marker 接线。Codex 未部署 L1/L2 Hook,仍执行通用 L3 自检。</p>
879
1064
  </div>
880
1065
  </div>
881
1066
  </div>
@@ -885,19 +1070,19 @@ npx kld-sdd">复制</button>
885
1070
  <section id="team">
886
1071
  <div class="wrap">
887
1072
  <div class="sec-head reveal">
888
- <span class="sec-num">§ 7</span>
1073
+ <span class="sec-num">§ 8</span>
889
1074
  <h2 class="sec-title">团队协作流程</h2>
890
1075
  </div>
891
- <p class="sec-sub reveal">一次初始化,全员复用。规范随 Git 提交,新成员 clone 即得一致环境。</p>
1076
+ <p class="sec-sub reveal">规范、skills、归档报告与执行日志可随 Git 共享;本地 telemetry 状态和 Engineering KB 凭据保持隔离。</p>
892
1077
 
893
1078
  <div class="roles">
894
1079
  <div class="role reveal">
895
1080
  <h4>👤 架构师 / TL <span class="em">(配置一次)</span></h4>
896
1081
  <ol>
897
1082
  <li>在项目中运行 <code>npx kld-sdd</code></li>
898
- <li>将团队规范文档放入 <code>team-configs/</code></li>
899
- <li>将自定义 skills 放入 <code>.*/skills/</code></li>
900
- <li>提交到 Git</li>
1083
+ <li>运行 <code>opsx-rules generate</code> 生成 5 主题项目规则</li>
1084
+ <li>使用 <code>opsx-rules review</code> 对照代码事实审查更新</li>
1085
+ <li>提交规则、skills、OpenSpec 文档和归档产物</li>
901
1086
  </ol>
902
1087
  </div>
903
1088
  <div class="role reveal">
@@ -905,11 +1090,12 @@ npx kld-sdd">复制</button>
905
1090
  <ol>
906
1091
  <li><code>git clone &lt;project&gt;</code></li>
907
1092
  <li><code>npm install</code></li>
908
- <li><code>npx kld-sdd</code> 一键配置所有 AI 工具</li>
909
- <li>激活 <code>/opsx-propose</code> 开始工作</li>
1093
+ <li><code>npx kld-sdd --tool &lt;agent&gt;</code> 部署本人使用的 profile</li>
1094
+ <li>配置个人 Engineering KB API key,再激活 <code>opsx-propose</code></li>
910
1095
  </ol>
911
1096
  </div>
912
1097
  </div>
1098
+ <div class="callout reveal"><b>不会进 Git 的本地状态:</b><code>skywalk-sdd/events/</code>、<code>skywalk-sdd/state/</code> 与 KB 的 <code>.local/state.json</code>。新 clone 需要再次运行初始化以安装本地 Git hook;API key 不应写入仓库。</div>
913
1099
  </div>
914
1100
  </section>
915
1101
 
@@ -917,43 +1103,62 @@ npx kld-sdd">复制</button>
917
1103
  <section id="telemetry">
918
1104
  <div class="wrap">
919
1105
  <div class="sec-head reveal">
920
- <span class="sec-num">§ 8</span>
921
- <h2 class="sec-title">度量与三层门禁</h2>
1106
+ <span class="sec-num">§ 9</span>
1107
+ <h2 class="sec-title">度量、门禁与成熟度</h2>
1108
+ </div>
1109
+ <p class="sec-sub reveal">SkyWalk-SDD V3 以纯 CLI 采集结构化事件。单次变更报告只展示当前 change;项目级报告才负责跨变更聚合。</p>
1110
+
1111
+ <div class="metric-grid">
1112
+ <div class="metric reveal"><div class="key">E1</div><h4>场景交付效率</h4><div class="value">有效阶段总时长 ÷ 场景数</div><p>包含返工阶段;没有可识别场景时标记不可用,不伪造分母。</p></div>
1113
+ <div class="metric reveal"><div class="key">Q3</div><h4>规格质量分</h4><div class="value">(总项 − errors) ÷ 总项 × 100</div><p>warnings 与 suggestions 单独展示;独立 reviewer 才能得到 verified 状态。</p></div>
1114
+ <div class="metric reveal"><div class="key">P4</div><h4>质量门禁执行率</h4><div class="value">首次 apply 前有 check = 1</div><p>用事件顺序验证流程纪律,而不是只看最终是否补过 check。</p></div>
1115
+ <div class="metric reveal"><div class="key">P-R</div><h4>返工强度</h4><div class="value">次数 + 原因分布</div><p>记录需求、规格、设计、代码、测试等返工原因,支持趋势复盘。</p></div>
1116
+ <div class="metric reveal"><div class="key">P-H</div><h4>Telemetry 健康度</h4><div class="value">doctor health × 100</div><p>与 P-C 阶段闭合率一起判断数据是否足够可信。</p></div>
922
1117
  </div>
923
- <p class="sec-sub reveal">SkyWalk-SDD 把度量嵌入 skill 流程自动采集,无需配置 MCP;apply 前置三层门禁确保变更已通过 check。</p>
924
1118
 
925
- <p class="lead reveal" style="margin-top:24px"><b>SkyWalk-SDD Telemetry</b>:事件落 <code>skywalk-sdd/events/</code>(gitignored),最终报告落 <code>openspec/changes/&lt;change&gt;/reports/</code>,执行日志随 change 提交。</p>
1119
+ <p class="lead reveal" style="margin-top:32px"><b>事件与单变更报告</b>:事件落 <code>skywalk-sdd/events/</code>、活跃状态落 <code>skywalk-sdd/state/</code>(均 gitignored);归档报告落 <code>openspec/changes/archive/&lt;date&gt;-&lt;name&gt;/reports/</code>。</p>
926
1120
  <div class="codeblock reveal">
927
- <button class="copy" data-copy="node skywalk-sdd/log.cjs start --command=propose --project=. --change=xxx
928
- node skywalk-sdd/log.cjs end --event-id=evt_xxx --result=success --summary=&quot;...&quot;
929
- node skywalk-sdd/log.cjs metrics --project=.">复制</button>
930
- <pre><span class="k-c"># 阶段开始 / 结束 / 查看四维度指标</span>
931
- <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">start</span> --command=propose --project=. --change=xxx
932
- <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">end</span> --event-id=evt_xxx --result=success --summary=<span class="k-o">"..."</span>
933
- <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">metrics</span> --project=.</pre>
1121
+ <button type="button" class="copy" data-copy="node skywalk-sdd/log.cjs start --command=propose --project=. --change=add-user-auth --agent=codex --source=opsx-skill --session-id=sess_001
1122
+ node skywalk-sdd/log.cjs end --event-id=evt_xxx --project=. --result=success --summary=&quot;proposal 完成&quot;
1123
+ node skywalk-sdd/log.cjs report --project=. --change=add-user-auth --format=html --output=reports/add-user-auth.html">复制</button>
1124
+ <pre><span class="k-c"># skill 会自动调用;手工排障时也可直接运行</span>
1125
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">start</span> --command=propose --project=. --change=add-user-auth --agent=codex --source=opsx-skill --session-id=sess_001
1126
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">end</span> --event-id=evt_xxx --project=. --result=success --summary=<span class="k-o">"proposal 完成"</span>
1127
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">report</span> --project=. --change=add-user-auth --format=html --output=reports/add-user-auth.html</pre>
934
1128
  </div>
935
1129
 
936
- <p class="lead reveal" style="margin-top:32px"><b>apply 前三层门禁体系</b>:</p>
1130
+ <p class="lead reveal" style="margin-top:32px"><b>双周 / 月度跟踪</b>:周期报告要求完整窗口,并自动构建当前、前一期、前两期的对比。</p>
1131
+ <div class="codeblock reveal">
1132
+ <button type="button" class="copy" data-copy="node skywalk-sdd/log.cjs report --project=. --period=biweekly --date-from=2026-07-15 --date-to=2026-07-28 --format=html --output=reports/biweekly-2026-07-28.html
1133
+ node skywalk-sdd/log.cjs report --project=. --period=monthly --date-from=2026-07-01 --date-to=2026-07-31 --format=html --output=reports/monthly-2026-07.html">复制</button>
1134
+ <pre><span class="k-c"># 双周必须是含首尾 14 天;月度必须是完整自然月</span>
1135
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">report</span> --project=. --period=biweekly --date-from=2026-07-15 --date-to=2026-07-28 --format=html --output=reports/biweekly-2026-07-28.html
1136
+ <span class="k-p">➜</span> <span class="k-s">node</span> skywalk-sdd/log.cjs <span class="k-f">report</span> --project=. --period=monthly --date-from=2026-07-01 --date-to=2026-07-31 --format=html --output=reports/monthly-2026-07.html</pre>
1137
+ </div>
1138
+ <div class="callout reveal"><b>输出口径:</b>独立 <code>report</code> 一次输出所选格式(默认 HTML;未给 <code>--output</code> 时打印到终端)。<code>opsx-archive</code> 固定生成 <code>report.md + report.html + report.json</code> 三产物,并只登记真实写入成功的文件。单次变更 HTML 是桌面四页签:概览、指标与阶段、问题与证据、产物与追溯;标准测量阶段为 propose/spec/design/task/check/apply/archive,test/explore 只作辅助证据。文档完成度与事件可追溯度、问题类别数与规则命中次数、指标可计算性与可信度分别展示。P50/P75/P90 等趋势只属于项目级报告。</div>
1139
+
1140
+ <p class="lead reveal" style="margin-top:32px"><b>apply 前门禁体系</b>:</p>
937
1141
  <div class="gates">
938
1142
  <div class="gate reveal">
939
- <div class="lv">L1 · SKILL 级</div>
1143
+ <div class="lv">L1 · SKILL 级 · Claude / CodeBuddy</div>
940
1144
  <h4>PreToolUse(Skill) 阻断</h4>
941
1145
  <p>在 Skill 被调用的瞬间阻断:指定 change 精确检查是否完成 check;未指定则扫描所有变更,至少一个完成 check 才放行。</p>
942
1146
  <div class="f">sdd-skill-apply-gate.cjs</div>
943
1147
  </div>
944
1148
  <div class="gate reveal">
945
- <div class="lv">L2 · 文件写入</div>
1149
+ <div class="lv">L2 · 文件写入 · Claude / CodeBuddy</div>
946
1150
  <h4>PreToolUse(Write|Edit) 阻断</h4>
947
1151
  <p>在文件写入操作时阻断,防止未通过 check 的变更直接落代码。与 L1 形成双重保障。</p>
948
1152
  <div class="f">sdd-apply-gate.cjs</div>
949
1153
  </div>
950
1154
  <div class="gate reveal">
951
- <div class="lv">L3 · SKILL 自检</div>
1155
+ <div class="lv">L3 · SKILL 自检 · 全部 Agent</div>
952
1156
  <h4>技能内部自检</h4>
953
1157
  <p>opsx-apply SKILL.md Step 1.2 作为最后一道防线,主动确认 check 已完成,未完成强制拒绝。</p>
954
1158
  <div class="f">opsx-apply/SKILL.md §1.2</div>
955
1159
  </div>
956
1160
  </div>
1161
+ <div class="callout reveal"><b>不要混淆:</b>只有 Claude Code 与 CodeBuddy 自动获得 L1/L2 Hook;Cursor、Qoder、昆仑智码、OpenCode、WorkBuddy、Codex 依靠通用 L3 自检,再由 Git hook / CI 的证据门禁兜底。</div>
957
1162
  </div>
958
1163
  </section>
959
1164
 
@@ -961,38 +1166,48 @@ node skywalk-sdd/log.cjs metrics --project=.">复制</button>
961
1166
  <section id="faq">
962
1167
  <div class="wrap">
963
1168
  <div class="sec-head reveal">
964
- <span class="sec-num">§ 9</span>
1169
+ <span class="sec-num">§ 10</span>
965
1170
  <h2 class="sec-title">常见问题</h2>
966
1171
  </div>
967
1172
  <div class="faq">
968
1173
  <div class="faq-item reveal">
969
- <button class="faq-q">openspec 是什么,必须安装吗?<span class="chev">+</span></button>
970
- <div class="faq-a"><div class="inner"><p><code>openspec</code> 是管理 SDD 变更目录的 CLI 工具(负责创建变更目录和读取指导规则)。运行 <code>npx kld-sdd</code> 时会自动安装;若安装失败,手动创建 <code>openspec/changes/&lt;name&gt;/</code> 目录后 skills 仍然可用。</p></div></div>
1174
+ <button type="button" class="faq-q" id="faq-q-1" aria-expanded="false" aria-controls="faq-a-1">OpenSpec 是什么,必须安装吗?<span class="chev" aria-hidden="true">+</span></button>
1175
+ <div class="faq-a" id="faq-a-1" role="region" aria-labelledby="faq-q-1" aria-hidden="true"><div class="inner"><p><code>openspec</code> 负责变更列表、创建、状态与阶段指导。初始化会先检测,缺失时询问是否安装;拒绝或安装失败仍可继续部署 kld-sdd,但依赖 <code>openspec list/new/status/instructions</code> 的阶段会降级,不能只靠手建目录获得完整体验。</p></div></div>
1176
+ </div>
1177
+ <div class="faq-item reveal">
1178
+ <button type="button" class="faq-q" id="faq-q-2" aria-expanded="false" aria-controls="faq-a-2">为什么是 13 + 6,而不是 19 个命令?<span class="chev" aria-hidden="true">+</span></button>
1179
+ <div class="faq-a" id="faq-a-2" role="region" aria-labelledby="faq-q-2" aria-hidden="true"><div class="inner"><p>13 个是可直接调用的入口:8 个生命周期技能、3 个辅助技能,以及 <code>opsx-ontology-query</code> / <code>opsx-kb-ingest</code>。另外 6 个 <code>opsx-tdd-*</code> 是被主流程加载的配套能力包,不注册为独立命令;初始化总共部署 19 个 skill 目录。</p></div></div>
1180
+ </div>
1181
+ <div class="faq-item reveal">
1182
+ <button type="button" class="faq-q" id="faq-q-3" aria-expanded="false" aria-controls="faq-a-3">我选择的 Agent 目录不存在怎么办?<span class="chev" aria-hidden="true">+</span></button>
1183
+ <div class="faq-a" id="faq-a-3" role="region" aria-labelledby="faq-q-3" aria-hidden="true"><div class="inner"><p>运行 <code>npx kld-sdd --tool &lt;agent&gt;</code> 会自动创建所选 profile 的技能目录。未选择的 Agent 不会被部署;可用逗号一次选择多个,或使用 <code>--tool all</code>。</p></div></div>
971
1184
  </div>
972
1185
  <div class="faq-item reveal">
973
- <button class="faq-q">我用 CodeBuddy Codex,目录不存在怎么办?<span class="chev">+</span></button>
974
- <div class="faq-a"><div class="inner"><p>不用担心,运行 <code>npx kld-sdd</code> 会自动创建 <code>.codebuddy/skills/</code>、<code>.kunlunzhima/</code>、<code>.agents/skills/</code> 等目录。只需在初始化时按提示选择对应编辑器即可。</p></div></div>
1186
+ <button type="button" class="faq-q" id="faq-q-4" aria-expanded="false" aria-controls="faq-a-4">opsx-propose 和直接让 AI 写代码有什么区别?<span class="chev" aria-hidden="true">+</span></button>
1187
+ <div class="faq-a" id="faq-a-4" role="region" aria-labelledby="faq-q-4" aria-hidden="true"><div class="inner"><p>propose 会先确认模式、测试策略、变更类型、change-id Continuity,再由 spec/design/task 把意图变成可追踪契约。本体层同步物化实体与关系,apply 按已通过 check 的契约实施,显著减少隐含假设和返工。</p></div></div>
975
1188
  </div>
976
1189
  <div class="faq-item reveal">
977
- <button class="faq-q">opsx-propose 和直接让 AI 写代码有什么区别?<span class="chev">+</span></button>
978
- <div class="faq-a"><div class="inner"><p>直接让 AI 写代码,AI 会凭空假设很多细节,导致返工。SDD 流程强制先把"要做什么"写清楚——propose 问清意图、spec 写成精确契约、design 定方案、task 拆成原子任务,AI 按契约实现,减少歧义和返工。</p></div></div>
1190
+ <button type="button" class="faq-q" id="faq-q-5" aria-expanded="false" aria-controls="faq-a-5">团队规范已经有了,怎么让每个 Agent 加载?<span class="chev" aria-hidden="true">+</span></button>
1191
+ <div class="faq-a" id="faq-a-5" role="region" aria-labelledby="faq-q-5" aria-hidden="true"><div class="inner"><p>运行 <code>opsx-rules generate</code> 生成架构、编码、测试、数据安全、Git 提交五类规则,再用 <code>opsx-rules review</code> 审查更新。它会按 profile 写入原生规则目录或配置接线,而不是依赖已移除的 <code>team-configs/</code>。</p></div></div>
979
1192
  </div>
980
1193
  <div class="faq-item reveal">
981
- <button class="faq-q">团队规范已经有了,怎么让 AI 每次都遵守?<span class="chev">+</span></button>
982
- <div class="faq-a"><div class="inner"><p>将规范文档转为 skill 文件,部署到 <code>.*/skills/</code> 目录后,AI 编辑器激活该 skill 时会自动遵守这些规范。规范随 Git 提交,全员一致。</p></div></div>
1194
+ <button type="button" class="faq-q" id="faq-q-6" aria-expanded="false" aria-controls="faq-a-6">check 阶段会修改我的文档吗?<span class="chev" aria-hidden="true">+</span></button>
1195
+ <div class="faq-a" id="faq-a-6" role="region" aria-labelledby="faq-q-6" aria-hidden="true"><div class="inner"><p>不会修改人工编写的 proposal/spec/design/tasks 或业务代码。check 会完整重建可再生的 ontology、索引、diagnostics telemetry,并把工作态 revision 标记为 pending;发现的问题仍交回对应 authoring skill 修正。</p></div></div>
983
1196
  </div>
984
1197
  <div class="faq-item reveal">
985
- <button class="faq-q">check 阶段会修改我的文档吗?<span class="chev">+</span></button>
986
- <div class="faq-a"><div class="inner"><p>不会。check 是<b>只读检查</b>,即使发现代码相关问题也只记录在检查报告中,不自动修复。文档修复由你决定,推荐运行对应的 <code>/opsx-spec</code> <code>/opsx-design</code> 修复;代码修复在 <code>/opsx-apply</code> 阶段进行。</p></div></div>
1198
+ <button type="button" class="faq-q" id="faq-q-7" aria-expanded="false" aria-controls="faq-a-7">报告和 Archive Package 在哪里?<span class="chev" aria-hidden="true">+</span></button>
1199
+ <div class="faq-a" id="faq-a-7" role="region" aria-labelledby="faq-q-7" aria-hidden="true"><div class="inner"><p>归档目录是 <code>openspec/changes/archive/&lt;date&gt;-&lt;name&gt;/</code>,报告位于其 <code>reports/</code>,执行日志位于 <code>logs/</code>;完整 zip 与归档目录相邻。成功后 <code>opsx-kb-ingest</code> 会把 zip 入库,并可写入 <code>ingest-receipt.json</code>。</p></div></div>
987
1200
  </div>
988
1201
  <div class="faq-item reveal">
989
- <button class="faq-q">apply 会自动帮我 git commit 吗?<span class="chev">+</span></button>
990
- <div class="faq-a"><div class="inner"><p>不会。apply 遵循 <b>Git 只读策略</b>——禁止为度量自动 <code>git init/add/commit</code> 或创建分支;Git 仅作为可选度量数据源(只读 <code>git rev-parse HEAD</code> 等)。非 Git 项目用 <code>vcs_mode=no-git</code> 继续执行。只有用户明确要求时才允许提交。</p></div></div>
1202
+ <button type="button" class="faq-q" id="faq-q-8" aria-expanded="false" aria-controls="faq-a-8">apply 会自动帮我 Git commit 吗?<span class="chev" aria-hidden="true">+</span></button>
1203
+ <div class="faq-a" id="faq-a-8" role="region" aria-labelledby="faq-q-8" aria-hidden="true"><div class="inner"><p>Telemetry 不会为了度量偷偷执行 <code>git init/add/commit</code>。常规 apply 也不会擅自提交;只有用户明确授权 worktree 提交或合并流程时,才会按对应步骤执行 Git 写操作。非 Git 项目仍可用 <code>vcs_mode=no-git</code> 继续。</p></div></div>
991
1204
  </div>
992
1205
  </div>
993
1206
  </div>
994
1207
  </section>
995
1208
 
1209
+ </main>
1210
+
996
1211
  <!-- footer -->
997
1212
  <footer>
998
1213
  <div class="wrap">
@@ -1001,10 +1216,12 @@ node skywalk-sdd/log.cjs metrics --project=.">复制</button>
1001
1216
  <div class="meta">
1002
1217
  <span>作者:郑浩天</span>
1003
1218
  <span class="sep">·</span>
1004
- <span>更新日期:2026-07-12</span>
1219
+ <span>更新日期:2026-07-28</span>
1005
1220
  </div>
1006
1221
  <div class="links">
1007
1222
  <a href="https://www.npmjs.com/package/@hunterzheng/kld-sdd" target="_blank" rel="noopener">npm</a>
1223
+ <a href="https://github.com/hunterzheng1/kld-sdd" target="_blank" rel="noopener">GitHub</a>
1224
+ <a href="https://github.com/hunterzheng1/kld-sdd/issues" target="_blank" rel="noopener">Issues</a>
1008
1225
  <a href="#top">回到顶部 ↑</a>
1009
1226
  </div>
1010
1227
  <p style="margin-top:18px;opacity:.6">MIT License · 本页基于 kld-sdd 真实 README 与 SKILL.md 生成</p>
@@ -1046,8 +1263,11 @@ node skywalk-sdd/log.cjs metrics --project=.">复制</button>
1046
1263
  if (e.isIntersecting){
1047
1264
  var id = '#' + e.target.id;
1048
1265
  navLinks.forEach(function(a){
1049
- a.style.color = (a.getAttribute('href') === id) ? 'var(--accent)' : '';
1050
- a.style.background = (a.getAttribute('href') === id) ? 'var(--surface-2)' : '';
1266
+ var active = a.getAttribute('href') === id;
1267
+ a.style.color = active ? 'var(--accent)' : '';
1268
+ a.style.background = active ? 'var(--surface-2)' : '';
1269
+ if (active) a.setAttribute('aria-current', 'location');
1270
+ else a.removeAttribute('aria-current');
1051
1271
  });
1052
1272
  }
1053
1273
  });
@@ -1058,10 +1278,20 @@ node skywalk-sdd/log.cjs metrics --project=.">复制</button>
1058
1278
  /* ── 移动端菜单 ── */
1059
1279
  var menuBtn = document.getElementById('menuBtn');
1060
1280
  var navLinksEl = document.getElementById('navLinks');
1061
- menuBtn && menuBtn.addEventListener('click', function(){ navLinksEl.classList.toggle('open'); });
1281
+ function setMenu(open){
1282
+ if (!menuBtn || !navLinksEl) return;
1283
+ navLinksEl.classList.toggle('open', open);
1284
+ menuBtn.setAttribute('aria-expanded', String(open));
1285
+ menuBtn.setAttribute('aria-label', open ? '关闭页面导航' : '打开页面导航');
1286
+ }
1287
+ menuBtn && menuBtn.addEventListener('click', function(){
1288
+ setMenu(!navLinksEl.classList.contains('open'));
1289
+ });
1062
1290
  navLinksEl && navLinksEl.addEventListener('click', function(e){
1063
- if (e.target.tagName === 'A') navLinksEl.classList.remove('open');
1291
+ if (e.target.tagName === 'A') setMenu(false);
1064
1292
  });
1293
+ document.addEventListener('keydown', function(e){ if (e.key === 'Escape') setMenu(false); });
1294
+ window.addEventListener('resize', function(){ if (window.innerWidth > 760) setMenu(false); });
1065
1295
 
1066
1296
  /* ── 管线阶段点击跳转 + 高亮 ── */
1067
1297
  document.querySelectorAll('.stage').forEach(function(stage){
@@ -1081,26 +1311,65 @@ node skywalk-sdd/log.cjs metrics --project=.">复制</button>
1081
1311
 
1082
1312
  /* ── FAQ 折叠 ── */
1083
1313
  document.querySelectorAll('.faq-q').forEach(function(btn){
1314
+ var panel = document.getElementById(btn.getAttribute('aria-controls'));
1315
+ btn.setAttribute('aria-expanded', 'false');
1316
+ if (panel) panel.setAttribute('aria-hidden', 'true');
1084
1317
  btn.addEventListener('click', function(){
1085
1318
  var item = btn.parentElement;
1086
1319
  var wasOpen = item.classList.contains('open');
1087
- document.querySelectorAll('.faq-item').forEach(function(i){ i.classList.remove('open'); });
1088
- if (!wasOpen) item.classList.add('open');
1320
+ document.querySelectorAll('.faq-item').forEach(function(i){
1321
+ i.classList.remove('open');
1322
+ var q = i.querySelector('.faq-q');
1323
+ var a = i.querySelector('.faq-a');
1324
+ if (q) q.setAttribute('aria-expanded', 'false');
1325
+ if (a) {
1326
+ a.setAttribute('aria-hidden', 'true');
1327
+ a.style.maxHeight = '';
1328
+ }
1329
+ });
1330
+ if (!wasOpen) {
1331
+ item.classList.add('open');
1332
+ btn.setAttribute('aria-expanded', 'true');
1333
+ if (panel) {
1334
+ panel.setAttribute('aria-hidden', 'false');
1335
+ panel.style.maxHeight = panel.scrollHeight + 'px';
1336
+ }
1337
+ }
1089
1338
  });
1090
1339
  });
1091
1340
 
1092
1341
  /* ── 代码块复制 ── */
1342
+ function copyText(text){
1343
+ if (navigator.clipboard && window.isSecureContext) {
1344
+ return navigator.clipboard.writeText(text).then(function(){ return true; }, function(){ return fallbackCopy(text); });
1345
+ }
1346
+ return Promise.resolve(fallbackCopy(text));
1347
+ }
1348
+ function fallbackCopy(text){
1349
+ var input = document.createElement('textarea');
1350
+ input.value = text;
1351
+ input.setAttribute('readonly', '');
1352
+ input.style.position = 'fixed';
1353
+ input.style.opacity = '0';
1354
+ document.body.appendChild(input);
1355
+ input.select();
1356
+ input.setSelectionRange(0, input.value.length);
1357
+ var copied = false;
1358
+ try { copied = document.execCommand('copy'); } catch (e) { copied = false; }
1359
+ document.body.removeChild(input);
1360
+ return copied;
1361
+ }
1093
1362
  document.querySelectorAll('.copy').forEach(function(btn){
1363
+ btn.setAttribute('aria-live', 'polite');
1094
1364
  btn.addEventListener('click', function(){
1095
1365
  var text = btn.getAttribute('data-copy') || '';
1096
1366
  /* 去掉行首 prompt 装饰,复制纯净命令 */
1097
1367
  var clean = text.replace(/➜\s*/g, '').replace(/#\s.*$/gm, '').trim();
1098
- if (navigator.clipboard) {
1099
- navigator.clipboard.writeText(clean).then(function(){
1100
- var orig = btn.textContent; btn.textContent = '已复制 ✓';
1101
- setTimeout(function(){ btn.textContent = orig; }, 1400);
1102
- });
1103
- }
1368
+ var orig = btn.textContent;
1369
+ copyText(clean).then(function(copied){
1370
+ btn.textContent = copied ? '已复制 ✓' : '复制失败';
1371
+ setTimeout(function(){ btn.textContent = orig; }, 1600);
1372
+ });
1104
1373
  });
1105
1374
  });
1106
1375
  })();