speccore 5.4.1 → 5.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.en.md +5 -4
  2. package/README.md +6 -5
  3. package/package.json +1 -1
  4. package/dist/commands/audit.d.ts +0 -10
  5. package/dist/commands/audit.d.ts.map +0 -1
  6. package/dist/commands/audit.js +0 -278
  7. package/dist/commands/audit.js.map +0 -1
  8. package/dist/commands/baseline.d.ts +0 -13
  9. package/dist/commands/baseline.d.ts.map +0 -1
  10. package/dist/commands/baseline.js +0 -227
  11. package/dist/commands/baseline.js.map +0 -1
  12. package/dist/commands/bugfix.d.ts +0 -13
  13. package/dist/commands/bugfix.d.ts.map +0 -1
  14. package/dist/commands/bugfix.js +0 -181
  15. package/dist/commands/bugfix.js.map +0 -1
  16. package/dist/commands/change.d.ts +0 -14
  17. package/dist/commands/change.d.ts.map +0 -1
  18. package/dist/commands/change.js +0 -208
  19. package/dist/commands/change.js.map +0 -1
  20. package/dist/commands/context.d.ts +0 -8
  21. package/dist/commands/context.d.ts.map +0 -1
  22. package/dist/commands/context.js +0 -180
  23. package/dist/commands/context.js.map +0 -1
  24. package/dist/commands/dashboard.d.ts +0 -9
  25. package/dist/commands/dashboard.d.ts.map +0 -1
  26. package/dist/commands/dashboard.js +0 -209
  27. package/dist/commands/dashboard.js.map +0 -1
  28. package/dist/commands/demo.d.ts +0 -10
  29. package/dist/commands/demo.d.ts.map +0 -1
  30. package/dist/commands/demo.js +0 -151
  31. package/dist/commands/demo.js.map +0 -1
  32. package/dist/commands/global-status.d.ts +0 -9
  33. package/dist/commands/global-status.d.ts.map +0 -1
  34. package/dist/commands/global-status.js +0 -135
  35. package/dist/commands/global-status.js.map +0 -1
  36. package/dist/commands/goal.d.ts +0 -15
  37. package/dist/commands/goal.d.ts.map +0 -1
  38. package/dist/commands/goal.js +0 -232
  39. package/dist/commands/goal.js.map +0 -1
  40. package/dist/commands/handover.d.ts +0 -11
  41. package/dist/commands/handover.d.ts.map +0 -1
  42. package/dist/commands/handover.js +0 -169
  43. package/dist/commands/handover.js.map +0 -1
  44. package/dist/commands/help.d.ts +0 -10
  45. package/dist/commands/help.d.ts.map +0 -1
  46. package/dist/commands/help.js +0 -93
  47. package/dist/commands/help.js.map +0 -1
  48. package/dist/commands/history.d.ts +0 -9
  49. package/dist/commands/history.d.ts.map +0 -1
  50. package/dist/commands/history.js +0 -87
  51. package/dist/commands/history.js.map +0 -1
  52. package/dist/commands/impact.d.ts +0 -12
  53. package/dist/commands/impact.d.ts.map +0 -1
  54. package/dist/commands/impact.js +0 -238
  55. package/dist/commands/impact.js.map +0 -1
  56. package/dist/commands/index-update.d.ts +0 -8
  57. package/dist/commands/index-update.d.ts.map +0 -1
  58. package/dist/commands/index-update.js +0 -180
  59. package/dist/commands/index-update.js.map +0 -1
  60. package/dist/commands/iteration-from-global.d.ts +0 -11
  61. package/dist/commands/iteration-from-global.d.ts.map +0 -1
  62. package/dist/commands/iteration-from-global.js +0 -294
  63. package/dist/commands/iteration-from-global.js.map +0 -1
  64. package/dist/commands/new-task.d.ts +0 -15
  65. package/dist/commands/new-task.d.ts.map +0 -1
  66. package/dist/commands/new-task.js +0 -208
  67. package/dist/commands/new-task.js.map +0 -1
  68. package/dist/commands/platform-add.d.ts +0 -12
  69. package/dist/commands/platform-add.d.ts.map +0 -1
  70. package/dist/commands/platform-add.js +0 -111
  71. package/dist/commands/platform-add.js.map +0 -1
  72. package/dist/commands/rename.d.ts +0 -14
  73. package/dist/commands/rename.d.ts.map +0 -1
  74. package/dist/commands/rename.js +0 -298
  75. package/dist/commands/rename.js.map +0 -1
  76. package/dist/commands/research.d.ts +0 -14
  77. package/dist/commands/research.d.ts.map +0 -1
  78. package/dist/commands/research.js +0 -181
  79. package/dist/commands/research.js.map +0 -1
  80. package/dist/commands/retro.d.ts +0 -10
  81. package/dist/commands/retro.d.ts.map +0 -1
  82. package/dist/commands/retro.js +0 -130
  83. package/dist/commands/retro.js.map +0 -1
  84. package/dist/commands/spec.d.ts +0 -8
  85. package/dist/commands/spec.d.ts.map +0 -1
  86. package/dist/commands/spec.js +0 -155
  87. package/dist/commands/spec.js.map +0 -1
  88. package/dist/commands/sync-global.d.ts +0 -13
  89. package/dist/commands/sync-global.d.ts.map +0 -1
  90. package/dist/commands/sync-global.js +0 -218
  91. package/dist/commands/sync-global.js.map +0 -1
  92. package/dist/commands/sync.d.ts +0 -13
  93. package/dist/commands/sync.d.ts.map +0 -1
  94. package/dist/commands/sync.js +0 -216
  95. package/dist/commands/sync.js.map +0 -1
  96. package/dist/commands/template-add.d.ts +0 -12
  97. package/dist/commands/template-add.d.ts.map +0 -1
  98. package/dist/commands/template-add.js +0 -65
  99. package/dist/commands/template-add.js.map +0 -1
  100. package/dist/commands/welcome.d.ts +0 -9
  101. package/dist/commands/welcome.d.ts.map +0 -1
  102. package/dist/commands/welcome.js +0 -166
  103. package/dist/commands/welcome.js.map +0 -1
  104. package/dist/core/global-layer.d.ts +0 -124
  105. package/dist/core/global-layer.d.ts.map +0 -1
  106. package/dist/core/global-layer.js +0 -456
  107. package/dist/core/global-layer.js.map +0 -1
  108. package/dist/core/intent-recognition.d.ts +0 -48
  109. package/dist/core/intent-recognition.d.ts.map +0 -1
  110. package/dist/core/intent-recognition.js +0 -524
  111. package/dist/core/intent-recognition.js.map +0 -1
@@ -1,111 +0,0 @@
1
- "use strict";
2
- /**
3
- * platform-add — 动态添加前端平台类型
4
- * 自动更新 platforms.yaml 并同步到现有 Task
5
- */
6
- var __importDefault = (this && this.__importDefault) || function (mod) {
7
- return (mod && mod.__esModule) ? mod : { "default": mod };
8
- };
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.platformAddCommand = platformAddCommand;
11
- const fs_extra_1 = require("fs-extra");
12
- const path_1 = require("path");
13
- const logger_1 = require("../utils/logger");
14
- const js_yaml_1 = __importDefault(require("js-yaml"));
15
- async function platformAddCommand(options) {
16
- const spinner = new logger_1.Spinner('Adding platform');
17
- spinner.start();
18
- try {
19
- if (!options.name) {
20
- spinner.fail('Platform name is required. Use --name=<identifier>');
21
- return;
22
- }
23
- const configDir = (0, path_1.join)(process.cwd(), '.speccore', 'config');
24
- const platformsYaml = (0, path_1.join)(configDir, 'platforms.yaml');
25
- // 确保配置目录存在
26
- await (0, fs_extra_1.ensureDir)(configDir);
27
- let config = { platforms: {} };
28
- // 读取现有配置
29
- if (await (0, fs_extra_1.pathExists)(platformsYaml)) {
30
- const content = await (0, fs_extra_1.readFile)(platformsYaml, 'utf-8');
31
- config = js_yaml_1.default.load(content);
32
- }
33
- // 检查是否已存在
34
- if (config?.platforms?.[options.name]) {
35
- spinner.fail(`Platform "${options.name}" already exists in platforms.yaml`);
36
- return;
37
- }
38
- // 添加新平台
39
- if (!config.platforms)
40
- config.platforms = {};
41
- config.platforms[options.name] = {
42
- name: options.description || options.name,
43
- description: options.description || '',
44
- default: false,
45
- tech_stack: options.tech || '',
46
- enabled: true,
47
- };
48
- // 写回配置文件
49
- const newYaml = js_yaml_1.default.dump(config, { indent: 2, lineWidth: -1, noRefs: true });
50
- await (0, fs_extra_1.writeFile)(platformsYaml, newYaml);
51
- // 同步到现有 Task
52
- let syncedCount = 0;
53
- if (options.syncExisting !== false) {
54
- syncedCount = await syncPlatformToExistingTasks(options.name);
55
- }
56
- spinner.stop('Platform added successfully');
57
- logger_1.logger.info('');
58
- logger_1.logger.info('✅ 平台类型添加完成!');
59
- logger_1.logger.info('');
60
- logger_1.logger.info(`📁 已更新配置:`);
61
- logger_1.logger.info(` - .speccore/config/platforms.yaml (+${options.name})`);
62
- logger_1.logger.info('');
63
- if (syncedCount > 0) {
64
- logger_1.logger.info(`📁 已同步到 ${syncedCount} 个现有 Task`);
65
- }
66
- logger_1.logger.info('📋 验证:speccore validate 检查完整性');
67
- logger_1.logger.info(`📋 使用:speccore new-task --platforms=${options.name}`);
68
- }
69
- catch (error) {
70
- spinner.fail(`Platform addition failed: ${error}`);
71
- throw error;
72
- }
73
- }
74
- /**
75
- * 同步平台到现有 Task(为每个 Task 创建 frontend/{platform}/ 目录)
76
- */
77
- async function syncPlatformToExistingTasks(platformName) {
78
- let count = 0;
79
- const cwd = process.cwd();
80
- // 扫描所有期次目录
81
- const dirEntries = await (0, fs_extra_1.readdir)(cwd, { withFileTypes: true });
82
- const iterDirs = dirEntries.filter((e) => e.isDirectory() && e.name.startsWith('期次-'));
83
- for (const iterDir of iterDirs) {
84
- const iterPath = (0, path_1.join)(cwd, iterDir.name);
85
- const taskEntries = await (0, fs_extra_1.readdir)(iterPath, { withFileTypes: true });
86
- for (const taskEntry of taskEntries) {
87
- if (taskEntry.isDirectory() && taskEntry.name.startsWith('Task-')) {
88
- const frontendDir = (0, path_1.join)(iterPath, taskEntry.name, 'frontend', platformName);
89
- if (!(await (0, fs_extra_1.pathExists)(frontendDir))) {
90
- await (0, fs_extra_1.ensureDir)(frontendDir);
91
- const taskId = taskEntry.name.match(/^(Task-\d+)/)?.[1] || taskEntry.name;
92
- const taskName = taskEntry.name.replace(/^Task-\d+-/, '');
93
- const today = new Date().toISOString().split('T')[0];
94
- // 创建模板 Spec 文件
95
- await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendDir, 'REQ.md'), `# ${taskId} ${taskName} - ${platformName} 前端需求\n\n` +
96
- `> 目标平台:${platformName}\n` +
97
- `> 创建时间:${today}\n\n` +
98
- `## 页面列表\n\n_待填写_\n`);
99
- await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendDir, 'TECH.md'), `# ${taskId} ${taskName} - ${platformName} 技术方案\n\n_待填写_\n`);
100
- await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendDir, 'TASK.md'), `# ${taskId} ${taskName} - ${platformName} 任务\n\n` +
101
- `| 状态 | 🔲 待开发 |\n` +
102
- `| 优先级 | medium |\n\n` +
103
- `## 开发清单\n\n- [ ] 待拆分\n`);
104
- count++;
105
- }
106
- }
107
- }
108
- }
109
- return count;
110
- }
111
- //# sourceMappingURL=platform-add.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"platform-add.js","sourceRoot":"","sources":["../../src/commands/platform-add.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * rename - 重命名期次或任务,自动更新所有关联引用
3
- * 支持单个重命名和批量重命名
4
- */
5
- export interface RenameOptions {
6
- target?: string;
7
- newName?: string;
8
- batch?: boolean;
9
- pattern?: string;
10
- replacement?: string;
11
- force?: boolean;
12
- }
13
- export declare function renameCommand(options: RenameOptions): Promise<void>;
14
- //# sourceMappingURL=rename.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAYD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE"}
@@ -1,298 +0,0 @@
1
- "use strict";
2
- /**
3
- * rename - 重命名期次或任务,自动更新所有关联引用
4
- * 支持单个重命名和批量重命名
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.renameCommand = renameCommand;
8
- const logger_1 = require("../utils/logger");
9
- const fs_extra_1 = require("fs-extra");
10
- const path_1 = require("path");
11
- const global_layer_1 = require("../core/global-layer");
12
- async function renameCommand(options) {
13
- try {
14
- if (options.batch) {
15
- await batchRename(options);
16
- }
17
- else if (options.target && options.newName) {
18
- await singleRename(options);
19
- }
20
- else {
21
- logger_1.logger.error('用法:');
22
- logger_1.logger.info(' 单个重命名: speccore rename --target=<旧名> --new-name=<新名>');
23
- logger_1.logger.info(' 批量重命名: speccore rename --batch --pattern=<旧前缀> --replacement=<新前缀>');
24
- }
25
- }
26
- catch (error) {
27
- logger_1.logger.error(`重命名失败: ${error}`);
28
- throw error;
29
- }
30
- }
31
- /**
32
- * 单个重命名
33
- */
34
- async function singleRename(options) {
35
- const oldName = options.target;
36
- const newName = options.newName;
37
- const cwd = process.cwd();
38
- // 1. 识别目标类型
39
- let targetType;
40
- const isIteration = oldName.includes('期次-');
41
- const isTask = oldName.match(/Task-\d{3}/);
42
- if (isIteration) {
43
- targetType = 'iteration';
44
- }
45
- else if (isTask) {
46
- targetType = 'task';
47
- }
48
- else {
49
- logger_1.logger.error(`无法识别目标类型: "${oldName}"。名称需包含"期次-"或"Task-NNN"。`);
50
- return;
51
- }
52
- // 2. 验证目标存在
53
- const spinner = new logger_1.Spinner('验证目标...');
54
- spinner.start();
55
- let oldPath;
56
- if (targetType === 'iteration') {
57
- oldPath = (0, path_1.join)(cwd, oldName);
58
- }
59
- else {
60
- // Task 需要先找到归属期次
61
- const iterations = await findIterations(cwd);
62
- let found = false;
63
- oldPath = '';
64
- for (const iter of iterations) {
65
- const taskPath = (0, path_1.join)(cwd, iter, oldName);
66
- if (await (0, fs_extra_1.pathExists)(taskPath)) {
67
- oldPath = taskPath;
68
- found = true;
69
- break;
70
- }
71
- }
72
- if (!found) {
73
- spinner.fail(`未找到 Task: ${oldName}`);
74
- logger_1.logger.info('请确认 Task 编号和名称正确。');
75
- return;
76
- }
77
- }
78
- if (!(await (0, fs_extra_1.pathExists)(oldPath))) {
79
- spinner.fail(`目标不存在: ${oldName}`);
80
- return;
81
- }
82
- // 3. 计算影响范围
83
- spinner.stop('计算影响范围...');
84
- const preview = await calculatePreview(targetType, oldName, newName, oldPath);
85
- await showPreview(preview);
86
- if (!options.force) {
87
- logger_1.logger.info('');
88
- logger_1.logger.info('使用 --force 跳过预览并直接执行。');
89
- return;
90
- }
91
- // 4. 执行重命名
92
- await executeRename(preview);
93
- // 5. 更新全量索引
94
- await updateGlobalReferences(oldName, newName, targetType);
95
- }
96
- /**
97
- * 批量重命名
98
- */
99
- async function batchRename(options) {
100
- const pattern = options.pattern;
101
- const replacement = options.replacement;
102
- if (!pattern || !replacement) {
103
- logger_1.logger.error('批量重命名需要 --pattern 和 --replacement 参数。');
104
- return;
105
- }
106
- const cwd = process.cwd();
107
- const iterations = await findIterations(cwd);
108
- let totalCount = 0;
109
- const previews = [];
110
- for (const iter of iterations) {
111
- const iterPath = (0, path_1.join)(cwd, iter);
112
- if (!(await (0, fs_extra_1.pathExists)(iterPath)))
113
- continue;
114
- const entries = await (0, fs_extra_1.readdir)(iterPath, { withFileTypes: true });
115
- for (const entry of entries.filter((e) => e.isDirectory())) {
116
- if (entry.name.match(/Task-\d{3}.*/)) {
117
- const newTaskName = entry.name.replace(pattern, replacement);
118
- if (newTaskName !== entry.name) {
119
- const preview = await calculatePreview('task', entry.name, newTaskName, (0, path_1.join)(iterPath, entry.name));
120
- previews.push(preview);
121
- totalCount++;
122
- }
123
- }
124
- }
125
- }
126
- if (totalCount === 0) {
127
- logger_1.logger.info('没有找到匹配的目标。');
128
- return;
129
- }
130
- logger_1.logger.info('');
131
- logger_1.logger.info('📋 批量重命名预览');
132
- logger_1.logger.info('');
133
- logger_1.logger.info(`操作: 将 "${pattern}" 替换为 "${replacement}"`);
134
- logger_1.logger.info(`影响任务数: ${totalCount}`);
135
- logger_1.logger.info('');
136
- for (const p of previews.slice(0, 10)) {
137
- logger_1.logger.info(` ${p.oldName} → ${p.newName}`);
138
- }
139
- if (previews.length > 10) {
140
- logger_1.logger.info(` ...(共 ${previews.length} 个)`);
141
- }
142
- if (!options.force) {
143
- logger_1.logger.info('');
144
- logger_1.logger.info('⚠️ 批量重命名是高风险操作。使用 --force 执行。');
145
- return;
146
- }
147
- // 执行批量重命名
148
- for (const p of previews) {
149
- try {
150
- await executeRename(p);
151
- logger_1.logger.info(` ✅ ${p.oldName} → ${p.newName}`);
152
- }
153
- catch (e) {
154
- logger_1.logger.error(` ❌ ${p.oldName}: ${e}`);
155
- }
156
- }
157
- logger_1.logger.info('');
158
- logger_1.logger.success(`✅ 批量重命名完成!共 ${totalCount} 个任务`);
159
- }
160
- /**
161
- * 计算影响范围预览
162
- */
163
- async function calculatePreview(type, oldName, newName, oldPath) {
164
- let newPath = oldPath.replace(oldName, newName);
165
- let indexUpdates = 0;
166
- let specRefs = 0;
167
- const files = [];
168
- // 全局索引更新
169
- const index = await (0, global_layer_1.readGlobalIndex)();
170
- if (type === 'iteration') {
171
- indexUpdates += index.reqs.filter((r) => r.iteration === oldName).length;
172
- indexUpdates += index.iterations.filter((i) => i.name === oldName).length;
173
- }
174
- else {
175
- indexUpdates += index.reqs.filter((r) => r.task === oldName).length;
176
- }
177
- // Spec 文件引用数量估算
178
- const iterations = await (async () => {
179
- try {
180
- return await findIterations(process.cwd());
181
- }
182
- catch {
183
- return [];
184
- }
185
- })();
186
- for (const iter of iterations) {
187
- const graphPath = (0, path_1.join)(process.cwd(), iter, '00-期次总览', 'PROJECT_GRAPH.md');
188
- if (await (0, fs_extra_1.pathExists)(graphPath)) {
189
- const gContent = await (0, fs_extra_1.readFile)(graphPath, 'utf-8');
190
- const matches = gContent.split(oldName).length - 1;
191
- specRefs += matches;
192
- if (matches > 0)
193
- files.push(graphPath);
194
- }
195
- }
196
- // 索引文件
197
- const indexPath = (0, path_1.join)(process.cwd(), '.speccore', 'GLOBAL', 'INDEX.md');
198
- if (await (0, fs_extra_1.pathExists)(indexPath)) {
199
- files.push(indexPath);
200
- }
201
- const iterIndexPath = (0, path_1.join)(process.cwd(), '.speccore', 'ITERATIONS', 'README.md');
202
- if (await (0, fs_extra_1.pathExists)(iterIndexPath)) {
203
- files.push(iterIndexPath);
204
- }
205
- return {
206
- type,
207
- oldName,
208
- newName,
209
- dirRename: `${oldPath} → ${newPath}`,
210
- indexUpdates,
211
- specRefs,
212
- files: [...new Set(files)],
213
- };
214
- }
215
- /**
216
- * 显示预览
217
- */
218
- async function showPreview(preview) {
219
- logger_1.logger.info('');
220
- logger_1.logger.info('📋 重命名预览');
221
- logger_1.logger.info('');
222
- logger_1.logger.info(`目标类型: ${preview.type === 'iteration' ? '期次' : '任务'}`);
223
- logger_1.logger.info(`旧名称: ${preview.oldName}`);
224
- logger_1.logger.info(`新名称: ${preview.newName}`);
225
- logger_1.logger.info('');
226
- logger_1.logger.info('影响范围:');
227
- logger_1.logger.info(` 目录重命名: 1 处`);
228
- logger_1.logger.info(` 索引更新: ${preview.indexUpdates} 处`);
229
- logger_1.logger.info(` Spec 引用更新: ~${preview.specRefs} 处`);
230
- logger_1.logger.info(` 涉及文件: ${preview.files.length} 个`);
231
- }
232
- /**
233
- * 执行重命名
234
- */
235
- async function executeRename(preview) {
236
- const cwd = process.cwd();
237
- // 1. 目录重命名
238
- let oldPath;
239
- if (preview.type === 'iteration') {
240
- oldPath = (0, path_1.join)(cwd, preview.oldName);
241
- }
242
- else {
243
- const iterations = await findIterations(cwd);
244
- oldPath = '';
245
- for (const iter of iterations) {
246
- const p = (0, path_1.join)(cwd, iter, preview.oldName);
247
- if (await (0, fs_extra_1.pathExists)(p)) {
248
- oldPath = p;
249
- break;
250
- }
251
- }
252
- }
253
- if (oldPath && await (0, fs_extra_1.pathExists)(oldPath)) {
254
- const newPath = oldPath.replace(preview.oldName, preview.newName);
255
- await (0, fs_extra_1.move)(oldPath, newPath, { overwrite: true });
256
- }
257
- // 2. 更新所有引用文件
258
- for (const file of preview.files) {
259
- if (await (0, fs_extra_1.pathExists)(file)) {
260
- let content = await (0, fs_extra_1.readFile)(file, 'utf-8');
261
- if (content.includes(preview.oldName)) {
262
- content = content.split(preview.oldName).join(preview.newName);
263
- await (0, fs_extra_1.writeFile)(file, content);
264
- }
265
- }
266
- }
267
- }
268
- /**
269
- * 更新全量索引引用
270
- */
271
- async function updateGlobalReferences(oldName, newName, type) {
272
- const index = await (0, global_layer_1.readGlobalIndex)();
273
- for (const req of index.reqs) {
274
- if (type === 'iteration' && req.iteration === oldName) {
275
- await (0, global_layer_1.updateReqInIndex)(req.id, { iteration: newName });
276
- }
277
- else if (type === 'task' && req.task === oldName) {
278
- await (0, global_layer_1.updateReqInIndex)(req.id, { task: newName });
279
- }
280
- }
281
- const newVersion = (0, global_layer_1.bumpGlobalVersion)(index.version);
282
- await (0, global_layer_1.updateIndexVersion)(newVersion);
283
- logger_1.logger.info('');
284
- logger_1.logger.success('✅ 重命名完成!');
285
- logger_1.logger.info('');
286
- logger_1.logger.info(` ${oldName} → ${newName}`);
287
- logger_1.logger.info(' 全量层版本: ' + newVersion);
288
- }
289
- /**
290
- * 查找所有期次目录
291
- */
292
- async function findIterations(cwd) {
293
- const entries = await (0, fs_extra_1.readdir)(cwd, { withFileTypes: true });
294
- return entries
295
- .filter((e) => e.isDirectory() && e.name.startsWith('期次-'))
296
- .map((e) => e.name);
297
- }
298
- //# sourceMappingURL=rename.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AA2BH,sCAeC;AAxCD,4CAAkD;AAClD,uCAA0E;AAC1E,+BAAqC;AACrC,uDAAgH;AAsBzG,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpB,eAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACtE,eAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAChC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,OAAsB;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAO,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAQ,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,YAAY;IACZ,IAAI,UAAgC,CAAC;IACrC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3C,IAAI,WAAW,EAAE,CAAC;QAChB,UAAU,GAAG,WAAW,CAAC;IAC3B,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,UAAU,GAAG,MAAM,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,KAAK,CAAC,cAAc,OAAO,0BAA0B,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,YAAY;IACZ,MAAM,OAAO,GAAG,IAAI,gBAAO,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,OAAe,CAAC;IACpB,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,iBAAiB;QACjB,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,IAAI,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,OAAO,GAAG,QAAQ,CAAC;gBACnB,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;YACrC,eAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,IAAA,qBAAU,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,YAAY;IACZ,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9E,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAE3B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,WAAW;IACX,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAE7B,YAAY;IACZ,MAAM,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,OAAsB;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAExC,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7B,eAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC,CAAC;YAAE,SAAS;QAE5C,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC3D,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAC7D,IAAI,WAAW,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC/B,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACpC,MAAM,EACN,KAAK,CAAC,IAAI,EACV,WAAW,EACX,IAAA,WAAI,EAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAC3B,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACvB,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,UAAU,OAAO,UAAU,WAAW,GAAG,CAAC,CAAC;IACvD,eAAM,CAAC,IAAI,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;IACpC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtC,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACzB,eAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,UAAU;IACV,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;YACvB,eAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,OAAO,CAAC,eAAe,UAAU,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,IAA0B,EAC1B,OAAe,EACf,OAAe,EACf,OAAe;IAEf,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS;IACT,MAAM,KAAK,GAAG,MAAM,IAAA,8BAAe,GAAE,CAAC;IACtC,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACzE,YAAY,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACtE,CAAC;IAED,gBAAgB;IAChB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,CAAC;YAAC,OAAO,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAAC,CAAC;QACnD,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACtB,CAAC,CAAC,EAAE,CAAC;IACL,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAC3E,IAAI,MAAM,IAAA,qBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAQ,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACnD,QAAQ,IAAI,OAAO,CAAC;YACpB,IAAI,OAAO,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO;IACP,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzE,IAAI,MAAM,IAAA,qBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,aAAa,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAClF,IAAI,MAAM,IAAA,qBAAU,EAAC,aAAa,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,IAAI;QACJ,OAAO;QACP,OAAO;QACP,SAAS,EAAE,GAAG,OAAO,MAAM,OAAO,EAAE;QACpC,YAAY;QACZ,QAAQ;QACR,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,OAAsB;IAC/C,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxB,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,eAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,eAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,eAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7B,eAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAClD,eAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACpD,eAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,OAAsB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,WAAW;IACX,IAAI,OAAe,CAAC;IACpB,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,MAAM,IAAA,qBAAU,EAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,OAAO,GAAG,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,MAAM,IAAA,qBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,IAAA,eAAI,EAAC,OAAO,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,cAAc;IACd,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC/D,MAAM,IAAA,oBAAS,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CAAC,OAAe,EAAE,OAAe,EAAE,IAA0B;IAChG,MAAM,KAAK,GAAG,MAAM,IAAA,8BAAe,GAAE,CAAC;IAEtC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YACtD,MAAM,IAAA,+BAAgB,EAAC,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnD,MAAM,IAAA,+BAAgB,EAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,gCAAiB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,IAAA,iCAAkB,EAAC,UAAU,CAAC,CAAC;IAErC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,MAAM,OAAO,MAAM,OAAO,EAAE,CAAC,CAAC;IAC1C,eAAM,CAAC,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * research - 技术调研命令
3
- * 创建技术调研任务,评估技术方案、对比工具选项
4
- */
5
- export interface ResearchOptions {
6
- name?: string;
7
- desc?: string;
8
- topic?: string;
9
- options?: string;
10
- taskId?: string;
11
- iteration?: string;
12
- }
13
- export declare function researchCommand(options: ResearchOptions): Promise<void>;
14
- //# sourceMappingURL=research.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/commands/research.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D7E"}
@@ -1,181 +0,0 @@
1
- "use strict";
2
- /**
3
- * research - 技术调研命令
4
- * 创建技术调研任务,评估技术方案、对比工具选项
5
- */
6
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
- if (k2 === undefined) k2 = k;
8
- var desc = Object.getOwnPropertyDescriptor(m, k);
9
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
- desc = { enumerable: true, get: function() { return m[k]; } };
11
- }
12
- Object.defineProperty(o, k2, desc);
13
- }) : (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- o[k2] = m[k];
16
- }));
17
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
- Object.defineProperty(o, "default", { enumerable: true, value: v });
19
- }) : function(o, v) {
20
- o["default"] = v;
21
- });
22
- var __importStar = (this && this.__importStar) || (function () {
23
- var ownKeys = function(o) {
24
- ownKeys = Object.getOwnPropertyNames || function (o) {
25
- var ar = [];
26
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
- return ar;
28
- };
29
- return ownKeys(o);
30
- };
31
- return function (mod) {
32
- if (mod && mod.__esModule) return mod;
33
- var result = {};
34
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
- __setModuleDefault(result, mod);
36
- return result;
37
- };
38
- })();
39
- Object.defineProperty(exports, "__esModule", { value: true });
40
- exports.researchCommand = researchCommand;
41
- const logger_1 = require("../utils/logger");
42
- const context_1 = require("../core/context");
43
- const fs_extra_1 = require("fs-extra");
44
- const path_1 = require("path");
45
- async function researchCommand(options) {
46
- if (!options.name && !options.topic) {
47
- logger_1.logger.error('请提供调研主题。用法: speccore research --name "<主题>" [--options "选项A,选项B"]');
48
- return;
49
- }
50
- const spinner = new logger_1.Spinner('正在创建技术调研任务...');
51
- spinner.start();
52
- try {
53
- const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
54
- if (!iteration) {
55
- spinner.fail('未找到活跃期次。请先运行: speccore iteration create --name <名称>');
56
- return;
57
- }
58
- const topic = options.name || options.topic || '技术调研';
59
- const taskId = options.taskId || await generateTaskId(iteration);
60
- const compareOptions = options.options
61
- ? options.options.split(',').map((o) => o.trim())
62
- : [];
63
- // 创建调研任务目录
64
- const taskDir = (0, path_1.join)(iteration, taskId);
65
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, 'backend'));
66
- // 创建 .task-type
67
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '.task-type'), 'research');
68
- // 生成调研 Spec
69
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'REQ.md'), generateResearchReq(topic, options.desc || '', compareOptions));
70
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'TASK.md'), generateResearchTask(topic, options.desc || ''));
71
- spinner.stop(`技术调研任务已创建: ${taskId}`);
72
- logger_1.logger.info('');
73
- logger_1.logger.info(`🔬 调研详情:`);
74
- logger_1.logger.info(` 期次: ${iteration}`);
75
- logger_1.logger.info(` 任务: ${taskId} - ${topic}`);
76
- if (compareOptions.length > 0) {
77
- logger_1.logger.info(` 对比选项: ${compareOptions.join(', ')}`);
78
- }
79
- if (options.desc) {
80
- logger_1.logger.info(` 描述: ${options.desc}`);
81
- }
82
- logger_1.logger.info('');
83
- logger_1.logger.info('下一步:');
84
- logger_1.logger.info(` 1. 编辑 ${taskId}/backend/REQ.md 完善调研范围`);
85
- logger_1.logger.info(` 2. 运行: speccore execute --task=${taskId}`);
86
- }
87
- catch (error) {
88
- spinner.fail(`调研任务创建失败: ${error}`);
89
- throw error;
90
- }
91
- }
92
- async function generateTaskId(iteration) {
93
- let maxId = 0;
94
- const iterationDir = (0, path_1.join)(process.cwd(), iteration);
95
- if (await (0, fs_extra_1.pathExists)(iterationDir)) {
96
- const { readdir } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
97
- const entries = await readdir(iterationDir);
98
- for (const entry of entries) {
99
- const match = entry.match(/^Task-(\d+)$/);
100
- if (match) {
101
- const id = parseInt(match[1], 10);
102
- if (id > maxId)
103
- maxId = id;
104
- }
105
- }
106
- }
107
- return `Task-${String(maxId + 1).padStart(3, '0')}`;
108
- }
109
- function generateResearchReq(topic, desc, options) {
110
- let optionsSection = '';
111
- if (options.length > 0) {
112
- optionsSection = '\n## 3. 候选方案\n\n';
113
- for (const opt of options) {
114
- optionsSection += `### ${opt}\n\n- 优势:\n- 劣势:\n- 适用场景:\n\n`;
115
- }
116
- }
117
- return `# ${topic} - 技术调研需求
118
-
119
- ## 1. 调研背景
120
-
121
- ${desc || '请补充调研背景'}
122
-
123
- ## 2. 调研目标
124
-
125
- -
126
- -
127
- ${optionsSection}
128
- ## ${options.length > 0 ? '4' : '3'}. 评估维度
129
-
130
- | 维度 | 权重 | 说明 |
131
- | :--- | :--- | :--- |
132
- | 性能 | 30% | |
133
- | 易用性 | 25% | |
134
- | 生态/社区 | 20% | |
135
- | 维护成本 | 15% | |
136
- | 团队熟悉度 | 10% | |
137
-
138
- ## ${options.length > 0 ? '5' : '4'}. 决策标准
139
-
140
- -
141
- -
142
-
143
- ## ${options.length > 0 ? '6' : '5'}. 产出物
144
-
145
- - [ ] 技术调研报告
146
- - [ ] Demo 代码(如适用)
147
- - [ ] 推荐方案及理由
148
- `;
149
- }
150
- function generateResearchTask(topic, desc) {
151
- const now = new Date().toISOString().split('T')[0];
152
- return `# ${topic} - 执行追踪
153
-
154
- > **任务类型**: research | **创建日期**: ${now} | **状态**: 🔲 待开发
155
-
156
- ## 1. 变更履历
157
-
158
- | 日期 | 版本 | 变更说明 | 作者 |
159
- | :--- | :--- | :--- | :--- |
160
- | ${now} | v1.0 | 初始创建:${desc || topic} | SpecCore |
161
-
162
- ## 2. 调研步骤
163
-
164
- - [ ] 信息收集
165
- - [ ] 对比分析
166
- - [ ] Demo 验证
167
- - [ ] 撰写报告
168
- - [ ] 团队评审
169
-
170
- ## 3. 参考资源
171
-
172
- | 资源 | 链接 | 备注 |
173
- | :--- | :--- | :--- |
174
- | | | |
175
-
176
- ## 4. 结论与建议
177
-
178
- (调研完成后填写)
179
- `;
180
- }
181
- //# sourceMappingURL=research.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/commands/research.ts"],"names":[],"mappings":"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"}