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.
- package/lib/init.js +9 -9
- package/package.json +2 -2
- package/skywalk-sdd/{index.js → index.cjs} +101 -55
- package/templates/ci/github-actions-sdd.yml +3 -3
- package/templates/ci/gitlab-ci-sdd.yml +3 -3
- package/templates/git-hooks/{pre-push-sdd-check.js → pre-push-sdd-check.cjs} +3 -3
- package/templates/hooks/claude/hooks/{sdd-prompt.js → sdd-prompt.cjs} +2 -2
- package/templates/hooks/claude/hooks/{sdd-stop.js → sdd-stop.cjs} +1 -1
- package/templates/hooks/claude/settings.json +4 -4
- package/templates/opsx-commands/apply.md +16 -12
- package/templates/opsx-commands/archive.md +8 -8
- package/templates/opsx-commands/check.md +8 -8
- package/templates/opsx-commands/design.md +3 -3
- package/templates/opsx-commands/explore.md +3 -3
- package/templates/opsx-commands/propose.md +3 -3
- package/templates/opsx-commands/spec.md +3 -3
- package/templates/opsx-commands/task.md +4 -4
- package/templates/opsx-commands/test.md +5 -5
- package/templates/skills/opsx-apply/SKILL.md +12 -6
- package/templates/skills/opsx-archive/SKILL.md +8 -8
- package/templates/skills/opsx-check/SKILL.md +6 -6
- package/templates/skills/opsx-design/SKILL.md +2 -2
- package/templates/skills/opsx-explore/SKILL.md +2 -2
- package/templates/skills/opsx-propose/SKILL.md +2 -2
- package/templates/skills/opsx-spec/SKILL.md +2 -2
- package/templates/skills/opsx-task/SKILL.md +2 -2
- package/templates/skills/opsx-test/SKILL.md +2 -2
- /package/templates/git-hooks/{pre-commit-sdd-check.js → pre-commit-sdd-check.cjs} +0 -0
- /package/templates/hooks/claude/hooks/{sdd-post-tool.js → sdd-post-tool.cjs} +0 -0
- /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.
|
|
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-*.
|
|
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.
|
|
794
|
-
const telemetryDst = path.join(dataDir, 'log.
|
|
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.
|
|
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.
|
|
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.
|
|
873
|
-
installGitHookShim(cwd, 'pre-push', 'skywalk-sdd/git-hooks/pre-push-sdd-check.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
10
|
-
* node skywalk-sdd/log.
|
|
11
|
-
* node skywalk-sdd/log.
|
|
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]
|
|
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
|
-
|
|
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
|
|
1822
|
-
`- 阶段闭环率:${health.matched_stage_rate
|
|
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
|
|
1827
|
-
`- E2 编码时间占比:${metrics.efficiency?.e2_coding_time_ratio
|
|
1828
|
-
`- E3 规约时间占比:${metrics.efficiency?.e3_spec_time_ratio
|
|
1829
|
-
`- E4 AI 一次成码率:${metrics.efficiency?.e4_ai_code_first_pass_rate
|
|
1830
|
-
`- 有效阶段总耗时:${metrics.efficiency?.effective_stage_duration_ms
|
|
1831
|
-
`- 返工阶段总耗时:${metrics.efficiency?.rework_stage_duration_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
|
|
1836
|
-
`- Q4 规约驱动测试覆盖率:${metrics.quality?.q4_spec_driven_test_coverage
|
|
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
|
|
1842
|
-
`- P4 质量门前置率:${metrics.process?.p4_quality_gate_enforcement_rate
|
|
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
|
-
'-
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
2568
|
-
node skywalk-sdd/log.
|
|
2569
|
-
node skywalk-sdd/log.
|
|
2570
|
-
node skywalk-sdd/log.
|
|
2571
|
-
node skywalk-sdd/log.
|
|
2572
|
-
node skywalk-sdd/log.
|
|
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.
|
|
2586
|
-
node skywalk-sdd/log.
|
|
2587
|
-
node skywalk-sdd/log.
|
|
2588
|
-
node skywalk-sdd/log.
|
|
2589
|
-
node skywalk-sdd/log.
|
|
2590
|
-
node skywalk-sdd/log.
|
|
2591
|
-
node skywalk-sdd/log.
|
|
2592
|
-
node skywalk-sdd/log.
|
|
2593
|
-
node skywalk-sdd/log.
|
|
2594
|
-
node skywalk-sdd/log.
|
|
2595
|
-
node skywalk-sdd/log.
|
|
2596
|
-
node skywalk-sdd/log.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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',
|
|
23
|
+
const args = [logCli, 'doctor', `--project=${projectRoot}`];
|
|
24
24
|
if (changeName) {
|
|
25
|
-
args.push(
|
|
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.
|
|
58
|
-
'- Run skywalk-sdd/log.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
-
|
|
394
|
-
|
|
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.
|
|
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.
|
|
483
|
-
> 每完成一个任务,必须记录任务级结构化事件:`node skywalk-sdd/log.
|
|
484
|
-
> AI 代码产出完成后,必须记录采纳率快照,但不得为了采集快照自动提交 commit。Git 可用时只读统计 SHA/diff;Git 不可用时使用 `vcs_mode=no-git` 和 `base_git_sha=null`:`node skywalk-sdd/log.
|
|
485
|
-
> 若后续发生人工修改并完成采纳确认,必须补录最终采纳统计;若非 Git 项目,SHA 可填 `null`,采纳行数由人工或工具统计补录:`node skywalk-sdd/log.
|
|
486
|
-
> 阶段结束时执行(必须成功):`node skywalk-sdd/log.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
463
|
-
> `check_result` 记录成功后,才允许执行阶段结束:`node skywalk-sdd/log.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
243
|
-
> 若 spec.md 中有可识别场景 ID,且测试能映射到这些场景,建议记录 Q4 规约驱动测试覆盖率(可选,不阻塞测试流程):`node skywalk-sdd/log.
|
|
244
|
-
> 阶段结束时执行(必须成功):`node skywalk-sdd/log.
|
|
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.
|
|
33
|
-
> - 阶段结束:`node skywalk-sdd/log.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
36
|
-
> - 检查报告生成后,必须先记录结构化检查结果:`node skywalk-sdd/log.
|
|
37
|
-
> - `check_result` 记录成功后,才允许阶段结束:`node skywalk-sdd/log.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
44
|
-
> - 阶段结束:`node skywalk-sdd/log.
|
|
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.
|
|
27
|
-
> - 阶段结束:`node skywalk-sdd/log.
|
|
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.
|
|
38
|
-
> - 阶段结束:`node skywalk-sdd/log.
|
|
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.
|
|
38
|
-
> - 阶段结束:`node skywalk-sdd/log.
|
|
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.
|
|
45
|
-
> - 阶段结束:`node skywalk-sdd/log.
|
|
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.
|
|
33
|
-
> - 阶段结束:`node skywalk-sdd/log.
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|