kld-sdd 2.6.11 → 2.6.12
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/hook-gate-core.js +41 -5
- package/lib/init.js +61 -88
- package/package.json +1 -1
- package/templates/hooks/claude/hooks/sdd-prompt.cjs +23 -5
- package/templates/hooks/codebuddy/hooks/sdd-prompt.cjs +22 -3
- package/templates/skills/kld-sdd/opsx-apply/SKILL.md +3 -3
- package/templates/skills/kld-sdd/opsx-apply/checklist.md +3 -3
- package/templates/skills/kld-sdd/opsx-apply/reference.md +13 -13
- package/templates/skills/kld-sdd/opsx-apply/worktree-setup.md +3 -3
- package/templates/skills/kld-sdd/opsx-archive/SKILL.md +14 -14
- package/templates/skills/kld-sdd/opsx-archive/checklist.md +2 -2
- package/templates/skills/kld-sdd/opsx-check/SKILL.md +13 -13
- package/templates/skills/kld-sdd/opsx-design/SKILL.md +4 -4
- package/templates/skills/kld-sdd/opsx-design/reference.md +2 -2
- package/templates/skills/kld-sdd/opsx-explore/SKILL.md +5 -5
- package/templates/skills/kld-sdd/opsx-propose/SKILL.md +11 -11
- package/templates/skills/kld-sdd/opsx-propose/reference.md +2 -2
- package/templates/skills/kld-sdd/opsx-rules/SKILL.md +3 -3
- package/templates/skills/kld-sdd/opsx-spec/SKILL.md +5 -5
- package/templates/skills/kld-sdd/opsx-spec/reference.md +2 -2
- package/templates/skills/kld-sdd/opsx-task/SKILL.md +4 -4
- package/templates/skills/kld-sdd/opsx-task/reference.md +2 -2
- package/templates/skills/kld-sdd/opsx-tdd-core/reference.md +3 -3
- package/templates/skills/kld-sdd/opsx-tdd-rules/rules/test-skeleton-telemetry.md +2 -2
- package/templates/skills/kld-sdd/opsx-test/SKILL.md +5 -5
package/lib/hook-gate-core.js
CHANGED
|
@@ -50,16 +50,45 @@ function normalizeHookInput(input) {
|
|
|
50
50
|
return normalized;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
function resolveSkywalkDir(dir) {
|
|
54
|
+
const root = path.resolve(dir || '.');
|
|
55
|
+
const direct = path.join(root, 'skywalk-sdd');
|
|
56
|
+
if (
|
|
57
|
+
fs.existsSync(path.join(direct, 'log.cjs'))
|
|
58
|
+
|| fs.existsSync(path.join(direct, 'log.js'))
|
|
59
|
+
) {
|
|
60
|
+
return direct;
|
|
61
|
+
}
|
|
62
|
+
const hintFile = path.join(root, '.sdd-spec-root');
|
|
63
|
+
if (fs.existsSync(hintFile)) {
|
|
64
|
+
const rel = String(fs.readFileSync(hintFile, 'utf8') || '')
|
|
65
|
+
.trim()
|
|
66
|
+
.split(/\r?\n/)[0]
|
|
67
|
+
.trim();
|
|
68
|
+
if (rel) {
|
|
69
|
+
const nested = path.join(root, rel, 'skywalk-sdd');
|
|
70
|
+
if (
|
|
71
|
+
fs.existsSync(path.join(nested, 'log.cjs'))
|
|
72
|
+
|| fs.existsSync(path.join(nested, 'log.js'))
|
|
73
|
+
) {
|
|
74
|
+
return nested;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
53
81
|
function hasTelemetryCli(dir) {
|
|
54
|
-
return
|
|
55
|
-
fs.existsSync(path.join(dir, 'skywalk-sdd', 'log.js'));
|
|
82
|
+
return Boolean(resolveSkywalkDir(dir));
|
|
56
83
|
}
|
|
57
84
|
|
|
58
85
|
function findProjectRoot(startDir) {
|
|
59
86
|
if (!startDir) return '';
|
|
60
87
|
let current = path.resolve(startDir);
|
|
61
88
|
for (let i = 0; i < 25; i++) {
|
|
62
|
-
if (hasTelemetryCli(current)
|
|
89
|
+
if (hasTelemetryCli(current) || fs.existsSync(path.join(current, '.sdd-spec-root'))) {
|
|
90
|
+
return current;
|
|
91
|
+
}
|
|
63
92
|
const parent = path.dirname(current);
|
|
64
93
|
if (parent === current) return '';
|
|
65
94
|
current = parent;
|
|
@@ -96,7 +125,10 @@ function safeChangeName(name) {
|
|
|
96
125
|
}
|
|
97
126
|
|
|
98
127
|
function findActiveApplyStage(projectRoot) {
|
|
99
|
-
const
|
|
128
|
+
const skywalk = resolveSkywalkDir(projectRoot);
|
|
129
|
+
const stateDir = skywalk
|
|
130
|
+
? path.join(skywalk, 'state')
|
|
131
|
+
: path.join(projectRoot, 'skywalk-sdd', 'state');
|
|
100
132
|
if (!fs.existsSync(stateDir)) return null;
|
|
101
133
|
|
|
102
134
|
let latest = null;
|
|
@@ -118,7 +150,10 @@ function findActiveApplyStage(projectRoot) {
|
|
|
118
150
|
|
|
119
151
|
function hasCompletedCheck(projectRoot, changeName) {
|
|
120
152
|
const safeName = safeChangeName(changeName);
|
|
121
|
-
const
|
|
153
|
+
const skywalk = resolveSkywalkDir(projectRoot);
|
|
154
|
+
const eventsChangeDir = skywalk
|
|
155
|
+
? path.join(skywalk, 'events', safeName)
|
|
156
|
+
: path.join(projectRoot, 'skywalk-sdd', 'events', safeName);
|
|
122
157
|
if (!fs.existsSync(eventsChangeDir)) return false;
|
|
123
158
|
|
|
124
159
|
const jsonlFiles = fs.readdirSync(eventsChangeDir)
|
|
@@ -316,6 +351,7 @@ module.exports = {
|
|
|
316
351
|
readStdin,
|
|
317
352
|
parseHookInput,
|
|
318
353
|
normalizeHookInput,
|
|
354
|
+
resolveSkywalkDir,
|
|
319
355
|
hasTelemetryCli,
|
|
320
356
|
findProjectRoot,
|
|
321
357
|
getProjectRoot,
|
package/lib/init.js
CHANGED
|
@@ -1208,94 +1208,62 @@ function writeSddSpecRootHint(anchorDir, specPackageAbs) {
|
|
|
1208
1208
|
}
|
|
1209
1209
|
|
|
1210
1210
|
/**
|
|
1211
|
-
*
|
|
1212
|
-
*
|
|
1213
|
-
*
|
|
1211
|
+
* 移除工作区 / Git 根上多余的 skywalk-sdd(符号链接或旧完整副本)。
|
|
1212
|
+
* 唯一实体只保留在 *-sdd-specs/skywalk-sdd/。
|
|
1213
|
+
*
|
|
1214
|
+
* 触发条件(满足其一即可):
|
|
1215
|
+
* - 存在 .sdd-spec-root
|
|
1216
|
+
* - 同级已有 *-sdd-specs/skywalk-sdd(多仓/单仓包裹包)
|
|
1214
1217
|
*/
|
|
1215
|
-
function
|
|
1216
|
-
const anchor = path.resolve(anchorDir);
|
|
1217
|
-
const specAbs = path.resolve(specPackageAbs);
|
|
1218
|
-
const relSpec = path.relative(anchor, specAbs).replace(/\\/g, '/');
|
|
1219
|
-
const skywalkDir = path.join(anchor, 'skywalk-sdd');
|
|
1220
|
-
const targetSkywalk = path.join(specAbs, 'skywalk-sdd');
|
|
1221
|
-
fs.mkdirSync(path.join(skywalkDir, 'ontology'), { recursive: true });
|
|
1222
|
-
|
|
1223
|
-
const writeForwarder = (destRel, targetAbsPath) => {
|
|
1224
|
-
const dest = path.join(skywalkDir, destRel);
|
|
1225
|
-
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
1226
|
-
const relFromDestDir = path.relative(path.dirname(dest), targetAbsPath).replace(/\\/g, '/');
|
|
1227
|
-
const body = [
|
|
1228
|
-
'#!/usr/bin/env node',
|
|
1229
|
-
"'use strict';",
|
|
1230
|
-
"const { spawnSync } = require('child_process');",
|
|
1231
|
-
"const path = require('path');",
|
|
1232
|
-
`const target = path.resolve(__dirname, ${JSON.stringify(relFromDestDir)});`,
|
|
1233
|
-
'const r = spawnSync(process.execPath, [target, ...process.argv.slice(2)], { stdio: \'inherit\' });',
|
|
1234
|
-
'process.exit(r.status === null ? 1 : r.status);',
|
|
1235
|
-
'',
|
|
1236
|
-
].join('\n');
|
|
1237
|
-
fs.writeFileSync(dest, body, 'utf8');
|
|
1238
|
-
};
|
|
1239
|
-
|
|
1240
|
-
const entries = [
|
|
1241
|
-
'log.cjs',
|
|
1242
|
-
'openspec-shim.cjs',
|
|
1243
|
-
'context-client.cjs',
|
|
1244
|
-
'apply-worktree-finish.cjs',
|
|
1245
|
-
];
|
|
1246
|
-
for (const name of entries) {
|
|
1247
|
-
writeForwarder(name, path.join(targetSkywalk, name));
|
|
1248
|
-
}
|
|
1249
|
-
writeForwarder(path.join('ontology', 'cli.cjs'), path.join(targetSkywalk, 'ontology', 'cli.cjs'));
|
|
1250
|
-
console.log(` ✓ skywalk-sdd/ 转发脚本 → ${relSpec}/skywalk-sdd/(实体在包裹包)`);
|
|
1251
|
-
return { ok: true, mode: 'forwarders', relSpec };
|
|
1252
|
-
}
|
|
1253
|
-
|
|
1254
|
-
function linkSkywalkToSpecPackage(anchorDir, specPackageAbs) {
|
|
1218
|
+
function removeOuterSkywalk(anchorDir) {
|
|
1255
1219
|
const anchor = path.resolve(anchorDir);
|
|
1256
|
-
const
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
return { ok:
|
|
1220
|
+
const outer = path.join(anchor, 'skywalk-sdd');
|
|
1221
|
+
let st = null;
|
|
1222
|
+
try {
|
|
1223
|
+
st = fs.lstatSync(outer);
|
|
1224
|
+
} catch (err) {
|
|
1225
|
+
if (err && err.code === 'ENOENT') return { ok: true, removed: false };
|
|
1226
|
+
throw err;
|
|
1262
1227
|
}
|
|
1263
1228
|
|
|
1229
|
+
const hint = path.join(anchor, '.sdd-spec-root');
|
|
1230
|
+
const hasHint = fs.existsSync(hint);
|
|
1231
|
+
let hasNestedEntity = false;
|
|
1264
1232
|
try {
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
if (st) {
|
|
1272
|
-
if (st.isSymbolicLink()) {
|
|
1273
|
-
const current = fs.realpathSync(linkAbs);
|
|
1274
|
-
if (current === fs.realpathSync(targetAbs)) {
|
|
1275
|
-
console.log(' ✓ skywalk-sdd/ 已链接到包裹包(唯一实体)');
|
|
1276
|
-
return { ok: true, mode: 'symlink', linkAbs, targetAbs };
|
|
1277
|
-
}
|
|
1278
|
-
fs.unlinkSync(linkAbs);
|
|
1279
|
-
} else if (st.isDirectory()) {
|
|
1280
|
-
// 旧完整副本 → 删除后改链接(权威数据在包裹包)
|
|
1281
|
-
fs.rmSync(linkAbs, { recursive: true, force: true });
|
|
1282
|
-
} else {
|
|
1283
|
-
fs.unlinkSync(linkAbs);
|
|
1233
|
+
for (const name of fs.readdirSync(anchor)) {
|
|
1234
|
+
if (!/-sdd-specs$/i.test(name)) continue;
|
|
1235
|
+
const entity = path.join(anchor, name, 'skywalk-sdd', 'log.cjs');
|
|
1236
|
+
if (fs.existsSync(entity)) {
|
|
1237
|
+
hasNestedEntity = true;
|
|
1238
|
+
break;
|
|
1284
1239
|
}
|
|
1285
1240
|
}
|
|
1286
|
-
} catch
|
|
1287
|
-
|
|
1288
|
-
|
|
1241
|
+
} catch {
|
|
1242
|
+
// ignore
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
if (!hasHint && !hasNestedEntity) {
|
|
1246
|
+
// 无包裹包迹象时不贸然删除(可能是旧平铺布局)
|
|
1247
|
+
return { ok: true, removed: false, skipped: true };
|
|
1289
1248
|
}
|
|
1290
1249
|
|
|
1291
|
-
const rel = path.relative(anchor, targetAbs);
|
|
1292
1250
|
try {
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1251
|
+
if (st.isSymbolicLink()) {
|
|
1252
|
+
fs.unlinkSync(outer);
|
|
1253
|
+
console.log(' ✓ 已移除 Git/工作区根多余的 skywalk-sdd 符号链接(实体在包裹包)');
|
|
1254
|
+
return { ok: true, removed: true, mode: 'symlink' };
|
|
1255
|
+
}
|
|
1256
|
+
if (st.isDirectory()) {
|
|
1257
|
+
fs.rmSync(outer, { recursive: true, force: true });
|
|
1258
|
+
console.log(' ✓ 已移除 Git/工作区根多余的 skywalk-sdd/(实体在包裹包)');
|
|
1259
|
+
return { ok: true, removed: true, mode: 'directory' };
|
|
1260
|
+
}
|
|
1261
|
+
fs.unlinkSync(outer);
|
|
1262
|
+
console.log(' ✓ 已移除 Git/工作区根多余的 skywalk-sdd');
|
|
1263
|
+
return { ok: true, removed: true, mode: 'file' };
|
|
1296
1264
|
} catch (err) {
|
|
1297
|
-
console.log(` ⚠️
|
|
1298
|
-
return
|
|
1265
|
+
console.log(` ⚠️ 未能移除根目录 skywalk-sdd/: ${err.message}`);
|
|
1266
|
+
return { ok: false, message: err.message };
|
|
1299
1267
|
}
|
|
1300
1268
|
}
|
|
1301
1269
|
|
|
@@ -1519,8 +1487,7 @@ async function main() {
|
|
|
1519
1487
|
asIndependentGit: true,
|
|
1520
1488
|
});
|
|
1521
1489
|
writeSddSpecRootHint(workspaceRoot, specPackage.abs);
|
|
1522
|
-
|
|
1523
|
-
linkSkywalkToSpecPackage(workspaceRoot, specPackage.abs);
|
|
1490
|
+
removeOuterSkywalk(workspaceRoot);
|
|
1524
1491
|
|
|
1525
1492
|
// 重新探测,刷新 layout.specRepo / codeRepos
|
|
1526
1493
|
layout = workspaceLayout.detectWorkspaceLayout(workspaceRoot);
|
|
@@ -1549,11 +1516,11 @@ async function main() {
|
|
|
1549
1516
|
asIndependentGit: false,
|
|
1550
1517
|
});
|
|
1551
1518
|
writeSddSpecRootHint(workspaceRoot, specPackage.abs);
|
|
1552
|
-
|
|
1519
|
+
removeOuterSkywalk(workspaceRoot);
|
|
1553
1520
|
|
|
1554
1521
|
deployMonoSddYaml(workspaceRoot, { specPathRelative: specPackage.name });
|
|
1555
|
-
// Hook 装在 Git
|
|
1556
|
-
|
|
1522
|
+
// Hook 装在 Git 根,脚本在包裹包内(Git 根不落 skywalk-sdd/)
|
|
1523
|
+
installCodeRepoCommitMsgHook(workspaceRoot, specPackage.abs);
|
|
1557
1524
|
const linked = sddConfig.setSpecPath(workspaceRoot, specPackage.abs, {
|
|
1558
1525
|
allowNestedPackage: true,
|
|
1559
1526
|
});
|
|
@@ -1571,7 +1538,7 @@ async function main() {
|
|
|
1571
1538
|
asIndependentGit: false,
|
|
1572
1539
|
});
|
|
1573
1540
|
writeSddSpecRootHint(workspaceRoot, specPackage.abs);
|
|
1574
|
-
|
|
1541
|
+
removeOuterSkywalk(workspaceRoot);
|
|
1575
1542
|
deployDotSddYaml(workspaceRoot);
|
|
1576
1543
|
}
|
|
1577
1544
|
}
|
|
@@ -1603,6 +1570,12 @@ async function main() {
|
|
|
1603
1570
|
// 7. 更新工作目录 .gitignore
|
|
1604
1571
|
updateGitignore();
|
|
1605
1572
|
|
|
1573
|
+
// 8. 收尾:无论前面是否走过 symlink/旧副本路径,强制清掉工作区/Git 根多余 skywalk-sdd/
|
|
1574
|
+
if (specPackage && fs.existsSync(specPackage.abs)) {
|
|
1575
|
+
writeSddSpecRootHint(workspaceRoot, specPackage.abs);
|
|
1576
|
+
}
|
|
1577
|
+
removeOuterSkywalk(workspaceRoot);
|
|
1578
|
+
|
|
1606
1579
|
const selectedNames = selectedTools.map(t => TOOL_CONFIGS[t].name).join(', ');
|
|
1607
1580
|
|
|
1608
1581
|
console.log();
|
|
@@ -1616,7 +1589,8 @@ async function main() {
|
|
|
1616
1589
|
console.log('工作区部署结果:');
|
|
1617
1590
|
console.log(' 🎯 工作目录 .*/skills/opsx-*/ # skills 只装这一份');
|
|
1618
1591
|
console.log(' 📋 .sdd-workspace.yaml # 子仓编排清单');
|
|
1619
|
-
console.log('
|
|
1592
|
+
console.log(' 📌 .sdd-spec-root # 指向包裹包;CLI 用 $(cat .sdd-spec-root)/skywalk-sdd/…');
|
|
1593
|
+
console.log(' ✗ 工作区根无 skywalk-sdd/ # 实体只在包裹包内');
|
|
1620
1594
|
if (specPackage) {
|
|
1621
1595
|
console.log(` 📄 ${specPackage.name}/ # 统一 SDD 包裹包(独立 Git)`);
|
|
1622
1596
|
console.log(' modules.yaml / sdd.config.yaml / openspec / openspec-templates / skywalk-sdd');
|
|
@@ -1635,8 +1609,8 @@ async function main() {
|
|
|
1635
1609
|
console.log(` 📄 ${specPackage.name}/ # 统一 SDD 包裹包(仓内子目录)`);
|
|
1636
1610
|
console.log(' modules.yaml / sdd.config.yaml / openspec / openspec-templates / skywalk-sdd');
|
|
1637
1611
|
}
|
|
1638
|
-
console.log(' 🔗 .sdd.yaml (layout: mono) + commit-msg Hook');
|
|
1639
|
-
console.log('
|
|
1612
|
+
console.log(' 🔗 .sdd.yaml (layout: mono) + commit-msg Hook(脚本在包裹包)');
|
|
1613
|
+
console.log(' 📌 .sdd-spec-root → 包裹包;无根目录 skywalk-sdd/');
|
|
1640
1614
|
}
|
|
1641
1615
|
if (selectedTools.includes('kunlunzhima')) {
|
|
1642
1616
|
console.log(' 📎 .kunlunzhima/commands/opsx/ # KunlunZhima OPSX command bridge(11 个)');
|
|
@@ -1712,8 +1686,7 @@ module.exports = {
|
|
|
1712
1686
|
deployMonoSddYaml,
|
|
1713
1687
|
populateSpecPackage,
|
|
1714
1688
|
writeSddSpecRootHint,
|
|
1715
|
-
|
|
1716
|
-
deploySkywalkForwarders,
|
|
1689
|
+
removeOuterSkywalk,
|
|
1717
1690
|
deployQualityGateTemplates,
|
|
1718
1691
|
deployTelemetryDataDir,
|
|
1719
1692
|
attachCodeRepoLite,
|
package/package.json
CHANGED
|
@@ -18,9 +18,26 @@ function parseInput(raw) {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
function resolveSkywalkDir(dir) {
|
|
22
|
+
const direct = path.join(dir, 'skywalk-sdd');
|
|
23
|
+
if (fs.existsSync(path.join(direct, 'log.cjs')) || fs.existsSync(path.join(direct, 'log.js'))) {
|
|
24
|
+
return direct;
|
|
25
|
+
}
|
|
26
|
+
const hintFile = path.join(dir, '.sdd-spec-root');
|
|
27
|
+
if (fs.existsSync(hintFile)) {
|
|
28
|
+
const rel = String(fs.readFileSync(hintFile, 'utf8') || '').trim().split(/\r?\n/)[0].trim();
|
|
29
|
+
if (rel) {
|
|
30
|
+
const nested = path.join(dir, rel, 'skywalk-sdd');
|
|
31
|
+
if (fs.existsSync(path.join(nested, 'log.cjs')) || fs.existsSync(path.join(nested, 'log.js'))) {
|
|
32
|
+
return nested;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
21
39
|
function hasTelemetryCli(dir) {
|
|
22
|
-
return
|
|
23
|
-
fs.existsSync(path.join(dir, 'skywalk-sdd', 'log.js'));
|
|
40
|
+
return Boolean(resolveSkywalkDir(dir));
|
|
24
41
|
}
|
|
25
42
|
|
|
26
43
|
function findTelemetryRoot(startDir) {
|
|
@@ -51,7 +68,8 @@ function findProjectRoot(input) {
|
|
|
51
68
|
}
|
|
52
69
|
|
|
53
70
|
function readActiveStages(projectRoot) {
|
|
54
|
-
const
|
|
71
|
+
const skywalk = resolveSkywalkDir(projectRoot);
|
|
72
|
+
const stateDir = skywalk ? path.join(skywalk, 'state') : path.join(projectRoot, 'skywalk-sdd', 'state');
|
|
55
73
|
if (!fs.existsSync(stateDir)) return [];
|
|
56
74
|
return fs.readdirSync(stateDir)
|
|
57
75
|
.filter(file => file.endsWith('.json'))
|
|
@@ -76,8 +94,8 @@ const activeStages = readActiveStages(projectRoot)
|
|
|
76
94
|
|
|
77
95
|
const lines = [
|
|
78
96
|
'SDD Telemetry reminder:',
|
|
79
|
-
'- Run skywalk-sdd/log.cjs start before the OPSX stage work begins.',
|
|
80
|
-
'- Run skywalk-sdd/log.cjs end before stopping the stage.',
|
|
97
|
+
'- Run node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start before the OPSX stage work begins.',
|
|
98
|
+
'- Run node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" end before stopping the stage.',
|
|
81
99
|
'- Hooks are only an enhancement; OPSX skill instructions remain authoritative.',
|
|
82
100
|
];
|
|
83
101
|
|
|
@@ -13,8 +13,27 @@ if (!/\/opsx[:|-]/.test(prompt)) {
|
|
|
13
13
|
process.exit(0);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
function resolveSkywalkDir(dir) {
|
|
17
|
+
const direct = path.join(dir, 'skywalk-sdd');
|
|
18
|
+
if (fs.existsSync(path.join(direct, 'log.cjs')) || fs.existsSync(path.join(direct, 'log.js'))) {
|
|
19
|
+
return direct;
|
|
20
|
+
}
|
|
21
|
+
const hintFile = path.join(dir, '.sdd-spec-root');
|
|
22
|
+
if (fs.existsSync(hintFile)) {
|
|
23
|
+
const rel = String(fs.readFileSync(hintFile, 'utf8') || '').trim().split(/\r?\n/)[0].trim();
|
|
24
|
+
if (rel) {
|
|
25
|
+
const nested = path.join(dir, rel, 'skywalk-sdd');
|
|
26
|
+
if (fs.existsSync(path.join(nested, 'log.cjs')) || fs.existsSync(path.join(nested, 'log.js'))) {
|
|
27
|
+
return nested;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
16
34
|
function readActiveStages(projectRoot) {
|
|
17
|
-
const
|
|
35
|
+
const skywalk = resolveSkywalkDir(projectRoot);
|
|
36
|
+
const stateDir = skywalk ? path.join(skywalk, 'state') : path.join(projectRoot, 'skywalk-sdd', 'state');
|
|
18
37
|
if (!fs.existsSync(stateDir)) return [];
|
|
19
38
|
return fs.readdirSync(stateDir)
|
|
20
39
|
.filter((file) => file.endsWith('.json'))
|
|
@@ -35,8 +54,8 @@ const activeStages = readActiveStages(projectRoot)
|
|
|
35
54
|
|
|
36
55
|
const lines = [
|
|
37
56
|
'SDD Telemetry reminder:',
|
|
38
|
-
'- Run skywalk-sdd/log.cjs start before the OPSX stage work begins.',
|
|
39
|
-
'- Run skywalk-sdd/log.cjs end before stopping the stage.',
|
|
57
|
+
'- Run node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start before the OPSX stage work begins.',
|
|
58
|
+
'- Run node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" end before stopping the stage.',
|
|
40
59
|
'- Hooks are only an enhancement; OPSX skill instructions remain authoritative.',
|
|
41
60
|
];
|
|
42
61
|
|
|
@@ -27,15 +27,15 @@ allowed-tools:
|
|
|
27
27
|
> - ⛔ **隔离红线**:绝对禁止加载同级其他 Capability 的文档
|
|
28
28
|
|
|
29
29
|
> **🖥️ 跨平台执行规则**
|
|
30
|
-
> - **写代码**:cwd 保持在 Git 根(含 `src/`);**文档 / telemetry**:`--project` 指向 SDD 包裹包(`node skywalk-sdd/ontology/cli.cjs spec-root` 可查看)。
|
|
31
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包)。
|
|
30
|
+
> - **写代码**:cwd 保持在 Git 根(含 `src/`);**文档 / telemetry**:`--project` 指向 SDD 包裹包(`node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root` 可查看)。
|
|
31
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包)。
|
|
32
32
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
33
33
|
> - ${SHELL_GUIDANCE}
|
|
34
34
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
35
35
|
> **📊 Telemetry(必做,不得跳过)**
|
|
36
36
|
> - 阶段开始 / 阶段结束 / `task_update` / `ai_adoption_review` / `worktree_finish` 的**完整命令模板**见 `./reference.md`「📊 Telemetry 命令模板」。
|
|
37
37
|
> - 不得跳过任何 telemetry 记录;`task_update` 的 `--task-id=<TASK-ID>` 必须替换为实际任务 ID,否则 E4 指标无法计算;TDD 测试骨架任务须在 `--details-json` 带 `"task_kind":"test-skeleton"`(P3,详见 `./reference.md`)。
|
|
38
|
-
> - 较大的 `--details-json` 负载可先写入文件,再通过 `--details-file=skywalk-sdd/state/<变更名称>-<type>.json` 传递(例如 `task_update` 对应 `<变更名称>-task-update.json`)。
|
|
38
|
+
> - 较大的 `--details-json` 负载可先写入文件,再通过 `--details-file="$(cat .sdd-spec-root)/skywalk-sdd/state/<变更名称>-<type>.json"` 传递(例如 `task_update` 对应 `<变更名称>-task-update.json`)。
|
|
39
39
|
> - `task_update` 记录成功后会自动调用 `check-task` 更新 `tasks.md` 中的 checkbox;录入成功后,agent 可以通过 `check-task` 命令验证该 checkbox 已更新。
|
|
40
40
|
> - **⚠️ P1-2 ai_adoption_review 必填 ai_diff**:记录 AI 产出快照时,`--details-json` 必须含 `ai_diff.files_changed`(即使=0)与 `ai_diff.files`(产出文件路径数组,非空),**不得只发 `assertions`**。`vcs_mode=readonly` 时 `ai_diff.added_lines` 不得为 null——用只读 `git diff --numstat HEAD` 取值(apply Git 只读策略允许);`vcs_mode=no-git` 时可填 null。工具侧已加记录时硬校验:`files` 空数组或 `readonly` 下 `added_lines=null` 将 **拒绝记录**(与 conformance_review 校验对称)。缺失 `ai_diff` 会导致 report 变更文件数为 null(工具侧已加 `assertions[].files` 兜底,但 `ai_diff` 是主数据源)。完整模板见 `./reference.md`「§5.1」。
|
|
41
41
|
> - **⚠️ P1-3 process_note 必记**:阶段内发生 修复/澄清/决策/API 故障/换模型 时,**必须**记 `process_note` 事件(`kind` 见 `./reference.md`「必记节点清单」)。全程 0 条 process_note 视为过程记录缺失,report 过程记录区显示空。
|
|
@@ -14,7 +14,7 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
|
|
|
14
14
|
### §1.2 Check 门禁(apply 前必做)
|
|
15
15
|
|
|
16
16
|
- [ ] 读取 telemetry 事件数据,检查当前 change 是否已有完成的 check 阶段
|
|
17
|
-
- `node skywalk-sdd/log.cjs doctor --project=. --change=<change-name>` 或搜 `skywalk-sdd/data/events/<change-name>/` 的 `stage_end` + `command=check` + `result=success`
|
|
17
|
+
- `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" doctor --project=. --change=<change-name>` 或搜 `skywalk-sdd/data/events/<change-name>/` 的 `stage_end` + `command=check` + `result=success`
|
|
18
18
|
- [ ] check 已完成 ✅ → 继续 apply 流程
|
|
19
19
|
- [ ] check 未完成 ❌ → **强制拒绝** apply,引导用户先执行 `/opsx-check <change-name>`(不得跳过)
|
|
20
20
|
- [ ] telemetry 数据缺失(新项目无历史) → 提示首次执行先运行 `/opsx-check`,询问是否现在执行
|
|
@@ -82,7 +82,7 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
|
|
|
82
82
|
- [ ] 两种格式同步更新,不可遗漏
|
|
83
83
|
- [ ] 显示进度:`✅ [TASK-ID] 已完成 [N/M]`
|
|
84
84
|
- [ ] 记录任务级 Telemetry(`task_update`,`--task-id=<TASK-ID>` 必填,否则 E4 指标无法计算);TDD 测试骨架任务须在 `--details-json` 带 `"task_kind":"test-skeleton"`(P3,避免红灯误判拉低 E4)
|
|
85
|
-
- [ ] ⛔ **task_update 后必须验证 checkbox 已更新**:执行 `node skywalk-sdd/index.cjs check-task --project=. --change=<变更名称> --task-id=<TASK-ID>` 确认 tasks.md 中对应行已从 `- [ ]` 变为 `- [x]`;若未更新,手动修改 tasks.md 并报告
|
|
85
|
+
- [ ] ⛔ **task_update 后必须验证 checkbox 已更新**:执行 `node "$(cat .sdd-spec-root)/skywalk-sdd/index.cjs" check-task --project=. --change=<变更名称> --task-id=<TASK-ID>` 确认 tasks.md 中对应行已从 `- [ ]` 变为 `- [x]`;若未更新,手动修改 tasks.md 并报告
|
|
86
86
|
|
|
87
87
|
### §5f.1 apply 结束前 checkbox 全量同步校验
|
|
88
88
|
|
|
@@ -112,7 +112,7 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
|
|
|
112
112
|
- [ ] 主仓库无与 merge 冲突的未跟踪文件(见 §1.5 Step 0.5)
|
|
113
113
|
- [ ] `test-strategy` 为 `tdd`/`impl-first` 时,§6.0 测试证据已存在
|
|
114
114
|
- [ ] 在**主仓库根目录**执行收尾脚本(禁止在 `.worktrees/...` 内执行)
|
|
115
|
-
- [ ] 执行:`node skywalk-sdd/apply-worktree-finish.cjs --change=<变更名称> --capability=<capability-name>`
|
|
115
|
+
- [ ] 执行:`node "$(cat .sdd-spec-root)/skywalk-sdd/apply-worktree-finish.cjs" --change=<变更名称> --capability=<capability-name>`
|
|
116
116
|
- [ ] 默认 merge 目标 = §1.5 `--record-base` 写入的 `integration_base`(**不是**默认 master)
|
|
117
117
|
- [ ] 若 §1.5 判定未建 worktree(串行、强依赖、沙箱回退)→ 跳过本节
|
|
118
118
|
|
|
@@ -11,13 +11,13 @@ description: opsx-apply 的详细模板:telemetry 命令、worktree 全套策
|
|
|
11
11
|
|
|
12
12
|
## 📊 Telemetry 命令模板(必做,不得跳过)
|
|
13
13
|
|
|
14
|
-
> 阶段开始:`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)
|
|
15
|
-
> 阶段结束:`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="摘要"`
|
|
14
|
+
> 阶段开始:`node "$(cat .sdd-spec-root)/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)
|
|
15
|
+
> 阶段结束:`node "$(cat .sdd-spec-root)/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="摘要"`
|
|
16
16
|
|
|
17
17
|
### task_update(每完成一个任务记录)
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
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}}"
|
|
20
|
+
node "$(cat .sdd-spec-root)/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}}"
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
**⚠️ 注意**:`--task-id=<TASK-ID>` 必须替换为实际任务 ID,否则 E4 指标无法计算。
|
|
@@ -26,16 +26,16 @@ node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. -
|
|
|
26
26
|
|
|
27
27
|
> 完整 test-skeleton telemetry 模板见 opsx-tdd-rules/rules/test-skeleton-telemetry.md
|
|
28
28
|
|
|
29
|
-
**📄 通过文件传递大 payload**:若 `details-json` 内容过长,可先写入 `skywalk-sdd/state/<变更名称>-task-update.json`,再使用 `--details-file` 指定该文件:
|
|
29
|
+
**📄 通过文件传递大 payload**:若 `details-json` 内容过长,可先写入 `"$(cat .sdd-spec-root)/skywalk-sdd/state/<变更名称>-task-update.json`,再使用 `--details-file` 指定该文件:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
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-file=skywalk-sdd/state/<变更名称>-task-update.json
|
|
32
|
+
node "$(cat .sdd-spec-root)/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-file="$(cat .sdd-spec-root)/skywalk-sdd/state/<变更名称>-task-update.json"
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
**✅ 验证 checkbox 已更新**:`task_update` 记录成功后会自动调用 `check-task` 更新 `tasks.md` 中的任务 checkbox。需要显式校验时可执行:
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
node skywalk-sdd/log.cjs check-task --project=. --change=<变更名称> --task-id=<TASK-ID>
|
|
38
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" check-task --project=. --change=<变更名称> --task-id=<TASK-ID>
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
**【Q3 details schema 字段说明】**:`details-json` 中的 `test_results` 和 `build_results` 字段非强制,但提供后能让 E4 一次成码率更准确:
|
|
@@ -59,7 +59,7 @@ node skywalk-sdd/log.cjs check-task --project=. --change=<变更名称> --task-i
|
|
|
59
59
|
| `manual-action` | 用户手动操作 | 用户手动改配置 |
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
|
-
node skywalk-sdd/log.cjs record --type=process_note --command=<stage> --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --summary="<人读摘要>" --details-json="{\"kind\":\"<fix|clarification|decision|api-error|model-switch|manual-action>\",\"target\":\"<可选,关联对象>\",\"round\":<可选,clarification 轮次整数>}"
|
|
62
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=process_note --command=<stage> --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --summary="<人读摘要>" --details-json="{\"kind\":\"<fix|clarification|decision|api-error|model-switch|manual-action>\",\"target\":\"<可选,关联对象>\",\"round\":<可选,clarification 轮次整数>}"
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
**使用时机**:
|
|
@@ -94,13 +94,13 @@ node skywalk-sdd/log.cjs record --type=process_note --command=<stage> --project=
|
|
|
94
94
|
Git 可用时只读统计 SHA/diff;Git 不可用时使用 `vcs_mode=no-git` 和 `base_git_sha=null`:
|
|
95
95
|
|
|
96
96
|
```bash
|
|
97
|
-
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\":<N>,\"files\":[\"<产出文件路径1>\",\"<产出文件路径2>\"],\"added_lines\":<git_diff_numstat_HEAD_取值或0>,\"deleted_lines\":<同左>},\"notes\":\"未自动提交 commit;vcs_mode=readonly 时 added_lines 用只读 git diff --numstat HEAD 取值(不得填 null,工具侧硬校验);vcs_mode=no-git 时可填 null\"}}"
|
|
97
|
+
node "$(cat .sdd-spec-root)/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\":<N>,\"files\":[\"<产出文件路径1>\",\"<产出文件路径2>\"],\"added_lines\":<git_diff_numstat_HEAD_取值或0>,\"deleted_lines\":<同左>},\"notes\":\"未自动提交 commit;vcs_mode=readonly 时 added_lines 用只读 git diff --numstat HEAD 取值(不得填 null,工具侧硬校验);vcs_mode=no-git 时可填 null\"}}"
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
### worktree_finish(收尾 Telemetry,推荐)
|
|
101
101
|
|
|
102
102
|
```bash
|
|
103
|
-
node skywalk-sdd/log.cjs record --type=worktree_finish \
|
|
103
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=worktree_finish \
|
|
104
104
|
--command=apply --project=. --change=<变更名称> --capability=<capability-name> \
|
|
105
105
|
--agent=<Agent类型> --source=opsx-command --session-id=<会话ID> \
|
|
106
106
|
--result=success --summary="merge+remove completed" \
|
|
@@ -243,12 +243,12 @@ node skywalk-sdd/log.cjs record --type=worktree_finish \
|
|
|
243
243
|
在主仓库根目录、**尚未** `cd` 进 `.worktrees/` 时执行:
|
|
244
244
|
|
|
245
245
|
```bash
|
|
246
|
-
node skywalk-sdd/apply-worktree-finish.cjs --record-base \
|
|
246
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/apply-worktree-finish.cjs" --record-base \
|
|
247
247
|
--change=<变更名称> \
|
|
248
248
|
--capability=<capability-name>
|
|
249
249
|
```
|
|
250
250
|
|
|
251
|
-
- 将当前具名分支写入 `skywalk-sdd/state/apply-<change>-<capability>.json` 的 `integration_base`
|
|
251
|
+
- 将当前具名分支写入 `"$(cat .sdd-spec-root)/skywalk-sdd/state/apply-<change>-<capability>.json` 的 `integration_base`
|
|
252
252
|
- 若为 detached HEAD,先 `git checkout` 到具名分支再记录
|
|
253
253
|
- simple 模式可省略 `--capability`(默认与 change 相同)
|
|
254
254
|
|
|
@@ -340,7 +340,7 @@ Agent("实现 TASK-03: 创建权限数据模型", ...)
|
|
|
340
340
|
Git 可用时只读统计 SHA/diff;Git 不可用时使用 `vcs_mode=no-git` 和 `base_git_sha=null`:
|
|
341
341
|
|
|
342
342
|
```bash
|
|
343
|
-
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\":<N>,\"files\":[\"<产出文件路径1>\",\"<产出文件路径2>\"],\"added_lines\":<git_diff_numstat_HEAD_取值或0>,\"deleted_lines\":<同左>},\"notes\":\"未自动提交 commit;vcs_mode=readonly 时 added_lines 用只读 git diff --numstat HEAD 取值(不得填 null,工具侧硬校验);vcs_mode=no-git 时可填 null\"}}"
|
|
343
|
+
node "$(cat .sdd-spec-root)/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\":<N>,\"files\":[\"<产出文件路径1>\",\"<产出文件路径2>\"],\"added_lines\":<git_diff_numstat_HEAD_取值或0>,\"deleted_lines\":<同左>},\"notes\":\"未自动提交 commit;vcs_mode=readonly 时 added_lines 用只读 git diff --numstat HEAD 取值(不得填 null,工具侧硬校验);vcs_mode=no-git 时可填 null\"}}"
|
|
344
344
|
```
|
|
345
345
|
|
|
346
346
|
> 该命令亦见上文「📊 Telemetry 命令模板 → ai_adoption_review」。
|
|
@@ -377,7 +377,7 @@ node skywalk-sdd/log.cjs record --type=ai_adoption_review --command=apply --proj
|
|
|
377
377
|
|
|
378
378
|
**执行**(主仓库根目录):
|
|
379
379
|
```bash
|
|
380
|
-
node skywalk-sdd/apply-worktree-finish.cjs \
|
|
380
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/apply-worktree-finish.cjs" \
|
|
381
381
|
--change=<变更名称> \
|
|
382
382
|
--capability=<capability-name>
|
|
383
383
|
```
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
### record-base
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
|
-
node skywalk-sdd/apply-worktree-finish.cjs --record-base \
|
|
75
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/apply-worktree-finish.cjs" --record-base \
|
|
76
76
|
--change=<change> --capability=<capability>
|
|
77
77
|
```
|
|
78
78
|
|
|
@@ -88,10 +88,10 @@ git worktree add .worktrees/apply-<change>-<capability> -b kld-sdd/<change>/<cap
|
|
|
88
88
|
### finish
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
|
-
node skywalk-sdd/apply-worktree-finish.cjs --change=<change> --capability=<capability>
|
|
91
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/apply-worktree-finish.cjs" --change=<change> --capability=<capability>
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
-
状态文件:`skywalk-sdd/state/apply-<change>-<capability>.json`
|
|
94
|
+
状态文件:`"$(cat .sdd-spec-root)/skywalk-sdd/state/apply-<change>-<capability>.json`
|
|
95
95
|
|
|
96
96
|
## 快速参考
|
|
97
97
|
|
|
@@ -21,8 +21,8 @@ allowed-tools:
|
|
|
21
21
|
|
|
22
22
|
> **跨平台执行规则**
|
|
23
23
|
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`),不是 Git 根或工作区根。
|
|
24
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
25
|
-
> -
|
|
24
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
25
|
+
> - Telemetry / ontology:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`(Git 根无 skywalk-sdd/);`spec-root` 可用 `node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root`。
|
|
26
26
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
27
27
|
> - 不要裸写 Windows 反斜杠绝对路径;如必须使用绝对路径,请加引号或改成正斜杠。
|
|
28
28
|
> - 不要省略 `--source=opsx-command` 和 `--session-id=<会话ID>`。
|
|
@@ -53,7 +53,7 @@ openspec list
|
|
|
53
53
|
让用户选择现有变更。确认后记录阶段开始:
|
|
54
54
|
|
|
55
55
|
```bash
|
|
56
|
-
node skywalk-sdd/log.cjs start --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
|
|
56
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
保存 `event_id`。
|
|
@@ -78,12 +78,12 @@ node skywalk-sdd/log.cjs start --command=archive --project=. --change=<变更名
|
|
|
78
78
|
git worktree list
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
应仅剩主工作区;或 telemetry 中存在 `worktree_finish` + `result=success` 事件。若仍有 `.worktrees/apply-*`,先执行 `node skywalk-sdd/apply-worktree-finish.cjs` 或手工清理。
|
|
81
|
+
应仅剩主工作区;或 telemetry 中存在 `worktree_finish` + `result=success` 事件。若仍有 `.worktrees/apply-*`,先执行 `node "$(cat .sdd-spec-root)/skywalk-sdd/apply-worktree-finish.cjs"` 或手工清理。
|
|
82
82
|
|
|
83
83
|
### 3. 运行 telemetry doctor
|
|
84
84
|
|
|
85
85
|
```bash
|
|
86
|
-
node skywalk-sdd/log.cjs doctor --project=. --change=<变更名称>
|
|
86
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" doctor --project=. --change=<变更名称>
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
如果存在 `severe_issues`,暂停归档并说明必须先修复。`superseded_open_stages` 和 `rework_summary` 只作为返工/重复执行展示,不要求用户人工区分测试回滚或真实研发返工。
|
|
@@ -91,7 +91,7 @@ node skywalk-sdd/log.cjs doctor --project=. --change=<变更名称>
|
|
|
91
91
|
### 4. 扫描 tasks 完成状态
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
|
-
node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
|
|
94
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" tasks-status --project=. --change=<变更名称>
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
即使用户选择“变更已完成实施”,未勾选项也不阻断归档。它可能代表任务真实未完成,也可能代表代码已完成但文档未同步;不要猜测,也不要静默忽略。最终必须让 `archive-docs` 将其写入 `archive_result.task_completion` 和报告。
|
|
@@ -105,7 +105,7 @@ node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
|
|
|
105
105
|
执行唯一归档命令:
|
|
106
106
|
|
|
107
107
|
```bash
|
|
108
|
-
node skywalk-sdd/log.cjs archive-docs --project=. --change=<变更名称> --reason="变更已完成实施" --event-id=<event_id> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
|
|
108
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" archive-docs --project=. --change=<变更名称> --reason="变更已完成实施" --event-id=<event_id> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
> `--reason` 默认值为 `变更已完成实施`;如果用户选择了其他归档原因,请将上述 `--reason` 的值替换为对应原因。
|
|
@@ -125,7 +125,7 @@ node skywalk-sdd/log.cjs archive-docs --project=. --change=<变更名称> --reas
|
|
|
125
125
|
归档成功后立即执行(不询问用户):
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
|
-
node skywalk-sdd/ontology/cli.cjs active-change --remove --change=<变更名称> --project=.
|
|
128
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" active-change --remove --change=<变更名称> --project=.
|
|
129
129
|
```
|
|
130
130
|
|
|
131
131
|
把该 change 从 spec 仓 `sdd.config.yaml` 的 `active_changes` 移除,避免已归档 change 继续被代码 commit 写成 `Spec-Change`。该操作幂等;条目本就不存在时不报错。
|
|
@@ -136,12 +136,12 @@ node skywalk-sdd/ontology/cli.cjs active-change --remove --change=<变更名称>
|
|
|
136
136
|
2. 归档 zip 生成后,**加载并执行** **`opsx-kb-ingest`** 上传(勿只口头提示而不走技能流程);成功则写 `ingest-receipt.json`。
|
|
137
137
|
3. 若返回 `EXTERNAL_REF_CONFLICT`,引导回 spec/check 修正后重入,**禁止**在 KB 内现场改绑。
|
|
138
138
|
|
|
139
|
-
> 注意:`archive-docs` 成功执行后已经在内部写入 `stage_end`,因此**不要在成功的归档后再单独运行 `node skywalk-sdd/log.cjs end --command=archive ...`**。仅在第 5 步归档命令失败时,才需要运行下方的失败分支 `end`。
|
|
139
|
+
> 注意:`archive-docs` 成功执行后已经在内部写入 `stage_end`,因此**不要在成功的归档后再单独运行 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" end --command=archive ...`**。仅在第 5 步归档命令失败时,才需要运行下方的失败分支 `end`。
|
|
140
140
|
|
|
141
141
|
如果该命令失败,以失败状态结束 telemetry:
|
|
142
142
|
|
|
143
143
|
```bash
|
|
144
|
-
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="归档失败:<失败原因>"
|
|
144
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" end --event-id=<event_id> --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=failure --summary="归档失败:<失败原因>"
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
失败时不要输出“归档完成”。
|
|
@@ -168,21 +168,21 @@ node skywalk-sdd/log.cjs end --event-id=<event_id> --command=archive --project=.
|
|
|
168
168
|
如用户愿意提供反馈,可补录问卷结果:
|
|
169
169
|
|
|
170
170
|
```bash
|
|
171
|
-
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\":\"\"}}"
|
|
171
|
+
node "$(cat .sdd-spec-root)/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\":\"\"}}"
|
|
172
172
|
```
|
|
173
173
|
|
|
174
174
|
如团队有传统方式工时基线,可补录 baseline:
|
|
175
175
|
|
|
176
176
|
```bash
|
|
177
|
-
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\":\"\"}}"
|
|
177
|
+
node "$(cat .sdd-spec-root)/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\":\"\"}}"
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
---
|
|
181
181
|
|
|
182
182
|
## 本体语义归档门禁
|
|
183
183
|
|
|
184
|
-
- 归档前必须运行 `node skywalk-sdd/log.cjs semantic-reconcile --project=. --change=<变更名称>`,不能只信任文件观察事件。
|
|
185
|
-
- 随后必须运行 `node skywalk-sdd/log.cjs semantic-check --project=. --change=<变更名称>`;有阻断诊断时禁止移动活动 Change。
|
|
184
|
+
- 归档前必须运行 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-reconcile --project=. --change=<变更名称>`,不能只信任文件观察事件。
|
|
185
|
+
- 随后必须运行 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-check --project=. --change=<变更名称>`;有阻断诊断时禁止移动活动 Change。
|
|
186
186
|
- Archive 不负责首次生成 propose/spec/design/tasks 的工作态事实;它重新解析原文核对 pending revision,补充 `OntologySnapshot/project_id/archive_id` 后冻结为 confirmed。
|
|
187
187
|
- `archive-docs` 成功后必须在归档目录生成 `archive-ontology.json`,并将 `review_status` 标记为 `confirmed`。
|
|
188
188
|
- 生产端必须把 confirmed 本体转换为 `canonical-facts.json`;实体固定为 `fact_kind=semantic`、`assertion_type=asserted`、`review_status=confirmed`,关系必须补齐对应语义边界字段。
|
|
@@ -9,8 +9,8 @@ description: "opsx-archive 前后日志/总结自检清单 — 仅在 archive
|
|
|
9
9
|
|
|
10
10
|
## A. 归档前自检
|
|
11
11
|
|
|
12
|
-
- [ ] `node skywalk-sdd/log.cjs doctor --project=. --change=<变更名称>` 无 `severe_issues`(`superseded_open_stages`/`rework_summary` 仅展示,不阻断)
|
|
13
|
-
- [ ] `node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>` 已运行;未勾选项将进入 `archive_result.task_completion`,不阻断归档但必须如实记录
|
|
12
|
+
- [ ] `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" doctor --project=. --change=<变更名称>` 无 `severe_issues`(`superseded_open_stages`/`rework_summary` 仅展示,不阻断)
|
|
13
|
+
- [ ] `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" tasks-status --project=. --change=<变更名称>` 已运行;未勾选项将进入 `archive_result.task_completion`,不阻断归档但必须如实记录
|
|
14
14
|
- [ ] `openspec/changes/<变更名称>/logs/execution-log.md` 各阶段条目齐全:propose/spec/design/task/check/apply/test/archive 的 `stage_start`/`stage_end` 闭环
|
|
15
15
|
- [ ] execution-log 状态标记规范:成功 `✅OK`、部分 `🟡WARN`、失败 `❌FAIL`;未闭环阶段已修复或标记 partial
|
|
16
16
|
- [ ] 无残留 Apply worktree(`git worktree list` 仅主工作区,或 telemetry 存在 `worktree_finish`+success 事件)
|
|
@@ -33,15 +33,15 @@ allowed-tools:
|
|
|
33
33
|
|
|
34
34
|
> **🖥️ 跨平台执行规则**
|
|
35
35
|
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`),不是 Git 根或工作区根。
|
|
36
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
37
|
-
> -
|
|
36
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
37
|
+
> - Telemetry / ontology:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`(Git 根无 skywalk-sdd/);`spec-root` 可用 `node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root`。
|
|
38
38
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
39
39
|
> - ${SHELL_GUIDANCE}
|
|
40
40
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
41
41
|
> **📊 Telemetry(必做,不得跳过)**
|
|
42
|
-
> - 阶段开始:`node skywalk-sdd/log.cjs start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
43
|
-
> - 检查报告生成后,必须先记录结构化检查结果:`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,\"warning_items\":[],\"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},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
|
|
44
|
-
> - `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="摘要"`
|
|
42
|
+
> - 阶段开始:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
43
|
+
> - 检查报告生成后,必须先记录结构化检查结果:`node "$(cat .sdd-spec-root)/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,\"warning_items\":[],\"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},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
|
|
44
|
+
> - `check_result` 记录成功后,才允许阶段结束:`node "$(cat .sdd-spec-root)/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="摘要"`
|
|
45
45
|
> - **【B1 摘要数字校验】** `stage_end --summary` 中的数字(如「N 个场景」「N 层 DAG」「N 个任务」)必须与 `spec.md`/`tasks.md`/`test-scenarios.md` 的实统计交叉校验一致后再填写,不得凭记忆自填。典型失真:summary 写「11 个场景」实际 spec 含 13 条断言、「5 层 DAG」实际 tasks 修复后为 6 层。check 阶段发现不一致时,修正 summary 或补齐文档,使三者数字自洽。
|
|
46
46
|
|
|
47
47
|
---
|
|
@@ -82,10 +82,10 @@ openspec list
|
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
84
|
# 在 spec 仓库:
|
|
85
|
-
node skywalk-sdd/ontology/cli.cjs diagnose-naming --project=. --change=<change-key>
|
|
85
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" diagnose-naming --project=. --change=<change-key>
|
|
86
86
|
|
|
87
87
|
# 在代码仓库:
|
|
88
|
-
node skywalk-sdd/ontology/cli.cjs diagnose-naming --project=. --mode=code-repo
|
|
88
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" diagnose-naming --project=. --mode=code-repo
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
诊断结果三类:
|
|
@@ -122,7 +122,7 @@ node skywalk-sdd/ontology/cli.cjs diagnose-naming --project=. --mode=code-repo
|
|
|
122
122
|
- 若未标记 → 继续检查。
|
|
123
123
|
2. 运行 KB 就绪检查(程序化检测,自动搜索多 IDE 目录,消除路径歧义):
|
|
124
124
|
```bash
|
|
125
|
-
node skywalk-sdd/context-client.cjs --check-only
|
|
125
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" --check-only
|
|
126
126
|
```
|
|
127
127
|
- 输出 `"available": true` → KB 已配置
|
|
128
128
|
- 输出 `"available": false` → KB 未配置
|
|
@@ -207,7 +207,7 @@ node skywalk-sdd/ontology/cli.cjs diagnose-naming --project=. --mode=code-repo
|
|
|
207
207
|
`task` 阶段允许 `tasks.md` 出现未完成项;这只是计划状态。但如果当前变更已经进入 apply 之后,或本次 check 发现实现代码、测试报告、`build_result/test_result/task_update/conformance_review` 等实施证据,必须检查任务勾选状态:
|
|
208
208
|
|
|
209
209
|
```bash
|
|
210
|
-
node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
|
|
210
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" tasks-status --project=. --change=<变更名称>
|
|
211
211
|
```
|
|
212
212
|
|
|
213
213
|
判定规则:
|
|
@@ -250,7 +250,7 @@ node skywalk-sdd/log.cjs tasks-status --project=. --change=<变更名称>
|
|
|
250
250
|
|
|
251
251
|
在终端执行(必须成功):
|
|
252
252
|
```bash
|
|
253
|
-
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,\"warning_items\":[],\"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},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
|
|
253
|
+
node "$(cat .sdd-spec-root)/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,\"warning_items\":[],\"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},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
|
|
254
254
|
```
|
|
255
255
|
|
|
256
256
|
> **⚠️ P1-1 check_result details 不得为空**:`--details-json` 必须含 `consistency_score` / `categories` / `task_completion` 等字段,**禁止传空对象 `{}`**。空 details 会导致 report 的 Q5 跨文档一致性得分、P4b 修复率为 null(工具侧虽有 state fallback 兜底,但事件 details 是主数据源)。
|
|
@@ -259,7 +259,7 @@ node skywalk-sdd/log.cjs record --type=check_result --command=check --project=.
|
|
|
259
259
|
|
|
260
260
|
若当前已有实现代码,并且能够验证 spec 断言,还应记录 `conformance_review`(用于 Q1 规约符合度):
|
|
261
261
|
```bash
|
|
262
|
-
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\",\"agent_confirmed\":true,\"human_status\":\"unverified\",\"reviewer\":\"<reviewer-identifier>\",\"assertions\":[{\"id\":\"ASSERT-001\",\"description\":\"规约中的可验证断言\",\"judge_status\":\"matched\",\"human_status\":\"matched\",\"evidence\":\"代码、测试或文档证据摘要\",\"files\":[],\"notes\":\"\"}]}}"
|
|
262
|
+
node "$(cat .sdd-spec-root)/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\",\"agent_confirmed\":true,\"human_status\":\"unverified\",\"reviewer\":\"<reviewer-identifier>\",\"assertions\":[{\"id\":\"ASSERT-001\",\"description\":\"规约中的可验证断言\",\"judge_status\":\"matched\",\"human_status\":\"matched\",\"evidence\":\"代码、测试或文档证据摘要\",\"files\":[],\"notes\":\"\"}]}}"
|
|
263
263
|
```
|
|
264
264
|
|
|
265
265
|
> **human_status 说明(T3.4)**:`conformance_review.human_status` 标识本次评审是否经真实人工确认:`unverified`(AI 自评,待人工确认,默认)或 `matched`(已由人工评审确认)。**仅当真实人工评审时才填 `matched`**,避免 AI 自评被误标为已确认。报告 Q1 规约符合度会据此标注「自评,待人工确认」。
|
|
@@ -314,8 +314,8 @@ node skywalk-sdd/log.cjs record --type=conformance_review --command=check --proj
|
|
|
314
314
|
在其他质量检查前必须运行:
|
|
315
315
|
|
|
316
316
|
```bash
|
|
317
|
-
node skywalk-sdd/log.cjs semantic-reconcile --project=. --change=<变更名称> --profile=<simple|full|strict>
|
|
318
|
-
node skywalk-sdd/log.cjs semantic-check --project=. --change=<变更名称> --profile=<simple|full|strict>
|
|
317
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-reconcile --project=. --change=<变更名称> --profile=<simple|full|strict>
|
|
318
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-check --project=. --change=<变更名称> --profile=<simple|full|strict>
|
|
319
319
|
```
|
|
320
320
|
|
|
321
321
|
- `simple` 必须阻断 STMT 无 AC;没有 design/tasks 时跳过对应链路,不得误报。
|
|
@@ -31,7 +31,7 @@ allowed-tools:
|
|
|
31
31
|
> 1. 检查 proposal.md frontmatter `kb-status`:若 `degraded(by-user-choice)` → 跳过 KB,仅用本地上下文。
|
|
32
32
|
> 2. 否则运行 KB 就绪检查:
|
|
33
33
|
> ```bash
|
|
34
|
-
> node skywalk-sdd/context-client.cjs --check-only
|
|
34
|
+
> node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" --check-only
|
|
35
35
|
> ```
|
|
36
36
|
> - `"available": true` → 若需查历史设计参考,先 `Read` `opsx-ontology-query/phase-2-during.md` §1
|
|
37
37
|
> - `"available": false` → **KB 不可用不阻塞 design 流程**,仅跳过历史设计参考查询
|
|
@@ -47,8 +47,8 @@ allowed-tools:
|
|
|
47
47
|
|
|
48
48
|
> **🖥️ 跨平台执行规则**
|
|
49
49
|
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`),不是 Git 根或工作区根。
|
|
50
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
51
|
-
> -
|
|
50
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
51
|
+
> - Telemetry / ontology:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`(Git 根无 skywalk-sdd/);`spec-root` 可用 `node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root`。
|
|
52
52
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
53
53
|
> - ${SHELL_GUIDANCE}
|
|
54
54
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
@@ -184,7 +184,7 @@ design.md 中若使用 version 正则约束(如格式校验 `^\d+\.\d+\.\d+$`
|
|
|
184
184
|
- 每个 DES 必须同时写 `entity-id`、`version-id`、`delta-state` 和按需的 `predecessor-version`;新增用 `semantic-identity --delta-state=added`,修改时复用实体 UUID 并生成新版本 UUID。
|
|
185
185
|
- 每个 DES 必须通过 `**realizes**: STMT-*` 显式引用一个或多个真实 STMT。
|
|
186
186
|
- 不得仅凭文本相似创建 realizes;没有上游 STMT 时必须标记 unresolved。
|
|
187
|
-
- 生成结束后必须运行 `node skywalk-sdd/log.cjs semantic-reconcile --project=. --change=<name>`。
|
|
187
|
+
- 生成结束后必须运行 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-reconcile --project=. --change=<name>`。
|
|
188
188
|
- reconcile 必须立即生成 `openspec/changes/<name>/artifacts/.../design.ontology.json`,其中 DES 和 realizes 关系保留原文 source;不得推迟到 check/archive。
|
|
189
189
|
- 阶段 `stage_end` 会在无 Hook 环境下幂等执行同步兜底。
|
|
190
190
|
|
|
@@ -11,8 +11,8 @@ description: opsx-design 的详细模板:telemetry 命令、上下文类型表
|
|
|
11
11
|
|
|
12
12
|
## 📊 Telemetry 命令模板(必做,不得跳过)
|
|
13
13
|
|
|
14
|
-
> 阶段开始:`node skywalk-sdd/log.cjs start --command=design --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
15
|
-
> 阶段结束:`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="摘要"`
|
|
14
|
+
> 阶段开始:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=design --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
15
|
+
> 阶段结束:`node "$(cat .sdd-spec-root)/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="摘要"`
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -17,14 +17,14 @@ allowed-tools:
|
|
|
17
17
|
|
|
18
18
|
> **🖥️ 跨平台执行规则**
|
|
19
19
|
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`),不是 Git 根或工作区根。
|
|
20
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
21
|
-
> -
|
|
20
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
21
|
+
> - Telemetry / ontology:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`(Git 根无 skywalk-sdd/);`spec-root` 可用 `node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root`。
|
|
22
22
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
23
23
|
> - ${SHELL_GUIDANCE}
|
|
24
24
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
25
25
|
> **📊 Telemetry(必做,不得跳过)**
|
|
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="摘要"`
|
|
26
|
+
> - 阶段开始:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=explore --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
27
|
+
> - 阶段结束:`node "$(cat .sdd-spec-root)/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
|
|
|
@@ -44,7 +44,7 @@ allowed-tools:
|
|
|
44
44
|
|
|
45
45
|
优先使用命名协议分组:
|
|
46
46
|
```bash
|
|
47
|
-
node skywalk-sdd/ontology/cli.cjs list-changes --project=.
|
|
47
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" list-changes --project=.
|
|
48
48
|
# 需要结构化数据时加 --json
|
|
49
49
|
```
|
|
50
50
|
|
|
@@ -35,8 +35,8 @@ allowed-tools:
|
|
|
35
35
|
|
|
36
36
|
> **🖥️ 跨平台执行规则**
|
|
37
37
|
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`),不是 Git 根或工作区根。
|
|
38
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
39
|
-
> -
|
|
38
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
39
|
+
> - Telemetry / ontology:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`(Git 根无 skywalk-sdd/);`spec-root` 可用 `node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root`。
|
|
40
40
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
41
41
|
> - ${SHELL_GUIDANCE}
|
|
42
42
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
@@ -70,7 +70,7 @@ allowed-tools:
|
|
|
70
70
|
5. 生成英文短 slug(小写、连字符、建议 ≤48 字符)
|
|
71
71
|
6. 用本地日历日 `YYMMDD` 生成 change-key,并做冲突消解:
|
|
72
72
|
```bash
|
|
73
|
-
node skywalk-sdd/ontology/cli.cjs change-key --generate --module=<code> --slug=<slug> --project=.
|
|
73
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" change-key --generate --module=<code> --slug=<slug> --project=.
|
|
74
74
|
```
|
|
75
75
|
7. 得到:
|
|
76
76
|
- `change-key`:spec 仓目录名 `openspec/changes/<change-key>/`(权威名称;不等于代码分支名)
|
|
@@ -92,7 +92,7 @@ allowed-tools:
|
|
|
92
92
|
|
|
93
93
|
**重要**:未明确需求前不得继续。change-key 必须通过校验,禁止手写不合规目录名:
|
|
94
94
|
```bash
|
|
95
|
-
node skywalk-sdd/ontology/cli.cjs change-key --validate <change-key> --project=.
|
|
95
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" change-key --validate <change-key> --project=.
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
### 2. 【上下文加载】识别并读取用户提供的文件
|
|
@@ -136,7 +136,7 @@ openspec new change "<change-key>"
|
|
|
136
136
|
|
|
137
137
|
**第 4 步:隐式登记活动变更**(创建目录后立即执行,不询问用户):
|
|
138
138
|
```bash
|
|
139
|
-
node skywalk-sdd/ontology/cli.cjs active-change --register --change=<change-key> \
|
|
139
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" active-change --register --change=<change-key> \
|
|
140
140
|
--title="<中文标题>" --module=<code> --summary="<一句话摘要>" --project=.
|
|
141
141
|
```
|
|
142
142
|
|
|
@@ -199,14 +199,14 @@ openspec instructions proposal --change "<name>" --json
|
|
|
199
199
|
1. 收集 REQ 号(含可选 `feature-id`);没有则问一次。
|
|
200
200
|
2. 逐个验号(确定性入口,禁止肉眼判正则):
|
|
201
201
|
```bash
|
|
202
|
-
node skywalk-sdd/ontology/cli.cjs external-key --validate "<REQ-...>" --type requirement
|
|
202
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" external-key --validate "<REQ-...>" --type requirement
|
|
203
203
|
# 若有 feature-id:
|
|
204
|
-
node skywalk-sdd/ontology/cli.cjs external-key --validate "<FEAT-...>" --type feature
|
|
204
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" external-key --validate "<FEAT-...>" --type feature
|
|
205
205
|
```
|
|
206
206
|
- REQ/FEAT 不合规 → **拒绝进入 resolve**,告知「编号不合规,请回需求管理系统核实/换发」;Agent 不得猜测、补位、改写。
|
|
207
207
|
- 用户明确说「没有外部需求号」→ 走 `numbering-waiver.reason`(必填理由);`requirement-refs` 必须为空;提示本轮不种桥。
|
|
208
208
|
3. **先加载依赖技能**:确认 `${AGENT_SKILL_DIR}/opsx-ontology-query/SKILL.md` 存在并 Read;按该技能完成 API Key / 空间与 KB 选择(`../.shared/kb-state.json`,与 `opsx-kb-ingest` 共用)。未安装则停止本步。
|
|
209
|
-
- **KB 就绪检查**:运行 `node skywalk-sdd/context-client.cjs --check-only`,若 `"available": false`,使用 **AskUserQuestion** 询问用户:
|
|
209
|
+
- **KB 就绪检查**:运行 `node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" --check-only`,若 `"available": false`,使用 **AskUserQuestion** 询问用户:
|
|
210
210
|
> "📡 **Engineering KB 未配置**
|
|
211
211
|
> KB 可以提供 Continuity 身份验证和 Capability 复用。是否现在配置?
|
|
212
212
|
> - A. **配置 KB**(加载 opsx-ontology-query 走 Session 启动)
|
|
@@ -217,7 +217,7 @@ node skywalk-sdd/ontology/cli.cjs external-key --validate "<FEAT-...>" --type fe
|
|
|
217
217
|
- **选 C** → 终止 propose。
|
|
218
218
|
4. 验号通过后才 resolve:
|
|
219
219
|
```bash
|
|
220
|
-
node skywalk-sdd/context-client.cjs --mode=resolve \
|
|
220
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" --mode=resolve \
|
|
221
221
|
--external-system=requirement-mgmt \
|
|
222
222
|
--external-object-type=requirement \
|
|
223
223
|
--external-id="<REQ-...>" \
|
|
@@ -315,10 +315,10 @@ Read openspec/changes/archive/*/ontology-identities.json
|
|
|
315
315
|
- 每个新增 Capability 必须写成 `[CAP-<CAPABILITY>] <slug>: <说明>`。
|
|
316
316
|
- 修改既有 Capability 时必须复用已有 CAP ID,不得修改或重新分配已有实体 ID。
|
|
317
317
|
- 分配新 CAP ID 前必须扫描当前 proposal 和归档中的显式编号;不得只凭标题认定跨 Change 同一性。
|
|
318
|
-
- 每个 Change/Capability 同时写人工锚点、`entity-id`、`version-id` 和 `delta-state`。新增时必须调用 `node skywalk-sdd/log.cjs semantic-identity --delta-state=added`,不得手写或复制 UUID。
|
|
318
|
+
- 每个 Change/Capability 同时写人工锚点、`entity-id`、`version-id` 和 `delta-state`。新增时必须调用 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-identity --delta-state=added`,不得手写或复制 UUID。
|
|
319
319
|
- 修改既有 Capability 时调用 `semantic-identity --delta-state=modified --entity-id=<历史实体UUID> --predecessor-version=<直接前序版本UUID>`;复用实体 UUID,但必须生成新版本 UUID。
|
|
320
320
|
- 本阶段只声明 Change 和 Capability,不得提前生成 STMT、AC、DES 或 TASK 事实。
|
|
321
|
-
- proposal.md 写入结束后必须立即运行 `node skywalk-sdd/log.cjs semantic-reconcile --project=. --change=<name>`,生成 `openspec/changes/<name>/artifacts/proposal.ontology.json`;不得等到 check 或 archive 才首次生成 JSON。
|
|
321
|
+
- proposal.md 写入结束后必须立即运行 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-reconcile --project=. --change=<name>`,生成 `openspec/changes/<name>/artifacts/proposal.ontology.json`;不得等到 check 或 archive 才首次生成 JSON。
|
|
322
322
|
- 阶段 `stage_end` 会在无 Hook 环境下幂等执行同一次同步作为兜底,结果中的 `semantic_state.artifact_json_paths` 必须包含 proposal 对应 JSON。
|
|
323
323
|
|
|
324
324
|
## Guardrails
|
|
@@ -11,8 +11,8 @@ description: opsx-propose 的详细模板:telemetry 命令、文档拆分模
|
|
|
11
11
|
|
|
12
12
|
## 📊 Telemetry 命令模板(必做,不得跳过)
|
|
13
13
|
|
|
14
|
-
> 阶段开始:`node skywalk-sdd/log.cjs start --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
15
|
-
> 阶段结束:`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="摘要"`
|
|
14
|
+
> 阶段开始:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=propose --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
15
|
+
> 阶段结束:`node "$(cat .sdd-spec-root)/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="摘要"`
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -19,9 +19,9 @@ allowed-tools:
|
|
|
19
19
|
你是一个 SDD 项目规则生成与维护专家。激活本技能后,你将扫描项目事实,为已部署的 Agent 生成或审查规则文件。
|
|
20
20
|
|
|
21
21
|
> **🖥️ 跨平台执行规则**
|
|
22
|
-
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml
|
|
23
|
-
> -
|
|
24
|
-
> - `
|
|
22
|
+
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`、`skywalk-sdd/`),不是 Git 根。
|
|
23
|
+
> - **CLI 前缀**:Git/工作区根执行时用 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`;**不要**在 Git 根另建 `skywalk-sdd/`。
|
|
24
|
+
> - `openspec`:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`,或先 `cd` 到包裹包再执行。
|
|
25
25
|
> - ${SHELL_GUIDANCE}
|
|
26
26
|
> - **本技能不写入 SkyWalk Telemetry**(与 `opsx-knowledge` 同属辅助技能,不走 `log.cjs start/end`)。
|
|
27
27
|
|
|
@@ -35,8 +35,8 @@ allowed-tools:
|
|
|
35
35
|
|
|
36
36
|
> **🖥️ 跨平台执行规则**
|
|
37
37
|
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`),不是 Git 根或工作区根。
|
|
38
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
39
|
-
> -
|
|
38
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
39
|
+
> - Telemetry / ontology:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`(Git 根无 skywalk-sdd/);`spec-root` 可用 `node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root`。
|
|
40
40
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
41
41
|
> - ${SHELL_GUIDANCE}
|
|
42
42
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
@@ -117,7 +117,7 @@ openspec list
|
|
|
117
117
|
- 若未标记 → 继续检查。
|
|
118
118
|
2. 运行 KB 就绪检查(程序化检测,自动搜索多 IDE 目录,消除路径歧义):
|
|
119
119
|
```bash
|
|
120
|
-
node skywalk-sdd/context-client.cjs --check-only
|
|
120
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" --check-only
|
|
121
121
|
```
|
|
122
122
|
- 输出 `"available": true` → KB 已配置
|
|
123
123
|
- 输出 `"available": false` → KB 未配置
|
|
@@ -148,7 +148,7 @@ openspec list
|
|
|
148
148
|
2. 读取 proposal Continuity。对**当前 Capability** 各调一次(「全部」= 循环 N 次,不是一次大查询)——优先走 **`opsx-ontology-query`** 的 `match-requirement`;薄封装仅作参数拼装:
|
|
149
149
|
|
|
150
150
|
```bash
|
|
151
|
-
node skywalk-sdd/context-client.cjs \
|
|
151
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" \
|
|
152
152
|
--query="<当前 Capability 的自然语言需求>" \
|
|
153
153
|
--target-stage=spec \
|
|
154
154
|
--entity-id="<该 CAP 的 entity_id>" \
|
|
@@ -260,7 +260,7 @@ node skywalk-sdd/context-client.cjs \
|
|
|
260
260
|
- 对 `reuseMode=REFERENCE` 的历史候选必须创建新的实体身份;禁止因为内容相似而复用历史 `entity-id`。
|
|
261
261
|
- 对 `reuseMode=INHERIT` 的历史事实,必须使用返回的实体与版本来源完成 unchanged/modified 身份参数校验。
|
|
262
262
|
- unchanged 内容只写人工锚点、历史实体 UUID、历史版本 UUID 和来源引用,不复制历史原文;调用 `semantic-identity --delta-state=unchanged --entity-id=<UUID> --version-id=<UUID>` 校验复用参数,引用断链时保持 unresolved 并交由 check 阻断。
|
|
263
|
-
- 生成结束后必须运行 `node skywalk-sdd/log.cjs semantic-reconcile --project=. --change=<name>`,根据诊断修复缺号、重号和悬空引用。
|
|
263
|
+
- 生成结束后必须运行 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-reconcile --project=. --change=<name>`,根据诊断修复缺号、重号和悬空引用。
|
|
264
264
|
- reconcile 必须在 change 目录生成 `openspec/changes/<name>/artifacts/spec.ontology.json` 或 `openspec/changes/<name>/artifacts/specs/<capability>/spec.ontology.json`;该 JSON 是 draft 工作事实,不得等待 check/archive 才生成。
|
|
265
265
|
- 阶段 `stage_end` 会在无 Hook 环境下幂等执行同步兜底,并返回 `semantic_state.artifact_json_paths`。
|
|
266
266
|
|
|
@@ -11,8 +11,8 @@ description: opsx-spec 的详细模板:telemetry 命令、上下文类型表
|
|
|
11
11
|
|
|
12
12
|
## 📊 Telemetry 命令模板(必做,不得跳过)
|
|
13
13
|
|
|
14
|
-
> 阶段开始:`node skywalk-sdd/log.cjs start --command=spec --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
15
|
-
> 阶段结束:`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="摘要"`
|
|
14
|
+
> 阶段开始:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=spec --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
15
|
+
> 阶段结束:`node "$(cat .sdd-spec-root)/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="摘要"`
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -32,7 +32,7 @@ allowed-tools:
|
|
|
32
32
|
> 1. 检查 proposal.md frontmatter `kb-status`:若 `degraded(by-user-choice)` → 跳过 KB,仅用本地上下文。
|
|
33
33
|
> 2. 否则运行 KB 就绪检查:
|
|
34
34
|
> ```bash
|
|
35
|
-
> node skywalk-sdd/context-client.cjs --check-only
|
|
35
|
+
> node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" --check-only
|
|
36
36
|
> ```
|
|
37
37
|
> - `"available": true` → 若需查历史任务参考,先 `Read` `opsx-ontology-query/phase-2-during.md` §2
|
|
38
38
|
> - `"available": false` → **KB 不可用不阻塞 task 流程**,仅跳过历史任务追溯参考
|
|
@@ -48,8 +48,8 @@ allowed-tools:
|
|
|
48
48
|
|
|
49
49
|
> **🖥️ 跨平台执行规则**
|
|
50
50
|
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`),不是 Git 根或工作区根。
|
|
51
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
52
|
-
> -
|
|
51
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
52
|
+
> - Telemetry / ontology:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`(Git 根无 skywalk-sdd/);`spec-root` 可用 `node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root`。
|
|
53
53
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
54
54
|
> - ${SHELL_GUIDANCE}
|
|
55
55
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
@@ -236,7 +236,7 @@ Simple 模式或单文件能力域下,**不要拆成多个同文件任务**。
|
|
|
236
236
|
- 每个 TASK 必须同时写 `entity-id`、`version-id` 和 `delta-state`;新增任务调用 `semantic-identity --delta-state=added`,不得复用其他任务 UUID。
|
|
237
237
|
- 每个 TASK 必须写 `**implements**: DES-*` 或 `**covers**: STMT-*`,不得生成无上游来源任务。
|
|
238
238
|
- 任务依赖必须写 `**dependsOn**: TASK-*`;无依赖显式写“无”,所有依赖必须构成 DAG。
|
|
239
|
-
- 生成结束后必须运行 `node skywalk-sdd/log.cjs semantic-reconcile --project=. --change=<name>`。
|
|
239
|
+
- 生成结束后必须运行 `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-reconcile --project=. --change=<name>`。
|
|
240
240
|
- reconcile 必须立即生成 `openspec/changes/<name>/artifacts/.../tasks.ontology.json`,包含 TASK、implements/covers/dependsOn 及原文 source;不得推迟到 check/archive。
|
|
241
241
|
- 阶段 `stage_end` 会在无 Hook 环境下幂等执行同步兜底。
|
|
242
242
|
|
|
@@ -11,8 +11,8 @@ description: opsx-task 的详细模板:telemetry 命令、DAG 生成规则表
|
|
|
11
11
|
|
|
12
12
|
## 📊 Telemetry 命令模板(必做,不得跳过)
|
|
13
13
|
|
|
14
|
-
> 阶段开始:`node skywalk-sdd/log.cjs start --command=task --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
15
|
-
> 阶段结束:`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="摘要"`
|
|
14
|
+
> 阶段开始:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=task --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
15
|
+
> 阶段结束:`node "$(cat .sdd-spec-root)/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="摘要"`
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -123,13 +123,13 @@ description: "opsx-tdd-core 详细参考 — 执行步骤、拆分示例、DAG
|
|
|
123
123
|
**TDD 测试骨架任务**(`task_kind:"test-skeleton"`):
|
|
124
124
|
|
|
125
125
|
```bash
|
|
126
|
-
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> 测试骨架完成(TDD 红灯)" --details-json='{"task_kind":"test-skeleton","test_results":{"command":"<实际测试命令>","passed":0,"failed":<红灯数>,"skipped":0,"duration_ms":0}}'
|
|
126
|
+
node "$(cat .sdd-spec-root)/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> 测试骨架完成(TDD 红灯)" --details-json='{"task_kind":"test-skeleton","test_results":{"command":"<实际测试命令>","passed":0,"failed":<红灯数>,"skipped":0,"duration_ms":0}}'
|
|
127
127
|
```
|
|
128
128
|
|
|
129
129
|
**实现任务**(不带 `task_kind`):
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
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":[],"test_results":{"command":"<实际测试命令>","passed":<通过数>,"failed":0,"skipped":0,"duration_ms":0}}'
|
|
132
|
+
node "$(cat .sdd-spec-root)/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":[],"test_results":{"command":"<实际测试命令>","passed":<通过数>,"failed":0,"skipped":0,"duration_ms":0}}'
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
## §9 单元测试真实执行
|
|
@@ -138,7 +138,7 @@ node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. -
|
|
|
138
138
|
|
|
139
139
|
1. 在结束 apply 或执行收尾之前,必须真实运行单元测试命令
|
|
140
140
|
2. 须留下可核验 telemetry 证据(任选其一):
|
|
141
|
-
- `node skywalk-sdd/log.cjs record --type=test_result ...`(`test_results.command` 非空,且 `passed`/`failed`/`duration_ms` 有实际值)
|
|
141
|
+
- `node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=test_result ...`(`test_results.command` 非空,且 `passed`/`failed`/`duration_ms` 有实际值)
|
|
142
142
|
- `task_update` 的 `details-json` 中 `test_results` 含真实执行数据
|
|
143
143
|
- 或单独运行 `/opsx-test` 并完成 `command=test` 的 `stage_end`
|
|
144
144
|
3. `sdd-apply-test-gate.cjs` 会在 `log.cjs end`、`apply-worktree-finish`、会话 Stop 时自动校验,无证据则阻断
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
当任务是"测试骨架"(仅编写测试用例、实现尚未编写,测试预期失败/红灯)时,`task_update` 必须在 `--details-json` 中带 `"task_kind":"test-skeleton"`,`--result=success`(骨架按 TDD 计划完成即成功),`test_results.failed` 如实记录红灯数。
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
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> 测试骨架完成(TDD 红灯)" --details-json='{"task_kind":"test-skeleton","test_results":{"command":"<实际测试命令>","passed":0,"failed":<红灯数>,"skipped":0,"duration_ms":0}}'
|
|
10
|
+
node "$(cat .sdd-spec-root)/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> 测试骨架完成(TDD 红灯)" --details-json='{"task_kind":"test-skeleton","test_results":{"command":"<实际测试命令>","passed":0,"failed":<红灯数>,"skipped":0,"duration_ms":0}}'
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## 实现任务
|
|
@@ -15,5 +15,5 @@ node skywalk-sdd/log.cjs record --type=task_update --command=apply --project=. -
|
|
|
15
15
|
实现任务不带 `task_kind`(默认 implementation),按真实测试结果记录。
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
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":[],"test_results":{"command":"<实际测试命令>","passed":<通过数>,"failed":0,"skipped":0,"duration_ms":0}}'
|
|
18
|
+
node "$(cat .sdd-spec-root)/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":[],"test_results":{"command":"<实际测试命令>","passed":<通过数>,"failed":0,"skipped":0,"duration_ms":0}}'
|
|
19
19
|
```
|
|
@@ -25,14 +25,14 @@ allowed-tools:
|
|
|
25
25
|
|
|
26
26
|
> **🖥️ 跨平台执行规则**
|
|
27
27
|
> - **SDD 文档根** = `*-sdd-specs` 包裹包(含 `openspec/`、`modules.yaml`),不是 Git 根或工作区根。
|
|
28
|
-
> - `openspec` 命令:优先 `node skywalk-sdd/openspec-shim.cjs list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
29
|
-
> -
|
|
28
|
+
> - `openspec` 命令:优先 `node "$(cat .sdd-spec-root)/skywalk-sdd/openspec-shim.cjs" list`(自动 cd 到包裹包),或先 `cd` 到包裹包再执行。
|
|
29
|
+
> - Telemetry / ontology:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" …`(Git 根无 skywalk-sdd/);`spec-root` 可用 `node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root`。
|
|
30
30
|
> - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
|
|
31
31
|
> - ${SHELL_GUIDANCE}
|
|
32
32
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
33
33
|
> **📊 Telemetry(必做,不得跳过)**
|
|
34
|
-
> - 阶段开始:`node skywalk-sdd/log.cjs start --command=test --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
35
|
-
> - 阶段结束:`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
|
+
> - 阶段开始:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=test --project=. --change=<变更名称> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
35
|
+
> - 阶段结束:`node "$(cat .sdd-spec-root)/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="摘要"`
|
|
36
36
|
|
|
37
37
|
---
|
|
38
38
|
|
|
@@ -108,7 +108,7 @@ allowed-tools:
|
|
|
108
108
|
测试执行完成后,在 stage_end 之前记录 `test_result` 事件:
|
|
109
109
|
|
|
110
110
|
```bash
|
|
111
|
-
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="[passed]/[total] passed" --details-json="{\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":<passed>,\"failed\":<failed>,\"skipped\":<skipped>,\"coverage\":<coverage>,\"duration_ms\":<duration_ms>}}"
|
|
111
|
+
node "$(cat .sdd-spec-root)/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="[passed]/[total] passed" --details-json="{\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":<passed>,\"failed\":<failed>,\"skipped\":<skipped>,\"coverage\":<coverage>,\"duration_ms\":<duration_ms>}}"
|
|
112
112
|
```
|
|
113
113
|
|
|
114
114
|
此事件供 report 的 `test_pass_summary` 采集(M3),确保报告能显示真实测试通过率。
|