speccore 5.4.3 → 5.5.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 (117) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +4 -4
  3. package/dist/cli.js +19 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/audit.d.ts +10 -0
  6. package/dist/commands/audit.d.ts.map +1 -0
  7. package/dist/commands/audit.js +278 -0
  8. package/dist/commands/audit.js.map +1 -0
  9. package/dist/commands/baseline.d.ts +13 -0
  10. package/dist/commands/baseline.d.ts.map +1 -0
  11. package/dist/commands/baseline.js +227 -0
  12. package/dist/commands/baseline.js.map +1 -0
  13. package/dist/commands/bugfix.d.ts +13 -0
  14. package/dist/commands/bugfix.d.ts.map +1 -0
  15. package/dist/commands/bugfix.js +181 -0
  16. package/dist/commands/bugfix.js.map +1 -0
  17. package/dist/commands/change.d.ts +14 -0
  18. package/dist/commands/change.d.ts.map +1 -0
  19. package/dist/commands/change.js +208 -0
  20. package/dist/commands/change.js.map +1 -0
  21. package/dist/commands/context.d.ts +8 -0
  22. package/dist/commands/context.d.ts.map +1 -0
  23. package/dist/commands/context.js +180 -0
  24. package/dist/commands/context.js.map +1 -0
  25. package/dist/commands/dashboard.d.ts +9 -0
  26. package/dist/commands/dashboard.d.ts.map +1 -0
  27. package/dist/commands/dashboard.js +209 -0
  28. package/dist/commands/dashboard.js.map +1 -0
  29. package/dist/commands/delete.d.ts +16 -0
  30. package/dist/commands/delete.d.ts.map +1 -0
  31. package/dist/commands/delete.js +177 -0
  32. package/dist/commands/delete.js.map +1 -0
  33. package/dist/commands/demo.d.ts +10 -0
  34. package/dist/commands/demo.d.ts.map +1 -0
  35. package/dist/commands/demo.js +151 -0
  36. package/dist/commands/demo.js.map +1 -0
  37. package/dist/commands/global-status.d.ts +9 -0
  38. package/dist/commands/global-status.d.ts.map +1 -0
  39. package/dist/commands/global-status.js +135 -0
  40. package/dist/commands/global-status.js.map +1 -0
  41. package/dist/commands/goal.d.ts +15 -0
  42. package/dist/commands/goal.d.ts.map +1 -0
  43. package/dist/commands/goal.js +232 -0
  44. package/dist/commands/goal.js.map +1 -0
  45. package/dist/commands/handover.d.ts +11 -0
  46. package/dist/commands/handover.d.ts.map +1 -0
  47. package/dist/commands/handover.js +169 -0
  48. package/dist/commands/handover.js.map +1 -0
  49. package/dist/commands/help.d.ts +10 -0
  50. package/dist/commands/help.d.ts.map +1 -0
  51. package/dist/commands/help.js +93 -0
  52. package/dist/commands/help.js.map +1 -0
  53. package/dist/commands/history.d.ts +9 -0
  54. package/dist/commands/history.d.ts.map +1 -0
  55. package/dist/commands/history.js +87 -0
  56. package/dist/commands/history.js.map +1 -0
  57. package/dist/commands/impact.d.ts +12 -0
  58. package/dist/commands/impact.d.ts.map +1 -0
  59. package/dist/commands/impact.js +238 -0
  60. package/dist/commands/impact.js.map +1 -0
  61. package/dist/commands/index-update.d.ts +8 -0
  62. package/dist/commands/index-update.d.ts.map +1 -0
  63. package/dist/commands/index-update.js +180 -0
  64. package/dist/commands/index-update.js.map +1 -0
  65. package/dist/commands/iteration-from-global.d.ts +11 -0
  66. package/dist/commands/iteration-from-global.d.ts.map +1 -0
  67. package/dist/commands/iteration-from-global.js +294 -0
  68. package/dist/commands/iteration-from-global.js.map +1 -0
  69. package/dist/commands/new-task.d.ts +15 -0
  70. package/dist/commands/new-task.d.ts.map +1 -0
  71. package/dist/commands/new-task.js +208 -0
  72. package/dist/commands/new-task.js.map +1 -0
  73. package/dist/commands/platform-add.d.ts +12 -0
  74. package/dist/commands/platform-add.d.ts.map +1 -0
  75. package/dist/commands/platform-add.js +111 -0
  76. package/dist/commands/platform-add.js.map +1 -0
  77. package/dist/commands/rename.d.ts +14 -0
  78. package/dist/commands/rename.d.ts.map +1 -0
  79. package/dist/commands/rename.js +298 -0
  80. package/dist/commands/rename.js.map +1 -0
  81. package/dist/commands/research.d.ts +14 -0
  82. package/dist/commands/research.d.ts.map +1 -0
  83. package/dist/commands/research.js +181 -0
  84. package/dist/commands/research.js.map +1 -0
  85. package/dist/commands/retro.d.ts +10 -0
  86. package/dist/commands/retro.d.ts.map +1 -0
  87. package/dist/commands/retro.js +130 -0
  88. package/dist/commands/retro.js.map +1 -0
  89. package/dist/commands/spec.d.ts +8 -0
  90. package/dist/commands/spec.d.ts.map +1 -0
  91. package/dist/commands/spec.js +155 -0
  92. package/dist/commands/spec.js.map +1 -0
  93. package/dist/commands/sync-global.d.ts +13 -0
  94. package/dist/commands/sync-global.d.ts.map +1 -0
  95. package/dist/commands/sync-global.js +218 -0
  96. package/dist/commands/sync-global.js.map +1 -0
  97. package/dist/commands/sync.d.ts +13 -0
  98. package/dist/commands/sync.d.ts.map +1 -0
  99. package/dist/commands/sync.js +216 -0
  100. package/dist/commands/sync.js.map +1 -0
  101. package/dist/commands/template-add.d.ts +12 -0
  102. package/dist/commands/template-add.d.ts.map +1 -0
  103. package/dist/commands/template-add.js +65 -0
  104. package/dist/commands/template-add.js.map +1 -0
  105. package/dist/commands/welcome.d.ts +9 -0
  106. package/dist/commands/welcome.d.ts.map +1 -0
  107. package/dist/commands/welcome.js +166 -0
  108. package/dist/commands/welcome.js.map +1 -0
  109. package/dist/core/global-layer.d.ts +124 -0
  110. package/dist/core/global-layer.d.ts.map +1 -0
  111. package/dist/core/global-layer.js +456 -0
  112. package/dist/core/global-layer.js.map +1 -0
  113. package/dist/core/intent-recognition.d.ts +48 -0
  114. package/dist/core/intent-recognition.d.ts.map +1 -0
  115. package/dist/core/intent-recognition.js +524 -0
  116. package/dist/core/intent-recognition.js.map +1 -0
  117. package/package.json +1 -1
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * sync - 反向同步命令
4
+ * 检测代码与 Spec 的差异,更新 Spec 文件
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.syncCommand = syncCommand;
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
+ const transaction_1 = require("../core/transaction");
46
+ const reverse_sync_1 = require("../core/reverse-sync");
47
+ async function syncCommand(options) {
48
+ if (!options.task && !options.iteration) {
49
+ logger_1.logger.error('请指定要同步的 Task 或期次。用法: speccore sync --task=<Task编号> [--auto]');
50
+ return;
51
+ }
52
+ const spinner = new logger_1.Spinner('正在检测 Spec 差异...');
53
+ spinner.start();
54
+ try {
55
+ const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
56
+ if (!iteration) {
57
+ spinner.fail('未找到活跃期次。请先运行: speccore iteration create --name <名称>');
58
+ return;
59
+ }
60
+ if (options.dryRun) {
61
+ await dryRunSync(options, iteration);
62
+ // Show reverse sync preview in dry-run mode
63
+ const rootDir = process.cwd();
64
+ logger_1.logger.info('');
65
+ logger_1.logger.info('🔍 Scanning code for @spec annotations...');
66
+ const refs = await (await Promise.resolve().then(() => __importStar(require('../core/reverse-sync')))).scanCodeForSpecAnnotations(rootDir);
67
+ logger_1.logger.info(` Found ${refs.length} @spec references in code`);
68
+ spinner.stop('差异分析完成(--dry-run 模式,未实际同步)');
69
+ return;
70
+ }
71
+ if (options.task) {
72
+ await syncTaskSpec(options.task, iteration, options.auto || false);
73
+ }
74
+ else {
75
+ await syncIterationSpec(iteration, options.auto || false);
76
+ }
77
+ spinner.stop('Spec 同步完成');
78
+ logger_1.logger.info('');
79
+ // Real time reverse sync: scan code → update TASK.md
80
+ const rootDir = process.cwd();
81
+ logger_1.logger.info('🔄 Reverse sync: scanning code for @spec annotations...');
82
+ const result = await (0, reverse_sync_1.reverseSync)(rootDir, iteration);
83
+ if (result.length > 0) {
84
+ logger_1.logger.success(`Reverse sync complete: ${result.length} tasks updated`);
85
+ }
86
+ else {
87
+ logger_1.logger.info(' No @spec references found in code');
88
+ }
89
+ logger_1.logger.info('💡 提示: 运行 speccore validate 确保同步后的 Spec 完整性');
90
+ }
91
+ catch (error) {
92
+ spinner.fail(`同步失败: ${error}`);
93
+ throw error;
94
+ }
95
+ }
96
+ async function dryRunSync(options, iteration) {
97
+ logger_1.logger.info('🔍 Spec 差异分析报告:');
98
+ logger_1.logger.info('');
99
+ if (options.task) {
100
+ await analyzeTaskDiff(options.task, iteration);
101
+ }
102
+ else {
103
+ logger_1.logger.info('📊 期次级差异分析:');
104
+ logger_1.logger.info(` 期次: ${iteration}`);
105
+ // 扫描所有任务
106
+ const iterDir = (0, path_1.join)(process.cwd(), iteration);
107
+ if (await (0, fs_extra_1.pathExists)(iterDir)) {
108
+ const { readdir } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
109
+ const entries = await readdir(iterDir);
110
+ const tasks = entries.filter((e) => e.startsWith('Task-'));
111
+ for (const task of tasks) {
112
+ await analyzeTaskDiff(task, iteration);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ async function analyzeTaskDiff(task, iteration) {
118
+ const taskDir = (0, path_1.join)(process.cwd(), iteration, task);
119
+ if (!await (0, fs_extra_1.pathExists)(taskDir)) {
120
+ logger_1.logger.warn(` 任务 ${task} 目录不存在,跳过`);
121
+ return;
122
+ }
123
+ logger_1.logger.info(`📋 ${task}:`);
124
+ // 检查必需文件 + 内容分析
125
+ const checks = [
126
+ { file: '.task-type', label: '任务类型' },
127
+ { file: 'backend/REQ.md', label: '后端需求', check: (c) => c.includes('## 需求描述'), warn: '缺少需求描述章节' },
128
+ { file: 'backend/TECH.md', label: '后端方案', check: (c) => c.includes('## 技术'), warn: '缺少技术方案章节' },
129
+ { file: 'backend/TASK.md', label: '任务追踪', check: (c) => c.includes('变更履历'), warn: '缺少变更履历' },
130
+ { file: '_shared/API_CONTRACT.yaml', label: 'API契约', check: (c) => c.includes('api:') || c.includes('paths:'), warn: '缺少 API 定义' },
131
+ ];
132
+ for (const { file, label, check, warn } of checks) {
133
+ const filePath = (0, path_1.join)(taskDir, file);
134
+ if (await (0, fs_extra_1.pathExists)(filePath)) {
135
+ const content = await (0, fs_extra_1.readFile)(filePath, 'utf-8');
136
+ if (check && !check(content)) {
137
+ logger_1.logger.warn(` ⚠️ ${label}: ${warn}`);
138
+ }
139
+ else {
140
+ logger_1.logger.info(` ✅ ${label}`);
141
+ }
142
+ }
143
+ else {
144
+ logger_1.logger.warn(` ❌ ${label}: 文件缺失`);
145
+ }
146
+ }
147
+ }
148
+ async function syncTaskSpec(task, iteration, auto) {
149
+ const taskDir = (0, path_1.join)(process.cwd(), iteration, task);
150
+ const tx = new transaction_1.FileTransaction();
151
+ if (!await (0, fs_extra_1.pathExists)(taskDir)) {
152
+ logger_1.logger.error(`任务目录不存在: ${taskDir}`);
153
+ return;
154
+ }
155
+ // 更新 TASK.md 中的变更履历
156
+ const taskMdPath = (0, path_1.join)(taskDir, 'backend', 'TASK.md');
157
+ if (await (0, fs_extra_1.pathExists)(taskMdPath)) {
158
+ let content = await (0, fs_extra_1.readFile)(taskMdPath, 'utf-8');
159
+ const now = new Date().toISOString().split('T')[0];
160
+ if (!auto) {
161
+ logger_1.logger.info(`当前 TASK.md 状态:`);
162
+ const historyMatch = content.match(/变更履历[\s\S]*?(?=\n##\s)/);
163
+ if (historyMatch) {
164
+ logger_1.logger.info(historyMatch[0].substring(0, 300));
165
+ }
166
+ }
167
+ // 自动模式下添加上下文更新记录(使用事务)
168
+ if (auto) {
169
+ const syncEntry = `| ${now} | auto | 自动反向同步: 更新 Spec 文件 | SpecCore |\n`;
170
+ const updated = content.replace(/(\| :--- \| :--- \| :--- \| :--- \|)/, `$1\n${syncEntry}`);
171
+ tx.write(taskMdPath, updated);
172
+ }
173
+ }
174
+ // 同步前端各平台 TASK.md
175
+ const frontendDir = (0, path_1.join)(taskDir, 'frontend');
176
+ if (await (0, fs_extra_1.pathExists)(frontendDir)) {
177
+ const { readdir } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
178
+ const platformDirs = await readdir(frontendDir, { withFileTypes: true });
179
+ for (const pd of platformDirs) {
180
+ if (pd.isDirectory()) {
181
+ const ftaskPath = (0, path_1.join)(frontendDir, pd.name, 'TASK.md');
182
+ if (await (0, fs_extra_1.pathExists)(ftaskPath) && auto) {
183
+ let content = await (0, fs_extra_1.readFile)(ftaskPath, 'utf-8');
184
+ const now = new Date().toISOString().split('T')[0];
185
+ const syncEntry = `| ${now} | auto | 自动反向同步: 更新 Spec 文件 | SpecCore |\n`;
186
+ const updated = content.replace(/(\| :--- \| :--- \| :--- \| :--- \|)/, `$1\n${syncEntry}`);
187
+ tx.write(ftaskPath, updated);
188
+ }
189
+ }
190
+ }
191
+ }
192
+ // 提交事务 — 原子写入所有变更
193
+ if (tx.length > 0) {
194
+ await tx.commit();
195
+ logger_1.logger.info(`✅ 已同步: ${task}/ (${tx.length} 个文件,事务保护)`);
196
+ }
197
+ }
198
+ async function syncIterationSpec(iteration, auto) {
199
+ const iterDir = (0, path_1.join)(process.cwd(), iteration);
200
+ if (!await (0, fs_extra_1.pathExists)(iterDir)) {
201
+ logger_1.logger.error(`期次目录不存在: ${iterDir}`);
202
+ return;
203
+ }
204
+ const { readdir } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
205
+ const entries = await readdir(iterDir);
206
+ const tasks = entries.filter((e) => e.startsWith('Task-'));
207
+ const total = tasks.length;
208
+ logger_1.logger.info(`正在同步期次 ${iteration} 的 ${total} 个任务...`);
209
+ let synced = 0;
210
+ for (const task of tasks) {
211
+ await syncTaskSpec(task, iteration, auto);
212
+ synced++;
213
+ }
214
+ logger_1.logger.info(`✅ 已同步 ${synced}/${total} 个任务`);
215
+ }
216
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * template-add - 添加代码生成模板命令
3
+ * 将现有代码提取为可复用的模板,保存到 .speccore/PATTERNS/TEMPLATES/
4
+ */
5
+ export interface TemplateAddOptions {
6
+ name?: string;
7
+ type?: string;
8
+ files?: string;
9
+ desc?: string;
10
+ }
11
+ export declare function templateAddCommand(options: TemplateAddOptions): Promise<void>;
12
+ //# sourceMappingURL=template-add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-add.d.ts","sourceRoot":"","sources":["../../src/commands/template-add.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DnF"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * template-add - 添加代码生成模板命令
4
+ * 将现有代码提取为可复用的模板,保存到 .speccore/PATTERNS/TEMPLATES/
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.templateAddCommand = templateAddCommand;
8
+ const logger_1 = require("../utils/logger");
9
+ const fs_extra_1 = require("fs-extra");
10
+ const path_1 = require("path");
11
+ async function templateAddCommand(options) {
12
+ if (!options.name) {
13
+ logger_1.logger.error('请提供模板名称。用法: speccore template-add --name "<模板名>" --type=<类型> --files=<文件路径>');
14
+ return;
15
+ }
16
+ if (!options.files) {
17
+ logger_1.logger.error('请提供代码文件路径。用法: speccore template-add --files=<文件路径>');
18
+ return;
19
+ }
20
+ const spinner = new logger_1.Spinner('正在添加代码模板...');
21
+ spinner.start();
22
+ try {
23
+ const templateType = options.type || 'crud';
24
+ const templateDir = (0, path_1.join)(process.cwd(), '.speccore', 'PATTERNS', 'TEMPLATES', templateType, options.name);
25
+ await (0, fs_extra_1.ensureDir)(templateDir);
26
+ // 复制代码文件
27
+ const filePaths = options.files.split(',').map((f) => f.trim());
28
+ for (const filePath of filePaths) {
29
+ const fileName = (0, path_1.basename)(filePath);
30
+ await (0, fs_extra_1.copy)(filePath, (0, path_1.join)(templateDir, fileName));
31
+ logger_1.logger.info(`✅ 已复制: ${fileName}`);
32
+ }
33
+ // 创建模板描述文件
34
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(templateDir, 'README.md'), `# ${options.name} 模板\n\n` +
35
+ `- **类型**: ${templateType}\n` +
36
+ `- **描述**: ${options.desc || '请补充模板描述'}\n` +
37
+ `- **创建日期**: ${new Date().toISOString().split('T')[0]}\n` +
38
+ `- **文件列表**:\n${filePaths.map((f) => ` - ${(0, path_1.basename)(f)}`).join('\n')}\n`);
39
+ // 更新 PATTERNS/README.md 索引
40
+ const patternsReadme = (0, path_1.join)(process.cwd(), '.speccore', 'PATTERNS', 'README.md');
41
+ if (await (0, fs_extra_1.pathExists)(patternsReadme)) {
42
+ let content = await (0, fs_extra_1.readFile)(patternsReadme, 'utf-8');
43
+ const entry = `| ${options.name} | ${templateType} | ${options.desc || '-'} | ${new Date().toISOString().split('T')[0]} |\n`;
44
+ if (!content.includes(options.name)) {
45
+ content += entry;
46
+ await (0, fs_extra_1.writeFile)(patternsReadme, content);
47
+ }
48
+ }
49
+ spinner.stop(`模板 "${options.name}" 已添加`);
50
+ logger_1.logger.info('');
51
+ logger_1.logger.info(`📄 模板详情:`);
52
+ logger_1.logger.info(` 名称: ${options.name}`);
53
+ logger_1.logger.info(` 类型: ${templateType}`);
54
+ logger_1.logger.info(` 位置: .speccore/PATTERNS/TEMPLATES/${templateType}/${options.name}/`);
55
+ logger_1.logger.info(` 文件数: ${filePaths.length}`);
56
+ if (options.desc) {
57
+ logger_1.logger.info(` 描述: ${options.desc}`);
58
+ }
59
+ }
60
+ catch (error) {
61
+ spinner.fail(`添加模板失败: ${error}`);
62
+ throw error;
63
+ }
64
+ }
65
+ //# sourceMappingURL=template-add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-add.js","sourceRoot":"","sources":["../../src/commands/template-add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * welcome - 首次使用引导命令
3
+ * 交互式引导新用户完成第一个完整功能开发
4
+ */
5
+ export interface WelcomeOptions {
6
+ force?: boolean;
7
+ }
8
+ export declare function welcomeCommand(options: WelcomeOptions): Promise<void>;
9
+ //# sourceMappingURL=welcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/commands/welcome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoF3E"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /**
3
+ * welcome - 首次使用引导命令
4
+ * 交互式引导新用户完成第一个完整功能开发
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.welcomeCommand = welcomeCommand;
8
+ const logger_1 = require("../utils/logger");
9
+ const fs_extra_1 = require("fs-extra");
10
+ const path_1 = require("path");
11
+ async function welcomeCommand(options) {
12
+ logger_1.logger.info('👋 欢迎使用 SpecCore!');
13
+ logger_1.logger.info('');
14
+ logger_1.logger.info('SpecCore 是一个面向 AI 原生团队的规范驱动研发工程框架。');
15
+ logger_1.logger.info('核心理念:Code by Spec, Not by Vibe.');
16
+ logger_1.logger.info('');
17
+ const spinner = new logger_1.Spinner('正在检测项目状态...');
18
+ spinner.start();
19
+ try {
20
+ const isInitialized = await checkInitialization();
21
+ if (!isInitialized || options.force) {
22
+ spinner.stop('项目未初始化,开始引导设置...');
23
+ await guideInit();
24
+ }
25
+ else {
26
+ spinner.stop('项目已初始化。');
27
+ }
28
+ // Step 2: 引导创建期次
29
+ logger_1.logger.info('');
30
+ logger_1.logger.info('📋 第二步:创建你的第一个期次');
31
+ logger_1.logger.info('');
32
+ logger_1.logger.info('期次是 SpecCore 的项目管理单元,通常按时间或功能划分。');
33
+ logger_1.logger.info('例如: 期次-2026-07-会议预定');
34
+ logger_1.logger.info('');
35
+ logger_1.logger.info('运行以下命令创建期次:');
36
+ logger_1.logger.info(' $ speccore iteration create --name "<期次名称>"');
37
+ logger_1.logger.info('');
38
+ // Step 3: 引导创建任务
39
+ logger_1.logger.info('📝 第三步:创建开发任务');
40
+ logger_1.logger.info('');
41
+ logger_1.logger.info('使用智能入口创建任务:');
42
+ logger_1.logger.info(' $ speccore spec "做一个用户登录功能,支持手机号+密码"');
43
+ logger_1.logger.info('');
44
+ logger_1.logger.info('或直接创建:');
45
+ logger_1.logger.info(' $ speccore task new --name "用户登录" --desc "手机号+密码登录"');
46
+ logger_1.logger.info('');
47
+ // Step 4: 引导查看和开发
48
+ logger_1.logger.info('⚡ 第四步:查看进度并开始开发');
49
+ logger_1.logger.info('');
50
+ logger_1.logger.info('查看项目状态:');
51
+ logger_1.logger.info(' $ speccore progress');
52
+ logger_1.logger.info(' $ speccore status');
53
+ logger_1.logger.info('');
54
+ logger_1.logger.info('生成执行计划:');
55
+ logger_1.logger.info(' $ speccore plan');
56
+ logger_1.logger.info('');
57
+ // Step 5: 审查和归档
58
+ logger_1.logger.info('✅ 第五步:审查和归档');
59
+ logger_1.logger.info('');
60
+ logger_1.logger.info('审查代码产出:');
61
+ logger_1.logger.info(' $ speccore validate');
62
+ logger_1.logger.info('');
63
+ logger_1.logger.info('归档已完成任务:');
64
+ logger_1.logger.info(' $ speccore archive --all');
65
+ logger_1.logger.info('');
66
+ // 常用命令速查
67
+ logger_1.logger.info('---');
68
+ logger_1.logger.info('📖 常用命令速查:');
69
+ logger_1.logger.info('');
70
+ logger_1.logger.info('| 场景 | 命令 |');
71
+ logger_1.logger.info('| :--- | :--- |');
72
+ logger_1.logger.info('| 自然语言入口 | speccore spec "<描述>" |');
73
+ logger_1.logger.info('| 查看进度 | speccore progress |');
74
+ logger_1.logger.info('| 创建任务 | speccore task new --name "<名称>" |');
75
+ logger_1.logger.info('| Bug 修复 | speccore bugfix --name "<Bug>" |');
76
+ logger_1.logger.info('| 需求变更 | speccore change --task=<Task> --desc="<描述>" |');
77
+ logger_1.logger.info('| 生成报告 | speccore report --format=html |');
78
+ logger_1.logger.info('| 查看帮助 | speccore help |');
79
+ logger_1.logger.info('');
80
+ logger_1.logger.info('💡 提示: 使用 speccore spec 可以通过自然语言描述自动执行!');
81
+ logger_1.logger.info(' 例如: speccore spec "查看进度"');
82
+ logger_1.logger.info(' 例如: speccore spec "开始干活"');
83
+ }
84
+ catch (error) {
85
+ spinner.fail(`引导初始化失败: ${error}`);
86
+ throw error;
87
+ }
88
+ }
89
+ async function checkInitialization() {
90
+ return await (0, fs_extra_1.pathExists)((0, path_1.join)(process.cwd(), '.speccore'));
91
+ }
92
+ async function guideInit() {
93
+ logger_1.logger.info('');
94
+ logger_1.logger.info('🔧 正在初始化 SpecCore 项目...');
95
+ const speccoreDir = (0, path_1.join)(process.cwd(), '.speccore');
96
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(speccoreDir, 'PROJECT'));
97
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(speccoreDir, 'PATTERNS'));
98
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(speccoreDir, 'ITERATIONS'));
99
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(speccoreDir, 'RULES'));
100
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(speccoreDir, 'local'));
101
+ // 创建基础配置
102
+ const context = {
103
+ currentIteration: '',
104
+ currentTask: '',
105
+ currentAssignee: '',
106
+ lastUpdated: new Date().toISOString(),
107
+ history: [],
108
+ };
109
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(speccoreDir, 'local', 'context.json'), JSON.stringify(context, null, 2));
110
+ // 创建 SETTINGS.md
111
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(speccoreDir, 'SETTINGS.md'), `# SpecCore 框架配置
112
+
113
+ > 修改后,AI 将在下一次执行命令时自动生效。
114
+
115
+ ---
116
+
117
+ ## 1. 执行人追踪(Assignee Tracking)
118
+
119
+ | 配置项 | 可选值 | 默认值 | 说明 |
120
+ | :--- | :--- | :--- | :--- |
121
+ | \`assignee.enabled\` | \`true\`/\`false\` | \`true\` | 是否启用执行人追踪 |
122
+ | \`assignee.mode\` | \`strict\`/\`loose\`/\`off\` | \`loose\` | 强制程度 |
123
+
124
+ ### 模式说明
125
+ | 模式 | 行为 |
126
+ | :--- | :--- |
127
+ | **\`strict\`** | 校验执行人与 Git 提交者,不一致时阻断命令执行 |
128
+ | **\`loose\`** | 自动填写 Git 提交者,仅发出警告(推荐) |
129
+ | **\`off\`** | 不读取、不校验、不推荐任何人 |
130
+
131
+ ## 2. 双向追溯配置
132
+
133
+ | 配置项 | 可选值 | 默认值 | 说明 |
134
+ | :--- | :--- | :--- | :--- |
135
+ | \`trace.enabled\` | \`true\`/\`false\` | \`true\` | 是否启用双向追溯 |
136
+ | \`trace.auto_annotate\` | \`true\`/\`false\` | \`true\` | 生成代码时是否自动添加 @spec 注释 |
137
+
138
+ ## 3. 其他配置
139
+
140
+ | 配置项 | 可选值 | 默认值 | 说明 |
141
+ | :--- | :--- | :--- | :--- |
142
+ | \`archive.auto_cleanup\` | \`true\`/\`false\` | \`false\` | 归档时是否自动清理未使用的资源 |
143
+ | \`plan.parallel_suggest\` | \`true\`/\`false\` | \`true\` | 是否自动推荐并行开发策略 |
144
+ | \`validation.strict_mode\` | \`true\`/\`false\` | \`false\` | 合规性检查是否为严格模式 |
145
+ | \`sync.auto_check\` | \`true\`/\`false\` | \`true\` | 开发完成后是否自动检查反向同步 |
146
+
147
+ ## 4. 配置变更记录
148
+
149
+ | 日期 | 变更项 | 旧值 | 新值 | 变更人 |
150
+ | :--- | :--- | :--- | :--- | :--- |
151
+ `);
152
+ // 创建 ITERATIONS/README.md
153
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(speccoreDir, 'ITERATIONS', 'README.md'), `# 期次索引
154
+
155
+ | 期次名称 | 时间范围 | 状态 | 负责人 | 备注 |
156
+ | :--- | :--- | :--- | :--- | :--- |
157
+ `);
158
+ // 创建 PROJECT/TEAM.md
159
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(speccoreDir, 'PROJECT', 'TEAM.md'), `# 团队与 Git 映射
160
+
161
+ | 成员 | Git 用户名 | 角色 | 技术栈 | 负责模块 |
162
+ | :--- | :--- | :--- | :--- | :--- |
163
+ `);
164
+ logger_1.logger.success('项目初始化完成!');
165
+ }
166
+ //# sourceMappingURL=welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/commands/welcome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * GLOBAL 全量层管理核心模块
3
+ * 负责管理 GLOBAL/ 目录下的全量需求索引、项目映射、期次关联
4
+ */
5
+ /** 需求状态 */
6
+ export type ReqStatus = '📦 已有实现' | '✅ 已实现' | '🔄 进行中' | '🔲 待开发' | '🗑️ 已废弃';
7
+ /** 项目类型 */
8
+ export type ProjectType = 'backend' | 'web' | 'h5' | 'miniapp';
9
+ /** 需求索引条目 */
10
+ export interface ReqIndexEntry {
11
+ id: string;
12
+ project: string;
13
+ name: string;
14
+ status: ReqStatus;
15
+ version: string;
16
+ iteration: string;
17
+ task: string;
18
+ filePath: string;
19
+ }
20
+ /** 项目条目 */
21
+ export interface ProjectEntry {
22
+ name: string;
23
+ type: ProjectType;
24
+ reqCount: number;
25
+ implemented: number;
26
+ inProgress: number;
27
+ pending: number;
28
+ lastImport: string;
29
+ }
30
+ /** 期次关联条目 */
31
+ export interface IterationLink {
32
+ name: string;
33
+ reqs: string[];
34
+ status: string;
35
+ createdAt: string;
36
+ }
37
+ /** INDEX.md 解析后的全局索引 */
38
+ export interface GlobalIndex {
39
+ reqs: ReqIndexEntry[];
40
+ projects: ProjectEntry[];
41
+ iterations: IterationLink[];
42
+ version: string;
43
+ lastUpdated: string;
44
+ }
45
+ /** 导入项目参数 */
46
+ export interface ImportProjectParams {
47
+ project: string;
48
+ path: string;
49
+ type: ProjectType;
50
+ }
51
+ /** 需求变更条目 */
52
+ export interface ReqChange {
53
+ reqId: string;
54
+ reqName: string;
55
+ project: string;
56
+ changeType: '新增' | '修改' | '废弃';
57
+ changeDesc: string;
58
+ }
59
+ declare function getGlobalDir(): string;
60
+ declare function getIndexPath(): string;
61
+ declare function getProjectReqPath(project: string): string;
62
+ declare function getProjectMetaPath(project: string): string;
63
+ /**
64
+ * 解析 GLOBAL/INDEX.md
65
+ */
66
+ export declare function readGlobalIndex(): Promise<GlobalIndex>;
67
+ /**
68
+ * 获取下一个需求编号
69
+ */
70
+ export declare function getNextReqId(index: GlobalIndex): string;
71
+ /**
72
+ * 递增全局版本号
73
+ */
74
+ export declare function bumpGlobalVersion(currentVersion: string): string;
75
+ /**
76
+ * 追加需求条目到 INDEX.md 的需求索引表
77
+ */
78
+ export declare function appendReqToIndex(entry: ReqIndexEntry): Promise<void>;
79
+ /**
80
+ * 更新 INDEX.md 中需求条目的状态、版本等信息
81
+ */
82
+ export declare function updateReqInIndex(reqId: string, updates: Partial<ReqIndexEntry>): Promise<void>;
83
+ /**
84
+ * 追加项目条目到 INDEX.md
85
+ */
86
+ export declare function upsertProjectInIndex(project: ProjectEntry): Promise<void>;
87
+ /**
88
+ * 追加期次关联到 INDEX.md
89
+ */
90
+ export declare function appendIterationLink(link: IterationLink): Promise<void>;
91
+ /**
92
+ * 更新 INDEX.md 版本信息
93
+ */
94
+ export declare function updateIndexVersion(version: string): Promise<void>;
95
+ /**
96
+ * 确保项目目录存在
97
+ */
98
+ export declare function ensureProjectDir(project: string): Promise<void>;
99
+ /**
100
+ * 写入项目需求文档
101
+ */
102
+ export declare function writeProjectRequirements(project: string, projectType: ProjectType, requirements: {
103
+ name: string;
104
+ description: string;
105
+ id: string;
106
+ }[], techStack?: string): Promise<ReqIndexEntry[]>;
107
+ /**
108
+ * 写入项目元数据
109
+ */
110
+ export declare function writeProjectMetadata(project: string, projectType: ProjectType, techStack?: string, repoUrl?: string): Promise<void>;
111
+ /**
112
+ * 从指定项目中读取指定需求 ID 的详细内容
113
+ */
114
+ export declare function readRequirementDetail(project: string, reqId: string): Promise<string>;
115
+ /**
116
+ * 对比两个需求描述并返回变更清单
117
+ */
118
+ export declare function diffRequirements(sourceTitle: string, sourceContent: string, targetContent: string): ReqChange[];
119
+ /**
120
+ * 获取所有已导入项目的列表
121
+ */
122
+ export declare function listProjectDirs(): Promise<string[]>;
123
+ export { getGlobalDir, getIndexPath, getProjectReqPath, getProjectMetaPath };
124
+ //# sourceMappingURL=global-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-layer.d.ts","sourceRoot":"","sources":["../../src/core/global-layer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,WAAW;AACX,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE9E,WAAW;AACX,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/D,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,aAAa;AACb,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,aAAa;AACb,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,iBAAS,YAAY,IAAI,MAAM,CAE9B;AAED,iBAAS,YAAY,IAAI,MAAM,CAE9B;AAED,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,iBAAS,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAMD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CA+E5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CASvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB1E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BpG;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC/E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB5E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBvE;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,EACjE,SAAS,GAAE,MAAW,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAqE1B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,SAAS,GAAE,MAAW,EACtB,OAAO,GAAE,MAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAwBf;AAMD;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW3F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACpB,SAAS,EAAE,CA4Bb;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CASzD;AAMD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC"}