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.
- package/README.en.md +8 -8
- package/README.md +16 -17
- package/dist/cli.js +298 -14
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +179 -47
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/change.d.ts.map +1 -1
- package/dist/commands/change.js.map +1 -1
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +18 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/context-output.d.ts +7 -0
- package/dist/commands/context-output.d.ts.map +1 -0
- package/dist/commands/context-output.js +86 -0
- package/dist/commands/context-output.js.map +1 -0
- package/dist/commands/dev.d.ts +7 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +179 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/execute.d.ts +3 -0
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +85 -13
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/help-quick.d.ts +3 -0
- package/dist/commands/help-quick.d.ts.map +1 -0
- package/dist/commands/help-quick.js +66 -0
- package/dist/commands/help-quick.js.map +1 -0
- package/dist/commands/history.d.ts +1 -0
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +26 -0
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/split.js +134 -3
- package/dist/commands/iteration/split.js.map +1 -1
- package/dist/commands/lifecycle.d.ts.map +1 -1
- package/dist/commands/lifecycle.js +43 -2
- package/dist/commands/lifecycle.js.map +1 -1
- package/dist/commands/merge-check.d.ts +10 -0
- package/dist/commands/merge-check.d.ts.map +1 -0
- package/dist/commands/merge-check.js +148 -0
- package/dist/commands/merge-check.js.map +1 -0
- package/dist/commands/pr.d.ts +9 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +97 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/spec.d.ts.map +1 -1
- package/dist/commands/spec.js +5 -1
- package/dist/commands/spec.js.map +1 -1
- package/dist/commands/status-panel.d.ts +2 -0
- package/dist/commands/status-panel.d.ts.map +1 -0
- package/dist/commands/status-panel.js +143 -0
- package/dist/commands/status-panel.js.map +1 -0
- package/dist/commands/tracker.d.ts +2 -0
- package/dist/commands/tracker.d.ts.map +1 -0
- package/dist/commands/tracker.js +28 -0
- package/dist/commands/tracker.js.map +1 -0
- package/dist/core/code-scanner.d.ts +26 -0
- package/dist/core/code-scanner.d.ts.map +1 -0
- package/dist/core/code-scanner.js +223 -0
- package/dist/core/code-scanner.js.map +1 -0
- package/dist/core/constitution-builder.d.ts +2 -0
- package/dist/core/constitution-builder.d.ts.map +1 -0
- package/dist/core/constitution-builder.js +216 -0
- package/dist/core/constitution-builder.js.map +1 -0
- package/dist/core/execution-state.d.ts.map +1 -1
- package/dist/core/execution-state.js +4 -0
- package/dist/core/execution-state.js.map +1 -1
- package/dist/core/intent-ai.d.ts +19 -0
- package/dist/core/intent-ai.d.ts.map +1 -0
- package/dist/core/intent-ai.js +138 -0
- package/dist/core/intent-ai.js.map +1 -0
- package/dist/core/requirement-tracker.d.ts +24 -0
- package/dist/core/requirement-tracker.d.ts.map +1 -0
- package/dist/core/requirement-tracker.js +88 -0
- package/dist/core/requirement-tracker.js.map +1 -0
- package/dist/core/risk-scorer.d.ts +15 -5
- package/dist/core/risk-scorer.d.ts.map +1 -1
- package/dist/core/risk-scorer.js +135 -6
- package/dist/core/risk-scorer.js.map +1 -1
- package/dist/core/spec-annotations.d.ts +35 -0
- package/dist/core/spec-annotations.d.ts.map +1 -0
- package/dist/core/spec-annotations.js +203 -0
- package/dist/core/spec-annotations.js.map +1 -0
- package/dist/core/unified-config.d.ts +44 -0
- package/dist/core/unified-config.d.ts.map +1 -0
- package/dist/core/unified-config.js +141 -0
- package/dist/core/unified-config.js.map +1 -0
- package/package.json +2 -2
- package/dist/commands/hooks.d.ts +0 -5
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js +0 -22
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/research.d.ts +0 -14
- package/dist/commands/research.d.ts.map +0 -1
- package/dist/commands/research.js +0 -181
- 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,
|
|
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":";AAAA;;;;;GAKG;;AA+BH,gDA+BC;AAKD,gDAQC;AAKD,gDAIC;AAKD,
|
|
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
|
-
|
|
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
|
|
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":"
|
|
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"}
|