speccore 5.15.0 → 5.18.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 (99) hide show
  1. package/README.en.md +8 -8
  2. package/README.md +16 -17
  3. package/dist/cli.js +298 -14
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/analyze.d.ts.map +1 -1
  6. package/dist/commands/analyze.js +179 -47
  7. package/dist/commands/analyze.js.map +1 -1
  8. package/dist/commands/change.d.ts.map +1 -1
  9. package/dist/commands/change.js.map +1 -1
  10. package/dist/commands/config.d.ts +4 -0
  11. package/dist/commands/config.d.ts.map +1 -1
  12. package/dist/commands/config.js +18 -0
  13. package/dist/commands/config.js.map +1 -1
  14. package/dist/commands/context-output.d.ts +7 -0
  15. package/dist/commands/context-output.d.ts.map +1 -0
  16. package/dist/commands/context-output.js +86 -0
  17. package/dist/commands/context-output.js.map +1 -0
  18. package/dist/commands/dev.d.ts +7 -0
  19. package/dist/commands/dev.d.ts.map +1 -0
  20. package/dist/commands/dev.js +179 -0
  21. package/dist/commands/dev.js.map +1 -0
  22. package/dist/commands/execute.d.ts +3 -0
  23. package/dist/commands/execute.d.ts.map +1 -1
  24. package/dist/commands/execute.js +85 -13
  25. package/dist/commands/execute.js.map +1 -1
  26. package/dist/commands/help-quick.d.ts +3 -0
  27. package/dist/commands/help-quick.d.ts.map +1 -0
  28. package/dist/commands/help-quick.js +66 -0
  29. package/dist/commands/help-quick.js.map +1 -0
  30. package/dist/commands/history.d.ts +1 -0
  31. package/dist/commands/history.d.ts.map +1 -1
  32. package/dist/commands/history.js +26 -0
  33. package/dist/commands/history.js.map +1 -1
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/iteration/split.js +134 -3
  37. package/dist/commands/iteration/split.js.map +1 -1
  38. package/dist/commands/lifecycle.d.ts.map +1 -1
  39. package/dist/commands/lifecycle.js +43 -2
  40. package/dist/commands/lifecycle.js.map +1 -1
  41. package/dist/commands/merge-check.d.ts +10 -0
  42. package/dist/commands/merge-check.d.ts.map +1 -0
  43. package/dist/commands/merge-check.js +148 -0
  44. package/dist/commands/merge-check.js.map +1 -0
  45. package/dist/commands/pr.d.ts +9 -0
  46. package/dist/commands/pr.d.ts.map +1 -0
  47. package/dist/commands/pr.js +97 -0
  48. package/dist/commands/pr.js.map +1 -0
  49. package/dist/commands/spec.d.ts.map +1 -1
  50. package/dist/commands/spec.js +5 -1
  51. package/dist/commands/spec.js.map +1 -1
  52. package/dist/commands/status-panel.d.ts +2 -0
  53. package/dist/commands/status-panel.d.ts.map +1 -0
  54. package/dist/commands/status-panel.js +143 -0
  55. package/dist/commands/status-panel.js.map +1 -0
  56. package/dist/commands/tracker.d.ts +2 -0
  57. package/dist/commands/tracker.d.ts.map +1 -0
  58. package/dist/commands/tracker.js +28 -0
  59. package/dist/commands/tracker.js.map +1 -0
  60. package/dist/core/code-scanner.d.ts +26 -0
  61. package/dist/core/code-scanner.d.ts.map +1 -0
  62. package/dist/core/code-scanner.js +223 -0
  63. package/dist/core/code-scanner.js.map +1 -0
  64. package/dist/core/constitution-builder.d.ts +2 -0
  65. package/dist/core/constitution-builder.d.ts.map +1 -0
  66. package/dist/core/constitution-builder.js +216 -0
  67. package/dist/core/constitution-builder.js.map +1 -0
  68. package/dist/core/execution-state.d.ts.map +1 -1
  69. package/dist/core/execution-state.js +4 -0
  70. package/dist/core/execution-state.js.map +1 -1
  71. package/dist/core/intent-ai.d.ts +19 -0
  72. package/dist/core/intent-ai.d.ts.map +1 -0
  73. package/dist/core/intent-ai.js +138 -0
  74. package/dist/core/intent-ai.js.map +1 -0
  75. package/dist/core/requirement-tracker.d.ts +24 -0
  76. package/dist/core/requirement-tracker.d.ts.map +1 -0
  77. package/dist/core/requirement-tracker.js +88 -0
  78. package/dist/core/requirement-tracker.js.map +1 -0
  79. package/dist/core/risk-scorer.d.ts +15 -5
  80. package/dist/core/risk-scorer.d.ts.map +1 -1
  81. package/dist/core/risk-scorer.js +135 -6
  82. package/dist/core/risk-scorer.js.map +1 -1
  83. package/dist/core/spec-annotations.d.ts +35 -0
  84. package/dist/core/spec-annotations.d.ts.map +1 -0
  85. package/dist/core/spec-annotations.js +203 -0
  86. package/dist/core/spec-annotations.js.map +1 -0
  87. package/dist/core/unified-config.d.ts +44 -0
  88. package/dist/core/unified-config.d.ts.map +1 -0
  89. package/dist/core/unified-config.js +141 -0
  90. package/dist/core/unified-config.js.map +1 -0
  91. package/package.json +2 -2
  92. package/dist/commands/hooks.d.ts +0 -5
  93. package/dist/commands/hooks.d.ts.map +0 -1
  94. package/dist/commands/hooks.js +0 -22
  95. package/dist/commands/hooks.js.map +0 -1
  96. package/dist/commands/research.d.ts +0 -14
  97. package/dist/commands/research.d.ts.map +0 -1
  98. package/dist/commands/research.js +0 -181
  99. package/dist/commands/research.js.map +0 -1
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildConstitution = buildConstitution;
4
+ /**
5
+ * constitution-builder — 自动检测项目技术栈,生成/完善 CONSTITUTION.md
6
+ */
7
+ const fs_extra_1 = require("fs-extra");
8
+ const path_1 = require("path");
9
+ const logger_1 = require("../utils/logger");
10
+ const fs_1 = require("fs");
11
+ async function buildConstitution(cwd) {
12
+ const constitutionPath = (0, path_1.join)(cwd, '.speccore', 'PROJECT', 'CONSTITUTION.md');
13
+ // Detect tech stack
14
+ const stack = await detectStack(cwd);
15
+ const rules = generateRules(stack);
16
+ let content = '# 项目技术宪法\n\n';
17
+ content += '> 自动检测 + 人工确认 | 以下规则在 analyze/split 时强制执行\n\n';
18
+ content += `## 技术栈(自动检测)\n\n`;
19
+ content += `| 层级 | 技术 | 来源 |\n`;
20
+ content += `| :--- | :--- | :--- |\n`;
21
+ if (stack.backend)
22
+ content += `| 后端 | ${stack.backend} | ${stack.backendSource} |\n`;
23
+ if (stack.frontend)
24
+ content += `| 前端 | ${stack.frontend} | ${stack.frontendSource} |\n`;
25
+ if (stack.database)
26
+ content += `| 数据库 | ${stack.database} | ${stack.databaseSource} |\n`;
27
+ if (stack.language)
28
+ content += `| 语言 | ${stack.language} | ${stack.languageSource} |\n`;
29
+ content += `\n## 强制规则(自动生成,可手动修改)\n\n`;
30
+ for (const r of rules) {
31
+ const icon = r.enforced ? '🔒' : '💡';
32
+ content += `### ${icon} ${r.category}\n\n`;
33
+ content += `- **规则**: ${r.rule}\n`;
34
+ content += `- **原因**: ${r.reason}\n\n`;
35
+ }
36
+ content += `\n---\n> 编辑此文件后,运行 analyze 和 split 将强制执行这些规则。\n`;
37
+ await (0, fs_extra_1.writeFile)(constitutionPath, content);
38
+ logger_1.logger.info(` 📜 CONSTITUTION.md 已完善(${rules.length} 条规则)`);
39
+ }
40
+ async function detectStack(cwd) {
41
+ const stack = {};
42
+ // pom.xml → Java/Spring
43
+ if ((0, fs_1.existsSync)((0, path_1.join)(cwd, 'pom.xml'))) {
44
+ try {
45
+ const pom = await (0, fs_extra_1.readFile)((0, path_1.join)(cwd, 'pom.xml'), 'utf-8');
46
+ if (pom.includes('spring-boot')) {
47
+ stack.backend = 'Spring Boot';
48
+ stack.backendSource = 'pom.xml';
49
+ }
50
+ else {
51
+ stack.backend = 'Java';
52
+ stack.backendSource = 'pom.xml';
53
+ }
54
+ stack.language = 'Java';
55
+ stack.languageSource = 'pom.xml';
56
+ }
57
+ catch { }
58
+ }
59
+ // build.gradle → Java/Kotlin
60
+ if (!stack.backend && (0, fs_1.existsSync)((0, path_1.join)(cwd, 'build.gradle'))) {
61
+ try {
62
+ const gradle = await (0, fs_extra_1.readFile)((0, path_1.join)(cwd, 'build.gradle'), 'utf-8');
63
+ if (gradle.includes('spring')) {
64
+ stack.backend = 'Spring Boot';
65
+ stack.backendSource = 'build.gradle';
66
+ }
67
+ else {
68
+ stack.backend = 'Java/Kotlin';
69
+ stack.backendSource = 'build.gradle';
70
+ }
71
+ }
72
+ catch { }
73
+ }
74
+ // package.json → Node.js
75
+ if ((0, fs_1.existsSync)((0, path_1.join)(cwd, 'package.json'))) {
76
+ try {
77
+ const pkg = JSON.parse(await (0, fs_extra_1.readFile)((0, path_1.join)(cwd, 'package.json'), 'utf-8'));
78
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
79
+ if (deps['next'] || deps['react']) {
80
+ stack.frontend = 'React/Next.js';
81
+ stack.frontendSource = 'package.json';
82
+ }
83
+ if (deps['vue']) {
84
+ stack.frontend = 'Vue';
85
+ stack.frontendSource = 'package.json';
86
+ }
87
+ if (deps['express'] || deps['koa']) {
88
+ stack.backend = stack.backend || 'Node.js';
89
+ stack.backendSource = 'package.json';
90
+ }
91
+ if (deps['nestjs']) {
92
+ stack.backend = 'NestJS';
93
+ stack.backendSource = 'package.json';
94
+ }
95
+ if (deps['mysql2'] || deps['pg']) {
96
+ stack.database = Object.keys(deps).find(k => deps[k] && ['mysql2', 'pg', 'mongodb'].includes(k)) || 'SQL';
97
+ stack.databaseSource = 'package.json';
98
+ }
99
+ stack.language = stack.language || 'TypeScript';
100
+ stack.languageSource = 'package.json';
101
+ }
102
+ catch { }
103
+ }
104
+ // go.mod → Go
105
+ if ((0, fs_1.existsSync)((0, path_1.join)(cwd, 'go.mod'))) {
106
+ stack.backend = stack.backend || 'Go';
107
+ stack.backendSource = 'go.mod';
108
+ stack.language = 'Go';
109
+ stack.languageSource = 'go.mod';
110
+ }
111
+ // requirements.txt → Python
112
+ if ((0, fs_1.existsSync)((0, path_1.join)(cwd, 'requirements.txt'))) {
113
+ stack.backend = stack.backend || 'Python';
114
+ stack.backendSource = 'requirements.txt';
115
+ stack.language = 'Python';
116
+ stack.languageSource = 'requirements.txt';
117
+ }
118
+ // Scan src/ for framework detection
119
+ if (!stack.backend || !stack.frontend) {
120
+ await scanSourceForFrameworks(cwd, stack);
121
+ }
122
+ return stack;
123
+ }
124
+ async function scanSourceForFrameworks(cwd, stack) {
125
+ const srcDirs = ['src', 'app', 'lib'];
126
+ for (const dir of srcDirs) {
127
+ const full = (0, path_1.join)(cwd, dir);
128
+ if (!(0, fs_1.existsSync)(full))
129
+ continue;
130
+ const files = findFiles(full, /\.(java|ts|tsx|py|go|vue|jsx)$/, 2);
131
+ for (const f of files) {
132
+ if (f.endsWith('.vue') && !stack.frontend) {
133
+ stack.frontend = 'Vue';
134
+ stack.frontendSource = f;
135
+ }
136
+ if (f.endsWith('.java') && !stack.backend) {
137
+ stack.backend = 'Java';
138
+ stack.backendSource = f;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ function findFiles(dir, pattern, maxDepth) {
144
+ const { join } = require('path');
145
+ const results = [];
146
+ try {
147
+ for (const entry of (0, fs_1.readdirSync)(dir, { withFileTypes: true })) {
148
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
149
+ continue;
150
+ const full = join(dir, entry.name);
151
+ if (entry.isDirectory() && maxDepth > 0) {
152
+ results.push(...findFiles(full, pattern, maxDepth - 1));
153
+ }
154
+ else if (entry.isFile() && pattern.test(entry.name)) {
155
+ results.push(full);
156
+ }
157
+ }
158
+ }
159
+ catch { }
160
+ return results;
161
+ }
162
+ function generateRules(stack) {
163
+ const rules = [];
164
+ if (stack.language) {
165
+ rules.push({
166
+ category: '编程语言',
167
+ rule: `所有代码必须使用 ${stack.language}`,
168
+ reason: `项目已使用 ${stack.language},保持一致性`,
169
+ enforced: true,
170
+ });
171
+ }
172
+ if (stack.backend) {
173
+ rules.push({
174
+ category: 'API 规范',
175
+ rule: '所有接口必须使用 RESTful 风格,返回 JSON',
176
+ reason: `${stack.backend} 项目,保持 API 一致性`,
177
+ enforced: true,
178
+ });
179
+ if (stack.backend.includes('Spring')) {
180
+ rules.push({
181
+ category: '框架约束',
182
+ rule: '使用 Spring Boot 约定,Controller → Service → Repository 分层',
183
+ reason: 'Spring Boot 标准分层架构',
184
+ enforced: true,
185
+ });
186
+ }
187
+ }
188
+ if (stack.database) {
189
+ rules.push({
190
+ category: '数据库',
191
+ rule: `数据库使用 ${stack.database},所有表必须有 created_at/updated_at`,
192
+ reason: '标准数据库规范,便于审计',
193
+ enforced: true,
194
+ });
195
+ }
196
+ rules.push({
197
+ category: '错误处理',
198
+ rule: '统一错误码格式:MODULE_XXX + HTTP 状态码',
199
+ reason: '便于前端统一处理和监控告警',
200
+ enforced: true,
201
+ });
202
+ rules.push({
203
+ category: '代码审查',
204
+ rule: '所有代码必须经过 PR 审查才能合并',
205
+ reason: '质量保障',
206
+ enforced: true,
207
+ });
208
+ rules.push({
209
+ category: '测试',
210
+ rule: '新增接口必须有对应的单元测试',
211
+ reason: '避免回归',
212
+ enforced: false,
213
+ });
214
+ return rules;
215
+ }
216
+ //# sourceMappingURL=constitution-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constitution-builder.js","sourceRoot":"","sources":["../../src/core/constitution-builder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"execution-state.d.ts","sourceRoot":"","sources":["../../src/core/execution-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAU,GACpB,cAAc,CA2BhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,cAAc,GAAG,IAAI,CAQ1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAI9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,cAAc,CAoB/G;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAO9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAO1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAGpE;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAWnC"}
1
+ {"version":3,"file":"execution-state.d.ts","sourceRoot":"","sources":["../../src/core/execution-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAU,GACpB,cAAc,CA2BhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,cAAc,GAAG,IAAI,CAQ1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAI9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,cAAc,CAuB/G;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAO9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAO1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAGpE;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAWnC"}
@@ -84,6 +84,10 @@ function completeBatch(state, batchNum, completedTasks) {
84
84
  state.batchStatus[String(nextBatch)].status = 'in_progress';
85
85
  state.batchStatus[String(nextBatch)].startedAt = new Date().toISOString();
86
86
  }
87
+ else {
88
+ // 已经是最后一个批次,标记完成
89
+ state.currentBatch = nextBatch;
90
+ }
87
91
  saveExecutionState(state);
88
92
  return state;
89
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"execution-state.js","sourceRoot":"","sources":["../../src/core/execution-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execution-state.js","sourceRoot":"","sources":["../../src/core/execution-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface AiIntentResult {
2
+ intent: string;
3
+ confidence: number;
4
+ suggestion: string;
5
+ explanation: string;
6
+ }
7
+ /**
8
+ * 用 AI 增强意图识别(当关键词匹配不可靠时)
9
+ * 利用本地 AI/WorkBuddy 的分析能力
10
+ */
11
+ export declare function aiEnhance(input: string, keywordConfidence: number): Promise<AiIntentResult | null>;
12
+ /**
13
+ * 统一入口:关键词 + AI 增强
14
+ */
15
+ export declare function recognizeWithAi(input: string, keywordResults: any[]): Promise<{
16
+ final: any;
17
+ usedAi: boolean;
18
+ }>;
19
+ //# sourceMappingURL=intent-ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-ai.d.ts","sourceRoot":"","sources":["../../src/core/intent-ai.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAcxG;AAqGD;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACnF,KAAK,EAAE,GAAG,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC,CAmBD"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.aiEnhance = aiEnhance;
4
+ exports.recognizeWithAi = recognizeWithAi;
5
+ const logger_1 = require("../utils/logger");
6
+ /**
7
+ * 用 AI 增强意图识别(当关键词匹配不可靠时)
8
+ * 利用本地 AI/WorkBuddy 的分析能力
9
+ */
10
+ async function aiEnhance(input, keywordConfidence) {
11
+ // 只有低置信度时才启动 AI
12
+ if (keywordConfidence >= 50)
13
+ return null;
14
+ logger_1.logger.info(' 🤖 关键词置信度偏低,启用 AI 分析...');
15
+ try {
16
+ const prompt = buildAiPrompt(input);
17
+ const response = await callLocalAi(prompt);
18
+ return parseAiResponse(response);
19
+ }
20
+ catch (error) {
21
+ // AI 不可用时静默降级
22
+ return null;
23
+ }
24
+ }
25
+ function buildAiPrompt(input) {
26
+ return `分析以下中文描述,判断用户想执行什么操作。只返回 JSON。
27
+
28
+ 描述: "${input}"
29
+
30
+ 可用的操作类型:
31
+ - change: 修改/调整已有功能或需求
32
+ - bugfix: 修复错误/Bug
33
+ - new_task: 新增功能或任务
34
+ - execute: 执行/开发/开始干活
35
+ - review: 审查/检查
36
+ - query_progress: 查看进度/状态
37
+ - research: 技术调研/方案评估
38
+ - help: 求助/帮助
39
+
40
+ 返回格式(仅 JSON,不要其他内容):
41
+ {
42
+ "intent": "操作类型",
43
+ "confidence": 0-100,
44
+ "suggestion": "建议的 speccore 命令",
45
+ "explanation": "简短解释"
46
+ }`;
47
+ }
48
+ function callLocalAi(prompt) {
49
+ try {
50
+ // 尝试通过 WorkBuddy 的 AI 能力(进程内调用)
51
+ // fallback: 基于规则给出合理建议
52
+ throw new Error('use fallback');
53
+ }
54
+ catch {
55
+ // 无 AI 可用时,基于关键词深度分析
56
+ return fallbackAnalysis(prompt);
57
+ }
58
+ }
59
+ function fallbackAnalysis(prompt) {
60
+ // 提取描述部分
61
+ const match = prompt.match(/描述: "(.+)"/);
62
+ const input = match ? match[1] : '';
63
+ // 深度关键词分析(比 intent-recognition 更精细)
64
+ const hasProblem = /出问题|报错|挂了|崩了|不行|不正常|超时|500|异常|错误/.test(input);
65
+ const hasChange = /改|调整|换成|替换|修改|优化/.test(input);
66
+ const hasNew = /新增|添加|加一个|创建一个|开发|做一个/.test(input);
67
+ const hasQuery = /多少|进度|状态|怎么|哪些|看看|查看/.test(input);
68
+ let intent = 'help';
69
+ let confidence = 30;
70
+ let suggestion = 'speccore spec "..."';
71
+ let explanation = '无法确定意图,请用 /spec 命令明确说明';
72
+ if (hasProblem && !hasChange && !hasNew) {
73
+ intent = 'bugfix';
74
+ confidence = 55;
75
+ suggestion = 'speccore bugfix --name="自动检测的Bug"';
76
+ explanation = `检测到问题描述("${matchExtract(input, /(?:出问题|报错|挂了|崩了|超时|500)/)}"),建议创建 Bug 修复任务`;
77
+ }
78
+ else if (hasChange && !hasProblem) {
79
+ intent = 'change';
80
+ confidence = 60;
81
+ suggestion = 'speccore change';
82
+ explanation = '检测到修改意图,建议使用需求变更';
83
+ }
84
+ else if (hasNew && !hasProblem) {
85
+ intent = 'new_task';
86
+ confidence = 60;
87
+ suggestion = 'speccore new-task';
88
+ explanation = '检测到新增意图,建议创建新任务';
89
+ }
90
+ else if (hasQuery) {
91
+ intent = 'query_progress';
92
+ confidence = 55;
93
+ suggestion = 'speccore status';
94
+ explanation = '检测到查询意图';
95
+ }
96
+ return JSON.stringify({ intent, confidence, suggestion, explanation });
97
+ }
98
+ function matchExtract(input, pattern) {
99
+ const m = input.match(pattern);
100
+ return m ? m[0] : '';
101
+ }
102
+ function parseAiResponse(response) {
103
+ try {
104
+ // 尝试从 markdown 代码块中提取 JSON
105
+ const jsonMatch = response.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
106
+ const jsonStr = jsonMatch ? jsonMatch[1] : response;
107
+ const parsed = JSON.parse(jsonStr.trim());
108
+ return {
109
+ intent: parsed.intent || 'help',
110
+ confidence: Math.min(100, Math.max(0, Number(parsed.confidence) || 30)),
111
+ suggestion: parsed.suggestion || '',
112
+ explanation: parsed.explanation || '',
113
+ };
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ }
119
+ /**
120
+ * 统一入口:关键词 + AI 增强
121
+ */
122
+ async function recognizeWithAi(input, keywordResults) {
123
+ const topConfidence = keywordResults[0]?.confidence || 0;
124
+ const secondConfidence = keywordResults[1]?.confidence || 0;
125
+ const gap = topConfidence - secondConfidence;
126
+ // 不需要 AI:高置信度 + 差距明显
127
+ if (topConfidence >= 50 && gap >= 20) {
128
+ return { final: keywordResults[0], usedAi: false };
129
+ }
130
+ // 调用 AI 增强
131
+ const aiResult = await aiEnhance(input, topConfidence);
132
+ if (aiResult && aiResult.confidence > topConfidence) {
133
+ logger_1.logger.info(` 🤖 AI 判断: ${aiResult.intent} (${aiResult.confidence}%) — ${aiResult.explanation}`);
134
+ return { final: { ...keywordResults[0], ...aiResult, aiEnhanced: true }, usedAi: true };
135
+ }
136
+ return { final: keywordResults[0], usedAi: false };
137
+ }
138
+ //# sourceMappingURL=intent-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-ai.js","sourceRoot":"","sources":["../../src/core/intent-ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface ReqEntry {
2
+ id: string;
3
+ title: string;
4
+ status: 'active' | 'modified' | 'deprecated';
5
+ originIteration: string;
6
+ lastModifiedIteration?: string;
7
+ changeHistory: {
8
+ iteration: string;
9
+ type: '新增' | '修改' | '废弃';
10
+ timestamp: string;
11
+ }[];
12
+ }
13
+ export declare function loadTracker(): Promise<ReqEntry[]>;
14
+ export declare function saveTracker(entries: ReqEntry[]): Promise<void>;
15
+ /**
16
+ * 注册或更新需求追踪
17
+ * @returns warnings — 跨期次冲突预警
18
+ */
19
+ export declare function registerRequirement(title: string, iteration: string, changeType: '新增' | '修改' | '废弃'): Promise<string[]>;
20
+ /**
21
+ * 生成全量层需求追踪报告 (Markdown)
22
+ */
23
+ export declare function generateTrackerReport(): Promise<string>;
24
+ //# sourceMappingURL=requirement-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement-tracker.d.ts","sourceRoot":"","sources":["../../src/core/requirement-tracker.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrF;AAQD,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAMvD;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CAiDnB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAc7D"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTracker = loadTracker;
4
+ exports.saveTracker = saveTracker;
5
+ exports.registerRequirement = registerRequirement;
6
+ exports.generateTrackerReport = generateTrackerReport;
7
+ /**
8
+ * requirement-tracker — 全量层需求追踪:新增/修改/冲突检测
9
+ */
10
+ const fs_extra_1 = require("fs-extra");
11
+ const path_1 = require("path");
12
+ const TRACKER_PATH = (0, path_1.join)('.speccore', 'GLOBAL', 'REQUIREMENTS', 'tracker.json');
13
+ function trackerPath() {
14
+ return (0, path_1.join)(process.cwd(), TRACKER_PATH);
15
+ }
16
+ async function loadTracker() {
17
+ const p = trackerPath();
18
+ if (await (0, fs_extra_1.pathExists)(p)) {
19
+ return JSON.parse(await (0, fs_extra_1.readFile)(p, 'utf-8'));
20
+ }
21
+ return [];
22
+ }
23
+ async function saveTracker(entries) {
24
+ const p = trackerPath();
25
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(p, '..'));
26
+ await (0, fs_extra_1.writeFile)(p, JSON.stringify(entries, null, 2), 'utf-8');
27
+ }
28
+ /**
29
+ * 注册或更新需求追踪
30
+ * @returns warnings — 跨期次冲突预警
31
+ */
32
+ async function registerRequirement(title, iteration, changeType) {
33
+ const entries = await loadTracker();
34
+ const warnings = [];
35
+ // 按标题模糊匹配已有需求(前 10 字相同视为同一需求)
36
+ const existing = entries.find(e => e.title.slice(0, Math.min(10, e.title.length, title.length)) ===
37
+ title.slice(0, Math.min(10, title.length)));
38
+ const now = new Date().toISOString();
39
+ if (existing) {
40
+ if (changeType === '新增') {
41
+ warnings.push(`⚠️ "${title}" 已在 ${existing.originIteration} 中引入,当前标记为「新增」可能重复`);
42
+ }
43
+ if (changeType === '修改') {
44
+ existing.status = 'modified';
45
+ existing.lastModifiedIteration = iteration;
46
+ existing.changeHistory.push({ iteration, type: '修改', timestamp: now });
47
+ // 检测:是否有其他期次也在修改同一个需求
48
+ const otherModifiers = existing.changeHistory
49
+ .filter(h => h.type === '修改' && h.iteration !== iteration)
50
+ .map(h => h.iteration);
51
+ if (otherModifiers.length > 0) {
52
+ warnings.push(`⚠️ "${title}" 曾在以下期次被修改: ${[...new Set(otherModifiers)].join(', ')} — 注意合并冲突`);
53
+ }
54
+ }
55
+ if (changeType === '废弃') {
56
+ existing.status = 'deprecated';
57
+ existing.changeHistory.push({ iteration, type: '废弃', timestamp: now });
58
+ }
59
+ }
60
+ else {
61
+ // 新需求
62
+ entries.push({
63
+ id: `REQ-${String(entries.length + 1).padStart(3, '0')}`,
64
+ title,
65
+ status: changeType === '废弃' ? 'deprecated' : 'active',
66
+ originIteration: iteration,
67
+ changeHistory: [{ iteration, type: '新增', timestamp: now }],
68
+ });
69
+ }
70
+ await saveTracker(entries);
71
+ return warnings;
72
+ }
73
+ /**
74
+ * 生成全量层需求追踪报告 (Markdown)
75
+ */
76
+ async function generateTrackerReport() {
77
+ const entries = await loadTracker();
78
+ let report = `# 全量需求追踪\n\n`;
79
+ report += `> 自动生成 | ${new Date().toISOString().slice(0, 10)}\n\n`;
80
+ report += `| ID | 需求 | 状态 | 首次期次 | 最近修改 | 变更次数 |\n`;
81
+ report += `| :--- | :--- | :--- | :--- | :--- | :--- |\n`;
82
+ for (const e of entries) {
83
+ const statusEmoji = e.status === 'active' ? '🟢' : e.status === 'modified' ? '🟡' : '⚫';
84
+ report += `| ${e.id} | ${e.title} | ${statusEmoji} ${e.status} | ${e.originIteration} | ${e.lastModifiedIteration || '-'} | ${e.changeHistory.length} |\n`;
85
+ }
86
+ return report;
87
+ }
88
+ //# sourceMappingURL=requirement-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement-tracker.js","sourceRoot":"","sources":["../../src/core/requirement-tracker.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,24 @@
1
- /**
2
- * risk-scorer — 任务风险评分 + 标签
3
- */
1
+ export interface RiskItem {
2
+ category: string;
3
+ level: '🔴' | '🟡' | '🟢';
4
+ description: string;
5
+ mitigation: string;
6
+ source: '需求' | '源码';
7
+ }
4
8
  export interface RiskScore {
5
9
  level: '🔴 high' | '🟡 medium' | '🟢 low';
6
10
  score: number;
7
11
  tags: string[];
8
12
  reasons: string[];
13
+ items: RiskItem[];
14
+ codeRisks: RiskItem[];
9
15
  }
10
16
  /**
11
- * 根据任务需求内容自动评分
17
+ * 根据任务需求内容 + 已有源码自动评分
18
+ */
19
+ export declare function scoreRisk(content: string, taskName: string, iterationDir?: string): Promise<RiskScore>;
20
+ /**
21
+ * 生成详细风险报告(Markdown)
12
22
  */
13
- export declare function scoreRisk(content: string, taskName: string): RiskScore;
23
+ export declare function generateRiskReport(risk: RiskScore): string;
14
24
  //# sourceMappingURL=risk-scorer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"risk-scorer.d.ts","sourceRoot":"","sources":["../../src/core/risk-scorer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CA2DtE"}
1
+ {"version":3,"file":"risk-scorer.d.ts","sourceRoot":"","sources":["../../src/core/risk-scorer.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA4H5G;AA+CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAsB1D"}