kld-sdd 2.4.8 → 2.4.10

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 (30) hide show
  1. package/lib/init.js +9 -9
  2. package/package.json +2 -2
  3. package/skywalk-sdd/{index.js → index.cjs} +101 -55
  4. package/templates/ci/github-actions-sdd.yml +3 -3
  5. package/templates/ci/gitlab-ci-sdd.yml +3 -3
  6. package/templates/git-hooks/{pre-push-sdd-check.js → pre-push-sdd-check.cjs} +3 -3
  7. package/templates/hooks/claude/hooks/{sdd-prompt.js → sdd-prompt.cjs} +2 -2
  8. package/templates/hooks/claude/hooks/{sdd-stop.js → sdd-stop.cjs} +1 -1
  9. package/templates/hooks/claude/settings.json +4 -4
  10. package/templates/opsx-commands/apply.md +16 -12
  11. package/templates/opsx-commands/archive.md +8 -8
  12. package/templates/opsx-commands/check.md +8 -8
  13. package/templates/opsx-commands/design.md +3 -3
  14. package/templates/opsx-commands/explore.md +3 -3
  15. package/templates/opsx-commands/propose.md +3 -3
  16. package/templates/opsx-commands/spec.md +3 -3
  17. package/templates/opsx-commands/task.md +4 -4
  18. package/templates/opsx-commands/test.md +5 -5
  19. package/templates/skills/opsx-apply/SKILL.md +12 -6
  20. package/templates/skills/opsx-archive/SKILL.md +8 -8
  21. package/templates/skills/opsx-check/SKILL.md +6 -6
  22. package/templates/skills/opsx-design/SKILL.md +2 -2
  23. package/templates/skills/opsx-explore/SKILL.md +2 -2
  24. package/templates/skills/opsx-propose/SKILL.md +2 -2
  25. package/templates/skills/opsx-spec/SKILL.md +2 -2
  26. package/templates/skills/opsx-task/SKILL.md +2 -2
  27. package/templates/skills/opsx-test/SKILL.md +2 -2
  28. /package/templates/git-hooks/{pre-commit-sdd-check.js → pre-commit-sdd-check.cjs} +0 -0
  29. /package/templates/hooks/claude/hooks/{sdd-post-tool.js → sdd-post-tool.cjs} +0 -0
  30. /package/templates/hooks/claude/hooks/{sdd-pre-tool.js → sdd-pre-tool.cjs} +0 -0
package/lib/init.js CHANGED
@@ -566,7 +566,7 @@ function deployOpsxSkills(selectedTools = Object.keys(TOOL_CONFIGS)) {
566
566
 
567
567
  /**
568
568
  * 部署 Claude Code Hook Pack(可选增强)
569
- * Hook 只调用 skywalk-sdd/log.js,不写私有日志,不替代 OPSX 模板采集。
569
+ * Hook 只调用 skywalk-sdd/log.cjs,不写私有日志,不替代 OPSX 模板采集。
570
570
  */
571
571
  function deployClaudeHookPack(selectedTools = Object.keys(TOOL_CONFIGS)) {
572
572
  if (!selectedTools.includes('claude')) {
@@ -593,7 +593,7 @@ function deployClaudeHookPack(selectedTools = Object.keys(TOOL_CONFIGS)) {
593
593
  }
594
594
 
595
595
  copyDir(hookSourceDir, targetHookDir);
596
- console.log(' ✓ 部署 .claude/hooks/sdd-*.js');
596
+ console.log(' ✓ 部署 .claude/hooks/sdd-*.cjs');
597
597
 
598
598
  const targetSettingsPath = path.join(claudeDir, 'settings.json');
599
599
  const templateSettings = JSON.parse(fs.readFileSync(settingsTemplatePath, 'utf8'));
@@ -790,16 +790,16 @@ function deployTelemetryDataDir() {
790
790
  }
791
791
 
792
792
  // 部署项目内 Telemetry CLI(不依赖 npm 发布)
793
- const telemetrySrc = path.join(pkgPath, 'skywalk-sdd', 'index.js');
794
- const telemetryDst = path.join(dataDir, 'log.js');
793
+ const telemetrySrc = path.join(pkgPath, 'skywalk-sdd', 'index.cjs');
794
+ const telemetryDst = path.join(dataDir, 'log.cjs');
795
795
  if (fs.existsSync(telemetrySrc)) {
796
796
  fs.copyFileSync(telemetrySrc, telemetryDst);
797
- console.log(' ✓ 部署 skywalk-sdd/log.js(本地 Telemetry CLI)');
797
+ console.log(' ✓ 部署 skywalk-sdd/log.cjs(本地 Telemetry CLI)');
798
798
  } else {
799
799
  console.log(` ⚠️ Telemetry CLI 源文件缺失: ${telemetrySrc}`);
800
800
  }
801
801
 
802
- console.log(' ✓ 调用方式: node skywalk-sdd/log.js start|end|metrics');
802
+ console.log(' ✓ 调用方式: node skywalk-sdd/log.cjs start|end|metrics');
803
803
  console.log('✅ Telemetry 已就绪(数据存储在 skywalk-sdd/,无需配置 MCP)');
804
804
  return true;
805
805
  }
@@ -869,8 +869,8 @@ function deployQualityGateTemplates() {
869
869
  console.log(` ⚠️ CI 模板缺失: ${ciTemplateDir}`);
870
870
  }
871
871
 
872
- installGitHookShim(cwd, 'pre-commit', 'skywalk-sdd/git-hooks/pre-commit-sdd-check.js');
873
- installGitHookShim(cwd, 'pre-push', 'skywalk-sdd/git-hooks/pre-push-sdd-check.js');
872
+ installGitHookShim(cwd, 'pre-commit', 'skywalk-sdd/git-hooks/pre-commit-sdd-check.cjs');
873
+ installGitHookShim(cwd, 'pre-push', 'skywalk-sdd/git-hooks/pre-push-sdd-check.cjs');
874
874
 
875
875
  console.log('✅ Git hooks / CI 兜底模板已就绪');
876
876
  return true;
@@ -1086,7 +1086,7 @@ async function main() {
1086
1086
  console.log();
1087
1087
  console.log('📊 SDD Telemetry(嵌入在命令流程中,自动执行,无需配置):');
1088
1088
  console.log(' - 度量数据自动采集到 skywalk-sdd/events/');
1089
- console.log(' - 运行 node skywalk-sdd/log.js metrics --project=. 查看四维度指标');
1089
+ console.log(' - 运行 node skywalk-sdd/log.cjs metrics --project=. 查看四维度指标');
1090
1090
  console.log();
1091
1091
 
1092
1092
  rl.close();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kld-sdd",
3
- "version": "2.4.8",
3
+ "version": "2.4.10",
4
4
  "description": "KLD SDD OpenSpec 项目初始化工具 - 内置模版一键初始化",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -30,7 +30,7 @@
30
30
  "bin/",
31
31
  "lib/",
32
32
  "templates/",
33
- "skywalk-sdd/index.js",
33
+ "skywalk-sdd/index.cjs",
34
34
  "README.md"
35
35
  ]
36
36
  }
@@ -6,9 +6,9 @@
6
6
  * AI Agent 通过终端命令调用,将事件写入项目本地 skywalk-sdd/ 目录。
7
7
  *
8
8
  * 用法:
9
- * node skywalk-sdd/log.js start --command=propose --project=/path --change=xxx [--agent=cursor]
10
- * node skywalk-sdd/log.js end --event-id=evt_xxx --result=success --summary="..."
11
- * node skywalk-sdd/log.js metrics --project=/path [--change=xxx]
9
+ * node skywalk-sdd/log.cjs start --command=propose --project=/path --change=xxx [--agent=cursor]
10
+ * node skywalk-sdd/log.cjs end --event-id=evt_xxx --result=success --summary="..."
11
+ * node skywalk-sdd/log.cjs metrics --project=/path [--change=xxx]
12
12
  */
13
13
 
14
14
  const fs = require('fs');
@@ -171,7 +171,44 @@ function findActiveStage(projectRoot, criteria) {
171
171
  })
172
172
  .sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
173
173
 
174
- return candidates[0] || null;
174
+ if (candidates.length > 0) return candidates[0];
175
+
176
+ // 跨 session 匹配:当 session_id 变化(如 compaction 恢复)但 command+change 相同时,
177
+ // 在 events 目录中搜索最近的 stage_start 事件
178
+ if (criteria.command && criteria.change) {
179
+ const dataDir = getDataDir(projectRoot);
180
+ const eventsDir = path.join(dataDir, 'events');
181
+ if (fs.existsSync(eventsDir)) {
182
+ const changeDirs = fs.readdirSync(eventsDir).filter(d => {
183
+ return fs.statSync(path.join(eventsDir, d)).isDirectory();
184
+ });
185
+ const matchingStarts = [];
186
+ for (const changeDir of changeDirs) {
187
+ const dir = path.join(eventsDir, changeDir);
188
+ const files = fs.readdirSync(dir).filter(f => f.endsWith('.jsonl')).sort().reverse();
189
+ for (const file of files) {
190
+ const lines = fs.readFileSync(path.join(dir, file), 'utf-8').split('\n').filter(Boolean);
191
+ for (let i = lines.length - 1; i >= 0; i--) {
192
+ try {
193
+ const event = JSON.parse(lines[i]);
194
+ if (event.type === 'stage_start' &&
195
+ event.command === criteria.command &&
196
+ event.change === criteria.change &&
197
+ (!criteria.capability || event.capability === criteria.capability)) {
198
+ matchingStarts.push(event);
199
+ }
200
+ } catch {}
201
+ }
202
+ }
203
+ }
204
+ if (matchingStarts.length > 0) {
205
+ matchingStarts.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
206
+ return matchingStarts[0];
207
+ }
208
+ }
209
+ }
210
+
211
+ return null;
175
212
  }
176
213
 
177
214
  function clearActiveStage(projectRoot, event) {
@@ -1358,7 +1395,9 @@ function computeAiAdoptionMetrics(events) {
1358
1395
  const review = getAiAdoptionReview(e);
1359
1396
  return review?.review_status === 'final' || e.status === 'final';
1360
1397
  });
1361
- const latestEvent = latestByTimestamp(finalEvents.length > 0 ? finalEvents : adoptionEvents);
1398
+ // 优先使用 final 事件,无 final fallback snapshot(AI 产出快照)
1399
+ const candidates = finalEvents.length > 0 ? finalEvents : adoptionEvents;
1400
+ const latestEvent = latestByTimestamp(candidates);
1362
1401
  const latestReview = getAiAdoptionReview(latestEvent);
1363
1402
  if (!latestReview) {
1364
1403
  return {
@@ -1628,7 +1667,7 @@ function computeSinglePdfMvpMetrics(events, options = {}) {
1628
1667
  const gitDocumentMetrics = options.projectRoot && options.change
1629
1668
  ? computeGitDocumentMetrics(options.projectRoot, options.change)
1630
1669
  : null;
1631
- const specIterationCount = gitDocumentMetrics
1670
+ const specIterationCount = gitDocumentMetrics?.spec_iteration_count != null
1632
1671
  ? gitDocumentMetrics.spec_iteration_count
1633
1672
  : stageSpecIterationCount;
1634
1673
 
@@ -1805,6 +1844,16 @@ function renderPdfMvpMarkdown(metrics) {
1805
1844
  ].join('\n');
1806
1845
  }
1807
1846
 
1847
+ function formatMsToSeconds(ms) {
1848
+ if (ms == null) return 'null';
1849
+ return `${(ms / 1000).toFixed(2)} s`;
1850
+ }
1851
+
1852
+ function formatRatioToPercent(ratio) {
1853
+ if (ratio == null) return 'null';
1854
+ return `${(ratio * 100).toFixed(1)}%`;
1855
+ }
1856
+
1808
1857
  function renderExecutiveReportMarkdown(report) {
1809
1858
  const metrics = report.metrics;
1810
1859
  const health = report.doctor;
@@ -1818,28 +1867,28 @@ function renderExecutiveReportMarkdown(report) {
1818
1867
  `- 统计范围:${report.change ? `change/${report.change}` : 'project'}`,
1819
1868
  '',
1820
1869
  '## 执行摘要',
1821
- `- Telemetry 健康分:${health.telemetry_health_score ?? 'null'}`,
1822
- `- 阶段闭环率:${health.matched_stage_rate ?? 'null'}`,
1823
- `- 严重问题数:${health.severe_issues?.length || 0}`,
1870
+ `- Telemetry 健康分:${formatRatioToPercent(health.telemetry_health_score)}(0-100%,反映遥测数据的完整性,扣分项包括未闭环阶段、孤儿事件等)`,
1871
+ `- 阶段闭环率:${formatRatioToPercent(health.matched_stage_rate)}(已配对 start/end 的阶段占有效阶段总数的比例)`,
1872
+ `- 严重问题数:${health.severe_issues?.length || 0}(存在未闭环阶段、孤儿事件或未知命令等阻断级问题的数量)`,
1824
1873
  '',
1825
1874
  '## 效率指标',
1826
- `- E1 需求到归档总时长:${metrics.efficiency?.e1_lead_time_ms ?? 'null'} ms`,
1827
- `- E2 编码时间占比:${metrics.efficiency?.e2_coding_time_ratio ?? 'null'}`,
1828
- `- E3 规约时间占比:${metrics.efficiency?.e3_spec_time_ratio ?? 'null'}`,
1829
- `- E4 AI 一次成码率:${metrics.efficiency?.e4_ai_code_first_pass_rate ?? 'null'}`,
1830
- `- 有效阶段总耗时:${metrics.efficiency?.effective_stage_duration_ms ?? 'null'} ms`,
1831
- `- 返工阶段总耗时:${metrics.efficiency?.rework_stage_duration_ms ?? 'null'} ms`,
1875
+ `- E1 需求到归档总时长:${formatMsToSeconds(metrics.efficiency?.e1_lead_time_ms)}`,
1876
+ `- E2 编码时间占比:${formatRatioToPercent(metrics.efficiency?.e2_coding_time_ratio)}`,
1877
+ `- E3 规约时间占比:${formatRatioToPercent(metrics.efficiency?.e3_spec_time_ratio)}`,
1878
+ `- E4 AI 一次成码率:${formatRatioToPercent(metrics.efficiency?.e4_ai_code_first_pass_rate)}`,
1879
+ `- 有效阶段总耗时:${formatMsToSeconds(metrics.efficiency?.effective_stage_duration_ms)}`,
1880
+ `- 返工阶段总耗时:${formatMsToSeconds(metrics.efficiency?.rework_stage_duration_ms)}`,
1832
1881
  '',
1833
1882
  '## 质量指标',
1834
1883
  `- Q1 规约符合度:${metrics.quality?.q1_spec_conformance_score ?? 'null'}`,
1835
- `- Q3 构建一次通过率:${metrics.quality?.q3_build_first_pass_rate ?? 'null'}`,
1836
- `- Q4 规约驱动测试覆盖率:${metrics.quality?.q4_spec_driven_test_coverage ?? 'null'}`,
1884
+ `- Q3 构建一次通过率:${formatRatioToPercent(metrics.quality?.q3_build_first_pass_rate)}`,
1885
+ `- Q4 规约驱动测试覆盖率:${formatRatioToPercent(metrics.quality?.q4_spec_driven_test_coverage)}`,
1837
1886
  `- Q5 跨文档一致性得分:${metrics.quality?.q5_cross_doc_consistency_score ?? 'null'}`,
1838
1887
  '',
1839
1888
  '## 过程指标',
1840
1889
  `- P1 文档迭代次数:${metrics.process?.p1_spec_iteration_count ?? 'null'}`,
1841
- `- P2 AI 代码保留率:${metrics.process?.p2_ai_code_adoption_rate ?? 'null'}`,
1842
- `- P4 质量门前置率:${metrics.process?.p4_quality_gate_enforcement_rate ?? 'null'}`,
1890
+ `- P2 AI 代码保留率:${formatRatioToPercent(metrics.process?.p2_ai_code_adoption_rate)}`,
1891
+ `- P4 质量门前置率:${formatRatioToPercent(metrics.process?.p4_quality_gate_enforcement_rate)}`,
1843
1892
  `- 返工次数:${metrics.process?.rework_summary?.total_rework_attempts ?? 'null'}`,
1844
1893
  `- 被后续成功执行覆盖的未闭环阶段数:${metrics.process?.rework_summary?.superseded_open_stages ?? 'null'}`,
1845
1894
  '',
@@ -1853,22 +1902,13 @@ function renderExecutiveReportMarkdown(report) {
1853
1902
  `- 未勾选任务项:${taskCompletion?.incomplete ?? 'null'}`,
1854
1903
  `- 任务项总数:${taskCompletion?.total ?? 'null'}`,
1855
1904
  '',
1856
- '## 人工反馈',
1857
- `- 平均 NPS:${metrics.manual_insights?.avg_nps ?? 'null'}`,
1858
- `- 平均认知负荷:${metrics.manual_insights?.avg_cognitive_load ?? 'null'}`,
1859
- `- 平均规约疲劳指数:${metrics.manual_insights?.avg_spec_fatigue_index ?? 'null'}`,
1860
- `- 相对传统方式节省时长比例:${metrics.manual_insights?.baseline_time_saved_ratio ?? 'null'}`,
1861
- '',
1862
- '## 数据质量',
1863
- `- 未闭环阶段数:${health.open_stages ?? 'null'}`,
1864
- `- 已被后续成功执行覆盖的未闭环阶段数:${health.superseded_open_stages ?? 'null'}`,
1865
- `- 返工次数:${health.rework_attempts ?? 'null'}`,
1866
- `- 孤儿结束事件数:${health.orphan_events ?? 'null'}`,
1867
- `- 未知命令事件数:${health.unknown_command_events ?? 'null'}`,
1868
- '',
1869
1905
  '## 说明',
1870
1906
  '- `null` 表示当前还没有采集到对应事件或该指标暂不适用。',
1871
- '- Q1 与人工反馈类指标属于评审信号,默认不作为强阻断门禁。',
1907
+ '- E4 AI 一次成码率:依赖 `task_update` 事件中的 `task_id` 和首次执行结果,若 apply 阶段未正确记录则显示 null。',
1908
+ '- P1 文档迭代次数:优先使用 Git 提交历史统计,无 Git 仓库或无提交历史时使用阶段 start 事件数。',
1909
+ '- P2 AI 代码保留率:优先使用 `ai_adoption_review` 的 final 状态,无 final 时 fallback 到 AI 产出快照(ai_snapshot)。',
1910
+ '- Q4 规约驱动测试覆盖率:依赖 check/test 阶段记录 spec 断言到测试用例的映射数据(spec_test_coverage 字段),属高级功能。',
1911
+ '- Q1 规约符合度与人工反馈类指标属于评审信号,默认不作为强阻断门禁。',
1872
1912
  ].join('\n');
1873
1913
  }
1874
1914
 
@@ -2030,7 +2070,7 @@ function cmdStart(args) {
2030
2070
 
2031
2071
  if (!command) {
2032
2072
  console.error('错误: 缺少 --command 参数');
2033
- console.error('用法: node skywalk-sdd/log.js start --command=propose --project=/path');
2073
+ console.error('用法: node skywalk-sdd/log.cjs start --command=propose --project=/path');
2034
2074
  process.exit(1);
2035
2075
  }
2036
2076
 
@@ -2156,7 +2196,7 @@ function cmdEnd(args, options = {}) {
2156
2196
  task_id: args['task-id'] || args.task_id || startEvent?.task_id,
2157
2197
  agent_type: args.agent || args['agent-type'] || startEvent?.agent_type || 'unknown',
2158
2198
  project_root: projectRoot,
2159
- session_id: args['session-id'] || args.session_id || startEvent?.session_id,
2199
+ session_id: startEvent?.session_id || args['session-id'] || args.session_id,
2160
2200
  git_sha: args['git-sha'] || args.git_sha || startEvent?.git_sha,
2161
2201
  timestamp,
2162
2202
  duration_ms: durationMs,
@@ -2244,6 +2284,12 @@ function cmdRecord(args) {
2244
2284
  }
2245
2285
 
2246
2286
  const dataDir = getDataDir(projectRoot);
2287
+ const activeStage = findActiveStage(projectRoot, {
2288
+ session_id: args['session-id'] || args.session_id,
2289
+ change,
2290
+ command: args.command,
2291
+ agent_type: agentType,
2292
+ });
2247
2293
  const eventId = args['event-id'] || args.event_id || generateEventId();
2248
2294
  const timestamp = nowISO();
2249
2295
  const event = cleanOptionalFields({
@@ -2258,7 +2304,7 @@ function cmdRecord(args) {
2258
2304
  task_id: args['task-id'] || args.task_id,
2259
2305
  agent_type: agentType,
2260
2306
  project_root: projectRoot,
2261
- session_id: args['session-id'] || args.session_id,
2307
+ session_id: activeStage?.session_id || args['session-id'] || args.session_id,
2262
2308
  git_sha: args['git-sha'] || args.git_sha,
2263
2309
  timestamp,
2264
2310
  result: args.result,
@@ -2516,7 +2562,7 @@ function cmdArchiveDocs(args) {
2516
2562
  function main() {
2517
2563
  // 支持两种调用方式:
2518
2564
  // 1) npx kld-sdd log start ... → argv 含 'log'
2519
- // 2) node skywalk-sdd/log.js start ... → argv 直接以子命令开头
2565
+ // 2) node skywalk-sdd/log.cjs start ... → argv 直接以子命令开头
2520
2566
  const argv = process.argv.slice(2);
2521
2567
  const logIdx = argv.indexOf('log');
2522
2568
  const subArgs = logIdx === -1 ? argv : argv.slice(logIdx + 1);
@@ -2564,12 +2610,12 @@ function showHelp() {
2564
2610
  SDD Telemetry CLI - 流程度量采集工具
2565
2611
 
2566
2612
  用法:
2567
- node skywalk-sdd/log.js start --command=<cmd> --project=<path> [--change=<name>] [--agent=<type>]
2568
- node skywalk-sdd/log.js end --event-id=<id> --result=<success|failure|partial> --summary="..."
2569
- node skywalk-sdd/log.js metrics --project=<path> [--change=<name>] [--pdf-mvp] [--format=json|markdown]
2570
- node skywalk-sdd/log.js report --project=<path> [--change=<name>] [--format=json|markdown] [--output=<file>]
2571
- node skywalk-sdd/log.js tasks-status --project=<path> --change=<name> [--require-complete]
2572
- node skywalk-sdd/log.js archive-docs --project=<path> --change=<name> [--reason=<text>] [--event-id=<id>] [--report-output=<file>]
2613
+ node skywalk-sdd/log.cjs start --command=<cmd> --project=<path> [--change=<name>] [--agent=<type>]
2614
+ node skywalk-sdd/log.cjs end --event-id=<id> --result=<success|failure|partial> --summary="..."
2615
+ node skywalk-sdd/log.cjs metrics --project=<path> [--change=<name>] [--pdf-mvp] [--format=json|markdown]
2616
+ node skywalk-sdd/log.cjs report --project=<path> [--change=<name>] [--format=json|markdown] [--output=<file>]
2617
+ node skywalk-sdd/log.cjs tasks-status --project=<path> --change=<name> [--require-complete]
2618
+ node skywalk-sdd/log.cjs archive-docs --project=<path> --change=<name> [--reason=<text>] [--event-id=<id>] [--report-output=<file>]
2573
2619
 
2574
2620
  子命令:
2575
2621
  start 记录 SDD 阶段开始,返回 event_id
@@ -2582,18 +2628,18 @@ SDD Telemetry CLI - 流程度量采集工具
2582
2628
  archive-docs 将 Simple/Full spec 变更真实移动到 openspec/changes/archive/,并可结束 archive 阶段生成报告
2583
2629
 
2584
2630
  示例:
2585
- node skywalk-sdd/log.js start --command=propose --project=/my/project --change=user-auth --agent=cursor
2586
- node skywalk-sdd/log.js end --event-id=evt_abc123 --result=success --summary="创建 proposal.md"
2587
- node skywalk-sdd/log.js record --type=task_update --command=apply --project=/my/project --change=user-auth --task-id=TASK-01 --status=completed
2588
- node skywalk-sdd/log.js record --type=conformance_review --command=check --project=/my/project --change=user-auth --source=manual --details-file=conformance-review.json
2589
- node skywalk-sdd/log.js record --type=ai_adoption_review --command=apply --project=/my/project --change=user-auth --status=final --details-file=ai-adoption.json
2590
- node skywalk-sdd/log.js record --type=survey_result --project=/my/project --change=user-auth --source=manual --details-file=survey.json
2591
- node skywalk-sdd/log.js metrics --project=/my/project --change=user-auth
2592
- node skywalk-sdd/log.js metrics --project=/my/project --change=user-auth --pdf-mvp --format=markdown
2593
- node skywalk-sdd/log.js report --project=/my/project --change=user-auth --format=markdown
2594
- node skywalk-sdd/log.js doctor --project=/my/project --change=user-auth
2595
- node skywalk-sdd/log.js tasks-status --project=/my/project --change=user-auth --require-complete
2596
- node skywalk-sdd/log.js archive-docs --project=/my/project --change=user-auth --reason="变更已完成实施" --event-id=evt_archive --report-output=skywalk-sdd/reports/user-auth-report.md
2631
+ node skywalk-sdd/log.cjs start --command=propose --project=/my/project --change=user-auth --agent=cursor
2632
+ node skywalk-sdd/log.cjs end --event-id=evt_abc123 --result=success --summary="创建 proposal.md"
2633
+ node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=/my/project --change=user-auth --task-id=TASK-01 --status=completed
2634
+ node skywalk-sdd/log.cjs record --type=conformance_review --command=check --project=/my/project --change=user-auth --source=manual --details-file=conformance-review.json
2635
+ node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --project=/my/project --change=user-auth --status=final --details-file=ai-adoption.json
2636
+ node skywalk-sdd/log.cjs record --type=survey_result --project=/my/project --change=user-auth --source=manual --details-file=survey.json
2637
+ node skywalk-sdd/log.cjs metrics --project=/my/project --change=user-auth
2638
+ node skywalk-sdd/log.cjs metrics --project=/my/project --change=user-auth --pdf-mvp --format=markdown
2639
+ node skywalk-sdd/log.cjs report --project=/my/project --change=user-auth --format=markdown
2640
+ node skywalk-sdd/log.cjs doctor --project=/my/project --change=user-auth
2641
+ node skywalk-sdd/log.cjs tasks-status --project=/my/project --change=user-auth --require-complete
2642
+ node skywalk-sdd/log.cjs archive-docs --project=/my/project --change=user-auth --reason="变更已完成实施" --event-id=evt_archive --report-output=skywalk-sdd/reports/user-auth-report.md
2597
2643
  `);
2598
2644
  }
2599
2645
 
@@ -28,7 +28,7 @@ jobs:
28
28
  run: npm install
29
29
 
30
30
  - name: SDD doctor
31
- run: node skywalk-sdd/log.js doctor --project="$SDD_PROJECT" --change="$SDD_CHANGE"
31
+ run: node skywalk-sdd/log.cjs doctor --project="$SDD_PROJECT" --change="$SDD_CHANGE"
32
32
 
33
33
  - name: Build and record SDD result
34
34
  shell: bash
@@ -45,7 +45,7 @@ jobs:
45
45
  result="failure"
46
46
  success="false"
47
47
  fi
48
- node skywalk-sdd/log.js record --type=build_result --command=ci --project="$SDD_PROJECT" --change="$SDD_CHANGE" --agent="$SDD_AGENT" --source=ci --session-id="$SDD_SESSION" --result="$result" --summary="CI build $result" --details-json="{\"build_results\":{\"command\":\"$SDD_BUILD_COMMAND\",\"success\":$success,\"duration_ms\":$duration,\"error_count\":0}}"
48
+ node skywalk-sdd/log.cjs record --type=build_result --command=ci --project="$SDD_PROJECT" --change="$SDD_CHANGE" --agent="$SDD_AGENT" --source=ci --session-id="$SDD_SESSION" --result="$result" --summary="CI build $result" --details-json="{\"build_results\":{\"command\":\"$SDD_BUILD_COMMAND\",\"success\":$success,\"duration_ms\":$duration,\"error_count\":0}}"
49
49
  exit "$status"
50
50
 
51
51
  - name: Test and record SDD result
@@ -63,5 +63,5 @@ jobs:
63
63
  result="failure"
64
64
  failed=1
65
65
  fi
66
- node skywalk-sdd/log.js record --type=test_result --command=ci --project="$SDD_PROJECT" --change="$SDD_CHANGE" --agent="$SDD_AGENT" --source=ci --session-id="$SDD_SESSION" --result="$result" --summary="CI test $result" --details-json="{\"test_results\":{\"command\":\"$SDD_TEST_COMMAND\",\"passed\":0,\"failed\":$failed,\"skipped\":0,\"coverage\":null,\"duration_ms\":$duration}}"
66
+ node skywalk-sdd/log.cjs record --type=test_result --command=ci --project="$SDD_PROJECT" --change="$SDD_CHANGE" --agent="$SDD_AGENT" --source=ci --session-id="$SDD_SESSION" --result="$result" --summary="CI test $result" --details-json="{\"test_results\":{\"command\":\"$SDD_TEST_COMMAND\",\"passed\":0,\"failed\":$failed,\"skipped\":0,\"coverage\":null,\"duration_ms\":$duration}}"
67
67
  exit "$status"
@@ -11,7 +11,7 @@ sdd_quality_gate:
11
11
  before_script:
12
12
  - npm install
13
13
  script:
14
- - node skywalk-sdd/log.js doctor --project="$SDD_PROJECT" --change="$SDD_CHANGE"
14
+ - node skywalk-sdd/log.cjs doctor --project="$SDD_PROJECT" --change="$SDD_CHANGE"
15
15
  - |
16
16
  set +e
17
17
  start_ms=$(date +%s%3N)
@@ -25,7 +25,7 @@ sdd_quality_gate:
25
25
  result="failure"
26
26
  success="false"
27
27
  fi
28
- node skywalk-sdd/log.js record --type=build_result --command=ci --project="$SDD_PROJECT" --change="$SDD_CHANGE" --agent="$SDD_AGENT" --source=ci --session-id="$SDD_SESSION" --result="$result" --summary="CI build $result" --details-json="{\"build_results\":{\"command\":\"$SDD_BUILD_COMMAND\",\"success\":$success,\"duration_ms\":$duration,\"error_count\":0}}"
28
+ node skywalk-sdd/log.cjs record --type=build_result --command=ci --project="$SDD_PROJECT" --change="$SDD_CHANGE" --agent="$SDD_AGENT" --source=ci --session-id="$SDD_SESSION" --result="$result" --summary="CI build $result" --details-json="{\"build_results\":{\"command\":\"$SDD_BUILD_COMMAND\",\"success\":$success,\"duration_ms\":$duration,\"error_count\":0}}"
29
29
  if [ "$status" -ne 0 ]; then exit "$status"; fi
30
30
  - |
31
31
  set +e
@@ -40,5 +40,5 @@ sdd_quality_gate:
40
40
  result="failure"
41
41
  failed=1
42
42
  fi
43
- node skywalk-sdd/log.js record --type=test_result --command=ci --project="$SDD_PROJECT" --change="$SDD_CHANGE" --agent="$SDD_AGENT" --source=ci --session-id="$SDD_SESSION" --result="$result" --summary="CI test $result" --details-json="{\"test_results\":{\"command\":\"$SDD_TEST_COMMAND\",\"passed\":0,\"failed\":$failed,\"skipped\":0,\"coverage\":null,\"duration_ms\":$duration}}"
43
+ node skywalk-sdd/log.cjs record --type=test_result --command=ci --project="$SDD_PROJECT" --change="$SDD_CHANGE" --agent="$SDD_AGENT" --source=ci --session-id="$SDD_SESSION" --result="$result" --summary="CI test $result" --details-json="{\"test_results\":{\"command\":\"$SDD_TEST_COMMAND\",\"passed\":0,\"failed\":$failed,\"skipped\":0,\"coverage\":null,\"duration_ms\":$duration}}"
44
44
  if [ "$status" -ne 0 ]; then exit "$status"; fi
@@ -16,13 +16,13 @@ function main() {
16
16
  const logCli = path.join(projectRoot, 'skywalk-sdd', 'log.js');
17
17
 
18
18
  if (!fs.existsSync(logCli)) {
19
- console.log('SDD pre-push: skywalk-sdd/log.js not found; doctor gate skipped.');
19
+ console.log('SDD pre-push: skywalk-sdd/log.cjs not found; doctor gate skipped.');
20
20
  return;
21
21
  }
22
22
 
23
- const args = [logCli, 'doctor', '--project', projectRoot];
23
+ const args = [logCli, 'doctor', `--project=${projectRoot}`];
24
24
  if (changeName) {
25
- args.push('--change', changeName);
25
+ args.push(`--change=${changeName}`);
26
26
  }
27
27
 
28
28
  const result = spawnSync(process.execPath, args, {
@@ -54,8 +54,8 @@ const activeStages = readActiveStages(projectRoot)
54
54
 
55
55
  const lines = [
56
56
  'SDD Telemetry reminder:',
57
- '- Run skywalk-sdd/log.js start before the OPSX stage work begins.',
58
- '- Run skywalk-sdd/log.js end before stopping the stage.',
57
+ '- Run skywalk-sdd/log.cjs start before the OPSX stage work begins.',
58
+ '- Run skywalk-sdd/log.cjs end before stopping the stage.',
59
59
  '- Hooks are only an enhancement; OPSX command instructions remain authoritative.',
60
60
  ];
61
61
 
@@ -78,5 +78,5 @@ for (const event of activeStages) {
78
78
  console.log([
79
79
  'SDD Telemetry warning: open stage(s) detected.',
80
80
  ...activeStages.map(event => `- ${event.change || 'general'}:${event.command || event.stage || 'unknown'} event_id=${event.event_id}`),
81
- 'Run skywalk-sdd/log.js end before closing the OPSX stage, or explicitly mark it partial/failure.',
81
+ 'Run skywalk-sdd/log.cjs end before closing the OPSX stage, or explicitly mark it partial/failure.',
82
82
  ].join('\n'));
@@ -5,7 +5,7 @@
5
5
  "hooks": [
6
6
  {
7
7
  "type": "command",
8
- "command": "node .claude/hooks/sdd-prompt.js"
8
+ "command": "node .claude/hooks/sdd-prompt.cjs"
9
9
  }
10
10
  ]
11
11
  }
@@ -16,7 +16,7 @@
16
16
  "hooks": [
17
17
  {
18
18
  "type": "command",
19
- "command": "node .claude/hooks/sdd-pre-tool.js"
19
+ "command": "node .claude/hooks/sdd-pre-tool.cjs"
20
20
  }
21
21
  ]
22
22
  }
@@ -27,7 +27,7 @@
27
27
  "hooks": [
28
28
  {
29
29
  "type": "command",
30
- "command": "node .claude/hooks/sdd-post-tool.js"
30
+ "command": "node .claude/hooks/sdd-post-tool.cjs"
31
31
  }
32
32
  ]
33
33
  }
@@ -37,7 +37,7 @@
37
37
  "hooks": [
38
38
  {
39
39
  "type": "command",
40
- "command": "node .claude/hooks/sdd-stop.js"
40
+ "command": "node .claude/hooks/sdd-stop.cjs"
41
41
  }
42
42
  ]
43
43
  }
@@ -12,7 +12,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
12
12
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
13
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
14
  > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.js start --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --git-sha=<base_git_sha_or_none>`,记录返回的 event_id。
15
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --git-sha=<base_git_sha_or_none>`,记录返回的 event_id。
16
16
 
17
17
  > **🔒 Git 策略(只读增强,不改变开发流)**
18
18
  > - Git 只作为可选度量数据源,不是 apply 前置条件。
@@ -65,7 +65,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
65
65
 
66
66
  在终端执行(若命令失败必须中止本阶段,不得跳过):
67
67
  ```bash
68
- node skywalk-sdd/log.js start --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --git-sha=<base_git_sha_or_none>
68
+ node skywalk-sdd/log.cjs start --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --git-sha=<base_git_sha_or_none>
69
69
  ```
70
70
  保存输出 JSON 中的 `event_id`,供阶段结束使用。
71
71
 
@@ -350,7 +350,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
350
350
 
351
351
  5. **记录构建 Telemetry**:
352
352
  ```bash
353
- node skywalk-sdd/log.js record --type=build_result --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="编译检查结果" --details-json="{\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0}}"
353
+ node skywalk-sdd/log.cjs record --type=build_result --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="编译检查结果" --details-json="{\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0}}"
354
354
  ```
355
355
  `build_results` 字段口径:
356
356
  - `command`: 实际执行的编译/构建命令。
@@ -390,8 +390,10 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
390
390
  每完成一个任务后,必须立即:
391
391
 
392
392
  1. **修改 tasks.md 文件**:
393
- - `- **状态**: [ ] 未完成` 改为 `- **状态**: [x] 已完成`
394
- 2. **验证修改成功**:读取文件确认状态已更新
393
+ - 将该任务对应的 `- [ ]` 替换为 `- [x]`(包括任务执行拓扑图中的复选框和任务详情中的状态行)
394
+ - 将 `- **状态**: [ ] 未完成` 替换为 `- **状态**: [x] 已完成`
395
+ - **两种格式必须同步更新**,不可遗漏
396
+ 2. **验证修改成功**:读取文件确认两种格式的复选框均已勾选
395
397
  3. **显示进度提示**:
396
398
  > "✅ **[TASK-XXX-01] 已完成** [N/M]
397
399
  > - 编译检查: ✅ 通过
@@ -400,8 +402,10 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
400
402
 
401
403
  4. **记录任务级 Telemetry**:
402
404
  ```bash
403
- node skywalk-sdd/log.js record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"files_changed\":[],\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0},\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"
405
+ node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"files_changed\":[],\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0},\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"
404
406
  ```
407
+ **⚠️ 注意**:`--task-id=<TASK-ID>` 中的 `<TASK-ID>` 必须替换为当前任务的实际 ID(如 `TASK-USER-AUTH-01`),不得保留占位符,否则 E4 指标无法计算。
408
+
405
409
  若任务失败或暂停,`--status` 使用 `failed` / `blocked`,`--result` 使用 `failure` / `partial`,并在 details 中记录失败原因。
406
410
 
407
411
  g. **继续下一个可执行任务**
@@ -462,7 +466,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
462
466
  - **⛔ 渐进式加载**:只加载当前 Capability 的四文档链(overview + proposal + spec + design + tasks)
463
467
  - **⛔ 隔离红线**:绝对禁止加载同级其他 Capability 的文档
464
468
  - **⛔ 拓扑依赖拦截**:执行任务前必须检查依赖,前置未完成必须拦截
465
- - **⛔ 必须实时更新任务状态**:每完成一个任务,**立即**修改 tasks.md 状态,禁止批量更新
469
+ - **⛔ 必须实时更新任务状态**:每完成一个任务,**立即**修改 tasks.md 中的 `- [ ]` 为 `- [x]`,**同时修改** `**状态**: [ ] 未完成` 为 `**状态**: [x] 已完成`,两种格式不可遗漏,禁止批量更新
466
470
  - **⛔ 算法一致性门禁**:对于 IMPL 任务,检查实现代码与 design.md 伪代码的一致性,核心逻辑不一致时拦截
467
471
  - **⛔ 编译检查门禁**:每完成一个任务后,**必须运行编译检查**,编译失败禁止标记已完成
468
472
  - **⛔ 测试执行门禁**:根据 `test-strategy` 决定测试门禁行为(tdd=强制, impl-first=警告, none=跳过)
@@ -479,8 +483,8 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
479
483
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
480
484
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
481
485
  > **📊 Telemetry(必做,不得跳过)**
482
- > 每次编译检查后,必须记录构建事件:`node skywalk-sdd/log.js record --type=build_result --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="编译检查结果" --details-json="{\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0}}"`
483
- > 每完成一个任务,必须记录任务级结构化事件:`node skywalk-sdd/log.js record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"files_changed\":[],\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0},\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"`
484
- > AI 代码产出完成后,必须记录采纳率快照,但不得为了采集快照自动提交 commit。Git 可用时只读统计 SHA/diff;Git 不可用时使用 `vcs_mode=no-git` 和 `base_git_sha=null`:`node skywalk-sdd/log.js record --type=ai_adoption_review --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=ai_snapshot --result=success --summary="AI 代码产出快照" --details-json="{\"ai_adoption\":{\"review_status\":\"ai_snapshot\",\"vcs_mode\":\"<readonly|no-git>\",\"base_git_sha\":\"<base_git_sha_or_null>\",\"ai_git_sha\":\"<ai_git_sha_or_null>\",\"ai_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"notes\":\"未自动创建 Git 仓库,未自动提交 commit;仅记录可用统计\"}}"`
485
- > 若后续发生人工修改并完成采纳确认,必须补录最终采纳统计;若非 Git 项目,SHA 可填 `null`,采纳行数由人工或工具统计补录:`node skywalk-sdd/log.js record --type=ai_adoption_review --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=manual --session-id=<会话ID> --status=final --result=success --summary="AI 代码采纳率人工确认" --details-json="{\"ai_adoption\":{\"review_status\":\"final\",\"vcs_mode\":\"<readonly|no-git>\",\"base_git_sha\":\"<base_git_sha_or_null>\",\"ai_git_sha\":\"<ai_git_sha_or_null>\",\"final_git_sha\":\"<final_git_sha_or_null>\",\"retained_lines\":0,\"rewritten_lines\":0,\"deleted_lines\":0,\"ai_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"final_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"notes\":\"只记录行数统计,不记录源码;非 Git 项目允许 SHA 为 null\"}}"`
486
- > 阶段结束时执行(必须成功):`node skywalk-sdd/log.js end --event-id=<开头记录的event_id> --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="实施结果摘要"`
486
+ > 每次编译检查后,必须记录构建事件:`node skywalk-sdd/log.cjs record --type=build_result --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="编译检查结果" --details-json="{\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0}}"`
487
+ > 每完成一个任务,必须记录任务级结构化事件:`node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"files_changed\":[],\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0},\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"`
488
+ > AI 代码产出完成后,必须记录采纳率快照,但不得为了采集快照自动提交 commit。Git 可用时只读统计 SHA/diff;Git 不可用时使用 `vcs_mode=no-git` 和 `base_git_sha=null`:`node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=ai_snapshot --result=success --summary="AI 代码产出快照" --details-json="{\"ai_adoption\":{\"review_status\":\"ai_snapshot\",\"vcs_mode\":\"<readonly|no-git>\",\"base_git_sha\":\"<base_git_sha_or_null>\",\"ai_git_sha\":\"<ai_git_sha_or_null>\",\"ai_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"notes\":\"未自动创建 Git 仓库,未自动提交 commit;仅记录可用统计\"}}"`
489
+ > 若后续发生人工修改并完成采纳确认,必须补录最终采纳统计;若非 Git 项目,SHA 可填 `null`,采纳行数由人工或工具统计补录:`node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=manual --session-id=<会话ID> --status=final --result=success --summary="AI 代码采纳率人工确认" --details-json="{\"ai_adoption\":{\"review_status\":\"final\",\"vcs_mode\":\"<readonly|no-git>\",\"base_git_sha\":\"<base_git_sha_or_null>\",\"ai_git_sha\":\"<ai_git_sha_or_null>\",\"final_git_sha\":\"<final_git_sha_or_null>\",\"retained_lines\":0,\"rewritten_lines\":0,\"deleted_lines\":0,\"ai_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"final_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"notes\":\"只记录行数统计,不记录源码;非 Git 项目允许 SHA 为 null\"}}"`
490
+ > 阶段结束时执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="实施结果摘要"`
@@ -20,7 +20,7 @@ argument-hint: "[change-name]"
20
20
  **核心原则**
21
21
 
22
22
  - `archive` 必须产生真实归档结果:活动目录 `openspec/changes/<name>/` 应被移出,归档目录位于 `openspec/changes/archive/<日期>-<name>/`。
23
- - 归档统一使用 `node skywalk-sdd/log.js archive-docs`,同时兼容 Simple 与 Full 两种文档结构。
23
+ - 归档统一使用 `node skywalk-sdd/log.cjs archive-docs`,同时兼容 Simple 与 Full 两种文档结构。
24
24
  - 最终报告必须随着 `archive` 阶段成功结束自动生成,不再作为可选手工步骤。
25
25
  - 即使归档原因是“变更已完成实施”,未勾选的 `tasks.md/task.md` 项也不阻断归档;但必须写入 archive 详情和最终报告。
26
26
 
@@ -31,7 +31,7 @@ argument-hint: "[change-name]"
31
31
  ### 0. 记录阶段开始
32
32
 
33
33
  ```bash
34
- node skywalk-sdd/log.js start --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
34
+ node skywalk-sdd/log.cjs start --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
35
35
  ```
36
36
 
37
37
  保存输出 JSON 中的 `event_id`。
@@ -63,7 +63,7 @@ openspec list
63
63
  归档前执行 doctor:
64
64
 
65
65
  ```bash
66
- node skywalk-sdd/log.js doctor --project=. --change=<变更名称>
66
+ node skywalk-sdd/log.cjs doctor --project=. --change=<变更名称>
67
67
  ```
68
68
 
69
69
  处理规则:
@@ -76,7 +76,7 @@ node skywalk-sdd/log.js doctor --project=. --change=<变更名称>
76
76
  始终扫描 Simple 和 Full 两种布局下的所有 `tasks.md/task.md`:
77
77
 
78
78
  ```bash
79
- node skywalk-sdd/log.js tasks-status --project=. --change=<变更名称>
79
+ node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
80
80
  ```
81
81
 
82
82
  处理规则:
@@ -89,7 +89,7 @@ node skywalk-sdd/log.js tasks-status --project=. --change=<变更名称>
89
89
  执行:
90
90
 
91
91
  ```bash
92
- node skywalk-sdd/log.js archive-docs --project=. --change=<变更名称> --reason="<归档原因>" --event-id=<event_id> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --report-output=skywalk-sdd/reports/<变更名称>-report.md
92
+ node skywalk-sdd/log.cjs archive-docs --project=. --change=<变更名称> --reason="<归档原因>" --event-id=<event_id> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --report-output=skywalk-sdd/reports/<变更名称>-report.md
93
93
  ```
94
94
 
95
95
  该命令必须一次完成:
@@ -103,7 +103,7 @@ node skywalk-sdd/log.js archive-docs --project=. --change=<变更名称> --reaso
103
103
  如果命令失败,必须以失败状态结束 telemetry:
104
104
 
105
105
  ```bash
106
- node skywalk-sdd/log.js end --event-id=<event_id> --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=failure --summary="归档失败:<失败原因>"
106
+ node skywalk-sdd/log.cjs end --event-id=<event_id> --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=failure --summary="归档失败:<失败原因>"
107
107
  ```
108
108
 
109
109
  失败时不要输出“归档完成”。
@@ -126,13 +126,13 @@ node skywalk-sdd/log.js end --event-id=<event_id> --command=archive --project=.
126
126
  如用户愿意提供反馈,可补录问卷结果:
127
127
 
128
128
  ```bash
129
- node skywalk-sdd/log.js record --type=survey_result --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="SDD 人工反馈" --details-json="{\"survey_result\":{\"nps\":9,\"cognitive_load\":3,\"spec_fatigue_index\":2,\"satisfaction\":8,\"respondent_role\":\"developer\",\"collected_at\":\"<ISO时间>\",\"notes\":\"\"}}"
129
+ node skywalk-sdd/log.cjs record --type=survey_result --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="SDD 人工反馈" --details-json="{\"survey_result\":{\"nps\":9,\"cognitive_load\":3,\"spec_fatigue_index\":2,\"satisfaction\":8,\"respondent_role\":\"developer\",\"collected_at\":\"<ISO时间>\",\"notes\":\"\"}}"
130
130
  ```
131
131
 
132
132
  如团队有传统方式工时基线,可补录 baseline:
133
133
 
134
134
  ```bash
135
- node skywalk-sdd/log.js record --type=baseline_record --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="传统工时基线" --details-json="{\"baseline_record\":{\"traditional_hours\":10,\"sdd_hours\":6,\"task_type\":\"feature\",\"baseline_source\":\"manual-estimate\",\"collected_at\":\"<ISO时间>\",\"notes\":\"\"}}"
135
+ node skywalk-sdd/log.cjs record --type=baseline_record --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="传统工时基线" --details-json="{\"baseline_record\":{\"traditional_hours\":10,\"sdd_hours\":6,\"task_type\":\"feature\",\"baseline_source\":\"manual-estimate\",\"collected_at\":\"<ISO时间>\",\"notes\":\"\"}}"
136
136
  ```
137
137
 
138
138
  ---
@@ -12,7 +12,7 @@ argument-hint: "[change-name] [上下文文件...]"
12
12
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
13
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
14
  > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.js start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
15
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
16
 
17
17
  > **⚠️ 阶段边界提示**
18
18
  >
@@ -31,7 +31,7 @@ argument-hint: "[change-name] [上下文文件...]"
31
31
 
32
32
  在终端执行(若命令失败必须中止本阶段,不得跳过):
33
33
  ```bash
34
- node skywalk-sdd/log.js start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
34
+ node skywalk-sdd/log.cjs start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
35
35
  ```
36
36
  保存输出 JSON 中的 `event_id`,供阶段结束使用。
37
37
 
@@ -170,7 +170,7 @@ argument-hint: "[change-name] [上下文文件...]"
170
170
  执行:
171
171
 
172
172
  ```bash
173
- node skywalk-sdd/log.js tasks-status --project=. --change=<变更名称>
173
+ node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
174
174
  ```
175
175
 
176
176
  判定规则:
@@ -317,7 +317,7 @@ argument-hint: "[change-name] [上下文文件...]"
317
317
  | | | |
318
318
 
319
319
  ## 任务完成状态
320
- - 检查命令:`node skywalk-sdd/log.js tasks-status --project=. --change=<name>`
320
+ - 检查命令:`node skywalk-sdd/log.cjs tasks-status --project=. --change=<name>`
321
321
  - 状态口径:task 阶段允许未勾选;apply/test/archive readiness 阶段不得把未勾选项静默视为完成。
322
322
  - 未勾选项清单:列出文件、行号、原文。
323
323
 
@@ -402,7 +402,7 @@ argument-hint: "[change-name] [上下文文件...]"
402
402
 
403
403
  在终端执行(必须成功):
404
404
  ```bash
405
- node skywalk-sdd/log.js record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
405
+ node skywalk-sdd/log.cjs record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
406
406
  ```
407
407
 
408
408
  12. **【Telemetry 建议】记录规约符合度 Q1**
@@ -437,7 +437,7 @@ argument-hint: "[change-name] [上下文文件...]"
437
437
 
438
438
  在终端执行(若存在实现代码则必须成功):
439
439
  ```bash
440
- node skywalk-sdd/log.js record --type=conformance_review --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="规约符合度人工确认" --details-json="{\"conformance_review\":{\"method\":\"llm-as-judge+manual\",\"manual_confirmed\":true,\"assertions\":[{\"id\":\"ASSERT-001\",\"description\":\"规约中的可验证断言\",\"judge_status\":\"matched\",\"human_status\":\"matched\",\"evidence\":\"代码、测试或文档证据摘要\",\"files\":[],\"notes\":\"\"}]}}"
440
+ node skywalk-sdd/log.cjs record --type=conformance_review --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="规约符合度人工确认" --details-json="{\"conformance_review\":{\"method\":\"llm-as-judge+manual\",\"manual_confirmed\":true,\"assertions\":[{\"id\":\"ASSERT-001\",\"description\":\"规约中的可验证断言\",\"judge_status\":\"matched\",\"human_status\":\"matched\",\"evidence\":\"代码、测试或文档证据摘要\",\"files\":[],\"notes\":\"\"}]}}"
441
441
  ```
442
442
 
443
443
  若当前尚未进入实现阶段或无法验证代码,允许跳过 `conformance_review`,但需要在检查报告中说明原因。
@@ -459,5 +459,5 @@ argument-hint: "[change-name] [上下文文件...]"
459
459
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
460
460
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
461
461
  > **📊 Telemetry(必做,不得跳过)**
462
- > 生成检查报告后,必须先记录结构化检查结果:`node skywalk-sdd/log.js record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
463
- > `check_result` 记录成功后,才允许执行阶段结束:`node skywalk-sdd/log.js end --event-id=<开头记录的event_id> --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
462
+ > 生成检查报告后,必须先记录结构化检查结果:`node skywalk-sdd/log.cjs record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
463
+ > `check_result` 记录成功后,才允许执行阶段结束:`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
@@ -12,7 +12,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
12
12
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
13
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
14
  > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.js start --command=design --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
15
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=design --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
16
 
17
17
  > **⚠️ 阶段边界提示**
18
18
  >
@@ -41,7 +41,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
41
41
 
42
42
  在终端执行(若命令失败必须中止本阶段,不得跳过):
43
43
  ```bash
44
- node skywalk-sdd/log.js start --command=design --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
44
+ node skywalk-sdd/log.cjs start --command=design --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
45
45
  ```
46
46
  保存输出 JSON 中的 `event_id`,供阶段结束使用。
47
47
 
@@ -567,4 +567,4 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
567
567
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
568
568
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
569
569
  > **📊 Telemetry(必做,不得跳过)**
570
- > 在终端执行(必须成功):`node skywalk-sdd/log.js end --event-id=<开头记录的event_id> --command=design --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
570
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=design --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
@@ -12,7 +12,7 @@ argument-hint: "[change-name]"
12
12
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
13
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
14
  > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.js start --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
15
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
16
 
17
17
  ---
18
18
 
@@ -24,7 +24,7 @@ argument-hint: "[change-name]"
24
24
 
25
25
  在终端执行(若命令失败必须中止本阶段,不得跳过):
26
26
  ```bash
27
- node skywalk-sdd/log.js start --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
27
+ node skywalk-sdd/log.cjs start --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
28
28
  ```
29
29
  保存输出 JSON 中的 `event_id`,供阶段结束使用。
30
30
 
@@ -96,4 +96,4 @@ argument-hint: "[change-name]"
96
96
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
97
97
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
98
98
  > **📊 Telemetry(必做,不得跳过)**
99
- > 在终端执行(必须成功):`node skywalk-sdd/log.js end --event-id=<开头记录的event_id> --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success --summary="浏览结果摘要"`
99
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success --summary="浏览结果摘要"`
@@ -13,7 +13,7 @@ argument-hint: "[change-name] [上下文文件...]"
13
13
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
14
 
15
15
  > **📊 Telemetry(必做,不得跳过)**
16
- > 在终端执行(必须成功):`node skywalk-sdd/log.js start --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
17
17
 
18
18
  > **⚠️ 阶段边界提示**
19
19
  >
@@ -34,7 +34,7 @@ argument-hint: "[change-name] [上下文文件...]"
34
34
 
35
35
  在终端执行(若命令失败必须中止本阶段,不得跳过):
36
36
  ```bash
37
- node skywalk-sdd/log.js start --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
37
+ node skywalk-sdd/log.cjs start --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
38
38
  ```
39
39
  保存输出 JSON 中的 `event_id`,供阶段结束使用。
40
40
 
@@ -402,4 +402,4 @@ argument-hint: "[change-name] [上下文文件...]"
402
402
  - **⛔ 单阶段原则:完成 proposal.md 后必须立即停止**。仅提示用户下一步可运行 `/opsx:spec`,**绝对禁止自动执行 spec/design/task 等后续阶段**。每个阶段必须由用户主动触发。
403
403
 
404
404
  > **📊 Telemetry(必做,不得跳过)**
405
- > 在终端执行(必须成功):`node skywalk-sdd/log.js end --event-id=<开头记录的event_id> --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
405
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
@@ -12,7 +12,7 @@ argument-hint: "[change-name] [上下文文件...]"
12
12
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
13
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
14
  > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.js start --command=spec --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
15
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=spec --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
16
 
17
17
  > **⚠️ 阶段边界提示**
18
18
  >
@@ -49,7 +49,7 @@ openspec/changes/<name>/
49
49
 
50
50
  在终端执行(若命令失败必须中止本阶段,不得跳过):
51
51
  ```bash
52
- node skywalk-sdd/log.js start --command=spec --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
52
+ node skywalk-sdd/log.cjs start --command=spec --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
53
53
  ```
54
54
  保存输出 JSON 中的 `event_id`,供阶段结束使用。
55
55
 
@@ -523,4 +523,4 @@ openspec/changes/<name>/
523
523
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
524
524
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
525
525
  > **📊 Telemetry(必做,不得跳过)**
526
- > 在终端执行(必须成功):`node skywalk-sdd/log.js end --event-id=<开头记录的event_id> --command=spec --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
526
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=spec --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
@@ -12,7 +12,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
12
12
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
13
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
14
  > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.js start --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
15
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
16
 
17
17
  > **⚠️ 阶段边界提示**
18
18
  >
@@ -42,7 +42,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
42
42
 
43
43
  在终端执行(若命令失败必须中止本阶段,不得跳过):
44
44
  ```bash
45
- node skywalk-sdd/log.js start --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
45
+ node skywalk-sdd/log.cjs start --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
46
46
  ```
47
47
  保存输出 JSON 中的 `event_id`,供阶段结束使用。
48
48
 
@@ -291,7 +291,7 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
291
291
  ### [TASK-XXX-01] 任务名称
292
292
  - **类型**: 数据层 / 接口层 / UI层 / 测试
293
293
  - **依赖**: 无
294
- - **状态**: [ ] 未完成
294
+ - **状态**: [ ] 未完成(勾选格式统一使用 GitHub 标准的 `- [ ]` / `- [x]`)
295
295
 
296
296
  #### 任务描述
297
297
  <!-- 一句话描述本任务要做什么 -->
@@ -430,4 +430,4 @@ argument-hint: "[change-name] [capability-name] [上下文文件...]"
430
430
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
431
431
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
432
432
  > **📊 Telemetry(必做,不得跳过)**
433
- > 在终端执行(必须成功):`node skywalk-sdd/log.js end --event-id=<开头记录的event_id> --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
433
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
@@ -12,7 +12,7 @@ argument-hint: "[test-scope] [options]"
12
12
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
13
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
14
  > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.js start --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
15
+ > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
16
 
17
17
  > **⚠️ 命令定位**
18
18
  >
@@ -28,7 +28,7 @@ argument-hint: "[test-scope] [options]"
28
28
 
29
29
  在终端执行(若命令失败必须中止本阶段,不得跳过):
30
30
  ```bash
31
- node skywalk-sdd/log.js start --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
31
+ node skywalk-sdd/log.cjs start --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
32
32
  ```
33
33
  保存输出 JSON 中的 `event_id`,供阶段结束使用。
34
34
 
@@ -239,6 +239,6 @@ argument-hint: "[test-scope] [options]"
239
239
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
240
240
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
241
241
  > **📊 Telemetry(必做,不得跳过)**
242
- > 测试运行后,必须记录结构化测试结果:`node skywalk-sdd/log.js record --type=test_result --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="测试结果摘要" --details-json="{\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"`
243
- > 若 spec.md 中有可识别场景 ID,且测试能映射到这些场景,建议记录 Q4 规约驱动测试覆盖率(可选,不阻塞测试流程):`node skywalk-sdd/log.js record --type=coverage_result --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="规约场景测试覆盖率" --details-json="{\"spec_test_coverage\":{\"mappings\":[{\"scenario_id\":\"SCN-001\",\"description\":\"规约场景摘要\",\"test_ids\":[\"<测试文件或用例ID>\"],\"status\":\"covered\",\"notes\":\"\"}]}}"`
244
- > 阶段结束时执行(必须成功):`node skywalk-sdd/log.js end --event-id=<开头记录的event_id> --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="测试结果摘要" --details-json="{\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"`
242
+ > 测试运行后,必须记录结构化测试结果:`node skywalk-sdd/log.cjs record --type=test_result --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="测试结果摘要" --details-json="{\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"`
243
+ > 若 spec.md 中有可识别场景 ID,且测试能映射到这些场景,建议记录 Q4 规约驱动测试覆盖率(可选,不阻塞测试流程):`node skywalk-sdd/log.cjs record --type=coverage_result --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="规约场景测试覆盖率" --details-json="{\"spec_test_coverage\":{\"mappings\":[{\"scenario_id\":\"SCN-001\",\"description\":\"规约场景摘要\",\"test_ids\":[\"<测试文件或用例ID>\"],\"status\":\"covered\",\"notes\":\"\"}]}}"`
244
+ > 阶段结束时执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="测试结果摘要" --details-json="{\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"`
@@ -29,8 +29,8 @@ allowed-tools:
29
29
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
30
30
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
31
31
  > **📊 Telemetry(必做,不得跳过)**
32
- > - 阶段开始:`node skywalk-sdd/log.js start --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --git-sha=<base_git_sha_or_none>`(保存 event_id)
33
- > - 阶段结束:`node skywalk-sdd/log.js end --event-id=<event_id> --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
32
+ > - 阶段开始:`node skywalk-sdd/log.cjs start --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --git-sha=<base_git_sha_or_none>`(保存 event_id)
33
+ > - 阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
34
34
 
35
35
  > **🔒 Git 策略(只读增强,不改变开发流)**
36
36
  > - Git 只作为可选度量数据源,不是 apply 前置条件。
@@ -180,13 +180,16 @@ e. **⛔ 测试执行门禁**
180
180
  | `none` | **跳过**:不执行测试门禁 |
181
181
 
182
182
  f. **⛔ 立即更新任务状态**
183
- - 修改 tasks.md:`状态: [ ] 未完成` `状态: [x] 已完成`
183
+ - 修改 tasks.md:将 `- [ ]` 替换为 `- [x]`(包括拓扑图和任务详情中的复选框)
184
+ - 同时修改:`- **状态**: [ ] 未完成` → `- **状态**: [x] 已完成`
185
+ - **两种格式必须同步更新**,不可遗漏
184
186
  - 验证修改成功
185
187
  - 显示进度:`✅ [TASK-ID] 已完成 [N/M]`
186
188
  - 记录任务级 Telemetry:
187
189
  ```bash
188
- node skywalk-sdd/log.js record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"files_changed\":[],\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0},\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"
190
+ node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"files_changed\":[],\"build_results\":{\"command\":\"<实际编译命令>\",\"success\":true,\"duration_ms\":0,\"error_count\":0},\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"
189
191
  ```
192
+ **⚠️ 注意**:`--task-id=<TASK-ID>` 必须替换为实际任务 ID,否则 E4 指标无法计算。
190
193
 
191
194
  g. **继续下一个可执行任务**
192
195
 
@@ -194,9 +197,12 @@ g. **继续下一个可执行任务**
194
197
 
195
198
  当前 Capability 的 AI 代码产出完成后,必须记录 `ai_adoption_review`,但不得为了采集快照自动提交 commit。
196
199
 
200
+ - `--status=ai_snapshot` 用于记录 AI 初始产出快照,P2 指标在无 final 事件时会使用此快照数据
201
+ - 若用户进行了人工 review 并确认保留率,可补录 `--status=final` 事件(`review_status: "final"`),P2 指标将优先使用 final 数据
202
+
197
203
  Git 可用时只读统计 SHA/diff;Git 不可用时使用 `vcs_mode=no-git` 和 `base_git_sha=null`:
198
204
  ```bash
199
- node skywalk-sdd/log.js record --type=ai_adoption_review --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=ai_snapshot --result=success --summary="AI 代码产出快照" --details-json="{\"ai_adoption\":{\"review_status\":\"ai_snapshot\",\"vcs_mode\":\"<readonly|no-git>\",\"base_git_sha\":\"<base_git_sha_or_null>\",\"ai_git_sha\":\"<ai_git_sha_or_null>\",\"ai_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"notes\":\"未自动创建 Git 仓库,未自动提交 commit;仅记录可用统计\"}}"
205
+ node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=ai_snapshot --result=success --summary="AI 代码产出快照" --details-json="{\"ai_adoption\":{\"review_status\":\"ai_snapshot\",\"vcs_mode\":\"<readonly|no-git>\",\"base_git_sha\":\"<base_git_sha_or_null>\",\"ai_git_sha\":\"<ai_git_sha_or_null>\",\"ai_diff\":{\"files_changed\":0,\"added_lines\":null,\"deleted_lines\":null},\"notes\":\"未自动创建 Git 仓库,未自动提交 commit;仅记录可用统计\"}}"
200
206
  ```
201
207
 
202
208
  ### 6. 完成或暂停时显示状态
@@ -216,7 +222,7 @@ node skywalk-sdd/log.js record --type=ai_adoption_review --command=apply --proje
216
222
  - **⛔ DAG 依赖拦截**:执行任务前必须检查依赖,前置未完成必须拦截
217
223
  - **⛔ 编译检查门禁**:每完成一个任务后,**必须运行编译检查**,编译失败禁止标记已完成
218
224
  - **⛔ 测试执行门禁**:根据 `test-strategy` 决定测试门禁行为(tdd=强制, impl-first=警告, none=跳过)
219
- - **⛔ 必须实时更新任务状态**:每完成一个任务,**立即**修改 tasks.md 状态
225
+ - **⛔ 必须实时更新任务状态**:每完成一个任务,**立即**修改 tasks.md 中的 `- [ ]` 为 `- [x]`,**同时修改** `**状态**: [ ] 未完成` 为 `**状态**: [x] 已完成`,两种格式不可遗漏
220
226
  - **Git 只读策略**:禁止为了度量自动初始化 Git、创建分支或提交 commit;非 Git 项目使用 `vcs_mode=no-git` 继续执行
221
227
  - **显示进度反馈**:每完成一个任务,显示「✅ [TASK-ID] 已完成 [N/M]」
222
228
  - **保持任务聚焦**:每次只处理一个任务
@@ -3,7 +3,7 @@ name: opsx-archive
3
3
  description: "归档变更技能 - 将已结束的 SDD 变更真实移入 archive,并生成最终中文度量报告"
4
4
  argument-hint: "[change-name]"
5
5
  license: MIT
6
- compatibility: Requires skywalk-sdd/log.js.
6
+ compatibility: Requires skywalk-sdd/log.cjs.
7
7
  metadata:
8
8
  author: sdd-team
9
9
  version: "3.2"
@@ -48,7 +48,7 @@ openspec list
48
48
  让用户选择现有变更。确认后记录阶段开始:
49
49
 
50
50
  ```bash
51
- node skywalk-sdd/log.js start --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
51
+ node skywalk-sdd/log.cjs start --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
52
52
  ```
53
53
 
54
54
  保存 `event_id`。
@@ -68,7 +68,7 @@ node skywalk-sdd/log.js start --command=archive --project=. --change=<变更名
68
68
  ### 3. 运行 telemetry doctor
69
69
 
70
70
  ```bash
71
- node skywalk-sdd/log.js doctor --project=. --change=<变更名称>
71
+ node skywalk-sdd/log.cjs doctor --project=. --change=<变更名称>
72
72
  ```
73
73
 
74
74
  如果存在 `severe_issues`,暂停归档并说明必须先修复。`superseded_open_stages` 和 `rework_summary` 只作为返工/重复执行展示,不要求用户人工区分测试回滚或真实研发返工。
@@ -76,7 +76,7 @@ node skywalk-sdd/log.js doctor --project=. --change=<变更名称>
76
76
  ### 4. 扫描 tasks 完成状态
77
77
 
78
78
  ```bash
79
- node skywalk-sdd/log.js tasks-status --project=. --change=<变更名称>
79
+ node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
80
80
  ```
81
81
 
82
82
  即使用户选择“变更已完成实施”,未勾选项也不阻断归档。它可能代表任务真实未完成,也可能代表代码已完成但文档未同步;不要猜测,也不要静默忽略。最终必须让 `archive-docs` 将其写入 `archive_result.task_completion` 和报告。
@@ -86,7 +86,7 @@ node skywalk-sdd/log.js tasks-status --project=. --change=<变更名称>
86
86
  执行唯一归档命令:
87
87
 
88
88
  ```bash
89
- node skywalk-sdd/log.js archive-docs --project=. --change=<变更名称> --reason="<归档原因>" --event-id=<event_id> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --report-output=skywalk-sdd/reports/<变更名称>-report.md
89
+ node skywalk-sdd/log.cjs archive-docs --project=. --change=<变更名称> --reason="<归档原因>" --event-id=<event_id> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --report-output=skywalk-sdd/reports/<变更名称>-report.md
90
90
  ```
91
91
 
92
92
  该命令成功后必须已经完成:
@@ -100,7 +100,7 @@ node skywalk-sdd/log.js archive-docs --project=. --change=<变更名称> --reaso
100
100
  如果该命令失败,以失败状态结束 telemetry:
101
101
 
102
102
  ```bash
103
- node skywalk-sdd/log.js end --event-id=<event_id> --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=failure --summary="归档失败:<失败原因>"
103
+ node skywalk-sdd/log.cjs end --event-id=<event_id> --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=failure --summary="归档失败:<失败原因>"
104
104
  ```
105
105
 
106
106
  失败时不要输出“归档完成”。
@@ -124,13 +124,13 @@ node skywalk-sdd/log.js end --event-id=<event_id> --command=archive --project=.
124
124
  如用户愿意提供反馈,可补录问卷结果:
125
125
 
126
126
  ```bash
127
- node skywalk-sdd/log.js record --type=survey_result --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="SDD 人工反馈" --details-json="{\"survey_result\":{\"nps\":9,\"cognitive_load\":3,\"spec_fatigue_index\":2,\"satisfaction\":8,\"respondent_role\":\"developer\",\"collected_at\":\"<ISO时间>\",\"notes\":\"\"}}"
127
+ node skywalk-sdd/log.cjs record --type=survey_result --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="SDD 人工反馈" --details-json="{\"survey_result\":{\"nps\":9,\"cognitive_load\":3,\"spec_fatigue_index\":2,\"satisfaction\":8,\"respondent_role\":\"developer\",\"collected_at\":\"<ISO时间>\",\"notes\":\"\"}}"
128
128
  ```
129
129
 
130
130
  如团队有传统方式工时基线,可补录 baseline:
131
131
 
132
132
  ```bash
133
- node skywalk-sdd/log.js record --type=baseline_record --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="传统工时基线" --details-json="{\"baseline_record\":{\"traditional_hours\":10,\"sdd_hours\":6,\"task_type\":\"feature\",\"baseline_source\":\"manual-estimate\",\"collected_at\":\"<ISO时间>\",\"notes\":\"\"}}"
133
+ node skywalk-sdd/log.cjs record --type=baseline_record --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="传统工时基线" --details-json="{\"baseline_record\":{\"traditional_hours\":10,\"sdd_hours\":6,\"task_type\":\"feature\",\"baseline_source\":\"manual-estimate\",\"collected_at\":\"<ISO时间>\",\"notes\":\"\"}}"
134
134
  ```
135
135
 
136
136
  ---
@@ -32,9 +32,9 @@ allowed-tools:
32
32
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
33
33
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
34
34
  > **📊 Telemetry(必做,不得跳过)**
35
- > - 阶段开始:`node skywalk-sdd/log.js start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
36
- > - 检查报告生成后,必须先记录结构化检查结果:`node skywalk-sdd/log.js record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
37
- > - `check_result` 记录成功后,才允许阶段结束:`node skywalk-sdd/log.js end --event-id=<event_id> --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="摘要"`
35
+ > - 阶段开始:`node skywalk-sdd/log.cjs start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
36
+ > - 检查报告生成后,必须先记录结构化检查结果:`node skywalk-sdd/log.cjs record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
37
+ > - `check_result` 记录成功后,才允许阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="摘要"`
38
38
 
39
39
  ---
40
40
 
@@ -115,7 +115,7 @@ openspec list
115
115
  `task` 阶段允许 `tasks.md` 出现未完成项;这只是计划状态。但如果当前变更已经进入 apply 之后,或本次 check 发现实现代码、测试报告、`build_result/test_result/task_update/conformance_review` 等实施证据,必须检查任务勾选状态:
116
116
 
117
117
  ```bash
118
- node skywalk-sdd/log.js tasks-status --project=. --change=<变更名称>
118
+ node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
119
119
  ```
120
120
 
121
121
  判定规则:
@@ -156,12 +156,12 @@ node skywalk-sdd/log.js tasks-status --project=. --change=<变更名称>
156
156
 
157
157
  在终端执行(必须成功):
158
158
  ```bash
159
- node skywalk-sdd/log.js record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
159
+ node skywalk-sdd/log.cjs record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
160
160
  ```
161
161
 
162
162
  若当前已有实现代码,并且能够验证 spec 断言,还应记录 `conformance_review`(用于 Q1 规约符合度):
163
163
  ```bash
164
- node skywalk-sdd/log.js record --type=conformance_review --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="规约符合度人工确认" --details-json="{\"conformance_review\":{\"method\":\"llm-as-judge+manual\",\"manual_confirmed\":true,\"assertions\":[{\"id\":\"ASSERT-001\",\"description\":\"规约中的可验证断言\",\"judge_status\":\"matched\",\"human_status\":\"matched\",\"evidence\":\"代码、测试或文档证据摘要\",\"files\":[],\"notes\":\"\"}]}}"
164
+ node skywalk-sdd/log.cjs record --type=conformance_review --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="规约符合度人工确认" --details-json="{\"conformance_review\":{\"method\":\"llm-as-judge+manual\",\"manual_confirmed\":true,\"assertions\":[{\"id\":\"ASSERT-001\",\"description\":\"规约中的可验证断言\",\"judge_status\":\"matched\",\"human_status\":\"matched\",\"evidence\":\"代码、测试或文档证据摘要\",\"files\":[],\"notes\":\"\"}]}}"
165
165
  ```
166
166
 
167
167
  ### 6. 【交互引导】根据结果引导下一步
@@ -40,8 +40,8 @@ allowed-tools:
40
40
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
41
41
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
42
42
  > **📊 Telemetry(必做,不得跳过)**
43
- > - 阶段开始:`node skywalk-sdd/log.js start --command=design --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
44
- > - 阶段结束:`node skywalk-sdd/log.js end --event-id=<event_id> --command=design --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
43
+ > - 阶段开始:`node skywalk-sdd/log.cjs start --command=design --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
44
+ > - 阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=design --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
45
45
 
46
46
  ---
47
47
 
@@ -23,8 +23,8 @@ allowed-tools:
23
23
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
24
24
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
25
25
  > **📊 Telemetry(必做,不得跳过)**
26
- > - 阶段开始:`node skywalk-sdd/log.js start --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
27
- > - 阶段结束:`node skywalk-sdd/log.js end --event-id=<event_id> --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
26
+ > - 阶段开始:`node skywalk-sdd/log.cjs start --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
27
+ > - 阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
28
28
 
29
29
  ---
30
30
 
@@ -34,8 +34,8 @@ allowed-tools:
34
34
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
35
35
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
36
36
  > **📊 Telemetry(必做,不得跳过)**
37
- > - 阶段开始:`node skywalk-sdd/log.js start --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
38
- > - 阶段结束:`node skywalk-sdd/log.js end --event-id=<event_id> --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
37
+ > - 阶段开始:`node skywalk-sdd/log.cjs start --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
38
+ > - 阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
39
39
 
40
40
  ---
41
41
 
@@ -34,8 +34,8 @@ allowed-tools:
34
34
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
35
35
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
36
36
  > **📊 Telemetry(必做,不得跳过)**
37
- > - 阶段开始:`node skywalk-sdd/log.js start --command=spec --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
38
- > - 阶段结束:`node skywalk-sdd/log.js end --event-id=<event_id> --command=spec --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
37
+ > - 阶段开始:`node skywalk-sdd/log.cjs start --command=spec --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
38
+ > - 阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=spec --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
39
39
 
40
40
  ---
41
41
 
@@ -41,8 +41,8 @@ allowed-tools:
41
41
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
42
42
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
43
43
  > **📊 Telemetry(必做,不得跳过)**
44
- > - 阶段开始:`node skywalk-sdd/log.js start --command=task --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
45
- > - 阶段结束:`node skywalk-sdd/log.js end --event-id=<event_id> --command=task --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
44
+ > - 阶段开始:`node skywalk-sdd/log.cjs start --command=task --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
45
+ > - 阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=task --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
46
46
 
47
47
  ---
48
48
 
@@ -29,8 +29,8 @@ allowed-tools:
29
29
  > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
30
30
  > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
31
31
  > **📊 Telemetry(必做,不得跳过)**
32
- > - 阶段开始:`node skywalk-sdd/log.js start --command=test --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
33
- > - 阶段结束:`node skywalk-sdd/log.js end --event-id=<event_id> --command=test --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
32
+ > - 阶段开始:`node skywalk-sdd/log.cjs start --command=test --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
33
+ > - 阶段结束:`node skywalk-sdd/log.cjs end --event-id=<event_id> --command=test --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success|failure --summary="摘要"`
34
34
 
35
35
  ---
36
36