speccore 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/README.en.md +401 -0
  2. package/README.md +401 -0
  3. package/bin/speccore +2 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +450 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/archive.d.ts +10 -0
  9. package/dist/commands/archive.d.ts.map +1 -0
  10. package/dist/commands/archive.js +138 -0
  11. package/dist/commands/archive.js.map +1 -0
  12. package/dist/commands/audit.d.ts +10 -0
  13. package/dist/commands/audit.d.ts.map +1 -0
  14. package/dist/commands/audit.js +278 -0
  15. package/dist/commands/audit.js.map +1 -0
  16. package/dist/commands/baseline.d.ts +13 -0
  17. package/dist/commands/baseline.d.ts.map +1 -0
  18. package/dist/commands/baseline.js +227 -0
  19. package/dist/commands/baseline.js.map +1 -0
  20. package/dist/commands/bugfix.d.ts +13 -0
  21. package/dist/commands/bugfix.d.ts.map +1 -0
  22. package/dist/commands/bugfix.js +181 -0
  23. package/dist/commands/bugfix.js.map +1 -0
  24. package/dist/commands/change.d.ts +14 -0
  25. package/dist/commands/change.d.ts.map +1 -0
  26. package/dist/commands/change.js +150 -0
  27. package/dist/commands/change.js.map +1 -0
  28. package/dist/commands/config.d.ts +7 -0
  29. package/dist/commands/config.d.ts.map +1 -0
  30. package/dist/commands/config.js +110 -0
  31. package/dist/commands/config.js.map +1 -0
  32. package/dist/commands/dashboard.d.ts +9 -0
  33. package/dist/commands/dashboard.d.ts.map +1 -0
  34. package/dist/commands/dashboard.js +209 -0
  35. package/dist/commands/dashboard.js.map +1 -0
  36. package/dist/commands/demo.d.ts +10 -0
  37. package/dist/commands/demo.d.ts.map +1 -0
  38. package/dist/commands/demo.js +151 -0
  39. package/dist/commands/demo.js.map +1 -0
  40. package/dist/commands/execute.d.ts +18 -0
  41. package/dist/commands/execute.d.ts.map +1 -0
  42. package/dist/commands/execute.js +127 -0
  43. package/dist/commands/execute.js.map +1 -0
  44. package/dist/commands/global-status.d.ts +9 -0
  45. package/dist/commands/global-status.d.ts.map +1 -0
  46. package/dist/commands/global-status.js +135 -0
  47. package/dist/commands/global-status.js.map +1 -0
  48. package/dist/commands/goal.d.ts +15 -0
  49. package/dist/commands/goal.d.ts.map +1 -0
  50. package/dist/commands/goal.js +282 -0
  51. package/dist/commands/goal.js.map +1 -0
  52. package/dist/commands/handover.d.ts +11 -0
  53. package/dist/commands/handover.d.ts.map +1 -0
  54. package/dist/commands/handover.js +169 -0
  55. package/dist/commands/handover.js.map +1 -0
  56. package/dist/commands/health.d.ts +7 -0
  57. package/dist/commands/health.d.ts.map +1 -0
  58. package/dist/commands/health.js +80 -0
  59. package/dist/commands/health.js.map +1 -0
  60. package/dist/commands/help.d.ts +10 -0
  61. package/dist/commands/help.d.ts.map +1 -0
  62. package/dist/commands/help.js +93 -0
  63. package/dist/commands/help.js.map +1 -0
  64. package/dist/commands/history.d.ts +9 -0
  65. package/dist/commands/history.d.ts.map +1 -0
  66. package/dist/commands/history.js +87 -0
  67. package/dist/commands/history.js.map +1 -0
  68. package/dist/commands/impact.d.ts +12 -0
  69. package/dist/commands/impact.d.ts.map +1 -0
  70. package/dist/commands/impact.js +238 -0
  71. package/dist/commands/impact.js.map +1 -0
  72. package/dist/commands/import.d.ts +15 -0
  73. package/dist/commands/import.d.ts.map +1 -0
  74. package/dist/commands/import.js +366 -0
  75. package/dist/commands/import.js.map +1 -0
  76. package/dist/commands/init.d.ts +6 -0
  77. package/dist/commands/init.d.ts.map +1 -0
  78. package/dist/commands/init.js +564 -0
  79. package/dist/commands/init.js.map +1 -0
  80. package/dist/commands/iteration/create.d.ts +7 -0
  81. package/dist/commands/iteration/create.d.ts.map +1 -0
  82. package/dist/commands/iteration/create.js +141 -0
  83. package/dist/commands/iteration/create.js.map +1 -0
  84. package/dist/commands/iteration/split.d.ts +9 -0
  85. package/dist/commands/iteration/split.d.ts.map +1 -0
  86. package/dist/commands/iteration/split.js +165 -0
  87. package/dist/commands/iteration/split.js.map +1 -0
  88. package/dist/commands/iteration-from-global.d.ts +11 -0
  89. package/dist/commands/iteration-from-global.d.ts.map +1 -0
  90. package/dist/commands/iteration-from-global.js +294 -0
  91. package/dist/commands/iteration-from-global.js.map +1 -0
  92. package/dist/commands/plan.d.ts +12 -0
  93. package/dist/commands/plan.d.ts.map +1 -0
  94. package/dist/commands/plan.js +126 -0
  95. package/dist/commands/plan.js.map +1 -0
  96. package/dist/commands/progress.d.ts +10 -0
  97. package/dist/commands/progress.d.ts.map +1 -0
  98. package/dist/commands/progress.js +89 -0
  99. package/dist/commands/progress.js.map +1 -0
  100. package/dist/commands/rename.d.ts +14 -0
  101. package/dist/commands/rename.d.ts.map +1 -0
  102. package/dist/commands/rename.js +298 -0
  103. package/dist/commands/rename.js.map +1 -0
  104. package/dist/commands/report.d.ts +10 -0
  105. package/dist/commands/report.d.ts.map +1 -0
  106. package/dist/commands/report.js +124 -0
  107. package/dist/commands/report.js.map +1 -0
  108. package/dist/commands/research.d.ts +14 -0
  109. package/dist/commands/research.d.ts.map +1 -0
  110. package/dist/commands/research.js +181 -0
  111. package/dist/commands/research.js.map +1 -0
  112. package/dist/commands/retro.d.ts +10 -0
  113. package/dist/commands/retro.d.ts.map +1 -0
  114. package/dist/commands/retro.js +130 -0
  115. package/dist/commands/retro.js.map +1 -0
  116. package/dist/commands/spec.d.ts +8 -0
  117. package/dist/commands/spec.d.ts.map +1 -0
  118. package/dist/commands/spec.js +155 -0
  119. package/dist/commands/spec.js.map +1 -0
  120. package/dist/commands/status.d.ts +7 -0
  121. package/dist/commands/status.d.ts.map +1 -0
  122. package/dist/commands/status.js +48 -0
  123. package/dist/commands/status.js.map +1 -0
  124. package/dist/commands/sync-global.d.ts +13 -0
  125. package/dist/commands/sync-global.d.ts.map +1 -0
  126. package/dist/commands/sync-global.js +218 -0
  127. package/dist/commands/sync-global.js.map +1 -0
  128. package/dist/commands/sync.d.ts +13 -0
  129. package/dist/commands/sync.d.ts.map +1 -0
  130. package/dist/commands/sync.js +170 -0
  131. package/dist/commands/sync.js.map +1 -0
  132. package/dist/commands/task/new.d.ts +13 -0
  133. package/dist/commands/task/new.d.ts.map +1 -0
  134. package/dist/commands/task/new.js +195 -0
  135. package/dist/commands/task/new.js.map +1 -0
  136. package/dist/commands/template-add.d.ts +12 -0
  137. package/dist/commands/template-add.d.ts.map +1 -0
  138. package/dist/commands/template-add.js +65 -0
  139. package/dist/commands/template-add.js.map +1 -0
  140. package/dist/commands/validate.d.ts +10 -0
  141. package/dist/commands/validate.d.ts.map +1 -0
  142. package/dist/commands/validate.js +37 -0
  143. package/dist/commands/validate.js.map +1 -0
  144. package/dist/commands/welcome.d.ts +9 -0
  145. package/dist/commands/welcome.d.ts.map +1 -0
  146. package/dist/commands/welcome.js +166 -0
  147. package/dist/commands/welcome.js.map +1 -0
  148. package/dist/core/context.d.ts +31 -0
  149. package/dist/core/context.d.ts.map +1 -0
  150. package/dist/core/context.js +145 -0
  151. package/dist/core/context.js.map +1 -0
  152. package/dist/core/global-layer.d.ts +124 -0
  153. package/dist/core/global-layer.d.ts.map +1 -0
  154. package/dist/core/global-layer.js +456 -0
  155. package/dist/core/global-layer.js.map +1 -0
  156. package/dist/core/index.d.ts +8 -0
  157. package/dist/core/index.d.ts.map +1 -0
  158. package/dist/core/index.js +24 -0
  159. package/dist/core/index.js.map +1 -0
  160. package/dist/core/intent-recognition.d.ts +48 -0
  161. package/dist/core/intent-recognition.d.ts.map +1 -0
  162. package/dist/core/intent-recognition.js +485 -0
  163. package/dist/core/intent-recognition.js.map +1 -0
  164. package/dist/core/state.d.ts +26 -0
  165. package/dist/core/state.d.ts.map +1 -0
  166. package/dist/core/state.js +187 -0
  167. package/dist/core/state.js.map +1 -0
  168. package/dist/core/template-engine.d.ts +28 -0
  169. package/dist/core/template-engine.d.ts.map +1 -0
  170. package/dist/core/template-engine.js +57 -0
  171. package/dist/core/template-engine.js.map +1 -0
  172. package/dist/core/validator.d.ts +26 -0
  173. package/dist/core/validator.d.ts.map +1 -0
  174. package/dist/core/validator.js +246 -0
  175. package/dist/core/validator.js.map +1 -0
  176. package/dist/core/yaml-parser.d.ts +25 -0
  177. package/dist/core/yaml-parser.d.ts.map +1 -0
  178. package/dist/core/yaml-parser.js +113 -0
  179. package/dist/core/yaml-parser.js.map +1 -0
  180. package/dist/index.d.ts +2 -0
  181. package/dist/index.d.ts.map +1 -0
  182. package/dist/index.js +18 -0
  183. package/dist/index.js.map +1 -0
  184. package/dist/utils/file.d.ts +29 -0
  185. package/dist/utils/file.d.ts.map +1 -0
  186. package/dist/utils/file.js +126 -0
  187. package/dist/utils/file.js.map +1 -0
  188. package/dist/utils/git.d.ts +25 -0
  189. package/dist/utils/git.d.ts.map +1 -0
  190. package/dist/utils/git.js +77 -0
  191. package/dist/utils/git.js.map +1 -0
  192. package/dist/utils/logger.d.ts +41 -0
  193. package/dist/utils/logger.d.ts.map +1 -0
  194. package/dist/utils/logger.js +184 -0
  195. package/dist/utils/logger.js.map +1 -0
  196. package/package.json +49 -0
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportCommand = reportCommand;
4
+ const fs_extra_1 = require("fs-extra");
5
+ const path_1 = require("path");
6
+ const logger_1 = require("../utils/logger");
7
+ const context_1 = require("../core/context");
8
+ const state_1 = require("../core/state");
9
+ async function reportCommand(options) {
10
+ const spinner = new logger_1.Spinner('Generating project report');
11
+ spinner.start();
12
+ try {
13
+ const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
14
+ if (!iteration) {
15
+ spinner.fail('No active iteration found. Please specify --iteration or create one first.');
16
+ return;
17
+ }
18
+ const graph = await (0, state_1.readProjectGraph)(iteration);
19
+ const tasks = graph.tasks.length > 0 ? graph.tasks : await (0, state_1.scanTasks)(iteration);
20
+ const report = generateReport(iteration, tasks, options);
21
+ if (options.output) {
22
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(options.output, '..'));
23
+ await (0, fs_extra_1.writeFile)(options.output, report);
24
+ spinner.stop(`Report saved to: ${options.output}`);
25
+ }
26
+ else {
27
+ spinner.stop('Report generated');
28
+ console.log(report);
29
+ }
30
+ }
31
+ catch (error) {
32
+ spinner.fail(`Report generation failed: ${error}`);
33
+ throw error;
34
+ }
35
+ }
36
+ function generateReport(iteration, tasks, options) {
37
+ const total = tasks.length;
38
+ const completed = tasks.filter(t => t.status === 'completed').length;
39
+ const inProgress = tasks.filter(t => t.status === 'in_progress').length;
40
+ const pending = tasks.filter(t => t.status === 'pending').length;
41
+ const completionRate = total > 0 ? Math.round((completed / total) * 100) : 0;
42
+ const format = options.format || 'markdown';
43
+ if (format === 'json') {
44
+ return JSON.stringify({
45
+ iteration,
46
+ generatedAt: new Date().toISOString(),
47
+ summary: { total, completed, inProgress, pending, completionRate },
48
+ tasks: tasks.map(t => ({
49
+ id: t.id,
50
+ name: t.name,
51
+ type: t.type,
52
+ status: t.status,
53
+ assignee: t.assignee
54
+ }))
55
+ }, null, 2);
56
+ }
57
+ if (format === 'html') {
58
+ return generateHtmlReport(iteration, total, completed, inProgress, pending, completionRate, tasks);
59
+ }
60
+ return generateMarkdownReport(iteration, total, completed, inProgress, pending, completionRate, tasks, options);
61
+ }
62
+ function generateMarkdownReport(iteration, total, completed, inProgress, pending, completionRate, tasks, options) {
63
+ const lines = [];
64
+ lines.push(`# Project Report - ${iteration}`);
65
+ lines.push('');
66
+ lines.push(`> Generated at: ${new Date().toISOString()}`);
67
+ lines.push('');
68
+ lines.push('## Summary');
69
+ lines.push('');
70
+ lines.push(`| Metric | Value |`);
71
+ lines.push(`| :--- | :--- |`);
72
+ lines.push(`| Total Tasks | ${total} |`);
73
+ lines.push(`| Completed | ${completed} |`);
74
+ lines.push(`| In Progress | ${inProgress} |`);
75
+ lines.push(`| Pending | ${pending} |`);
76
+ lines.push(`| Completion Rate | ${completionRate}% |`);
77
+ lines.push('');
78
+ lines.push('## Task List');
79
+ lines.push('');
80
+ lines.push(`| Task | Type | Status | Progress | Assignee |`);
81
+ lines.push(`| :--- | :--- | :--- | :--- | :--- |`);
82
+ for (const task of tasks) {
83
+ lines.push(`| ${task.id} | ${task.type} | ${task.status} | ${task.progress}% | ${task.assignee || '-'} |`);
84
+ }
85
+ lines.push('');
86
+ lines.push('---');
87
+ lines.push('Generated by SpecCore');
88
+ return lines.join('\n');
89
+ }
90
+ function generateHtmlReport(iteration, total, completed, inProgress, pending, completionRate, tasks) {
91
+ return `<!DOCTYPE html>
92
+ <html>
93
+ <head>
94
+ <meta charset="UTF-8">
95
+ <title>Project Report - ${iteration}</title>
96
+ <style>
97
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; margin: 40px; }
98
+ h1 { color: #333; }
99
+ table { border-collapse: collapse; width: 100%; margin: 20px 0; }
100
+ th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
101
+ th { background: #f5f5f5; }
102
+ .progress { background: #4CAF50; color: white; padding: 4px 8px; border-radius: 4px; }
103
+ </style>
104
+ </head>
105
+ <body>
106
+ <h1>Project Report - ${iteration}</h1>
107
+ <p>Generated at: ${new Date().toISOString()}</p>
108
+ <table>
109
+ <tr><th>Metric</th><th>Value</th></tr>
110
+ <tr><td>Total Tasks</td><td>${total}</td></tr>
111
+ <tr><td>Completed</td><td>${completed}</td></tr>
112
+ <tr><td>In Progress</td><td>${inProgress}</td></tr>
113
+ <tr><td>Pending</td><td>${pending}</td></tr>
114
+ <tr><td>Completion Rate</td><td><span class="progress">${completionRate}%</span></td></tr>
115
+ </table>
116
+ <h2>Task List</h2>
117
+ <table>
118
+ <tr><th>Task</th><th>Type</th><th>Status</th><th>Progress</th><th>Assignee</th></tr>
119
+ ${tasks.map(t => `<tr><td>${t.id}</td><td>${t.type}</td><td>${t.status}</td><td>${t.progress}%</td><td>${t.assignee || '-'}</td></tr>`).join('')}
120
+ </table>
121
+ </body>
122
+ </html>`;
123
+ }
124
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
@@ -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;AAOH,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;AAOH,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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retro.js","sourceRoot":"","sources":["../../src/commands/retro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * /spec - 智能入口命令
3
+ * 自然语言意图识别引擎,自动匹配最合适的 SpecCore 命令
4
+ */
5
+ export interface SpecOptions {
6
+ }
7
+ export declare function specCommand(input: string, _options: SpecOptions): Promise<void>;
8
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;CAE3B;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DrF"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ /**
3
+ * /spec - 智能入口命令
4
+ * 自然语言意图识别引擎,自动匹配最合适的 SpecCore 命令
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.specCommand = specCommand;
8
+ const intent_recognition_1 = require("../core/intent-recognition");
9
+ const logger_1 = require("../utils/logger");
10
+ const context_1 = require("../core/context");
11
+ async function specCommand(input, _options) {
12
+ if (!input || !input.trim()) {
13
+ logger_1.logger.info('🔍 SpecCore 智能入口');
14
+ logger_1.logger.info('');
15
+ logger_1.logger.info('用法: speccore spec "<自然语言描述>"');
16
+ logger_1.logger.info('');
17
+ logger_1.logger.info('示例:');
18
+ logger_1.logger.info(' speccore spec "做一个用户登录功能,支持手机号+密码"');
19
+ logger_1.logger.info(' speccore spec "修复登录超时问题"');
20
+ logger_1.logger.info(' speccore spec "查看进度"');
21
+ logger_1.logger.info(' speccore spec "开始干活"');
22
+ logger_1.logger.info(' speccore spec "把登录改成验证码登录"');
23
+ logger_1.logger.info(' speccore spec "审查一下"');
24
+ return;
25
+ }
26
+ logger_1.logger.info(`🔍 正在理解你的意图...`);
27
+ logger_1.logger.info('');
28
+ const iteration = await (0, context_1.getDefaultIteration)();
29
+ const assignee = await (0, context_1.getDefaultAssignee)();
30
+ const results = await (0, intent_recognition_1.recognizeIntent)(input);
31
+ if (results.length === 0) {
32
+ // 低置信度:无法识别
33
+ logger_1.logger.warn('🤔 我没有完全理解你的意图,请补充说明。');
34
+ logger_1.logger.info('');
35
+ logger_1.logger.info('你可以这样说:');
36
+ logger_1.logger.info(' - "查看项目进度"');
37
+ logger_1.logger.info(' - "帮我创建一个登录功能"');
38
+ logger_1.logger.info(' - "审查一下当前任务"');
39
+ logger_1.logger.info(' - "开始开发"');
40
+ logger_1.logger.info(' - "把登录改成验证码登录"');
41
+ return;
42
+ }
43
+ const best = results[0];
44
+ const level = (0, intent_recognition_1.getConfidenceLevel)(best.confidence);
45
+ // 显示上下文信息
46
+ if (iteration) {
47
+ logger_1.logger.info(`📍 当前期次: ${iteration}`);
48
+ }
49
+ if (assignee && assignee !== 'unknown') {
50
+ logger_1.logger.info(`👤 当前用户: ${assignee}`);
51
+ }
52
+ logger_1.logger.info('');
53
+ if (level === 'high') {
54
+ // 高置信度 (>=80%):展示预览
55
+ await showHighConfidenceResult(best, iteration);
56
+ }
57
+ else if (level === 'medium') {
58
+ // 中置信度 (50-80%):展示候选列表
59
+ showMediumConfidenceResults(results.slice(0, 3), iteration);
60
+ }
61
+ else {
62
+ // 低置信度 (<50%):引导澄清
63
+ showLowConfidenceGuidance(results.slice(0, 2), input);
64
+ }
65
+ }
66
+ async function showHighConfidenceResult(result, iteration) {
67
+ logger_1.logger.info(`🔍 我理解你想:**${getIntentLabel(result.intent)}**`);
68
+ logger_1.logger.info(` 置信度: ${result.confidence}% | 匹配命令: speccore ${result.command}`);
69
+ logger_1.logger.info('');
70
+ // 显示匹配详情
71
+ if (result.matchedTriggers.length > 0) {
72
+ logger_1.logger.debug(` 命中规则: ${result.matchedTriggers.join(', ')}`);
73
+ }
74
+ // 显示提取的参数
75
+ const params = result.extractedParams;
76
+ if (Object.keys(params).length > 0) {
77
+ logger_1.logger.info('📝 已提取参数:');
78
+ for (const [key, value] of Object.entries(params)) {
79
+ logger_1.logger.info(` ${key}: ${value}`);
80
+ }
81
+ logger_1.logger.info('');
82
+ }
83
+ // 构建执行命令预览
84
+ let cmdPreview = `speccore ${result.command}`;
85
+ if (params.name) {
86
+ cmdPreview += ` --name "${params.name}"`;
87
+ }
88
+ if (params.desc) {
89
+ cmdPreview += ` --desc "${params.desc}"`;
90
+ }
91
+ if (iteration && !params.iteration) {
92
+ cmdPreview += ` --iteration "${iteration}"`;
93
+ }
94
+ if (params.iteration) {
95
+ cmdPreview += ` --iteration "${params.iteration}"`;
96
+ }
97
+ logger_1.logger.info('📍 建议执行:');
98
+ logger_1.logger.info(` $ ${cmdPreview}`);
99
+ logger_1.logger.info('');
100
+ logger_1.logger.info('💡 提示: 直接运行上述命令即可执行。或使用 --force 跳过确认。');
101
+ }
102
+ function showMediumConfidenceResults(results, iteration) {
103
+ logger_1.logger.info('🔍 我注意到你的输入可能有多种含义:');
104
+ logger_1.logger.info('');
105
+ for (let i = 0; i < results.length; i++) {
106
+ const r = results[i];
107
+ const cmdPreview = `speccore ${r.command}${iteration ? ` --iteration "${iteration}"` : ''}`;
108
+ logger_1.logger.info(` ${i + 1}. **${getIntentLabel(r.intent)}** (置信度: ${r.confidence}%) → ${cmdPreview}`);
109
+ }
110
+ logger_1.logger.info('');
111
+ logger_1.logger.info('💡 请输入序号选择(默认 1),或补充更多信息后重试。');
112
+ }
113
+ function showLowConfidenceGuidance(results, input) {
114
+ logger_1.logger.warn(`🤔 对"${input}"的识别置信度较低。`);
115
+ if (results.length > 0) {
116
+ logger_1.logger.info('');
117
+ logger_1.logger.info('你可能想说的是:');
118
+ for (const r of results.slice(0, 2)) {
119
+ logger_1.logger.info(` - ${getIntentLabel(r.intent)} (speccore ${r.command})`);
120
+ }
121
+ }
122
+ logger_1.logger.info('');
123
+ logger_1.logger.info('你可以补充更多信息,例如:');
124
+ logger_1.logger.info(' - "查看项目进度"');
125
+ logger_1.logger.info(' - "帮我创建一个登录功能"');
126
+ logger_1.logger.info(' - "审查一下当前任务"');
127
+ logger_1.logger.info(' - "开始开发"');
128
+ }
129
+ function getIntentLabel(intent) {
130
+ const labels = {
131
+ change: '🔄 需求变更',
132
+ execute: '⚡ 执行开发',
133
+ create: '✨ 创建功能/任务',
134
+ bugfix: '🐛 Bug 修复',
135
+ review: '✅ 审查产出',
136
+ plan: '📐 智能调度',
137
+ reference: '📚 查找参考',
138
+ archive: '📦 归档任务',
139
+ query_progress: '📊 查看进度',
140
+ handover: '📤 生成交接文档',
141
+ health: '🏥 查看健康度',
142
+ config: '⚙️ 配置管理',
143
+ help: '📖 查看帮助',
144
+ demo: '🎮 快速体验',
145
+ welcome: '👋 新手引导',
146
+ init: '🏗️ 项目初始化',
147
+ import: '📥 导入项目',
148
+ research: '🔬 技术调研',
149
+ sync: '🔄 反向同步',
150
+ retro: '📝 期次回顾',
151
+ template_add: '📄 添加模板',
152
+ };
153
+ return labels[intent] || intent;
154
+ }
155
+ //# sourceMappingURL=spec.js.map