speccore 5.3.2 → 5.3.4

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 (127) hide show
  1. package/dist/commands/audit.d.ts +10 -0
  2. package/dist/commands/audit.d.ts.map +1 -0
  3. package/dist/commands/audit.js +278 -0
  4. package/dist/commands/audit.js.map +1 -0
  5. package/dist/commands/backup.js.map +1 -1
  6. package/dist/commands/baseline.d.ts +13 -0
  7. package/dist/commands/baseline.d.ts.map +1 -0
  8. package/dist/commands/baseline.js +227 -0
  9. package/dist/commands/baseline.js.map +1 -0
  10. package/dist/commands/bugfix.d.ts +13 -0
  11. package/dist/commands/bugfix.d.ts.map +1 -0
  12. package/dist/commands/bugfix.js +181 -0
  13. package/dist/commands/bugfix.js.map +1 -0
  14. package/dist/commands/change.d.ts +14 -0
  15. package/dist/commands/change.d.ts.map +1 -0
  16. package/dist/commands/change.js +208 -0
  17. package/dist/commands/change.js.map +1 -0
  18. package/dist/commands/context.d.ts +8 -0
  19. package/dist/commands/context.d.ts.map +1 -0
  20. package/dist/commands/context.js +180 -0
  21. package/dist/commands/context.js.map +1 -0
  22. package/dist/commands/dashboard.d.ts +9 -0
  23. package/dist/commands/dashboard.d.ts.map +1 -0
  24. package/dist/commands/dashboard.js +209 -0
  25. package/dist/commands/dashboard.js.map +1 -0
  26. package/dist/commands/demo.d.ts +10 -0
  27. package/dist/commands/demo.d.ts.map +1 -0
  28. package/dist/commands/demo.js +151 -0
  29. package/dist/commands/demo.js.map +1 -0
  30. package/dist/commands/diff.d.ts.map +1 -1
  31. package/dist/commands/diff.js +17 -4
  32. package/dist/commands/diff.js.map +1 -1
  33. package/dist/commands/execute.js +5 -2
  34. package/dist/commands/execute.js.map +1 -1
  35. package/dist/commands/global-status.d.ts +9 -0
  36. package/dist/commands/global-status.d.ts.map +1 -0
  37. package/dist/commands/global-status.js +135 -0
  38. package/dist/commands/global-status.js.map +1 -0
  39. package/dist/commands/goal.d.ts +15 -0
  40. package/dist/commands/goal.d.ts.map +1 -0
  41. package/dist/commands/goal.js +232 -0
  42. package/dist/commands/goal.js.map +1 -0
  43. package/dist/commands/handover.d.ts +11 -0
  44. package/dist/commands/handover.d.ts.map +1 -0
  45. package/dist/commands/handover.js +169 -0
  46. package/dist/commands/handover.js.map +1 -0
  47. package/dist/commands/help.d.ts +10 -0
  48. package/dist/commands/help.d.ts.map +1 -0
  49. package/dist/commands/help.js +93 -0
  50. package/dist/commands/help.js.map +1 -0
  51. package/dist/commands/history.d.ts +9 -0
  52. package/dist/commands/history.d.ts.map +1 -0
  53. package/dist/commands/history.js +87 -0
  54. package/dist/commands/history.js.map +1 -0
  55. package/dist/commands/impact.d.ts +12 -0
  56. package/dist/commands/impact.d.ts.map +1 -0
  57. package/dist/commands/impact.js +238 -0
  58. package/dist/commands/impact.js.map +1 -0
  59. package/dist/commands/index-update.d.ts +8 -0
  60. package/dist/commands/index-update.d.ts.map +1 -0
  61. package/dist/commands/index-update.js +180 -0
  62. package/dist/commands/index-update.js.map +1 -0
  63. package/dist/commands/iteration/create.d.ts.map +1 -1
  64. package/dist/commands/iteration/create.js.map +1 -1
  65. package/dist/commands/iteration/split.d.ts.map +1 -1
  66. package/dist/commands/iteration/split.js.map +1 -1
  67. package/dist/commands/iteration-from-global.d.ts +11 -0
  68. package/dist/commands/iteration-from-global.d.ts.map +1 -0
  69. package/dist/commands/iteration-from-global.js +294 -0
  70. package/dist/commands/iteration-from-global.js.map +1 -0
  71. package/dist/commands/new-task.d.ts +15 -0
  72. package/dist/commands/new-task.d.ts.map +1 -0
  73. package/dist/commands/new-task.js +208 -0
  74. package/dist/commands/new-task.js.map +1 -0
  75. package/dist/commands/platform-add.d.ts +12 -0
  76. package/dist/commands/platform-add.d.ts.map +1 -0
  77. package/dist/commands/platform-add.js +111 -0
  78. package/dist/commands/platform-add.js.map +1 -0
  79. package/dist/commands/rename.d.ts +14 -0
  80. package/dist/commands/rename.d.ts.map +1 -0
  81. package/dist/commands/rename.js +298 -0
  82. package/dist/commands/rename.js.map +1 -0
  83. package/dist/commands/research.d.ts +14 -0
  84. package/dist/commands/research.d.ts.map +1 -0
  85. package/dist/commands/research.js +181 -0
  86. package/dist/commands/research.js.map +1 -0
  87. package/dist/commands/retro.d.ts +10 -0
  88. package/dist/commands/retro.d.ts.map +1 -0
  89. package/dist/commands/retro.js +130 -0
  90. package/dist/commands/retro.js.map +1 -0
  91. package/dist/commands/spec.d.ts +8 -0
  92. package/dist/commands/spec.d.ts.map +1 -0
  93. package/dist/commands/spec.js +155 -0
  94. package/dist/commands/spec.js.map +1 -0
  95. package/dist/commands/sync-global.d.ts +13 -0
  96. package/dist/commands/sync-global.d.ts.map +1 -0
  97. package/dist/commands/sync-global.js +218 -0
  98. package/dist/commands/sync-global.js.map +1 -0
  99. package/dist/commands/sync.d.ts +13 -0
  100. package/dist/commands/sync.d.ts.map +1 -0
  101. package/dist/commands/sync.js +199 -0
  102. package/dist/commands/sync.js.map +1 -0
  103. package/dist/commands/task/new.d.ts.map +1 -1
  104. package/dist/commands/task/new.js.map +1 -1
  105. package/dist/commands/template-add.d.ts +12 -0
  106. package/dist/commands/template-add.d.ts.map +1 -0
  107. package/dist/commands/template-add.js +65 -0
  108. package/dist/commands/template-add.js.map +1 -0
  109. package/dist/commands/welcome.d.ts +9 -0
  110. package/dist/commands/welcome.d.ts.map +1 -0
  111. package/dist/commands/welcome.js +166 -0
  112. package/dist/commands/welcome.js.map +1 -0
  113. package/dist/core/global-layer.d.ts +124 -0
  114. package/dist/core/global-layer.d.ts.map +1 -0
  115. package/dist/core/global-layer.js +456 -0
  116. package/dist/core/global-layer.js.map +1 -0
  117. package/dist/core/intent-recognition.d.ts +48 -0
  118. package/dist/core/intent-recognition.d.ts.map +1 -0
  119. package/dist/core/intent-recognition.js +524 -0
  120. package/dist/core/intent-recognition.js.map +1 -0
  121. package/dist/core/schemas/context.schema.d.ts +6 -4
  122. package/dist/core/schemas/context.schema.d.ts.map +1 -1
  123. package/dist/core/schemas/context.schema.js +4 -3
  124. package/dist/core/schemas/context.schema.js.map +1 -1
  125. package/dist/core/state.d.ts.map +1 -1
  126. package/dist/core/state.js.map +1 -1
  127. package/package.json +1 -1
@@ -0,0 +1,298 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,14 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,181 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/commands/research.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * retro - 期次回顾命令
3
+ * 总结期次经验和改进建议
4
+ */
5
+ export interface RetroOptions {
6
+ iteration?: string;
7
+ output?: string;
8
+ }
9
+ export declare function retroCommand(options: RetroOptions): Promise<void>;
10
+ //# sourceMappingURL=retro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retro.d.ts","sourceRoot":"","sources":["../../src/commands/retro.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvE"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /**
3
+ * retro - 期次回顾命令
4
+ * 总结期次经验和改进建议
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.retroCommand = retroCommand;
8
+ const logger_1 = require("../utils/logger");
9
+ const context_1 = require("../core/context");
10
+ const fs_extra_1 = require("fs-extra");
11
+ const path_1 = require("path");
12
+ async function retroCommand(options) {
13
+ const spinner = new logger_1.Spinner('正在生成期次回顾...');
14
+ spinner.start();
15
+ try {
16
+ const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
17
+ if (!iteration) {
18
+ spinner.fail('未找到活跃期次。请先运行: speccore iteration create --name <名称>');
19
+ return;
20
+ }
21
+ const doc = await generateRetroDoc(iteration);
22
+ const outputPath = options.output || (0, path_1.join)(process.cwd(), iteration, '00-期次总览', '回顾总结.md');
23
+ await (0, fs_extra_1.writeFile)(outputPath, doc);
24
+ spinner.stop(`期次回顾已生成: ${outputPath}`);
25
+ logger_1.logger.info('');
26
+ logger_1.logger.info('📝 回顾包含:');
27
+ logger_1.logger.info(' - 期次数据统计');
28
+ logger_1.logger.info(' - 做得好的 (Went Well)');
29
+ logger_1.logger.info(' - 待改进的 (To Improve)');
30
+ logger_1.logger.info(' - 行动计划 (Action Items)');
31
+ }
32
+ catch (error) {
33
+ spinner.fail(`期次回顾生成失败: ${error}`);
34
+ throw error;
35
+ }
36
+ }
37
+ async function generateRetroDoc(iteration) {
38
+ const iterDir = (0, path_1.join)(process.cwd(), iteration);
39
+ const now = new Date().toISOString().split('T')[0];
40
+ // 收集统计数据
41
+ const stats = await collectStats(iterDir, iteration);
42
+ let doc = `# ${iteration} - 期次回顾\n\n`;
43
+ doc += `> 回顾日期: ${now} | 生成工具: SpecCore\n\n`;
44
+ doc += `---\n\n`;
45
+ // 1. 期次数据
46
+ doc += `## 1. 期次数据\n\n`;
47
+ doc += `| 指标 | 数值 |\n`;
48
+ doc += `| :--- | :--- |\n`;
49
+ doc += `| 期次名称 | ${iteration} |\n`;
50
+ doc += `| 总任务数 | ${stats.totalTasks} |\n`;
51
+ doc += `| 完成任务数 | ${stats.completedTasks} |\n`;
52
+ doc += `| 完成率 | ${stats.completionRate}% |\n`;
53
+ doc += `| 任务类型分布 | ${stats.typeDistribution} |\n\n`;
54
+ // 2. 做得好的
55
+ doc += `## 2. 做得好的 👍\n\n`;
56
+ doc += `| 方面 | 具体表现 | 可复用经验 |\n`;
57
+ doc += `| :--- | :--- | :--- |\n`;
58
+ doc += `| | | |\n`;
59
+ doc += `| | | |\n`;
60
+ doc += `| | | |\n\n`;
61
+ // 3. 待改进的
62
+ doc += `## 3. 待改进的 🔧\n\n`;
63
+ doc += `| 方面 | 问题描述 | 影响 | 改进建议 |\n`;
64
+ doc += `| :--- | :--- | :--- | :--- |\n`;
65
+ doc += `| | | | |\n`;
66
+ doc += `| | | | |\n`;
67
+ doc += `| | | | |\n\n`;
68
+ // 4. 行动计划
69
+ doc += `## 4. 行动计划 📋\n\n`;
70
+ doc += `| 行动项 | 负责人 | 截止日期 | 优先级 |\n`;
71
+ doc += `| :--- | :--- | :--- | :--- |\n`;
72
+ if (stats.completionRate < 100) {
73
+ doc += `| 完成剩余 ${stats.totalTasks - stats.completedTasks} 个任务 | 待分配 | | 高 |\n`;
74
+ }
75
+ doc += `| 更新项目 PATTERNS 模式库 | | | 中 |\n`;
76
+ doc += `| 整理技术文档 | | | 中 |\n`;
77
+ doc += `| | | | |\n\n`;
78
+ // 5. 下期展望
79
+ doc += `## 5. 下期展望\n\n`;
80
+ const archPath = (0, path_1.join)(iterDir, '00-需求文档', 'REQUIREMENT.md');
81
+ if (await (0, fs_extra_1.pathExists)(archPath)) {
82
+ const content = await (0, fs_extra_1.readFile)(archPath, 'utf-8');
83
+ const nextMatch = content.match(/下期|后续|下一期/);
84
+ if (nextMatch) {
85
+ doc += '请参考需求文档中的下期规划。\n\n';
86
+ }
87
+ else {
88
+ doc += '(请在需求文档中补充下期规划)\n\n';
89
+ }
90
+ }
91
+ else {
92
+ doc += '(请创建需求文档)\n\n';
93
+ }
94
+ return doc;
95
+ }
96
+ async function collectStats(iterDir, _iteration) {
97
+ let totalTasks = 0;
98
+ let completedTasks = 0;
99
+ const types = {};
100
+ if (await (0, fs_extra_1.pathExists)(iterDir)) {
101
+ const entries = await (0, fs_extra_1.readdir)(iterDir);
102
+ const taskDirs = entries.filter((e) => e.startsWith('Task-'));
103
+ for (const taskDir of taskDirs) {
104
+ totalTasks++;
105
+ const typePath = (0, path_1.join)(iterDir, taskDir, '.task-type');
106
+ if (await (0, fs_extra_1.pathExists)(typePath)) {
107
+ const type = (await (0, fs_extra_1.readFile)(typePath, 'utf-8')).trim();
108
+ types[type] = (types[type] || 0) + 1;
109
+ }
110
+ const taskMdPath = (0, path_1.join)(iterDir, taskDir, 'backend', 'TASK.md');
111
+ if (await (0, fs_extra_1.pathExists)(taskMdPath)) {
112
+ const content = await (0, fs_extra_1.readFile)(taskMdPath, 'utf-8');
113
+ if (content.includes('✅ 已完成')) {
114
+ completedTasks++;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ const completionRate = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
120
+ const typeDist = Object.entries(types)
121
+ .map(([k, v]) => `${k}: ${v}`)
122
+ .join(', ');
123
+ return {
124
+ totalTasks,
125
+ completedTasks,
126
+ completionRate,
127
+ typeDistribution: typeDist || '-',
128
+ };
129
+ }
130
+ //# sourceMappingURL=retro.js.map