speccore 6.92.0 → 6.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/.agents/skills/spec-ask/SKILL.md +34 -11
  2. package/.agents/skills/speccore-router/SKILL.md +8 -2
  3. package/dist/cli.js +8 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/analyze.d.ts.map +1 -1
  6. package/dist/commands/analyze.js +11 -2
  7. package/dist/commands/analyze.js.map +1 -1
  8. package/dist/commands/ask.d.ts.map +1 -1
  9. package/dist/commands/ask.js +13 -2
  10. package/dist/commands/ask.js.map +1 -1
  11. package/dist/commands/code-index.d.ts +2 -0
  12. package/dist/commands/code-index.d.ts.map +1 -1
  13. package/dist/commands/code-index.js +48 -3
  14. package/dist/commands/code-index.js.map +1 -1
  15. package/dist/commands/doctor.d.ts.map +1 -1
  16. package/dist/commands/doctor.js +49 -0
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/execute.d.ts.map +1 -1
  19. package/dist/commands/execute.js +42 -0
  20. package/dist/commands/execute.js.map +1 -1
  21. package/dist/commands/init.d.ts +32 -0
  22. package/dist/commands/init.d.ts.map +1 -1
  23. package/dist/commands/init.js +200 -10
  24. package/dist/commands/init.js.map +1 -1
  25. package/dist/commands/notify.d.ts +13 -0
  26. package/dist/commands/notify.d.ts.map +1 -0
  27. package/dist/commands/notify.js +63 -0
  28. package/dist/commands/notify.js.map +1 -0
  29. package/dist/commands/recommend.d.ts +13 -0
  30. package/dist/commands/recommend.d.ts.map +1 -0
  31. package/dist/commands/recommend.js +37 -0
  32. package/dist/commands/recommend.js.map +1 -0
  33. package/dist/commands/status.d.ts.map +1 -1
  34. package/dist/commands/status.js +33 -1
  35. package/dist/commands/status.js.map +1 -1
  36. package/dist/commands/update.d.ts.map +1 -1
  37. package/dist/commands/update.js +24 -8
  38. package/dist/commands/update.js.map +1 -1
  39. package/dist/core/ask-config.d.ts.map +1 -1
  40. package/dist/core/ask-config.js +5 -2
  41. package/dist/core/ask-config.js.map +1 -1
  42. package/dist/core/ask-engine.d.ts +6 -1
  43. package/dist/core/ask-engine.d.ts.map +1 -1
  44. package/dist/core/ask-engine.js +70 -6
  45. package/dist/core/ask-engine.js.map +1 -1
  46. package/dist/core/code-graph/incremental-build.d.ts +11 -0
  47. package/dist/core/code-graph/incremental-build.d.ts.map +1 -0
  48. package/dist/core/code-graph/incremental-build.js +207 -0
  49. package/dist/core/code-graph/incremental-build.js.map +1 -0
  50. package/dist/core/code-graph/index.d.ts +2 -0
  51. package/dist/core/code-graph/index.d.ts.map +1 -1
  52. package/dist/core/code-graph/index.js +7 -1
  53. package/dist/core/code-graph/index.js.map +1 -1
  54. package/dist/core/code-graph/requirement-linker.d.ts +25 -0
  55. package/dist/core/code-graph/requirement-linker.d.ts.map +1 -0
  56. package/dist/core/code-graph/requirement-linker.js +192 -0
  57. package/dist/core/code-graph/requirement-linker.js.map +1 -0
  58. package/dist/core/error-diagnosis.d.ts +20 -0
  59. package/dist/core/error-diagnosis.d.ts.map +1 -0
  60. package/dist/core/error-diagnosis.js +155 -0
  61. package/dist/core/error-diagnosis.js.map +1 -0
  62. package/dist/core/intent-recognition.d.ts +7 -0
  63. package/dist/core/intent-recognition.d.ts.map +1 -1
  64. package/dist/core/intent-recognition.js +118 -10
  65. package/dist/core/intent-recognition.js.map +1 -1
  66. package/dist/core/lock-manager.d.ts +33 -0
  67. package/dist/core/lock-manager.d.ts.map +1 -0
  68. package/dist/core/lock-manager.js +144 -0
  69. package/dist/core/lock-manager.js.map +1 -0
  70. package/dist/core/notification.d.ts +39 -0
  71. package/dist/core/notification.d.ts.map +1 -0
  72. package/dist/core/notification.js +172 -0
  73. package/dist/core/notification.js.map +1 -0
  74. package/dist/core/prompt-builder.d.ts.map +1 -1
  75. package/dist/core/prompt-builder.js +26 -84
  76. package/dist/core/prompt-builder.js.map +1 -1
  77. package/dist/core/prompt-plugins/agents-plugin.d.ts +3 -0
  78. package/dist/core/prompt-plugins/agents-plugin.d.ts.map +1 -0
  79. package/dist/core/prompt-plugins/agents-plugin.js +34 -0
  80. package/dist/core/prompt-plugins/agents-plugin.js.map +1 -0
  81. package/dist/core/prompt-plugins/analyze-graph-plugin.d.ts +3 -0
  82. package/dist/core/prompt-plugins/analyze-graph-plugin.d.ts.map +1 -0
  83. package/dist/core/prompt-plugins/analyze-graph-plugin.js +48 -0
  84. package/dist/core/prompt-plugins/analyze-graph-plugin.js.map +1 -0
  85. package/dist/core/prompt-plugins/execute-graph-plugin.d.ts +3 -0
  86. package/dist/core/prompt-plugins/execute-graph-plugin.d.ts.map +1 -0
  87. package/dist/core/prompt-plugins/execute-graph-plugin.js +117 -0
  88. package/dist/core/prompt-plugins/execute-graph-plugin.js.map +1 -0
  89. package/dist/core/prompt-plugins/execute-rules-plugin.d.ts +3 -0
  90. package/dist/core/prompt-plugins/execute-rules-plugin.d.ts.map +1 -0
  91. package/dist/core/prompt-plugins/execute-rules-plugin.js +41 -0
  92. package/dist/core/prompt-plugins/execute-rules-plugin.js.map +1 -0
  93. package/dist/core/prompt-plugins/index.d.ts +10 -0
  94. package/dist/core/prompt-plugins/index.d.ts.map +1 -0
  95. package/dist/core/prompt-plugins/index.js +41 -0
  96. package/dist/core/prompt-plugins/index.js.map +1 -0
  97. package/dist/core/prompt-plugins/types.d.ts +47 -0
  98. package/dist/core/prompt-plugins/types.d.ts.map +1 -0
  99. package/dist/core/prompt-plugins/types.js +28 -0
  100. package/dist/core/prompt-plugins/types.js.map +1 -0
  101. package/dist/core/smart-recommend.d.ts +16 -0
  102. package/dist/core/smart-recommend.d.ts.map +1 -0
  103. package/dist/core/smart-recommend.js +149 -0
  104. package/dist/core/smart-recommend.js.map +1 -0
  105. package/dist/core/usage-analytics.d.ts +41 -0
  106. package/dist/core/usage-analytics.d.ts.map +1 -0
  107. package/dist/core/usage-analytics.js +162 -0
  108. package/dist/core/usage-analytics.js.map +1 -0
  109. package/dist/core/user-context.d.ts +9 -0
  110. package/dist/core/user-context.d.ts.map +1 -0
  111. package/dist/core/user-context.js +53 -0
  112. package/dist/core/user-context.js.map +1 -0
  113. package/package.json +1 -1
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.linkRequirementsToCode = linkRequirementsToCode;
4
+ /**
5
+ * Requirement ↔ Code Graph Linker
6
+ * v6.94.0: 建立需求文档与代码节点之间的关联映射
7
+ */
8
+ const path_1 = require("path");
9
+ const fs_extra_1 = require("fs-extra");
10
+ const logger_1 = require("../../utils/logger");
11
+ const index_1 = require("./index");
12
+ const GRAPH_DIR = '.speccore/code-graph';
13
+ /**
14
+ * 从迭代目录提取需求关键词
15
+ */
16
+ async function extractRequirements(projectRoot, iteration) {
17
+ const results = [];
18
+ // 确定迭代目录
19
+ let iterDir;
20
+ if (iteration) {
21
+ iterDir = (0, path_1.join)(projectRoot, iteration);
22
+ }
23
+ else {
24
+ // 尝试从 context.json 读取当前迭代
25
+ try {
26
+ const ctxPath = (0, path_1.join)(projectRoot, '.speccore', 'local', 'context.json');
27
+ if (await (0, fs_extra_1.pathExists)(ctxPath)) {
28
+ const ctx = JSON.parse(await (0, fs_extra_1.readFile)(ctxPath, 'utf-8'));
29
+ if (ctx.currentIteration) {
30
+ iterDir = (0, path_1.join)(projectRoot, ctx.currentIteration);
31
+ }
32
+ }
33
+ }
34
+ catch { /* 忽略 */ }
35
+ }
36
+ if (!iterDir || !(await (0, fs_extra_1.pathExists)(iterDir))) {
37
+ return results;
38
+ }
39
+ // 扫描需求文档目录
40
+ const reqDirs = [
41
+ (0, path_1.join)(iterDir, '010-requirements', 'features'),
42
+ (0, path_1.join)(iterDir, '010-requirements', 'converted'),
43
+ (0, path_1.join)(iterDir, '020-specs'),
44
+ ];
45
+ for (const dir of reqDirs) {
46
+ if (!(await (0, fs_extra_1.pathExists)(dir)))
47
+ continue;
48
+ const files = await (0, fs_extra_1.readdir)(dir).catch(() => []);
49
+ for (const f of files) {
50
+ if (!f.endsWith('.md'))
51
+ continue;
52
+ const filePath = (0, path_1.join)(dir, f);
53
+ try {
54
+ const content = await (0, fs_extra_1.readFile)(filePath, 'utf-8');
55
+ const { title, keywords } = parseRequirementDoc(content, f);
56
+ if (keywords.length > 0) {
57
+ results.push({ file: filePath, title, keywords });
58
+ }
59
+ }
60
+ catch { /* 忽略读取失败 */ }
61
+ }
62
+ }
63
+ return results;
64
+ }
65
+ /**
66
+ * 解析单个需求文档,提取标题和关键词
67
+ */
68
+ function parseRequirementDoc(content, filename) {
69
+ const lines = content.split('\n');
70
+ let title = filename.replace('.md', '');
71
+ const keywords = new Set();
72
+ for (const line of lines) {
73
+ const trimmed = line.trim();
74
+ // H1/H2 标题作为需求标题
75
+ if (trimmed.startsWith('# ')) {
76
+ title = trimmed.replace(/^#\s+/, '');
77
+ }
78
+ // 提取英文标识符(camelCase / PascalCase / snake_case)
79
+ const identifiers = trimmed.match(/[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]/g) || [];
80
+ for (const id of identifiers) {
81
+ // 过滤常见停用词
82
+ if (id.length <= 2)
83
+ continue;
84
+ if (/^(the|and|or|for|with|from|into|this|that|when|then|than|them|they|their|there|where|what|which|while|will|would|should|could|can|may|might|must|shall|use|using|used|get|set|add|new|delete|update|create|remove|list|find|search|filter|sort|order|page|size|limit|offset|count|total|sum|avg|min|max|true|false|null|undefined|const|let|var|function|class|interface|type|enum|return|if|else|switch|case|break|continue|for|while|do|try|catch|finally|throw|async|await|import|export|default|from|as|of|in|instanceof|typeof|void|yield|debugger)$/i.test(id)) {
85
+ continue;
86
+ }
87
+ keywords.add(id);
88
+ }
89
+ }
90
+ return { title, keywords: [...keywords] };
91
+ }
92
+ function computeMatchScore(reqKeywords, node) {
93
+ const nodeNameLower = node.name.toLowerCase();
94
+ const nodeFileLower = node.filePath.toLowerCase();
95
+ let matches = 0;
96
+ const matched = [];
97
+ for (const kw of reqKeywords) {
98
+ const kwLower = kw.toLowerCase();
99
+ // 节点名包含关键词
100
+ if (nodeNameLower.includes(kwLower)) {
101
+ matches += 2;
102
+ matched.push(kw);
103
+ continue;
104
+ }
105
+ // 文件名包含关键词
106
+ if (nodeFileLower.includes(kwLower)) {
107
+ matches += 1;
108
+ matched.push(kw);
109
+ continue;
110
+ }
111
+ // snippet 包含关键词
112
+ if (node.snippet && node.snippet.toLowerCase().includes(kwLower)) {
113
+ matches += 0.5;
114
+ matched.push(kw);
115
+ }
116
+ }
117
+ if (matches === 0)
118
+ return { score: 0, matched: [] };
119
+ // 归一化:匹配分 / (关键词数 * 2)
120
+ const score = Math.min(1, matches / (reqKeywords.length * 2));
121
+ return { score, matched };
122
+ }
123
+ /**
124
+ * 建立需求与代码的关联映射
125
+ */
126
+ async function linkRequirementsToCode(projectRoot, iteration) {
127
+ const root = projectRoot || process.cwd();
128
+ const graph = await (0, index_1.loadCodeGraph)(root);
129
+ if (!graph) {
130
+ logger_1.logger.warn('代码图谱不存在,请先运行 speccore code-index --graph');
131
+ return {
132
+ generatedAt: new Date().toISOString(),
133
+ iteration,
134
+ totalRequirements: 0,
135
+ totalLinkedNodes: 0,
136
+ coverageRatio: 0,
137
+ links: [],
138
+ };
139
+ }
140
+ const requirements = await extractRequirements(root, iteration);
141
+ logger_1.logger.info(`📋 发现 ${requirements.length} 个需求文档`);
142
+ const links = [];
143
+ const allLinkedNodeIds = new Set();
144
+ for (const req of requirements) {
145
+ const nodeScores = new Map();
146
+ for (const node of graph.nodes) {
147
+ const result = computeMatchScore(req.keywords, node);
148
+ if (result.score > 0.3) {
149
+ nodeScores.set(node.id, { node, score: result.score, matched: result.matched });
150
+ }
151
+ }
152
+ // 取 top 10
153
+ const topMatches = Array.from(nodeScores.values())
154
+ .sort((a, b) => b.score - a.score)
155
+ .slice(0, 10);
156
+ if (topMatches.length > 0) {
157
+ const linkedNodeIds = topMatches.map(m => m.node.id);
158
+ const avgScore = topMatches.reduce((s, m) => s + m.score, 0) / topMatches.length;
159
+ const allMatched = [...new Set(topMatches.flatMap(m => m.matched))];
160
+ for (const id of linkedNodeIds) {
161
+ allLinkedNodeIds.add(id);
162
+ }
163
+ links.push({
164
+ sourceFile: req.file,
165
+ requirement: req.title,
166
+ linkedNodeIds,
167
+ confidence: Math.round(avgScore * 100) / 100,
168
+ matchedKeywords: allMatched.slice(0, 10),
169
+ });
170
+ }
171
+ }
172
+ // 计算覆盖率:有链接的代码节点 / 总代码节点
173
+ const coverageRatio = graph.nodes.length > 0
174
+ ? Math.round((allLinkedNodeIds.size / graph.nodes.length) * 100) / 100
175
+ : 0;
176
+ const report = {
177
+ generatedAt: new Date().toISOString(),
178
+ iteration: iteration || requirements[0]?.file.split('/').find(s => s.startsWith('Iteration-')),
179
+ totalRequirements: requirements.length,
180
+ totalLinkedNodes: allLinkedNodeIds.size,
181
+ coverageRatio,
182
+ links,
183
+ };
184
+ // 输出 JSON
185
+ const outPath = (0, path_1.join)(root, GRAPH_DIR, 'REQ_CODE_LINK.json');
186
+ await (0, fs_extra_1.writeFile)(outPath, JSON.stringify(report, null, 2));
187
+ logger_1.logger.info(`🔗 需求↔代码关联已生成:`);
188
+ logger_1.logger.info(` ${links.length} 个需求 ↔ ${allLinkedNodeIds.size} 个代码节点 (覆盖率 ${(coverageRatio * 100).toFixed(0)}%)`);
189
+ logger_1.logger.info(` 输出: ${outPath}`);
190
+ return report;
191
+ }
192
+ //# sourceMappingURL=requirement-linker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement-linker.js","sourceRoot":"","sources":["../../../src/core/code-graph/requirement-linker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface DiagnosisResult {
2
+ matched: boolean;
3
+ category: string;
4
+ severity: 'info' | 'warn' | 'error';
5
+ message: string;
6
+ suggestions: string[];
7
+ }
8
+ /**
9
+ * 诊断错误信息,返回匹配结果和建议
10
+ */
11
+ export declare function diagnoseError(error: unknown): DiagnosisResult;
12
+ /**
13
+ * 打印诊断结果
14
+ */
15
+ export declare function printDiagnosis(result: DiagnosisResult): void;
16
+ /**
17
+ * 包装函数:自动诊断并打印
18
+ */
19
+ export declare function diagnoseAndPrint(error: unknown): DiagnosisResult;
20
+ //# sourceMappingURL=error-diagnosis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-diagnosis.d.ts","sourceRoot":"","sources":["../../src/core/error-diagnosis.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAqGD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CA6B7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAW5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAIhE"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.diagnoseError = diagnoseError;
4
+ exports.printDiagnosis = printDiagnosis;
5
+ exports.diagnoseAndPrint = diagnoseAndPrint;
6
+ /**
7
+ * Error Diagnosis — 错误自动诊断
8
+ * v6.96.0: 分析常见错误模式,给出针对性修复建议
9
+ */
10
+ const logger_1 = require("../utils/logger");
11
+ const ERROR_PATTERNS = [
12
+ {
13
+ category: '迭代不存在',
14
+ severity: 'error',
15
+ patterns: [/No active iteration found/i, /迭代.*不存在/i, /Iteration.*not found/i],
16
+ message: '当前没有活跃的迭代,或指定的迭代不存在',
17
+ suggestions: [
18
+ '运行 speccore iteration create <名称> 创建新迭代',
19
+ '运行 speccore init 初始化项目',
20
+ '使用 --iteration <名称> 指定已有迭代',
21
+ ],
22
+ },
23
+ {
24
+ category: '任务未找到',
25
+ severity: 'warn',
26
+ patterns: [/Task.*not found/i, /任务.*未找到/i, /没有找到.*任务/i],
27
+ message: '指定的任务不存在或名称不匹配',
28
+ suggestions: [
29
+ '运行 speccore status 查看当前迭代的任务列表',
30
+ '使用任务 ID 的完整形式(如 Task-001)',
31
+ '检查是否已运行 speccore split 拆分任务',
32
+ ],
33
+ },
34
+ {
35
+ category: '锁冲突',
36
+ severity: 'warn',
37
+ patterns: [/锁已被.*持有/i, /lock.*held by/i, /acquireLock/i],
38
+ message: '另一个进程或用户正在操作此迭代',
39
+ suggestions: [
40
+ '等待其他操作完成后重试',
41
+ '使用 --force 强制获取锁(谨慎使用)',
42
+ '运行 speccore status 查看当前锁持有者',
43
+ ],
44
+ },
45
+ {
46
+ category: '图谱缺失',
47
+ severity: 'info',
48
+ patterns: [/图谱不存在/i, /graph.*not found/i, /graph\.json.*不存在/i],
49
+ message: '代码知识图谱尚未构建',
50
+ suggestions: [
51
+ '运行 speccore code-index --graph 构建代码知识图谱',
52
+ '运行 speccore code-index --graph --incremental 增量更新',
53
+ ],
54
+ },
55
+ {
56
+ category: 'Git 错误',
57
+ severity: 'warn',
58
+ patterns: [/not a git repository/i, /git.*error/i, /protected branch/i, /冲突/i],
59
+ message: 'Git 操作遇到问题',
60
+ suggestions: [
61
+ '确认当前目录是 Git 仓库',
62
+ '检查是否在受保护分支上,切换到 feature 分支',
63
+ '运行 git status 查看未提交的变更',
64
+ '如果有冲突,先解决冲突再执行',
65
+ ],
66
+ },
67
+ {
68
+ category: '依赖缺失',
69
+ severity: 'error',
70
+ patterns: [/Cannot find module/i, /MODULE_NOT_FOUND/i, /ENOENT/i],
71
+ message: '缺少必要的依赖或文件',
72
+ suggestions: [
73
+ '运行 npm install 安装依赖',
74
+ '检查文件路径是否正确',
75
+ '确认 .speccore/ 目录结构完整',
76
+ ],
77
+ },
78
+ {
79
+ category: 'Prompt 构建失败',
80
+ severity: 'error',
81
+ patterns: [/prompt-builder/i, /buildPrompt/i, /PromptContext/i],
82
+ message: 'Prompt 构建过程中出现错误',
83
+ suggestions: [
84
+ '检查插件系统是否正常加载:speccore doctor',
85
+ '查看 .speccore/local/ 目录权限',
86
+ '尝试重启命令',
87
+ ],
88
+ },
89
+ {
90
+ category: '网络/超时',
91
+ severity: 'warn',
92
+ patterns: [/timeout/i, /ETIMEDOUT/i, /ECONNREFUSED/i, /网络/i],
93
+ message: '网络连接超时或失败',
94
+ suggestions: [
95
+ '检查网络连接',
96
+ '如果是 LLM API 调用,检查 API key 是否有效',
97
+ '稍后重试',
98
+ ],
99
+ },
100
+ ];
101
+ /**
102
+ * 诊断错误信息,返回匹配结果和建议
103
+ */
104
+ function diagnoseError(error) {
105
+ const errorStr = String(error);
106
+ const errorMsg = error instanceof Error ? error.message : errorStr;
107
+ for (const pattern of ERROR_PATTERNS) {
108
+ for (const regex of pattern.patterns) {
109
+ if (regex.test(errorMsg) || regex.test(errorStr)) {
110
+ return {
111
+ matched: true,
112
+ category: pattern.category,
113
+ severity: pattern.severity,
114
+ message: pattern.message,
115
+ suggestions: pattern.suggestions,
116
+ };
117
+ }
118
+ }
119
+ }
120
+ return {
121
+ matched: false,
122
+ category: '未知错误',
123
+ severity: 'error',
124
+ message: errorMsg,
125
+ suggestions: [
126
+ '查看详细错误堆栈:添加 --verbose 或 DEBUG=* 环境变量',
127
+ '运行 speccore doctor 检查项目健康度',
128
+ '查阅文档: https://github.com/your-org/speccore#troubleshooting',
129
+ ],
130
+ };
131
+ }
132
+ /**
133
+ * 打印诊断结果
134
+ */
135
+ function printDiagnosis(result) {
136
+ const icon = result.severity === 'error' ? '❌' : result.severity === 'warn' ? '⚠️' : 'ℹ️';
137
+ logger_1.logger.info('');
138
+ logger_1.logger.info(`${icon} 错误诊断: ${result.category}`);
139
+ logger_1.logger.info(` ${result.message}`);
140
+ logger_1.logger.info('');
141
+ logger_1.logger.info('💡 建议修复步骤:');
142
+ for (let i = 0; i < result.suggestions.length; i++) {
143
+ logger_1.logger.info(` ${i + 1}. ${result.suggestions[i]}`);
144
+ }
145
+ logger_1.logger.info('');
146
+ }
147
+ /**
148
+ * 包装函数:自动诊断并打印
149
+ */
150
+ function diagnoseAndPrint(error) {
151
+ const result = diagnoseError(error);
152
+ printDiagnosis(result);
153
+ return result;
154
+ }
155
+ //# sourceMappingURL=error-diagnosis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-diagnosis.js","sourceRoot":"","sources":["../../src/core/error-diagnosis.ts"],"names":[],"mappings":"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"}
@@ -45,4 +45,11 @@ export declare function getCommandMapping(commandId: string): CommandMapping | u
45
45
  * 根据意图类型获取相关命令
46
46
  */
47
47
  export declare function getCommandsByIntent(intent: IntentType): CommandMapping[];
48
+ /** 容易与"普通 AI 对话"混淆的意图 */
49
+ export declare const AMBIGUOUS_INTENTS: Set<IntentType>;
50
+ /**
51
+ * 判断用户输入是否明确与 speccore CLI 操作相关
52
+ * v6.97.0+ 新增:避免"分析代码""讨论需求"等普通聊天被误判为 speccore 操作
53
+ */
54
+ export declare function isSpeccoreOperation(input: string): boolean;
48
55
  //# sourceMappingURL=intent-recognition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent-recognition.d.ts","sourceRoot":"","sources":["../../src/core/intent-recognition.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,WAAW;AACX,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,kBAAkB,GAClB,SAAS,GACT,OAAO,GACP,IAAI,GACJ,MAAM,GACN,QAAQ,GACR,MAAM,GACN,WAAW,GACX,SAAS,GACT,gBAAgB,GAChB,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,UAAU,GACV,MAAM,GACN,OAAO,GACP,cAAc,GACd,kBAAkB,GAClB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,QAAQ,GACR,UAAU,GACV,WAAW,GACX,OAAO,GACP,QAAQ,GACR,UAAU,GACV,cAAc,GACd,cAAc,GACd,SAAS,GACT,UAAU,GACV,YAAY,CAAC;AAEjB,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAgcD;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAsG5E;AA6FD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAIhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,EAAE,CAExD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE/E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,EAAE,CAExE"}
1
+ {"version":3,"file":"intent-recognition.d.ts","sourceRoot":"","sources":["../../src/core/intent-recognition.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,WAAW;AACX,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,kBAAkB,GAClB,SAAS,GACT,OAAO,GACP,IAAI,GACJ,MAAM,GACN,QAAQ,GACR,MAAM,GACN,WAAW,GACX,SAAS,GACT,gBAAgB,GAChB,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,UAAU,GACV,MAAM,GACN,OAAO,GACP,cAAc,GACd,kBAAkB,GAClB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,QAAQ,GACR,UAAU,GACV,WAAW,GACX,OAAO,GACP,QAAQ,GACR,UAAU,GACV,cAAc,GACd,cAAc,GACd,SAAS,GACT,UAAU,GACV,YAAY,CAAC;AAEjB,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA+dD;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA2G5E;AAmID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAIhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,EAAE,CAExD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE/E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,EAAE,CAExE;AA0BD,yBAAyB;AACzB,eAAO,MAAM,iBAAiB,iBAE5B,CAAC;AAEH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG1D"}
@@ -5,11 +5,13 @@
5
5
  * 支持 31 种意图类型、200+ 关键词匹配、置信度计算、上下文感知增强
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AMBIGUOUS_INTENTS = void 0;
8
9
  exports.recognizeIntent = recognizeIntent;
9
10
  exports.getConfidenceLevel = getConfidenceLevel;
10
11
  exports.getAllCommandMappings = getAllCommandMappings;
11
12
  exports.getCommandMapping = getCommandMapping;
12
13
  exports.getCommandsByIntent = getCommandsByIntent;
14
+ exports.isSpeccoreOperation = isSpeccoreOperation;
13
15
  const context_1 = require("./context");
14
16
  // ============================================================
15
17
  // 命令映射表(12 种意图,按优先级排序)
@@ -54,15 +56,46 @@ const COMMAND_MAPPINGS = [
54
56
  description: '创建新迭代 — 生成 STAFFING + 产品需求 + 需求文档目录',
55
57
  args: '--name=<name> --owner=<owner>',
56
58
  },
57
- // 需求分析
59
+ // 需求分析(全局级 + 迭代级 + 任务级 + 重新/补充分析)
58
60
  {
59
61
  id: 'analyze',
60
62
  intent: 'analyze',
61
63
  priority: 90,
62
- triggers: ['分析需求', '需求分析', 'AI分析', '代码分析', '分析代码', '迭代分析', '分析迭代', '本迭代分析', '当前迭代分析'],
63
- patterns: ['分析(.+)需求', '分析(.+)代码', '迭代(.+)分析', '本迭代(.+)分析'],
64
- description: 'AI 分析 — 需求完整性 + 改动范围 + 风险矩阵',
65
- args: '-I <iteration> 或 --scope global --src <dirs>',
64
+ triggers: [
65
+ // 迭代级
66
+ '分析需求', '需求分析', 'AI分析', '代码分析', '分析代码',
67
+ '迭代分析', '分析迭代', '本迭代分析', '当前迭代分析',
68
+ // 全局级(v6.97.0+ 修复:避免全局分析 fallback 到迭代层)
69
+ '全局分析', '全局层分析', '分析全局层', '分析全局',
70
+ '全量分析', '全量层分析', '分析全量层', '分析全量',
71
+ '项目分析', '分析项目', '分析整体架构',
72
+ '分析所有端', '分析所有工程', '跨端分析', '全局架构分析',
73
+ '整体分析', '全项目分析', '项目架构分析',
74
+ '分析整个系统', '分析整个项目', '分析所有源码',
75
+ // 任务级(v6.97.0+ 新增:子任务/单任务分析)
76
+ '任务分析', '分析任务', '子任务分析', '分析子任务',
77
+ 'Task分析', '分析Task', '当前任务分析', '单任务分析',
78
+ // 重新/补充分析(v6.97.0+ 新增:覆盖 --supplement / --sync)
79
+ '重新分析', '再分析', '重新生成分析', '重新跑分析',
80
+ '补充分析', '追加分析', '更新分析', '修正分析',
81
+ '完善分析', '刷新分析', '重新评估', '重新审查',
82
+ ],
83
+ patterns: [
84
+ '分析(.+)需求', '分析(.+)代码',
85
+ '迭代(.+)分析', '本迭代(.+)分析',
86
+ // 全局级匹配模式
87
+ '全局分析(.+)', '全量分析(.+)', '分析所有(.+)',
88
+ '分析项目(.+)', '项目(.+)分析', '整体(.+)分析',
89
+ '跨端(.+)分析', '架构(.+)分析',
90
+ // 任务级匹配模式
91
+ '任务(.+)分析', '分析任务(.+)', '子任务(.+)分析',
92
+ 'Task(.+)分析', '分析Task(.+)',
93
+ // 重新/补充分析匹配模式
94
+ '重新(.+)分析', '再(.+)分析', '补充(.+)分析',
95
+ '更新(.+)分析', '修正(.+)分析', '完善(.+)分析',
96
+ ],
97
+ description: 'AI 分析 — 需求完整性 + 改动范围 + 风险矩阵(支持全局级/迭代级/任务级/重新分析)',
98
+ args: '-I <iteration> 或 --scope global|task --with-code --supplement --sync',
66
99
  },
67
100
  // 任务拆分
68
101
  {
@@ -481,11 +514,17 @@ async function recognizeIntent(input) {
481
514
  let contextAware = false;
482
515
  const contextRule = CONTEXT_RULES[mapping.id];
483
516
  if (contextRule) {
484
- if (activeIteration) {
517
+ // v6.97.0+ 修复:用户明确说全局分析时,不因活跃迭代给迭代级意图加分
518
+ const hasGlobalScope = /全局|全量|所有项目|所有工程|整体架构|跨端|整个系统/.test(input);
519
+ if (activeIteration && !hasGlobalScope) {
485
520
  totalScore += 15;
486
521
  contextAware = true;
487
522
  matched.push('上下文感知: 有活跃迭代');
488
523
  }
524
+ else if (activeIteration && hasGlobalScope && mapping.intent === 'analyze') {
525
+ // 全局分析时,analyze 意图不因活跃迭代加分(避免全局被迭代上下文拉高)
526
+ matched.push('上下文感知: 有活跃迭代,但用户明确全局分析,不加分');
527
+ }
489
528
  else if (mapping.intent === 'execute' ||
490
529
  mapping.intent === 'query_progress') {
491
530
  totalScore -= 20; // 无上下文降权
@@ -571,11 +610,21 @@ function extractParams(input, mapping) {
571
610
  if (iterMatch) {
572
611
  params.iteration = iterMatch[1];
573
612
  }
574
- // 检测 scope 参数(全局分析 vs 迭代分析)
613
+ // 检测 scope 参数(全局分析 vs 迭代分析 vs 任务分析)
614
+ // v6.97.0+ 新增:任务级 scope 映射,优先级高于全局(先匹配先命中)
575
615
  const scopeKeywords = {
576
- '全局': 'global', '所有工程': 'global', '全部工程': 'global',
577
- '所有项目': 'global', '全部项目': 'global', '整个项目': 'global',
578
- '全量': 'global', '整体': 'global', '全部': 'global',
616
+ // 任务级(优先匹配,避免"任务"被误判为迭代级)
617
+ '子任务': 'task', '单任务': 'task',
618
+ '任务级': 'task', '任务层': 'task',
619
+ // 全局级
620
+ '全局': 'global', '全局层': 'global', '全局范围': 'global',
621
+ '全量': 'global', '全量层': 'global', '全量范围': 'global',
622
+ '所有工程': 'global', '全部工程': 'global',
623
+ '所有项目': 'global', '全部项目': 'global', '全项目': 'global',
624
+ '整个项目': 'global', '整个系统': 'global',
625
+ '所有端': 'global', '全部端': 'global',
626
+ '所有源码': 'global', '全部源码': 'global',
627
+ '整体': 'global', '全部': 'global',
579
628
  };
580
629
  for (const [keyword, scopeValue] of Object.entries(scopeKeywords)) {
581
630
  if (input.includes(keyword)) {
@@ -583,6 +632,31 @@ function extractParams(input, mapping) {
583
632
  break;
584
633
  }
585
634
  }
635
+ // 检测任务名(--task 参数)
636
+ // v6.97.0+ 新增:从输入中提取 Task-XXX 或子任务名
637
+ const taskIdMatch = input.match(/Task[\-\s]*(\w+)/i);
638
+ if (taskIdMatch) {
639
+ params.task = `Task-${taskIdMatch[1]}`;
640
+ }
641
+ const taskNameMatch = input.match(/(?:子任务|任务)[::\s]*([^,,。\s]+)/);
642
+ if (taskNameMatch && !params.task) {
643
+ params.task = taskNameMatch[1];
644
+ }
645
+ // 检测 --with-code 参数(源码扫描)
646
+ const codeKeywords = ['源码', '代码', '结合源码', '扫描代码', '读代码', '看代码', 'with-code', 'with code'];
647
+ if (codeKeywords.some(k => input.includes(k))) {
648
+ params.withCode = 'true';
649
+ }
650
+ // 检测重新/补充分析参数(--supplement / --sync)
651
+ // v6.97.0+ 新增:覆盖"重新分析""补充分析""更新分析"等场景
652
+ const supplementKeywords = ['重新', '再', '补充', '追加', '更新', '修正', '完善', '刷新'];
653
+ if (supplementKeywords.some(k => input.includes(k)) && input.includes('分析')) {
654
+ params.supplement = 'true';
655
+ }
656
+ const syncKeywords = ['回写', '同步到', '写回', '局部更新'];
657
+ if (syncKeywords.some(k => input.includes(k))) {
658
+ params.sync = 'true';
659
+ }
586
660
  // 检测工具/平台名称(--tool 参数)
587
661
  const toolKeywords = {
588
662
  'trae': 'trae', 'tree': 'trae',
@@ -643,4 +717,38 @@ function getCommandMapping(commandId) {
643
717
  function getCommandsByIntent(intent) {
644
718
  return COMMAND_MAPPINGS.filter((m) => m.intent === intent);
645
719
  }
720
+ // ═══════════════════════════════════════════════════════════
721
+ // 意图域检测 — 区分 speccore CLI 操作 vs 普通 AI 对话
722
+ // ═══════════════════════════════════════════════════════════
723
+ /** 明确表明用户在使用 speccore 的上下文关键词 */
724
+ const SPECCORE_CONTEXT_KEYWORDS = [
725
+ // 工具名
726
+ 'speccore', 'spec-core', 'spec_ask', 'spec-ask',
727
+ // 迭代/项目管理
728
+ '迭代', 'iteration', 'sprint', 'STAFFING',
729
+ // 全局分析(speccore 专有概念)
730
+ '全局', '全局层', '全量', '全量层', '跨端',
731
+ // 任务/拆分
732
+ '拆分', 'split', '子任务', 'Task-', 'task-',
733
+ // 文档/规格
734
+ 'PRD', 'doc2spec', 'spec2doc', 'ANALYSIS', '020-specs', '030-tasks',
735
+ // 执行相关(明确 speccore 语境)
736
+ 'execute', 'dev --', 'done', 'reindex',
737
+ // 端(speccore 专有概念)
738
+ 'backend', 'frontend', 'h5', 'admin', 'with-code', 'with code',
739
+ // 变更
740
+ '变更', 'change --',
741
+ ];
742
+ /** 容易与"普通 AI 对话"混淆的意图 */
743
+ exports.AMBIGUOUS_INTENTS = new Set([
744
+ 'analyze', 'split', 'execute', 'plan', 'review',
745
+ ]);
746
+ /**
747
+ * 判断用户输入是否明确与 speccore CLI 操作相关
748
+ * v6.97.0+ 新增:避免"分析代码""讨论需求"等普通聊天被误判为 speccore 操作
749
+ */
750
+ function isSpeccoreOperation(input) {
751
+ const lower = input.toLowerCase();
752
+ return SPECCORE_CONTEXT_KEYWORDS.some(kw => lower.includes(kw.toLowerCase()));
753
+ }
646
754
  //# sourceMappingURL=intent-recognition.js.map