pdca
Version:
🎯 AI 驅動的 PDCA 多代理開發系統 - 智能循環控制 + 成本管理 + Token 優化 + 多 AI 引擎支援
248 lines • 8.75 kB
JavaScript
/**
* PDCA 協調器 v3
* 支援多 Claude CLI 實例的版本
*/
import { EventEmitter } from 'events';
import { MultiClaudeManager } from '../../core/multi-claude-manager.js';
import { CommunicationManager } from '../../core/communication-manager.js';
import { MessageFactory, MessageType, AgentRole } from '../../core/message-protocol.js';
export class PDCAOrchestratorV3 extends EventEmitter {
multiClaudeManager;
communicationManager;
currentTasks = new Map();
agentProgress = new Map();
constructor(options = {}) {
super();
const sessionName = options.sessionName || 'pdca';
this.multiClaudeManager = new MultiClaudeManager(sessionName);
this.communicationManager = new CommunicationManager({
baseDir: options.communicationDir || '.raiy-pdca/communication'
});
this.initializeEventHandlers();
}
/**
* 初始化事件處理
*/
initializeEventHandlers() {
// 監聽通訊管理器的訊息
this.communicationManager.on('message-received', (message) => {
this.handleMessage(message);
});
// 監聽多 Claude 管理器的事件
this.multiClaudeManager.on('task-sent', (task) => {
this.emit('task-distributed', task);
});
this.multiClaudeManager.on('system-stopped', () => {
this.emit('system-stopped');
});
}
/**
* 啟動系統
*/
async start() {
console.log('🚀 啟動 PDCA 多代理協調系統...');
// 初始化代理
this.multiClaudeManager.initializeAgents();
// 啟動所有 Claude CLI 實例
await this.multiClaudeManager.startAllAgents();
// 開始監聽協調器訊息
this.communicationManager.startListening('coordinator');
// 初始化代理進度
Object.values(AgentRole).forEach(role => {
this.agentProgress.set(role, 0);
});
console.log('✅ 系統啟動完成!');
console.log('📊 使用 tmux attach -t pdca 查看各代理');
this.emit('system-started');
}
/**
* 分配任務
*/
async assignTask(taskDescription) {
console.log(`\n📋 接收任務: ${taskDescription}`);
// 創建任務分解計畫
const taskPlan = this.createTaskPlan(taskDescription);
// 發送給 Plan 代理開始
const planTask = MessageFactory.createTaskAssignment('coordinator', AgentRole.PLAN, {
title: '分析並規劃任務',
description: taskDescription,
requirements: [
'深入理解任務需求',
'制定詳細執行計畫',
'定義成功標準',
'識別潛在風險'
]
});
this.currentTasks.set(planTask.content.taskId, planTask);
await this.communicationManager.sendMessage(planTask);
// 通知所有代理新任務
await this.multiClaudeManager.sendTask(taskDescription);
console.log('✅ 任務已分配給代理團隊');
}
/**
* 創建任務計畫
*/
createTaskPlan(description) {
const plan = new Map();
plan.set(AgentRole.PLAN, [
'分析任務需求',
'制定執行策略',
'分配子任務'
]);
plan.set(AgentRole.DO, [
'等待 Plan 的指示',
'實作功能',
'編寫程式碼'
]);
plan.set(AgentRole.CHECK, [
'等待 Do 的產出',
'執行品質檢查',
'運行測試'
]);
plan.set(AgentRole.ACT, [
'等待 Check 的結果',
'實施改進',
'優化效能'
]);
plan.set(AgentRole.KNOWLEDGE, [
'持續記錄過程',
'整理知識點',
'更新文檔'
]);
return plan;
}
/**
* 處理接收到的訊息
*/
handleMessage(message) {
console.log(`\n📨 收到來自 ${message.from} 的訊息: ${message.type}`);
switch (message.type) {
case MessageType.PROGRESS_UPDATE:
this.handleProgressUpdate(message);
break;
case MessageType.RESULT_REPORT:
this.handleResultReport(message);
break;
case MessageType.REQUEST_HELP:
this.handleHelpRequest(message);
break;
case MessageType.ERROR_REPORT:
this.handleErrorReport(message);
break;
}
this.emit('message-processed', message);
}
/**
* 處理進度更新
*/
handleProgressUpdate(update) {
const agent = update.from;
this.agentProgress.set(agent, update.content.progress);
console.log(`📊 ${agent} 進度: ${update.content.progress}%`);
console.log(` 當前步驟: ${update.content.currentStep}`);
// 計算整體進度
const overallProgress = this.calculateOverallProgress();
this.emit('progress-updated', {
agent,
progress: update.content.progress,
overall: overallProgress
});
}
/**
* 處理結果報告
*/
async handleResultReport(report) {
const agent = report.from;
console.log(`\n📋 ${agent} 完成報告:`);
console.log(` 成功: ${report.content.success ? '✅' : '❌'}`);
console.log(` 摘要: ${report.content.summary}`);
// 根據代理角色決定下一步
await this.orchestrateNextStep(agent, report);
this.emit('result-received', report);
}
/**
* 協調下一步行動
*/
async orchestrateNextStep(fromAgent, report) {
// 根據 PDCA 流程決定下一個代理
const nextAgent = this.getNextAgent(fromAgent);
if (nextAgent && report.content.success) {
const nextTask = MessageFactory.createTaskAssignment('coordinator', nextAgent, {
title: `基於 ${fromAgent} 的結果繼續工作`,
description: `請根據 ${fromAgent} 的輸出進行下一步工作`,
requirements: report.content.nextSteps || [],
dependencies: [report.content.taskId]
});
await this.communicationManager.sendMessage(nextTask);
console.log(`\n➡️ 任務已傳遞給 ${nextAgent}`);
}
}
/**
* 獲取下一個代理
*/
getNextAgent(currentAgent) {
const flow = {
[AgentRole.PLAN]: AgentRole.DO,
[AgentRole.DO]: AgentRole.CHECK,
[AgentRole.CHECK]: AgentRole.ACT,
[AgentRole.ACT]: null, // 循環結束
[AgentRole.KNOWLEDGE]: null // 知識代理獨立運作
};
return flow[currentAgent];
}
/**
* 處理求助請求
*/
async handleHelpRequest(message) {
console.log(`\n🆘 ${message.from} 請求協助`);
// 可以將求助轉發給其他代理或人工介入
await this.communicationManager.broadcastMessage({
...message,
type: MessageType.REQUEST_HELP
});
}
/**
* 處理錯誤報告
*/
handleErrorReport(message) {
console.error(`\n❌ ${message.from} 報告錯誤:`, message.content);
this.emit('error-reported', message);
}
/**
* 計算整體進度
*/
calculateOverallProgress() {
const progresses = Array.from(this.agentProgress.values());
if (progresses.length === 0)
return 0;
const sum = progresses.reduce((acc, val) => acc + val, 0);
return Math.round(sum / progresses.length);
}
/**
* 獲取系統狀態
*/
getSystemStatus() {
return {
agents: this.multiClaudeManager.getAgentStatuses(),
tasks: this.currentTasks,
progress: this.agentProgress,
communication: this.communicationManager.getStatistics()
};
}
/**
* 停止系統
*/
async stop() {
console.log('\n🛑 正在停止 PDCA 系統...');
// 發送停止訊息
const shutdownMessage = MessageFactory.createSystemMessage(MessageType.SYSTEM_SHUTDOWN, { reason: 'User requested shutdown' });
await this.communicationManager.broadcastMessage(shutdownMessage);
// 停止監聽
this.communicationManager.stopListening();
// 停止所有代理
await this.multiClaudeManager.stopAllAgents();
console.log('✅ 系統已停止');
}
}
export default PDCAOrchestratorV3;
//# sourceMappingURL=orchestrator-v3.js.map