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,195 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.taskNewCommand = taskNewCommand;
37
+ const fs_extra_1 = require("fs-extra");
38
+ const path_1 = require("path");
39
+ const logger_1 = require("../../utils/logger");
40
+ const context_1 = require("../../core/context");
41
+ async function taskNewCommand(options) {
42
+ if (!options.name) {
43
+ logger_1.logger.error('Task name is required. Use --name <name>');
44
+ return;
45
+ }
46
+ const spinner = new logger_1.Spinner(`Creating task: ${options.name}`);
47
+ spinner.start();
48
+ try {
49
+ const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
50
+ if (!iteration) {
51
+ spinner.fail('No active iteration found. Please specify --iteration or create one first.');
52
+ return;
53
+ }
54
+ const iterationDir = `期次-${iteration}`;
55
+ // Determine task ID
56
+ const taskId = options.id || await findNextTaskId(iterationDir);
57
+ const taskDir = (0, path_1.join)(iterationDir, `Task-${taskId}`);
58
+ if (await (0, fs_extra_1.pathExists)(taskDir)) {
59
+ spinner.fail(`Task already exists: Task-${taskId}`);
60
+ return;
61
+ }
62
+ // Create directories
63
+ if (!options.frontendOnly) {
64
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, 'backend'));
65
+ }
66
+ if (!options.backendOnly) {
67
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, 'frontend'));
68
+ }
69
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '_shared'));
70
+ // Write task type
71
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '.task-type'), options.type || 'feature');
72
+ // Generate task content
73
+ const taskContent = await generateTaskContent(options);
74
+ // Write backend files
75
+ if (!options.frontendOnly) {
76
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'REQ.md'), taskContent.req);
77
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'TECH.md'), taskContent.tech);
78
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'TASK.md'), taskContent.task);
79
+ }
80
+ // Write frontend files
81
+ if (!options.backendOnly) {
82
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'frontend', 'REQ.md'), taskContent.req);
83
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'frontend', 'TECH.md'), taskContent.tech);
84
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'frontend', 'TASK.md'), taskContent.task);
85
+ }
86
+ // Update context
87
+ await (0, context_1.updateContext)({
88
+ currentTask: `Task-${taskId}`,
89
+ currentIteration: iteration,
90
+ lastUpdated: new Date().toISOString()
91
+ });
92
+ spinner.stop(`Task created: Task-${taskId} - ${options.name}`);
93
+ }
94
+ catch (error) {
95
+ spinner.fail(`Failed to create task: ${error}`);
96
+ throw error;
97
+ }
98
+ }
99
+ async function findNextTaskId(iterationDir) {
100
+ const { readdir } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
101
+ const entries = await readdir(iterationDir, { withFileTypes: true });
102
+ const taskDirs = entries
103
+ .filter(e => e.isDirectory() && e.name.startsWith('Task-'))
104
+ .map(e => parseInt(e.name.replace('Task-', '')))
105
+ .filter(n => !isNaN(n));
106
+ const maxId = Math.max(0, ...taskDirs);
107
+ return String(maxId + 1).padStart(3, '0');
108
+ }
109
+ async function generateTaskContent(options) {
110
+ const name = options.name || 'New Task';
111
+ const desc = options.desc || '';
112
+ const type = options.type || 'feature';
113
+ const req = `# ${name}
114
+
115
+ ## 需求描述
116
+
117
+ ${desc}
118
+
119
+ ## 验收标准
120
+
121
+ - [ ] AC-1:
122
+ - [ ] AC-2:
123
+ - [ ] AC-3:
124
+
125
+ ## 输入/输出
126
+
127
+ ### 输入
128
+
129
+ ### 输出
130
+
131
+ ## 业务规则
132
+
133
+ ## 错误处理
134
+ `;
135
+ const tech = `# ${name} - 技术方案
136
+
137
+ ## 1. 方案概述
138
+
139
+ ## 2. 接口设计
140
+
141
+ ### 2.1 API 定义
142
+
143
+ ### 2.2 请求/响应格式
144
+
145
+ ## 3. 数据模型
146
+
147
+ ## 4. 核心逻辑
148
+
149
+ ### 4.1 流程图
150
+
151
+ ### 4.2 伪代码
152
+
153
+ ## 5. 测试策略
154
+
155
+ ### 5.1 单元测试
156
+
157
+ ### 5.2 集成测试
158
+
159
+ ## 6. 风险与应对
160
+ `;
161
+ const task = `# ${name}
162
+
163
+ ## 任务信息
164
+ - 类型: ${type}
165
+ - 状态: 🔲 待开发
166
+ - 优先级: medium
167
+ - 预计耗时: 2h
168
+ - 创建时间: ${new Date().toISOString().split('T')[0]}
169
+
170
+ ## 变更履历
171
+ | 时间 | 变更内容 | 变更人 |
172
+ | :--- | :--- | :--- |
173
+ | ${new Date().toISOString().split('T')[0]} | 创建任务 | CLI |
174
+
175
+ ## 产出物
176
+ | 产出物 | 状态 | 路径 |
177
+ | :--- | :--- | :--- |
178
+ | REQ.md | ✅ | ./REQ.md |
179
+ | TECH.md | ✅ | ./TECH.md |
180
+ | TASK.md | ✅ | ./TASK.md |
181
+ | API_CONTRACT.yaml | ⏳ | ./_shared/API_CONTRACT.yaml |
182
+
183
+ ## 依赖关系
184
+ | 依赖任务 | 依赖原因 | 状态 |
185
+ | :--- | :--- | :--- |
186
+ | | | |
187
+
188
+ ## 阻塞关系
189
+ | 被阻塞任务 | 阻塞原因 | 状态 |
190
+ | :--- | :--- | :--- |
191
+ | | | |
192
+ `;
193
+ return { req, tech, task };
194
+ }
195
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/commands/task/new.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;AAMH,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":";AAAA;;;GAGG;;AAaH,gDA+DC;AA1ED,4CAAkD;AAClD,uCAA4E;AAC5E,+BAAsC;AAS/B,KAAK,UAAU,kBAAkB,CAAC,OAA2B;IAClE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QAC5F,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,eAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,gBAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAE1G,MAAM,IAAA,oBAAS,EAAC,WAAW,CAAC,CAAC;QAE7B,SAAS;QACT,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAA,eAAQ,EAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,IAAA,eAAI,EAAC,QAAQ,EAAE,IAAA,WAAI,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClD,eAAM,CAAC,IAAI,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,WAAW;QACX,MAAM,IAAA,oBAAS,EACb,IAAA,WAAI,EAAC,WAAW,EAAE,WAAW,CAAC,EAC9B,KAAK,OAAO,CAAC,IAAI,SAAS;YAC1B,aAAa,YAAY,IAAI;YAC7B,aAAa,OAAO,CAAC,IAAI,IAAI,SAAS,IAAI;YAC1C,eAAe,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;YACzD,gBAAgB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAA,eAAQ,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC1E,CAAC;QAEF,2BAA2B;QAC3B,MAAM,cAAc,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACjF,IAAI,MAAM,IAAA,qBAAU,EAAC,cAAc,CAAC,EAAE,CAAC;YACrC,IAAI,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,KAAK,OAAO,CAAC,IAAI,MAAM,YAAY,MAAM,OAAO,CAAC,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7H,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,KAAK,CAAC;gBACjB,MAAM,IAAA,oBAAS,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;QACzC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,eAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,eAAM,CAAC,IAAI,CAAC,UAAU,YAAY,EAAE,CAAC,CAAC;QACtC,eAAM,CAAC,IAAI,CAAC,uCAAuC,YAAY,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QACpF,eAAM,CAAC,IAAI,CAAC,WAAW,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,eAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;QACjC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface ValidateOptions {
2
+ iteration?: string;
3
+ task?: string;
4
+ type?: string;
5
+ fix?: boolean;
6
+ strict?: boolean;
7
+ format?: string;
8
+ }
9
+ export declare function validateCommand(options: ValidateOptions): Promise<void>;
10
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC7E"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateCommand = validateCommand;
4
+ const validator_1 = require("../core/validator");
5
+ const logger_1 = require("../utils/logger");
6
+ const context_1 = require("../core/context");
7
+ async function validateCommand(options) {
8
+ const spinner = new logger_1.Spinner('Validating Spec compliance');
9
+ spinner.start();
10
+ try {
11
+ const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
12
+ const result = await (0, validator_1.validateProject)(iteration || undefined, options.task || undefined, {
13
+ fix: options.fix,
14
+ strict: options.strict
15
+ });
16
+ spinner.stop('Validation complete');
17
+ // Auto-fix if requested
18
+ if (options.fix) {
19
+ const fixedCount = await (0, validator_1.autoFix)(result);
20
+ if (fixedCount > 0) {
21
+ logger_1.logger.info(`Auto-fixed ${fixedCount} issues`);
22
+ }
23
+ }
24
+ // Output results
25
+ const output = (0, validator_1.formatValidationResult)(result, (options.format || 'text'));
26
+ console.log(output);
27
+ // Exit with error code if validation failed
28
+ if (result.errors.length > 0) {
29
+ process.exitCode = 1;
30
+ }
31
+ }
32
+ catch (error) {
33
+ spinner.fail(`Validation failed: ${error}`);
34
+ throw error;
35
+ }
36
+ }
37
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";;AAaA,0CAyCC;AAtDD,iDAAqF;AACrF,4CAAkD;AAClD,6CAAsD;AAW/C,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,MAAM,OAAO,GAAG,IAAI,gBAAO,CAAC,4BAA4B,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAmB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAe,EAClC,SAAS,IAAI,SAAS,EACtB,OAAO,CAAC,IAAI,IAAI,SAAS,EACzB;YACE,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CACF,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAEpC,wBAAwB;QACxB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,MAAM,IAAA,mBAAO,EAAC,MAAM,CAAC,CAAC;YACzC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,eAAM,CAAC,IAAI,CAAC,cAAc,UAAU,SAAS,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,GAAG,IAAA,kCAAsB,EACnC,MAAM,EACN,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAoB,CAC9C,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,4CAA4C;QAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -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,31 @@
1
+ export interface Context {
2
+ currentIteration: string;
3
+ currentTask: string;
4
+ currentAssignee: string;
5
+ lastUpdated: string;
6
+ lastAction: string;
7
+ lastIntent: string;
8
+ interruptedAt: string;
9
+ iterationStatus: string;
10
+ pendingTasks: number;
11
+ inProgressTasks: number;
12
+ completedTasks: number;
13
+ blockedTasks: number;
14
+ customAliases: Record<string, string>;
15
+ history: ContextHistoryEntry[];
16
+ }
17
+ export interface ContextHistoryEntry {
18
+ command: string;
19
+ timestamp: string;
20
+ iteration?: string;
21
+ task?: string;
22
+ }
23
+ export declare function loadContext(): Promise<Context>;
24
+ export declare function saveContext(context: Context): Promise<void>;
25
+ export declare function updateContext(partial: Partial<Context>): Promise<void>;
26
+ export declare function recordHistory(command: string, iteration?: string, task?: string): Promise<void>;
27
+ export declare function detectActiveIteration(): Promise<string>;
28
+ export declare function detectCurrentAssignee(): Promise<string>;
29
+ export declare function getDefaultIteration(iteration?: string): Promise<string>;
30
+ export declare function getDefaultAssignee(assignee?: string): Promise<string>;
31
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAoBpD;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjE;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAarG;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAmC7D;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAa7D;AAED,wBAAsB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7E;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3E"}