superplanners-mcp 0.1.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 (46) hide show
  1. package/README.md +160 -0
  2. package/dist/file-manager.d.ts +99 -0
  3. package/dist/file-manager.d.ts.map +1 -0
  4. package/dist/file-manager.js +364 -0
  5. package/dist/file-manager.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +65 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/renderer.d.ts +10 -0
  11. package/dist/renderer.d.ts.map +1 -0
  12. package/dist/renderer.js +170 -0
  13. package/dist/renderer.js.map +1 -0
  14. package/dist/server.d.ts +6 -0
  15. package/dist/server.d.ts.map +1 -0
  16. package/dist/server.js +438 -0
  17. package/dist/server.js.map +1 -0
  18. package/dist/task-engine/dependency-resolver.d.ts +43 -0
  19. package/dist/task-engine/dependency-resolver.d.ts.map +1 -0
  20. package/dist/task-engine/dependency-resolver.js +94 -0
  21. package/dist/task-engine/dependency-resolver.js.map +1 -0
  22. package/dist/task-engine/index.d.ts +6 -0
  23. package/dist/task-engine/index.d.ts.map +1 -0
  24. package/dist/task-engine/index.js +6 -0
  25. package/dist/task-engine/index.js.map +1 -0
  26. package/dist/task-engine/next-task-selector.d.ts +18 -0
  27. package/dist/task-engine/next-task-selector.d.ts.map +1 -0
  28. package/dist/task-engine/next-task-selector.js +99 -0
  29. package/dist/task-engine/next-task-selector.js.map +1 -0
  30. package/dist/task-engine/parser.d.ts +20 -0
  31. package/dist/task-engine/parser.d.ts.map +1 -0
  32. package/dist/task-engine/parser.js +77 -0
  33. package/dist/task-engine/parser.js.map +1 -0
  34. package/dist/task-engine/progress-calculator.d.ts +15 -0
  35. package/dist/task-engine/progress-calculator.d.ts.map +1 -0
  36. package/dist/task-engine/progress-calculator.js +58 -0
  37. package/dist/task-engine/progress-calculator.js.map +1 -0
  38. package/dist/task-engine/status-reducer.d.ts +18 -0
  39. package/dist/task-engine/status-reducer.d.ts.map +1 -0
  40. package/dist/task-engine/status-reducer.js +88 -0
  41. package/dist/task-engine/status-reducer.js.map +1 -0
  42. package/dist/types.d.ts +999 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +228 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +51 -0
package/README.md ADDED
@@ -0,0 +1,160 @@
1
+ # SuperPlanners MCP Server
2
+
3
+ SuperPlanners 的 MCP (Model Context Protocol) 服务器实现。
4
+
5
+ ## 开发指南
6
+
7
+ ### 项目结构
8
+
9
+ ```
10
+ mcp-server/
11
+ ├── src/
12
+ │ ├── index.ts # 入口文件
13
+ │ ├── server.ts # MCP Tool 处理器
14
+ │ ├── types.ts # TypeScript 类型定义
15
+ │ ├── file-manager.ts # 文件读写
16
+ │ ├── renderer.ts # Markdown 渲染
17
+ │ └── task-engine/ # 核心业务逻辑
18
+ │ ├── parser.ts # YAML 解析
19
+ │ ├── status-reducer.ts # 状态变更
20
+ │ ├── dependency-resolver.ts # 依赖解析
21
+ │ ├── progress-calculator.ts # 进度计算
22
+ │ └── next-task-selector.ts # 任务推荐
23
+ ├── package.json
24
+ ├── tsconfig.json
25
+ └── vitest.config.ts
26
+ ```
27
+
28
+ ### 开发命令
29
+
30
+ ```bash
31
+ # 安装依赖
32
+ npm install
33
+
34
+ # 开发模式(监听变更)
35
+ npm run dev
36
+
37
+ # 构建
38
+ npm run build
39
+
40
+ # 运行测试
41
+ npm test
42
+
43
+ # 运行测试(带覆盖率)
44
+ npm test -- --coverage
45
+
46
+ # 类型检查
47
+ npm run typecheck
48
+
49
+ # 代码格式化
50
+ npm run lint
51
+ ```
52
+
53
+ ### MCP Tools 说明
54
+
55
+ #### superplanners_plan
56
+
57
+ 创建新的任务计划。
58
+
59
+ **输入:**
60
+ ```typescript
61
+ {
62
+ requirement: string; // 需求描述
63
+ project_name?: string; // 项目名称(可选)
64
+ }
65
+ ```
66
+
67
+ **输出:**
68
+ ```typescript
69
+ {
70
+ success: boolean;
71
+ project_id: string;
72
+ summary: TaskSummary;
73
+ files: string[];
74
+ next_task: Task | null;
75
+ }
76
+ ```
77
+
78
+ #### superplanners_status
79
+
80
+ 查询项目或任务状态。
81
+
82
+ **输入:**
83
+ ```typescript
84
+ {
85
+ project_id?: string; // 项目 ID(可选,不填返回全局视图)
86
+ }
87
+ ```
88
+
89
+ **输出:**
90
+ ```typescript
91
+ {
92
+ success: boolean;
93
+ projects?: ProjectSummary[]; // 全局视图
94
+ project_id?: string; // 项目视图
95
+ progress?: Progress;
96
+ summary?: TaskSummary;
97
+ tasks?: Task[];
98
+ next_task?: Task | null;
99
+ }
100
+ ```
101
+
102
+ #### superplanners_update
103
+
104
+ 更新任务状态。
105
+
106
+ **输入:**
107
+ ```typescript
108
+ {
109
+ project_id: string;
110
+ task_id: string;
111
+ status: TaskStatus;
112
+ notes?: string;
113
+ }
114
+ ```
115
+
116
+ **输出:**
117
+ ```typescript
118
+ {
119
+ success: boolean;
120
+ updated: boolean;
121
+ summary: TaskSummary;
122
+ progress: Progress;
123
+ next_task: Task | null;
124
+ }
125
+ ```
126
+
127
+ #### superplanners_reset
128
+
129
+ 归档、列出或恢复项目。
130
+
131
+ **输入:**
132
+ ```typescript
133
+ {
134
+ action: 'cleanup' | 'list' | 'restore';
135
+ project_id?: string; // cleanup 时必填
136
+ archive_id?: string; // restore 时必填
137
+ }
138
+ ```
139
+
140
+ ### 添加新功能
141
+
142
+ 1. 在 `types.ts` 中定义类型
143
+ 2. 在对应模块中实现逻辑
144
+ 3. 编写测试
145
+ 4. 在 `server.ts` 中注册 Tool(如需要)
146
+
147
+ ### 调试
148
+
149
+ 使用 MCP Inspector:
150
+
151
+ ```bash
152
+ npx @modelcontextprotocol/inspector node dist/index.js
153
+ ```
154
+
155
+ ## 发布
156
+
157
+ ```bash
158
+ npm run build
159
+ npm publish
160
+ ```
@@ -0,0 +1,99 @@
1
+ import type { ProjectData, TaskPlan } from './types.js';
2
+ export type FileResult<T> = {
3
+ success: true;
4
+ data: T;
5
+ } | {
6
+ success: false;
7
+ error: string;
8
+ };
9
+ export interface ArchiveInfo {
10
+ archiveId: string;
11
+ projectId: string;
12
+ archivedAt: string;
13
+ }
14
+ export interface WriteOptions {
15
+ renderMarkdown?: boolean;
16
+ }
17
+ export declare class FileManager {
18
+ private baseDir;
19
+ private tasksDir;
20
+ constructor(baseDir: string);
21
+ /**
22
+ * 检查文件是否存在
23
+ */
24
+ private fileExists;
25
+ /**
26
+ * 获取项目目录路径
27
+ */
28
+ getProjectDir(projectId: string): string;
29
+ /**
30
+ * 获取项目 YAML 文件路径
31
+ */
32
+ getProjectYamlPath(projectId: string): string;
33
+ /**
34
+ * 获取任务计划索引路径
35
+ */
36
+ getTaskPlanPath(): string;
37
+ /**
38
+ * 读取项目数据
39
+ */
40
+ readProjectData(projectId: string): Promise<FileResult<ProjectData>>;
41
+ /**
42
+ * 读取任务计划索引
43
+ */
44
+ readTaskPlan(): Promise<FileResult<TaskPlan | null>>;
45
+ /**
46
+ * 确保目录存在
47
+ */
48
+ ensureDir(dirPath: string): Promise<void>;
49
+ /**
50
+ * 原子写入文件
51
+ * 先写入临时文件,再 rename 到目标路径
52
+ */
53
+ private atomicWrite;
54
+ /**
55
+ * 写入项目数据
56
+ */
57
+ writeProjectData(projectId: string, data: ProjectData, options?: WriteOptions): Promise<FileResult<void>>;
58
+ /**
59
+ * 写入任务计划索引
60
+ */
61
+ writeTaskPlan(data: TaskPlan, options?: WriteOptions): Promise<FileResult<void>>;
62
+ /**
63
+ * 列出所有项目
64
+ */
65
+ listProjects(): Promise<string[]>;
66
+ /**
67
+ * 检查项目是否存在
68
+ */
69
+ projectExists(projectId: string): Promise<boolean>;
70
+ /**
71
+ * 删除项目
72
+ */
73
+ deleteProject(projectId: string): Promise<FileResult<void>>;
74
+ /**
75
+ * 获取归档目录路径
76
+ */
77
+ private getArchiveDir;
78
+ /**
79
+ * 生成归档 ID
80
+ */
81
+ private generateArchiveId;
82
+ /**
83
+ * 归档项目
84
+ */
85
+ archiveProject(projectId: string): Promise<FileResult<{
86
+ archiveId: string;
87
+ }>>;
88
+ /**
89
+ * 列出所有归档
90
+ */
91
+ listArchives(): Promise<ArchiveInfo[]>;
92
+ /**
93
+ * 恢复归档
94
+ */
95
+ restoreArchive(archiveId: string): Promise<FileResult<{
96
+ projectId: string;
97
+ }>>;
98
+ }
99
+ //# sourceMappingURL=file-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-manager.d.ts","sourceRoot":"","sources":["../src/file-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKxD,MAAM,MAAM,UAAU,CAAC,CAAC,IACpB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM;IAK3B;;OAEG;YACW,UAAU;IASxB;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIxC;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAwB1E;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAwB1D;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C;;;OAGG;YACW,WAAW;IAiBzB;;OAEG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAqC5B;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,QAAQ,EACd,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IA6C5B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA2BvC;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAkBjE;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAyB7C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IA0C5C;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAgCpF"}
@@ -0,0 +1,364 @@
1
+ // src/file-manager.ts
2
+ import { readFile, writeFile, rename, unlink, access, mkdir, readdir, rm } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { constants } from 'node:fs';
5
+ import YAML from 'yaml';
6
+ import { parseProjectData, parseTaskPlan } from './task-engine/parser.js';
7
+ import { renderTaskPlan, renderProjectTasks } from './renderer.js';
8
+ import { calculateTaskSummary, calculateProgress, formatProgressString } from './task-engine/progress-calculator.js';
9
+ export class FileManager {
10
+ baseDir;
11
+ tasksDir;
12
+ constructor(baseDir) {
13
+ this.baseDir = baseDir;
14
+ this.tasksDir = join(baseDir, 'tasks');
15
+ }
16
+ /**
17
+ * 检查文件是否存在
18
+ */
19
+ async fileExists(filePath) {
20
+ try {
21
+ await access(filePath, constants.F_OK);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ /**
29
+ * 获取项目目录路径
30
+ */
31
+ getProjectDir(projectId) {
32
+ return join(this.tasksDir, projectId);
33
+ }
34
+ /**
35
+ * 获取项目 YAML 文件路径
36
+ */
37
+ getProjectYamlPath(projectId) {
38
+ return join(this.getProjectDir(projectId), 'tasks.yaml');
39
+ }
40
+ /**
41
+ * 获取任务计划索引路径
42
+ */
43
+ getTaskPlanPath() {
44
+ return join(this.tasksDir, 'task-plan.yaml');
45
+ }
46
+ /**
47
+ * 读取项目数据
48
+ */
49
+ async readProjectData(projectId) {
50
+ const filePath = this.getProjectYamlPath(projectId);
51
+ if (!(await this.fileExists(filePath))) {
52
+ return { success: false, error: `项目 ${projectId} 不存在` };
53
+ }
54
+ try {
55
+ const content = await readFile(filePath, 'utf-8');
56
+ const result = parseProjectData(content);
57
+ if (result.success) {
58
+ return { success: true, data: result.data };
59
+ }
60
+ else {
61
+ return { success: false, error: result.error };
62
+ }
63
+ }
64
+ catch (e) {
65
+ return {
66
+ success: false,
67
+ error: `读取文件失败: ${e instanceof Error ? e.message : String(e)}`,
68
+ };
69
+ }
70
+ }
71
+ /**
72
+ * 读取任务计划索引
73
+ */
74
+ async readTaskPlan() {
75
+ const filePath = this.getTaskPlanPath();
76
+ if (!(await this.fileExists(filePath))) {
77
+ return { success: true, data: null };
78
+ }
79
+ try {
80
+ const content = await readFile(filePath, 'utf-8');
81
+ const result = parseTaskPlan(content);
82
+ if (result.success) {
83
+ return { success: true, data: result.data };
84
+ }
85
+ else {
86
+ return { success: false, error: result.error };
87
+ }
88
+ }
89
+ catch (e) {
90
+ return {
91
+ success: false,
92
+ error: `读取文件失败: ${e instanceof Error ? e.message : String(e)}`,
93
+ };
94
+ }
95
+ }
96
+ /**
97
+ * 确保目录存在
98
+ */
99
+ async ensureDir(dirPath) {
100
+ await mkdir(dirPath, { recursive: true });
101
+ }
102
+ /**
103
+ * 原子写入文件
104
+ * 先写入临时文件,再 rename 到目标路径
105
+ */
106
+ async atomicWrite(filePath, content) {
107
+ const tempPath = `${filePath}.tmp.${Date.now()}`;
108
+ try {
109
+ await writeFile(tempPath, content, 'utf-8');
110
+ await rename(tempPath, filePath);
111
+ }
112
+ catch (e) {
113
+ // 清理临时文件
114
+ try {
115
+ await unlink(tempPath);
116
+ }
117
+ catch {
118
+ // 忽略清理失败
119
+ }
120
+ throw e;
121
+ }
122
+ }
123
+ /**
124
+ * 写入项目数据
125
+ */
126
+ async writeProjectData(projectId, data, options = {}) {
127
+ try {
128
+ const projectDir = this.getProjectDir(projectId);
129
+ await this.ensureDir(projectDir);
130
+ // 更新 updated 时间戳
131
+ const updatedData = {
132
+ ...data,
133
+ meta: {
134
+ ...data.meta,
135
+ updated: new Date().toISOString(),
136
+ },
137
+ };
138
+ const yamlContent = YAML.stringify(updatedData);
139
+ const filePath = this.getProjectYamlPath(projectId);
140
+ await this.atomicWrite(filePath, yamlContent);
141
+ // 渲染 Markdown
142
+ if (options.renderMarkdown !== false) {
143
+ const summary = calculateTaskSummary(updatedData.tasks);
144
+ const progress = calculateProgress(updatedData.tasks);
145
+ const markdown = renderProjectTasks(updatedData, summary, progress);
146
+ const mdPath = join(projectDir, 'tasks.md');
147
+ await this.atomicWrite(mdPath, markdown);
148
+ }
149
+ return { success: true, data: undefined };
150
+ }
151
+ catch (e) {
152
+ return {
153
+ success: false,
154
+ error: `写入失败: ${e instanceof Error ? e.message : String(e)}`,
155
+ };
156
+ }
157
+ }
158
+ /**
159
+ * 写入任务计划索引
160
+ */
161
+ async writeTaskPlan(data, options = {}) {
162
+ try {
163
+ await this.ensureDir(this.tasksDir);
164
+ // 更新 updated 时间戳
165
+ const updatedData = {
166
+ ...data,
167
+ meta: {
168
+ ...data.meta,
169
+ updated: new Date().toISOString(),
170
+ },
171
+ };
172
+ const yamlContent = YAML.stringify(updatedData);
173
+ const filePath = this.getTaskPlanPath();
174
+ await this.atomicWrite(filePath, yamlContent);
175
+ // 渲染 Markdown
176
+ if (options.renderMarkdown !== false) {
177
+ // 同步获取所有进度
178
+ const progressMap = new Map();
179
+ for (const project of updatedData.projects) {
180
+ const result = await this.readProjectData(project.project_id);
181
+ if (result.success) {
182
+ progressMap.set(project.project_id, formatProgressString(result.data.tasks));
183
+ }
184
+ else {
185
+ progressMap.set(project.project_id, '?/?');
186
+ }
187
+ }
188
+ const markdown = renderTaskPlan(updatedData, (id) => progressMap.get(id) || '?/?');
189
+ const mdPath = join(this.tasksDir, 'task-plan.md');
190
+ await this.atomicWrite(mdPath, markdown);
191
+ }
192
+ return { success: true, data: undefined };
193
+ }
194
+ catch (e) {
195
+ return {
196
+ success: false,
197
+ error: `写入失败: ${e instanceof Error ? e.message : String(e)}`,
198
+ };
199
+ }
200
+ }
201
+ /**
202
+ * 列出所有项目
203
+ */
204
+ async listProjects() {
205
+ if (!(await this.fileExists(this.tasksDir))) {
206
+ return [];
207
+ }
208
+ try {
209
+ const entries = await readdir(this.tasksDir, { withFileTypes: true });
210
+ const projects = [];
211
+ for (const entry of entries) {
212
+ // 跳过文件和特殊目录
213
+ if (!entry.isDirectory())
214
+ continue;
215
+ if (entry.name.startsWith('.'))
216
+ continue;
217
+ // 检查是否有 tasks.yaml
218
+ const yamlPath = join(this.tasksDir, entry.name, 'tasks.yaml');
219
+ if (await this.fileExists(yamlPath)) {
220
+ projects.push(entry.name);
221
+ }
222
+ }
223
+ return projects;
224
+ }
225
+ catch {
226
+ return [];
227
+ }
228
+ }
229
+ /**
230
+ * 检查项目是否存在
231
+ */
232
+ async projectExists(projectId) {
233
+ const yamlPath = this.getProjectYamlPath(projectId);
234
+ return this.fileExists(yamlPath);
235
+ }
236
+ /**
237
+ * 删除项目
238
+ */
239
+ async deleteProject(projectId) {
240
+ const projectDir = this.getProjectDir(projectId);
241
+ if (!(await this.projectExists(projectId))) {
242
+ return { success: false, error: `项目 ${projectId} 不存在` };
243
+ }
244
+ try {
245
+ await rm(projectDir, { recursive: true });
246
+ return { success: true, data: undefined };
247
+ }
248
+ catch (e) {
249
+ return {
250
+ success: false,
251
+ error: `删除失败: ${e instanceof Error ? e.message : String(e)}`,
252
+ };
253
+ }
254
+ }
255
+ /**
256
+ * 获取归档目录路径
257
+ */
258
+ getArchiveDir() {
259
+ return join(this.tasksDir, '.archive');
260
+ }
261
+ /**
262
+ * 生成归档 ID
263
+ */
264
+ generateArchiveId(projectId) {
265
+ const now = new Date();
266
+ const timestamp = now.toISOString().replace(/[-:T]/g, '').slice(0, 14);
267
+ return `${timestamp}-${projectId}`;
268
+ }
269
+ /**
270
+ * 归档项目
271
+ */
272
+ async archiveProject(projectId) {
273
+ if (!(await this.projectExists(projectId))) {
274
+ return { success: false, error: `项目 ${projectId} 不存在` };
275
+ }
276
+ try {
277
+ const archiveDir = this.getArchiveDir();
278
+ await this.ensureDir(archiveDir);
279
+ const archiveId = this.generateArchiveId(projectId);
280
+ const archivePath = join(archiveDir, archiveId);
281
+ const projectDir = this.getProjectDir(projectId);
282
+ // 移动项目到归档目录
283
+ await rename(projectDir, archivePath);
284
+ return { success: true, data: { archiveId } };
285
+ }
286
+ catch (e) {
287
+ return {
288
+ success: false,
289
+ error: `归档失败: ${e instanceof Error ? e.message : String(e)}`,
290
+ };
291
+ }
292
+ }
293
+ /**
294
+ * 列出所有归档
295
+ */
296
+ async listArchives() {
297
+ const archiveDir = this.getArchiveDir();
298
+ if (!(await this.fileExists(archiveDir))) {
299
+ return [];
300
+ }
301
+ try {
302
+ const entries = await readdir(archiveDir, { withFileTypes: true });
303
+ const archives = [];
304
+ for (const entry of entries) {
305
+ if (!entry.isDirectory())
306
+ continue;
307
+ // 解析归档 ID: YYYYMMDDHHMMSS-project-id
308
+ const match = entry.name.match(/^(\d{14})-(.+)$/);
309
+ if (match) {
310
+ const [, timestamp, projectId] = match;
311
+ const year = timestamp.slice(0, 4);
312
+ const month = timestamp.slice(4, 6);
313
+ const day = timestamp.slice(6, 8);
314
+ const hour = timestamp.slice(8, 10);
315
+ const min = timestamp.slice(10, 12);
316
+ const sec = timestamp.slice(12, 14);
317
+ archives.push({
318
+ archiveId: entry.name,
319
+ projectId,
320
+ archivedAt: `${year}-${month}-${day}T${hour}:${min}:${sec}Z`,
321
+ });
322
+ }
323
+ }
324
+ // 按时间倒序
325
+ archives.sort((a, b) => b.archivedAt.localeCompare(a.archivedAt));
326
+ return archives;
327
+ }
328
+ catch {
329
+ return [];
330
+ }
331
+ }
332
+ /**
333
+ * 恢复归档
334
+ */
335
+ async restoreArchive(archiveId) {
336
+ const archiveDir = this.getArchiveDir();
337
+ const archivePath = join(archiveDir, archiveId);
338
+ if (!(await this.fileExists(archivePath))) {
339
+ return { success: false, error: `归档 ${archiveId} 不存在` };
340
+ }
341
+ // 解析 project ID
342
+ const match = archiveId.match(/^\d{14}-(.+)$/);
343
+ if (!match) {
344
+ return { success: false, error: `无效的归档 ID: ${archiveId}` };
345
+ }
346
+ const projectId = match[1];
347
+ // 检查项目是否已存在
348
+ if (await this.projectExists(projectId)) {
349
+ return { success: false, error: `项目 ${projectId} 已存在,无法恢复` };
350
+ }
351
+ try {
352
+ const projectDir = this.getProjectDir(projectId);
353
+ await rename(archivePath, projectDir);
354
+ return { success: true, data: { projectId } };
355
+ }
356
+ catch (e) {
357
+ return {
358
+ success: false,
359
+ error: `恢复失败: ${e instanceof Error ? e.message : String(e)}`,
360
+ };
361
+ }
362
+ }
363
+ }
364
+ //# sourceMappingURL=file-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-manager.js","sourceRoot":"","sources":["../src/file-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}