kld-sdd 2.6.17 → 2.6.21
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/bin/kld-sdd-init.js +10 -0
- package/kld-sdd-guide.html +22 -0
- package/lib/device-auth-cli.js +130 -0
- package/lib/device-auth.js +345 -0
- package/lib/init-account-binding.js +108 -0
- package/lib/init.js +182 -58
- package/package.json +3 -3
- package/skywalk-sdd/index.cjs +142 -25
- package/skywalk-sdd/lib/shared.cjs +150 -2
- package/skywalk-sdd/lib/usage-contract.cjs +276 -0
- package/skywalk-sdd/lib/usage-reporter.cjs +354 -0
- package/skywalk-sdd/lib/user-config.cjs +157 -0
- package/templates/git-hooks/pre-commit-consistency-check.cjs +271 -116
- package/templates/git-hooks/pre-push-consistency-check.cjs +252 -123
- package/templates/skills/kld-sdd/opsx-check/SKILL.md +1 -1
- package/templates/skills/kld-sdd/opsx-consistency-check/SKILL.md +187 -257
- package/templates/skills/kld-sdd/opsx-consistency-check/reference.md +129 -0
- package/templates/skills/kld-sdd/opsx-kb-config/SKILL.md +27 -6
- package/templates/skills/kld-sdd/opsx-kb-config/reference.md +12 -1
package/lib/init.js
CHANGED
|
@@ -30,11 +30,26 @@ const {
|
|
|
30
30
|
const { deployCodebuddyHookPack } = require('./deploy-codebuddy-hooks');
|
|
31
31
|
const workspaceLayout = require('./workspace-layout');
|
|
32
32
|
const sddConfig = require('../skywalk-sdd/ontology/sdd-config.cjs');
|
|
33
|
+
const { runAccountBinding } = require('./init-account-binding');
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
let rl = null;
|
|
36
|
+
|
|
37
|
+
function getRl() {
|
|
38
|
+
if (!rl) {
|
|
39
|
+
rl = readline.createInterface({
|
|
40
|
+
input: process.stdin,
|
|
41
|
+
output: process.stdout,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return rl;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function closeRl() {
|
|
48
|
+
if (rl) {
|
|
49
|
+
rl.close();
|
|
50
|
+
rl = null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
38
53
|
|
|
39
54
|
// 工具类型配置(路径字段从 TOOL_PROFILES 派生,避免双份漂移)
|
|
40
55
|
const TOOL_CONFIGS = buildToolConfigs();
|
|
@@ -44,10 +59,30 @@ const TOOL_CONFIGS = buildToolConfigs();
|
|
|
44
59
|
*/
|
|
45
60
|
function ask(question) {
|
|
46
61
|
return new Promise(resolve => {
|
|
47
|
-
|
|
62
|
+
getRl().question(question, answer => resolve(answer.trim()));
|
|
48
63
|
});
|
|
49
64
|
}
|
|
50
65
|
|
|
66
|
+
/**
|
|
67
|
+
* 输出详细度判定(惰性读取,便于测试在运行期注入)
|
|
68
|
+
* 触发条件:argv 含 --verbose,或 KLD_SDD_VERBOSE 为 1/true(大小写不敏感)
|
|
69
|
+
* 注意:-v 已被 --version 占用,不复用
|
|
70
|
+
*/
|
|
71
|
+
function isVerbose() {
|
|
72
|
+
if (process.argv.includes('--verbose')) return true;
|
|
73
|
+
const env = process.env.KLD_SDD_VERBOSE;
|
|
74
|
+
return typeof env === 'string' && /^(1|true)$/i.test(env);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* verbose 模式下的明细日志;默认模式静默
|
|
79
|
+
*/
|
|
80
|
+
function vlog(...args) {
|
|
81
|
+
if (isVerbose()) {
|
|
82
|
+
console.log(...args);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
51
86
|
/**
|
|
52
87
|
* 从命令行参数读取指定编辑器
|
|
53
88
|
* 支持:--tool codex、--tool=codex、--tool cursor,codex、--tool all
|
|
@@ -496,7 +531,7 @@ function deployOpsxSkills(selectedTools = Object.keys(TOOL_CONFIGS)) {
|
|
|
496
531
|
|
|
497
532
|
if (fs.existsSync(sourceDir)) {
|
|
498
533
|
copyDirRendered(sourceDir, targetDir, config, toolKey);
|
|
499
|
-
|
|
534
|
+
vlog(` ✓ ${skillDir}/`);
|
|
500
535
|
}
|
|
501
536
|
}
|
|
502
537
|
}
|
|
@@ -706,14 +741,14 @@ function copyTemplatesToProject(cwd = process.cwd()) {
|
|
|
706
741
|
}
|
|
707
742
|
|
|
708
743
|
copyDir(templatePath, targetDir);
|
|
709
|
-
|
|
710
|
-
console.log(`✅ 标准文档模版已复制到: ${targetDir}`);
|
|
711
|
-
console.log(' 包含文件:');
|
|
744
|
+
|
|
712
745
|
const files = fs.readdirSync(targetDir);
|
|
746
|
+
console.log(`✅ 标准文档模版已复制到: ${targetDir}(${files.length} 个文件)`);
|
|
747
|
+
vlog(' 包含文件:');
|
|
713
748
|
files.forEach(file => {
|
|
714
|
-
|
|
749
|
+
vlog(` - ${file}`);
|
|
715
750
|
});
|
|
716
|
-
|
|
751
|
+
|
|
717
752
|
return true;
|
|
718
753
|
}
|
|
719
754
|
|
|
@@ -803,13 +838,15 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
803
838
|
// 创建本地数据目录(事件和活跃状态存储;报告落 change 子目录,不在此创建)
|
|
804
839
|
const eventsDir = path.join(dataDir, 'events');
|
|
805
840
|
const stateDir = path.join(dataDir, 'state');
|
|
841
|
+
// 成功部署的模块计数(用于默认模式单行摘要)
|
|
842
|
+
let deployedModules = 0;
|
|
806
843
|
if (!fs.existsSync(eventsDir)) {
|
|
807
844
|
fs.mkdirSync(eventsDir, { recursive: true });
|
|
808
|
-
|
|
845
|
+
vlog(' ✓ 创建 skywalk-sdd/events/ 数据目录');
|
|
809
846
|
}
|
|
810
847
|
if (!fs.existsSync(stateDir)) {
|
|
811
848
|
fs.mkdirSync(stateDir, { recursive: true });
|
|
812
|
-
|
|
849
|
+
vlog(' ✓ 创建 skywalk-sdd/state/ 活跃阶段状态目录');
|
|
813
850
|
}
|
|
814
851
|
|
|
815
852
|
// 部署项目内 Telemetry CLI(不依赖 npm 发布)
|
|
@@ -817,7 +854,8 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
817
854
|
const telemetryDst = path.join(dataDir, 'log.cjs');
|
|
818
855
|
if (fs.existsSync(telemetrySrc)) {
|
|
819
856
|
fs.copyFileSync(telemetrySrc, telemetryDst);
|
|
820
|
-
|
|
857
|
+
deployedModules += 1;
|
|
858
|
+
vlog(' ✓ 部署 skywalk-sdd/log.cjs(本地 Telemetry CLI)');
|
|
821
859
|
} else {
|
|
822
860
|
console.log(` ⚠️ Telemetry CLI 源文件缺失: ${telemetrySrc}`);
|
|
823
861
|
}
|
|
@@ -826,7 +864,8 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
826
864
|
const metricsV3Dst = path.join(dataDir, 'metrics-v3.cjs');
|
|
827
865
|
if (fs.existsSync(metricsV3Src)) {
|
|
828
866
|
fs.copyFileSync(metricsV3Src, metricsV3Dst);
|
|
829
|
-
|
|
867
|
+
deployedModules += 1;
|
|
868
|
+
vlog(' ✓ 部署 skywalk-sdd/metrics-v3.cjs(V3 指标运行时)');
|
|
830
869
|
} else {
|
|
831
870
|
console.log(` ⚠️ V3 指标模块源文件缺失: ${metricsV3Src}(report/metrics 可能无法加载 metrics-v3)`);
|
|
832
871
|
}
|
|
@@ -836,7 +875,8 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
836
875
|
const specRootDst = path.join(dataDir, 'spec-root.cjs');
|
|
837
876
|
if (fs.existsSync(specRootSrc)) {
|
|
838
877
|
fs.copyFileSync(specRootSrc, specRootDst);
|
|
839
|
-
|
|
878
|
+
deployedModules += 1;
|
|
879
|
+
vlog(' ✓ 部署 skywalk-sdd/spec-root.cjs(CWD 无关的 spec 根路径解析器)');
|
|
840
880
|
} else {
|
|
841
881
|
console.log(' ⚠️ spec-root.cjs 源文件缺失,$(cat .sdd-spec-root) 模式可能受影响');
|
|
842
882
|
}
|
|
@@ -850,11 +890,32 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
850
890
|
const sharedDst = path.join(sharedLibDir, 'shared.cjs');
|
|
851
891
|
if (fs.existsSync(sharedSrc)) {
|
|
852
892
|
fs.copyFileSync(sharedSrc, sharedDst);
|
|
853
|
-
|
|
893
|
+
deployedModules += 1;
|
|
894
|
+
vlog(' ✓ 部署 skywalk-sdd/lib/shared.cjs(共用工具:parseArgs/JSON/BOM/HTTP/specRoot/KB)');
|
|
854
895
|
} else {
|
|
855
896
|
console.log(' ⚠️ lib/shared.cjs 源文件缺失,多个脚本将缺少共用工具依赖');
|
|
856
897
|
}
|
|
857
898
|
|
|
899
|
+
// kld-fixback: 部署使用统计上报模块(usage-contract/usage-reporter/user-config)
|
|
900
|
+
// 这些模块被部署后的 skywalk-sdd/log.cjs(即 index.cjs 副本)在 cmdStart 中 require,
|
|
901
|
+
// 缺失时会上报静默失效。三件套必须同时部署,路径与 npm 包内布局一致。
|
|
902
|
+
const usageModules = [
|
|
903
|
+
{ src: 'usage-contract.cjs', desc: '使用统计契约(七值/Device/ApiResponse/HTTP)' },
|
|
904
|
+
{ src: 'usage-reporter.cjs', desc: '使用事件上报器(3s deadline + pending 队列)' },
|
|
905
|
+
{ src: 'user-config.cjs', desc: '用户级配置(~/.kld-sdd/config.json + cli_token)' },
|
|
906
|
+
];
|
|
907
|
+
for (const mod of usageModules) {
|
|
908
|
+
const src = path.join(pkgPath, 'skywalk-sdd', 'lib', mod.src);
|
|
909
|
+
const dst = path.join(sharedLibDir, mod.src);
|
|
910
|
+
if (fs.existsSync(src)) {
|
|
911
|
+
fs.copyFileSync(src, dst);
|
|
912
|
+
deployedModules += 1;
|
|
913
|
+
vlog(` ✓ 部署 skywalk-sdd/lib/${mod.src}(${mod.desc})`);
|
|
914
|
+
} else {
|
|
915
|
+
console.log(` ⚠️ ${mod.src} 源文件缺失,使用统计上报将不可用`);
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
|
|
858
919
|
const packageVersion = require(path.join(pkgPath, 'package.json')).version;
|
|
859
920
|
const runtimeMetadataDst = path.join(dataDir, 'runtime-metadata.cjs');
|
|
860
921
|
fs.writeFileSync(
|
|
@@ -862,13 +923,15 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
862
923
|
`'use strict';\nmodule.exports = { resolveRuntimeMetadata() { return { version: '${packageVersion}', producer: 'kld-sdd@${packageVersion}' }; } };\n`,
|
|
863
924
|
'utf8',
|
|
864
925
|
);
|
|
865
|
-
|
|
926
|
+
deployedModules += 1;
|
|
927
|
+
vlog(` ✓ 部署 kld-sdd 运行时身份(${packageVersion})`);
|
|
866
928
|
|
|
867
929
|
const reportingSrc = path.join(pkgPath, 'skywalk-sdd', 'reporting');
|
|
868
930
|
const reportingDst = path.join(dataDir, 'reporting');
|
|
869
931
|
if (fs.existsSync(reportingSrc)) {
|
|
870
932
|
copyDir(reportingSrc, reportingDst);
|
|
871
|
-
|
|
933
|
+
deployedModules += 1;
|
|
934
|
+
vlog(' ✓ 部署 skywalk-sdd/reporting/(V3 单次变更报告)');
|
|
872
935
|
} else {
|
|
873
936
|
throw new Error(`E_INIT_MISSING_CRITICAL: reporting/ 目录缺失: ${reportingSrc}(归档报告生成将失败)`);
|
|
874
937
|
}
|
|
@@ -877,7 +940,8 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
877
940
|
const contextClientDst = path.join(dataDir, 'context-client.cjs');
|
|
878
941
|
if (fs.existsSync(contextClientSrc)) {
|
|
879
942
|
fs.copyFileSync(contextClientSrc, contextClientDst);
|
|
880
|
-
|
|
943
|
+
deployedModules += 1;
|
|
944
|
+
vlog(' ✓ 部署 skywalk-sdd/context-client.cjs(工程 Spec 上下文客户端)');
|
|
881
945
|
} else {
|
|
882
946
|
console.log(` ⚠️ 工程 Spec 上下文客户端缺失: ${contextClientSrc}`);
|
|
883
947
|
}
|
|
@@ -886,7 +950,8 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
886
950
|
const ontologyDst = path.join(dataDir, 'ontology');
|
|
887
951
|
if (fs.existsSync(ontologySrc)) {
|
|
888
952
|
copyDir(ontologySrc, ontologyDst);
|
|
889
|
-
|
|
953
|
+
deployedModules += 1;
|
|
954
|
+
vlog(' ✓ 部署 skywalk-sdd/ontology/(本地本体语义运行时)');
|
|
890
955
|
} else {
|
|
891
956
|
console.log(` ⚠️ 本体语义运行时缺失: ${ontologySrc}`);
|
|
892
957
|
}
|
|
@@ -895,7 +960,8 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
895
960
|
const worktreeFinishDst = path.join(dataDir, 'apply-worktree-finish.cjs');
|
|
896
961
|
if (fs.existsSync(worktreeFinishSrc)) {
|
|
897
962
|
fs.copyFileSync(worktreeFinishSrc, worktreeFinishDst);
|
|
898
|
-
|
|
963
|
+
deployedModules += 1;
|
|
964
|
+
vlog(' ✓ 部署 skywalk-sdd/apply-worktree-finish.cjs(Apply 收尾脚本)');
|
|
899
965
|
} else {
|
|
900
966
|
console.log(' ⚠️ apply-worktree-finish.cjs 源文件缺失,Apply 阶段收尾需要手动执行');
|
|
901
967
|
}
|
|
@@ -904,7 +970,8 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
904
970
|
const openspecShimDst = path.join(dataDir, 'openspec-shim.cjs');
|
|
905
971
|
if (fs.existsSync(openspecShimSrc)) {
|
|
906
972
|
fs.copyFileSync(openspecShimSrc, openspecShimDst);
|
|
907
|
-
|
|
973
|
+
deployedModules += 1;
|
|
974
|
+
vlog(' ✓ 部署 skywalk-sdd/openspec-shim.cjs(openspec 包裹包路径 shim)');
|
|
908
975
|
} else {
|
|
909
976
|
console.log(' ⚠️ openspec-shim.cjs 源文件缺失,openspec 命令需要手动 cd 到 spec 包执行');
|
|
910
977
|
}
|
|
@@ -914,7 +981,8 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
914
981
|
const kbUploadDst = path.join(dataDir, 'kb-upload.cjs');
|
|
915
982
|
if (fs.existsSync(kbUploadSrc)) {
|
|
916
983
|
fs.copyFileSync(kbUploadSrc, kbUploadDst);
|
|
917
|
-
|
|
984
|
+
deployedModules += 1;
|
|
985
|
+
vlog(' ✓ 部署 skywalk-sdd/kb-upload.cjs(知识库上传:文件夹/zip 双模式)');
|
|
918
986
|
} else {
|
|
919
987
|
console.log(' ⚠️ kb-upload.cjs 源文件缺失,随时入库功能不可用');
|
|
920
988
|
}
|
|
@@ -924,16 +992,18 @@ function deployTelemetryDataDir(targetCwd = process.cwd()) {
|
|
|
924
992
|
const kbSyncIdentityDst = path.join(dataDir, 'kb-sync-identity.cjs');
|
|
925
993
|
if (fs.existsSync(kbSyncIdentitySrc)) {
|
|
926
994
|
fs.copyFileSync(kbSyncIdentitySrc, kbSyncIdentityDst);
|
|
927
|
-
|
|
995
|
+
deployedModules += 1;
|
|
996
|
+
vlog(' ✓ 部署 skywalk-sdd/kb-sync-identity.cjs(KB 身份同步:重新入库前同步 version-id)');
|
|
928
997
|
} else {
|
|
929
998
|
console.log(' ⚠️ kb-sync-identity.cjs 源文件缺失,重新入库身份同步不可用');
|
|
930
999
|
}
|
|
931
1000
|
|
|
932
|
-
console.log(
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
1001
|
+
console.log(` ✓ 部署 skywalk-sdd/ 运行时(events/state 数据目录 + ${deployedModules} 个模块)`);
|
|
1002
|
+
vlog(' ✓ 调用方式: node skywalk-sdd/log.cjs start|end|metrics|semantic-identity|semantic-reconcile|semantic-check');
|
|
1003
|
+
vlog(' ✓ openspec: node skywalk-sdd/openspec-shim.cjs list(自动 cd 到 *-sdd-specs)');
|
|
1004
|
+
vlog(' ✓ Spec Context: node skywalk-sdd/context-client.cjs --query="<自然语言需求>" --target-stage=spec');
|
|
1005
|
+
vlog(' ✓ Apply worktree: record-base 在 §1.5;收尾 apply-worktree-finish.cjs --change=<name>');
|
|
1006
|
+
vlog(' ℹ️ project-identity.json 将在首次配置 KB(opsx-kb-config)时自动创建');
|
|
937
1007
|
console.log('✅ Telemetry 已就绪(数据存储在 skywalk-sdd/,无需配置 MCP)');
|
|
938
1008
|
return true;
|
|
939
1009
|
}
|
|
@@ -1408,10 +1478,11 @@ function detectTools() {
|
|
|
1408
1478
|
|
|
1409
1479
|
/**
|
|
1410
1480
|
* 创建 / 更新 .gitignore
|
|
1481
|
+
* @param {string} [cwd=process.cwd()]
|
|
1411
1482
|
*/
|
|
1412
|
-
function updateGitignore() {
|
|
1413
|
-
const
|
|
1414
|
-
const gitignorePath = path.join(
|
|
1483
|
+
function updateGitignore(cwd = process.cwd()) {
|
|
1484
|
+
const root = path.resolve(cwd);
|
|
1485
|
+
const gitignorePath = path.join(root, '.gitignore');
|
|
1415
1486
|
const requiredLines = [
|
|
1416
1487
|
'.cursor/commands/personal-*',
|
|
1417
1488
|
'.claude/commands/personal-*',
|
|
@@ -1420,6 +1491,10 @@ function updateGitignore() {
|
|
|
1420
1491
|
'.kunlunzhima/commands/personal-*',
|
|
1421
1492
|
'.workbuddy/commands/personal-*',
|
|
1422
1493
|
'.agents/commands/personal-*',
|
|
1494
|
+
'kb-state.json',
|
|
1495
|
+
'**/kb-state.json',
|
|
1496
|
+
'skywalk-sdd/kb-state.json',
|
|
1497
|
+
'**/skywalk-sdd/kb-state.json',
|
|
1423
1498
|
'skywalk-sdd/events/',
|
|
1424
1499
|
'skywalk-sdd/state/',
|
|
1425
1500
|
'**/skywalk-sdd/events/',
|
|
@@ -1437,6 +1512,12 @@ function updateGitignore() {
|
|
|
1437
1512
|
.workbuddy/commands/personal-*
|
|
1438
1513
|
.agents/commands/personal-*
|
|
1439
1514
|
|
|
1515
|
+
# KB 绑定状态(含 API Key,勿提交)
|
|
1516
|
+
kb-state.json
|
|
1517
|
+
**/kb-state.json
|
|
1518
|
+
skywalk-sdd/kb-state.json
|
|
1519
|
+
**/skywalk-sdd/kb-state.json
|
|
1520
|
+
|
|
1440
1521
|
# SDD Telemetry 数据(实体在 *-sdd-specs/skywalk-sdd/;工作区可能是 symlink)
|
|
1441
1522
|
skywalk-sdd/events/
|
|
1442
1523
|
skywalk-sdd/state/
|
|
@@ -1465,6 +1546,20 @@ skywalk-sdd/state/
|
|
|
1465
1546
|
}
|
|
1466
1547
|
}
|
|
1467
1548
|
|
|
1549
|
+
/**
|
|
1550
|
+
* B1 汇总块绑定文案:已绑定显示用户,未绑定引导 auth login;不出现“使用统计”字样
|
|
1551
|
+
*/
|
|
1552
|
+
function formatBindingSummaryLine(bindingResult) {
|
|
1553
|
+
if (
|
|
1554
|
+
bindingResult
|
|
1555
|
+
&& (bindingResult.status === 'bound' || bindingResult.status === 'kept')
|
|
1556
|
+
&& bindingResult.userName
|
|
1557
|
+
) {
|
|
1558
|
+
return ` ✓ 平台账号已绑定:${bindingResult.userName}`;
|
|
1559
|
+
}
|
|
1560
|
+
return ' 6. 绑定平台账号:npx kld-sdd auth login';
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1468
1563
|
/**
|
|
1469
1564
|
* 显示帮助信息
|
|
1470
1565
|
*/
|
|
@@ -1480,6 +1575,7 @@ KLD SDD 项目初始化工具
|
|
|
1480
1575
|
选项:
|
|
1481
1576
|
-h, --help 显示帮助信息
|
|
1482
1577
|
-v, --version 显示版本号
|
|
1578
|
+
--verbose 输出每个安装文件/目录的明细日志(默认仅摘要,亦可用 KLD_SDD_VERBOSE=1)
|
|
1483
1579
|
--skip-openspec 跳过 openspec init 步骤
|
|
1484
1580
|
--skip-template 跳过复制内置模版
|
|
1485
1581
|
--tool <name> 指定编辑器,可用值: cursor, claude, codebuddy, qoder, opencode, kunlunzhima, workbuddy, codex, all
|
|
@@ -1548,14 +1644,14 @@ async function main() {
|
|
|
1548
1644
|
// 解析参数
|
|
1549
1645
|
if (args.includes('-h') || args.includes('--help')) {
|
|
1550
1646
|
showHelp();
|
|
1551
|
-
|
|
1647
|
+
closeRl();
|
|
1552
1648
|
return;
|
|
1553
1649
|
}
|
|
1554
1650
|
|
|
1555
1651
|
if (args.includes('-v') || args.includes('--version')) {
|
|
1556
1652
|
const pkg = require('../package.json');
|
|
1557
1653
|
console.log(pkg.version);
|
|
1558
|
-
|
|
1654
|
+
closeRl();
|
|
1559
1655
|
return;
|
|
1560
1656
|
}
|
|
1561
1657
|
|
|
@@ -1574,7 +1670,7 @@ async function main() {
|
|
|
1574
1670
|
selectedTools = parseSelectedTools(args) || await selectEditor();
|
|
1575
1671
|
} catch (error) {
|
|
1576
1672
|
console.error(`❌ ${error.message}`);
|
|
1577
|
-
|
|
1673
|
+
closeRl();
|
|
1578
1674
|
process.exit(1);
|
|
1579
1675
|
}
|
|
1580
1676
|
|
|
@@ -1694,7 +1790,7 @@ async function main() {
|
|
|
1694
1790
|
}
|
|
1695
1791
|
|
|
1696
1792
|
// 7. 更新工作目录 .gitignore
|
|
1697
|
-
updateGitignore();
|
|
1793
|
+
updateGitignore(workspaceRoot);
|
|
1698
1794
|
|
|
1699
1795
|
// 8. 收尾:无论前面是否走过 symlink/旧副本路径,强制清掉工作区/Git 根多余 skywalk-sdd/
|
|
1700
1796
|
if (specPackage && fs.existsSync(specPackage.abs)) {
|
|
@@ -1702,6 +1798,23 @@ async function main() {
|
|
|
1702
1798
|
}
|
|
1703
1799
|
removeOuterSkywalk(workspaceRoot);
|
|
1704
1800
|
|
|
1801
|
+
// 9. B1 账号绑定向导(部署完成后、最终汇总前;--skip-auth/非 TTY 自动跳过;失败不阻塞 init)
|
|
1802
|
+
const bindingController = new AbortController();
|
|
1803
|
+
const onBindingSigint = () => bindingController.abort();
|
|
1804
|
+
process.on('SIGINT', onBindingSigint);
|
|
1805
|
+
let bindingResult = null;
|
|
1806
|
+
try {
|
|
1807
|
+
bindingResult = await runAccountBinding({
|
|
1808
|
+
ask,
|
|
1809
|
+
skipAuth: args.includes('--skip-auth'),
|
|
1810
|
+
signal: bindingController.signal,
|
|
1811
|
+
});
|
|
1812
|
+
} catch (error) {
|
|
1813
|
+
console.log(`⚠️ 账号绑定向导异常(${error && error.message ? error.message : error}),已跳过`);
|
|
1814
|
+
} finally {
|
|
1815
|
+
process.removeListener('SIGINT', onBindingSigint);
|
|
1816
|
+
}
|
|
1817
|
+
|
|
1705
1818
|
const selectedNames = selectedTools.map(t => TOOL_CONFIGS[t].name).join(', ');
|
|
1706
1819
|
|
|
1707
1820
|
console.log();
|
|
@@ -1750,23 +1863,23 @@ async function main() {
|
|
|
1750
1863
|
}
|
|
1751
1864
|
console.log();
|
|
1752
1865
|
|
|
1753
|
-
// 统一的 skill
|
|
1754
|
-
console.log('可用 skills
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1866
|
+
// 统一的 skill 格式说明(默认单行指引,完整列表走 --verbose)
|
|
1867
|
+
console.log('可用 skills:opsx-* 系列 15 个 SDD skills(--verbose 查看完整列表,或见 openspec/kld-sdd操作手册.html)');
|
|
1868
|
+
vlog(' opsx-propose - 创建业务意图文档(Why)');
|
|
1869
|
+
vlog(' opsx-spec - 创建技术契约文档(What)');
|
|
1870
|
+
vlog(' opsx-design - 创建技术实现方案(How)');
|
|
1871
|
+
vlog(' opsx-task - 拆解AI编码任务(Do)');
|
|
1872
|
+
vlog(' opsx-check - 质量门禁检查(Verify)');
|
|
1873
|
+
vlog(' opsx-apply - 申请变更实施(Apply)');
|
|
1874
|
+
vlog(' opsx-test - 执行单元测试(Test)');
|
|
1875
|
+
vlog(' opsx-archive - 归档变更(Archive)');
|
|
1876
|
+
vlog(' opsx-explore - 浏览变更状态(Explore)');
|
|
1877
|
+
vlog(' opsx-knowledge - 业务知识库检索(辅助)');
|
|
1878
|
+
vlog(' opsx-rules - 生成/更新 Agent 规则(辅助)');
|
|
1879
|
+
vlog(' opsx-consistency-check - Spec 一致性校验(代码 vs spec)');
|
|
1880
|
+
vlog(' opsx-kb-config - 知识库配置(API Key + Space/KB 选择)');
|
|
1881
|
+
vlog(' opsx-ontology-query - 本体知识库查询');
|
|
1882
|
+
vlog(' opsx-kb-ingest - 知识库入库(zip / 文件夹上传)');
|
|
1770
1883
|
|
|
1771
1884
|
console.log();
|
|
1772
1885
|
console.log('后续步骤:');
|
|
@@ -1781,14 +1894,16 @@ async function main() {
|
|
|
1781
1894
|
console.log(' 4. 激活 opsx-apply 申请实施,opsx-archive 归档完成');
|
|
1782
1895
|
console.log(' 5. 随时入库:node skywalk-sdd/kb-upload.cjs --folder=<变更目录> --minimum-level=propose-spec');
|
|
1783
1896
|
console.log(' (需先运行 /opsx-kb-config 配置知识库)');
|
|
1897
|
+
// B1: 汇总块绑定文案(不出现“使用统计”字样)
|
|
1898
|
+
console.log(formatBindingSummaryLine(bindingResult));
|
|
1784
1899
|
if (selectedTools.includes('codebuddy')) {
|
|
1785
|
-
console.log('
|
|
1900
|
+
console.log(' - CodeBuddy 用户:SDD Hook Pack 已随初始化自动部署,门禁自动生效,无需手动配置');
|
|
1786
1901
|
}
|
|
1787
1902
|
if (selectedTools.includes('kunlunzhima')) {
|
|
1788
|
-
console.log('
|
|
1903
|
+
console.log(' - KunlunZhima 用户:在 Craft 模式使用 /opsx:propose 等 OPSX 命令(.kunlunzhima/commands/opsx/)');
|
|
1789
1904
|
}
|
|
1790
1905
|
if (selectedTools.includes('opencode')) {
|
|
1791
|
-
console.log('
|
|
1906
|
+
console.log(' - OpenCode 用户:用 /opsx-propose 或 /skills 启动 SDD(.opencode/skills/opsx-*/,skill 即斜杠命令)');
|
|
1792
1907
|
}
|
|
1793
1908
|
console.log();
|
|
1794
1909
|
console.log('📊 SDD Telemetry(嵌入在 skill 流程中,自动执行,无需配置):');
|
|
@@ -1800,16 +1915,24 @@ async function main() {
|
|
|
1800
1915
|
console.log(' - 运行 node skywalk-sdd/log.cjs metrics --project=<包裹包> 查看四维度指标');
|
|
1801
1916
|
console.log();
|
|
1802
1917
|
|
|
1803
|
-
|
|
1918
|
+
closeRl();
|
|
1804
1919
|
}
|
|
1805
1920
|
|
|
1921
|
+
// kld-T06: Progress Runtime 已删除,用户级 workspace 注册函数一并移除。
|
|
1922
|
+
// 用户级 Device Flow 绑定由 lib/device-auth.js + skywalk-sdd/lib/user-config.cjs 负责,
|
|
1923
|
+
// 通过 `kld-sdd auth login` 显式触发。
|
|
1924
|
+
|
|
1806
1925
|
module.exports = {
|
|
1807
1926
|
main,
|
|
1808
1927
|
detectTools,
|
|
1809
1928
|
getTemplatePath,
|
|
1810
1929
|
getPackagePath,
|
|
1811
1930
|
selectEditor,
|
|
1931
|
+
isVerbose,
|
|
1932
|
+
vlog,
|
|
1933
|
+
formatBindingSummaryLine,
|
|
1812
1934
|
deployOpsxSkills,
|
|
1935
|
+
copyTemplatesToProject,
|
|
1813
1936
|
deployProfileArtifacts,
|
|
1814
1937
|
deploySddGuideManual,
|
|
1815
1938
|
deployModulesYaml,
|
|
@@ -1821,6 +1944,7 @@ module.exports = {
|
|
|
1821
1944
|
removeOuterSkywalk,
|
|
1822
1945
|
deployQualityGateTemplates,
|
|
1823
1946
|
deployTelemetryDataDir,
|
|
1947
|
+
updateGitignore,
|
|
1824
1948
|
attachCodeRepoLite,
|
|
1825
1949
|
syncWorkspaceRepos,
|
|
1826
1950
|
copyDirRendered,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kld-sdd",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.21",
|
|
4
4
|
"description": "KLD SDD OpenSpec 项目初始化工具 - 一键部署 SDD skills",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"kld-sdd-init": "bin/kld-sdd-init.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"test": "node test/external-key.cjs && node test/change-key.cjs && node test/modules-and-sdd-config.cjs && node test/active-changes.cjs && node test/hook-layouts.cjs && node test/spec-package-init.cjs && node test/workspace-layout.cjs && node test/ontology-release-blockers.cjs && node test/ontology-semantic-core.cjs && node test/ontology-identity-versioning.cjs && node test/ontology-identity-continuity.cjs && node test/ontology-state-transaction.cjs && node test/ontology-process-concurrency.cjs && node test/ontology-observer-convergence.cjs && node test/ontology-working-runtime.cjs && node test/ontology-stage-materialization.cjs && node test/ontology-template-contract.cjs && node test/ontology-cli-archive.cjs && node test/archive-package-producer.cjs && node --test test/evidence-integrity-oracle.cjs test/evidence-integrity-wiring.cjs test/change-report-correctness.cjs test/report-metrics-correctness.cjs test/change-report-model-ui.cjs && node test/validate-skills-bundle.cjs && node test/tool-profiles.cjs && node test/settings-merge.cjs && node test/command-bridge.cjs && node test/codebuddy-hooks.cjs && node test/skill-content-contract.cjs && node test/init-agent-profiles.cjs && node test/init-report-runtime.cjs"
|
|
11
|
+
"test": "node test/external-key.cjs && node test/change-key.cjs && node test/modules-and-sdd-config.cjs && node test/active-changes.cjs && node test/hook-layouts.cjs && node test/spec-package-init.cjs && node test/workspace-layout.cjs && node test/ontology-release-blockers.cjs && node test/ontology-semantic-core.cjs && node test/ontology-identity-versioning.cjs && node test/ontology-identity-continuity.cjs && node test/ontology-state-transaction.cjs && node test/ontology-process-concurrency.cjs && node test/ontology-observer-convergence.cjs && node test/ontology-working-runtime.cjs && node test/ontology-stage-materialization.cjs && node test/ontology-template-contract.cjs && node test/ontology-cli-archive.cjs && node test/archive-package-producer.cjs && node --test test/evidence-integrity-oracle.cjs test/evidence-integrity-wiring.cjs test/change-report-correctness.cjs test/report-metrics-correctness.cjs test/change-report-model-ui.cjs && node test/validate-skills-bundle.cjs && node test/tool-profiles.cjs && node test/settings-merge.cjs && node test/command-bridge.cjs && node test/codebuddy-hooks.cjs && node test/skill-content-contract.cjs && node test/init-agent-profiles.cjs && node test/init-report-runtime.cjs && node test/init-output-verbosity.cjs && node test/init-account-binding.cjs && node --test test/usage-contract.test.cjs test/user-config.test.cjs test/device-auth.test.cjs test/usage-runtime-removal.test.cjs skywalk-sdd/usage-reporter.test.cjs skywalk-sdd/usage-reporting.test.cjs && node test/progress-package-artifact.test.cjs"
|
|
12
12
|
},
|
|
13
13
|
"keywords": [
|
|
14
14
|
"kld",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"author": "KLD Team",
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"engines": {
|
|
27
|
-
"node": ">=14.
|
|
27
|
+
"node": ">=14.18.0"
|
|
28
28
|
},
|
|
29
29
|
"files": [
|
|
30
30
|
"bin/",
|