Skip to content

Commit db87686

Browse files
committed
feat: 新增多任务管理功能,包含 task_list 和 task_switch 工具,支持任务列表查询和任务切换,优化任务管理器以支持多任务目录结构,增强任务管理的灵活性和可扩展性
1 parent f418a50 commit db87686

9 files changed

Lines changed: 2703 additions & 5 deletions

src/core/data-migration-tool.ts

Lines changed: 636 additions & 0 deletions
Large diffs are not rendered by default.

src/core/multi-task-directory-manager.test.ts

Lines changed: 536 additions & 0 deletions
Large diffs are not rendered by default.

src/core/multi-task-directory-manager.ts

Lines changed: 594 additions & 0 deletions
Large diffs are not rendered by default.

src/core/task-manager.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import fs from 'fs-extra';
88
import * as path from 'path';
99
import { ulid } from 'ulid';
1010
import { logger } from './logger.js';
11+
import { MultiTaskDirectoryManager } from './multi-task-directory-manager.js';
1112
import {
1213
TaskStatus,
1314
LogLevel,
@@ -118,6 +119,7 @@ export class TaskManager {
118119
private docsPath: string;
119120
private currentTaskPath: string;
120121
private projectManager?: import('./project-manager.js').ProjectManager;
122+
private multiTaskDirectoryManager: MultiTaskDirectoryManager;
121123

122124
constructor(
123125
docsPath: string,
@@ -130,6 +132,9 @@ export class TaskManager {
130132
this.docsPath = docsPath.trim();
131133
this.currentTaskPath = path.join(this.docsPath, 'current-task.json');
132134
this.projectManager = projectManager;
135+
this.multiTaskDirectoryManager = new MultiTaskDirectoryManager(
136+
this.docsPath
137+
);
133138
}
134139

135140
getDocsPath(): string {
@@ -628,9 +633,35 @@ export class TaskManager {
628633
private async saveTask(task: CurrentTask, projectId?: string): Promise<void> {
629634
// 确保目录存在
630635
await this.ensureDirectoryExists(projectId);
636+
637+
// 保存到当前任务文件(向后兼容)
631638
const taskPath = await this.resolveTaskPath(projectId);
632639
const taskData = JSON.stringify(task, null, 2);
633640
await fs.writeFile(taskPath, taskData, 'utf8');
641+
642+
// 同时保存到多任务目录结构
643+
try {
644+
// 检查任务是否已经存在于多任务目录中
645+
const existingTaskDir =
646+
await this.multiTaskDirectoryManager.findTaskDirectory(task.id);
647+
648+
if (existingTaskDir) {
649+
// 更新现有任务
650+
await this.multiTaskDirectoryManager.updateTaskInDirectory(
651+
task,
652+
existingTaskDir
653+
);
654+
} else {
655+
// 创建新的任务目录
656+
await this.multiTaskDirectoryManager.saveTaskToDirectory(task);
657+
}
658+
} catch (error) {
659+
// 多任务目录保存失败不应该影响主要功能
660+
logger.warning(LogCategory.Task, LogAction.Create, '多任务目录保存失败', {
661+
taskId: task.id,
662+
error: error instanceof Error ? error.message : String(error),
663+
});
664+
}
634665
}
635666

636667
private validateUpdateParams(params: TaskUpdateParams): void {

src/server.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import {
2828
CurrentTaskCompleteTool,
2929
CurrentTaskLogTool,
3030
} from './tools/task-tools.js';
31+
import { TaskListTool, TaskSwitchTool } from './tools/multi-task-tools.js';
32+
import { MultiTaskDirectoryManager } from './core/multi-task-directory-manager.js';
3133
import { ProjectRootManager } from './core/project-root-manager.js';
3234
import { ProjectManager } from './core/project-manager.js';
3335
import { toolRegistry } from './core/tool-registry.js';
@@ -45,6 +47,7 @@ class WaveForgeServer {
4547
private readonly projectRootManager: ProjectRootManager;
4648
private readonly projectManager: ProjectManager;
4749
private taskManager: TaskManager;
50+
private multiTaskDirectoryManager: MultiTaskDirectoryManager | null = null;
4851
private readonly startTime: number;
4952
private readonly serverId: string;
5053
private readonly middleware: ReturnType<typeof errorHandler.createMiddleware>;
@@ -442,6 +445,50 @@ class WaveForgeServer {
442445
enabled: true,
443446
});
444447

448+
// 注册 task_list 工具
449+
toolRegistry.registerTool({
450+
name: 'task_list',
451+
handler: {
452+
getDefinition: () => TaskListTool.getDefinition(),
453+
handle: async (args) => {
454+
if (!this.multiTaskDirectoryManager) {
455+
throw new Error('多任务目录管理器未初始化');
456+
}
457+
const tool = new TaskListTool(
458+
null, // taskIndexManager - 暂时为null,后续实现
459+
this.multiTaskDirectoryManager,
460+
this.taskManager
461+
);
462+
return await tool.handle(args);
463+
},
464+
},
465+
category: 'task',
466+
description: '列出任务,支持状态过滤、搜索和分页',
467+
enabled: true,
468+
});
469+
470+
// 注册 task_switch 工具
471+
toolRegistry.registerTool({
472+
name: 'task_switch',
473+
handler: {
474+
getDefinition: () => TaskSwitchTool.getDefinition(),
475+
handle: async (args) => {
476+
if (!this.multiTaskDirectoryManager) {
477+
throw new Error('多任务目录管理器未初始化');
478+
}
479+
const tool = new TaskSwitchTool(
480+
null, // taskIndexManager - 暂时为null,后续实现
481+
this.multiTaskDirectoryManager,
482+
this.taskManager
483+
);
484+
return await tool.handle(args);
485+
},
486+
},
487+
category: 'task',
488+
description: '切换到指定任务,将其设为当前活跃任务',
489+
enabled: true,
490+
});
491+
445492
logger.info(LogCategory.Task, LogAction.Create, '任务管理工具注册完成', {
446493
tools: toolRegistry.getStats(),
447494
});
@@ -604,6 +651,7 @@ class WaveForgeServer {
604651
});
605652

606653
this.taskManager = new TaskManager(waveDir, this.projectManager);
654+
this.multiTaskDirectoryManager = new MultiTaskDirectoryManager(waveDir);
607655

608656
// 创建 stdio 传输
609657
const transport = new StdioServerTransport();

0 commit comments

Comments
 (0)