speccore 8.3.333 → 8.3.341
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/.agents/skills/spec-ask/SKILL.md +4 -0
- package/.agents/skills/spec-unitize/SKILL.md +9 -1
- package/.agents/skills/speccore-router/SKILL.md +12 -11
- package/README.en.md +3 -11
- package/README.md +3 -13
- package/dist/cli.js +64 -206
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +530 -481
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +6 -0
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +9 -7
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/doc2spec.d.ts +44 -1
- package/dist/commands/doc2spec.d.ts.map +1 -1
- package/dist/commands/doc2spec.js +257 -5
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/done.js +1 -5
- package/dist/commands/done.js.map +1 -1
- package/dist/commands/execute.js +118 -66
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/help.js +6 -54
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +71 -47
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/create.d.ts.map +1 -1
- package/dist/commands/iteration/create.js +72 -10
- package/dist/commands/iteration/create.js.map +1 -1
- package/dist/commands/iteration/taskify.d.ts.map +1 -1
- package/dist/commands/iteration/taskify.js +133 -35
- package/dist/commands/iteration/taskify.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +24 -2
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/prompts.d.ts +6 -0
- package/dist/commands/prompts.d.ts.map +1 -1
- package/dist/commands/prompts.js +19 -10
- package/dist/commands/prompts.js.map +1 -1
- package/dist/commands/search.js +1 -1
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/status-panel.d.ts.map +1 -1
- package/dist/commands/status-panel.js +23 -34
- package/dist/commands/status-panel.js.map +1 -1
- package/dist/commands/unitize.d.ts +3 -0
- package/dist/commands/unitize.d.ts.map +1 -1
- package/dist/commands/unitize.js +32 -9
- package/dist/commands/unitize.js.map +1 -1
- package/dist/commands/update-env-configs.d.ts.map +1 -1
- package/dist/commands/update-env-configs.js +2 -1
- package/dist/commands/update-env-configs.js.map +1 -1
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +41 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +41 -0
- package/dist/commands/welcome.js.map +1 -1
- package/dist/core/analyze-engine.js +3 -3
- package/dist/core/analyze-engine.js.map +1 -1
- package/dist/core/arbitration/l3-human-arbiter.js +1 -1
- package/dist/core/arbitration/l3-human-arbiter.js.map +1 -1
- package/dist/core/arbitration/verdict-generator.js +1 -1
- package/dist/core/arbitration/verdict-generator.js.map +1 -1
- package/dist/core/ask-context.d.ts.map +1 -1
- package/dist/core/ask-context.js +14 -3
- package/dist/core/ask-context.js.map +1 -1
- package/dist/core/ask-engine.d.ts.map +1 -1
- package/dist/core/ask-engine.js +55 -49
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/code-graph/reporter.d.ts.map +1 -1
- package/dist/core/code-graph/reporter.js +3 -12
- package/dist/core/code-graph/reporter.js.map +1 -1
- package/dist/core/code-graph/requirement-linker.js +1 -1
- package/dist/core/code-graph/requirement-linker.js.map +1 -1
- package/dist/core/code-scanner.js +1 -1
- package/dist/core/code-scanner.js.map +1 -1
- package/dist/core/deploy/engine.d.ts.map +1 -1
- package/dist/core/deploy/engine.js +58 -44
- package/dist/core/deploy/engine.js.map +1 -1
- package/dist/core/environment-config.d.ts +13 -0
- package/dist/core/environment-config.d.ts.map +1 -1
- package/dist/core/environment-config.js +28 -1
- package/dist/core/environment-config.js.map +1 -1
- package/dist/core/error-diagnosis.js +2 -2
- package/dist/core/error-diagnosis.js.map +1 -1
- package/dist/core/git-integration.d.ts +5 -7
- package/dist/core/git-integration.d.ts.map +1 -1
- package/dist/core/git-integration.js +137 -12
- package/dist/core/git-integration.js.map +1 -1
- package/dist/core/global-knowledge.d.ts.map +1 -1
- package/dist/core/global-knowledge.js +25 -11
- package/dist/core/global-knowledge.js.map +1 -1
- package/dist/core/handoff-generator.d.ts.map +1 -1
- package/dist/core/handoff-generator.js +3 -1
- package/dist/core/handoff-generator.js.map +1 -1
- package/dist/core/index-guard.d.ts.map +1 -1
- package/dist/core/index-guard.js +4 -26
- package/dist/core/index-guard.js.map +1 -1
- package/dist/core/intent-recognition.d.ts +1 -1
- package/dist/core/intent-recognition.d.ts.map +1 -1
- package/dist/core/intent-recognition.js +68 -68
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/core/knowledge-graph.d.ts.map +1 -1
- package/dist/core/knowledge-graph.js +6 -4
- package/dist/core/knowledge-graph.js.map +1 -1
- package/dist/core/name-validator.d.ts.map +1 -1
- package/dist/core/name-validator.js +41 -20
- package/dist/core/name-validator.js.map +1 -1
- package/dist/core/pinyin-initials.d.ts +10 -0
- package/dist/core/pinyin-initials.d.ts.map +1 -0
- package/dist/core/pinyin-initials.js +44 -0
- package/dist/core/pinyin-initials.js.map +1 -0
- package/dist/core/prompt-builder.js +1 -1
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/prompt-plugins/analyze-graph-plugin.js +1 -1
- package/dist/core/prompt-plugins/analyze-graph-plugin.js.map +1 -1
- package/dist/core/reindex-engine.js +4 -4
- package/dist/core/reindex-engine.js.map +1 -1
- package/dist/core/skeleton-residue.d.ts +13 -0
- package/dist/core/skeleton-residue.d.ts.map +1 -1
- package/dist/core/skeleton-residue.js +83 -14
- package/dist/core/skeleton-residue.js.map +1 -1
- package/dist/core/spec-merger.d.ts.map +1 -1
- package/dist/core/spec-merger.js +3 -2
- package/dist/core/spec-merger.js.map +1 -1
- package/dist/core/state.d.ts +10 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +20 -1
- package/dist/core/state.js.map +1 -1
- package/dist/core/structured-extractor.d.ts +6 -0
- package/dist/core/structured-extractor.d.ts.map +1 -1
- package/dist/core/structured-extractor.js +6 -0
- package/dist/core/structured-extractor.js.map +1 -1
- package/dist/core/task-paths.d.ts +12 -0
- package/dist/core/task-paths.d.ts.map +1 -1
- package/dist/core/task-paths.js +33 -1
- package/dist/core/task-paths.js.map +1 -1
- package/dist/core/unified-config.d.ts +7 -1
- package/dist/core/unified-config.d.ts.map +1 -1
- package/dist/core/unified-config.js +70 -21
- package/dist/core/unified-config.js.map +1 -1
- package/dist/core/unit-staffing.d.ts +21 -4
- package/dist/core/unit-staffing.d.ts.map +1 -1
- package/dist/core/unit-staffing.js +59 -12
- package/dist/core/unit-staffing.js.map +1 -1
- package/dist/core/usage-analytics.js +1 -1
- package/dist/core/usage-analytics.js.map +1 -1
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +45 -5
- package/dist/core/validator.js.map +1 -1
- package/dist/core/verify-report-aggregator.d.ts.map +1 -1
- package/dist/core/verify-report-aggregator.js +19 -2
- package/dist/core/verify-report-aggregator.js.map +1 -1
- package/dist/utils/task-utils.d.ts +4 -1
- package/dist/utils/task-utils.d.ts.map +1 -1
- package/dist/utils/task-utils.js +30 -4
- package/dist/utils/task-utils.js.map +1 -1
- package/package.json +4 -3
- package/templates/deploy-examples.yaml +33 -5
- package/templates/html/speccore-ask-explain.html +1 -1
- package/templates/html/speccore-ask-guide.html +1 -1
- package/templates/html/speccore-ask-match.html +1 -1
- package/templates/html/speccore-ask-pipeline.html +1 -1
- package/templates/html/speccore-ask-result.html +1 -1
- package/templates/html/speccore-help.html +2 -2
- package/templates/speccore-yml-example.yml +174 -54
- package/templates/verify-spec-example.yaml +66 -1
- package/dist/commands/audit.d.ts +0 -12
- package/dist/commands/audit.d.ts.map +0 -1
- package/dist/commands/audit.js +0 -540
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/backup.d.ts +0 -18
- package/dist/commands/backup.d.ts.map +0 -1
- package/dist/commands/backup.js +0 -102
- package/dist/commands/backup.js.map +0 -1
- package/dist/commands/baseline.d.ts +0 -13
- package/dist/commands/baseline.d.ts.map +0 -1
- package/dist/commands/baseline.js +0 -227
- package/dist/commands/baseline.js.map +0 -1
- package/dist/commands/chain.d.ts +0 -55
- package/dist/commands/chain.d.ts.map +0 -1
- package/dist/commands/chain.js +0 -501
- package/dist/commands/chain.js.map +0 -1
- package/dist/commands/clarify.d.ts +0 -17
- package/dist/commands/clarify.d.ts.map +0 -1
- package/dist/commands/clarify.js +0 -351
- package/dist/commands/clarify.js.map +0 -1
- package/dist/commands/code-index.d.ts +0 -21
- package/dist/commands/code-index.d.ts.map +0 -1
- package/dist/commands/code-index.js +0 -193
- package/dist/commands/code-index.js.map +0 -1
- package/dist/commands/context.d.ts +0 -10
- package/dist/commands/context.d.ts.map +0 -1
- package/dist/commands/context.js +0 -213
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/current.d.ts +0 -10
- package/dist/commands/current.d.ts.map +0 -1
- package/dist/commands/current.js +0 -53
- package/dist/commands/current.js.map +0 -1
- package/dist/commands/dev.d.ts +0 -18
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js +0 -854
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -10
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/diff.js +0 -160
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/global-status.d.ts +0 -9
- package/dist/commands/global-status.d.ts.map +0 -1
- package/dist/commands/global-status.js +0 -135
- package/dist/commands/global-status.js.map +0 -1
- package/dist/commands/graph.d.ts +0 -25
- package/dist/commands/graph.d.ts.map +0 -1
- package/dist/commands/graph.js +0 -523
- package/dist/commands/graph.js.map +0 -1
- package/dist/commands/handover.d.ts +0 -11
- package/dist/commands/handover.d.ts.map +0 -1
- package/dist/commands/handover.js +0 -170
- package/dist/commands/handover.js.map +0 -1
- package/dist/commands/health.d.ts +0 -7
- package/dist/commands/health.d.ts.map +0 -1
- package/dist/commands/health.js +0 -80
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/history.d.ts +0 -9
- package/dist/commands/history.d.ts.map +0 -1
- package/dist/commands/history.js +0 -117
- package/dist/commands/history.js.map +0 -1
- package/dist/commands/impact.d.ts +0 -12
- package/dist/commands/impact.d.ts.map +0 -1
- package/dist/commands/impact.js +0 -238
- package/dist/commands/impact.js.map +0 -1
- package/dist/commands/import.d.ts +0 -19
- package/dist/commands/import.d.ts.map +0 -1
- package/dist/commands/import.js +0 -673
- package/dist/commands/import.js.map +0 -1
- package/dist/commands/knowledge.d.ts +0 -6
- package/dist/commands/knowledge.d.ts.map +0 -1
- package/dist/commands/knowledge.js +0 -94
- package/dist/commands/knowledge.js.map +0 -1
- package/dist/commands/lifecycle.d.ts +0 -9
- package/dist/commands/lifecycle.d.ts.map +0 -1
- package/dist/commands/lifecycle.js +0 -288
- package/dist/commands/lifecycle.js.map +0 -1
- package/dist/commands/merge-check.d.ts +0 -10
- package/dist/commands/merge-check.d.ts.map +0 -1
- package/dist/commands/merge-check.js +0 -183
- package/dist/commands/merge-check.js.map +0 -1
- package/dist/commands/notify.d.ts +0 -13
- package/dist/commands/notify.d.ts.map +0 -1
- package/dist/commands/notify.js +0 -63
- package/dist/commands/notify.js.map +0 -1
- package/dist/commands/rag-index.d.ts +0 -19
- package/dist/commands/rag-index.d.ts.map +0 -1
- package/dist/commands/rag-index.js +0 -286
- package/dist/commands/rag-index.js.map +0 -1
- package/dist/commands/recommend.d.ts +0 -13
- package/dist/commands/recommend.d.ts.map +0 -1
- package/dist/commands/recommend.js +0 -37
- package/dist/commands/recommend.js.map +0 -1
- package/dist/commands/refresh.d.ts +0 -21
- package/dist/commands/refresh.d.ts.map +0 -1
- package/dist/commands/refresh.js +0 -211
- package/dist/commands/refresh.js.map +0 -1
- package/dist/commands/rollback.d.ts +0 -8
- package/dist/commands/rollback.d.ts.map +0 -1
- package/dist/commands/rollback.js +0 -113
- package/dist/commands/rollback.js.map +0 -1
- package/dist/commands/status.d.ts +0 -7
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -262
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/trace.d.ts +0 -12
- package/dist/commands/trace.d.ts.map +0 -1
- package/dist/commands/trace.js +0 -163
- package/dist/commands/trace.js.map +0 -1
- package/dist/commands/tracker.d.ts +0 -2
- package/dist/commands/tracker.d.ts.map +0 -1
- package/dist/commands/tracker.js +0 -28
- package/dist/commands/tracker.js.map +0 -1
- package/dist/commands/verdict.d.ts +0 -16
- package/dist/commands/verdict.d.ts.map +0 -1
- package/dist/commands/verdict.js +0 -189
- package/dist/commands/verdict.js.map +0 -1
- package/dist/commands/workspace.d.ts +0 -20
- package/dist/commands/workspace.d.ts.map +0 -1
- package/dist/commands/workspace.js +0 -142
- package/dist/commands/workspace.js.map +0 -1
- package/dist/core/constraint-set.d.ts +0 -67
- package/dist/core/constraint-set.d.ts.map +0 -1
- package/dist/core/constraint-set.js +0 -151
- package/dist/core/constraint-set.js.map +0 -1
- package/dist/core/smart-recommend.d.ts +0 -16
- package/dist/core/smart-recommend.d.ts.map +0 -1
- package/dist/core/smart-recommend.js +0 -149
- package/dist/core/smart-recommend.js.map +0 -1
- package/dist/core/task-type-registry.d.ts +0 -110
- package/dist/core/task-type-registry.d.ts.map +0 -1
- package/dist/core/task-type-registry.js +0 -334
- package/dist/core/task-type-registry.js.map +0 -1
- package/dist/utils/mermaid-render.d.ts +0 -39
- package/dist/utils/mermaid-render.d.ts.map +0 -1
- package/dist/utils/mermaid-render.js +0 -284
- package/dist/utils/mermaid-render.js.map +0 -1
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.recommendCommand = recommendCommand;
|
|
4
|
-
exports.registerRecommendCommand = registerRecommendCommand;
|
|
5
|
-
const logger_1 = require("../utils/logger");
|
|
6
|
-
const smart_recommend_1 = require("../core/smart-recommend");
|
|
7
|
-
const usage_analytics_1 = require("../core/usage-analytics");
|
|
8
|
-
const error_diagnosis_1 = require("../core/error-diagnosis");
|
|
9
|
-
async function recommendCommand(options) {
|
|
10
|
-
const cwd = process.cwd();
|
|
11
|
-
// --diagnose: 诊断指定错误信息
|
|
12
|
-
if (options.diagnose) {
|
|
13
|
-
(0, error_diagnosis_1.diagnoseAndPrint)(options.diagnose);
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
// --analytics: 显示使用分析报告
|
|
17
|
-
if (options.analytics) {
|
|
18
|
-
const period = parseInt(options.period || '14', 10);
|
|
19
|
-
const report = await (0, usage_analytics_1.generateUsageReport)(cwd, period);
|
|
20
|
-
logger_1.logger.info((0, usage_analytics_1.formatUsageReport)(report));
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
// 默认:生成智能推荐
|
|
24
|
-
const recommendations = await (0, smart_recommend_1.generateRecommendations)(cwd);
|
|
25
|
-
(0, smart_recommend_1.printRecommendations)(recommendations);
|
|
26
|
-
}
|
|
27
|
-
function registerRecommendCommand(program) {
|
|
28
|
-
program
|
|
29
|
-
.command('recommend')
|
|
30
|
-
.alias('rec')
|
|
31
|
-
.description('智能推荐:基于项目状态给出操作建议')
|
|
32
|
-
.option('--analytics', '显示使用模式分析报告')
|
|
33
|
-
.option('--period <days>', '报告时间范围(天)', '14')
|
|
34
|
-
.option('--diagnose <error>', '诊断错误信息并给出修复建议')
|
|
35
|
-
.action(recommendCommand);
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=recommend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/commands/recommend.ts"],"names":[],"mappings":";;AAgBA,4CAoBC;AAED,4DASC;AA1CD,4CAAyC;AACzC,6DAAwF;AACxF,6DAAiF;AACjF,6DAA2D;AAQpD,KAAK,UAAU,gBAAgB,CAAC,OAAyB;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,uBAAuB;IACvB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,IAAA,kCAAgB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAA,qCAAmB,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtD,eAAM,CAAC,IAAI,CAAC,IAAA,mCAAiB,EAAC,MAAM,CAAC,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,YAAY;IACZ,MAAM,eAAe,GAAG,MAAM,IAAA,yCAAuB,EAAC,GAAG,CAAC,CAAC;IAC3D,IAAA,sCAAoB,EAAC,eAAe,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,KAAK,CAAC,KAAK,CAAC;SACZ,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC;SACnC,MAAM,CAAC,iBAAiB,EAAE,WAAW,EAAE,IAAI,CAAC;SAC5C,MAAM,CAAC,oBAAoB,EAAE,eAAe,CAAC;SAC7C,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* refresh — 统一刷新所有检索层
|
|
3
|
-
*
|
|
4
|
-
* 用法:
|
|
5
|
-
* speccore refresh # 刷新所有检索层
|
|
6
|
-
* speccore refresh --code # 只刷新代码索引
|
|
7
|
-
* speccore refresh --rag # 只刷新文档 RAG
|
|
8
|
-
* speccore refresh --graph # 只刷新知识图谱
|
|
9
|
-
* speccore refresh --task Task-001 # 指定任务
|
|
10
|
-
*/
|
|
11
|
-
import { Command } from 'commander';
|
|
12
|
-
export interface RefreshOptions {
|
|
13
|
-
code?: boolean;
|
|
14
|
-
rag?: boolean;
|
|
15
|
-
graph?: boolean;
|
|
16
|
-
task?: string;
|
|
17
|
-
iteration?: string;
|
|
18
|
-
}
|
|
19
|
-
export declare function refreshCommand(options: RefreshOptions): Promise<void>;
|
|
20
|
-
export declare function registerRefreshCommand(program: Command): void;
|
|
21
|
-
//# sourceMappingURL=refresh.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/commands/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiK3E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4B7D"}
|
package/dist/commands/refresh.js
DELETED
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* refresh — 统一刷新所有检索层
|
|
4
|
-
*
|
|
5
|
-
* 用法:
|
|
6
|
-
* speccore refresh # 刷新所有检索层
|
|
7
|
-
* speccore refresh --code # 只刷新代码索引
|
|
8
|
-
* speccore refresh --rag # 只刷新文档 RAG
|
|
9
|
-
* speccore refresh --graph # 只刷新知识图谱
|
|
10
|
-
* speccore refresh --task Task-001 # 指定任务
|
|
11
|
-
*/
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.refreshCommand = refreshCommand;
|
|
14
|
-
exports.registerRefreshCommand = registerRefreshCommand;
|
|
15
|
-
const path_1 = require("path");
|
|
16
|
-
const fs_extra_1 = require("fs-extra");
|
|
17
|
-
const logger_1 = require("../utils/logger");
|
|
18
|
-
const code_scanner_1 = require("../core/code-scanner");
|
|
19
|
-
const rag_engine_1 = require("../core/rag-engine");
|
|
20
|
-
const knowledge_graph_1 = require("../core/knowledge-graph");
|
|
21
|
-
const context_1 = require("../core/context");
|
|
22
|
-
const change_impact_global_1 = require("../core/change-impact-global");
|
|
23
|
-
async function refreshCommand(options) {
|
|
24
|
-
const cwd = process.cwd();
|
|
25
|
-
// 如果没指定任何类型,默认刷新全部
|
|
26
|
-
const refreshAll = !options.code && !options.rag && !options.graph;
|
|
27
|
-
const refreshCode = refreshAll || options.code;
|
|
28
|
-
const refreshRagFlag = refreshAll || options.rag;
|
|
29
|
-
const refreshGraph = refreshAll || options.graph;
|
|
30
|
-
// 确定任务和迭代
|
|
31
|
-
let iteration = options.iteration || await (0, context_1.getDefaultIteration)(cwd);
|
|
32
|
-
let taskDir = '';
|
|
33
|
-
if (options.task && iteration) {
|
|
34
|
-
taskDir = (0, path_1.join)(`Iteration-${iteration}`, '030-tasks', options.task);
|
|
35
|
-
}
|
|
36
|
-
logger_1.logger.info('═══ 统一刷新检索层 ═══');
|
|
37
|
-
logger_1.logger.info(` 迭代: ${iteration || '未指定'}`);
|
|
38
|
-
logger_1.logger.info(` 任务: ${options.task || '自动推断'}`);
|
|
39
|
-
logger_1.logger.info(` 刷新项: ${[
|
|
40
|
-
refreshCode ? '代码索引' : '',
|
|
41
|
-
refreshRagFlag ? '文档RAG' : '',
|
|
42
|
-
refreshGraph ? '知识图谱' : '',
|
|
43
|
-
].filter(Boolean).join(' + ')}`);
|
|
44
|
-
logger_1.logger.info('');
|
|
45
|
-
const results = [];
|
|
46
|
-
// ── 1. 刷新代码索引 ──
|
|
47
|
-
if (refreshCode) {
|
|
48
|
-
const spinner = new logger_1.Spinner('刷新代码索引...');
|
|
49
|
-
spinner.start();
|
|
50
|
-
try {
|
|
51
|
-
const fileCount = await (0, code_scanner_1.buildCodeIndex)(undefined, true);
|
|
52
|
-
spinner.stop('代码索引刷新完成');
|
|
53
|
-
results.push({ name: '代码索引', status: 'success', detail: `${fileCount} 个文件` });
|
|
54
|
-
}
|
|
55
|
-
catch (err) {
|
|
56
|
-
spinner.fail('代码索引刷新失败');
|
|
57
|
-
results.push({ name: '代码索引', status: 'fail', detail: err.message });
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// ── 2. 刷新文档 RAG ──
|
|
61
|
-
if (refreshRagFlag) {
|
|
62
|
-
const spinner = new logger_1.Spinner('刷新文档 RAG...');
|
|
63
|
-
spinner.start();
|
|
64
|
-
try {
|
|
65
|
-
const refreshedFiles = [];
|
|
66
|
-
// 2.1 刷新 task 级索引(默认文件名)
|
|
67
|
-
if (taskDir && await (0, fs_extra_1.pathExists)(taskDir)) {
|
|
68
|
-
const before = await (0, rag_engine_1.loadRagIndex)(cwd);
|
|
69
|
-
await (0, rag_engine_1.refreshRagIndex)(cwd, taskDir, iteration);
|
|
70
|
-
const after = await (0, rag_engine_1.loadRagIndex)(cwd);
|
|
71
|
-
if (!before || before.updatedAt !== after?.updatedAt) {
|
|
72
|
-
refreshedFiles.push('task');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// 2.2 刷新 iteration 级索引(v8.3.65+ 扩展:同时索引 010-requirements/)
|
|
76
|
-
if (iteration) {
|
|
77
|
-
const iterFileName = `rag-index-${iteration}.json`;
|
|
78
|
-
const iterSpecsDir = (0, path_1.join)(`Iteration-${iteration}`, '020-specs');
|
|
79
|
-
const iterReqDir = (0, path_1.join)(`Iteration-${iteration}`, '010-requirements');
|
|
80
|
-
const dirs = [];
|
|
81
|
-
if (await (0, fs_extra_1.pathExists)(iterSpecsDir))
|
|
82
|
-
dirs.push(iterSpecsDir);
|
|
83
|
-
if (await (0, fs_extra_1.pathExists)(iterReqDir))
|
|
84
|
-
dirs.push(iterReqDir);
|
|
85
|
-
if (dirs.length > 0) {
|
|
86
|
-
const before = await (0, rag_engine_1.loadRagIndex)(cwd, iterFileName);
|
|
87
|
-
const scope = `${iteration}_iteration_all`;
|
|
88
|
-
await (0, rag_engine_1.indexDirectoryDocuments)(cwd, dirs, scope, iterFileName);
|
|
89
|
-
const after = await (0, rag_engine_1.loadRagIndex)(cwd, iterFileName);
|
|
90
|
-
if (!before || before.updatedAt !== after?.updatedAt) {
|
|
91
|
-
refreshedFiles.push(`iteration-${iteration}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// 2.3 刷新全局索引(v8.3.134+ 四层架构:RAG 全覆盖 RULES/SKILLS/PATTERNS)
|
|
96
|
-
const globalFileName = 'rag-index-global.json';
|
|
97
|
-
const beforeGlobal = await (0, rag_engine_1.loadRagIndex)(cwd, globalFileName);
|
|
98
|
-
const globalDir = (0, path_1.join)(cwd, '.speccore', 'GLOBAL');
|
|
99
|
-
const fallbackDir = (0, path_1.join)(cwd, '.speccore');
|
|
100
|
-
const targetDir = await (0, fs_extra_1.pathExists)(globalDir) ? globalDir : fallbackDir;
|
|
101
|
-
if (await (0, fs_extra_1.pathExists)(targetDir)) {
|
|
102
|
-
const dirs = [targetDir];
|
|
103
|
-
const rulesDir = (0, path_1.join)(cwd, '.speccore', 'RULES');
|
|
104
|
-
const skillsDir = (0, path_1.join)(cwd, '.speccore', 'SKILLS');
|
|
105
|
-
const patternsDir = (0, path_1.join)(cwd, '.speccore', 'PATTERNS');
|
|
106
|
-
if (await (0, fs_extra_1.pathExists)(rulesDir))
|
|
107
|
-
dirs.push(rulesDir);
|
|
108
|
-
if (await (0, fs_extra_1.pathExists)(skillsDir))
|
|
109
|
-
dirs.push(skillsDir);
|
|
110
|
-
if (await (0, fs_extra_1.pathExists)(patternsDir))
|
|
111
|
-
dirs.push(patternsDir);
|
|
112
|
-
await (0, rag_engine_1.indexDirectoryDocuments)(cwd, dirs, 'GLOBAL_all_all_aggregated', globalFileName);
|
|
113
|
-
const afterGlobal = await (0, rag_engine_1.loadRagIndex)(cwd, globalFileName);
|
|
114
|
-
if (!beforeGlobal || beforeGlobal.updatedAt !== afterGlobal?.updatedAt) {
|
|
115
|
-
refreshedFiles.push('global');
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (refreshedFiles.length > 0) {
|
|
119
|
-
spinner.stop(`文档 RAG 刷新完成 (${refreshedFiles.join(', ')})`);
|
|
120
|
-
results.push({ name: '文档 RAG', status: 'success', detail: refreshedFiles.join(', ') });
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
spinner.stop('文档 RAG 已是最新');
|
|
124
|
-
results.push({ name: '文档 RAG', status: 'skip', detail: '已是最新' });
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
spinner.fail('文档 RAG 刷新失败');
|
|
129
|
-
results.push({ name: '文档 RAG', status: 'fail', detail: err.message });
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// ── 3. 刷新知识图谱 ──
|
|
133
|
-
if (refreshGraph) {
|
|
134
|
-
const spinner = new logger_1.Spinner('刷新知识图谱...');
|
|
135
|
-
spinner.start();
|
|
136
|
-
try {
|
|
137
|
-
const graph = await (0, knowledge_graph_1.refreshKnowledgeGraph)(cwd, iteration);
|
|
138
|
-
if (graph) {
|
|
139
|
-
spinner.stop('知识图谱刷新完成');
|
|
140
|
-
results.push({
|
|
141
|
-
name: '知识图谱',
|
|
142
|
-
status: 'success',
|
|
143
|
-
detail: `${Object.keys(graph.entities).length} 实体 / ${graph.relations.length} 关系`,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
spinner.stop('知识图谱无数据');
|
|
148
|
-
results.push({ name: '知识图谱', status: 'skip', detail: '无数据' });
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
catch (err) {
|
|
152
|
-
spinner.fail('知识图谱刷新失败');
|
|
153
|
-
results.push({ name: '知识图谱', status: 'fail', detail: err.message });
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// ── 汇总 ──
|
|
157
|
-
logger_1.logger.info('');
|
|
158
|
-
logger_1.logger.info('═══ 刷新结果 ═══');
|
|
159
|
-
for (const r of results) {
|
|
160
|
-
const icon = r.status === 'success' ? '✅' : r.status === 'skip' ? '⏭️' : '❌';
|
|
161
|
-
logger_1.logger.info(` ${icon} ${r.name}: ${r.detail}`);
|
|
162
|
-
}
|
|
163
|
-
const successCount = results.filter(r => r.status === 'success').length;
|
|
164
|
-
const failCount = results.filter(r => r.status === 'fail').length;
|
|
165
|
-
logger_1.logger.info('');
|
|
166
|
-
if (failCount === 0) {
|
|
167
|
-
logger_1.logger.success(`✅ 全部刷新完成(${successCount} 项成功)`);
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
logger_1.logger.warn(`⚠️ 刷新完成(${successCount} 成功, ${failCount} 失败)`);
|
|
171
|
-
}
|
|
172
|
-
// ── 4. 检测全局文档过期(v8.3.187+ 接线 change-impact-global)──
|
|
173
|
-
// 刷新索引后,顺带检测哪些全局分析文档在源码变更后未更新,提示用户增量重建
|
|
174
|
-
try {
|
|
175
|
-
const staleDocs = await (0, change_impact_global_1.detectStaleGlobalDocs)(cwd);
|
|
176
|
-
(0, change_impact_global_1.printStaleDocReport)(staleDocs);
|
|
177
|
-
}
|
|
178
|
-
catch (err) {
|
|
179
|
-
logger_1.logger.debug(`全局文档过期检测跳过: ${err.message}`);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
function registerRefreshCommand(program) {
|
|
183
|
-
program
|
|
184
|
-
.command('refresh')
|
|
185
|
-
.alias('rf')
|
|
186
|
-
.description('统一刷新所有检索层(代码索引 + 文档 RAG + 知识图谱)')
|
|
187
|
-
.option('--code', '只刷新代码索引')
|
|
188
|
-
.option('--rag', '只刷新文档 RAG')
|
|
189
|
-
.option('--graph', '只刷新知识图谱')
|
|
190
|
-
.option('-t, --task <task>', '指定任务(如 Task-001)')
|
|
191
|
-
.option('-i, --iteration <iteration>', '指定迭代(默认当前迭代)')
|
|
192
|
-
.addHelpText('after', `
|
|
193
|
-
\x1b[36m使用场景:\x1b[0m
|
|
194
|
-
\x1b[33m刷新全部\x1b[0m speccore refresh
|
|
195
|
-
\x1b[33m只刷代码\x1b[0m speccore refresh --code
|
|
196
|
-
\x1b[33m只刷文档\x1b[0m speccore refresh --rag --task Task-001
|
|
197
|
-
\x1b[33m只刷图谱\x1b[0m speccore refresh --graph
|
|
198
|
-
|
|
199
|
-
\x1b[36m何时使用:\x1b[0m
|
|
200
|
-
• 你手动修改了源码 → refresh --code
|
|
201
|
-
• 你手动修改了 TECH.md/REQ.md → refresh --rag
|
|
202
|
-
• 你添加了新任务/需求 → refresh --graph
|
|
203
|
-
• 不确定改了什么 → refresh(全部刷新)
|
|
204
|
-
|
|
205
|
-
\x1b[36m各检索层说明:\x1b[0m
|
|
206
|
-
• 代码索引: .speccore/cache/code-structure.json(findRelevantCode 使用)
|
|
207
|
-
• 文档 RAG: .speccore/cache/rag-index.json(unifiedSearch 使用)
|
|
208
|
-
• 知识图谱: .speccore/cache/knowledge-graph.json(任务关联链)`)
|
|
209
|
-
.action(refreshCommand);
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=refresh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/commands/refresh.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkE7E"}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rollbackCommand = rollbackCommand;
|
|
4
|
-
/**
|
|
5
|
-
* rollback — 从 .bak 备份恢复 Spec 文件
|
|
6
|
-
*/
|
|
7
|
-
const logger_1 = require("../utils/logger");
|
|
8
|
-
const context_1 = require("../core/context");
|
|
9
|
-
const state_1 = require("../core/state");
|
|
10
|
-
const fs_extra_1 = require("fs-extra");
|
|
11
|
-
const path_1 = require("path");
|
|
12
|
-
async function rollbackCommand(options) {
|
|
13
|
-
const spinner = new logger_1.Spinner('正在查找备份...');
|
|
14
|
-
spinner.start();
|
|
15
|
-
try {
|
|
16
|
-
const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
|
|
17
|
-
// 全局模式:查找所有 .bak 文件
|
|
18
|
-
if (!options.task) {
|
|
19
|
-
spinner.stop();
|
|
20
|
-
await listAllBackups(iteration);
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
// 查找指定 Task 下的备份文件
|
|
24
|
-
const tasks = await (0, state_1.scanTasks)(iteration);
|
|
25
|
-
const task = tasks.find(t => t.id === options.task || t.id.startsWith(options.task + '-'));
|
|
26
|
-
if (!task) {
|
|
27
|
-
spinner.fail(`未找到 Task: ${options.task}`);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const cwd = process.cwd();
|
|
31
|
-
const iterDir = (0, path_1.join)(cwd, iteration ? `Iteration-${iteration}` : '');
|
|
32
|
-
const taskDir = (0, path_1.join)(iterDir, task.id);
|
|
33
|
-
const backups = await findBackupFiles(taskDir);
|
|
34
|
-
if (backups.length === 0) {
|
|
35
|
-
spinner.stop(`无备份文件 (Task: ${task.id})`);
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
spinner.stop(`找到 ${backups.length} 个备份文件`);
|
|
39
|
-
// 列出备份
|
|
40
|
-
logger_1.logger.info('');
|
|
41
|
-
for (const b of backups) {
|
|
42
|
-
const relative = b.replace(cwd + '/', '');
|
|
43
|
-
logger_1.logger.info(` ${relative}`);
|
|
44
|
-
}
|
|
45
|
-
// 只列出
|
|
46
|
-
if (options.list)
|
|
47
|
-
return;
|
|
48
|
-
// 确认恢复
|
|
49
|
-
if (!options.confirm) {
|
|
50
|
-
logger_1.logger.info('');
|
|
51
|
-
logger_1.logger.warn('如需恢复,请使用: speccore rollback --task=' + (options.task) + ' --confirm');
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
// 执行恢复
|
|
55
|
-
const rollbackSpinner = new logger_1.Spinner('正在恢复...');
|
|
56
|
-
rollbackSpinner.start();
|
|
57
|
-
let restored = 0;
|
|
58
|
-
for (const bak of backups) {
|
|
59
|
-
const original = bak.replace(/\.bak$/, '');
|
|
60
|
-
await (0, fs_extra_1.writeFile)(original, await (0, fs_extra_1.readFile)(bak, 'utf-8'));
|
|
61
|
-
await (0, fs_extra_1.unlink)(bak);
|
|
62
|
-
restored++;
|
|
63
|
-
}
|
|
64
|
-
rollbackSpinner.stop(`已恢复 ${restored} 个文件 (备份已清理)`);
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
spinner.fail(`回滚失败: ${error}`);
|
|
68
|
-
throw error;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
async function findBackupFiles(dir) {
|
|
72
|
-
const results = [];
|
|
73
|
-
if (!(await (0, fs_extra_1.pathExists)(dir)))
|
|
74
|
-
return results;
|
|
75
|
-
async function scan(d) {
|
|
76
|
-
const entries = await (0, fs_extra_1.readdir)(d, { withFileTypes: true });
|
|
77
|
-
for (const e of entries) {
|
|
78
|
-
if (e.isDirectory() && !e.name.startsWith('.')) {
|
|
79
|
-
await scan((0, path_1.join)(d, e.name));
|
|
80
|
-
}
|
|
81
|
-
else if (e.name.endsWith('.bak')) {
|
|
82
|
-
results.push((0, path_1.join)(d, e.name));
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
await scan(dir);
|
|
87
|
-
return results;
|
|
88
|
-
}
|
|
89
|
-
async function listAllBackups(iteration) {
|
|
90
|
-
const cwd = process.cwd();
|
|
91
|
-
const dirs = ['.speccore'];
|
|
92
|
-
if (iteration)
|
|
93
|
-
dirs.push(`Iteration-${iteration}`);
|
|
94
|
-
let total = 0;
|
|
95
|
-
for (const d of dirs) {
|
|
96
|
-
const backups = await findBackupFiles((0, path_1.join)(cwd, d));
|
|
97
|
-
if (backups.length > 0) {
|
|
98
|
-
logger_1.logger.info(`\n${d}/`);
|
|
99
|
-
for (const b of backups) {
|
|
100
|
-
logger_1.logger.info(` ${b.replace(cwd + '/', '')}`);
|
|
101
|
-
}
|
|
102
|
-
total += backups.length;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
if (total === 0) {
|
|
106
|
-
logger_1.logger.info('无任何备份文件');
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
logger_1.logger.info(`\n共 ${total} 个备份文件`);
|
|
110
|
-
logger_1.logger.info('恢复: speccore rollback --task=<Task编号> --confirm');
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=rollback.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCzE"}
|