aiagentmarket 3.0.9
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.
- package/README.md +25 -0
- package/bin/aiagent +387 -0
- package/bin/aiagent-base +387 -0
- package/bin/aiagent1 +387 -0
- package/bin/aiagent10 +387 -0
- package/bin/aiagent100 +387 -0
- package/bin/aiagent11 +387 -0
- package/bin/aiagent12 +387 -0
- package/bin/aiagent13 +387 -0
- package/bin/aiagent14 +387 -0
- package/bin/aiagent15 +387 -0
- package/bin/aiagent16 +387 -0
- package/bin/aiagent17 +387 -0
- package/bin/aiagent18 +387 -0
- package/bin/aiagent19 +387 -0
- package/bin/aiagent2 +387 -0
- package/bin/aiagent20 +387 -0
- package/bin/aiagent21 +387 -0
- package/bin/aiagent22 +387 -0
- package/bin/aiagent23 +387 -0
- package/bin/aiagent24 +387 -0
- package/bin/aiagent25 +387 -0
- package/bin/aiagent26 +387 -0
- package/bin/aiagent27 +387 -0
- package/bin/aiagent28 +387 -0
- package/bin/aiagent29 +387 -0
- package/bin/aiagent3 +387 -0
- package/bin/aiagent30 +387 -0
- package/bin/aiagent31 +387 -0
- package/bin/aiagent32 +387 -0
- package/bin/aiagent33 +387 -0
- package/bin/aiagent34 +387 -0
- package/bin/aiagent35 +387 -0
- package/bin/aiagent36 +387 -0
- package/bin/aiagent37 +387 -0
- package/bin/aiagent38 +387 -0
- package/bin/aiagent39 +387 -0
- package/bin/aiagent4 +387 -0
- package/bin/aiagent40 +387 -0
- package/bin/aiagent41 +387 -0
- package/bin/aiagent42 +387 -0
- package/bin/aiagent43 +387 -0
- package/bin/aiagent44 +387 -0
- package/bin/aiagent45 +387 -0
- package/bin/aiagent46 +387 -0
- package/bin/aiagent47 +387 -0
- package/bin/aiagent48 +387 -0
- package/bin/aiagent49 +387 -0
- package/bin/aiagent5 +387 -0
- package/bin/aiagent50 +387 -0
- package/bin/aiagent51 +387 -0
- package/bin/aiagent52 +387 -0
- package/bin/aiagent53 +387 -0
- package/bin/aiagent54 +387 -0
- package/bin/aiagent55 +387 -0
- package/bin/aiagent56 +387 -0
- package/bin/aiagent57 +387 -0
- package/bin/aiagent58 +387 -0
- package/bin/aiagent59 +387 -0
- package/bin/aiagent6 +387 -0
- package/bin/aiagent60 +387 -0
- package/bin/aiagent61 +387 -0
- package/bin/aiagent62 +387 -0
- package/bin/aiagent63 +387 -0
- package/bin/aiagent64 +387 -0
- package/bin/aiagent65 +387 -0
- package/bin/aiagent66 +387 -0
- package/bin/aiagent67 +387 -0
- package/bin/aiagent68 +387 -0
- package/bin/aiagent69 +387 -0
- package/bin/aiagent7 +387 -0
- package/bin/aiagent70 +387 -0
- package/bin/aiagent71 +387 -0
- package/bin/aiagent72 +387 -0
- package/bin/aiagent73 +387 -0
- package/bin/aiagent74 +387 -0
- package/bin/aiagent75 +387 -0
- package/bin/aiagent76 +387 -0
- package/bin/aiagent77 +387 -0
- package/bin/aiagent78 +387 -0
- package/bin/aiagent79 +387 -0
- package/bin/aiagent8 +387 -0
- package/bin/aiagent80 +387 -0
- package/bin/aiagent81 +387 -0
- package/bin/aiagent82 +387 -0
- package/bin/aiagent83 +387 -0
- package/bin/aiagent84 +387 -0
- package/bin/aiagent85 +387 -0
- package/bin/aiagent86 +387 -0
- package/bin/aiagent87 +387 -0
- package/bin/aiagent88 +387 -0
- package/bin/aiagent89 +387 -0
- package/bin/aiagent9 +387 -0
- package/bin/aiagent90 +387 -0
- package/bin/aiagent91 +387 -0
- package/bin/aiagent92 +387 -0
- package/bin/aiagent93 +387 -0
- package/bin/aiagent94 +387 -0
- package/bin/aiagent95 +387 -0
- package/bin/aiagent96 +387 -0
- package/bin/aiagent97 +387 -0
- package/bin/aiagent98 +387 -0
- package/bin/aiagent99 +387 -0
- package/config/claude-config-template.json +13 -0
- package/lib/mcp-server/dist/InteractiveLogin.js +27 -0
- package/lib/mcp-server/dist/PortalAuthClient.js +1 -0
- package/lib/mcp-server/dist/TokenManager.js +20 -0
- package/lib/mcp-server/dist/bluelamp-system.js +32 -0
- package/lib/mcp-server/dist/crypto-utils.js +27 -0
- package/lib/mcp-server/dist/database-version.js +33 -0
- package/lib/mcp-server/dist/index.js +62 -0
- package/lib/mcp-server/dist/plugins/base-plugin.js +24 -0
- package/lib/mcp-server/dist/plugins/plugin-manager.js +31 -0
- package/lib/mcp-server/dist/plugins/services/leonardo-plugin.js +89 -0
- package/lib/mcp-server/dist/plugins/services/leonardo-prompt-parser.js +36 -0
- package/lib/mcp-server/dist/plugins/services/portal-api-client.js +22 -0
- package/lib/mcp-server/dist/plugins/services/portal-plugin.js +52 -0
- package/lib/mcp-server/dist/secure-mcp-server.js +78 -0
- package/lib/mcp-server/dist/security/ApiKeyManager.js +24 -0
- package/lib/mcp-server/dist/security/InteractiveLogin.js +32 -0
- package/lib/mcp-server/dist/security/PortalAuthClient.js +1 -0
- package/lib/mcp-server/dist/security/SimpleAuthManager.js +1 -0
- package/lib/mcp-server/dist/security/SlotAuthClient.js +9 -0
- package/lib/mcp-server/dist/security/TokenManager.js +25 -0
- package/lib/mcp-server/package.json +22 -0
- package/package.json +147 -0
package/bin/aiagent22
ADDED
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* AI Agent - AI Agent Orchestration System with Portal Authentication
|
|
5
|
+
* Base script that handles slot-based command routing
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Portal統合認証システム
|
|
9
|
+
* - 3箇所分散保存によるセキュリティ強化
|
|
10
|
+
* - bypassmode=true (--dangerously-skip-permissions)
|
|
11
|
+
* - orchestrator Knowledge Injection
|
|
12
|
+
* - 24 AI Agents available as sub-agents
|
|
13
|
+
* - Auto slot detection from command name
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const { spawn } = require('child_process');
|
|
17
|
+
const path = require('path');
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const os = require('os');
|
|
20
|
+
|
|
21
|
+
// 環境変数を.env.localから読み込み
|
|
22
|
+
const envPath = path.join(__dirname, '..', '.env.local');
|
|
23
|
+
if (fs.existsSync(envPath)) {
|
|
24
|
+
const envContent = fs.readFileSync(envPath, 'utf8');
|
|
25
|
+
envContent.split('\n').forEach(line => {
|
|
26
|
+
const [key, value] = line.split('=');
|
|
27
|
+
if (key && value && !key.startsWith('#')) {
|
|
28
|
+
process.env[key] = value;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// パッケージのルートディレクトリを取得
|
|
34
|
+
const packageRoot = path.dirname(__dirname);
|
|
35
|
+
const mcpServerPath = path.join(packageRoot, 'lib/mcp-server/dist/secure-mcp-server.js');
|
|
36
|
+
|
|
37
|
+
// Portal認証モジュールのインポート(ES Modules対応)
|
|
38
|
+
const securityPath = path.join(packageRoot, 'lib/mcp-server/dist/security');
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* コマンド名からスロット番号を自動判定
|
|
42
|
+
*/
|
|
43
|
+
function detectSlotNumber() {
|
|
44
|
+
try {
|
|
45
|
+
// process.argv[1] から実行されたコマンドのパスを取得
|
|
46
|
+
const commandPath = process.argv[1];
|
|
47
|
+
const commandName = path.basename(commandPath);
|
|
48
|
+
|
|
49
|
+
// コマンド名から数字部分を抽出
|
|
50
|
+
if (commandName === 'aiagent') {
|
|
51
|
+
return 1; // デフォルトはスロット1
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const match = commandName.match(/^aiagent(\d+)$/);
|
|
55
|
+
if (match) {
|
|
56
|
+
const slotNumber = parseInt(match[1], 10);
|
|
57
|
+
if (slotNumber >= 1 && slotNumber <= 100) {
|
|
58
|
+
return slotNumber;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
throw new Error(`Invalid command name: ${commandName}. Expected format: aiagent or aiagent[1-100]`);
|
|
63
|
+
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error('❌ スロット番号の自動判定に失敗しました:', error.message);
|
|
66
|
+
console.error('');
|
|
67
|
+
console.error('有効なコマンド名:');
|
|
68
|
+
console.error('- aiagent (スロット1)');
|
|
69
|
+
console.error('- aiagent2〜aiagent100');
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// スロット番号を取得
|
|
75
|
+
const SLOT_NUMBER = detectSlotNumber();
|
|
76
|
+
|
|
77
|
+
console.log(`🔵 AI Agent - AIエージェント統合システム (スロット${SLOT_NUMBER})`);
|
|
78
|
+
console.log(' ポータル統合認証 + 知識注入 + 24種類のAIエージェント');
|
|
79
|
+
console.log('');
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Portal認証の実行
|
|
83
|
+
*/
|
|
84
|
+
async function performPortalAuth() {
|
|
85
|
+
try {
|
|
86
|
+
// 動的インポートでES Modulesを読み込み(遅延評価を保証)
|
|
87
|
+
console.log('🔐 Portal認証を開始します...');
|
|
88
|
+
|
|
89
|
+
// macOS対応のfile URLで InteractiveLogin を読み込み
|
|
90
|
+
const { InteractiveLogin } = await import(`file://localhost${securityPath}/InteractiveLogin.js`);
|
|
91
|
+
|
|
92
|
+
const authResult = await InteractiveLogin.performLogin();
|
|
93
|
+
|
|
94
|
+
InteractiveLogin.displayLoginSuccess(authResult);
|
|
95
|
+
|
|
96
|
+
return authResult.token;
|
|
97
|
+
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.error('❌ Portal認証エラー:', error.message);
|
|
100
|
+
console.error('');
|
|
101
|
+
console.error('解決方法:');
|
|
102
|
+
console.error('1. インターネット接続を確認してください');
|
|
103
|
+
console.error('2. Portal認証情報が正しいか確認してください');
|
|
104
|
+
console.error('3. https://geniemon.vercel.app にアクセスできるか確認してください');
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* シンプル保存システムの実行
|
|
111
|
+
*/
|
|
112
|
+
async function performDistributedStorage(cliToken) {
|
|
113
|
+
try {
|
|
114
|
+
// SimpleAuthManagerを読み込み(dynamic import使用)
|
|
115
|
+
const { SimpleAuthManager } = await import(`file://${securityPath}/SimpleAuthManager.js`);
|
|
116
|
+
|
|
117
|
+
console.log('🔒 APIキーを安全に保存中...');
|
|
118
|
+
const success = SimpleAuthManager.saveApiKey(cliToken);
|
|
119
|
+
|
|
120
|
+
if (success) {
|
|
121
|
+
console.log('✅ APIキー保存完了');
|
|
122
|
+
console.log('🛡️ セキュリティレベル: 高');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
success: success,
|
|
127
|
+
distributionTime: 1
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error('❌ APIキー保存エラー:', error.message);
|
|
132
|
+
return {
|
|
133
|
+
success: false,
|
|
134
|
+
error: error.message
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* エージェントセットアップの確認と実行
|
|
141
|
+
*/
|
|
142
|
+
function ensureAgentsSetup() {
|
|
143
|
+
const agentsDir = path.join(os.homedir(), '.claude/agents');
|
|
144
|
+
const blueLampAgent = path.join(agentsDir, 'ブルーランプ.md');
|
|
145
|
+
|
|
146
|
+
// ブルーランプエージェントが存在しない場合はセットアップを実行
|
|
147
|
+
if (!fs.existsSync(blueLampAgent)) {
|
|
148
|
+
console.log('🔧 エージェントセットアップが必要です...');
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
const setupScript = path.join(packageRoot, 'scripts/setup-agents.js');
|
|
152
|
+
if (fs.existsSync(setupScript)) {
|
|
153
|
+
require(setupScript);
|
|
154
|
+
console.log('✅ エージェントセットアップ完了');
|
|
155
|
+
} else {
|
|
156
|
+
console.log('⚠️ セットアップスクリプトが見つかりません。スキップします。');
|
|
157
|
+
}
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.warn('⚠️ エージェント自動セットアップに失敗しました:', error.message);
|
|
160
|
+
console.warn('手動でセットアップを実行してください: npm run postinstall');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* スロット認証の実行
|
|
167
|
+
*/
|
|
168
|
+
async function performSlotAuth(token) {
|
|
169
|
+
try {
|
|
170
|
+
const fetch = (await import('node-fetch')).default;
|
|
171
|
+
|
|
172
|
+
console.log(`🎯 スロット${SLOT_NUMBER}の認証を実行中...`);
|
|
173
|
+
|
|
174
|
+
const portalUrl = process.env.AIAGENT_PORTAL_API_URL || 'https://aiagentmarket-backend-235426778039.asia-northeast1.run.app';
|
|
175
|
+
const response = await fetch(`${portalUrl}/api/cli/slots/${SLOT_NUMBER}`, {
|
|
176
|
+
method: 'GET',
|
|
177
|
+
headers: {
|
|
178
|
+
'Content-Type': 'application/json',
|
|
179
|
+
'X-CLI-Token': token
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
if (!response.ok) {
|
|
184
|
+
throw new Error(`スロット認証失敗 (${response.status}): ${response.statusText}`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const result = await response.json();
|
|
188
|
+
console.log(`✅ スロット${SLOT_NUMBER}認証完了`);
|
|
189
|
+
|
|
190
|
+
return result;
|
|
191
|
+
|
|
192
|
+
} catch (error) {
|
|
193
|
+
console.error(`❌ スロット${SLOT_NUMBER}認証エラー:`, error.message);
|
|
194
|
+
console.error('');
|
|
195
|
+
console.error('解決方法:');
|
|
196
|
+
console.error('1. インターネット接続を確認してください');
|
|
197
|
+
console.error('2. Portalでスロット権限があることを確認してください');
|
|
198
|
+
console.error('3. しばらく待ってから再試行してください');
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* メイン処理
|
|
205
|
+
*/
|
|
206
|
+
async function main() {
|
|
207
|
+
// コマンドライン引数の処理
|
|
208
|
+
const args = process.argv.slice(2);
|
|
209
|
+
|
|
210
|
+
// ログアウトコマンド
|
|
211
|
+
if (args.includes('--logout')) {
|
|
212
|
+
try {
|
|
213
|
+
const { InteractiveLogin } = await import(`file://${securityPath}/InteractiveLogin.js`);
|
|
214
|
+
await InteractiveLogin.logout();
|
|
215
|
+
process.exit(0);
|
|
216
|
+
} catch (error) {
|
|
217
|
+
console.error('❌ ログアウトエラー:', error.message);
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// ログイン状態確認コマンド
|
|
223
|
+
if (args.includes('--status')) {
|
|
224
|
+
try {
|
|
225
|
+
const { InteractiveLogin } = await import(`file://${securityPath}/InteractiveLogin.js`);
|
|
226
|
+
await InteractiveLogin.checkLoginStatus();
|
|
227
|
+
process.exit(0);
|
|
228
|
+
} catch (error) {
|
|
229
|
+
console.error('❌ ステータス確認エラー:', error.message);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// エージェントセットアップの確認
|
|
235
|
+
ensureAgentsSetup();
|
|
236
|
+
|
|
237
|
+
// Portal認証の実行
|
|
238
|
+
const cliToken = await performPortalAuth();
|
|
239
|
+
|
|
240
|
+
// スロット認証の実行
|
|
241
|
+
await performSlotAuth(cliToken);
|
|
242
|
+
|
|
243
|
+
// シンプル保存システムの実行
|
|
244
|
+
console.log('🔒 APIキーを保存中...');
|
|
245
|
+
const distributed = await performDistributedStorage(cliToken);
|
|
246
|
+
|
|
247
|
+
if (!distributed.success) {
|
|
248
|
+
console.error('❌ APIキー保存に失敗しました:', distributed.error);
|
|
249
|
+
console.error('フォールバックモードで起動します...');
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// TTY検出とフォールバック処理
|
|
253
|
+
const isTTY = process.stdout.isTTY && process.stdin.isTTY;
|
|
254
|
+
if (!isTTY) {
|
|
255
|
+
console.warn('⚠️ TTY環境が検出されませんでした。互換モードで起動します。');
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// 環境変数の設定(スロット番号を追加)
|
|
259
|
+
const env = {
|
|
260
|
+
...process.env,
|
|
261
|
+
AIAGENT_ENCRYPTION_KEY: process.env.AIAGENT_ENCRYPTION_KEY || 'aiagent-default-key-2024',
|
|
262
|
+
AIAGENT_TOKEN: cliToken, // Portal認証で取得した実際のCLIトークンを使用
|
|
263
|
+
AIAGENT_DISTRIBUTED: distributed.success ? 'true' : 'false',
|
|
264
|
+
AIAGENT_SLOT_NUMBER: SLOT_NUMBER.toString(), // スロット番号を環境変数として設定
|
|
265
|
+
NODE_ENV: 'production'
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
// MCP設定ファイルの作成
|
|
269
|
+
const tempConfigPath = path.join(os.tmpdir(), `aiagent-mcp-slot${SLOT_NUMBER}-${Date.now()}.json`);
|
|
270
|
+
|
|
271
|
+
const mcpConfig = {
|
|
272
|
+
mcpServers: {
|
|
273
|
+
"aiagent-secure": {
|
|
274
|
+
command: "node",
|
|
275
|
+
args: [mcpServerPath],
|
|
276
|
+
env: {
|
|
277
|
+
AIAGENT_ENCRYPTION_KEY: env.AIAGENT_ENCRYPTION_KEY,
|
|
278
|
+
AIAGENT_TOKEN: env.AIAGENT_TOKEN,
|
|
279
|
+
AIAGENT_SLOT_NUMBER: env.AIAGENT_SLOT_NUMBER
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// 自動フックは削除 - 起動プロンプトで手動実行を指示
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
fs.writeFileSync(tempConfigPath, JSON.stringify(mcpConfig, null, 2));
|
|
287
|
+
|
|
288
|
+
// オーケストレーター起動プロンプト(スロット情報を追加)
|
|
289
|
+
const orchestratorPrompt = `> オーケストレーターモードで起動 (スロット${SLOT_NUMBER})
|
|
290
|
+
|
|
291
|
+
🔵 AI Agent 統合認証システム が有効化されました
|
|
292
|
+
|
|
293
|
+
\x1b[34m╭─────────────────────────────────────────────────────────────────╮\x1b[0m
|
|
294
|
+
\x1b[34m│ │\x1b[0m
|
|
295
|
+
\x1b[34m│ A I A g e n t │\x1b[0m
|
|
296
|
+
\x1b[34m│ ───────────────── │\x1b[0m
|
|
297
|
+
\x1b[34m│ スロット${SLOT_NUMBER.toString().padStart(2, ' ')} でお待ちしています │\x1b[0m
|
|
298
|
+
\x1b[34m│ │\x1b[0m
|
|
299
|
+
\x1b[34m╰─────────────────────────────────────────────────────────────────╯\x1b[0m
|
|
300
|
+
|
|
301
|
+
**最初に必ずオーケストレーター専門知識を注入してください**
|
|
302
|
+
inject_knowledge ツールで "オーケストレーター${SLOT_NUMBER}" を実行してから開始してください。(初回必須)
|
|
303
|
+
|
|
304
|
+
準備完了です。まず知識注入を実行してから、何を実装するか教えてください。`;
|
|
305
|
+
|
|
306
|
+
// 一時プロンプトファイルの作成
|
|
307
|
+
const tempPromptPath = path.join(os.tmpdir(), `aiagent-prompt-slot${SLOT_NUMBER}-${Date.now()}.txt`);
|
|
308
|
+
fs.writeFileSync(tempPromptPath, orchestratorPrompt);
|
|
309
|
+
|
|
310
|
+
console.log('🚀 Claude Code起動中...');
|
|
311
|
+
console.log(` - スロット番号: ${SLOT_NUMBER}`);
|
|
312
|
+
console.log(' - Portal認証: ON');
|
|
313
|
+
console.log(' - 単一ファイル保存: ON');
|
|
314
|
+
console.log(' - bypassmode: ON (--dangerously-skip-permissions)');
|
|
315
|
+
console.log(' - Knowledge Injection: ON');
|
|
316
|
+
console.log(' - MCP Server: AI Agent Secure');
|
|
317
|
+
console.log(' - TTY互換モード: ON');
|
|
318
|
+
console.log('');
|
|
319
|
+
|
|
320
|
+
// Claude Codeを起動(claude-flow方式: プロンプト引数渡し + TTY維持)
|
|
321
|
+
const claudeArgs = [
|
|
322
|
+
orchestratorPrompt, // 初期プロンプトを第1引数で渡す(claude-flow方式)
|
|
323
|
+
'--dangerously-skip-permissions', // bypassmode=true(開発モード)
|
|
324
|
+
'--mcp-config', tempConfigPath, // MCP設定ファイル
|
|
325
|
+
];
|
|
326
|
+
|
|
327
|
+
const child = spawn('claude', claudeArgs, {
|
|
328
|
+
stdio: 'inherit', // TTY完全維持(claude-flow方式)
|
|
329
|
+
env: env,
|
|
330
|
+
|
|
331
|
+
// プロセス設定
|
|
332
|
+
detached: false, // プロセスグループ分離を無効
|
|
333
|
+
windowsHide: false, // Windows環境でのウィンドウ表示
|
|
334
|
+
shell: false // シェル経由実行を無効化
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// TTY維持によりsetRawMode不要(問題の原因を完全除去)
|
|
338
|
+
// stdin操作も不要(引数でプロンプト渡し済み)
|
|
339
|
+
|
|
340
|
+
// エラーハンドリング
|
|
341
|
+
child.on('error', (error) => {
|
|
342
|
+
console.error('❌ Claude Code起動エラー:', error.message);
|
|
343
|
+
console.error('');
|
|
344
|
+
console.error('解決方法:');
|
|
345
|
+
console.error('1. Claude Codeがインストールされているか確認');
|
|
346
|
+
console.error('2. PATHにclaudeコマンドが含まれているか確認');
|
|
347
|
+
console.error('3. Claude Codeのバージョンが最新か確認');
|
|
348
|
+
|
|
349
|
+
// 一時ファイルをクリーンアップ
|
|
350
|
+
try {
|
|
351
|
+
fs.unlinkSync(tempConfigPath);
|
|
352
|
+
fs.unlinkSync(tempPromptPath);
|
|
353
|
+
} catch (e) {
|
|
354
|
+
// ignore cleanup errors
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
process.exit(1);
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
// 終了時のクリーンアップ
|
|
361
|
+
child.on('exit', (code) => {
|
|
362
|
+
console.log('');
|
|
363
|
+
console.log(`🔵 AI Agent セッション終了 (スロット${SLOT_NUMBER})`);
|
|
364
|
+
|
|
365
|
+
// 一時ファイルをクリーンアップ
|
|
366
|
+
try {
|
|
367
|
+
fs.unlinkSync(tempConfigPath);
|
|
368
|
+
fs.unlinkSync(tempPromptPath);
|
|
369
|
+
} catch (e) {
|
|
370
|
+
// ignore cleanup errors
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
process.exit(code || 0);
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
// SIGINT (Ctrl+C) ハンドリング
|
|
377
|
+
process.on('SIGINT', () => {
|
|
378
|
+
console.log(`\n🔵 AI Agent を終了しています... (スロット${SLOT_NUMBER})`);
|
|
379
|
+
child.kill('SIGINT');
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// メイン処理の実行
|
|
384
|
+
main().catch((error) => {
|
|
385
|
+
console.error('❌ 予期しないエラーが発生しました:', error.message);
|
|
386
|
+
process.exit(1);
|
|
387
|
+
});
|