speccore 5.27.29 → 5.27.30
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/cli.js +22 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.js +10 -10
- package/dist/commands/audit.js +6 -6
- package/dist/commands/change.js +3 -3
- package/dist/commands/context-output.js +5 -5
- package/dist/commands/context.js +3 -3
- package/dist/commands/dashboard.js +11 -11
- package/dist/commands/delete.d.ts +1 -1
- package/dist/commands/delete.js +4 -4
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +23 -12
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/diff.d.ts +1 -1
- package/dist/commands/diff.js +1 -1
- package/dist/commands/doc2spec.js +7 -4
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/commands/done.js +3 -3
- package/dist/commands/execute.js +3 -3
- package/dist/commands/global-status.js +2 -2
- package/dist/commands/handover.d.ts +1 -1
- package/dist/commands/handover.js +11 -11
- package/dist/commands/handover.js.map +1 -1
- package/dist/commands/help.js +19 -19
- package/dist/commands/history.d.ts +1 -1
- package/dist/commands/history.js +2 -2
- package/dist/commands/impact.js +8 -8
- package/dist/commands/import.js +1 -1
- package/dist/commands/init.js +25 -25
- package/dist/commands/iteration/create.js +14 -14
- package/dist/commands/iteration/create.js.map +1 -1
- package/dist/commands/iteration/split.js +4 -4
- package/dist/commands/iteration/split.js.map +1 -1
- package/dist/commands/iteration-from-global.d.ts +2 -2
- package/dist/commands/iteration-from-global.d.ts.map +1 -1
- package/dist/commands/iteration-from-global.js +17 -18
- package/dist/commands/iteration-from-global.js.map +1 -1
- package/dist/commands/lifecycle.js +1 -1
- package/dist/commands/pr.js +1 -1
- package/dist/commands/rename.d.ts +1 -1
- package/dist/commands/rename.js +4 -4
- package/dist/commands/retro.js +2 -2
- package/dist/commands/schedule.js +3 -3
- package/dist/commands/spec2doc.js +5 -5
- package/dist/commands/spec2doc.js.map +1 -1
- package/dist/commands/status-panel.js +8 -8
- package/dist/commands/sync-global.d.ts +2 -2
- package/dist/commands/sync-global.js +21 -21
- package/dist/commands/sync.js +6 -6
- package/dist/commands/update.js +1 -1
- package/dist/commands/welcome.js +3 -3
- package/dist/commands/welcome.js.map +1 -1
- package/dist/core/ai-context-generator.d.ts +1 -1
- package/dist/core/ai-context-generator.js +1 -1
- package/dist/core/analyze-engine.d.ts +1 -1
- package/dist/core/analyze-engine.js +5 -5
- package/dist/core/ask-engine.js +4 -4
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/ask-llm.js +1 -1
- package/dist/core/context.js +1 -1
- package/dist/core/dev-llm.js +2 -2
- package/dist/core/git-integration.d.ts +1 -1
- package/dist/core/git-integration.js +3 -3
- package/dist/core/global-counters.js +1 -1
- package/dist/core/global-layer.d.ts +3 -3
- package/dist/core/global-layer.js +11 -11
- package/dist/core/help-panel.d.ts +1 -1
- package/dist/core/help-panel.js +3 -3
- package/dist/core/intent-recognition.js +22 -22
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/core/name-validator.d.ts +4 -4
- package/dist/core/name-validator.js +5 -5
- package/dist/core/next-steps.js +1 -1
- package/dist/core/next-steps.js.map +1 -1
- package/dist/core/plan-store.d.ts +1 -1
- package/dist/core/requirement-tracker.d.ts +1 -1
- package/dist/core/requirement-tracker.js +4 -4
- package/dist/core/schedule-store.d.ts +1 -1
- package/dist/core/schemas/iteration.schema.d.ts +1 -1
- package/dist/core/schemas/iteration.schema.js +1 -1
- package/dist/core/session-state.d.ts +1 -1
- package/dist/core/state.js +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* iteration-from-global -
|
|
3
|
-
* 从 GLOBAL/INDEX.md 查找需求 ID,定位到对应项目 REQUIREMENT.md
|
|
2
|
+
* iteration-from-global - 从全量层生成迭代命令
|
|
3
|
+
* 从 GLOBAL/INDEX.md 查找需求 ID,定位到对应项目 REQUIREMENT.md 提取需求,生成新的迭代
|
|
4
4
|
*/
|
|
5
5
|
export interface IterationFromGlobalOptions {
|
|
6
6
|
reqs?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iteration-from-global.d.ts","sourceRoot":"","sources":["../../src/commands/iteration-from-global.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"iteration-from-global.d.ts","sourceRoot":"","sources":["../../src/commands/iteration-from-global.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoInG"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* iteration-from-global -
|
|
4
|
-
* 从 GLOBAL/INDEX.md 查找需求 ID,定位到对应项目 REQUIREMENT.md
|
|
3
|
+
* iteration-from-global - 从全量层生成迭代命令
|
|
4
|
+
* 从 GLOBAL/INDEX.md 查找需求 ID,定位到对应项目 REQUIREMENT.md 提取需求,生成新的迭代
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.iterationFromGlobalCommand = iterationFromGlobalCommand;
|
|
@@ -12,12 +12,12 @@ const global_layer_1 = require("../core/global-layer");
|
|
|
12
12
|
const context_1 = require("../core/context");
|
|
13
13
|
async function iterationFromGlobalCommand(options) {
|
|
14
14
|
if (!options.reqs) {
|
|
15
|
-
logger_1.logger.error('请提供需求 ID 列表。用法: speccore iteration-from-global --reqs=REQ-001,REQ-002 --name
|
|
15
|
+
logger_1.logger.error('请提供需求 ID 列表。用法: speccore iteration-from-global --reqs=REQ-001,REQ-002 --name=<迭代名称>');
|
|
16
16
|
logger_1.logger.info('提示: 使用 speccore global-status 查看可用的需求列表');
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
19
|
if (!options.name) {
|
|
20
|
-
logger_1.logger.error('
|
|
20
|
+
logger_1.logger.error('请提供迭代名称。用法: speccore iteration-from-global --name=<迭代名称>');
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
const spinner = new logger_1.Spinner('读取全量层需求...');
|
|
@@ -44,7 +44,7 @@ async function iterationFromGlobalCommand(options) {
|
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
46
|
// 3. 读取需求详情
|
|
47
|
-
spinner.stop(`找到 ${foundReqs.length}
|
|
47
|
+
spinner.stop(`找到 ${foundReqs.length} 个需求,正在生成迭代...`);
|
|
48
48
|
const reqDetails = [];
|
|
49
49
|
for (const req of foundReqs) {
|
|
50
50
|
const detail = await (0, global_layer_1.readRequirementDetail)(req.project, req.id);
|
|
@@ -52,31 +52,30 @@ async function iterationFromGlobalCommand(options) {
|
|
|
52
52
|
}
|
|
53
53
|
// 4. 预览方案
|
|
54
54
|
logger_1.logger.info('');
|
|
55
|
-
logger_1.logger.info(`📋
|
|
55
|
+
logger_1.logger.info(`📋 准备生成迭代: ${options.name}`);
|
|
56
56
|
logger_1.logger.info('');
|
|
57
57
|
logger_1.logger.info('选择需求:');
|
|
58
58
|
for (const { req } of reqDetails) {
|
|
59
59
|
logger_1.logger.info(` ${req.id}: ${req.name}(${req.project})`);
|
|
60
60
|
}
|
|
61
61
|
logger_1.logger.info('');
|
|
62
|
-
// 5.
|
|
62
|
+
// 5. 创建迭代目录
|
|
63
63
|
const iterationDir = (0, path_1.join)(process.cwd(), `Iteration-${options.name}`);
|
|
64
64
|
if (await (0, fs_extra_1.pathExists)(iterationDir)) {
|
|
65
65
|
if (!options.force) {
|
|
66
|
-
logger_1.logger.error(
|
|
66
|
+
logger_1.logger.error(`迭代 Iteration-${options.name} 已存在。使用 --force 覆盖。`);
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
await (0, fs_extra_1.ensureDir)((0, path_1.join)(iterationDir, '020-specs'));
|
|
71
|
-
await (0, fs_extra_1.ensureDir)((0, path_1.join)(iterationDir, '00-技术文档'));
|
|
72
71
|
await (0, fs_extra_1.ensureDir)((0, path_1.join)(iterationDir, '000-overview'));
|
|
73
72
|
// 6. 生成需求文档
|
|
74
73
|
const reqContent = generateIterationRequirement(options.name, reqDetails);
|
|
75
74
|
await (0, fs_extra_1.writeFile)((0, path_1.join)(iterationDir, '020-specs', 'REQUIREMENT.md'), reqContent);
|
|
76
75
|
// 7. 生成架构文档
|
|
77
76
|
const archContent = generateIterationArchitecture(options.name, foundReqs);
|
|
78
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(iterationDir, '
|
|
79
|
-
// 8.
|
|
77
|
+
await (0, fs_extra_1.writeFile)((0, path_1.join)(iterationDir, '000-overview', 'ARCHITECTURE.md'), archContent);
|
|
78
|
+
// 8. 生成迭代总览
|
|
80
79
|
const graphContent = generateProjectGraph(options.name, foundReqs, reqDetails.length);
|
|
81
80
|
await (0, fs_extra_1.writeFile)((0, path_1.join)(iterationDir, '000-overview', 'PROJECT_GRAPH.md'), graphContent);
|
|
82
81
|
// 9. 自动拆分 Task
|
|
@@ -105,9 +104,9 @@ async function iterationFromGlobalCommand(options) {
|
|
|
105
104
|
});
|
|
106
105
|
// 12. 输出结果
|
|
107
106
|
logger_1.logger.info('');
|
|
108
|
-
logger_1.logger.success('✅
|
|
107
|
+
logger_1.logger.success('✅ 迭代生成完成!');
|
|
109
108
|
logger_1.logger.info('');
|
|
110
|
-
logger_1.logger.info(`📁
|
|
109
|
+
logger_1.logger.info(`📁 迭代: Iteration-${options.name}`);
|
|
111
110
|
logger_1.logger.info(`📋 包含需求: ${reqIds.join(', ')}`);
|
|
112
111
|
logger_1.logger.info('');
|
|
113
112
|
logger_1.logger.info(`📊 生成 Task(${taskIds.length} 个):`);
|
|
@@ -122,12 +121,12 @@ async function iterationFromGlobalCommand(options) {
|
|
|
122
121
|
logger_1.logger.info(' 需求变更时运行 speccore sync-global 同步回全量层');
|
|
123
122
|
}
|
|
124
123
|
catch (error) {
|
|
125
|
-
spinner.fail(
|
|
124
|
+
spinner.fail(`迭代生成失败: ${error}`);
|
|
126
125
|
throw error;
|
|
127
126
|
}
|
|
128
127
|
}
|
|
129
128
|
/**
|
|
130
|
-
*
|
|
129
|
+
* 生成迭代需求文档
|
|
131
130
|
*/
|
|
132
131
|
function generateIterationRequirement(iterationName, reqDetails) {
|
|
133
132
|
const today = new Date().toISOString().split('T')[0];
|
|
@@ -153,7 +152,7 @@ ${detail}
|
|
|
153
152
|
return content;
|
|
154
153
|
}
|
|
155
154
|
/**
|
|
156
|
-
*
|
|
155
|
+
* 生成迭代架构文档
|
|
157
156
|
*/
|
|
158
157
|
function generateIterationArchitecture(iterationName, reqs) {
|
|
159
158
|
const today = new Date().toISOString().split('T')[0];
|
|
@@ -186,11 +185,11 @@ function generateIterationArchitecture(iterationName, reqs) {
|
|
|
186
185
|
return content;
|
|
187
186
|
}
|
|
188
187
|
/**
|
|
189
|
-
*
|
|
188
|
+
* 生成迭代总览
|
|
190
189
|
*/
|
|
191
190
|
function generateProjectGraph(iterationName, reqs, taskCount) {
|
|
192
191
|
const today = new Date().toISOString().split('T')[0];
|
|
193
|
-
let content = `# ${iterationName} -
|
|
192
|
+
let content = `# ${iterationName} - 迭代总览
|
|
194
193
|
|
|
195
194
|
> 创建日期: ${today}
|
|
196
195
|
> 状态: 🔄 进行中
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iteration-from-global.js","sourceRoot":"","sources":["../../src/commands/iteration-from-global.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAeH,
|
|
1
|
+
{"version":3,"file":"iteration-from-global.js","sourceRoot":"","sources":["../../src/commands/iteration-from-global.ts"],"names":[],"mappings":"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"}
|
|
@@ -176,7 +176,7 @@ function showNextStep(taskId, iteration, state) {
|
|
|
176
176
|
async function showAllTasks(iteration) {
|
|
177
177
|
const iterDir = `Iteration-${iteration}`;
|
|
178
178
|
const tasks = await (0, state_1.scanTasks)(iteration);
|
|
179
|
-
logger_1.logger.info(`\n📋
|
|
179
|
+
logger_1.logger.info(`\n📋 迭代 ${iteration} 任务看板:\n`);
|
|
180
180
|
const byState = {};
|
|
181
181
|
for (const state of STATES)
|
|
182
182
|
byState[state] = [];
|
package/dist/commands/pr.js
CHANGED
|
@@ -163,7 +163,7 @@ async function buildPrBody(backendDir, taskName, iteration) {
|
|
|
163
163
|
const checked = (test.match(/\[x\]/gi) || []).length;
|
|
164
164
|
body += `### 🧪 测试\n${checked}/${total} 项完成\n\n`;
|
|
165
165
|
}
|
|
166
|
-
body += `---\n> 由 SpecCore 自动生成 |
|
|
166
|
+
body += `---\n> 由 SpecCore 自动生成 | 迭代: ${iteration}`;
|
|
167
167
|
return body;
|
|
168
168
|
}
|
|
169
169
|
//# sourceMappingURL=pr.js.map
|
package/dist/commands/rename.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* rename -
|
|
3
|
+
* rename - 重命名迭代或任务,自动更新所有关联引用
|
|
4
4
|
* 支持单个重命名和批量重命名
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -57,7 +57,7 @@ async function singleRename(options) {
|
|
|
57
57
|
oldPath = (0, path_1.join)(cwd, oldName);
|
|
58
58
|
}
|
|
59
59
|
else {
|
|
60
|
-
// Task
|
|
60
|
+
// Task 需要先找到归属迭代
|
|
61
61
|
const iterations = await findIterations(cwd);
|
|
62
62
|
let found = false;
|
|
63
63
|
oldPath = '';
|
|
@@ -219,7 +219,7 @@ async function showPreview(preview) {
|
|
|
219
219
|
logger_1.logger.info('');
|
|
220
220
|
logger_1.logger.info('📋 重命名预览');
|
|
221
221
|
logger_1.logger.info('');
|
|
222
|
-
logger_1.logger.info(`目标类型: ${preview.type === 'iteration' ? '
|
|
222
|
+
logger_1.logger.info(`目标类型: ${preview.type === 'iteration' ? '迭代' : '任务'}`);
|
|
223
223
|
logger_1.logger.info(`旧名称: ${preview.oldName}`);
|
|
224
224
|
logger_1.logger.info(`新名称: ${preview.newName}`);
|
|
225
225
|
logger_1.logger.info('');
|
|
@@ -287,7 +287,7 @@ async function updateGlobalReferences(oldName, newName, type) {
|
|
|
287
287
|
logger_1.logger.info(' 全量层版本: ' + newVersion);
|
|
288
288
|
}
|
|
289
289
|
/**
|
|
290
|
-
*
|
|
290
|
+
* 查找所有迭代目录
|
|
291
291
|
*/
|
|
292
292
|
async function findIterations(cwd) {
|
|
293
293
|
const entries = await (0, fs_extra_1.readdir)(cwd, { withFileTypes: true });
|
package/dist/commands/retro.js
CHANGED
|
@@ -99,7 +99,7 @@ async function retroCommand(options) {
|
|
|
99
99
|
}
|
|
100
100
|
logger_1.logger.info('');
|
|
101
101
|
logger_1.logger.info(`📝 任务回顾: ${report.task}`);
|
|
102
|
-
logger_1.logger.info(`
|
|
102
|
+
logger_1.logger.info(` 迭代: ${report.iteration || 'N/A'}`);
|
|
103
103
|
logger_1.logger.info(` 完成时间: ${report.completedAt}`);
|
|
104
104
|
logger_1.logger.info(` 文件变更: ${report.filesChanged} 个`);
|
|
105
105
|
logger_1.logger.info(` 验证通过: ${report.validationPassed ? '✅' : '❌'}`);
|
|
@@ -173,6 +173,6 @@ function renderRetroHtml(report) {
|
|
|
173
173
|
const ver = require('../../package.json').version;
|
|
174
174
|
const stars = '⭐'.repeat(report.score) + (report.score < 5 ? '<span style="opacity:0.15">⭐</span>'.repeat(5 - report.score) : '');
|
|
175
175
|
const vClass = report.validationPassed ? 'pass' : 'fail';
|
|
176
|
-
return `<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore Retro · ${report.task}</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700');body{margin:0;padding:40px 20px;background:#0b1929;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;font-family:'JetBrains Mono',monospace}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.015) 2px,rgba(0,240,255,.015) 4px)}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}.card{max-width:560px;width:100%;background:rgba(13,31,56,.95);border:1px solid rgba(14,165,233,.15);border-radius:16px;padding:32px;position:relative;overflow:hidden;z-index:1}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,#0ea5e9,transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,#0ea5e9,transparent);animation:scanX-rev 3s linear infinite}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(0deg,transparent,#0ea5e9,transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(0deg,transparent,#0ea5e9,transparent);animation:scanY 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}h1{font-family:'Orbitron',sans-serif;font-size:22px;font-weight:900;background:linear-gradient(135deg,#0ea5e9,#6366f1);-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px}.meta{color:#5b7fa5;font-size:11px;margin:8px 0 20px}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:16px 0}.stat{background:rgba(14,165,233,.06);border:1px solid rgba(14,165,233,.1);border-radius:8px;padding:12px;text-align:center}.stat .val{font-family:'Orbitron',sans-serif;font-size:20px;font-weight:900;color:#0ea5e9}.stat .lbl{font-size:10px;color:#5b7fa5;margin-top:4px}.score{text-align:center;font-size:28px;margin:12px 0}.summary{padding:12px;background:rgba(20,184,166,.06);border:1px solid rgba(20,184,166,.15);border-radius:8px;color:#bae6fd;font-size:12px;line-height:1.6;margin:12px 0}.improve{padding:12px;background:rgba(249,115,22,.06);border:1px solid rgba(249,115,22,.15);border-radius:8px;color:#f97316;font-size:11px}.pass{color:#14b8a6}.fail{color:#f97316}.ft{text-align:center;color:#5b7fa5;font-size:10px;margin-top:24px}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="card"><div class="vline l"></div><div class="vline r"></div><h1>RETRO · ${report.task}</h1><div class="meta">${report.iteration ? '
|
|
176
|
+
return `<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore Retro · ${report.task}</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700');body{margin:0;padding:40px 20px;background:#0b1929;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;font-family:'JetBrains Mono',monospace}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.015) 2px,rgba(0,240,255,.015) 4px)}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}.card{max-width:560px;width:100%;background:rgba(13,31,56,.95);border:1px solid rgba(14,165,233,.15);border-radius:16px;padding:32px;position:relative;overflow:hidden;z-index:1}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,#0ea5e9,transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,#0ea5e9,transparent);animation:scanX-rev 3s linear infinite}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(0deg,transparent,#0ea5e9,transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(0deg,transparent,#0ea5e9,transparent);animation:scanY 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}h1{font-family:'Orbitron',sans-serif;font-size:22px;font-weight:900;background:linear-gradient(135deg,#0ea5e9,#6366f1);-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px}.meta{color:#5b7fa5;font-size:11px;margin:8px 0 20px}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:16px 0}.stat{background:rgba(14,165,233,.06);border:1px solid rgba(14,165,233,.1);border-radius:8px;padding:12px;text-align:center}.stat .val{font-family:'Orbitron',sans-serif;font-size:20px;font-weight:900;color:#0ea5e9}.stat .lbl{font-size:10px;color:#5b7fa5;margin-top:4px}.score{text-align:center;font-size:28px;margin:12px 0}.summary{padding:12px;background:rgba(20,184,166,.06);border:1px solid rgba(20,184,166,.15);border-radius:8px;color:#bae6fd;font-size:12px;line-height:1.6;margin:12px 0}.improve{padding:12px;background:rgba(249,115,22,.06);border:1px solid rgba(249,115,22,.15);border-radius:8px;color:#f97316;font-size:11px}.pass{color:#14b8a6}.fail{color:#f97316}.ft{text-align:center;color:#5b7fa5;font-size:10px;margin-top:24px}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="card"><div class="vline l"></div><div class="vline r"></div><h1>RETRO · ${report.task}</h1><div class="meta">${report.iteration ? '迭代: ' + report.iteration + ' · ' : ''}${report.completedAt}</div><div class="score">${stars}</div><div class="grid2"><div class="stat"><div class="val">${report.filesChanged}</div><div class="lbl">文件变更</div></div><div class="stat"><div class="val ${vClass}">${report.validationPassed ? '✅' : '❌'}</div><div class="lbl">验证</div></div></div><div class="grid2"><div class="stat"><div class="val" style="color:${report.issuesUnresolved > 0 ? '#f97316' : '#14b8a6'}">${report.issuesUnresolved}</div><div class="lbl">未解决问题</div></div><div class="stat"><div class="val" style="color:#5b7fa5">${report.issuesTotal}</div><div class="lbl">问题总数</div></div></div><div class="summary">${report.summary}</div><div class="improve">💡 ${report.improvement || '任务完成,无特别建议'}</div></div><div class="ft">SpecCore Retro v${ver} · ${report.completedAt}</div></body></html>`;
|
|
177
177
|
}
|
|
178
178
|
//# sourceMappingURL=retro.js.map
|
|
@@ -27,7 +27,7 @@ async function scheduleCreateCommand(options) {
|
|
|
27
27
|
}
|
|
28
28
|
const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
|
|
29
29
|
if (!iteration) {
|
|
30
|
-
logger_1.logger.error('
|
|
30
|
+
logger_1.logger.error('未找到活跃迭代,请使用 --iteration 指定');
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
33
|
const taskName = options.name
|
|
@@ -56,7 +56,7 @@ async function scheduleCreateCommand(options) {
|
|
|
56
56
|
logger_1.logger.info('');
|
|
57
57
|
logger_1.logger.info(` ID: ${scheduled.id}`);
|
|
58
58
|
logger_1.logger.info(` 任务: ${scheduled.name}`);
|
|
59
|
-
logger_1.logger.info(`
|
|
59
|
+
logger_1.logger.info(` 迭代: ${scheduled.iteration}`);
|
|
60
60
|
logger_1.logger.info(` 执行时间: ${scheduled.scheduledAt}`);
|
|
61
61
|
logger_1.logger.info(` 状态: ${statusLabel(scheduled.status)}`);
|
|
62
62
|
logger_1.logger.info('');
|
|
@@ -228,7 +228,7 @@ async function scheduleDetailCommand(options) {
|
|
|
228
228
|
logger_1.logger.info(`📋 ${task.name}`);
|
|
229
229
|
logger_1.logger.info(` ID: ${task.id}`);
|
|
230
230
|
logger_1.logger.info(` 状态: ${statusLabel(task.status)}`);
|
|
231
|
-
logger_1.logger.info(`
|
|
231
|
+
logger_1.logger.info(` 迭代: ${task.iteration}`);
|
|
232
232
|
logger_1.logger.info(` 执行时间: ${task.scheduledAt}`);
|
|
233
233
|
logger_1.logger.info(` 创建时间: ${new Date(task.createdAt).toLocaleString()}`);
|
|
234
234
|
const eo = task.execOptions;
|
|
@@ -70,10 +70,10 @@ async function spec2docCommand(options) {
|
|
|
70
70
|
sourceFiles.push({ path: options.file, label: (0, path_1.basename)(options.file, (0, path_1.extname)(options.file)) });
|
|
71
71
|
}
|
|
72
72
|
else if (options.all && iterName) {
|
|
73
|
-
//
|
|
73
|
+
// 全量导出:迭代下所有 .md 文件
|
|
74
74
|
const iterDir = iterName.startsWith('Iteration-') ? iterName : `Iteration-${iterName}`;
|
|
75
75
|
if (!await (0, fs_extra_1.pathExists)(iterDir)) {
|
|
76
|
-
logger_1.logger.error(
|
|
76
|
+
logger_1.logger.error(`迭代不存在: ${iterDir}`);
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
await collectAllMd(iterDir, sourceFiles);
|
|
@@ -81,7 +81,7 @@ async function spec2docCommand(options) {
|
|
|
81
81
|
else if (options.task && iterName) {
|
|
82
82
|
// 任务导出
|
|
83
83
|
const iterDir = iterName.startsWith('Iteration-') ? iterName : `Iteration-${iterName}`;
|
|
84
|
-
const taskDir = (0, path_1.join)(iterDir, options.task.startsWith('Task-') ? options.task : `Task-${options.task}`);
|
|
84
|
+
const taskDir = (0, path_1.join)(iterDir, '030-tasks', options.task.startsWith('Task-') ? options.task : `Task-${options.task}`);
|
|
85
85
|
if (!await (0, fs_extra_1.pathExists)(taskDir)) {
|
|
86
86
|
logger_1.logger.error(`任务目录不存在: ${taskDir}`);
|
|
87
87
|
return;
|
|
@@ -89,9 +89,9 @@ async function spec2docCommand(options) {
|
|
|
89
89
|
await collectAllMd(taskDir, sourceFiles);
|
|
90
90
|
}
|
|
91
91
|
else {
|
|
92
|
-
//
|
|
92
|
+
// 默认:当前迭代的 REQUIREMENT.md
|
|
93
93
|
if (!iterName) {
|
|
94
|
-
logger_1.logger.error('
|
|
94
|
+
logger_1.logger.error('请指定迭代: --iteration <name>');
|
|
95
95
|
return;
|
|
96
96
|
}
|
|
97
97
|
const iterDir = iterName.startsWith('Iteration-') ? iterName : `Iteration-${iterName}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec2doc.js","sourceRoot":"","sources":["../../src/commands/spec2doc.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"spec2doc.js","sourceRoot":"","sources":["../../src/commands/spec2doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,7 +82,7 @@ async function statusPanelCommand(options = {}) {
|
|
|
82
82
|
logger_1.logger.info('┌────────────────── SpecCore ──────────────────┐');
|
|
83
83
|
logger_1.logger.info(`│ 项目: ${config.project.name.padEnd(37)}│`);
|
|
84
84
|
if (iteration) {
|
|
85
|
-
logger_1.logger.info(`│
|
|
85
|
+
logger_1.logger.info(`│ 迭代: ${iteration.padEnd(37)}│`);
|
|
86
86
|
const iterDir = `Iteration-${iteration}`;
|
|
87
87
|
// Phase detection
|
|
88
88
|
const phase = await detectPhase(iterDir);
|
|
@@ -328,7 +328,7 @@ async function exportStatus(config, iteration, format, options = {}) {
|
|
|
328
328
|
const iterDir = (0, path_1.join)(process.cwd(), 'Iteration-' + iteration);
|
|
329
329
|
const phase = await require('./status-panel').defaultPhase(iterDir);
|
|
330
330
|
data.phase = phase;
|
|
331
|
-
// ──
|
|
331
|
+
// ── 读取迭代时间范围 ──
|
|
332
332
|
const metaPath = (0, path_1.join)(iterDir, "000-overview", "METADATA.md");
|
|
333
333
|
const graphPath = (0, path_1.join)(iterDir, '000-overview', 'PROJECT_GRAPH.md');
|
|
334
334
|
if (await (0, fs_extra_1.pathExists)(graphPath)) {
|
|
@@ -561,7 +561,7 @@ async function exportStatus(config, iteration, format, options = {}) {
|
|
|
561
561
|
}
|
|
562
562
|
else if (format === 'md') {
|
|
563
563
|
let md = `# SpecCore Status — ${config.project.name}\n\n`;
|
|
564
|
-
md += `-
|
|
564
|
+
md += `- 迭代: ${iteration || '无'}\n- 阶段: ${data.phase || 'N/A'}\n\n`;
|
|
565
565
|
md += '## Tasks\n\n| ID | Status | Type |\n| :--- | :--- | :--- |\n';
|
|
566
566
|
for (const t of data.tasks || [])
|
|
567
567
|
md += `| ${t.id} | ${t.status} | ${t.type} |\n`;
|
|
@@ -839,7 +839,7 @@ td.code{font-family:'JetBrains Mono',monospace;color:var(--text);font-weight:600
|
|
|
839
839
|
<div class="subtitle">SPECCORE · SPEC-DRIVEN DEVELOPMENT${data.iterationOwner ? " · OWNER: " + data.iterationOwner.toUpperCase() : ""}${data.filterLabels ? " · " + data.filterLabels.join(" · ") : ""}${data.filteredFrom ? " (过滤自 " + data.filteredFrom + " 个任务)" : ""}</div>
|
|
840
840
|
</div>
|
|
841
841
|
<div class="header-right">
|
|
842
|
-
<div class="header-stat"><div class="num">Q2</div><div class="label"
|
|
842
|
+
<div class="header-stat"><div class="num">Q2</div><div class="label">迭代</div></div>
|
|
843
843
|
<div class="header-stat"><div class="num">${total}</div><div class="label">任务</div></div>
|
|
844
844
|
<div class="header-stat"><div class="num">${donePct}%</div><div class="label">完成</div></div>
|
|
845
845
|
<div class="phase-indicator"><div class="dot"></div><span>${phaseLabel.toUpperCase()}</span></div>
|
|
@@ -1354,7 +1354,7 @@ function setLang(l){document.querySelectorAll('.lang-sw button').forEach(b=>b.cl
|
|
|
1354
1354
|
// ── Health Report (merged from health command) ──
|
|
1355
1355
|
async function showHealthReport(config, iteration) {
|
|
1356
1356
|
if (!iteration) {
|
|
1357
|
-
logger_1.logger.info("
|
|
1357
|
+
logger_1.logger.info("无活跃迭代");
|
|
1358
1358
|
return;
|
|
1359
1359
|
}
|
|
1360
1360
|
const iterDir = `Iteration-${iteration}`;
|
|
@@ -1384,7 +1384,7 @@ async function showHealthReport(config, iteration) {
|
|
|
1384
1384
|
// ── Lifecycle Board (merged from lifecycle command) ──
|
|
1385
1385
|
async function showLifecycleBoard(config, iteration, opts) {
|
|
1386
1386
|
if (!iteration) {
|
|
1387
|
-
logger_1.logger.info("
|
|
1387
|
+
logger_1.logger.info("无活跃迭代");
|
|
1388
1388
|
return;
|
|
1389
1389
|
}
|
|
1390
1390
|
const iterDir = `Iteration-${iteration}`;
|
|
@@ -1419,7 +1419,7 @@ async function getTaskStatus(iterDir, task) {
|
|
|
1419
1419
|
}
|
|
1420
1420
|
// ── Collect Health Data for export ──
|
|
1421
1421
|
async function collectHealthData(iteration) {
|
|
1422
|
-
const iterDir = (0, path_1.join)(process.cwd(), "
|
|
1422
|
+
const iterDir = (0, path_1.join)(process.cwd(), "迭代-" + iteration);
|
|
1423
1423
|
const tasks = await scanTaskDirs(iterDir);
|
|
1424
1424
|
let total = tasks.length, completed = 0, hasTest = 0, hasReview = 0;
|
|
1425
1425
|
for (const t of tasks) {
|
|
@@ -1439,7 +1439,7 @@ async function collectHealthData(iteration) {
|
|
|
1439
1439
|
}
|
|
1440
1440
|
// ── Collect Lifecycle Data for export ──
|
|
1441
1441
|
async function collectLifecycleData(iteration) {
|
|
1442
|
-
const iterDir = (0, path_1.join)(process.cwd(), "
|
|
1442
|
+
const iterDir = (0, path_1.join)(process.cwd(), "迭代-" + iteration);
|
|
1443
1443
|
const taskDirs = await scanTaskDirs(iterDir);
|
|
1444
1444
|
const tasks = [];
|
|
1445
1445
|
for (const t of taskDirs) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* sync-global -
|
|
4
|
-
* 支持 to_global
|
|
3
|
+
* sync-global - 迭代与全量层双向同步命令
|
|
4
|
+
* 支持 to_global(迭代→全量层)和 from_global(全量层→迭代)两个方向
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.syncGlobalCommand = syncGlobalCommand;
|
|
@@ -33,10 +33,10 @@ async function syncGlobalCommand(options) {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
36
|
+
* 迭代 → 全量层同步
|
|
37
37
|
*/
|
|
38
38
|
async function syncToGlobal(options) {
|
|
39
|
-
// 1.
|
|
39
|
+
// 1. 确定迭代
|
|
40
40
|
let iterationName = options.iteration;
|
|
41
41
|
if (!iterationName) {
|
|
42
42
|
// 尝试从上下文获取
|
|
@@ -47,20 +47,20 @@ async function syncToGlobal(options) {
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
if (!iterationName) {
|
|
50
|
-
logger_1.logger.error('
|
|
50
|
+
logger_1.logger.error('未指定迭代。用法: speccore sync-global --iteration=<迭代名称>');
|
|
51
51
|
return;
|
|
52
52
|
}
|
|
53
|
-
//
|
|
53
|
+
// 标准化迭代名称
|
|
54
54
|
const iterDirName = iterationName.startsWith('Iteration-') ? iterationName : `Iteration-${iterationName}`;
|
|
55
55
|
const iterDir = (0, path_1.join)(process.cwd(), iterDirName);
|
|
56
56
|
if (!(await (0, fs_extra_1.pathExists)(iterDir))) {
|
|
57
|
-
logger_1.logger.error(
|
|
57
|
+
logger_1.logger.error(`迭代目录不存在: ${iterDirName}`);
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
|
-
// 2.
|
|
60
|
+
// 2. 读取迭代需求文档
|
|
61
61
|
const iterReqPath = (0, path_1.join)(iterDir, '020-specs', 'REQUIREMENT.md');
|
|
62
62
|
if (!(await (0, fs_extra_1.pathExists)(iterReqPath))) {
|
|
63
|
-
logger_1.logger.error(
|
|
63
|
+
logger_1.logger.error(`迭代需求文档不存在: ${iterReqPath}`);
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
const iterReqContent = await (0, fs_extra_1.readFile)(iterReqPath, 'utf-8');
|
|
@@ -73,7 +73,7 @@ async function syncToGlobal(options) {
|
|
|
73
73
|
iterReqIds.push(match[1]);
|
|
74
74
|
}
|
|
75
75
|
if (iterReqIds.length === 0) {
|
|
76
|
-
logger_1.logger.info('
|
|
76
|
+
logger_1.logger.info('迭代需求文档中未找到 REQ 编号,跳过同步。');
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
// 5. 找到关联的全量层需求
|
|
@@ -87,7 +87,7 @@ async function syncToGlobal(options) {
|
|
|
87
87
|
const updatedProjects = new Set();
|
|
88
88
|
for (const req of relatedReqs) {
|
|
89
89
|
const globalDetail = await (0, global_layer_1.readRequirementDetail)(req.project, req.id);
|
|
90
|
-
//
|
|
90
|
+
// 从迭代需求文档中提取当前需求内容
|
|
91
91
|
const iterSectionRegex = new RegExp(`### ${req.id}[::][^]*?(?=\\n### |$)`, 'm');
|
|
92
92
|
const iterMatch = iterReqContent.match(iterSectionRegex);
|
|
93
93
|
const iterDetail = iterMatch ? iterMatch[0] : '';
|
|
@@ -108,7 +108,7 @@ async function syncToGlobal(options) {
|
|
|
108
108
|
logger_1.logger.info(`🔄 准备同步 ${iterDirName} → 全量层`);
|
|
109
109
|
logger_1.logger.info('');
|
|
110
110
|
if (changes.length === 0) {
|
|
111
|
-
logger_1.logger.info('✅
|
|
111
|
+
logger_1.logger.info('✅ 未检测到变更。迭代与全量层保持一致。');
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
114
|
logger_1.logger.info('📊 检测到以下变更:');
|
|
@@ -132,14 +132,14 @@ async function syncToGlobal(options) {
|
|
|
132
132
|
logger_1.logger.info('');
|
|
133
133
|
logger_1.logger.success('✅ 同步完成!');
|
|
134
134
|
logger_1.logger.info('');
|
|
135
|
-
logger_1.logger.info(`📋 方向:
|
|
136
|
-
logger_1.logger.info(`
|
|
135
|
+
logger_1.logger.info(`📋 方向: 迭代 → 全量层`);
|
|
136
|
+
logger_1.logger.info(` 迭代: ${iterDirName}`);
|
|
137
137
|
logger_1.logger.info(` 同步需求: ${changes.length} 条`);
|
|
138
138
|
logger_1.logger.info(` 涉及项目: ${[...updatedProjects].join(', ')}`);
|
|
139
139
|
logger_1.logger.info(` 全量层版本: ${index.version} → ${newVersion}`);
|
|
140
140
|
}
|
|
141
141
|
/**
|
|
142
|
-
* 全量层 →
|
|
142
|
+
* 全量层 → 迭代同步
|
|
143
143
|
*/
|
|
144
144
|
async function syncFromGlobal(options) {
|
|
145
145
|
let iterationName = options.iteration;
|
|
@@ -151,18 +151,18 @@ async function syncFromGlobal(options) {
|
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
if (!iterationName) {
|
|
154
|
-
logger_1.logger.error('
|
|
154
|
+
logger_1.logger.error('未指定迭代。用法: speccore sync-global --iteration=<迭代名称> --direction=from_global');
|
|
155
155
|
return;
|
|
156
156
|
}
|
|
157
157
|
const iterDirName = iterationName.startsWith('Iteration-') ? iterationName : `Iteration-${iterationName}`;
|
|
158
158
|
const iterReqPath = (0, path_1.join)(process.cwd(), iterDirName, '020-specs', 'REQUIREMENT.md');
|
|
159
159
|
if (!(await (0, fs_extra_1.pathExists)(iterReqPath))) {
|
|
160
|
-
logger_1.logger.error(
|
|
160
|
+
logger_1.logger.error(`迭代需求文档不存在: ${iterReqPath}`);
|
|
161
161
|
return;
|
|
162
162
|
}
|
|
163
163
|
const index = await (0, global_layer_1.readGlobalIndex)();
|
|
164
164
|
const iterReqContent = await (0, fs_extra_1.readFile)(iterReqPath, 'utf-8');
|
|
165
|
-
//
|
|
165
|
+
// 解析迭代中的需求 ID
|
|
166
166
|
const iterReqIds = [];
|
|
167
167
|
const matches = iterReqContent.matchAll(/###\s+(REQ-\d+)[::]/g);
|
|
168
168
|
for (const match of matches) {
|
|
@@ -181,7 +181,7 @@ async function syncFromGlobal(options) {
|
|
|
181
181
|
reqName: req.name,
|
|
182
182
|
project: req.project,
|
|
183
183
|
changeType: '修改',
|
|
184
|
-
changeDesc: '
|
|
184
|
+
changeDesc: '全量层已更新,需要同步到迭代',
|
|
185
185
|
});
|
|
186
186
|
}
|
|
187
187
|
}
|
|
@@ -190,7 +190,7 @@ async function syncFromGlobal(options) {
|
|
|
190
190
|
logger_1.logger.info(`🔄 准备同步 全量层 → ${iterDirName}`);
|
|
191
191
|
logger_1.logger.info('');
|
|
192
192
|
if (changes.length === 0) {
|
|
193
|
-
logger_1.logger.info('✅
|
|
193
|
+
logger_1.logger.info('✅ 未检测到变更。全量层与迭代保持一致。');
|
|
194
194
|
return;
|
|
195
195
|
}
|
|
196
196
|
logger_1.logger.info(`📊 检测到 ${changes.length} 条变更`);
|
|
@@ -200,7 +200,7 @@ async function syncFromGlobal(options) {
|
|
|
200
200
|
logger_1.logger.info('使用 --force 或 --auto 执行同步。');
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
|
-
//
|
|
203
|
+
// 执行同步:更新迭代需求文档
|
|
204
204
|
for (const change of changes) {
|
|
205
205
|
const globalDetail = await (0, global_layer_1.readRequirementDetail)(change.project, change.reqId);
|
|
206
206
|
if (globalDetail) {
|