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
package/dist/commands/config.js
CHANGED
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.installHooks = installHooks;
|
|
3
4
|
exports.configCommand = configCommand;
|
|
4
5
|
const fs_extra_1 = require("fs-extra");
|
|
5
6
|
const logger_1 = require("../utils/logger");
|
|
6
7
|
const CONFIG_PATH = '.speccore/SETTINGS.md';
|
|
8
|
+
/**
|
|
9
|
+
* Install Git hooks (pre-commit + pre-push)
|
|
10
|
+
*/
|
|
11
|
+
function installHooks() {
|
|
12
|
+
try {
|
|
13
|
+
const { installGitHooks } = require('../core/git-integration');
|
|
14
|
+
const result = installGitHooks();
|
|
15
|
+
logger_1.logger.success('Git hooks installed:');
|
|
16
|
+
if (result.preCommit)
|
|
17
|
+
logger_1.logger.info(' .git/hooks/pre-commit (check @spec annotations)');
|
|
18
|
+
if (result.prePush)
|
|
19
|
+
logger_1.logger.info(' .git/hooks/pre-push (run speccore validate)');
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
logger_1.logger.error('Failed to install Git hooks: ' + error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
7
25
|
async function configCommand(options) {
|
|
8
26
|
const spinner = new logger_1.Spinner('Processing configuration');
|
|
9
27
|
spinner.start();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-output.d.ts","sourceRoot":"","sources":["../../src/commands/context-output.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CAC9B;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4E3E"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.contextCommand = contextCommand;
|
|
4
|
+
/**
|
|
5
|
+
* context — 输出任务完整上下文,供任何 AI 使用
|
|
6
|
+
*/
|
|
7
|
+
const fs_extra_1 = require("fs-extra");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
const unified_config_1 = require("../core/unified-config");
|
|
11
|
+
const context_1 = require("../core/context");
|
|
12
|
+
async function contextCommand(options) {
|
|
13
|
+
const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
|
|
14
|
+
if (!iteration) {
|
|
15
|
+
logger_1.logger.error('No active iteration');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const iterDir = `期次-${iteration}`;
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
// Find task
|
|
21
|
+
let taskId = options.task;
|
|
22
|
+
if (!taskId) {
|
|
23
|
+
const entries = fs.readdirSync(iterDir, { withFileTypes: true });
|
|
24
|
+
const tasks = entries.filter((e) => e.isDirectory() && e.name.startsWith('Task-'));
|
|
25
|
+
if (tasks.length === 0) {
|
|
26
|
+
logger_1.logger.error('No tasks found');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
taskId = tasks[0].name;
|
|
30
|
+
}
|
|
31
|
+
const entries = fs.readdirSync(iterDir, { withFileTypes: true });
|
|
32
|
+
const taskEntry = entries.find((e) => e.isDirectory() && e.name.startsWith(taskId));
|
|
33
|
+
if (!taskEntry) {
|
|
34
|
+
logger_1.logger.error(`Task not found: ${taskId}`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const backendDir = (0, path_1.join)(iterDir, taskEntry.name, 'backend');
|
|
38
|
+
const sharedDir = (0, path_1.join)(iterDir, taskEntry.name, '_shared');
|
|
39
|
+
const config = await (0, unified_config_1.loadConfig)();
|
|
40
|
+
// Collect context
|
|
41
|
+
const context = [];
|
|
42
|
+
// CONSTITUTION
|
|
43
|
+
const constitutionPath = '.speccore/PROJECT/CONSTITUTION.md';
|
|
44
|
+
if (await (0, fs_extra_1.pathExists)(constitutionPath)) {
|
|
45
|
+
const constitution = await (0, fs_extra_1.readFile)(constitutionPath, 'utf-8');
|
|
46
|
+
context.push('## 项目宪法(必须遵守)\n');
|
|
47
|
+
context.push(constitution);
|
|
48
|
+
}
|
|
49
|
+
// REQ
|
|
50
|
+
if (await (0, fs_extra_1.pathExists)((0, path_1.join)(backendDir, 'REQ.md'))) {
|
|
51
|
+
context.push('\n## 需求规格\n');
|
|
52
|
+
context.push(await (0, fs_extra_1.readFile)((0, path_1.join)(backendDir, 'REQ.md'), 'utf-8'));
|
|
53
|
+
}
|
|
54
|
+
// TECH
|
|
55
|
+
if (await (0, fs_extra_1.pathExists)((0, path_1.join)(backendDir, 'TECH.md'))) {
|
|
56
|
+
context.push('\n## 技术方案\n');
|
|
57
|
+
const tech = await (0, fs_extra_1.readFile)((0, path_1.join)(backendDir, 'TECH.md'), 'utf-8');
|
|
58
|
+
context.push(tech.slice(0, 2000)); // limit
|
|
59
|
+
}
|
|
60
|
+
// API Contract
|
|
61
|
+
if (await (0, fs_extra_1.pathExists)((0, path_1.join)(sharedDir, 'API_CONTRACT.yaml'))) {
|
|
62
|
+
context.push('\n## API 契约\n```yaml');
|
|
63
|
+
context.push(await (0, fs_extra_1.readFile)((0, path_1.join)(sharedDir, 'API_CONTRACT.yaml'), 'utf-8'));
|
|
64
|
+
context.push('```');
|
|
65
|
+
}
|
|
66
|
+
// TEST
|
|
67
|
+
if (await (0, fs_extra_1.pathExists)((0, path_1.join)(backendDir, 'TEST.md'))) {
|
|
68
|
+
context.push('\n## 测试要求\n');
|
|
69
|
+
const test = await (0, fs_extra_1.readFile)((0, path_1.join)(backendDir, 'TEST.md'), 'utf-8');
|
|
70
|
+
context.push(test.slice(0, 1000));
|
|
71
|
+
}
|
|
72
|
+
// Tech stack
|
|
73
|
+
if (config.tech_stack) {
|
|
74
|
+
context.push('\n## 技术栈\n');
|
|
75
|
+
for (const [k, v] of Object.entries(config.tech_stack)) {
|
|
76
|
+
if (v)
|
|
77
|
+
context.push(`- ${k}: ${v}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const output = context.join('\n');
|
|
81
|
+
logger_1.logger.info(`\n📋 ${taskEntry.name} 上下文 (${output.length} 字符):\n`);
|
|
82
|
+
logger_1.logger.info(output);
|
|
83
|
+
logger_1.logger.info('\n---');
|
|
84
|
+
logger_1.logger.info('💡 复制以上内容到任何 AI 工具(Copilot/Claude/GPT),基于 Spec 生成代码');
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=context-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-output.js","sourceRoot":"","sources":["../../src/commands/context-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAmBA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FnE"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.devCommand = devCommand;
|
|
4
|
+
/**
|
|
5
|
+
* dev — 智能开发入口(对标 Spec-Kit 的 5-slash 体验)
|
|
6
|
+
*
|
|
7
|
+
* 自动检测当前阶段,一键推进到下一步。无需记住 65 个命令。
|
|
8
|
+
*
|
|
9
|
+
* 阶段检测:
|
|
10
|
+
* init? → 引导初始化
|
|
11
|
+
* 有需求文档? → analyze
|
|
12
|
+
* 有 ANALYSIS.md? → split
|
|
13
|
+
* 有 Task? → execute
|
|
14
|
+
* 有代码? → lifecycle → pr
|
|
15
|
+
* 有 PR? → merge-check → done
|
|
16
|
+
*/
|
|
17
|
+
const fs_extra_1 = require("fs-extra");
|
|
18
|
+
const path_1 = require("path");
|
|
19
|
+
const child_process_1 = require("child_process");
|
|
20
|
+
const logger_1 = require("../utils/logger");
|
|
21
|
+
const context_1 = require("../core/context");
|
|
22
|
+
async function devCommand(options) {
|
|
23
|
+
const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
|
|
24
|
+
if (!iteration) {
|
|
25
|
+
// Phase 0: 未初始化
|
|
26
|
+
logger_1.logger.info('\n🔍 检测到项目尚未初始化');
|
|
27
|
+
logger_1.logger.info('');
|
|
28
|
+
logger_1.logger.info('下一步: speccore init');
|
|
29
|
+
logger_1.logger.info('用途: 初始化 SpecCore 项目结构');
|
|
30
|
+
if (!options.force)
|
|
31
|
+
return;
|
|
32
|
+
(0, child_process_1.execSync)('speccore init', { stdio: 'inherit' });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const iterDir = `期次-${iteration}`;
|
|
36
|
+
logger_1.logger.info(`\n📍 期次: ${iteration}`);
|
|
37
|
+
logger_1.logger.info('');
|
|
38
|
+
// Phase 1: Check for requirement docs
|
|
39
|
+
const reqDoc = (0, path_1.join)(iterDir, '00-需求文档', 'REQUIREMENT.md');
|
|
40
|
+
if (!(await (0, fs_extra_1.pathExists)(reqDoc))) {
|
|
41
|
+
showPhase('导入需求', [
|
|
42
|
+
'speccore word2spec --files "doc.docx=端名" -i ' + iteration,
|
|
43
|
+
'将 Word/MD 需求文档导入为 Spec 格式',
|
|
44
|
+
]);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Phase 2: Check for ANALYSIS.md
|
|
48
|
+
const analysis = (0, path_1.join)(iterDir, '00-需求文档', 'ANALYSIS.md');
|
|
49
|
+
if (!(await (0, fs_extra_1.pathExists)(analysis))) {
|
|
50
|
+
showPhase('分析需求', [
|
|
51
|
+
'speccore analyze --iteration=' + iteration,
|
|
52
|
+
'自动扫描完整性 + 源码对标 + 宪法检查',
|
|
53
|
+
]);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Phase 3: Check for tasks
|
|
57
|
+
const hasTasks = await hasTaskDirs(iterDir);
|
|
58
|
+
if (!hasTasks) {
|
|
59
|
+
showPhase('拆分任务', [
|
|
60
|
+
'speccore iteration split --iteration=' + iteration,
|
|
61
|
+
'拆分为独立 Task,生成 11 份文档',
|
|
62
|
+
]);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Phase 4: Check task execution status
|
|
66
|
+
const pendingTasks = await getPendingTasks(iterDir);
|
|
67
|
+
if (pendingTasks.length > 0) {
|
|
68
|
+
const first = pendingTasks[0];
|
|
69
|
+
showPhase(`执行任务 (${pendingTasks.length} 个待开发)`, [
|
|
70
|
+
`speccore execute --task=${first} --force`,
|
|
71
|
+
pendingTasks.length > 3
|
|
72
|
+
? `speccore execute --all --batch-size=3 --force (批量执行)`
|
|
73
|
+
: `speccore execute --all --force (全部执行)`,
|
|
74
|
+
`speccore execute --task=${first} --agent=trae (委派外部AI)`,
|
|
75
|
+
]);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Phase 5: Check lifecycle state
|
|
79
|
+
const inProgress = await getTasksInState(iterDir, 'testing|in_progress');
|
|
80
|
+
if (inProgress.length > 0) {
|
|
81
|
+
showPhase('推进生命周期', [
|
|
82
|
+
`speccore lifecycle --task=${inProgress[0]} --status=testing`,
|
|
83
|
+
`speccore lifecycle --task=${inProgress[0]} --status=review`,
|
|
84
|
+
'质量关卡: TEST.md 完成 → testing, REVIEW.md 审批 → review',
|
|
85
|
+
]);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Phase 6: Ready for PR
|
|
89
|
+
const toReview = await getTasksInState(iterDir, 'review');
|
|
90
|
+
if (toReview.length > 0) {
|
|
91
|
+
showPhase('创建 PR + 合并', [
|
|
92
|
+
`speccore pr --task=${toReview[0]}`,
|
|
93
|
+
'speccore merge-check --iteration=' + iteration,
|
|
94
|
+
'speccore lifecycle --task=' + toReview[0] + ' --status=done',
|
|
95
|
+
]);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Phase 7: All done
|
|
99
|
+
logger_1.logger.info('✨ 所有任务已完成!');
|
|
100
|
+
logger_1.logger.info('');
|
|
101
|
+
logger_1.logger.info('收尾操作:');
|
|
102
|
+
logger_1.logger.info(' speccore done --task=Task-001 一键归档');
|
|
103
|
+
logger_1.logger.info(' speccore arch-update 更新架构文档');
|
|
104
|
+
logger_1.logger.info(' speccore dashboard 查看全景');
|
|
105
|
+
logger_1.logger.info(' speccore retro 迭代回顾');
|
|
106
|
+
}
|
|
107
|
+
function showPhase(title, steps) {
|
|
108
|
+
logger_1.logger.info(`📋 ${title}`);
|
|
109
|
+
logger_1.logger.info('');
|
|
110
|
+
for (let i = 0; i < steps.length; i++) {
|
|
111
|
+
if (i % 2 === 0) {
|
|
112
|
+
logger_1.logger.info(` ${steps[i]}`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
logger_1.logger.info(` ${steps[i]}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
logger_1.logger.info('');
|
|
119
|
+
logger_1.logger.info('💡 输入 speccore dev --force 自动执行下一步');
|
|
120
|
+
}
|
|
121
|
+
async function hasTaskDirs(iterDir) {
|
|
122
|
+
try {
|
|
123
|
+
const entries = await (0, fs_extra_1.readdir)(iterDir, { withFileTypes: true });
|
|
124
|
+
return entries.some(e => e.isDirectory() && e.name.startsWith('Task-'));
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function getPendingTasks(iterDir) {
|
|
131
|
+
try {
|
|
132
|
+
const entries = await (0, fs_extra_1.readdir)(iterDir, { withFileTypes: true });
|
|
133
|
+
const tasks = entries.filter(e => e.isDirectory() && e.name.startsWith('Task-'));
|
|
134
|
+
const pending = [];
|
|
135
|
+
for (const t of tasks) {
|
|
136
|
+
const taskMd = (0, path_1.join)(iterDir, t.name, 'backend', 'TASK.md');
|
|
137
|
+
if (await (0, fs_extra_1.pathExists)(taskMd)) {
|
|
138
|
+
const { readFile } = require('fs-extra');
|
|
139
|
+
const content = await readFile(taskMd, 'utf-8');
|
|
140
|
+
if (content.includes('待开发') || content.includes('in_progress')) {
|
|
141
|
+
pending.push(t.name);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
pending.push(t.name);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return pending;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async function getTasksInState(iterDir, states) {
|
|
155
|
+
try {
|
|
156
|
+
const entries = await (0, fs_extra_1.readdir)(iterDir, { withFileTypes: true });
|
|
157
|
+
const tasks = entries.filter(e => e.isDirectory() && e.name.startsWith('Task-'));
|
|
158
|
+
const result = [];
|
|
159
|
+
const stateList = states.split('|');
|
|
160
|
+
for (const t of tasks) {
|
|
161
|
+
const taskMd = (0, path_1.join)(iterDir, t.name, 'backend', 'TASK.md');
|
|
162
|
+
if (await (0, fs_extra_1.pathExists)(taskMd)) {
|
|
163
|
+
const { readFile } = require('fs-extra');
|
|
164
|
+
const content = await readFile(taskMd, 'utf-8');
|
|
165
|
+
for (const s of stateList) {
|
|
166
|
+
if (content.includes(s)) {
|
|
167
|
+
result.push(t.name);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":";;AAwBA,gCA2FC;AAnHD;;;;;;;;;;;;GAYG;AACH,uCAA+C;AAC/C,+BAA4B;AAC5B,iDAAyC;AACzC,4CAAkD;AAClD,6CAAsD;AAO/C,KAAK,UAAU,UAAU,CAAC,OAAmB;IAClD,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAmB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,gBAAgB;QAChB,eAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClC,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,OAAO;QAC3B,IAAA,wBAAQ,EAAC,eAAe,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,EAAE,CAAC;IAClC,eAAM,CAAC,IAAI,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;IACrC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,sCAAsC;IACtC,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC,MAAM,IAAA,qBAAU,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,SAAS,CAAC,MAAM,EAAE;YAChB,8CAA8C,GAAG,SAAS;YAC1D,2BAA2B;SAC5B,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,iCAAiC;IACjC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,MAAM,EAAE;YAChB,+BAA+B,GAAG,SAAS;YAC3C,uBAAuB;SACxB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,SAAS,CAAC,MAAM,EAAE;YAChB,uCAAuC,GAAG,SAAS;YACnD,sBAAsB;SACvB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,SAAS,CAAC,SAAS,YAAY,CAAC,MAAM,QAAQ,EAAE;YAC9C,2BAA2B,KAAK,UAAU;YAC1C,YAAY,CAAC,MAAM,GAAG,CAAC;gBACrB,CAAC,CAAC,sDAAsD;gBACxD,CAAC,CAAC,uCAAuC;YAC3C,2BAA2B,KAAK,wBAAwB;SACzD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,iCAAiC;IACjC,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACzE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE;YAClB,6BAA6B,UAAU,CAAC,CAAC,CAAC,mBAAmB;YAC7D,6BAA6B,UAAU,CAAC,CAAC,CAAC,kBAAkB;YAC5D,mDAAmD;SACpD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,SAAS,CAAC,YAAY,EAAE;YACtB,sBAAsB,QAAQ,CAAC,CAAC,CAAC,EAAE;YACnC,mCAAmC,GAAG,SAAS;YAC/C,4BAA4B,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,gBAAgB;SAC9D,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,eAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC5D,eAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC7D,eAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC3D,eAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAe;IAC/C,eAAM,CAAC,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IAC3B,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAChB,eAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAe;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC3D,IAAI,MAAM,IAAA,qBAAU,EAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,MAAc;IAC5D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC3D,IAAI,MAAM,IAAA,qBAAU,EAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;wBAAC,MAAM;oBAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC"}
|
|
@@ -18,6 +18,9 @@ export interface ExecuteOptions {
|
|
|
18
18
|
hotfix?: boolean;
|
|
19
19
|
strict?: boolean;
|
|
20
20
|
base?: string;
|
|
21
|
+
skip?: string;
|
|
22
|
+
agent?: string;
|
|
23
|
+
only?: string;
|
|
21
24
|
}
|
|
22
25
|
export declare function executeCommand(options: ExecuteOptions): Promise<void>;
|
|
23
26
|
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CAEf;AACD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG3E"}
|
package/dist/commands/execute.js
CHANGED
|
@@ -132,7 +132,8 @@ async function executeCommand(options) {
|
|
|
132
132
|
return;
|
|
133
133
|
}
|
|
134
134
|
// === Execute with progress (existing flow) ===
|
|
135
|
-
|
|
135
|
+
const skipList = options.skip ? options.skip.split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
136
|
+
await executeWithProgress(sortedTasks, iteration, options.base, skipList, { only: options.only });
|
|
136
137
|
// Hotfix tracking
|
|
137
138
|
if (options.hotfix && sortedTasks.length > 0) {
|
|
138
139
|
await (0, context_1.startHotfix)(sortedTasks[0].id);
|
|
@@ -207,7 +208,8 @@ async function interactiveSelect(tasks, iteration, options) {
|
|
|
207
208
|
logger_1.logger.info('Cancelled.');
|
|
208
209
|
return;
|
|
209
210
|
}
|
|
210
|
-
|
|
211
|
+
const skipList2 = options.skip ? options.skip.split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
212
|
+
await executeWithProgress(selectedTasks, iteration, options.base, skipList2, { only: options.only });
|
|
211
213
|
}
|
|
212
214
|
async function loadInquirer() {
|
|
213
215
|
try {
|
|
@@ -235,23 +237,65 @@ async function loadInquirer() {
|
|
|
235
237
|
// ============================================================
|
|
236
238
|
// Progress feedback execution
|
|
237
239
|
// ============================================================
|
|
238
|
-
async function executeWithProgress(tasks, iteration, base) {
|
|
240
|
+
async function executeWithProgress(tasks, iteration, base, skip, options) {
|
|
239
241
|
const total = tasks.length;
|
|
240
242
|
const startTime = Date.now();
|
|
241
243
|
const completed = [];
|
|
242
|
-
//
|
|
243
|
-
if (
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
244
|
+
// Filter whitelist (--only)
|
|
245
|
+
if (options?.only) {
|
|
246
|
+
const onlyList = options.only.split(',').map(s => s.trim()).filter(Boolean);
|
|
247
|
+
const before = tasks.length;
|
|
248
|
+
tasks = tasks.filter(t => onlyList.includes(t.id));
|
|
249
|
+
if (tasks.length < before) {
|
|
250
|
+
logger_1.logger.info(` 🎯 仅执行 ${tasks.length}/${before} 个指定任务`);
|
|
248
251
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
252
|
+
}
|
|
253
|
+
// Filter whitelist (--only)
|
|
254
|
+
if (options?.only) {
|
|
255
|
+
const onlyList = options.only.split(',').map(s => s.trim()).filter(Boolean);
|
|
256
|
+
const before = tasks.length;
|
|
257
|
+
tasks = tasks.filter(t => onlyList.includes(t.id));
|
|
258
|
+
if (tasks.length < before) {
|
|
259
|
+
logger_1.logger.info(` 🎯 仅执行 ${tasks.length}/${before} 个指定任务`);
|
|
253
260
|
}
|
|
254
261
|
}
|
|
262
|
+
// Filter skipped tasks
|
|
263
|
+
if (skip && skip.length > 0) {
|
|
264
|
+
const before = tasks.length;
|
|
265
|
+
tasks = tasks.filter(t => !skip.includes(t.id));
|
|
266
|
+
logger_1.logger.info(` ⏭️ 跳过 ${before - tasks.length} 个任务: ${skip.join(', ')}`);
|
|
267
|
+
}
|
|
268
|
+
if (tasks.length === 0) {
|
|
269
|
+
logger_1.logger.info(' ✅ 没有需要执行的任务');
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// Create branches for each task (dependency-aware)
|
|
273
|
+
if (tasks.length > 0) {
|
|
274
|
+
for (const task of tasks) {
|
|
275
|
+
let taskBase = base;
|
|
276
|
+
// Auto-detect dependency per task from IMPACT.md
|
|
277
|
+
if (!taskBase) {
|
|
278
|
+
taskBase = await detectDependencyBase(iteration, task.id);
|
|
279
|
+
}
|
|
280
|
+
const branch = (0, git_integration_1.createTaskBranch)(task.id, task.id, taskBase);
|
|
281
|
+
if (branch) {
|
|
282
|
+
const baseInfo = taskBase ? ` (from ${taskBase})` : '';
|
|
283
|
+
logger_1.logger.info(`🌿 ${task.id}: ${branch}${baseInfo}`);
|
|
284
|
+
}
|
|
285
|
+
// Switch back to a neutral branch for next task if needed
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// ── Agent mode: output optimized context for external AI ──
|
|
289
|
+
if (options?.agent) {
|
|
290
|
+
const agentCtx = buildAgentContext(tasks, options.agent);
|
|
291
|
+
logger_1.logger.info(`\n🤖 Agent 模式: ${options.agent}`);
|
|
292
|
+
logger_1.logger.info('--- AGENT CONTEXT START ---');
|
|
293
|
+
logger_1.logger.info(agentCtx);
|
|
294
|
+
logger_1.logger.info('--- AGENT CONTEXT END ---');
|
|
295
|
+
logger_1.logger.info('\n💡 复制以上内容粘贴到 ' + options.agent + ' 中即可生成代码');
|
|
296
|
+
(0, operation_log_1.logOperation)('speccore execute --agent', options.agent);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
255
299
|
(0, operation_log_1.logOperation)('speccore execute', `${total} tasks`);
|
|
256
300
|
logger_1.logger.info('');
|
|
257
301
|
logger_1.logger.info(`⏳ Executing ${total} task(s) in iteration: ${iteration}`);
|
|
@@ -339,6 +383,8 @@ async function executeBatchMode(tasks, iteration, batchSize, options) {
|
|
|
339
383
|
const updated = (0, execution_state_1.loadExecutionState)();
|
|
340
384
|
if (updated.currentBatch > updated.totalBatches)
|
|
341
385
|
break;
|
|
386
|
+
if (updated.pendingTasks.length === 0)
|
|
387
|
+
break; // 所有任务完成
|
|
342
388
|
}
|
|
343
389
|
logger_1.logger.success('All batches completed!');
|
|
344
390
|
(0, operation_log_1.logOperation)('speccore execute --batch-size', `${tasks.length} tasks in ${state.totalBatches} batches`);
|
|
@@ -808,4 +854,30 @@ async function detectDependencyBase(iteration, taskId) {
|
|
|
808
854
|
}
|
|
809
855
|
return undefined;
|
|
810
856
|
}
|
|
857
|
+
const AGENT_FORMATS = {
|
|
858
|
+
copilot: { prefix: "Based on the following specification, generate production code:\n\n", suffix: "\n\nGenerate clean, well-structured code following the Constitution rules." },
|
|
859
|
+
claude: { prefix: "根据以下 Spec 生成生产级代码,遵守宪法规则和测试要求:\n\n", suffix: "\n\n请生成结构清晰、符合宪法规则的生产级代码。" },
|
|
860
|
+
cursor: { prefix: "// Spec-Driven Implementation\n// Follow the spec below strictly:\n\n", suffix: "\n\n// Generate code following the Constitution and API contract." },
|
|
861
|
+
trae: { prefix: "请基于以下技术规格生成代码:\n\n", suffix: "\n\n严格遵循宪法规则和 API 契约。" },
|
|
862
|
+
qoder: { prefix: "## Spec-Driven Code Generation\n\nPlease implement based on the specification below:\n\n", suffix: "\n\n## Requirements: Follow Constitution rules and complete all tests." },
|
|
863
|
+
windsurf: { prefix: "### Implementation Spec\n\nImplement the following specification:\n\n", suffix: "\n\n### Rules: Follow all Constitution constraints. Complete the TEST checklist." },
|
|
864
|
+
codebuddy: { prefix: "基于以下 Spec 和宪法规则生成代码:\n\n", suffix: "\n\n严格遵守宪法、API 契约和测试要求。" },
|
|
865
|
+
};
|
|
866
|
+
function buildAgentContext(tasks, agent) {
|
|
867
|
+
const format = AGENT_FORMATS[agent.toLowerCase()] || { prefix: "Generate code based on:\n\n", suffix: "\n\nFollow all Constitution rules." };
|
|
868
|
+
let ctx = format.prefix;
|
|
869
|
+
for (const task of tasks) {
|
|
870
|
+
ctx += `## Task: ${task.id} - ${task.name || task.id}\n`;
|
|
871
|
+
ctx += `- Status: ${task.status}\n`;
|
|
872
|
+
ctx += `- Priority: ${task.priority}\n`;
|
|
873
|
+
ctx += `\n> Files: Iteration/${task.id}/backend/REQ.md TECH.md TEST.md REVIEW.md API_CONTRACT.yaml\n\n`;
|
|
874
|
+
}
|
|
875
|
+
ctx += `\n## Constitution Rules (from .speccore/PROJECT/CONSTITUTION.md)\n`;
|
|
876
|
+
ctx += `- Follow all mandatory (🔒) rules strictly\n`;
|
|
877
|
+
ctx += `- API must follow RESTful conventions\n`;
|
|
878
|
+
ctx += `- All code must include error handling and validation\n`;
|
|
879
|
+
ctx += format.suffix;
|
|
880
|
+
return ctx;
|
|
881
|
+
}
|
|
882
|
+
// ===== Agent Context Builder =====
|
|
811
883
|
//# sourceMappingURL=execute.js.map
|