pm-orchestrator-enhancement
Version:
PM Orchestrator Enhancement - Multi-agent parallel execution system
223 lines • 8.64 kB
JavaScript
;
/**
* PM Orchestrator Enhancement - PM Orchestrator Core
*
* タスク分析、サブエージェント起動、結果集約を担当するコア機能です。
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.PMOrchestrator = void 0;
const execution_logger_1 = require("../logger/execution-logger");
const types_1 = require("../types");
/**
* PMOrchestratorクラス
*
* ユーザー入力を分析し、適切なサブエージェントを起動して結果を集約します。
*/
class PMOrchestrator {
/**
* コンストラクタ
*
* @param baseDir ベースディレクトリ(デフォルト: カレントディレクトリ)
*/
constructor(baseDir = process.cwd()) {
this.logger = new execution_logger_1.ExecutionLogger(baseDir);
this.baseDir = baseDir;
}
/**
* タスクを実行します
*
* @param input PM Orchestratorへの入力
* @returns PM Orchestratorからの出力
*/
async executeTask(input) {
// タスクを開始
const { taskId } = this.logger.startTask(input.userInput, 'unknown', // タスクタイプは分析で決定
'medium', // 複雑度は分析で決定
input.detectedPattern || 'none');
try {
// タスクを分析
const taskAnalysis = this.analyzeTask(input);
// 必要なサブエージェントを決定
const subagents = this.selectSubagents(taskAnalysis);
// サブエージェントを実行
const subagentResults = [];
for (const subagent of subagents) {
const result = await this.executeSubagent(subagent, input);
subagentResults.push(result);
// 実行を記録
this.logger.recordSubagent(subagent, result.status === 'success' ? types_1.SubagentStatus.COMPLETED : types_1.SubagentStatus.FAILED, result.output, result.error);
// エラーが発生した場合は中断
if (result.status === 'error') {
break;
}
}
// タスクを完了
const allSuccess = subagentResults.every(r => r.status === 'success');
const qualityScore = this.calculateQualityScore(subagentResults);
const executionLog = await this.logger.completeTask(allSuccess ? 'success' : 'error', qualityScore);
// 結果を返す
return {
taskId,
status: allSuccess ? 'success' : 'partial',
subagentResults,
executionLog,
summary: this.generateSummary(subagentResults),
nextSteps: this.generateNextSteps(subagentResults)
};
}
catch (error) {
// エラー処理
const executionLog = await this.logger.completeTask('error', 0, 'EXECUTION_ERROR');
return {
taskId,
status: 'error',
subagentResults: [],
executionLog,
summary: `タスク実行中にエラーが発生しました: ${error}`,
nextSteps: ['エラーログを確認してください']
};
}
}
/**
* タスクを分析します(プライベートメソッド)
*
* @param input PM Orchestratorへの入力
* @returns タスク分析結果
*/
analyzeTask(input) {
const userInput = input.userInput.toLowerCase();
// タスクタイプの判定
let taskType = 'unknown';
if (userInput.includes('pr') || userInput.includes('review')) {
taskType = 'pr_review';
}
else if (userInput.includes('implement') || userInput.includes('feature')) {
taskType = 'implementation';
}
else if (userInput.includes('test')) {
taskType = 'testing';
}
else if (userInput.includes('fix') || userInput.includes('bug')) {
taskType = 'bugfix';
}
// 複雑度の判定
let complexity = 'medium';
if (userInput.includes('simple') || userInput.includes('small')) {
complexity = 'simple';
}
else if (userInput.includes('complex') || userInput.includes('large')) {
complexity = 'complex';
}
return {
taskType,
complexity,
detectedPattern: input.detectedPattern || 'none'
};
}
/**
* 必要なサブエージェントを選択します(プライベートメソッド)
*
* @param analysis タスク分析結果
* @returns サブエージェント名の配列
*/
selectSubagents(analysis) {
const subagents = [];
// 全てのタスクでルールチェックを実行
subagents.push('rule-checker');
// タスクタイプに応じてサブエージェントを追加
switch (analysis.taskType) {
case 'pr_review':
subagents.push('code-analyzer', 'qa', 'reporter');
break;
case 'implementation':
if (analysis.complexity === 'complex') {
subagents.push('designer');
}
subagents.push('implementer', 'tester', 'qa', 'reporter');
break;
case 'testing':
subagents.push('tester', 'qa', 'reporter');
break;
case 'bugfix':
subagents.push('code-analyzer', 'implementer', 'qa', 'reporter');
break;
default:
// 不明なタスクの場合は基本的なサブエージェントのみ
subagents.push('reporter');
}
return subagents;
}
/**
* サブエージェントを実行します(プライベートメソッド)
*
* @param subagent サブエージェント名
* @param input PM Orchestratorへの入力
* @returns サブエージェント実行結果
*/
async executeSubagent(subagent, input) {
const startTime = Date.now();
try {
// 実際の実装では、Task toolを使用してサブエージェントを起動します
// ここではモック実装として、成功を返します
const output = {
message: `${subagent} executed successfully`,
input: input.userInput
};
const duration = Date.now() - startTime;
return {
name: subagent,
status: 'success',
duration,
output
};
}
catch (error) {
const duration = Date.now() - startTime;
return {
name: subagent,
status: 'error',
duration,
output: null,
error: String(error)
};
}
}
/**
* 品質スコアを計算します(プライベートメソッド)
*
* @param results サブエージェント実行結果の配列
* @returns 品質スコア(0-100)
*/
calculateQualityScore(results) {
if (results.length === 0)
return 0;
const successCount = results.filter(r => r.status === 'success').length;
return (successCount / results.length) * 100;
}
/**
* サマリーを生成します(プライベートメソッド)
*
* @param results サブエージェント実行結果の配列
* @returns サマリー文字列
*/
generateSummary(results) {
const successCount = results.filter(r => r.status === 'success').length;
const totalCount = results.length;
return `${totalCount}個のサブエージェントのうち${successCount}個が成功しました。`;
}
/**
* 次のステップを生成します(プライベートメソッド)
*
* @param results サブエージェント実行結果の配列
* @returns 次のステップの配列
*/
generateNextSteps(results) {
const failedSubagents = results.filter(r => r.status === 'error');
if (failedSubagents.length === 0) {
return ['全てのサブエージェントが正常に完了しました'];
}
return failedSubagents.map(s => `${s.name}のエラーを確認してください: ${s.error}`);
}
}
exports.PMOrchestrator = PMOrchestrator;
//# sourceMappingURL=pm-orchestrator.js.map