speccore 5.69.4 → 5.69.5
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/dist/commands/pr.d.ts +2 -0
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +114 -157
- package/dist/commands/pr.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/pr.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoIjE"}
|
package/dist/commands/pr.js
CHANGED
|
@@ -2,182 +2,139 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.prCommand = prCommand;
|
|
4
4
|
/**
|
|
5
|
-
* pr —
|
|
5
|
+
* pr — AI 辅助:总结变更 + 检查分析对齐 + 安全提交
|
|
6
|
+
* 🔒 AI 命令,通过 --prompt/--response 协作
|
|
6
7
|
*/
|
|
7
8
|
const fs_extra_1 = require("fs-extra");
|
|
8
9
|
const path_1 = require("path");
|
|
9
10
|
const child_process_1 = require("child_process");
|
|
10
11
|
const logger_1 = require("../utils/logger");
|
|
11
12
|
const context_1 = require("../core/context");
|
|
12
|
-
const readline_1 = require("readline");
|
|
13
|
-
const prompt_builder_1 = require("../core/prompt-builder");
|
|
14
|
-
function promptUser(q) {
|
|
15
|
-
const rl = (0, readline_1.createInterface)({ input: process.stdin, output: process.stdout });
|
|
16
|
-
return new Promise(r => rl.question(`${q} `, a => { rl.close(); r(a.trim()); }));
|
|
17
|
-
}
|
|
18
13
|
async function prCommand(options) {
|
|
19
|
-
// ── Prompt
|
|
14
|
+
// ── Prompt 模式:输出分析 Prompt 给 AI ──
|
|
20
15
|
if (options.prompt) {
|
|
21
16
|
const iter = options.iteration || await (0, context_1.getDefaultIteration)();
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
// ── Response 模式 ──
|
|
28
|
-
if (options.response && options.task) {
|
|
29
|
-
logger_1.logger.success(`✅ PR 描述已生成:\n${options.response}`);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
|
|
33
|
-
if (!iteration) {
|
|
34
|
-
logger_1.logger.error('No active iteration');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
const iterDir = `Iteration-${iteration}`;
|
|
38
|
-
let taskId = options.task;
|
|
39
|
-
if (!taskId) {
|
|
40
|
-
const branch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
41
|
-
const match = branch.match(/feature\/(Task-\d+)/);
|
|
42
|
-
if (match)
|
|
43
|
-
taskId = match[1];
|
|
44
|
-
}
|
|
45
|
-
if (!taskId) {
|
|
46
|
-
logger_1.logger.error('请用 --task 指定任务');
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const fs = require('fs');
|
|
50
|
-
const entries = fs.readdirSync(iterDir, { withFileTypes: true });
|
|
51
|
-
const taskEntry = entries.find((e) => e.isDirectory() && e.name.startsWith(taskId));
|
|
52
|
-
if (!taskEntry) {
|
|
53
|
-
logger_1.logger.error(`Task 未找到: ${taskId}`);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const taskName = taskEntry.name;
|
|
57
|
-
const backendDir = (0, path_1.join)(iterDir, taskName, 'backend');
|
|
58
|
-
try {
|
|
59
|
-
const branch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
60
|
-
// ── Interactive mode ──
|
|
61
|
-
if (options.interactive) {
|
|
62
|
-
await interactivePrFlow(branch, backendDir, taskName, iteration, options);
|
|
17
|
+
if (!iter) {
|
|
18
|
+
logger_1.logger.error('No active iteration');
|
|
19
|
+
process.exit(11);
|
|
63
20
|
return;
|
|
64
21
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
(0, child_process_1.execSync)(
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
22
|
+
const taskId = options.task || 'current';
|
|
23
|
+
// 收集变更信息
|
|
24
|
+
const changedFiles = (0, child_process_1.execSync)('git diff --name-only HEAD', { encoding: 'utf-8' }).trim();
|
|
25
|
+
const stagedFiles = (0, child_process_1.execSync)('git diff --cached --name-only', { encoding: 'utf-8' }).trim();
|
|
26
|
+
const diff = (0, child_process_1.execSync)('git diff HEAD', { encoding: 'utf-8', maxBuffer: 50 * 1024 * 1024 }).trim();
|
|
27
|
+
// 读取分析文档
|
|
28
|
+
let analysis = '';
|
|
29
|
+
if (taskId !== 'current') {
|
|
30
|
+
const iterDir = (0, path_1.join)(process.cwd(), `Iteration-${iter}`);
|
|
31
|
+
try {
|
|
32
|
+
const fs = require('fs');
|
|
33
|
+
const entries = fs.readdirSync(iterDir, { withFileTypes: true });
|
|
34
|
+
const taskEntry = entries.find((e) => e.isDirectory() && e.name.includes(taskId));
|
|
35
|
+
if (taskEntry) {
|
|
36
|
+
const analysisPath = (0, path_1.join)(iterDir, taskEntry.name, 'ANALYSIS.md');
|
|
37
|
+
if (await (0, fs_extra_1.pathExists)(analysisPath)) {
|
|
38
|
+
analysis = await (0, fs_extra_1.readFile)(analysisPath, 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch { }
|
|
43
|
+
}
|
|
44
|
+
// 构建 Prompt
|
|
45
|
+
const prompt = [
|
|
46
|
+
'# SpecCore PR — 变更分析 + 安全检查',
|
|
47
|
+
'',
|
|
48
|
+
'## 你的任务',
|
|
49
|
+
'1. 分析下面的 git 变更,用中文生成一条简洁的 commit 信息(< 72 字)',
|
|
50
|
+
'2. 对照 ANALYSIS.md 中的需求/分析内容,判断当前变更是否对齐分析范围',
|
|
51
|
+
'3. 返回 JSON 格式结果',
|
|
52
|
+
'',
|
|
53
|
+
'## 变更文件',
|
|
54
|
+
changedFiles || '(无变更文件)',
|
|
55
|
+
'',
|
|
56
|
+
'## 暂存文件',
|
|
57
|
+
stagedFiles || '(无暂存文件)',
|
|
58
|
+
'',
|
|
59
|
+
'## 变更差异 (diff)',
|
|
60
|
+
diff ? `\`\`\`\n${diff.slice(0, 8000)}\n\`\`\`` : '(无差异)',
|
|
61
|
+
'',
|
|
62
|
+
'## 分析文档 (ANALYSIS.md)',
|
|
63
|
+
analysis ? `\`\`\`\n${analysis.slice(0, 3000)}\n\`\`\`` : '(无可用分析文档,跳过对照检查)',
|
|
64
|
+
'',
|
|
65
|
+
'## 输出格式',
|
|
66
|
+
'请返回如下 JSON:',
|
|
67
|
+
'```json',
|
|
68
|
+
'{',
|
|
69
|
+
' "commitMsg": "提交信息(中文,<72字)",',
|
|
70
|
+
' "analysisMatch": true|false,',
|
|
71
|
+
' "mismatchReason": "不匹配原因(仅 analysisMatch=false 时填写)",',
|
|
72
|
+
' "recommendation": "建议:auto-commit 或 confirm-first"',
|
|
73
|
+
'}',
|
|
74
|
+
'```',
|
|
75
|
+
'',
|
|
76
|
+
'## 规则',
|
|
77
|
+
'- analysisMatch=true:变更内容符合分析范围,可以直接提交',
|
|
78
|
+
'- analysisMatch=false:变更超出分析范围,建议用户先确认',
|
|
79
|
+
'- 若无分析文档,analysisMatch 填 true,但 recommend 填 "confirm-first"',
|
|
80
|
+
].join('\n');
|
|
81
|
+
process.stdout.write(`[SPECCORE_PROMPT]\n${prompt}\n[/SPECCORE_PROMPT]`);
|
|
82
|
+
process.exitCode = 10;
|
|
92
83
|
return;
|
|
93
84
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
85
|
+
// ── Response 模式:AI 返回结果,CLI 执行提交 ──
|
|
86
|
+
if (options.response) {
|
|
87
|
+
try {
|
|
88
|
+
const result = JSON.parse(options.response);
|
|
89
|
+
const commitMsg = result.commitMsg || 'Auto commit by SpecCore';
|
|
90
|
+
const analysisMatch = result.analysisMatch !== false;
|
|
91
|
+
const userConfirm = options.confirm;
|
|
92
|
+
// 如果分析不匹配且用户未要求确认,提示并返回
|
|
93
|
+
if (!analysisMatch && !userConfirm) {
|
|
94
|
+
process.stdout.write(`[SPECCORE_CONFIRM_NEEDED]\n不匹配原因: ${result.mismatchReason || '未知'}\n建议先确认再提交。使用 --confirm 强制执行。\n[/SPECCORE_CONFIRM_NEEDED]`);
|
|
95
|
+
process.exitCode = 11;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// 安全提交
|
|
99
|
+
const staged = (0, child_process_1.execSync)('git diff --cached --name-only', { encoding: 'utf-8' }).trim();
|
|
100
|
+
if (!staged) {
|
|
101
|
+
(0, child_process_1.execSync)('git add -A', { stdio: 'pipe' });
|
|
102
|
+
logger_1.logger.info('✅ 已暂存全部变更');
|
|
103
|
+
}
|
|
104
|
+
(0, child_process_1.execSync)(`git commit -m "${commitMsg.replace(/"/g, '\\"')}"`, { stdio: 'pipe' });
|
|
105
|
+
logger_1.logger.success(`✅ 已提交: ${commitMsg}`);
|
|
106
|
+
// 推送
|
|
107
|
+
const branch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
108
|
+
if (branch !== 'main' && branch !== 'master') {
|
|
109
|
+
(0, child_process_1.execSync)(`git push -u origin "${branch}"`, { stdio: 'pipe' });
|
|
110
|
+
logger_1.logger.success(`✅ 已推送: ${branch}`);
|
|
111
|
+
}
|
|
112
|
+
// 输出结果
|
|
113
|
+
process.stdout.write(`[SPECCORE_RESULT]\n${JSON.stringify({ committed: true, message: commitMsg, branch, analysisMatch })}\n[/SPECCORE_RESULT]`);
|
|
107
114
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
logger_1.logger.info('✅ 已添加全部文件');
|
|
112
|
-
}
|
|
113
|
-
// 3. commit(如果有 staged 文件)
|
|
114
|
-
const staged = (0, child_process_1.execSync)('git diff --cached --name-only', { encoding: 'utf-8' }).trim();
|
|
115
|
-
if (staged) {
|
|
116
|
-
logger_1.logger.info(`\n📦 待提交:\n${staged}\n`);
|
|
117
|
-
const commitAns = await promptUser('是否 commit? [y/n]: ');
|
|
118
|
-
if (commitAns === 'y') {
|
|
119
|
-
const msg = await promptUser(`Commit 信息(默认: ${taskName}): `);
|
|
120
|
-
(0, child_process_1.execSync)(`git commit -m "${msg || taskName}"`, { stdio: 'pipe' });
|
|
121
|
-
logger_1.logger.info('✅ 已 commit');
|
|
115
|
+
catch (e) {
|
|
116
|
+
logger_1.logger.error(`解析失败: ${e}`);
|
|
117
|
+
process.exitCode = 1;
|
|
122
118
|
}
|
|
123
|
-
}
|
|
124
|
-
// 4. 推送
|
|
125
|
-
const pushAns = await promptUser('\n推送到 origin? [y/n]: ');
|
|
126
|
-
if (pushAns !== 'y') {
|
|
127
|
-
logger_1.logger.info('已取消推送');
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
(0, child_process_1.execSync)(`git push -u origin "${branch}"`, { stdio: 'pipe' });
|
|
131
|
-
logger_1.logger.info(`✅ 已推送 ${branch}`);
|
|
132
|
-
// 5. 创建 PR
|
|
133
|
-
const prAns = await promptUser('\n创建 PR? [y/n]: ');
|
|
134
|
-
if (prAns !== 'y') {
|
|
135
|
-
logger_1.logger.info('已跳过 PR 创建');
|
|
136
119
|
return;
|
|
137
120
|
}
|
|
138
|
-
|
|
121
|
+
// ── 默认模式:轻量级直接提交(无分析对照)──
|
|
122
|
+
const branch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
123
|
+
const spinner = new logger_1.Spinner('提交变更...');
|
|
139
124
|
spinner.start();
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
async function updateTaskMd(backendDir, prUrl) {
|
|
150
|
-
const taskMdPath = (0, path_1.join)(backendDir, 'TASK.md');
|
|
151
|
-
if (!(await (0, fs_extra_1.pathExists)(taskMdPath)))
|
|
152
|
-
return;
|
|
153
|
-
let md = await (0, fs_extra_1.readFile)(taskMdPath, 'utf-8');
|
|
154
|
-
if (!md.includes('## PR')) {
|
|
155
|
-
md += `\n\n## PR\n\n| URL | 状态 |\n| :--- | :--- |\n| ${prUrl} | 🔄 待审查 |\n`;
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
md = md.replace('| :--- | :--- |\n', `| :--- | :--- |\n| ${prUrl} | 🔄 待审查 |\n`);
|
|
159
|
-
}
|
|
160
|
-
await require('fs-extra').writeFile(taskMdPath, md);
|
|
161
|
-
}
|
|
162
|
-
async function buildPrBody(backendDir, taskName, iteration) {
|
|
163
|
-
let body = `## ${taskName}\n\n`;
|
|
164
|
-
// Add REQ summary
|
|
165
|
-
const reqPath = (0, path_1.join)(backendDir, 'REQ.md');
|
|
166
|
-
if (await (0, fs_extra_1.pathExists)(reqPath)) {
|
|
167
|
-
const req = await (0, fs_extra_1.readFile)(reqPath, 'utf-8');
|
|
168
|
-
const desc = req.match(/## 需求描述\n([\s\S]*?)(?=\n##|\n\|\|$)/);
|
|
169
|
-
if (desc)
|
|
170
|
-
body += `### 📋 需求\n${desc[1].trim()}\n\n`;
|
|
125
|
+
try {
|
|
126
|
+
(0, child_process_1.execSync)('git add -A', { stdio: 'pipe' });
|
|
127
|
+
const msg = options.title || `SpecCore auto commit`;
|
|
128
|
+
(0, child_process_1.execSync)(`git commit -m "${msg}"`, { stdio: 'pipe' });
|
|
129
|
+
spinner.stop(`✅ 已提交: ${msg}`);
|
|
130
|
+
if (branch !== 'main' && branch !== 'master') {
|
|
131
|
+
(0, child_process_1.execSync)(`git push -u origin "${branch}"`, { stdio: 'pipe' });
|
|
132
|
+
logger_1.logger.info(`✅ 已推送: ${branch}`);
|
|
133
|
+
}
|
|
171
134
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const test = await (0, fs_extra_1.readFile)(testPath, 'utf-8');
|
|
176
|
-
const total = (test.match(/\[[ x]\]/g) || []).length;
|
|
177
|
-
const checked = (test.match(/\[x\]/gi) || []).length;
|
|
178
|
-
body += `### 🧪 测试\n${checked}/${total} 项完成\n\n`;
|
|
135
|
+
catch (error) {
|
|
136
|
+
spinner.fail('提交失败');
|
|
137
|
+
logger_1.logger.error(String(error));
|
|
179
138
|
}
|
|
180
|
-
body += `---\n> 由 SpecCore 自动生成 | 迭代: ${iteration}`;
|
|
181
|
-
return body;
|
|
182
139
|
}
|
|
183
140
|
//# sourceMappingURL=pr.js.map
|
package/dist/commands/pr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}
|