@iflow-mcp/camoneart-maestro 5.0.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.
- package/CHANGELOG.md +949 -0
- package/LICENSE +21 -0
- package/README.ja.md +550 -0
- package/README.md +576 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +7407 -0
- package/dist/cli.js.map +1 -0
- package/dist/mcp/server.d.ts +28 -0
- package/dist/mcp/server.js +847 -0
- package/dist/mcp/server.js.map +1 -0
- package/package.json +93 -0
- package/scripts/generate-completions.js +51 -0
- package/scripts/maestro-tmux-attach +101 -0
- package/scripts/update-scoop-manifest.js +80 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/create.ts","../src/core/git.ts","../src/core/config.ts","../src/utils/tmuxSession.ts","../src/utils/tmux.ts","../src/utils/nativeTmux.ts","../src/utils/tty.ts","../src/utils/packageManager.ts","../src/utils/gitignore.ts","../src/utils/path.ts","../src/commands/list.ts","../src/commands/delete.ts","../src/commands/shell.ts","../src/utils/errors.ts","../src/utils/fzf.ts","../src/commands/exec.ts","../src/commands/attach.ts","../src/commands/config.ts","../src/commands/github.ts","../src/commands/completion.ts","../src/commands/tmux.ts","../src/commands/where.ts","../src/commands/sync.ts","../src/commands/review.ts","../src/commands/issue.ts","../src/commands/history.ts","../src/commands/graph.ts","../src/commands/health.ts","../src/commands/snapshot.ts","../src/commands/init.ts","../src/commands/push.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander'\nimport chalk from 'chalk'\nimport { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { dirname, join } from 'path'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'))\nimport { createCommand } from './commands/create.js'\nimport { listCommand } from './commands/list.js'\nimport { deleteCommand } from './commands/delete.js'\nimport { shellCommand } from './commands/shell.js'\nimport { execCommand } from './commands/exec.js'\nimport { attachCommand } from './commands/attach.js'\nimport { configCommand } from './commands/config.js'\nimport { githubCommand } from './commands/github.js'\nimport { completionCommand } from './commands/completion.js'\nimport { tmuxCommand } from './commands/tmux.js'\nimport { whereCommand } from './commands/where.js'\nimport { syncCommand } from './commands/sync.js'\nimport { reviewCommand } from './commands/review.js'\nimport { issueCommand } from './commands/issue.js'\nimport { historyCommand } from './commands/history.js'\nimport { graphCommand } from './commands/graph.js'\nimport { healthCommand } from './commands/health.js'\nimport { snapshotCommand } from './commands/snapshot.js'\nimport { initCommand } from './commands/init.js'\nimport { pushCommand } from './commands/push.js'\n\nconst program = new Command()\n\nprogram\n .name('maestro')\n .description('🎼 Maestro - Git worktreeオーケストレーションでClaude Codeとパラレル開発')\n .version(packageJson.version)\n\n// サブコマンドを追加\nprogram.addCommand(initCommand)\nprogram.addCommand(createCommand)\nprogram.addCommand(listCommand)\nprogram.addCommand(deleteCommand)\nprogram.addCommand(shellCommand)\nprogram.addCommand(execCommand)\nprogram.addCommand(attachCommand)\nprogram.addCommand(configCommand)\nprogram.addCommand(githubCommand)\nprogram.addCommand(completionCommand)\nprogram.addCommand(tmuxCommand)\nprogram.addCommand(whereCommand)\nprogram.addCommand(syncCommand)\nprogram.addCommand(reviewCommand)\nprogram.addCommand(issueCommand)\nprogram.addCommand(historyCommand)\nprogram.addCommand(graphCommand)\nprogram.addCommand(healthCommand)\nprogram.addCommand(snapshotCommand)\nprogram.addCommand(pushCommand)\n\n// エラーハンドリング\nprogram.exitOverride()\n\ninterface CommanderError extends Error {\n code?: string\n exitCode?: number\n}\n\ntry {\n await program.parseAsync(process.argv)\n} catch (error) {\n if (error instanceof Error) {\n const cmdErr = error as CommanderError\n if (\n cmdErr.exitCode === 0 ||\n cmdErr.code === 'commander.version' ||\n cmdErr.code === 'commander.helpDisplayed'\n ) {\n process.exit(0)\n }\n if (cmdErr.message === '(outputHelp)') {\n process.exit(0)\n }\n console.error(chalk.red('エラー:'), error.message)\n }\n process.exit(1)\n}\n\nexport { program }\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { CreateOptions } from '../types/index.js'\nimport { ConfigManager, Config } from '../core/config.js'\nimport { execa } from 'execa'\nimport path from 'path'\nimport fs from 'fs/promises'\nimport { spawn } from 'child_process'\nimport {\n createTmuxSession as createTmuxSessionShared,\n validateTmuxOptions,\n} from '../utils/tmuxSession.js'\nimport { detectPackageManager } from '../utils/packageManager.js'\nimport { addToGitignore } from '../utils/gitignore.js'\nimport { formatPath } from '../utils/path.js'\n\n// GitHubラベル型定義\ninterface GithubLabel {\n name: string\n}\n\n// GitHubユーザー型定義\ninterface GithubUser {\n login: string\n}\n\n// GitHub PR/Issue型定義\ninterface GithubMetadata {\n type: 'issue' | 'pr'\n title: string\n body: string\n author: string\n labels: string[]\n assignees: string[]\n milestone?: string\n url: string\n}\n\n// worktreeメタデータ型定義\ninterface WorktreeMetadata {\n createdAt: string\n branch: string\n worktreePath: string\n github?: GithubMetadata & { issueNumber?: string }\n}\n\n// Issue番号からブランチ名を生成する関数\nexport function parseIssueNumber(input: string): {\n isIssue: boolean\n issueNumber?: string\n branchName: string\n} {\n // #123, 123, issue-123などの形式をサポート\n const issueMatch = input.match(/^#?(\\d+)$/) || input.match(/^issue-(\\d+)$/i)\n\n if (issueMatch) {\n const issueNumber = issueMatch[1]\n return {\n isIssue: true,\n issueNumber,\n branchName: `issue-${issueNumber}`,\n }\n }\n\n return {\n isIssue: false,\n branchName: input,\n }\n}\n\ninterface GitHubApiResponse {\n number: number\n title: string\n body?: string\n author?: GithubUser\n labels?: GithubLabel[]\n assignees?: GithubUser[]\n milestone?: { title: string }\n url: string\n}\n\n// GitHub Issue/PRの情報を取得\n// GitHubアイテム(PR/Issue)の情報を取得\nasync function fetchGitHubItem(\n issueNumber: string,\n type: 'pr' | 'issue'\n): Promise<GitHubApiResponse> {\n const { stdout } = await execa('gh', [\n type,\n 'view',\n issueNumber,\n '--json',\n 'number,title,body,author,labels,assignees,milestone,url',\n ])\n return JSON.parse(stdout)\n}\n\n// GitHubアイテムをメタデータに変換\nfunction convertToMetadata(item: GitHubApiResponse, type: 'pr' | 'issue'): GithubMetadata {\n return {\n type,\n title: item.title,\n body: item.body || '',\n author: item.author?.login || '',\n labels: item.labels?.map((l: GithubLabel) => l.name) || [],\n assignees: item.assignees?.map((a: GithubUser) => a.login) || [],\n milestone: item.milestone?.title,\n url: item.url,\n }\n}\n\nexport async function fetchGitHubMetadata(issueNumber: string): Promise<GithubMetadata | null> {\n try {\n // まずPRとして試す\n try {\n const pr = await fetchGitHubItem(issueNumber, 'pr')\n return convertToMetadata(pr, 'pr')\n } catch {\n // PRでなければIssueとして試す\n const issue = await fetchGitHubItem(issueNumber, 'issue')\n return convertToMetadata(issue, 'issue')\n }\n } catch {\n // GitHub CLIが使えない、または認証されていない場合\n return null\n }\n}\n\n// worktreeメタデータをファイルに保存\nexport async function saveWorktreeMetadata(\n worktreePath: string,\n branchName: string,\n metadata: Partial<WorktreeMetadata>\n): Promise<void> {\n const metadataPath = path.join(worktreePath, '.maestro-metadata.json')\n const metadataContent = {\n createdAt: new Date().toISOString(),\n branch: branchName,\n worktreePath,\n ...metadata,\n }\n\n try {\n await fs.writeFile(metadataPath, JSON.stringify(metadataContent, null, 2))\n\n // worktreeの.gitignoreに.maestro-metadata.jsonを追加\n await addToGitignore(worktreePath, '.maestro-metadata.json', 'maestro metadata')\n } catch {\n // メタデータの保存に失敗しても処理は続行\n }\n}\n\n// tmuxセッションを作成してClaude Codeを起動する関数\nexport async function createTmuxSession(\n branchName: string,\n worktreePath: string,\n options?: CreateOptions\n): Promise<void> {\n await createTmuxSessionShared({\n sessionName: branchName,\n worktreePath,\n tmux: options?.tmux,\n tmuxH: options?.tmuxH,\n tmuxV: options?.tmuxV,\n tmuxHPanes: options?.tmuxHPanes,\n tmuxVPanes: options?.tmuxVPanes,\n tmuxLayout: options?.tmuxLayout,\n interactiveAttach: true,\n })\n}\n\n// Claude.mdの処理\nexport async function handleClaudeMarkdown(worktreePath: string, config: Config): Promise<void> {\n const claudeMode = config.claude?.markdownMode || 'shared'\n const rootClaudePath = path.join(process.cwd(), 'CLAUDE.md')\n const worktreeClaudePath = path.join(worktreePath, 'CLAUDE.md')\n\n try {\n if (claudeMode === 'shared') {\n // 共有モード: シンボリックリンクを作成\n if (\n await fs\n .access(rootClaudePath)\n .then(() => true)\n .catch(() => false)\n ) {\n // worktreeにコピーされたCLAUDE.mdを削除\n try {\n await fs.unlink(worktreeClaudePath)\n } catch {\n // ファイルが存在しない場合は無視\n }\n\n // シンボリックリンクを作成\n await fs.symlink(path.relative(worktreePath, rootClaudePath), worktreeClaudePath)\n console.log(chalk.green(`✨ CLAUDE.md を共有モードで設定しました`))\n }\n } else if (claudeMode === 'split') {\n // 分割モード: 専用のCLAUDE.mdを作成\n const splitContent = `# ${path.basename(worktreePath)} - Claude Code Instructions\n\nThis is a dedicated CLAUDE.md for this worktree.\n\n## Project Context\n- Branch: ${path.basename(worktreePath)}\n- Worktree Path: ${worktreePath}\n\n## Instructions\nAdd specific instructions for this worktree here.\n`\n await fs.writeFile(worktreeClaudePath, splitContent)\n console.log(chalk.green(`✨ CLAUDE.md を分割モードで作成しました`))\n }\n } catch (error) {\n console.warn(chalk.yellow(`CLAUDE.mdの処理に失敗しました: ${error}`))\n }\n}\n\n// ブランチ名の解析と処理を行う純粋関数\nexport function processBranchName(\n branchName: string,\n config: Config\n): {\n isIssue: boolean\n issueNumber: string | null\n finalBranchName: string\n} {\n const { isIssue, issueNumber, branchName: parsedBranchName } = parseIssueNumber(branchName)\n\n let finalBranchName = parsedBranchName\n\n // ブランチ名にプレフィックスを追加\n if (\n config.worktrees?.branchPrefix &&\n !finalBranchName.startsWith(config.worktrees.branchPrefix)\n ) {\n finalBranchName = config.worktrees.branchPrefix + finalBranchName\n }\n\n return { isIssue, issueNumber: issueNumber || null, finalBranchName }\n}\n\n// GitHub情報を取得して表示する純粋関数\nexport async function fetchAndDisplayGithubMetadata(\n issueNumber: string,\n initialBranchName: string\n): Promise<{ githubMetadata: GithubMetadata | null; enhancedBranchName: string }> {\n const githubMetadata = await fetchGitHubMetadata(issueNumber)\n\n if (!githubMetadata) {\n return { githubMetadata: null, enhancedBranchName: initialBranchName }\n }\n\n // タイトルからより適切なブランチ名を生成\n const sanitizedTitle = githubMetadata.title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .substring(0, 30)\n const enhancedBranchName = `${githubMetadata.type}-${issueNumber}-${sanitizedTitle}`\n\n return { githubMetadata, enhancedBranchName }\n}\n\n// メイン実行関数\nexport async function executeCreateCommand(\n branchName: string,\n options: CreateOptions & { template?: string }\n): Promise<void> {\n const manager = new GitWorktreeManager()\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n\n // Git リポジトリの確認\n if (!(await manager.isGitRepository())) {\n console.error(chalk.red('エラー: このディレクトリはGitリポジトリではありません'))\n process.exit(1)\n }\n\n // 設定の読み込み\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n\n // ブランチ名の処理\n const { isIssue, issueNumber, finalBranchName } = processBranchName(branchName, config)\n\n // GitHub情報の取得\n let githubMetadata: GithubMetadata | null = null\n let enhancedBranchName = finalBranchName\n\n if (isIssue && issueNumber) {\n const result = await fetchAndDisplayGithubMetadata(issueNumber, finalBranchName)\n githubMetadata = result.githubMetadata\n enhancedBranchName = result.enhancedBranchName\n\n if (githubMetadata) {\n console.log(\n chalk.cyan(\n `\\n📋 ${githubMetadata.type === 'pr' ? 'PR' : 'Issue'} #${issueNumber}: ${githubMetadata.title}`\n )\n )\n console.log(chalk.gray(`👤 ${githubMetadata.author}`))\n\n if (githubMetadata.labels.length > 0) {\n console.log(chalk.gray(`🏷️ ${githubMetadata.labels.join(', ')}`))\n }\n\n if (githubMetadata.assignees.length > 0) {\n console.log(chalk.gray(`👥 ${githubMetadata.assignees.join(', ')}`))\n }\n\n console.log(chalk.gray(`🔗 ${githubMetadata.url}`))\n console.log()\n }\n }\n\n // 確認プロンプト\n const shouldConfirm = await shouldPromptForConfirmation(\n options,\n enhancedBranchName,\n githubMetadata\n )\n\n if (shouldConfirm) {\n const confirmed = await confirmWorktreeCreation(enhancedBranchName, githubMetadata)\n if (!confirmed) {\n console.log(chalk.yellow('キャンセルされました'))\n return\n }\n }\n\n // tmuxオプションが指定されている場合、事前にペイン数を検証\n if (\n options.tmuxHPanes ||\n options.tmuxVPanes ||\n options.tmuxH ||\n options.tmuxV ||\n options.tmuxLayout ||\n options.tmux ||\n config.tmux?.enabled\n ) {\n try {\n validateTmuxOptions({\n sessionName: enhancedBranchName,\n worktreePath: '',\n tmux: options.tmux,\n tmuxH: options.tmuxH,\n tmuxV: options.tmuxV,\n tmuxHPanes: options.tmuxHPanes,\n tmuxVPanes: options.tmuxVPanes,\n tmuxLayout: options.tmuxLayout,\n })\n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red(`✖ ${error.message}`))\n }\n process.exit(1)\n }\n }\n\n // Worktreeの作成\n let worktreePath = ''\n\n try {\n const result = await createWorktreeWithProgress(\n manager,\n enhancedBranchName,\n options,\n config,\n githubMetadata,\n issueNumber\n )\n worktreePath = result\n } catch (error) {\n // ブランチ名衝突のエラーハンドリング\n if (error instanceof Error && error.message.includes('競合します')) {\n console.error(chalk.red(`✖ 演奏者の招集に失敗しました: ${error.message}`))\n\n // 代替案を提案\n const branches = await manager.getAllBranches()\n const allBranches = [\n ...branches.local,\n ...branches.remote.map(r => r.replace(/^[^/]+\\//, '')),\n ]\n const alternativeName = manager.generateAlternativeBranchName(enhancedBranchName, allBranches)\n\n console.log(chalk.yellow(`\\n💡 代替案: '${alternativeName}' はいかがでしょうか?`))\n console.log(chalk.gray(` 実行コマンド: mst create ${alternativeName}`))\n process.exit(1)\n }\n\n // その他のエラー\n // エラーは既に下位層で表示済みなので、ここでは何も表示せずにexit\n process.exit(1)\n }\n\n // 後処理の実行(tmuxセッション作成など)\n await executePostCreationTasks(worktreePath, enhancedBranchName, options, config)\n}\n\n// 確認プロンプトが必要かどうかを判定\nexport async function shouldPromptForConfirmation(\n options: CreateOptions & { template?: string },\n branchName: string,\n githubMetadata: GithubMetadata | null\n): Promise<boolean> {\n return !options.yes && (githubMetadata !== null || branchName.includes('issue-'))\n}\n\n// 作成確認プロンプト\nexport async function confirmWorktreeCreation(\n branchName: string,\n githubMetadata: GithubMetadata | null\n): Promise<boolean> {\n const message = githubMetadata\n ? `${githubMetadata.type === 'pr' ? 'PR' : 'Issue'} \"${githubMetadata.title}\" 用のworktreeを作成しますか?`\n : `ブランチ \"${branchName}\" 用のworktreeを作成しますか?`\n\n const { confirmed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmed',\n message,\n default: true,\n },\n ])\n\n return confirmed\n}\n\n// Worktree作成のメイン処理\nexport async function createWorktreeWithProgress(\n manager: GitWorktreeManager,\n branchName: string,\n options: CreateOptions & { template?: string },\n config: Config,\n githubMetadata: GithubMetadata | null,\n issueNumber: string | null\n): Promise<string> {\n const spinner = ora('新しい演奏者を招集中...').start()\n\n try {\n // Worktreeの作成\n const worktreePath = await manager.createWorktree(branchName, options.base)\n\n // メタデータの保存\n await saveWorktreeMetadata(worktreePath, branchName, {\n github: githubMetadata\n ? { ...githubMetadata, issueNumber: issueNumber || undefined }\n : undefined,\n })\n\n const displayPath = formatPath(worktreePath, config)\n spinner.succeed(chalk.green(`✨ 新しい演奏者を招集しました: ${displayPath}`))\n\n return worktreePath\n } catch (error) {\n // spinnerを失敗状態にするが、エラーメッセージは上位層で処理\n spinner.fail(chalk.red('演奏者の招集に失敗しました'))\n throw error\n }\n}\n\n// 作成後のタスクを実行\nexport async function executePostCreationTasks(\n worktreePath: string,\n branchName: string,\n options: CreateOptions & { template?: string },\n config: Config\n): Promise<void> {\n const parallelTasks = []\n\n // 環境セットアップ\n if (options.setup || config.development?.autoSetup) {\n parallelTasks.push(setupEnvironment(worktreePath, config))\n }\n\n // エディタで開く\n if (options.open) {\n parallelTasks.push(openInEditor(worktreePath, config))\n }\n\n // Claude.md処理\n if (options.claudeMd) {\n parallelTasks.push(handleClaudeMarkdown(worktreePath, config))\n }\n\n // 非インタラクティブなタスクを並行実行\n await Promise.allSettled(parallelTasks)\n\n // tmuxセッション作成(インタラクティブなので単独で実行)\n if (\n options.tmux ||\n options.tmuxH ||\n options.tmuxV ||\n options.tmuxHPanes ||\n options.tmuxVPanes ||\n options.tmuxLayout ||\n config.tmux?.enabled\n ) {\n await createTmuxSession(branchName, worktreePath, options)\n }\n\n // postCreate設定の処理\n if (config.postCreate) {\n // copyFilesの処理\n if (config.postCreate.copyFiles && config.postCreate.copyFiles.length > 0) {\n await copyFilesFromCurrentWorktree(worktreePath, config.postCreate.copyFiles)\n }\n\n // commandsの処理\n if (config.postCreate.commands && config.postCreate.commands.length > 0) {\n for (const command of config.postCreate.commands) {\n await executeCommandInWorktree(worktreePath, command)\n }\n }\n }\n\n // ファイルコピー処理(CLIオプション)\n if (options.copyFile && options.copyFile.length > 0) {\n await copyFilesFromCurrentWorktree(worktreePath, options.copyFile)\n }\n\n // afterCreateフックの実行(文字列または配列をサポート)\n if (config.hooks?.afterCreate) {\n const commands = Array.isArray(config.hooks.afterCreate)\n ? config.hooks.afterCreate\n : [config.hooks.afterCreate]\n\n for (const command of commands) {\n await executeCommandInWorktree(worktreePath, command)\n }\n }\n\n // シェルに入る処理\n if (options.shell) {\n await enterShell(worktreePath, branchName)\n }\n\n // コマンド実行処理\n if (options.exec) {\n await executeCommandInWorktree(worktreePath, options.exec)\n }\n}\n\n// 環境セットアップ\nexport async function setupEnvironment(worktreePath: string, config: Config): Promise<void> {\n const spinner = ora('環境をセットアップ中...').start()\n\n try {\n // 依存関係のインストール\n const packageManager = detectPackageManager(worktreePath)\n await execa(packageManager, ['install'], { cwd: worktreePath })\n\n // 設定ファイルの同期\n if (config.development?.syncFiles) {\n await syncConfigFiles(worktreePath, config.development.syncFiles)\n }\n\n spinner.succeed(chalk.green('✨ 環境セットアップが完了しました'))\n } catch (error) {\n spinner.fail(chalk.red(`環境セットアップに失敗しました: ${error}`))\n }\n}\n\n// 設定ファイルの同期\nexport async function syncConfigFiles(worktreePath: string, syncFiles: string[]): Promise<void> {\n const rootPath = process.cwd()\n\n for (const file of syncFiles) {\n const sourcePath = path.join(rootPath, file)\n const destPath = path.join(worktreePath, file)\n\n try {\n await fs.copyFile(sourcePath, destPath)\n } catch {\n // ファイルが存在しない場合は無視\n }\n }\n}\n\n// エディタで開く\nexport async function openInEditor(worktreePath: string, config: Config): Promise<void> {\n const editor = config.development?.defaultEditor || 'cursor'\n\n try {\n await execa(editor, [worktreePath], { detached: true })\n console.log(chalk.green(`✨ ${editor}で開きました`))\n } catch (error) {\n console.error(chalk.red(`エディタの起動に失敗しました: ${error}`))\n }\n}\n\n// Draft PR作成\nexport async function createDraftPR(branchName: string, worktreePath: string): Promise<void> {\n const spinner = ora('Draft PRを作成中...').start()\n\n try {\n await execa(\n 'gh',\n ['pr', 'create', '--draft', '--title', `WIP: ${branchName}`, '--body', 'Work in progress'],\n {\n cwd: worktreePath,\n }\n )\n\n spinner.succeed(chalk.green('✨ Draft PRを作成しました'))\n } catch (error) {\n spinner.fail(chalk.red(`Draft PRの作成に失敗しました: ${error}`))\n }\n}\n\n// ファイルコピー処理(gitignoreファイルも含む)\nexport async function copyFilesFromCurrentWorktree(\n worktreePath: string,\n files: string[]\n): Promise<void> {\n const spinner = ora('ファイルをコピー中...').start()\n const currentPath = process.cwd()\n let copiedCount = 0\n const gitignoreFiles: string[] = []\n\n try {\n const gitManager = new GitWorktreeManager()\n\n for (const file of files) {\n const sourcePath = path.join(currentPath, file)\n const destPath = path.join(worktreePath, file)\n\n try {\n // ファイルの存在確認\n const stats = await fs.stat(sourcePath)\n\n if (!stats.isFile()) {\n console.warn(chalk.yellow(`\\n⚠️ ${file} はファイルではありません`))\n continue\n }\n\n // gitignoreされているかチェック\n const isGitignored = await gitManager.isGitignored(file)\n\n if (isGitignored) {\n gitignoreFiles.push(file)\n }\n\n // ディレクトリが存在しない場合は作成\n const destDir = path.dirname(destPath)\n await fs.mkdir(destDir, { recursive: true })\n\n // ファイルをコピー\n await fs.copyFile(sourcePath, destPath)\n copiedCount++\n } catch (error) {\n // ファイルが存在しない場合は警告レベルを下げる\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n // .envなど任意のファイルの場合はスキップを通知\n console.log(chalk.gray(` ${file} は見つからないためコピーをスキップしました`))\n } else {\n // それ以外のエラーは警告として表示\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.warn(\n chalk.yellow(`\\n⚠️ ファイル ${file} のコピーに失敗しました: ${errorMessage}`)\n )\n }\n }\n }\n\n if (copiedCount > 0) {\n spinner.succeed(chalk.green(`✨ ${copiedCount}個のファイルをコピーしました`))\n\n if (gitignoreFiles.length > 0) {\n console.log(chalk.blue(` gitignoreファイル: ${gitignoreFiles.join(', ')}`))\n }\n } else {\n // ファイルが見つからなかった場合は情報として表示\n spinner.info(chalk.gray('同期対象のファイルが見つかりませんでした'))\n }\n } catch (error) {\n spinner.fail(chalk.red(`ファイルコピーに失敗しました: ${error}`))\n }\n}\n\n// シェルに入る処理\nexport async function enterShell(worktreePath: string, branchName: string): Promise<void> {\n console.log(chalk.cyan(`\\n🎼 演奏者 '${branchName}' のシェルに入ります...`))\n\n // 環境変数を設定\n const env = {\n ...process.env,\n MAESTRO: '1',\n MAESTRO_NAME: branchName,\n MAESTRO_PATH: worktreePath,\n }\n\n // シェルを起動\n const shell = process.env.SHELL || '/bin/bash'\n const shellProcess = spawn(shell, [], {\n cwd: worktreePath,\n stdio: 'inherit',\n env,\n })\n\n // プロセスの終了を待つ\n return new Promise(resolve => {\n shellProcess.on('exit', () => {\n console.log(chalk.gray('\\n🎼 シェルを終了しました'))\n resolve()\n })\n })\n}\n\nexport const createCommand = new Command('create')\n .description('新しい演奏者(worktree)を招集する')\n .argument('<branch-name>', 'ブランチ名または Issue# (例: 123, #123, issue-123)')\n .option('-b, --base <branch>', 'ベースブランチ (デフォルト: 現在のブランチ)')\n .option('-o, --open', 'VSCode/Cursorで開く')\n .option('-s, --setup', '環境セットアップを実行')\n .option('-t, --tmux', 'tmuxセッションを作成してClaude Codeを起動')\n .option('--tmux-h', 'tmuxペインを水平分割して作成')\n .option('--tmux-v', 'tmuxペインを垂直分割して作成')\n .option('--tmux-h-panes <number>', 'tmuxペインを指定数で水平分割', parseInt)\n .option('--tmux-v-panes <number>', 'tmuxペインを指定数で垂直分割', parseInt)\n .option(\n '--tmux-layout <type>',\n 'tmuxレイアウトタイプ (even-horizontal, even-vertical, main-horizontal, main-vertical, tiled)'\n )\n .option('-c, --claude-md', 'CLAUDE.mdファイルを管理')\n .option('-y, --yes', '確認をスキップ')\n .option('--shell', '作成後にシェルに入る')\n .option('--exec <command>', '作成後にコマンドを実行')\n .option(\n '--copy-file <file>',\n '現在のworktreeからファイルをコピー(複数回使用可)',\n (value, previous: string[] = []) => [...previous, value]\n )\n .exitOverride()\n .action(async (branchName: string, options: CreateOptions & { template?: string }) => {\n await executeCreateCommand(branchName, options)\n })\n\n// worktree内でコマンドを実行\nexport async function executeCommandInWorktree(\n worktreePath: string,\n command: string\n): Promise<void> {\n console.log(chalk.cyan(`\\n🎵 コマンドを実行中: ${command}`))\n\n try {\n await execa(command, [], {\n cwd: worktreePath,\n shell: true,\n stdio: 'inherit',\n })\n console.log(chalk.green('✨ コマンドが正常に実行されました'))\n } catch (error) {\n console.error(\n chalk.red(\n `コマンドの実行に失敗しました: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n throw error\n }\n}\n","import simpleGit, { SimpleGit } from 'simple-git'\nimport { Worktree } from '../types/index.js'\nimport { ConfigManager } from './config.js'\nimport path from 'path'\nimport fs from 'fs/promises'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\n\nexport class GitWorktreeManager {\n private git: SimpleGit\n private configManager: ConfigManager\n\n constructor(baseDir?: string) {\n this.git = simpleGit(baseDir || process.cwd())\n this.configManager = new ConfigManager()\n }\n\n async createWorktree(\n branchName: string,\n baseBranch?: string,\n skipDirCheck?: boolean\n ): Promise<string> {\n // ブランチ名の衝突をチェック\n await this.checkBranchNameCollision(branchName)\n\n // 設定を読み込み\n await this.configManager.loadProjectConfig()\n const worktreeConfig = this.configManager.get('worktrees')\n const directoryPrefix = worktreeConfig?.directoryPrefix || ''\n\n // リポジトリルートを取得して絶対パスを生成\n const repoRoot = await this.getRepositoryRoot()\n const worktreePath = path.join(repoRoot, '..', `${directoryPrefix}${branchName}`)\n\n // ディレクトリの存在をチェック(スキップオプションが false の場合のみ)\n if (!skipDirCheck) {\n const dirExists = await this.checkDirectoryExists(worktreePath)\n if (dirExists) {\n const action = await this.handleExistingDirectory(worktreePath, branchName)\n\n if (action === 'cancel') {\n throw new Error('ワークツリーの作成がキャンセルされました')\n } else if (action === 'rename') {\n // 別名を生成して再帰的に呼び出し\n const branches = await this.getAllBranches()\n const allBranches = [\n ...branches.local,\n ...branches.remote.map(r => r.replace(/^[^/]+\\//, '')),\n ]\n const alternativeName = this.generateAlternativeBranchName(branchName, allBranches)\n console.log(chalk.yellow(`\\n新しいブランチ名: ${alternativeName}`))\n return this.createWorktree(alternativeName, baseBranch, true)\n } else if (action === 'delete') {\n // ディレクトリを削除\n await fs.rm(worktreePath, { recursive: true, force: true })\n console.log(\n chalk.gray(`🗑️ 既存ディレクトリを削除しました: ${path.basename(worktreePath)}`)\n )\n }\n }\n }\n\n // ベースブランチが指定されていない場合は現在のブランチを使用\n if (!baseBranch) {\n const status = await this.git.status()\n baseBranch = status.current || 'main'\n }\n\n // ワークツリーを作成\n await this.git.raw(['worktree', 'add', '-b', branchName, worktreePath, baseBranch])\n\n return path.resolve(worktreePath)\n }\n\n async attachWorktree(existingBranch: string, skipDirCheck?: boolean): Promise<string> {\n // 設定を読み込み\n await this.configManager.loadProjectConfig()\n const worktreeConfig = this.configManager.get('worktrees')\n const directoryPrefix = worktreeConfig?.directoryPrefix || ''\n\n // リポジトリルートを取得して絶対パスを生成\n const repoRoot = await this.getRepositoryRoot()\n // ワークツリーのパスを生成(ブランチ名からスラッシュを置換)\n const safeBranchName = existingBranch.replace(/\\//g, '-')\n const worktreePath = path.join(repoRoot, '..', `${directoryPrefix}${safeBranchName}`)\n\n // ディレクトリの存在をチェック(スキップオプションが false の場合のみ)\n if (!skipDirCheck) {\n const dirExists = await this.checkDirectoryExists(worktreePath)\n if (dirExists) {\n const action = await this.handleExistingDirectory(worktreePath, safeBranchName)\n\n if (action === 'cancel') {\n throw new Error('ワークツリーの作成がキャンセルされました')\n } else if (action === 'rename') {\n // 別名を生成して再帰的に呼び出し\n const branches = await this.getAllBranches()\n const allBranches = [\n ...branches.local,\n ...branches.remote.map(r => r.replace(/^[^/]+\\//, '')),\n ]\n const alternativeName = this.generateAlternativeBranchName(safeBranchName, allBranches)\n const newWorktreePath = path.join(repoRoot, '..', `${directoryPrefix}${alternativeName}`)\n console.log(chalk.yellow(`\\n新しいディレクトリ名: ${alternativeName}`))\n\n // 別名のディレクトリでワークツリーを作成\n await this.git.raw(['worktree', 'add', newWorktreePath, existingBranch])\n return path.resolve(newWorktreePath)\n } else if (action === 'delete') {\n // ディレクトリを削除\n await fs.rm(worktreePath, { recursive: true, force: true })\n console.log(\n chalk.gray(`🗑️ 既存ディレクトリを削除しました: ${path.basename(worktreePath)}`)\n )\n }\n }\n }\n\n // 既存のブランチでワークツリーを作成\n await this.git.raw(['worktree', 'add', worktreePath, existingBranch])\n\n return path.resolve(worktreePath)\n }\n\n async listWorktrees(): Promise<Worktree[]> {\n const output = await this.git.raw(['worktree', 'list', '--porcelain'])\n const worktrees: Worktree[] = []\n\n const lines = output.split('\\n').filter(line => line.trim())\n let currentWorktree: Partial<Worktree> = {}\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n if (currentWorktree.path) {\n worktrees.push(currentWorktree as Worktree)\n }\n currentWorktree = {\n path: line.substring(9),\n detached: false,\n prunable: false,\n locked: false,\n }\n } else if (line.startsWith('HEAD ')) {\n currentWorktree.head = line.substring(5)\n } else if (line.startsWith('branch ')) {\n currentWorktree.branch = line.substring(7)\n } else if (line === 'detached') {\n currentWorktree.detached = true\n } else if (line === 'prunable') {\n currentWorktree.prunable = true\n } else if (line.startsWith('locked')) {\n currentWorktree.locked = true\n if (line.includes(' ')) {\n currentWorktree.reason = line.substring(line.indexOf(' ') + 1)\n }\n }\n }\n\n if (currentWorktree.path) {\n worktrees.push(currentWorktree as Worktree)\n }\n\n return worktrees\n }\n\n async deleteWorktree(branchName: string, force: boolean = false): Promise<void> {\n const worktrees = await this.listWorktrees()\n const worktree = worktrees.find(wt => {\n // refs/heads/プレフィックスを除去して比較\n const branch = wt.branch?.replace('refs/heads/', '')\n return branch === branchName\n })\n\n if (!worktree) {\n throw new Error(`ワークツリー '${branchName}' が見つかりません`)\n }\n\n // ワークツリーを削除\n const args = ['worktree', 'remove']\n if (force) args.push('--force')\n args.push(worktree.path)\n\n await this.git.raw(args)\n\n // Cleanup empty directories\n await this.cleanupEmptyDirectories(worktree.path)\n\n // Delete local branch as well\n try {\n await this.git.branch(['-d', branchName])\n } catch (error) {\n // If -d fails, try force delete with -D\n if (error instanceof Error && error.message.includes('not fully merged')) {\n await this.git.branch(['-D', branchName])\n } else {\n throw error\n }\n }\n }\n\n async getCurrentBranch(): Promise<string | null> {\n const status = await this.git.status()\n return status.current\n }\n\n async isGitRepository(): Promise<boolean> {\n try {\n await this.git.status()\n return true\n } catch {\n return false\n }\n }\n\n async getAllBranches(): Promise<{ local: string[]; remote: string[] }> {\n const localBranches = await this.git.branchLocal()\n const remoteBranches = await this.git.branch(['-r'])\n\n return {\n local: localBranches.all.filter(b => !b.startsWith('remotes/')),\n remote: remoteBranches.all\n .filter(b => b.startsWith('remotes/'))\n .map(b => b.replace('remotes/', '')),\n }\n }\n\n async listLocalBranches(): Promise<string[]> {\n const localBranches = await this.git.branchLocal()\n return localBranches.all.filter(b => !b.startsWith('remotes/'))\n }\n\n async fetchAll(): Promise<void> {\n await this.git.fetch(['--all'])\n }\n\n async getLastCommit(\n worktreePath: string\n ): Promise<{ date: string; message: string; hash: string } | null> {\n try {\n const gitInWorktree = simpleGit(worktreePath)\n const log = await gitInWorktree.log({ maxCount: 1 })\n\n if (log.latest) {\n return {\n date: log.latest.date,\n message: log.latest.message,\n hash: log.latest.hash.substring(0, 7),\n }\n }\n return null\n } catch {\n return null\n }\n }\n\n async getRepositoryRoot(): Promise<string> {\n try {\n const output = await this.git.raw(['rev-parse', '--show-toplevel'])\n return output.trim()\n } catch {\n throw new Error('リポジトリルートの取得に失敗しました')\n }\n }\n\n async isGitignored(filePath: string): Promise<boolean> {\n try {\n // git check-ignore returns 0 if the file is ignored\n await this.git.raw(['check-ignore', filePath])\n return true\n } catch {\n // Non-zero exit code means the file is not ignored\n return false\n }\n }\n\n async checkBranchNameCollision(branchName: string): Promise<void> {\n const branches = await this.getAllBranches()\n const allBranches = [...branches.local, ...branches.remote.map(r => r.replace(/^[^/]+\\//, ''))]\n\n // 完全一致のチェック\n if (allBranches.includes(branchName)) {\n throw new Error(`ブランチ '${branchName}' は既に存在します`)\n }\n\n // プレフィックス衝突のチェック(新しいブランチが既存ブランチのプレフィックスになる場合)\n const conflictingBranches = allBranches.filter(existing =>\n existing.startsWith(branchName + '/')\n )\n\n if (conflictingBranches.length > 0) {\n const examples = conflictingBranches.slice(0, 3).join(', ')\n throw new Error(\n `ブランチ '${branchName}' を作成できません。以下の既存ブランチと競合します: ${examples}${\n conflictingBranches.length > 3 ? ` など (${conflictingBranches.length}件)` : ''\n }`\n )\n }\n\n // 逆方向の衝突チェック(既存ブランチが新しいブランチのプレフィックスになる場合)\n const parentConflicts = allBranches.filter(existing => branchName.startsWith(existing + '/'))\n\n if (parentConflicts.length > 0) {\n const examples = parentConflicts.slice(0, 3).join(', ')\n throw new Error(\n `ブランチ '${branchName}' を作成できません。以下の既存ブランチのサブブランチになります: ${examples}${\n parentConflicts.length > 3 ? ` など (${parentConflicts.length}件)` : ''\n }`\n )\n }\n }\n\n generateAlternativeBranchName(originalName: string, allBranches: string[]): string {\n let counter = 1\n let alternativeName = `${originalName}-${counter}`\n\n while (\n allBranches.includes(alternativeName) ||\n allBranches.some(\n b => b.startsWith(alternativeName + '/') || alternativeName.startsWith(b + '/')\n )\n ) {\n counter++\n alternativeName = `${originalName}-${counter}`\n }\n\n return alternativeName\n }\n\n private async cleanupEmptyDirectories(worktreePath: string): Promise<void> {\n const repoRoot = await this.getRepositoryRoot()\n const baseDir = path.join(repoRoot, '..')\n let currentDir = path.dirname(worktreePath)\n\n // Recursively remove empty directories up to base directory\n while (currentDir !== baseDir && currentDir !== path.dirname(currentDir)) {\n try {\n const entries = await fs.readdir(currentDir)\n if (entries.length === 0) {\n await fs.rmdir(currentDir)\n console.log(chalk.gray(`🧹 Removed empty directory: ${path.basename(currentDir)}`))\n currentDir = path.dirname(currentDir)\n } else {\n break // Stop if directory is not empty\n }\n } catch {\n break // Stop on error\n }\n }\n }\n\n private async checkDirectoryExists(dirPath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(dirPath)\n return stats.isDirectory()\n } catch {\n return false\n }\n }\n\n private async handleExistingDirectory(\n dirPath: string,\n branchName: string\n ): Promise<'delete' | 'rename' | 'cancel'> {\n const repoRoot = await this.getRepositoryRoot()\n const relativePath = path.relative(repoRoot, dirPath)\n console.log(chalk.yellow(`\\n⚠️ ディレクトリ '${relativePath}' は既に存在します`))\n\n const choices = [\n { name: '既存ディレクトリを削除して新規作成', value: 'delete' },\n { name: `別の名前を使用(${branchName}-2など)`, value: 'rename' },\n { name: 'キャンセル', value: 'cancel' },\n ]\n\n const answer = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'どのように処理しますか?',\n choices,\n },\n ])\n\n return answer.action\n }\n}\n","import { z } from 'zod'\nimport Conf from 'conf'\nimport path from 'path'\nimport fs from 'fs/promises'\n\n// 設定ファイルのスキーマ定義\nexport const ConfigSchema = z.object({\n // Git worktree設定\n worktrees: z\n .object({\n // worktreeを作成するディレクトリ(デフォルト: .git/orchestrations)\n path: z.string().optional(),\n // ブランチ名のプレフィックス\n branchPrefix: z.string().optional(),\n // ディレクトリ名のプレフィックス(デフォルト: 空文字列)\n directoryPrefix: z.string().optional(),\n })\n .optional(),\n\n // 開発環境設定\n development: z\n .object({\n // 自動でnpm installを実行\n autoSetup: z.boolean().default(true),\n // 同期するファイル(.envなど)\n syncFiles: z.array(z.string()).default(['.env', '.env.local']),\n // デフォルトのエディタ\n defaultEditor: z.enum(['vscode', 'cursor', 'none']).default('cursor'),\n })\n .optional(),\n\n // tmux統合設定\n tmux: z\n .object({\n enabled: z.boolean().default(false),\n // 新規ウィンドウかペインか\n openIn: z.enum(['window', 'pane']).default('window'),\n // セッション名の命名規則\n sessionNaming: z.string().default('{branch}'),\n })\n .optional(),\n\n // Claude Code統合設定\n claude: z\n .object({\n // CLAUDE.mdの処理方法\n markdownMode: z.enum(['shared', 'split']).default('shared'),\n })\n .optional(),\n\n // GitHub統合設定\n github: z\n .object({\n // 自動でfetchを実行\n autoFetch: z.boolean().default(true),\n // ブランチ命名規則\n branchNaming: z\n .object({\n // PR用のテンプレート (例: \"pr-{number}-{title}\")\n prTemplate: z.string().default('pr-{number}'),\n // Issue用のテンプレート (例: \"issue-{number}-{title}\")\n issueTemplate: z.string().default('issue-{number}'),\n })\n .optional(),\n })\n .optional(),\n\n // UI表示設定\n ui: z\n .object({\n // パス表示形式 ('absolute' | 'relative')\n pathDisplay: z.enum(['absolute', 'relative']).default('absolute'),\n })\n .optional(),\n\n // カスタムコマンドとファイルコピー設定\n hooks: z\n .object({\n // worktree作成後に実行(文字列または配列)\n afterCreate: z.union([z.string(), z.array(z.string())]).optional(),\n // worktree削除前に実行\n beforeDelete: z.string().optional(),\n })\n .optional(),\n\n // worktree作成時の処理\n postCreate: z\n .object({\n // コピーするファイル(gitignoreファイルも含む)\n copyFiles: z.array(z.string()).optional(),\n // 実行するコマンド\n commands: z.array(z.string()).optional(),\n })\n .optional(),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\n\n// デフォルト設定\nconst DEFAULT_CONFIG: Config = {\n worktrees: {\n path: '../maestro-{branch}',\n directoryPrefix: '',\n },\n development: {\n autoSetup: true,\n syncFiles: ['.env', '.env.local'],\n defaultEditor: 'cursor',\n },\n tmux: {\n enabled: false,\n openIn: 'window',\n sessionNaming: '{branch}',\n },\n claude: {\n markdownMode: 'shared',\n },\n github: {\n autoFetch: true,\n },\n ui: {\n pathDisplay: 'absolute',\n },\n hooks: {},\n}\n\nexport class ConfigManager {\n private conf: Conf<Config>\n private projectConfig: Config | null = null\n private userConfig: Config | null = null\n\n constructor() {\n // グローバル設定(ユーザーホーム)\n this.conf = new Conf<Config>({\n projectName: 'maestro',\n defaults: DEFAULT_CONFIG,\n })\n }\n\n async loadProjectConfig(): Promise<void> {\n try {\n // ユーザー設定ファイル(.maestro.local.json)を先に読み込む\n await this.loadUserConfig()\n\n // プロジェクトルートの設定ファイルを探す\n const configPaths = [\n path.join(process.cwd(), '.maestro.json'),\n path.join(process.cwd(), '.maestrorc.json'),\n path.join(process.cwd(), 'maestro.config.json'),\n // グローバル設定ファイル\n path.join(process.env.HOME || '~', '.maestrorc'),\n path.join(process.env.HOME || '~', '.maestrorc.json'),\n ]\n\n for (const configPath of configPaths) {\n try {\n const configData = await fs.readFile(configPath, 'utf-8')\n const parsedConfig = JSON.parse(configData)\n this.projectConfig = ConfigSchema.parse(parsedConfig)\n return\n } catch {\n // ファイルが存在しない場合は次を試す\n }\n }\n } catch (error) {\n console.error('プロジェクト設定の読み込みに失敗しました:', error)\n }\n }\n\n async loadUserConfig(): Promise<void> {\n try {\n const userConfigPath = path.join(process.cwd(), '.maestro.local.json')\n const configData = await fs.readFile(userConfigPath, 'utf-8')\n const parsedConfig = JSON.parse(configData)\n this.userConfig = ConfigSchema.parse(parsedConfig)\n } catch {\n // ユーザー設定ファイルが存在しない場合は無視\n this.userConfig = null\n }\n }\n\n // 設定を取得(ユーザー設定 > プロジェクト設定 > グローバル設定 > デフォルト)\n get<K extends keyof Config>(key: K): Config[K] {\n if (this.userConfig && this.userConfig[key] !== undefined) {\n return this.userConfig[key]\n }\n if (this.projectConfig && this.projectConfig[key] !== undefined) {\n return this.projectConfig[key]\n }\n return this.conf.get(key) ?? DEFAULT_CONFIG[key]\n }\n\n // 設定を更新(グローバル設定のみ)\n set<K extends keyof Config>(key: K, value: Config[K]): void {\n this.conf.set(key, value)\n }\n\n // 全設定を取得\n getAll(): Config {\n const globalConfig = this.conf.store\n return {\n ...DEFAULT_CONFIG,\n ...globalConfig,\n ...(this.projectConfig || {}),\n ...(this.userConfig || {}),\n }\n }\n\n // 設定ファイルのパスを取得\n getConfigPath(): string {\n return this.conf.path\n }\n\n // ドット記法で設定値を取得\n getConfigValue(keyPath: string): unknown {\n const keys = keyPath.split('.')\n const config = this.getAll()\n\n return keys.reduce((obj: unknown, key: string) => {\n if (obj && typeof obj === 'object' && key in obj) {\n return (obj as Record<string, unknown>)[key]\n }\n return undefined\n }, config as unknown)\n }\n\n // ドット記法で設定値を設定\n async setConfigValue(\n keyPath: string,\n value: unknown,\n target: 'user' | 'project' = 'project'\n ): Promise<void> {\n if (target === 'user') {\n await this.setUserConfigValue(keyPath, value)\n } else {\n await this.setProjectConfigValue(keyPath, value)\n }\n }\n\n // ユーザー設定を設定\n async setUserConfigValue(keyPath: string, value: unknown): Promise<void> {\n const configPath = path.join(process.cwd(), '.maestro.local.json')\n\n // 既存のユーザー設定を読み込む\n let userConfig: Record<string, unknown> = {}\n try {\n const configData = await fs.readFile(configPath, 'utf-8')\n userConfig = JSON.parse(configData)\n } catch {\n // ファイルが存在しない場合は空のオブジェクトから開始\n }\n\n // ドット記法でネストしたオブジェクトを作成\n const keys = keyPath.split('.')\n let current = userConfig\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (!key) continue\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n\n // 値の型変換\n const lastKey = keys[keys.length - 1]\n if (lastKey) {\n current[lastKey] = this.parseValue(value)\n }\n\n // バリデーション\n const validatedConfig = ConfigSchema.parse(userConfig)\n\n // ファイルに保存\n await fs.writeFile(configPath, JSON.stringify(validatedConfig, null, 2) + '\\n', 'utf-8')\n\n // メモリ上の設定も更新\n this.userConfig = validatedConfig\n }\n\n // プロジェクト設定を設定\n async setProjectConfigValue(keyPath: string, value: unknown): Promise<void> {\n const configPath = path.join(process.cwd(), '.maestro.json')\n\n // 既存のプロジェクト設定を読み込む\n let projectConfig: Record<string, unknown> = {}\n try {\n const configData = await fs.readFile(configPath, 'utf-8')\n projectConfig = JSON.parse(configData)\n } catch {\n // ファイルが存在しない場合は空のオブジェクトから開始\n }\n\n // ドット記法でネストしたオブジェクトを作成\n const keys = keyPath.split('.')\n let current = projectConfig\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (!key) continue\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n\n // 値の型変換\n const lastKey = keys[keys.length - 1]\n if (lastKey) {\n current[lastKey] = this.parseValue(value)\n }\n\n // バリデーション\n const validatedConfig = ConfigSchema.parse(projectConfig)\n\n // ファイルに保存\n await fs.writeFile(configPath, JSON.stringify(validatedConfig, null, 2) + '\\n', 'utf-8')\n\n // メモリ上の設定も更新\n this.projectConfig = validatedConfig\n }\n\n // 設定値をリセット(デフォルトに戻す)\n async resetConfigValue(keyPath: string): Promise<void> {\n const configPath = path.join(process.cwd(), '.maestro.json')\n\n // 既存のプロジェクト設定を読み込む\n let projectConfig: Record<string, unknown> = {}\n try {\n const configData = await fs.readFile(configPath, 'utf-8')\n projectConfig = JSON.parse(configData)\n } catch {\n // ファイルが存在しない場合は何もしない\n return\n }\n\n // ドット記法でキーを削除\n const keys = keyPath.split('.')\n let current = projectConfig\n const parents: Array<{ obj: Record<string, unknown>; key: string }> = []\n\n // パスをたどって削除対象を見つける\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (!key || !current[key]) {\n return // キーが存在しない場合は何もしない\n }\n parents.push({ obj: current, key })\n current = current[key] as Record<string, unknown>\n }\n\n const lastKey = keys[keys.length - 1]\n if (lastKey && current[lastKey] !== undefined) {\n delete current[lastKey]\n }\n\n // 空のオブジェクトを削除\n this.cleanEmptyObjects(projectConfig, keyPath.split('.').slice(0, -1))\n\n // ファイルに保存\n await fs.writeFile(configPath, JSON.stringify(projectConfig, null, 2) + '\\n', 'utf-8')\n\n // メモリ上の設定も更新\n this.projectConfig = Object.keys(projectConfig).length > 0 ? projectConfig : null\n }\n\n // 値の型変換\n private parseValue(value: unknown): unknown {\n if (typeof value === 'string') {\n // boolean値の変換\n if (value === 'true') return true\n if (value === 'false') return false\n\n // 数値の変換\n if (/^\\d+$/.test(value)) return parseInt(value, 10)\n if (/^\\d+\\.\\d+$/.test(value)) return parseFloat(value)\n }\n\n return value\n }\n\n // 空のオブジェクトを削除\n private cleanEmptyObjects(obj: Record<string, unknown>, keys: string[]): void {\n if (keys.length === 0) return\n\n let current = obj\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (!key || !current[key]) return\n current = current[key] as Record<string, unknown>\n }\n\n const lastKey = keys[keys.length - 1]\n if (\n lastKey &&\n current[lastKey] &&\n typeof current[lastKey] === 'object' &&\n Object.keys(current[lastKey] as Record<string, unknown>).length === 0\n ) {\n delete current[lastKey]\n // 再帰的にチェック\n this.cleanEmptyObjects(obj, keys.slice(0, -1))\n }\n }\n\n // プロジェクト設定ファイルの作成\n async createProjectConfig(configPath?: string): Promise<void> {\n const targetPath = configPath || path.join(process.cwd(), '.maestro.json')\n const exampleConfig: Partial<Config> = {\n worktrees: {\n path: '../maestro-{branch}',\n branchPrefix: 'feature/',\n directoryPrefix: 'maestro-',\n },\n development: {\n autoSetup: true,\n syncFiles: ['.env', '.env.local'],\n defaultEditor: 'cursor',\n },\n tmux: {\n enabled: true,\n openIn: 'window',\n sessionNaming: '{branch}',\n },\n claude: {\n markdownMode: 'shared',\n },\n github: {\n autoFetch: true,\n branchNaming: {\n prTemplate: 'pr-{number}',\n issueTemplate: 'issue-{number}',\n },\n },\n ui: {\n pathDisplay: 'absolute',\n },\n hooks: {\n afterCreate: 'npm install',\n beforeDelete: 'echo \"オーケストラメンバーを解散します: $MAESTRO_BRANCH\"',\n },\n postCreate: {\n copyFiles: ['.env', '.env.local'],\n commands: ['pnpm install', 'pnpm run dev'],\n },\n }\n\n await fs.writeFile(targetPath, JSON.stringify(exampleConfig, null, 2) + '\\n', 'utf-8')\n }\n}\n","import { execa } from 'execa'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport { setupTmuxStatusLine } from './tmux.js'\nimport { attachToTmuxWithProperTTY, switchTmuxClientWithProperTTY } from './tty.js'\n\n// tmuxセッション管理のための共通インターフェース\nexport interface TmuxSessionOptions {\n // セッション名(ブランチ名)\n sessionName: string\n // 作業ディレクトリ\n worktreePath: string\n // tmuxオプション\n tmux?: boolean\n tmuxH?: boolean\n tmuxV?: boolean\n tmuxHPanes?: number\n tmuxVPanes?: number\n tmuxLayout?: 'even-horizontal' | 'even-vertical' | 'main-horizontal' | 'main-vertical' | 'tiled'\n // インタラクティブなアタッチプロンプトを表示するか\n interactiveAttach?: boolean\n}\n\n// ペイン設定用のヘルパー関数\nexport function getPaneConfiguration(\n options?: Pick<TmuxSessionOptions, 'tmuxH' | 'tmuxV' | 'tmuxHPanes' | 'tmuxVPanes'>\n) {\n const paneCount = options?.tmuxHPanes || options?.tmuxVPanes || 2\n const isHorizontal = Boolean(options?.tmuxH || options?.tmuxHPanes)\n return { paneCount, isHorizontal }\n}\n\n// ペイン数が妥当かどうかを事前検証する関数\nexport function validatePaneCount(paneCount: number, isHorizontal: boolean): void {\n // 簡易的な画面サイズ検証(より厳密にはtmuxの実際の画面サイズを取得すべき)\n const maxReasonablePanes = isHorizontal ? 10 : 15 // 水平分割の方が制限が厳しい\n\n if (paneCount > maxReasonablePanes) {\n const splitType = isHorizontal ? '水平' : '垂直'\n throw new Error(\n `画面サイズに対してペイン数(${paneCount}個)が多すぎるため、セッションが作成できませんでした。ターミナルウィンドウを大きくするか、ペイン数を減らしてください。(${splitType}分割)`\n )\n }\n}\n\n// メッセージ生成用のヘルパー関数\nexport function generateTmuxMessage(\n options?: Pick<TmuxSessionOptions, 'tmuxHPanes' | 'tmuxVPanes' | 'tmuxH' | 'tmuxLayout'>\n) {\n const paneCountMsg =\n options?.tmuxHPanes || options?.tmuxVPanes\n ? `${options.tmuxHPanes || options.tmuxVPanes}つのペインに`\n : ''\n const splitTypeMsg = options?.tmuxH || options?.tmuxHPanes ? '水平' : '垂直'\n const layoutMsg = options?.tmuxLayout ? ` (${options.tmuxLayout}レイアウト)` : ''\n\n return { paneCountMsg, splitTypeMsg, layoutMsg }\n}\n\n// 複数ペインを作成する関数\nasync function createMultiplePanes(\n sessionName: string | null,\n worktreePath: string,\n paneCount: number,\n isHorizontal: boolean\n): Promise<void> {\n for (let i = 1; i < paneCount; i++) {\n const splitArgs = sessionName ? ['split-window', '-t', sessionName] : ['split-window']\n\n if (isHorizontal) {\n splitArgs.push('-h') // 水平分割(左右)\n } else {\n splitArgs.push('-v') // 垂直分割(上下)\n }\n\n splitArgs.push('-c', worktreePath)\n const shell = process.env.SHELL || '/bin/bash'\n splitArgs.push(shell, '-l')\n\n try {\n await execa('tmux', splitArgs)\n } catch (error) {\n // tmuxエラーを解析してユーザーフレンドリーなメッセージを表示\n if (error instanceof Error && error.message.includes('no space for new pane')) {\n const splitType = isHorizontal ? '水平' : '垂直'\n throw new Error(\n `画面サイズに対してペイン数(${paneCount}個)が多すぎます。ターミナルウィンドウを大きくするか、ペイン数を減らしてください。(${splitType}分割)`\n )\n }\n\n // その他のtmuxエラーの汎用的な処理\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new Error(`tmuxペインの作成に失敗しました: ${errorMessage}`)\n }\n }\n}\n\n// レイアウトを適用する関数\nasync function applyTmuxLayout(\n sessionName: string | null,\n options?: Pick<TmuxSessionOptions, 'tmuxLayout'>,\n paneCount?: number,\n isHorizontal?: boolean\n): Promise<void> {\n if (options?.tmuxLayout) {\n const layoutArgs = sessionName\n ? ['select-layout', '-t', sessionName, options.tmuxLayout]\n : ['select-layout', options.tmuxLayout]\n await execa('tmux', layoutArgs)\n } else if (paneCount && paneCount > 2) {\n const defaultLayout = isHorizontal ? 'even-horizontal' : 'even-vertical'\n const layoutArgs = sessionName\n ? ['select-layout', '-t', sessionName, defaultLayout]\n : ['select-layout', defaultLayout]\n await execa('tmux', layoutArgs)\n }\n}\n\n// 全ペインにタイトルを設定する関数\nasync function setTitleForAllPanes(\n sessionName: string | null,\n branchName: string,\n paneCount: number\n): Promise<void> {\n for (let i = 0; i < paneCount; i++) {\n try {\n // 各ペインに直接タイトルを設定\n const titleArgs = sessionName\n ? ['select-pane', '-t', `${sessionName}:0.${i}`, '-T', branchName]\n : ['select-pane', '-t', `${i}`, '-T', branchName]\n await execa('tmux', titleArgs)\n } catch {\n // ペインが存在しない場合はスキップ\n }\n }\n}\n\n// tmuxセッションをアタッチする関数(TTY問題を解決)\nexport function attachToTmuxSession(sessionName: string): Promise<void> {\n return attachToTmuxWithProperTTY(sessionName)\n}\n\n// tmuxクライアントをスイッチする関数(TTY問題を解決)\nexport function switchTmuxClient(sessionName: string): Promise<void> {\n return switchTmuxClientWithProperTTY(sessionName)\n}\n\n// 新しいセッションでペイン分割を処理する関数\nasync function handleNewSessionPaneSplit(\n sessionName: string,\n branchName: string,\n worktreePath: string,\n options?: TmuxSessionOptions\n): Promise<void> {\n const { paneCount, isHorizontal } = getPaneConfiguration(options)\n\n // tmuxセッションを作成(detached mode)\n const shell = process.env.SHELL || '/bin/bash'\n await execa('tmux', ['new-session', '-d', '-s', sessionName, '-c', worktreePath, shell, '-l'])\n\n // 複数ペインを作成\n await createMultiplePanes(sessionName, worktreePath, paneCount, isHorizontal)\n\n // レイアウトを適用\n await applyTmuxLayout(sessionName, options, paneCount, isHorizontal)\n\n // 全ペインにタイトルを設定\n await setTitleForAllPanes(sessionName, branchName, paneCount)\n\n // 最初のペイン(左上)にフォーカスを移動\n await execa('tmux', ['select-pane', '-t', `${sessionName}:0.0`])\n await execa('tmux', ['rename-window', '-t', sessionName, branchName])\n await setupTmuxStatusLine()\n}\n\n// 既存セッション内でペイン分割を処理する関数\nasync function handleInsideTmuxPaneSplit(\n branchName: string,\n worktreePath: string,\n options?: TmuxSessionOptions\n): Promise<void> {\n const { paneCount, isHorizontal } = getPaneConfiguration(options)\n\n // 複数ペインを作成\n await createMultiplePanes(null, worktreePath, paneCount, isHorizontal)\n\n // レイアウトを適用\n await applyTmuxLayout(null, options, paneCount, isHorizontal)\n\n // 全ペインにタイトルを設定\n await setTitleForAllPanes(null, branchName, paneCount)\n\n // 最初のペイン(左上)にフォーカスを移動\n await execa('tmux', ['select-pane', '-t', '0'])\n await setupTmuxStatusLine()\n}\n\n// tmuxセッションを作成してClaude Codeを起動する関数(共通化)\nexport async function createTmuxSession(options: TmuxSessionOptions): Promise<void> {\n const { sessionName: branchName, worktreePath, interactiveAttach = true } = options\n const sessionName = branchName.replace(/[^a-zA-Z0-9_-]/g, '-')\n\n try {\n // ペイン分割オプションの場合\n if (\n options.tmuxH ||\n options.tmuxV ||\n options.tmuxHPanes ||\n options.tmuxVPanes ||\n options.tmuxLayout\n ) {\n const isInsideTmux = process.env.TMUX !== undefined\n\n if (!isInsideTmux) {\n // 既存セッションチェック\n try {\n await execa('tmux', ['has-session', '-t', sessionName])\n console.log(chalk.yellow(`tmuxセッション '${sessionName}' は既に存在します`))\n await attachToTmuxSession(sessionName)\n return\n } catch {\n // セッションが存在しない場合は作成\n }\n\n await handleNewSessionPaneSplit(sessionName, branchName, worktreePath, options)\n\n const { paneCountMsg, splitTypeMsg, layoutMsg } = generateTmuxMessage(options)\n console.log(\n chalk.green(\n `✨ tmuxセッション '${sessionName}' を作成し、${paneCountMsg}${splitTypeMsg}分割しました${layoutMsg}`\n )\n )\n\n // アタッチメント処理\n if (interactiveAttach && process.stdout.isTTY && process.stdin.isTTY) {\n try {\n const { shouldAttach } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shouldAttach',\n message: 'セッションにアタッチしますか?',\n default: true,\n },\n ])\n\n if (shouldAttach) {\n console.log(chalk.cyan(`🎵 tmuxセッション '${sessionName}' にアタッチしています...`))\n await attachToTmuxSession(sessionName)\n } else {\n console.log(\n chalk.yellow(`\\n📝 後でアタッチするには以下のコマンドを実行してください:`)\n )\n console.log(chalk.white(` tmux attach -t ${sessionName}`))\n console.log(chalk.gray(`\\n💡 ヒント: Ctrl+B, D でセッションからデタッチできます`))\n }\n } catch {\n // Ctrl+Cでキャンセルされた場合も正常な終了として扱う\n console.log(chalk.yellow(`\\n📝 後でアタッチするには以下のコマンドを実行してください:`))\n console.log(chalk.white(` tmux attach -t ${sessionName}`))\n console.log(chalk.gray(`\\n💡 ヒント: Ctrl+B, D でセッションからデタッチできます`))\n }\n } else {\n console.log(\n chalk.yellow(`\\n📝 tmuxセッションにアタッチするには以下のコマンドを実行してください:`)\n )\n console.log(chalk.white(` tmux attach -t ${sessionName}`))\n console.log(chalk.gray(`\\n💡 ヒント: Ctrl+B, D でセッションからデタッチできます`))\n }\n return\n } else {\n await handleInsideTmuxPaneSplit(branchName, worktreePath, options)\n\n const { paneCountMsg, splitTypeMsg, layoutMsg } = generateTmuxMessage(options)\n console.log(\n chalk.green(\n `✅ tmuxペインを${paneCountMsg}${splitTypeMsg}分割しました${layoutMsg}: ${branchName}`\n )\n )\n return\n }\n }\n\n // 通常のtmuxセッション作成\n try {\n await execa('tmux', ['has-session', '-t', sessionName])\n console.log(chalk.yellow(`tmuxセッション '${sessionName}' は既に存在します`))\n return\n } catch {\n // セッションが存在しない場合は作成\n }\n\n const shell = process.env.SHELL || '/bin/bash'\n await execa('tmux', ['new-session', '-d', '-s', sessionName, '-c', worktreePath, shell, '-l'])\n\n await execa('tmux', ['rename-window', '-t', sessionName, branchName])\n // ペインタイトルを設定\n await setTitleForAllPanes(sessionName, branchName, 1)\n console.log(chalk.green(`✨ tmuxセッション '${sessionName}' を作成しました`))\n\n if (interactiveAttach && process.stdout.isTTY && process.stdin.isTTY) {\n try {\n const { shouldAttach } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shouldAttach',\n message: 'セッションにアタッチしますか?',\n default: true,\n },\n ])\n\n if (shouldAttach) {\n console.log(chalk.cyan(`🎵 tmuxセッション '${sessionName}' にアタッチしています...`))\n const isInsideTmux = process.env.TMUX !== undefined\n if (isInsideTmux) {\n await switchTmuxClient(sessionName)\n } else {\n await attachToTmuxSession(sessionName)\n }\n } else {\n console.log(chalk.yellow(`\\n📝 後でアタッチするには以下のコマンドを実行してください:`))\n console.log(chalk.white(` tmux attach -t ${sessionName}`))\n console.log(chalk.gray(`\\n💡 ヒント: Ctrl+B, D でセッションからデタッチできます`))\n }\n } catch {\n // Ctrl+Cでキャンセルされた場合も正常な終了として扱う\n console.log(chalk.yellow(`\\n📝 後でアタッチするには以下のコマンドを実行してください:`))\n console.log(chalk.white(` tmux attach -t ${sessionName}`))\n console.log(chalk.gray(`\\n💡 ヒント: Ctrl+B, D でセッションからデタッチできます`))\n }\n } else {\n console.log(\n chalk.yellow(`\\n📝 tmuxセッションにアタッチするには以下のコマンドを実行してください:`)\n )\n console.log(chalk.white(` tmux attach -t ${sessionName}`))\n console.log(chalk.gray(`\\n💡 ヒント: Ctrl+B, D でセッションからデタッチできます`))\n }\n } catch (error) {\n // エラーメッセージの重複を避けるため、詳細なエラーメッセージのみ表示\n if (error instanceof Error) {\n console.error(chalk.red(`✖ ${error.message}`))\n } else {\n console.error(chalk.red(`✖ tmuxセッションの作成に失敗しました: ${error}`))\n }\n throw error\n }\n}\n\n// tmuxオプションの検証\nexport function validateTmuxOptions(options: TmuxSessionOptions): void {\n const { paneCount, isHorizontal } = getPaneConfiguration(options)\n if (paneCount > 2) {\n validatePaneCount(paneCount, isHorizontal)\n }\n}\n","import { execa } from 'execa'\nimport { spawn } from 'child_process'\n\n/**\n * tmuxのステータスラインを設定\n */\nexport async function setupTmuxStatusLine(): Promise<void> {\n try {\n // 右側のステータスラインにGitブランチ情報を表示\n await execa('tmux', [\n 'set-option',\n '-g',\n 'status-right',\n '#[fg=yellow]#{?client_prefix,#[reverse]<Prefix>#[noreverse] ,}#[fg=cyan]#(cd #{pane_current_path} && git branch --show-current 2>/dev/null || echo \"no branch\") #[fg=white]| %H:%M',\n ])\n\n // ペインボーダーにタイトルを表示\n await execa('tmux', ['set-option', '-g', 'pane-border-status', 'top'])\n await execa('tmux', ['set-option', '-g', 'pane-border-format', ' #{pane_title} '])\n } catch {\n // tmuxが動作していない場合は無視\n }\n}\n\n/**\n * tmuxセッション内かどうかを確認\n */\nexport async function isInTmuxSession(): Promise<boolean> {\n return process.env.TMUX !== undefined\n}\n\n/**\n * tmuxペインタイプ\n */\nexport type TmuxPaneType = 'new-window' | 'vertical-split' | 'horizontal-split'\n\n/**\n * tmuxセッションまたはペインでコマンドを実行\n */\nexport async function executeTmuxCommand(\n command: string[],\n options: {\n cwd?: string\n env?: Record<string, string>\n paneType?: TmuxPaneType\n sessionName?: string\n } = {}\n): Promise<void> {\n const { cwd, env, paneType = 'new-window', sessionName } = options\n\n // tmuxセッション内にいることを確認\n if (!(await isInTmuxSession())) {\n throw new Error('tmuxオプションを使用するにはtmuxセッション内にいる必要があります')\n }\n\n let tmuxArgs: string[]\n\n switch (paneType) {\n case 'new-window':\n tmuxArgs = ['new-window', '-n', sessionName || 'maestro']\n if (cwd) tmuxArgs.push('-c', cwd)\n tmuxArgs.push(...command)\n break\n\n case 'vertical-split':\n tmuxArgs = ['split-window', '-v']\n if (cwd) tmuxArgs.push('-c', cwd)\n tmuxArgs.push(...command)\n break\n\n case 'horizontal-split':\n tmuxArgs = ['split-window', '-h']\n if (cwd) tmuxArgs.push('-c', cwd)\n tmuxArgs.push(...command)\n break\n\n default:\n throw new Error(`Unknown pane type: ${paneType}`)\n }\n\n // 環境変数を設定\n const tmuxEnv = { ...process.env, ...env }\n\n try {\n const tmuxProcess = spawn('tmux', tmuxArgs, {\n stdio: 'inherit',\n env: tmuxEnv,\n })\n\n return new Promise<void>((resolve, reject) => {\n tmuxProcess.on('exit', code => {\n if (code === 0) {\n resolve()\n } else {\n reject(new Error(`tmux command failed with exit code ${code}`))\n }\n })\n\n tmuxProcess.on('error', error => {\n reject(error)\n })\n })\n } catch (error) {\n throw new Error(\n `Failed to execute tmux command: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * tmuxペインでシェルを開始\n */\nexport async function startTmuxShell(\n options: {\n cwd?: string\n branchName?: string\n paneType?: TmuxPaneType\n sessionName?: string\n } = {}\n): Promise<void> {\n const { cwd, branchName, paneType = 'new-window', sessionName } = options\n\n const env = {\n MAESTRO: '1',\n MAESTRO_NAME: branchName || 'unknown',\n MAESTRO_PATH: cwd || process.cwd(),\n }\n\n const shell = process.env.SHELL || '/bin/bash'\n\n await executeTmuxCommand([shell], {\n cwd,\n env,\n paneType,\n sessionName: sessionName || branchName,\n })\n}\n\n/**\n * tmuxペインでコマンドを実行\n */\nexport async function executeTmuxCommandInPane(\n command: string,\n options: {\n cwd?: string\n branchName?: string\n paneType?: TmuxPaneType\n sessionName?: string\n } = {}\n): Promise<void> {\n const { cwd, branchName, paneType = 'new-window', sessionName } = options\n\n const env = {\n MAESTRO: '1',\n MAESTRO_BRANCH: branchName || 'unknown',\n MAESTRO_PATH: cwd || process.cwd(),\n }\n\n await executeTmuxCommand(['sh', '-c', command], {\n cwd,\n env,\n paneType,\n sessionName: sessionName || branchName,\n })\n}\n","import { spawn } from 'child_process'\nimport { execa } from 'execa'\nimport { fileURLToPath } from 'url'\nimport { dirname, join } from 'path'\nimport { existsSync, chmodSync } from 'fs'\n\n/**\n * Native tmux helper that uses shell script with exec() for proper TTY control\n * This solves the TTY corruption issue by using exec to replace the process\n */\nexport class NativeTmuxHelper {\n // Cached path to the native tmux helper script (lazy initialization)\n private static _helperScript: string | null = null\n\n /**\n * Get the path to the tmux helper script with lazy initialization\n * Only resolves the path when tmux functionality is actually needed\n */\n private static getHelperScript(): string {\n // Return cached value if already resolved\n if (this._helperScript !== null) {\n return this._helperScript\n }\n\n // Skip initialization in test environment\n if (process.env.NODE_ENV === 'test' || process.env.VITEST) {\n this._helperScript = '/mock/path/maestro-tmux-attach'\n return this._helperScript\n }\n\n // Get current file directory\n const currentDir = dirname(fileURLToPath(import.meta.url))\n\n // Try multiple possible paths for different installation scenarios\n const possiblePaths = [\n // Built package: dist/utils -> ../../scripts/ (from issue-144/dist/utils to issue-144/scripts)\n join(dirname(dirname(currentDir)), 'scripts', 'maestro-tmux-attach'),\n // Development/source: src/utils -> ../../scripts/ (from issue-144/src/utils to issue-144/scripts)\n join(dirname(dirname(currentDir)), 'scripts', 'maestro-tmux-attach'),\n // npm package root: node_modules/@camoneart/maestro/dist/utils -> ../../../scripts/\n join(dirname(dirname(dirname(currentDir))), 'scripts', 'maestro-tmux-attach'),\n // Direct path for current development structure\n join(process.cwd(), 'scripts', 'maestro-tmux-attach'),\n ]\n\n let scriptPath: string | null = null\n for (const path of possiblePaths) {\n if (existsSync(path)) {\n scriptPath = path\n break\n }\n }\n\n if (!scriptPath) {\n throw new Error(\n `Maestro tmux helper script not found. Searched paths: ${possiblePaths.join(', ')}\\n` +\n 'Note: This error occurs only when tmux functionality is used. ' +\n 'Non-tmux commands like \"config init\" should work without tmux installed.'\n )\n }\n\n // Set executable permissions\n try {\n chmodSync(scriptPath, '755')\n } catch {\n // Ignore permission errors in case of read-only filesystem\n console.warn(`Warning: Could not set executable permissions for ${scriptPath}`)\n }\n\n this._helperScript = scriptPath\n return this._helperScript\n }\n /**\n * Attach to an existing tmux session using native shell script with exec\n * This function replaces the current Node.js process with tmux\n */\n static async attachToSession(sessionName: string): Promise<never> {\n // Validate session name\n if (!sessionName || typeof sessionName !== 'string') {\n throw new Error('Session name must be a non-empty string')\n }\n\n // Check if session exists before attempting to attach\n try {\n await execa('tmux', ['has-session', '-t', sessionName])\n } catch {\n throw new Error(`Tmux session '${sessionName}' does not exist`)\n }\n\n // Use the native helper script which properly uses exec to replace the process\n const helperProcess = spawn(this.getHelperScript(), ['attach', sessionName], {\n stdio: 'inherit',\n detached: false,\n })\n\n // Wait for helper to exit, then terminate Node.js process\n helperProcess.on('exit', code => {\n // Exit with the same code as tmux to maintain proper exit status\n process.exit(code || 0)\n })\n\n helperProcess.on('error', error => {\n console.error(`Failed to attach to tmux session: ${error.message}`)\n process.exit(1)\n })\n\n // This promise never resolves because process.exit() terminates Node.js\n return new Promise(() => {}) as Promise<never>\n }\n\n /**\n * Create a new tmux session and attach using native shell script with exec\n * This function replaces the current Node.js process with tmux\n */\n static async createAndAttachSession(\n sessionName: string,\n workingDirectory?: string,\n command?: string\n ): Promise<never> {\n // Validate session name\n if (!sessionName || typeof sessionName !== 'string') {\n throw new Error('Session name must be a non-empty string')\n }\n\n // Check if session already exists, attach if it does\n try {\n await execa('tmux', ['has-session', '-t', sessionName])\n console.warn(`Warning: tmux session '${sessionName}' already exists, attaching instead`)\n return this.attachToSession(sessionName)\n } catch {\n // Session doesn't exist, continue with creation\n }\n\n // Prepare arguments for the native helper script\n const args = ['new', sessionName]\n if (workingDirectory) {\n args.push(workingDirectory)\n }\n if (command) {\n args.push(command)\n }\n\n // Use the native helper script which properly uses exec to replace the process\n const helperProcess = spawn(this.getHelperScript(), args, {\n stdio: 'inherit',\n detached: false,\n })\n\n // Wait for helper to exit, then terminate Node.js process\n helperProcess.on('exit', code => {\n // Exit with the same code as tmux to maintain proper exit status\n process.exit(code || 0)\n })\n\n helperProcess.on('error', error => {\n console.error(`Failed to create tmux session: ${error.message}`)\n process.exit(1)\n })\n\n // This promise never resolves because process.exit() terminates Node.js\n return new Promise(() => {}) as Promise<never>\n }\n\n /**\n * Switch tmux client to another session (only works from within tmux)\n * This doesn't need process replacement since it's an internal tmux operation\n */\n static async switchClient(sessionName: string): Promise<void> {\n // Validate session name\n if (!sessionName || typeof sessionName !== 'string') {\n throw new Error('Session name must be a non-empty string')\n }\n\n // Use the native helper script for consistency\n try {\n await execa(this.getHelperScript(), ['switch', sessionName])\n } catch (error) {\n throw new Error(\n `Failed to switch tmux client: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n }\n\n /**\n * Check if a tmux session exists\n */\n static async sessionExists(sessionName: string): Promise<boolean> {\n try {\n await execa('tmux', ['has-session', '-t', sessionName])\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List all tmux sessions\n */\n static async listSessions(): Promise<Array<{ name: string; attached: boolean }>> {\n try {\n const { stdout } = await execa('tmux', [\n 'list-sessions',\n '-F',\n '#{session_name}:#{session_attached}',\n ])\n\n return stdout\n .split('\\n')\n .filter(Boolean)\n .map(line => {\n const [name, attached] = line.split(':')\n return {\n name: name || 'unknown',\n attached: attached === '1',\n }\n })\n } catch {\n return []\n }\n }\n}\n\n/**\n * Legacy compatibility functions for backward compatibility\n * These functions now use the native helper\n */\n\n/**\n * @deprecated Use NativeTmuxHelper.attachToSession instead\n */\nexport async function attachToTmuxWithNativeHelper(sessionName: string): Promise<never> {\n return NativeTmuxHelper.attachToSession(sessionName)\n}\n\n/**\n * @deprecated Use NativeTmuxHelper.createAndAttachSession instead\n */\nexport async function createAndAttachTmuxWithNativeHelper(\n sessionName: string,\n workingDirectory?: string,\n command?: string\n): Promise<never> {\n return NativeTmuxHelper.createAndAttachSession(sessionName, workingDirectory, command)\n}\n\n/**\n * @deprecated Use NativeTmuxHelper.switchClient instead\n */\nexport async function switchTmuxClientWithNativeHelper(sessionName: string): Promise<void> {\n return NativeTmuxHelper.switchClient(sessionName)\n}\n","import { NativeTmuxHelper } from './nativeTmux.js'\n\n/**\n * tmuxセッションにアタッチする(適切なTTY制御付き)\n *\n * This function uses direct tmux commands to solve TTY corruption issues.\n * It uses spawn with stdio: 'inherit' and process.exit() for proper TTY control.\n *\n * Note: This function never returns when successful, as the process exits.\n */\nexport async function attachToTmuxWithProperTTY(sessionName: string): Promise<void> {\n // Use the improved native helper which directly calls tmux\n // This call never returns on success due to process.exit()\n await NativeTmuxHelper.attachToSession(sessionName)\n}\n\n/**\n * tmuxクライアントを切り替える(適切なTTY制御付き)\n *\n * Uses direct tmux switch-client command. This doesn't require process replacement\n * since it's an internal tmux operation.\n */\nexport async function switchTmuxClientWithProperTTY(sessionName: string): Promise<void> {\n // Use the improved native helper which directly calls tmux\n await NativeTmuxHelper.switchClient(sessionName)\n}\n\n/**\n * 新しいtmuxセッションを作成してアタッチする\n *\n * This function uses direct tmux commands to solve TTY corruption issues.\n * It uses spawn with stdio: 'inherit' and process.exit() for proper TTY control.\n *\n * Note: This function never returns when successful, as the process exits.\n */\nexport async function createAndAttachTmuxSession(\n sessionName: string,\n cwd?: string,\n command?: string\n): Promise<void> {\n // Use the improved native helper which directly calls tmux\n // This call never returns on success due to process.exit()\n await NativeTmuxHelper.createAndAttachSession(sessionName, cwd, command)\n}\n","import { existsSync, readFileSync } from 'fs'\nimport path from 'path'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'none'\n\nexport function detectPackageManager(projectPath: string): PackageManager {\n if (existsSync(path.join(projectPath, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n\n if (existsSync(path.join(projectPath, 'yarn.lock'))) {\n return 'yarn'\n }\n\n if (existsSync(path.join(projectPath, 'package-lock.json'))) {\n return 'npm'\n }\n\n const packageJsonPath = path.join(projectPath, 'package.json')\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))\n if (packageJson.packageManager) {\n const manager = packageJson.packageManager.split('@')[0]\n if (['pnpm', 'npm', 'yarn'].includes(manager)) {\n return manager as PackageManager\n }\n }\n } catch {\n // package.jsonの読み込みエラーは無視\n }\n }\n\n return 'npm'\n}\n","import { existsSync, readFileSync, writeFileSync, appendFileSync } from 'fs'\nimport path from 'path'\n\nexport async function addToGitignore(\n projectPath: string,\n entry: string,\n comment?: string\n): Promise<void> {\n const gitignorePath = path.join(projectPath, '.gitignore')\n\n let gitignoreContent = ''\n let entryExists = false\n\n if (existsSync(gitignorePath)) {\n gitignoreContent = readFileSync(gitignorePath, 'utf-8')\n const lines = gitignoreContent.split('\\n')\n entryExists = lines.some(line => line.trim() === entry.trim())\n }\n\n if (!entryExists) {\n let entryToAdd: string\n if (comment) {\n const commentLine = `# ${comment}`\n entryToAdd =\n gitignoreContent && !gitignoreContent.endsWith('\\n')\n ? `\\n\\n${commentLine}\\n${entry}\\n`\n : `\\n${commentLine}\\n${entry}\\n`\n } else {\n entryToAdd =\n gitignoreContent && !gitignoreContent.endsWith('\\n') ? `\\n${entry}\\n` : `${entry}\\n`\n }\n\n if (existsSync(gitignorePath)) {\n appendFileSync(gitignorePath, entryToAdd, 'utf-8')\n } else {\n writeFileSync(gitignorePath, entryToAdd, 'utf-8')\n }\n }\n}\n\nexport function isEntryInGitignore(projectPath: string, entry: string): boolean {\n const gitignorePath = path.join(projectPath, '.gitignore')\n\n if (!existsSync(gitignorePath)) {\n return false\n }\n\n const gitignoreContent = readFileSync(gitignorePath, 'utf-8')\n const lines = gitignoreContent.split('\\n')\n\n return lines.some(line => line.trim() === entry.trim())\n}\n","import path from 'path'\nimport { Config } from '../core/config.js'\n\n/**\n * 設定に基づいてパス表示形式をフォーマットする\n * @param absolutePath - 絶対パス\n * @param config - maestro設定\n * @returns フォーマットされたパス文字列\n */\nexport function formatPath(absolutePath: string, config: Config): string {\n const pathDisplay = config.ui?.pathDisplay || 'absolute'\n\n if (pathDisplay === 'relative') {\n const relativePath = path.relative(process.cwd(), absolutePath)\n // 同じディレクトリの場合は'.'を返す\n return relativePath === '' ? '.' : relativePath\n }\n\n return absolutePath\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { Worktree } from '../types/index.js'\nimport { spawn } from 'child_process'\nimport fs from 'fs'\nimport path from 'path'\nimport { ConfigManager, Config } from '../core/config.js'\nimport { formatPath as formatDisplayPath } from '../utils/path.js'\n\n// 拡張Worktree型定義\ninterface EnhancedWorktree extends Worktree {\n lastCommit?: { date: string; message: string; hash: string } | null\n metadata?: WorktreeMetadata | null\n size?: number\n}\n\n// worktreeメタデータ型定義\ninterface WorktreeMetadata {\n createdAt: string\n branch: string\n worktreePath: string\n github?: {\n type: 'issue' | 'pr'\n title: string\n body: string\n author: string\n labels: string[]\n assignees: string[]\n milestone?: string\n url: string\n issueNumber?: string\n }\n template?: string\n}\n\n// パスを設定に基づいて表示する関数\nfunction formatPath(fullPath: string, config: Config, fullPathOverride: boolean = false): string {\n if (fullPathOverride) {\n return fullPath\n }\n return formatDisplayPath(fullPath, config)\n}\n\nexport const listCommand = new Command('list')\n .alias('ls')\n .description('オーケストラ編成(worktree)の一覧を表示')\n .option('-j, --json', 'JSON形式で出力')\n .option('--fzf', 'fzfで選択し、選択したブランチ名を出力')\n .option('--names', 'ブランチ名のみを出力(スクリプト用)')\n .option('--filter <keyword>', 'ブランチ名またはパスでフィルタ')\n .option('--sort <field>', 'ソート順 (branch|age|size)', 'branch')\n .option('--last-commit', '最終コミット情報を表示')\n .option('--metadata', 'メタデータ情報を表示')\n .option('--full-path', '完全パスを表示')\n .exitOverride()\n .action(\n async (\n options: {\n json?: boolean\n fzf?: boolean\n names?: boolean\n filter?: string\n sort?: string\n lastCommit?: boolean\n metadata?: boolean\n fullPath?: boolean\n } = {}\n ) => {\n try {\n const gitManager = new GitWorktreeManager()\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n console.error(chalk.red('エラー: このディレクトリはGitリポジトリではありません'))\n process.exit(1)\n }\n\n let worktrees = await gitManager.listWorktrees()\n\n // フィルタ処理\n if (options.filter) {\n const keyword = options.filter.toLowerCase()\n worktrees = worktrees.filter(\n wt =>\n wt.branch?.toLowerCase().includes(keyword) || wt.path.toLowerCase().includes(keyword)\n )\n }\n\n // 最終コミット情報を取得\n if (options.lastCommit || options.json || options.sort === 'age') {\n for (const worktree of worktrees) {\n try {\n const lastCommit = await gitManager.getLastCommit(worktree.path)\n ;(worktree as EnhancedWorktree).lastCommit = lastCommit\n } catch {\n ;(worktree as EnhancedWorktree).lastCommit = null\n }\n }\n }\n\n // メタデータ情報を取得\n if (options.metadata || options.json) {\n for (const worktree of worktrees) {\n try {\n const metadataPath = path.join(worktree.path, '.maestro-metadata.json')\n const metadataContent = await fs.promises.readFile(metadataPath, 'utf-8')\n ;(worktree as EnhancedWorktree).metadata = JSON.parse(metadataContent)\n } catch {\n ;(worktree as EnhancedWorktree).metadata = null\n }\n }\n }\n\n // ソート処理\n if (options.sort) {\n await sortWorktrees(worktrees, options.sort)\n }\n\n if (options?.json) {\n // JSON出力時に追加フィールドを含める\n const jsonWorktrees = worktrees.map(wt => ({\n ...wt,\n isCurrent: wt.isCurrentDirectory || wt.path === process.cwd(),\n locked: wt.locked || false,\n lastCommit: (wt as EnhancedWorktree).lastCommit || null,\n metadata: (wt as EnhancedWorktree).metadata || null,\n }))\n console.log(JSON.stringify(jsonWorktrees, null, 2))\n return\n }\n\n if (worktrees.length === 0) {\n console.log(chalk.yellow('演奏者が存在しません'))\n return\n }\n\n // --namesオプションが指定された場合(スクリプト用)\n if (options?.names) {\n // メインブランチを除外した演奏者のブランチ名のみを出力\n const orchestraMembers = worktrees.filter((wt: Worktree) => !wt.path.endsWith('.'))\n\n for (const wt of orchestraMembers) {\n const branchName = wt.branch?.replace('refs/heads/', '') || wt.branch || ''\n if (branchName) {\n console.log(branchName)\n }\n }\n return\n }\n\n // fzfで選択\n if (options?.fzf) {\n const fzfEntries = await Promise.all(\n worktrees.map(async w => {\n const status = []\n if (w.isCurrentDirectory) status.push(chalk.green('現在'))\n if (w.locked) status.push(chalk.red('ロック'))\n if (w.prunable) status.push(chalk.yellow('削除可能'))\n\n const statusStr = status.length > 0 ? ` [${status.join(', ')}]` : ''\n const displayPath = formatPath(w.path, config, options.fullPath || false)\n return `${w.branch}${statusStr} | ${displayPath}`\n })\n )\n const fzfInput = fzfEntries.join('\\n')\n\n const fzfProcess = spawn(\n 'fzf',\n [\n '--ansi',\n '--header=演奏者を選択 (Ctrl-C でキャンセル)',\n '--preview',\n 'echo {} | cut -d\"|\" -f2 | xargs ls -la',\n '--preview-window=right:50%:wrap',\n ],\n {\n stdio: ['pipe', 'pipe', 'inherit'],\n }\n )\n\n // fzfにデータを送る\n fzfProcess.stdin.write(fzfInput)\n fzfProcess.stdin.end()\n\n // 選択結果を取得\n let selected = ''\n fzfProcess.stdout.on('data', data => {\n selected += data.toString()\n })\n\n fzfProcess.on('close', code => {\n if (code !== 0 || !selected.trim()) {\n // キャンセルされた場合は何も出力しない\n return\n }\n\n // ブランチ名を抽出して出力\n const selectedBranch = selected\n .split('|')[0]\n ?.trim()\n .replace(/\\[.*\\]/, '')\n .trim()\n if (selectedBranch) {\n console.log(selectedBranch.replace('refs/heads/', ''))\n }\n })\n return\n }\n\n console.log(chalk.bold('\\n🎼 オーケストラ編成(worktree):\\n'))\n\n // メインワークツリーを先頭に表示\n const mainWorktree = worktrees.find(\n wt => wt.branch === 'refs/heads/main' || wt.isCurrentDirectory\n )\n const memberWorktrees = worktrees.filter(wt => wt !== mainWorktree)\n\n if (mainWorktree) {\n await displayWorktree(\n mainWorktree,\n true,\n gitManager,\n config,\n options.lastCommit,\n options.metadata,\n options.fullPath\n )\n }\n\n for (const wt of memberWorktrees) {\n await displayWorktree(\n wt,\n false,\n gitManager,\n config,\n options.lastCommit,\n options.metadata,\n options.fullPath\n )\n }\n\n console.log(chalk.gray(`\\n合計: ${worktrees.length} 名の演奏者`))\n } catch (error) {\n console.error(chalk.red('エラー:'), error instanceof Error ? error.message : '不明なエラー')\n process.exit(1)\n }\n }\n )\n\nasync function sortWorktrees(worktrees: Worktree[], sortBy: string): Promise<void> {\n switch (sortBy) {\n case 'branch':\n worktrees.sort((a, b) => (a.branch || '').localeCompare(b.branch || ''))\n break\n case 'age':\n // lastCommit が設定されている場合は日付でソート\n worktrees.sort((a, b) => {\n const aCommit = (a as EnhancedWorktree).lastCommit\n const bCommit = (b as EnhancedWorktree).lastCommit\n if (!aCommit && !bCommit) return 0\n if (!aCommit) return 1\n if (!bCommit) return -1\n return new Date(bCommit.date).getTime() - new Date(aCommit.date).getTime()\n })\n break\n case 'size':\n // ディレクトリサイズでソート\n for (const worktree of worktrees) {\n try {\n const stats = fs.statSync(worktree.path)\n ;(worktree as EnhancedWorktree).size = stats.size\n } catch {\n ;(worktree as EnhancedWorktree).size = 0\n }\n }\n worktrees.sort(\n (a, b) => ((b as EnhancedWorktree).size || 0) - ((a as EnhancedWorktree).size || 0)\n )\n break\n }\n}\n\nasync function displayWorktree(\n worktree: Worktree,\n isMain: boolean,\n _gitManager: GitWorktreeManager,\n config: Config,\n showLastCommit?: boolean,\n showMetadata?: boolean,\n showFullPath?: boolean\n) {\n const prefix = isMain ? '📍' : '🎷'\n const branchName = worktree.branch || '(detached)'\n const status = []\n\n if (worktree.locked) {\n status.push(chalk.red('🔒 ロック中'))\n if (worktree.reason) {\n status.push(chalk.gray(`(${worktree.reason})`))\n }\n }\n\n if (worktree.prunable) {\n status.push(chalk.yellow('⚠️ 削除可能'))\n }\n\n // メタデータからGitHubバッジを追加\n const metadata = (worktree as EnhancedWorktree).metadata\n if (metadata?.github) {\n if (metadata.github.type === 'pr') {\n status.push(chalk.blue(`PR #${metadata.github.issueNumber}`))\n } else {\n status.push(chalk.green(`Issue #${metadata.github.issueNumber}`))\n }\n }\n if (metadata?.template) {\n status.push(chalk.magenta(`[${metadata.template}]`))\n }\n\n // パス表示の決定\n const displayPath = formatPath(worktree.path, config, showFullPath)\n\n let output =\n `${prefix} ${chalk.cyan(branchName.padEnd(30))} ` +\n `${chalk.gray(displayPath)} ` +\n `${status.join(' ')}`\n\n if (showLastCommit && (worktree as EnhancedWorktree).lastCommit) {\n const lastCommit = (worktree as EnhancedWorktree).lastCommit!\n output += `\\n ${chalk.gray('最終コミット:')} ${chalk.yellow(lastCommit.date)} ${chalk.gray(lastCommit.message)}`\n }\n\n if (showMetadata && metadata) {\n if (metadata.github) {\n output += `\\n ${chalk.gray('GitHub:')} ${metadata.github.title}`\n if (metadata.github.labels.length > 0) {\n output += `\\n ${chalk.gray('ラベル:')} ${metadata.github.labels.join(', ')}`\n }\n if (metadata.github.assignees.length > 0) {\n output += `\\n ${chalk.gray('担当者:')} ${metadata.github.assignees.join(', ')}`\n }\n }\n if (metadata.createdAt) {\n output += `\\n ${chalk.gray('作成日時:')} ${new Date(metadata.createdAt).toLocaleString()}`\n }\n }\n\n console.log(output)\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { DeleteOptions, Worktree } from '../types/index.js'\nimport { execa } from 'execa'\nimport { spawn } from 'child_process'\nimport { ConfigManager, Config } from '../core/config.js'\nimport { formatPath } from '../utils/path.js'\n\n// エラークラス\nclass DeleteCommandError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DeleteCommandError'\n }\n}\n\n// ディレクトリサイズをフォーマットする関数\nexport function formatDirectorySize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\n// worktree表示文字列を作成する関数\nexport function createWorktreeDisplay(worktree: Worktree): string {\n let display = worktree.branch || worktree.head\n\n if (worktree.locked) {\n display = `🔒 ${display}`\n }\n\n if (worktree.detached) {\n display = `⚠️ ${display} (detached)`\n }\n\n return display\n}\n\n// ディレクトリサイズを取得する関数\nexport async function getDirectorySize(dirPath: string): Promise<string> {\n try {\n const { stdout } = await execa('du', ['-sh', dirPath])\n const size = stdout.split('\\t')[0]\n return size || 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\n// リモートブランチを削除する関数\nexport async function deleteRemoteBranch(branchName: string): Promise<void> {\n const remoteSpinner = ora('リモートブランチを削除中...').start()\n\n try {\n // リモートブランチが存在するか確認\n const { stdout: remoteBranches } = await execa('git', ['branch', '-r'])\n const remoteBranchName = `origin/${branchName}`\n\n if (!remoteBranches.includes(remoteBranchName)) {\n remoteSpinner.warn(`リモートブランチ '${remoteBranchName}' は存在しません`)\n return\n }\n\n // リモートブランチを削除\n await execa('git', ['push', 'origin', '--delete', branchName])\n remoteSpinner.succeed(`リモートブランチ '${chalk.cyan(remoteBranchName)}' を削除しました`)\n } catch (error) {\n remoteSpinner.fail('リモートブランチの削除に失敗しました')\n throw new DeleteCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\n// ワークツリー選択の前処理を行う純粋関数\nexport function prepareWorktreeSelection(\n worktrees: Worktree[],\n branchName?: string,\n options: { fzf?: boolean; current?: boolean } = {}\n): {\n filteredWorktrees: Worktree[]\n needsInteractiveSelection: boolean\n} {\n const orchestraMembers = worktrees.filter(wt => !wt.path.endsWith('.'))\n\n if (orchestraMembers.length === 0) {\n return { filteredWorktrees: [], needsInteractiveSelection: false }\n }\n\n // 現在のworktreeを削除する場合\n if (options.current) {\n const currentWorktree = orchestraMembers.find(wt => process.cwd().startsWith(wt.path))\n if (currentWorktree) {\n return { filteredWorktrees: [currentWorktree], needsInteractiveSelection: false }\n }\n }\n\n // ブランチ名が指定されている場合\n if (branchName && !options.fzf) {\n // ワイルドカードパターンのチェック\n if (branchName.includes('*')) {\n // パターンを正規表現に変換\n const pattern = branchName\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // 特殊文字をエスケープ\n .replace(/\\*/g, '.*') // * を .* に置換\n const regex = new RegExp(`^(refs/heads/)?${pattern}$`)\n\n const matchedWorktrees = orchestraMembers.filter(wt => {\n const branch = wt.branch || ''\n return regex.test(branch) || regex.test(branch.replace('refs/heads/', ''))\n })\n\n if (matchedWorktrees.length > 0) {\n return { filteredWorktrees: matchedWorktrees, needsInteractiveSelection: false }\n }\n } else {\n // 通常の完全一致\n const targetWorktree = orchestraMembers.find(\n wt => wt.branch === branchName || wt.branch === `refs/heads/${branchName}`\n )\n if (targetWorktree) {\n return { filteredWorktrees: [targetWorktree], needsInteractiveSelection: false }\n }\n }\n }\n\n // fzfで選択、またはインタラクティブ選択が必要\n return {\n filteredWorktrees: orchestraMembers,\n needsInteractiveSelection: true,\n }\n}\n\n// ワークツリー削除の安全性チェックを行う純粋関数\nexport function validateWorktreeDeletion(\n worktree: Worktree,\n options: { force?: boolean } = {}\n): {\n isValid: boolean\n warnings: string[]\n requiresConfirmation: boolean\n} {\n const warnings: string[] = []\n let requiresConfirmation = false\n\n // ロックされているかチェック\n if (worktree.locked) {\n warnings.push(`ワークツリーがロックされています: ${worktree.path}`)\n }\n\n // 削除可能かチェック\n if (worktree.prunable) {\n warnings.push(`削除可能なワークツリーです: ${worktree.path}`)\n }\n\n // 強制削除フラグがない場合は確認が必要\n if (!options.force && warnings.length > 0) {\n requiresConfirmation = true\n }\n\n return {\n isValid: true,\n warnings,\n requiresConfirmation,\n }\n}\n\n// ワークツリー削除の実行処理を行う純粋関数\nexport async function executeWorktreeDeletion(\n gitManager: GitWorktreeManager,\n worktree: Worktree,\n options: { force?: boolean; removeRemote?: boolean } = {}\n): Promise<{ success: boolean; branchName?: string }> {\n try {\n // ブランチ名を取得\n const branchName = worktree.branch?.replace('refs/heads/', '') || worktree.branch\n\n // ワークツリーを削除\n await gitManager.deleteWorktree(branchName!, options.force)\n\n return { success: true, branchName }\n } catch (error) {\n throw new DeleteCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\n// 現在のディレクトリが指定されたworktree内にあるかチェック\nexport function isCurrentDirectoryInWorktree(worktreePath: string): boolean {\n const currentDir = process.cwd()\n return currentDir.startsWith(worktreePath)\n}\n\n// fzfを使用してワークツリーを選択\nasync function selectWorktreesWithFzf(\n filteredWorktrees: Worktree[],\n options: { force?: boolean } = {}\n): Promise<Worktree[]> {\n const fzfInput = filteredWorktrees\n .map(w => {\n const status = []\n if (w.locked) status.push(chalk.red('ロック'))\n if (w.prunable) status.push(chalk.yellow('削除可能'))\n\n const statusStr = status.length > 0 ? ` [${status.join(', ')}]` : ''\n const branch = w.branch?.replace('refs/heads/', '') || w.branch\n return `${branch}${statusStr} | ${w.path}`\n })\n .join('\\n')\n\n const fzfProcess = spawn(\n 'fzf',\n [\n '--ansi',\n '--multi',\n '--header=退場させる演奏者を選択 (Tab で複数選択, Ctrl-C でキャンセル)',\n '--preview',\n 'echo {} | cut -d\"|\" -f2 | xargs ls -la',\n '--preview-window=right:50%:wrap',\n ],\n {\n stdio: ['pipe', 'pipe', 'inherit'],\n }\n )\n\n fzfProcess.stdin.write(fzfInput)\n fzfProcess.stdin.end()\n\n let selected = ''\n fzfProcess.stdout.on('data', data => {\n selected += data.toString()\n })\n\n return new Promise<Worktree[]>((resolve, reject) => {\n fzfProcess.on('close', async code => {\n if (code !== 0 || !selected.trim()) {\n reject(new DeleteCommandError('キャンセルされました'))\n return\n }\n\n const selectedBranches = selected\n .trim()\n .split('\\n')\n .map(line =>\n line\n .split('|')[0]\n ?.trim()\n .replace(/\\[.*\\]/, '')\n .trim()\n )\n .filter(Boolean)\n\n const targetWorktrees = filteredWorktrees.filter((wt: Worktree) => {\n const branch = wt.branch?.replace('refs/heads/', '')\n return selectedBranches.includes(branch)\n })\n\n // --forceオプションがない場合は最終確認プロンプトを表示\n if (!options.force && targetWorktrees.length > 0) {\n console.log(chalk.yellow('\\n⚠️ 以下の選択したworktreeを本当に削除しますか?'))\n targetWorktrees.forEach(wt => {\n const branch = wt.branch?.replace('refs/heads/', '') || wt.branch\n console.log(` ${chalk.green('✅')} ${chalk.cyan(branch)}`)\n })\n\n const { confirmDelete } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmDelete',\n message: '削除を実行しますか?',\n default: false,\n },\n ])\n\n if (!confirmDelete) {\n reject(new DeleteCommandError('キャンセルされました'))\n return\n }\n }\n\n resolve(targetWorktrees)\n })\n })\n}\n\n// 削除対象のワークツリーを決定\nasync function determineTargetWorktrees(\n filteredWorktrees: Worktree[],\n needsInteractiveSelection: boolean,\n branchName?: string,\n options: { fzf?: boolean; force?: boolean } = {}\n): Promise<Worktree[]> {\n if (!needsInteractiveSelection) {\n return filteredWorktrees\n }\n\n if (options.fzf && !branchName) {\n return selectWorktreesWithFzf(filteredWorktrees, options)\n }\n\n if (branchName) {\n if (branchName.includes('*')) {\n if (filteredWorktrees.length === 0) {\n throw new DeleteCommandError('指定されたパターンに一致する演奏者が見つかりません')\n }\n return filteredWorktrees\n } else {\n const targetWorktree = filteredWorktrees.find(wt => {\n const branch = wt.branch?.replace('refs/heads/', '')\n return branch === branchName || wt.branch === branchName\n })\n\n if (!targetWorktree) {\n const similarBranches = filteredWorktrees\n .filter(wt => wt.branch && wt.branch.includes(branchName))\n .map(wt => wt.branch?.replace('refs/heads/', '') || wt.branch)\n\n if (similarBranches.length > 0) {\n console.log(chalk.yellow('\\n類似した演奏者:'))\n similarBranches.forEach(branch => {\n console.log(` - ${chalk.cyan(branch)}`)\n })\n }\n\n throw new DeleteCommandError('指定された演奏者が見つかりません')\n }\n\n return [targetWorktree]\n }\n }\n\n throw new DeleteCommandError('削除対象を指定してください')\n}\n\n// 削除対象の詳細を表示\nasync function displayDeletionDetails(targetWorktrees: Worktree[], config: Config): Promise<void> {\n console.log(chalk.bold('\\n🪽 退場対象の演奏者:\\n'))\n\n const deletionDetails = await Promise.all(\n targetWorktrees.map(async wt => {\n const branch = wt.branch?.replace('refs/heads/', '') || wt.branch\n const size = await getDirectorySize(wt.path)\n return { worktree: wt, branch, size }\n })\n )\n\n deletionDetails.forEach(({ branch, size, worktree }) => {\n const displayPath = formatPath(worktree.path, config)\n console.log(\n ` ${chalk.cyan(branch || 'unknown')} ${chalk.gray(`(${size})`)} - ${chalk.gray(displayPath)}`\n )\n if (worktree.locked) {\n console.log(` ${chalk.red('⚠️ ロックされています')}: ${worktree.reason || '理由不明'}`)\n }\n })\n\n console.log(chalk.gray(`\\n合計: ${targetWorktrees.length} 名の演奏者`))\n}\n\n// 削除実行\nasync function executeWorktreesDeletion(\n targetWorktrees: Worktree[],\n gitManager: GitWorktreeManager,\n options: { force?: boolean; removeRemote?: boolean; keepSession?: boolean } = {}\n): Promise<void> {\n const results: { branch: string; status: 'success' | 'failed'; error?: string }[] = []\n\n for (const worktree of targetWorktrees) {\n const branch = worktree.branch?.replace('refs/heads/', '') || worktree.branch || 'unknown'\n const deleteSpinner = ora(`演奏者 '${chalk.cyan(branch)}' が退場中...`).start()\n\n try {\n await gitManager.deleteWorktree(\n worktree.branch?.replace('refs/heads/', '') || '',\n options.force\n )\n deleteSpinner.succeed(`演奏者 '${chalk.cyan(branch)}' が退場しました`)\n\n if (options.removeRemote && worktree.branch) {\n await deleteRemoteBranch(worktree.branch.replace('refs/heads/', ''))\n }\n\n // tmuxセッションの削除\n if (!options.keepSession) {\n try {\n // create.tsと同じ正規化ロジックを適用\n const tmuxSessionName = branch.replace(/[^a-zA-Z0-9_-]/g, '-')\n // tmuxセッションが存在するかチェック\n await execa('tmux', ['has-session', '-t', tmuxSessionName])\n // 存在する場合は削除\n await execa('tmux', ['kill-session', '-t', tmuxSessionName])\n console.log(` ${chalk.gray(`tmuxセッション '${tmuxSessionName}' を削除しました`)}`)\n } catch {\n // セッションが存在しない場合は何もしない\n }\n }\n\n results.push({ branch, status: 'success' })\n } catch (error) {\n deleteSpinner.fail(`演奏者 '${chalk.cyan(branch)}' が退場できませんでした`)\n results.push({\n branch,\n status: 'failed',\n error: error instanceof Error ? error.message : '不明なエラー',\n })\n }\n }\n\n // 結果サマリー\n console.log(chalk.bold('\\n🎼 退場結果:\\n'))\n\n const successCount = results.filter(r => r.status === 'success').length\n const failedCount = results.filter(r => r.status === 'failed').length\n\n results.forEach(result => {\n const icon = result.status === 'success' ? '✅' : '❌'\n const statusText = result.status === 'success' ? chalk.green('成功') : chalk.red('失敗')\n\n console.log(`${icon} ${chalk.cyan(result.branch)} - ${statusText}`)\n if (result.error) {\n console.log(` ${chalk.red(result.error)}`)\n }\n })\n\n console.log(chalk.gray(`\\n合計: ${successCount} 成功, ${failedCount} 失敗`))\n\n if (successCount > 0) {\n const message =\n successCount === 1 ? '1名の演奏者が退場しました' : `${successCount}名の演奏者が退場しました`\n console.log(chalk.green(`\\n✨ ${message}`))\n }\n}\n\nexport const deleteCommand = new Command('delete')\n .alias('rm')\n .description('演奏者(worktree)が退場')\n .argument('[branch-name]', '削除するブランチ名(ワイルドカード使用可: feature/demo-*)')\n .option('-f, --force', '強制削除')\n .option('-r, --remove-remote', 'リモートブランチも削除')\n .option('--keep-session', 'tmuxセッションを保持')\n .option('--fzf', 'fzfで選択(複数選択可)')\n .option('--current', '現在のworktreeを削除')\n .exitOverride()\n .action(\n async (\n branchName?: string,\n options: DeleteOptions & { fzf?: boolean; current?: boolean; keepSession?: boolean } = {}\n ) => {\n const spinner = ora('演奏者を確認中...').start()\n\n try {\n const gitManager = new GitWorktreeManager()\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n throw new DeleteCommandError('このディレクトリはGitリポジトリではありません')\n }\n\n // ワークツリー一覧を取得\n const worktrees = await gitManager.listWorktrees()\n const { filteredWorktrees, needsInteractiveSelection } = prepareWorktreeSelection(\n worktrees,\n branchName,\n options\n )\n\n if (filteredWorktrees.length === 0) {\n spinner.fail('演奏者が存在しません')\n return\n }\n\n if (options.fzf && !branchName) {\n spinner.stop()\n }\n\n const targetWorktrees = await determineTargetWorktrees(\n filteredWorktrees,\n needsInteractiveSelection,\n branchName,\n options\n )\n\n if (options.fzf && !branchName) {\n spinner.start()\n }\n\n spinner.stop()\n\n // 削除対象のworktree内から削除しようとしているかチェック\n for (const worktree of targetWorktrees) {\n if (isCurrentDirectoryInWorktree(worktree.path)) {\n throw new DeleteCommandError(\n `現在のディレクトリが削除対象のworktree内にあります。\\n` +\n `別のディレクトリから実行してください。\\n` +\n `例: cd .. && mst delete ${worktree.branch?.replace('refs/heads/', '') || branchName}`\n )\n }\n }\n\n await displayDeletionDetails(targetWorktrees, config)\n\n // fzf使用時は selectWorktreesWithFzf 内で確認済み、そうでなければここで確認\n if (!options.force && !(options.fzf && !branchName)) {\n const { confirmDelete } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmDelete',\n message: chalk.yellow('本当に演奏者を退場させますか?'),\n default: false,\n },\n ])\n\n if (!confirmDelete) {\n console.log(chalk.gray('キャンセルされました'))\n return\n }\n }\n\n console.log()\n await executeWorktreesDeletion(targetWorktrees, gitManager, options)\n } catch (error) {\n spinner.fail('エラーが発生しました')\n if (error instanceof DeleteCommandError) {\n console.error(chalk.red(error.message))\n process.exitCode = 1\n } else {\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exitCode = 1\n }\n }\n }\n )\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { ConfigManager } from '../core/config.js'\nimport { spawn } from 'child_process'\nimport inquirer from 'inquirer'\nimport { execa } from 'execa'\nimport { ErrorFactory, handleError } from '../utils/errors.js'\nimport { startTmuxShell, isInTmuxSession, TmuxPaneType } from '../utils/tmux.js'\nimport { selectWorktreeWithFzf, isFzfAvailable } from '../utils/fzf.js'\nimport { attachToTmuxWithProperTTY, createAndAttachTmuxSession } from '../utils/tty.js'\nimport { formatPath } from '../utils/path.js'\n\ninterface ShellOptions {\n fzf?: boolean\n cmd?: string\n tmux?: boolean\n tmuxVertical?: boolean\n tmuxHorizontal?: boolean\n}\n\nexport const shellCommand = new Command('shell')\n .alias('sh')\n .description('演奏者のシェルに入る')\n .argument('[branch-name]', 'ブランチ名(省略時は選択)')\n .option('--fzf', 'fzfで選択')\n .option('--cmd <command>', '指定コマンド実行して終了')\n .option('-t, --tmux', '既存tmuxセッションにアタッチ(存在しなければ作成)')\n .option('--tmux-vertical, --tmux-v', 'tmuxの縦分割ペインでシェルを開始')\n .option('--tmux-horizontal, --tmux-h', 'tmuxの横分割ペインでシェルを開始')\n .exitOverride()\n .action(async (branchName?: string, options: ShellOptions = {}) => {\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n throw ErrorFactory.notGitRepository()\n }\n\n const worktrees = await gitManager.listWorktrees()\n\n // メインブランチを除外\n const orchestraMembers = worktrees.filter(wt => !wt.path.endsWith('.'))\n\n if (orchestraMembers.length === 0) {\n console.log(chalk.yellow('演奏者が存在しません'))\n console.log(chalk.gray('maestro create <branch-name> で演奏者を招集してください'))\n process.exit(0)\n }\n\n // tmuxオプションの検証\n const tmuxOptionsCount = [options.tmux, options.tmuxVertical, options.tmuxHorizontal].filter(\n Boolean\n ).length\n if (tmuxOptionsCount > 1) {\n console.error(chalk.red('エラー: tmuxオプションは一つだけ指定してください'))\n process.exit(1)\n }\n\n const isUsingTmux = options.tmux || options.tmuxVertical || options.tmuxHorizontal\n if (isUsingTmux && !(await isInTmuxSession())) {\n console.error(\n chalk.red('エラー: tmuxオプションを使用するにはtmuxセッション内にいる必要があります')\n )\n process.exit(1)\n }\n\n // ブランチ名が指定されていない場合またはfzfオプションが指定された場合\n if (!branchName || options?.fzf) {\n if (options?.fzf) {\n // fzfの利用可能性をチェック\n if (!(await isFzfAvailable())) {\n console.error(chalk.red('エラー: fzfがインストールされていません'))\n process.exit(1)\n }\n\n const selectedBranch = await selectWorktreeWithFzf(\n orchestraMembers,\n 'シェルに入る演奏者を選択 (Ctrl-C でキャンセル)'\n )\n\n if (!selectedBranch) {\n console.log(chalk.gray('キャンセルされました'))\n process.exit(0)\n }\n\n branchName = selectedBranch\n } else {\n // inquirerで選択\n const { selectedBranch } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedBranch',\n message: 'どの演奏者に入りますか?',\n choices: orchestraMembers.map(wt => {\n const branchName = wt.branch?.replace('refs/heads/', '') || wt.branch\n const configManager = new ConfigManager()\n const config = configManager.getAll()\n return {\n name: `${chalk.cyan(branchName)} ${chalk.gray(formatPath(wt.path, config))}`,\n value: branchName,\n }\n }),\n },\n ])\n branchName = selectedBranch\n }\n }\n\n // 指定されたブランチのworktreeを探す\n const targetWorktree = orchestraMembers.find(wt => {\n const branch = wt.branch?.replace('refs/heads/', '')\n return branch === branchName || wt.branch === branchName\n })\n\n if (!targetWorktree) {\n // 類似した名前を検索\n const similarBranches = orchestraMembers\n .filter(\n wt => wt.branch && wt.branch.toLowerCase().includes((branchName || '').toLowerCase())\n )\n .map(wt => wt.branch?.replace('refs/heads/', '') || '')\n .filter(Boolean)\n\n throw ErrorFactory.worktreeNotFound(branchName || '', similarBranches)\n }\n\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n console.log(chalk.green(`\\n🎼 演奏者 '${chalk.cyan(branchName)}' に入ります...`))\n console.log(chalk.gray(`📁 ${formatPath(targetWorktree.path, config)}\\n`))\n\n // --cmd オプションの処理\n if (options.cmd) {\n console.log(chalk.blue(`🔧 コマンド実行: ${options.cmd}`))\n try {\n const result = await execa(options.cmd, [], {\n cwd: targetWorktree.path,\n stdio: 'inherit',\n shell: true,\n env: {\n ...process.env,\n MAESTRO_BRANCH: branchName,\n MAESTRO_PATH: targetWorktree.path,\n },\n })\n console.log(chalk.green(`\\n✅ コマンド実行完了 (exit code: ${result.exitCode})`))\n } catch (error) {\n console.error(\n chalk.red(\n `❌ コマンド実行失敗: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n process.exit(1)\n }\n return\n }\n\n // tmuxオプションの処理\n if (isUsingTmux) {\n let paneType: TmuxPaneType = 'new-window'\n if (options.tmuxVertical) paneType = 'vertical-split'\n if (options.tmuxHorizontal) paneType = 'horizontal-split'\n\n // --tmux オプション(既存のセッション管理)の処理\n if (options.tmux) {\n const sessionName = `maestro-${branchName}`\n\n try {\n // 既存のtmuxセッションがあるかチェック\n const existingSessions = await execa(\n 'tmux',\n ['list-sessions', '-F', '#{session_name}'],\n {\n reject: false,\n }\n )\n\n const sessionExists = existingSessions.stdout\n .split('\\n')\n .some(name => name.trim() === sessionName)\n\n if (sessionExists) {\n console.log(chalk.blue(`📺 既存のtmuxセッション '${sessionName}' にアタッチします`))\n await attachToTmuxWithProperTTY(sessionName)\n console.log(chalk.gray('\\ntmuxセッションから戻りました'))\n } else {\n console.log(chalk.blue(`📺 新しいtmuxセッション '${sessionName}' を作成します`))\n\n // 環境変数を設定\n process.env.MAESTRO_BRANCH = branchName\n process.env.MAESTRO_PATH = targetWorktree.path\n\n await createAndAttachTmuxSession(sessionName, targetWorktree.path)\n console.log(chalk.gray('\\ntmuxセッションから戻りました'))\n }\n } catch (error) {\n console.error(\n chalk.red(\n `❌ tmuxセッション処理に失敗: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n console.log(chalk.yellow('通常のシェルで起動します...'))\n // tmuxが失敗した場合は通常のシェルで起動\n startNormalShell()\n }\n return\n } else {\n // --tmux-v, --tmux-h オプションの処理\n console.log(\n chalk.green(`\\n🎼 演奏者 '${chalk.cyan(branchName)}' でtmux ${paneType}シェルを開始`)\n )\n console.log(chalk.gray(`📁 ${formatPath(targetWorktree.path, config)}\\n`))\n\n try {\n await startTmuxShell({\n cwd: targetWorktree.path,\n branchName,\n paneType,\n sessionName: branchName,\n })\n } catch (error) {\n console.error(\n chalk.red(\n `❌ tmux ${paneType}の起動に失敗: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n console.log(chalk.yellow('通常のシェルで起動します...'))\n // tmuxが失敗した場合は通常のシェルで起動\n startNormalShell()\n }\n return\n }\n }\n\n // 通常のシェル起動\n startNormalShell()\n\n function startNormalShell() {\n if (!targetWorktree) {\n console.error(chalk.red('エラー: targetWorktreeが未定義です'))\n process.exit(1)\n }\n\n // シェルを自動判定\n const shell = getShell()\n const shellEnv = getShellEnv(shell, branchName!)\n\n console.log(chalk.blue(`🐚 シェル: ${shell}`))\n const shellProcess = spawn(shell, [], {\n cwd: targetWorktree.path,\n stdio: 'inherit',\n env: {\n ...process.env,\n ...shellEnv,\n MAESTRO_BRANCH: branchName,\n MAESTRO_PATH: targetWorktree.path,\n },\n })\n\n shellProcess.on('exit', code => {\n console.log(chalk.gray(`\\n演奏者から戻りました (exit code: ${code})`))\n })\n }\n\n function getShell(): string {\n const shell = process.env.SHELL || '/bin/bash'\n return shell\n }\n\n function getShellEnv(shell: string, branchName: string): Record<string, string> {\n const shellName = shell.split('/').pop() || 'bash'\n\n switch (shellName) {\n case 'zsh':\n return {\n PS1: `${chalk.magenta('🎼')} [${chalk.cyan(branchName)}] ${chalk.yellow('%~')} $ `,\n PROMPT: `${chalk.magenta('🎼')} [${chalk.cyan(branchName)}] ${chalk.yellow('%~')} $ `,\n }\n case 'fish':\n return {\n fish_prompt: `echo \"${chalk.magenta('🎼')} [${chalk.cyan(branchName)}] ${chalk.yellow('(prompt_pwd)')} $ \"`,\n }\n case 'bash':\n default:\n return {\n PS1: `${chalk.magenta('🎼')} [${chalk.cyan(branchName)}] ${chalk.yellow('\\\\W')} $ `,\n }\n }\n }\n } catch (error) {\n handleError(error, 'shell')\n }\n })\n","/**\n * maestro用の統一エラークラス\n */\n\n/* eslint-disable no-unused-vars */\nexport enum ErrorCode {\n // Git関連\n NOT_GIT_REPOSITORY = 'NOT_GIT_REPOSITORY',\n WORKTREE_NOT_FOUND = 'WORKTREE_NOT_FOUND',\n WORKTREE_ALREADY_EXISTS = 'WORKTREE_ALREADY_EXISTS',\n\n // 外部ツール関連\n EXTERNAL_TOOL_NOT_FOUND = 'EXTERNAL_TOOL_NOT_FOUND',\n\n // GitHub関連\n GITHUB_AUTH_REQUIRED = 'GITHUB_AUTH_REQUIRED',\n\n // 一般的なエラー\n OPERATION_CANCELLED = 'OPERATION_CANCELLED',\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n NETWORK_ERROR = 'NETWORK_ERROR',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n/* eslint-enable no-unused-vars */\n\ninterface SolutionSuggestion {\n message: string\n command?: string\n url?: string\n}\n\nexport class MaestroError extends Error {\n public readonly code: ErrorCode\n public readonly suggestions: SolutionSuggestion[]\n public readonly originalError?: Error\n\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.UNKNOWN_ERROR,\n suggestions: SolutionSuggestion[] = [],\n originalError?: Error\n ) {\n super(message)\n this.name = 'MaestroError'\n this.code = code\n this.suggestions = suggestions\n this.originalError = originalError\n\n // Error.captureStackTraceが利用可能な場合に使用\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, MaestroError)\n }\n }\n\n /**\n * エラーメッセージとその解決策を整形して返す\n */\n getFormattedMessage(): string {\n let message = `エラー: ${this.message}`\n\n if (this.suggestions.length > 0) {\n message += '\\n\\n解決方法:'\n this.suggestions.forEach((suggestion, index) => {\n message += `\\n ${index + 1}. ${suggestion.message}`\n if (suggestion.command) {\n message += `\\n 実行: ${suggestion.command}`\n }\n if (suggestion.url) {\n message += `\\n 参考: ${suggestion.url}`\n }\n })\n }\n\n return message\n }\n}\n\n/**\n * 一般的なエラーパターンのファクトリ関数\n */\nexport class ErrorFactory {\n static notGitRepository(path?: string): MaestroError {\n return new MaestroError(\n path\n ? `${path} はGitリポジトリではありません`\n : 'このディレクトリはGitリポジトリではありません',\n ErrorCode.NOT_GIT_REPOSITORY,\n [\n {\n message: 'Gitリポジトリを初期化する',\n command: 'git init',\n },\n {\n message: '既存のリポジトリをクローンする',\n command: 'git clone <repository-url>',\n },\n ]\n )\n }\n\n static worktreeNotFound(branch: string, similar?: string[]): MaestroError {\n const suggestions: SolutionSuggestion[] = [\n {\n message: '演奏者を招集する',\n command: `maestro create ${branch}`,\n },\n ]\n\n if (similar && similar.length > 0) {\n suggestions.unshift({\n message: `類似した演奏者: ${similar.join(', ')}`,\n })\n }\n\n return new MaestroError(\n `演奏者 '${branch}' が見つかりません`,\n ErrorCode.WORKTREE_NOT_FOUND,\n suggestions\n )\n }\n\n static worktreeAlreadyExists(branch: string, path: string): MaestroError {\n return new MaestroError(\n `演奏者 '${branch}' は既に存在します: ${path}`,\n ErrorCode.WORKTREE_ALREADY_EXISTS,\n [\n {\n message: '既存の演奏者を解散してから再招集する',\n command: `maestro delete ${branch}`,\n },\n {\n message: '既存の演奏者に移動する',\n command: `maestro shell ${branch}`,\n },\n ]\n )\n }\n\n static externalToolNotFound(tool: string, installCommand?: string, url?: string): MaestroError {\n const suggestions: SolutionSuggestion[] = []\n\n if (installCommand) {\n suggestions.push({\n message: `${tool}をインストールする`,\n command: installCommand,\n })\n }\n\n if (url) {\n suggestions.push({\n message: '公式サイトからダウンロード',\n url,\n })\n }\n\n return new MaestroError(\n `${tool} が見つかりません`,\n ErrorCode.EXTERNAL_TOOL_NOT_FOUND,\n suggestions\n )\n }\n\n static githubAuthRequired(): MaestroError {\n return new MaestroError('GitHub CLIが認証されていません', ErrorCode.GITHUB_AUTH_REQUIRED, [\n {\n message: 'GitHub CLIで認証する',\n command: 'gh auth login',\n },\n {\n message: 'GitHub CLIをインストールする',\n command: 'brew install gh',\n url: 'https://cli.github.com/',\n },\n ])\n }\n\n static operationCancelled(operation?: string): MaestroError {\n return new MaestroError(\n operation ? `${operation}がキャンセルされました` : '操作がキャンセルされました',\n ErrorCode.OPERATION_CANCELLED\n )\n }\n\n static validationError(field: string, value: unknown, expected: string): MaestroError {\n return new MaestroError(\n `不正な値: ${field} = '${value}' (期待値: ${expected})`,\n ErrorCode.VALIDATION_ERROR\n )\n }\n\n static networkError(operation: string, originalError?: Error): MaestroError {\n return new MaestroError(\n `ネットワークエラー: ${operation}`,\n ErrorCode.NETWORK_ERROR,\n [\n {\n message: 'インターネット接続を確認してください',\n },\n {\n message: 'プロキシ設定を確認してください',\n },\n ],\n originalError\n )\n }\n\n static fromError(error: Error): MaestroError {\n if (error instanceof MaestroError) {\n return error\n }\n\n // 既知のエラーパターンを検出\n const message = error.message.toLowerCase()\n\n if (message.includes('not a git repository')) {\n return ErrorFactory.notGitRepository()\n }\n\n if (message.includes('permission denied')) {\n return new MaestroError(\n `権限エラー: ${error.message}`,\n ErrorCode.PERMISSION_DENIED,\n [\n {\n message: 'ファイル・ディレクトリの権限を確認してください',\n },\n ],\n error\n )\n }\n\n if (message.includes('command not found') || message.includes('not found')) {\n return new MaestroError(\n `コマンドが見つかりません: ${error.message}`,\n ErrorCode.EXTERNAL_TOOL_NOT_FOUND,\n [],\n error\n )\n }\n\n // 一般的なエラーとして扱う\n return new MaestroError(error.message, ErrorCode.UNKNOWN_ERROR, [], error)\n }\n}\n\n/**\n * エラーハンドリングのユーティリティ関数\n */\nexport function handleError(error: unknown, context?: string): never {\n const maestroError =\n error instanceof MaestroError\n ? error\n : ErrorFactory.fromError(error instanceof Error ? error : new Error(String(error)))\n\n if (context) {\n console.error(`[${context}] ${maestroError.getFormattedMessage()}`)\n } else {\n console.error(maestroError.getFormattedMessage())\n }\n\n process.exit(1)\n}\n\n/**\n * エラーをキャッチして適切にハンドリングするデコレーター\n */\n/* eslint-disable no-unused-vars */\nexport function withErrorHandling<T extends unknown[], R>(\n fn: (...args: T) => Promise<R>,\n context?: string\n) {\n return async (...args: T): Promise<R> => {\n try {\n return await fn(...args)\n } catch (error) {\n handleError(error, context)\n }\n }\n}\n/* eslint-enable no-unused-vars */\n","import { spawn } from 'child_process'\nimport chalk from 'chalk'\nimport { Worktree } from '../types/index.js'\n\n/**\n * fzfでworktreeを選択\n */\nexport async function selectWorktreeWithFzf(\n orchestraMembers: Worktree[],\n header: string = '演奏者を選択 (Ctrl-C でキャンセル)'\n): Promise<string | null> {\n const fzfInput = orchestraMembers\n .map(w => {\n const status = []\n if (w.locked) status.push(chalk.red('ロック'))\n if (w.prunable) status.push(chalk.yellow('削除可能'))\n\n const statusStr = status.length > 0 ? ` [${status.join(', ')}]` : ''\n const branch = w.branch?.replace('refs/heads/', '') || w.branch\n return `${branch}${statusStr} | ${w.path}`\n })\n .join('\\n')\n\n const fzfProcess = spawn(\n 'fzf',\n [\n '--ansi',\n '--header',\n header,\n '--preview',\n 'echo {} | cut -d\"|\" -f2 | xargs ls -la',\n '--preview-window=right:50%:wrap',\n ],\n {\n stdio: ['pipe', 'pipe', 'inherit'],\n }\n )\n\n // fzfにデータを送る\n fzfProcess.stdin.write(fzfInput)\n fzfProcess.stdin.end()\n\n // 選択結果を取得\n let selected = ''\n fzfProcess.stdout.on('data', data => {\n selected += data.toString()\n })\n\n return new Promise<string | null>(resolve => {\n fzfProcess.on('close', code => {\n if (code !== 0 || !selected.trim()) {\n resolve(null) // キャンセルされた\n } else {\n // ブランチ名を抽出\n const branchName = selected\n .split('|')[0]\n ?.trim()\n .replace(/\\[.*\\]/, '')\n .trim()\n resolve(branchName || null)\n }\n })\n })\n}\n\n/**\n * fzfが利用可能かチェック\n */\nexport async function isFzfAvailable(): Promise<boolean> {\n try {\n const fzfProcess = spawn('fzf', ['--version'], {\n stdio: ['ignore', 'ignore', 'ignore'],\n })\n\n return new Promise<boolean>(resolve => {\n fzfProcess.on('close', code => {\n resolve(code === 0)\n })\n fzfProcess.on('error', () => {\n resolve(false)\n })\n })\n } catch {\n return false\n }\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { ConfigManager } from '../core/config.js'\nimport { execa } from 'execa'\nimport ora from 'ora'\nimport { Worktree } from '../types/index.js'\nimport { executeTmuxCommandInPane, isInTmuxSession, TmuxPaneType } from '../utils/tmux.js'\nimport { selectWorktreeWithFzf, isFzfAvailable } from '../utils/fzf.js'\nimport { formatPath } from '../utils/path.js'\n\n// すべての演奏者でコマンドを実行\nasync function executeOnAllMembers(\n orchestraMembers: Worktree[],\n command: string,\n silent?: boolean\n): Promise<void> {\n console.log(chalk.bold(`\\n🎼 すべての演奏者でコマンドを実行: ${chalk.cyan(command)}\\n`))\n\n for (const worktree of orchestraMembers) {\n const branchName = worktree.branch?.replace('refs/heads/', '') || worktree.branch\n console.log(chalk.green(`▶ ${branchName}`))\n\n try {\n const result = await execa('sh', ['-c', command], {\n cwd: worktree.path,\n env: {\n ...process.env,\n MAESTRO_BRANCH: branchName,\n MAESTRO_PATH: worktree.path,\n },\n })\n\n if (!silent) {\n if (result.stdout) console.log(result.stdout)\n if (result.stderr) console.error(chalk.yellow(result.stderr))\n }\n console.log()\n } catch (error) {\n if (error instanceof Error && 'exitCode' in error) {\n console.error(chalk.red(` エラー (exit code: ${error.exitCode})`))\n if (!silent && 'stderr' in error && error.stderr) {\n console.error(chalk.red(error.stderr))\n }\n }\n console.log()\n }\n }\n}\n\n// 類似のブランチ名を提案\nfunction suggestSimilarBranches(orchestraMembers: Worktree[], branchName: string): void {\n const similarBranches = orchestraMembers\n .filter(wt => {\n const branch = wt.branch?.replace('refs/heads/', '') || ''\n return branch.includes(branchName)\n })\n .map(wt => wt.branch?.replace('refs/heads/', '') || wt.branch)\n\n if (similarBranches.length > 0) {\n console.log(chalk.yellow('\\n類似した演奏者:'))\n similarBranches.forEach(branch => {\n console.log(` - ${chalk.cyan(branch)}`)\n })\n }\n}\n\n// 特定の演奏者でコマンドを実行\nasync function executeOnSpecificMember(\n targetWorktree: Worktree,\n command: string,\n silent?: boolean\n): Promise<void> {\n const displayBranchName =\n targetWorktree.branch?.replace('refs/heads/', '') || targetWorktree.branch\n\n if (!silent) {\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n console.log(chalk.green(`\\n🎼 演奏者 '${chalk.cyan(displayBranchName)}' でコマンドを実行`))\n console.log(chalk.gray(`📁 ${formatPath(targetWorktree.path, config)}`))\n console.log(chalk.gray(`$ ${command}\\n`))\n }\n\n const spinner = silent ? null : ora('実行中...').start()\n\n try {\n const result = await execa('sh', ['-c', command], {\n cwd: targetWorktree.path,\n env: {\n ...process.env,\n MAESTRO_BRANCH: displayBranchName,\n MAESTRO_PATH: targetWorktree.path,\n },\n })\n\n if (spinner) spinner.succeed('完了')\n\n if (!silent) {\n if (result.stdout) console.log('\\n' + result.stdout)\n if (result.stderr) console.error('\\n' + chalk.yellow(result.stderr))\n }\n } catch (error) {\n if (spinner) spinner.fail('失敗')\n\n if (error instanceof Error && 'exitCode' in error) {\n console.error(chalk.red(`\\nコマンドが失敗しました (exit code: ${error.exitCode})`))\n if (!silent && 'stderr' in error && error.stderr) {\n console.error(chalk.red(error.stderr))\n }\n process.exit(error.exitCode as number)\n }\n throw error\n }\n}\n\ninterface ExecOptions {\n silent?: boolean\n all?: boolean\n fzf?: boolean\n tmux?: boolean\n tmuxVertical?: boolean\n tmuxHorizontal?: boolean\n}\n\nexport const execCommand = new Command('exec')\n .alias('e')\n .description('演奏者でコマンドを実行')\n .argument('[branch-name]', 'ブランチ名(省略時またはfzfオプション時は選択)')\n .argument('[command...]', '実行するコマンド')\n .option('-s, --silent', '出力を抑制')\n .option('-a, --all', 'すべての演奏者で実行')\n .option('--fzf', 'fzfで演奏者を選択')\n .option('-t, --tmux', 'tmuxの新しいウィンドウで実行')\n .option('--tmux-vertical, --tmux-v', 'tmuxの縦分割ペインで実行')\n .option('--tmux-horizontal, --tmux-h', 'tmuxの横分割ペインで実行')\n .exitOverride()\n .action(\n async (branchName: string | undefined, commandParts: string[], options: ExecOptions = {}) => {\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n console.error(chalk.red('エラー: このディレクトリはGitリポジトリではありません'))\n process.exit(1)\n }\n\n const worktrees = await gitManager.listWorktrees()\n const orchestraMembers = worktrees.filter(wt => !wt.path.endsWith('.'))\n\n if (orchestraMembers.length === 0) {\n console.log(chalk.yellow('演奏者が存在しません'))\n console.log(chalk.gray('maestro create <branch-name> で演奏者を招集してください'))\n process.exit(0)\n }\n\n // --allオプションの処理\n let actualBranchName = branchName\n let actualCommandParts = commandParts\n let isAllMode = options.all\n\n if (options.all) {\n isAllMode = true\n actualBranchName = undefined\n\n // Issue #72対応: branchNameが実際のブランチ名でない場合はコマンドの一部として扱う\n const isValidBranch =\n branchName &&\n orchestraMembers.some(wt => {\n const branch = wt.branch?.replace('refs/heads/', '')\n return branch === branchName || wt.branch === branchName\n })\n\n if (isValidBranch) {\n // branchNameが実際のブランチの場合: 従来の動作(ブランチ名を無視)\n actualCommandParts = commandParts\n } else if (branchName) {\n // branchNameが実際のブランチでない場合: コマンドの一部として扱う\n actualCommandParts = [branchName, ...commandParts]\n } else {\n // branchNameがundefinedの場合\n actualCommandParts = commandParts\n }\n }\n\n // コマンドを結合\n const command = actualCommandParts.join(' ')\n if (!command && !isAllMode) {\n console.error(chalk.red('エラー: 実行するコマンドを指定してください'))\n process.exit(1)\n }\n\n // --allオプションの処理\n if (isAllMode) {\n await executeOnAllMembers(orchestraMembers, command, options.silent)\n return\n }\n\n // tmuxオプションの検証\n const tmuxOptionsCount = [\n options.tmux,\n options.tmuxVertical,\n options.tmuxHorizontal,\n ].filter(Boolean).length\n if (tmuxOptionsCount > 1) {\n console.error(chalk.red('エラー: tmuxオプションは一つだけ指定してください'))\n process.exit(1)\n }\n\n const isUsingTmux = options.tmux || options.tmuxVertical || options.tmuxHorizontal\n if (isUsingTmux && !(await isInTmuxSession())) {\n console.error(\n chalk.red('エラー: tmuxオプションを使用するにはtmuxセッション内にいる必要があります')\n )\n process.exit(1)\n }\n\n // ブランチ名が指定されていない場合またはfzfオプションが指定された場合\n if (!actualBranchName || options?.fzf) {\n if (options?.fzf) {\n // fzfの利用可能性をチェック\n if (!(await isFzfAvailable())) {\n console.error(chalk.red('エラー: fzfがインストールされていません'))\n process.exit(1)\n }\n\n const selectedBranch = await selectWorktreeWithFzf(\n orchestraMembers,\n 'コマンドを実行する演奏者を選択 (Ctrl-C でキャンセル)'\n )\n\n if (!selectedBranch) {\n console.log(chalk.gray('キャンセルされました'))\n process.exit(0)\n }\n\n actualBranchName = selectedBranch\n } else {\n console.error(\n chalk.red('エラー: ブランチ名を指定するか --fzf オプションを使用してください')\n )\n process.exit(1)\n }\n }\n\n const targetWorktree = orchestraMembers.find(wt => {\n const branch = wt.branch?.replace('refs/heads/', '')\n return branch === actualBranchName || wt.branch === actualBranchName\n })\n\n if (!targetWorktree) {\n console.error(chalk.red(`エラー: 演奏者 '${actualBranchName}' が見つかりません`))\n suggestSimilarBranches(orchestraMembers, actualBranchName)\n process.exit(1)\n }\n\n // tmuxでの実行\n if (isUsingTmux) {\n const displayBranchName =\n targetWorktree.branch?.replace('refs/heads/', '') || targetWorktree.branch\n\n let paneType: TmuxPaneType = 'new-window'\n if (options.tmuxVertical) paneType = 'vertical-split'\n if (options.tmuxHorizontal) paneType = 'horizontal-split'\n\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n console.log(\n chalk.green(\n `\\n🎼 演奏者 '${chalk.cyan(displayBranchName)}' でtmux ${paneType}コマンドを実行`\n )\n )\n console.log(chalk.gray(`📁 ${formatPath(targetWorktree.path, config)}`))\n console.log(chalk.gray(`$ ${command}\\n`))\n\n await executeTmuxCommandInPane(command, {\n cwd: targetWorktree.path,\n branchName: displayBranchName,\n paneType,\n sessionName: displayBranchName,\n })\n\n return\n }\n\n // 通常の実行\n await executeOnSpecificMember(targetWorktree, command, options.silent)\n } catch (error) {\n console.error(chalk.red('エラー:'), error instanceof Error ? error.message : '不明なエラー')\n process.exit(1)\n }\n }\n )\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { execa } from 'execa'\nimport { spawn } from 'child_process'\nimport { detectPackageManager } from '../utils/packageManager.js'\n\n// 利用可能なブランチを取得\nasync function getAvailableBranches(\n gitManager: GitWorktreeManager,\n includeRemote: boolean\n): Promise<string[]> {\n const branches = await gitManager.getAllBranches()\n const worktrees = await gitManager.listWorktrees()\n const attachedBranches = worktrees\n .map(wt => wt.branch?.replace('refs/heads/', ''))\n .filter(Boolean)\n\n let availableBranches = branches.local.filter(b => !attachedBranches.includes(b))\n\n if (includeRemote) {\n const remoteAvailable = branches.remote.filter(\n b => !attachedBranches.includes(b.split('/').slice(1).join('/'))\n )\n availableBranches = [...availableBranches, ...remoteAvailable]\n }\n\n return availableBranches\n}\n\n// ブランチを選択\nasync function selectBranch(availableBranches: string[]): Promise<string> {\n const { selectedBranch } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedBranch',\n message: 'どのブランチから演奏者を招集しますか?',\n choices: availableBranches.map(branch => ({\n name: branch.includes('origin/')\n ? `${chalk.yellow('[remote]')} ${chalk.cyan(branch)}`\n : `${chalk.green('[local]')} ${chalk.cyan(branch)}`,\n value: branch,\n })),\n pageSize: 15,\n },\n ])\n return selectedBranch\n}\n\n// ブランチの存在を確認\nfunction validateBranchExists(branchName: string, availableBranches: string[]): void {\n if (!availableBranches.includes(branchName)) {\n console.error(chalk.red(`エラー: ブランチ '${branchName}' が見つかりません`))\n\n const similarBranches = availableBranches.filter(b => b.includes(branchName))\n if (similarBranches.length > 0) {\n console.log(chalk.yellow('\\n利用可能なブランチ:'))\n similarBranches.forEach(branch => {\n console.log(` - ${chalk.cyan(branch)}`)\n })\n }\n\n process.exit(1)\n }\n}\n\n// 環境セットアップを実行\nasync function setupEnvironment(worktreePath: string): Promise<void> {\n const packageManager = detectPackageManager(worktreePath)\n const setupSpinner = ora('環境をセットアップ中...').start()\n\n try {\n await execa(packageManager, ['install'], { cwd: worktreePath })\n setupSpinner.succeed(`${packageManager} install 完了`)\n } catch {\n setupSpinner.warn(`${packageManager} install をスキップ`)\n }\n}\n\n// エディタで開く\nasync function openInEditor(worktreePath: string): Promise<void> {\n const openSpinner = ora('エディタで開いています...').start()\n try {\n await execa('cursor', [worktreePath])\n openSpinner.succeed('Cursorで開きました')\n } catch {\n try {\n await execa('code', [worktreePath])\n openSpinner.succeed('VSCodeで開きました')\n } catch {\n openSpinner.warn('エディタが見つかりません')\n }\n }\n}\n\nexport const attachCommand = new Command('attach')\n .alias('a')\n .description('既存のブランチから演奏者を招集する')\n .argument('[branch-name]', 'ブランチ名(省略時は選択)')\n .option('-r, --remote', 'リモートブランチも含める')\n .option('-f, --fetch', '最初にfetchを実行')\n .option('-o, --open', 'VSCode/Cursorで開く')\n .option('-s, --setup', '環境セットアップを実行')\n .option('--shell', 'アタッチ後にシェルに入る')\n .option('--exec <command>', 'アタッチ後にコマンドを実行')\n .exitOverride()\n .action(\n async (\n branchName?: string,\n options: {\n remote?: boolean\n fetch?: boolean\n open?: boolean\n setup?: boolean\n shell?: boolean\n exec?: string\n } = {}\n ) => {\n const spinner = ora('オーケストレーション!').start()\n\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n spinner.fail('このディレクトリはGitリポジトリではありません')\n process.exit(1)\n }\n\n if (options?.fetch) {\n spinner.text = 'リモートから最新情報を取得中...'\n await gitManager.fetchAll()\n }\n\n spinner.text = 'ブランチ一覧を取得中...'\n const availableBranches = await getAvailableBranches(gitManager, options?.remote || false)\n\n if (availableBranches.length === 0) {\n spinner.fail('利用可能なブランチがありません')\n console.log(chalk.yellow('すべてのブランチは既に演奏者として存在します'))\n process.exit(0)\n }\n\n spinner.stop()\n\n if (!branchName) {\n branchName = await selectBranch(availableBranches)\n } else {\n validateBranchExists(branchName, availableBranches)\n }\n\n spinner.start(`演奏者を招集中...`)\n\n // ワークツリーを作成\n const worktreePath = await gitManager.attachWorktree(branchName || '')\n\n spinner.succeed(\n `演奏者 '${chalk.cyan(branchName)}' を招集しました!\\n` +\n ` 📁 ${chalk.gray(worktreePath)}`\n )\n\n if (options?.setup) {\n await setupEnvironment(worktreePath)\n }\n\n if (options?.open) {\n await openInEditor(worktreePath)\n }\n\n // --execオプションの処理\n if (options?.exec) {\n console.log(chalk.cyan(`\\n🎵 コマンドを実行中: ${options.exec}`))\n try {\n await execa(options.exec, [], {\n cwd: worktreePath,\n shell: true,\n stdio: 'inherit',\n })\n } catch (error) {\n console.error(\n chalk.red(\n `コマンドの実行に失敗しました: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n process.exit(1)\n }\n }\n\n // --shellオプションの処理\n if (options?.shell) {\n console.log(chalk.cyan('\\n🎵 シェルに入ります...'))\n const shell = process.env.SHELL || '/bin/bash'\n const child = spawn(shell, [], {\n cwd: worktreePath,\n stdio: 'inherit',\n env: {\n ...process.env,\n MAESTRO: '1',\n MAESTRO_NAME: branchName || '',\n MAESTRO_PATH: worktreePath,\n },\n })\n\n child.on('exit', () => {\n console.log(chalk.gray('\\nシェルから退出しました'))\n })\n\n // プロセスが終了するまで待つ\n await new Promise<void>(resolve => {\n child.on('exit', resolve)\n })\n }\n\n if (!options?.shell && !options?.exec) {\n console.log(chalk.green('\\n✨ 演奏者の招集が完了しました!'))\n console.log(chalk.gray(`\\ncd ${worktreePath} で移動できます`))\n }\n } catch (error) {\n spinner.fail('演奏者を招集できませんでした')\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exit(1)\n }\n }\n )\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { ConfigManager } from '../core/config.js'\nimport inquirer from 'inquirer'\nimport fs from 'fs/promises'\nimport path from 'path'\n\n// Helper functions to reduce complexity\nasync function handleInitAction(configManager: ConfigManager): Promise<void> {\n const { createConfig } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'createConfig',\n message: 'プロジェクト設定ファイル (.maestro.json) を作成しますか?',\n default: true,\n },\n ])\n\n if (!createConfig) {\n console.log(chalk.gray('キャンセルされました'))\n return\n }\n\n try {\n await configManager.createProjectConfig()\n console.log(chalk.green('✅ .maestro.json を作成しました'))\n console.log(\n chalk.gray('\\n設定ファイルを編集して、プロジェクトに合わせてカスタマイズしてください')\n )\n } catch (error) {\n console.error(chalk.red('設定ファイルの作成に失敗しました:'), error)\n }\n}\n\nasync function handleShowAction(\n configManager: ConfigManager,\n options?: { global?: boolean }\n): Promise<void> {\n const config = configManager.getAll()\n console.log(chalk.bold('\\n🎼 maestro 設定:\\n'))\n console.log(JSON.stringify(config, null, 2))\n\n if (options?.global) {\n console.log(chalk.gray(`\\nグローバル設定: ${configManager.getConfigPath()}`))\n }\n}\n\nasync function handlePathAction(configManager: ConfigManager): Promise<void> {\n console.log(chalk.bold('設定ファイルのパス:\\n'))\n\n // グローバル設定\n console.log(chalk.green('グローバル設定:'))\n console.log(` ${configManager.getConfigPath()}`)\n\n // プロジェクト設定\n console.log(chalk.green('\\nプロジェクト設定 (優先度順):'))\n const configPaths = ['.maestro.json', '.maestrorc.json', 'maestro.config.json']\n\n for (const configFile of configPaths) {\n const configPath = path.join(process.cwd(), configFile)\n try {\n await fs.access(configPath)\n console.log(` ✅ ${configPath}`)\n } catch {\n console.log(` ❌ ${configPath} ${chalk.gray('(存在しません)')}`)\n }\n }\n}\n\nfunction handleGetAction(configManager: ConfigManager, key?: string): void {\n if (!key) {\n console.error(chalk.red('設定キーを指定してください'))\n console.log(chalk.gray('使用例: maestro config get ui.pathDisplay'))\n return\n }\n\n const value = configManager.getConfigValue(key)\n if (value === undefined) {\n console.log(chalk.gray(`設定値が見つかりません: ${key}`))\n } else if (typeof value === 'object') {\n console.log(JSON.stringify(value, null, 2))\n } else {\n console.log(value)\n }\n}\n\nasync function handleSetAction(\n configManager: ConfigManager,\n key?: string,\n value?: string,\n options?: { user?: boolean; project?: boolean }\n): Promise<void> {\n if (!key || value === undefined) {\n console.error(chalk.red('設定キーと値を指定してください'))\n console.log(chalk.gray('使用例: maestro config set ui.pathDisplay relative'))\n console.log(chalk.gray('使用例: maestro config set --user ui.pathDisplay relative'))\n console.log(chalk.gray('使用例: maestro config set --project worktrees.path \"../\"'))\n return\n }\n\n try {\n // ユーザー設定向きの設定かどうかを判定\n const isUserSetting = key.startsWith('ui.') || key.startsWith('development.defaultEditor')\n\n let target: 'user' | 'project'\n if (options?.user) {\n target = 'user'\n } else if (options?.project) {\n target = 'project'\n } else {\n // 自動判定:UI設定はユーザー設定、それ以外はプロジェクト設定\n target = isUserSetting ? 'user' : 'project'\n }\n\n await configManager.setConfigValue(key, value, target)\n\n const targetName = target === 'user' ? 'ユーザー設定' : 'プロジェクト設定'\n const targetFile = target === 'user' ? '.maestro.local.json' : '.maestro.json'\n console.log(chalk.green(`✅ ${key} を ${value} に設定しました (${targetName}: ${targetFile})`))\n\n if (\n target === 'user' &&\n !key.startsWith('ui.') &&\n !key.startsWith('development.defaultEditor')\n ) {\n console.log(\n chalk.yellow(\n '⚠️ この設定はプロジェクト全体で共有される設定です。--project フラグの使用を検討してください。'\n )\n )\n }\n } catch (error) {\n console.error(chalk.red('設定の更新に失敗しました:'), error)\n }\n}\n\nasync function handleResetAction(configManager: ConfigManager, key?: string): Promise<void> {\n if (!key) {\n console.error(chalk.red('設定キーを指定してください'))\n console.log(chalk.gray('使用例: maestro config reset ui.pathDisplay'))\n return\n }\n\n try {\n await configManager.resetConfigValue(key)\n console.log(chalk.green(`✅ ${key} をデフォルト値にリセットしました`))\n\n // リセット後の値を表示\n const currentValue = configManager.getConfigValue(key)\n if (currentValue !== undefined) {\n console.log(chalk.gray(`現在の値: ${currentValue}`))\n }\n } catch (error) {\n console.error(chalk.red('設定のリセットに失敗しました:'), error)\n }\n}\n\nfunction showUsage(): void {\n console.log(chalk.yellow('使い方:'))\n console.log(' maestro config init # プロジェクト設定ファイルを作成')\n console.log(' maestro config show # 現在の設定を表示')\n console.log(' maestro config path # 設定ファイルのパスを表示')\n console.log(' maestro config get <key> # 設定値を取得')\n console.log(' maestro config set <key> <value> # 設定値を設定')\n console.log(' maestro config reset <key> # 設定値をリセット')\n console.log(chalk.gray('\\n使用例:'))\n console.log(' maestro config get ui.pathDisplay')\n console.log(' maestro config set ui.pathDisplay relative # 自動判定(ユーザー設定)')\n console.log(\n ' maestro config set --user ui.pathDisplay relative # ユーザー設定(.maestro.local.json)'\n )\n console.log(\n ' maestro config set --project worktrees.path \"../\" # プロジェクト設定(.maestro.json)'\n )\n console.log(' maestro config reset ui.pathDisplay')\n console.log(chalk.gray('\\nオプション:'))\n console.log(' -g, --global # グローバル設定を対象にする')\n console.log(' -u, --user # ユーザー設定(.maestro.local.json)を対象にする')\n console.log(' -p, --project # プロジェクト設定(.maestro.json)を対象にする')\n console.log(chalk.gray('\\n設定カテゴリ:'))\n console.log(chalk.green(' ユーザー設定(gitignored):'))\n console.log(' ui.* # UI表示設定')\n console.log(' development.defaultEditor # デフォルトエディタ')\n console.log(chalk.green(' プロジェクト設定(git追跡):'))\n console.log(' worktrees.* # worktree設定')\n console.log(' hooks.* # フック設定')\n console.log(' claude.* # Claude統合設定')\n}\n\nexport const configCommand = new Command('config')\n .description('設定を管理')\n .argument('[action]', 'アクション (init, show, path, get, set, reset)')\n .argument('[key]', '設定キー(ドット記法)')\n .argument('[value]', '設定値(setアクションの場合)')\n .option('-g, --global', 'グローバル設定を対象にする')\n .option('-u, --user', 'ユーザー設定(.maestro.local.json)を対象にする')\n .option('-p, --project', 'プロジェクト設定(.maestro.json)を対象にする')\n .exitOverride()\n .action(\n async (\n action?: string,\n key?: string,\n value?: string,\n options?: { global?: boolean; user?: boolean; project?: boolean }\n ) => {\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n\n switch (action) {\n case 'init':\n await handleInitAction(configManager)\n break\n\n case 'show':\n await handleShowAction(configManager, options)\n break\n\n case 'path':\n await handlePathAction(configManager)\n break\n\n case 'get':\n handleGetAction(configManager, key)\n break\n\n case 'set':\n await handleSetAction(configManager, key, value, options)\n break\n\n case 'reset':\n await handleResetAction(configManager, key)\n break\n\n default:\n showUsage()\n }\n }\n )\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { ConfigManager } from '../core/config.js'\nimport { execa } from 'execa'\nimport path from 'path'\nimport fs from 'fs/promises'\nimport { isInTmuxSession } from '../utils/tmux.js'\nimport { createTmuxSession, validateTmuxOptions } from '../utils/tmuxSession.js'\nimport { detectPackageManager } from '../utils/packageManager.js'\nimport { formatPath } from '../utils/path.js'\nimport { saveWorktreeMetadata } from './create.js'\n\n// 型定義\ninterface GithubOptions {\n open?: boolean\n setup?: boolean\n message?: string\n reopen?: boolean\n close?: boolean\n tmux?: boolean\n tmuxVertical?: boolean\n tmuxHorizontal?: boolean\n tmuxH?: boolean\n tmuxV?: boolean\n tmuxHPanes?: number\n tmuxVPanes?: number\n tmuxLayout?: 'even-horizontal' | 'even-vertical' | 'main-horizontal' | 'main-vertical' | 'tiled'\n}\n\ninterface ItemInfo {\n number: number\n title: string\n author: { login: string }\n isDraft?: boolean\n headRefName?: string\n body?: string\n labels?: Array<{ name: string }>\n assignees?: Array<{ login: string }>\n milestone?: { title: string }\n url?: string\n}\n\ninterface ProjectConfig {\n github?: {\n branchNaming?: {\n prTemplate?: string\n issueTemplate?: string\n }\n }\n worktrees?: {\n branchPrefix?: string\n }\n development?: {\n autoSetup?: boolean\n syncFiles?: string[]\n defaultEditor?: string\n }\n}\n\n// エラークラス\nclass GithubCommandError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'GithubCommandError'\n }\n}\n\n// ====== ヘルパー関数 ======\n\n// gh CLIの検証\nasync function validateGhCli(): Promise<void> {\n // gh CLIがインストールされているか確認\n try {\n await execa('gh', ['--version'])\n } catch {\n console.error(chalk.red('GitHub CLI (gh) がインストールされていません'))\n console.log(chalk.yellow('\\nインストール方法:'))\n console.log(' brew install gh')\n console.log(' または https://cli.github.com/')\n process.exit(1)\n }\n\n // 認証状態を確認\n try {\n await execa('gh', ['auth', 'status'])\n } catch {\n console.error(chalk.red('GitHub CLIが認証されていません'))\n console.log(chalk.yellow('\\n認証方法:'))\n console.log(' gh auth login')\n process.exit(1)\n }\n}\n\n// ブランチ名を生成\nfunction generateBranchName(\n template: string,\n number: string,\n title: string,\n type: 'pr' | 'issue'\n): string {\n // タイトルをブランチ名に適した形式に変換\n const sanitizedTitle = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .substring(0, 50) // 長すぎるタイトルは切り詰める\n\n return template\n .replace('{number}', number)\n .replace('{title}', sanitizedTitle)\n .replace('{type}', type)\n}\n\n// PR/Issueの自動判定\nasync function detectType(number: string): Promise<'pr' | 'issue'> {\n try {\n await execa('gh', ['pr', 'view', number])\n return 'pr'\n } catch {\n try {\n await execa('gh', ['issue', 'view', number])\n return 'issue'\n } catch {\n throw new GithubCommandError(`PR/Issue #${number} が見つかりません`)\n }\n }\n}\n\n// PR/Issue情報を取得\nasync function fetchItemInfo(number: string, type: 'pr' | 'issue'): Promise<ItemInfo> {\n const fields =\n type === 'pr'\n ? 'number,title,headRefName,author,body,labels,assignees,milestone,url'\n : 'number,title,author,body,labels,assignees,milestone,url'\n try {\n const result = await execa('gh', [type, 'view', number, '--json', fields])\n return JSON.parse(result.stdout)\n } catch {\n const itemName = type === 'pr' ? 'PR' : 'Issue'\n throw new GithubCommandError(`指定した番号の${itemName}は存在しません (#${number})`)\n }\n}\n\n// コメント追加処理\nasync function addComment(number: string, message: string, type: 'pr' | 'issue'): Promise<void> {\n const commentSpinner = ora('コメントを投稿中...').start()\n try {\n await execa('gh', [type, 'comment', number, '--body', message])\n commentSpinner.succeed(`${type === 'pr' ? 'PR' : 'Issue'} #${number} にコメントを投稿しました`)\n } catch (error) {\n commentSpinner.fail('コメントの投稿に失敗しました')\n throw new GithubCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\n// Issue/PRの状態変更\nasync function changeState(\n number: string,\n action: 'close' | 'reopen',\n type: 'pr' | 'issue'\n): Promise<void> {\n const stateSpinner = ora(`${action === 'close' ? 'クローズ' : '再開'}中...`).start()\n try {\n await execa('gh', [type, action, number])\n stateSpinner.succeed(\n `${type === 'pr' ? 'PR' : 'Issue'} #${number} を${action === 'close' ? 'クローズ' : '再開'}しました`\n )\n } catch (error) {\n stateSpinner.fail(`${action === 'close' ? 'クローズ' : '再開'}に失敗しました`)\n throw new GithubCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\n// 環境セットアップ\nasync function setupEnvironment(\n worktreePath: string,\n config: ProjectConfig,\n shouldSetup: boolean\n): Promise<void> {\n if (!shouldSetup) return\n\n const packageManager = detectPackageManager(worktreePath)\n const setupSpinner = ora('環境をセットアップ中...').start()\n\n try {\n await execa(packageManager, ['install'], { cwd: worktreePath })\n setupSpinner.succeed(`${packageManager} install 完了`)\n } catch {\n setupSpinner.warn(`${packageManager} install をスキップ`)\n }\n\n // 同期ファイルのコピー\n if (config.development?.syncFiles) {\n for (const file of config.development.syncFiles) {\n try {\n const sourcePath = path.join(process.cwd(), file)\n const destPath = path.join(worktreePath, file)\n await fs.copyFile(sourcePath, destPath)\n setupSpinner.succeed(`${file} をコピーしました`)\n } catch {\n // ファイルが存在しない場合はスキップ\n }\n }\n }\n}\n\n// エディタで開く\nasync function openInEditor(\n worktreePath: string,\n config: ProjectConfig,\n shouldOpen: boolean\n): Promise<void> {\n if (!shouldOpen) return\n\n const openSpinner = ora('エディタで開いています...').start()\n const editor = config.development?.defaultEditor || 'cursor'\n\n try {\n if (editor === 'cursor') {\n await execa('cursor', [worktreePath])\n openSpinner.succeed('Cursorで開きました')\n } else if (editor === 'vscode') {\n await execa('code', [worktreePath])\n openSpinner.succeed('VSCodeで開きました')\n } else if (editor && editor !== 'none') {\n // カスタムエディタコマンドのサポート\n await execa(editor, [worktreePath])\n openSpinner.succeed(`${editor}で開きました`)\n }\n } catch {\n openSpinner.warn(`${editor}が見つかりません`)\n }\n}\n\n// ====== コマンドハンドラー ======\n\n// コメントコマンドの処理\nasync function handleCommentCommand(number: string, options: GithubOptions): Promise<void> {\n const spinner = ora('PR/Issueを確認中...').start()\n\n let targetType: 'pr' | 'issue'\n try {\n targetType = await detectType(number)\n spinner.stop()\n } catch (error) {\n spinner.fail('PR/Issueの確認に失敗しました')\n throw error\n }\n\n // コメント処理\n if (options.message) {\n await addComment(number, options.message, targetType)\n } else {\n // インタラクティブにコメントを入力\n const { comment } = await inquirer.prompt([\n {\n type: 'input',\n name: 'comment',\n message: 'コメント内容:',\n validate: input => input.trim().length > 0 || 'コメントを入力してください',\n },\n ])\n await addComment(number, comment, targetType)\n }\n\n // 状態変更オプション\n if (options.reopen) {\n await changeState(number, 'reopen', targetType)\n } else if (options.close) {\n await changeState(number, 'close', targetType)\n }\n}\n\n// GitHub list表示処理\nasync function handleListCommand(): Promise<void> {\n console.log(chalk.blue('\\n🔍 GitHub Pull Requests & Issues\\n'))\n\n try {\n // PRリストを取得して表示\n console.log(chalk.cyan('📋 Pull Requests:'))\n const prs = await fetchItems('pr')\n\n if (prs.length === 0) {\n console.log(chalk.gray(' 開いているPull Requestがありません'))\n } else {\n prs.forEach(pr => {\n const draftLabel = pr.isDraft ? chalk.yellow(' [draft]') : ''\n console.log(` ${chalk.green(`#${pr.number}`)} ${pr.title}${draftLabel}`)\n console.log(` ${chalk.gray(`by ${pr.author.login}`)}`)\n })\n }\n\n console.log() // 空行\n\n // Issueリストを取得して表示\n console.log(chalk.cyan('🎯 Issues:'))\n const issues = await fetchItems('issue')\n\n if (issues.length === 0) {\n console.log(chalk.gray(' 開いているIssueがありません'))\n } else {\n issues.forEach(issue => {\n console.log(` ${chalk.green(`#${issue.number}`)} ${issue.title}`)\n console.log(` ${chalk.gray(`by ${issue.author.login}`)}`)\n })\n }\n\n console.log(chalk.gray('\\n使用例:'))\n console.log(chalk.gray(' mst github pr 123 # PRから演奏者を招集'))\n console.log(chalk.gray(' mst github issue 456 # Issueから演奏者を招集'))\n } catch (error) {\n console.error(\n chalk.red('リスト取得中にエラーが発生しました:'),\n error instanceof Error ? error.message : '不明なエラー'\n )\n process.exit(1)\n }\n}\n\n// インタラクティブコメント処理\nasync function handleInteractiveComment(): Promise<void> {\n const { inputNumber } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputNumber',\n message: 'PR/Issue番号:',\n validate: input => {\n const num = parseInt(input)\n return (!isNaN(num) && num > 0) || '有効な番号を入力してください'\n },\n },\n ])\n\n const { comment } = await inquirer.prompt([\n {\n type: 'input',\n name: 'comment',\n message: 'コメント内容:',\n validate: input => input.trim().length > 0 || 'コメントを入力してください',\n },\n ])\n\n const spinner = ora('PR/Issueを確認中...').start()\n\n let targetType: 'pr' | 'issue'\n try {\n targetType = await detectType(inputNumber)\n spinner.stop()\n } catch (error) {\n spinner.fail('PR/Issueの確認に失敗しました')\n throw error\n }\n\n await addComment(inputNumber, comment, targetType)\n}\n\n// PR/Issue一覧を取得\nasync function fetchItems(type: 'pr' | 'issue'): Promise<ItemInfo[]> {\n const spinner = ora(`${type === 'pr' ? 'Pull Request' : 'Issue'}一覧を取得中...`).start()\n\n try {\n const fields = type === 'pr' ? 'number,title,author,isDraft' : 'number,title,author'\n const result = await execa('gh', [type, 'list', '--json', fields, '--limit', '20'])\n spinner.stop()\n return JSON.parse(result.stdout)\n } catch (error) {\n spinner.fail('一覧の取得に失敗しました')\n console.error(error)\n process.exit(1)\n }\n}\n\n// アイテム選択プロンプト\nasync function selectItem(items: ItemInfo[], type: 'pr' | 'issue'): Promise<string> {\n if (items.length === 0) {\n console.log(chalk.yellow(`開いている${type === 'pr' ? 'Pull Request' : 'Issue'}がありません`))\n process.exit(0)\n }\n\n const { selectedNumber } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedNumber',\n message: `${type === 'pr' ? 'Pull Request' : 'Issue'}を選択:`,\n choices: items.map(item => ({\n name: `#${item.number} ${item.title} ${chalk.gray(`by ${item.author.login}`)}${item.isDraft ? chalk.yellow(' [draft]') : ''}`,\n value: item.number.toString(),\n })),\n pageSize: 15,\n },\n ])\n\n return selectedNumber\n}\n\n// インタラクティブモードの処理\nasync function handleInteractiveMode(): Promise<{ type: string; number: string }> {\n const { selectType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectType',\n message: '何から演奏者を招集しますか?',\n choices: [\n { name: 'Pull Request', value: 'pr' },\n { name: 'Issue', value: 'issue' },\n { name: 'コメントを追加', value: 'comment' },\n ],\n },\n ])\n\n if (selectType === 'comment') {\n await handleInteractiveComment()\n throw new Error('INTERACTIVE_COMMENT_COMPLETE') // 特別な終了フラグ\n }\n\n const items = await fetchItems(selectType as 'pr' | 'issue')\n const selectedNumber = await selectItem(items, selectType as 'pr' | 'issue')\n\n return { type: selectType, number: selectedNumber }\n}\n\n// ブランチ名の生成\nasync function generateBranchForItem(\n type: 'pr' | 'issue',\n number: string,\n info: ItemInfo,\n config: ProjectConfig\n): Promise<string> {\n const template =\n type === 'pr'\n ? config.github?.branchNaming?.prTemplate || 'pr-{number}'\n : config.github?.branchNaming?.issueTemplate || 'issue-{number}'\n let branchName = generateBranchName(template, number, info.title, type)\n\n // ブランチ名にプレフィックスを追加\n if (config.worktrees?.branchPrefix && !branchName.startsWith(config.worktrees.branchPrefix)) {\n branchName = config.worktrees.branchPrefix + branchName\n }\n\n return branchName\n}\n\n// PR用のworktree作成\nasync function createWorktreeForPR(\n number: string,\n branchName: string,\n gitManager: GitWorktreeManager\n): Promise<string> {\n const tempBranch = `pr-${number}-checkout`\n\n // 一時的にcheckout\n await execa('gh', ['pr', 'checkout', number, '-b', tempBranch])\n\n // worktreeを作成 (tempBranchをベースに新しいブランチを作成)\n const worktreePath = await gitManager.createWorktree(branchName, tempBranch)\n\n // 元のブランチに戻る\n await execa('git', ['checkout', '-'])\n\n // 一時ブランチを削除\n await execa('git', ['branch', '-D', tempBranch])\n\n return worktreePath\n}\n\n// Worktree作成処理\nasync function createWorktreeFromGithub(\n type: 'pr' | 'issue',\n number: string,\n config: ProjectConfig,\n gitManager: GitWorktreeManager\n): Promise<string> {\n const spinner = ora('情報を取得中...').start()\n\n let info: ItemInfo\n try {\n // PR/Issueの情報を取得\n info = await fetchItemInfo(number, type)\n spinner.succeed(`${type === 'pr' ? 'PR' : 'Issue'} #${number}: ${info.title}`)\n } catch (error) {\n const itemName = type === 'pr' ? 'PR' : 'Issue'\n spinner.fail(`${itemName} #${number} が見つかりません`)\n throw error\n }\n\n // ブランチ名を生成\n const branchName = await generateBranchForItem(type, number, info, config)\n\n // 確認\n const { confirmCreate } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmCreate',\n message: `ブランチ '${chalk.cyan(branchName)}' で演奏者を招集しますか?`,\n default: true,\n },\n ])\n\n if (!confirmCreate) {\n console.log(chalk.gray('キャンセルされました'))\n process.exit(0)\n }\n\n spinner.start('演奏者を招集中...')\n\n let worktreePath: string\n try {\n worktreePath =\n type === 'pr'\n ? await createWorktreeForPR(number, branchName, gitManager)\n : await gitManager.createWorktree(branchName)\n } catch (error) {\n spinner.fail('演奏者の招集に失敗しました')\n throw error\n }\n\n // メタデータを保存\n try {\n await saveWorktreeMetadata(worktreePath, branchName, {\n github: {\n type,\n title: info.title,\n body: info.body || '',\n author: info.author.login,\n labels: info.labels?.map(l => l.name) || [],\n assignees: info.assignees?.map(a => a.login) || [],\n milestone: info.milestone?.title,\n url: info.url || '',\n issueNumber: number,\n },\n })\n } catch (error) {\n // メタデータ保存の失敗は警告のみ表示し、処理は続行\n console.warn(\n chalk.yellow(\n `⚠️ メタデータの保存に失敗しました: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n }\n\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const fullConfig = configManager.getAll()\n spinner.succeed(\n `演奏者 '${chalk.cyan(branchName)}' を招集しました!\\n` +\n ` 📁 ${chalk.gray(formatPath(worktreePath, fullConfig))}\\n` +\n ` 🔗 ${chalk.blue(`${type === 'pr' ? 'PR' : 'Issue'} #${number}`)}`\n )\n\n return worktreePath\n}\n\n// ====== 引数解析 ======\n\nfunction parseArguments(type?: string, number?: string): { type?: string; number?: string } {\n // typeが数値の場合(maestro github 123)\n if (type && !isNaN(parseInt(type)) && !number) {\n return { type: undefined, number: type }\n }\n\n // typeとnumberの正規化\n if (!type || type === 'checkout') {\n // checkout または引数なしの場合\n if (!number && type === 'checkout') {\n console.error(chalk.red('PR/Issue番号を指定してください'))\n console.log(chalk.gray('使い方: maestro github checkout <number>'))\n process.exit(1)\n }\n }\n\n return { type, number }\n}\n\n// 初期化処理\nasync function initialize(): Promise<{ gitManager: GitWorktreeManager; config: ProjectConfig }> {\n // 初期検証\n await validateGhCli()\n\n const gitManager = new GitWorktreeManager()\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n console.error(chalk.red('このディレクトリはGitリポジトリではありません'))\n process.exit(1)\n }\n\n return { gitManager, config }\n}\n\n// worktreeの作成と環境セットアップ\nasync function processWorktreeCreation(\n type: 'pr' | 'issue',\n number: string,\n options: GithubOptions,\n config: ProjectConfig,\n gitManager: GitWorktreeManager\n): Promise<void> {\n // tmuxオプションの検証(新しいオプションも含む)\n const tmuxOptionsCount = [\n options.tmux,\n options.tmuxVertical,\n options.tmuxHorizontal,\n options.tmuxH,\n options.tmuxV,\n ].filter(Boolean).length\n\n if (tmuxOptionsCount > 1) {\n console.error(chalk.red('エラー: tmuxオプションは一つだけ指定してください'))\n process.exit(1)\n }\n\n const isUsingTmux =\n options.tmux ||\n options.tmuxVertical ||\n options.tmuxHorizontal ||\n options.tmuxH ||\n options.tmuxV ||\n options.tmuxHPanes ||\n options.tmuxVPanes ||\n options.tmuxLayout\n\n // 新しいtmuxオプションの場合、tmuxセッション内にいる必要はない\n const requiresInsideTmux = options.tmuxVertical || options.tmuxHorizontal\n\n if (requiresInsideTmux && !(await isInTmuxSession())) {\n console.error(\n chalk.red(\n 'エラー: --tmux-v/--tmux-hオプションを使用するにはtmuxセッション内にいる必要があります'\n )\n )\n process.exit(1)\n }\n\n // Worktree作成\n const worktreePath = await createWorktreeFromGithub(type, number, config, gitManager)\n\n // 環境セットアップ\n const shouldSetup =\n options?.setup || (options?.setup === undefined && config.development?.autoSetup)\n await setupEnvironment(worktreePath, config, !!shouldSetup)\n\n // tmuxでシェルを開く処理(新しいオプションも対応)\n if (isUsingTmux) {\n const branchName = path.basename(worktreePath)\n\n // tmuxオプションの検証\n try {\n validateTmuxOptions({\n sessionName: branchName,\n worktreePath,\n tmux: options.tmux,\n tmuxH: options.tmuxH || options.tmuxHorizontal,\n tmuxV: options.tmuxV || options.tmuxVertical,\n tmuxHPanes: options.tmuxHPanes,\n tmuxVPanes: options.tmuxVPanes,\n tmuxLayout: options.tmuxLayout,\n })\n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red(`✖ ${error.message}`))\n }\n process.exit(1)\n }\n\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const fullConfig = configManager.getAll()\n console.log(chalk.green(`\\n🎼 GitHub統合による演奏者招集完了!`))\n console.log(chalk.gray(`📁 ${formatPath(worktreePath, fullConfig)}\\n`))\n\n try {\n await createTmuxSession({\n sessionName: branchName,\n worktreePath,\n tmux: options.tmux,\n tmuxH: options.tmuxH || options.tmuxHorizontal,\n tmuxV: options.tmuxV || options.tmuxVertical,\n tmuxHPanes: options.tmuxHPanes,\n tmuxVPanes: options.tmuxVPanes,\n tmuxLayout: options.tmuxLayout,\n interactiveAttach: true,\n })\n } catch (error) {\n console.error(\n chalk.red(\n `❌ tmuxセッションの作成に失敗: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n console.log(chalk.yellow('エディタでのオープンに進みます...'))\n // tmuxが失敗した場合はエディタオープンにフォールバック(-oフラグが明示的に指定された場合のみ)\n if (options?.open) {\n await openInEditor(worktreePath, config, true)\n }\n }\n } else if (options?.open) {\n // エディタで開く(-oフラグが明示的に指定された場合のみ)\n await openInEditor(worktreePath, config, true)\n }\n\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const fullConfig = configManager.getAll()\n console.log(chalk.green('\\n✨ GitHub統合による演奏者の招集が完了しました!'))\n console.log(chalk.gray(`\\ncd ${formatPath(worktreePath, fullConfig)} で移動できます`))\n}\n\n// メイン処理\nasync function executeGithubCommand(\n type: string | undefined,\n number: string | undefined,\n options: GithubOptions,\n gitManager: GitWorktreeManager,\n config: ProjectConfig\n): Promise<void> {\n // commentサブコマンドの処理\n if (type === 'comment') {\n if (!number) {\n throw new GithubCommandError('PR/Issue番号を指定してください')\n }\n await handleCommentCommand(number, options)\n return\n }\n\n // listサブコマンドの処理\n if (type === 'list') {\n await handleListCommand()\n return\n }\n\n // インタラクティブモードの処理\n let finalType = type\n let finalNumber = number\n\n if (!finalNumber) {\n // pr/issueが明示的に指定された場合は、その型に応じたアイテムを直接選択\n if (finalType === 'pr' || finalType === 'issue') {\n const items = await fetchItems(finalType as 'pr' | 'issue')\n finalNumber = await selectItem(items, finalType as 'pr' | 'issue')\n } else {\n // typeも指定されていない場合のみ、完全なインタラクティブモード\n try {\n const result = await handleInteractiveMode()\n finalType = result.type\n finalNumber = result.number\n } catch (error) {\n if (error instanceof Error && error.message === 'INTERACTIVE_COMMENT_COMPLETE') {\n return // コメント処理完了\n }\n throw error\n }\n }\n } else if (finalType === 'checkout' || !finalType) {\n // 番号が指定されている場合、まず存在チェックを行う\n // typeの自動判定(明示的にpr/issueが指定された場合はスキップ)\n finalType = await detectType(finalNumber)\n }\n\n await processWorktreeCreation(\n finalType as 'pr' | 'issue',\n finalNumber!,\n options,\n config,\n gitManager\n )\n}\n\n// ====== メインコマンド ======\n\nexport const githubCommand = new Command('github')\n .alias('gh')\n .description('GitHub PR/Issueから演奏者を招集する')\n .argument('[type]', 'タイプ (checkout, pr, issue, comment, list)')\n .argument('[number]', 'PR/Issue番号')\n .option('-o, --open', 'VSCode/Cursorで開く')\n .option('-s, --setup', '環境セットアップを実行')\n .option('-m, --message <message>', 'コメントメッセージ')\n .option('--reopen', 'PR/Issueを再開')\n .option('--close', 'PR/Issueをクローズ')\n .option('-t, --tmux', 'tmuxセッションを作成')\n .option('--tmux-vertical', 'tmuxの縦分割ペインで開く(tmuxセッション内でのみ)')\n .option('--tmux-horizontal', 'tmuxの横分割ペインで開く(tmuxセッション内でのみ)')\n .option('--tmux-h', 'tmuxペインを水平分割して作成')\n .option('--tmux-v', 'tmuxペインを垂直分割して作成')\n .option('--tmux-h-panes <number>', 'tmuxペインを指定数で水平分割', parseInt)\n .option('--tmux-v-panes <number>', 'tmuxペインを指定数で垂直分割', parseInt)\n .option(\n '--tmux-layout <type>',\n 'tmuxレイアウトタイプ (even-horizontal, even-vertical, main-horizontal, main-vertical, tiled)'\n )\n .exitOverride()\n .action(async (type?: string, number?: string, options: GithubOptions = {}) => {\n const spinner = ora('オーケストレーション!').start()\n\n try {\n // 引数を解析\n const args = parseArguments(type, number)\n\n // 初期化\n spinner.text = '準備中...'\n const { gitManager, config } = await initialize()\n spinner.stop()\n\n // メイン処理を実行\n await executeGithubCommand(args.type, args.number, options, gitManager, config)\n } catch (error) {\n // スピナーが既に停止している場合は新しいスピナーを作成しない\n if (spinner.isSpinning) {\n spinner.fail('エラーが発生しました')\n } else {\n // スピナーが停止済みの場合は直接エラーメッセージを表示\n console.error(chalk.red('✖ エラーが発生しました'))\n }\n\n if (error instanceof GithubCommandError) {\n console.error(chalk.red(error.message))\n process.exit(1)\n } else {\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exit(1)\n }\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\n\nconst BASH_COMPLETION = [\n '#!/bin/bash',\n '# maestro bash completion',\n '',\n '_maestro_completions() {',\n ' local cur prev opts base',\n ' COMPREPLY=()',\n ' cur=\"${COMP_WORDS[COMP_CWORD]}\"',\n ' prev=\"${COMP_WORDS[COMP_CWORD - 1]}\"',\n ' ',\n ' # コマンド一覧',\n ' local commands=\"create list delete shell exec attach github config completion tmux where sync review issue history graph watch health snapshot init push\"',\n ' local aliases=\"ls rm sh e a gh t w i\"',\n ' ',\n ' # 最初の引数の場合',\n ' if [[ ${COMP_CWORD} -eq 1 ]]; then',\n ' COMPREPLY=( $(compgen -W \"${commands} ${aliases}\" -- ${cur}) )',\n ' return 0',\n ' fi',\n ' ',\n ' # サブコマンドごとの補完',\n ' case \"${COMP_WORDS[1]}\" in',\n ' create)',\n ' # ブランチ名の補完(既存のローカルブランチを提案)',\n ' if [[ ${COMP_CWORD} -eq 2 ]]; then',\n ' local branches=$(git branch 2>/dev/null | grep -v \"^*\" | sed \\'s/^ *//\\')',\n ' COMPREPLY=( $(compgen -W \"${branches}\" -- ${cur}) )',\n ' fi',\n ' ;;',\n ' shell|sh|exec|e|delete|rm)',\n ' # worktreeのブランチ名を補完',\n ' if [[ ${COMP_CWORD} -eq 2 ]]; then',\n ' local worktrees=$(git worktree list --porcelain 2>/dev/null | grep \"^branch\" | sed \\'s/^branch refs\\\\/heads\\\\///\\')',\n ' COMPREPLY=( $(compgen -W \"${worktrees}\" -- ${cur}) )',\n ' fi',\n ' ;;',\n ' github|gh)',\n ' if [[ ${COMP_CWORD} -eq 2 ]]; then',\n ' COMPREPLY=( $(compgen -W \"checkout pr issue\" -- ${cur}) )',\n ' fi',\n ' ;;',\n ' config)',\n ' if [[ ${COMP_CWORD} -eq 2 ]]; then',\n ' COMPREPLY=( $(compgen -W \"init show path\" -- ${cur}) )',\n ' fi',\n ' ;;',\n ' completion)',\n ' if [[ ${COMP_CWORD} -eq 2 ]]; then',\n ' COMPREPLY=( $(compgen -W \"bash zsh fish\" -- ${cur}) )',\n ' fi',\n ' ;;',\n ' tmux|t)',\n ' # worktreeのブランチ名を補完',\n ' if [[ ${COMP_CWORD} -eq 2 ]]; then',\n ' local worktrees=$(git worktree list --porcelain 2>/dev/null | grep \"^branch\" | sed \\'s/^branch refs\\\\/heads\\\\///\\')',\n ' COMPREPLY=( $(compgen -W \"${worktrees}\" -- ${cur}) )',\n ' fi',\n ' ;;',\n ' where|w)',\n ' # worktreeのブランチ名を補完',\n ' if [[ ${COMP_CWORD} -eq 2 ]]; then',\n ' local worktrees=$(git worktree list --porcelain 2>/dev/null | grep \"^branch\" | sed \\'s/^branch refs\\\\/heads\\\\///\\')',\n ' COMPREPLY=( $(compgen -W \"${worktrees}\" -- ${cur}) )',\n ' fi',\n ' ;;',\n ' issue|i)',\n ' if [[ ${COMP_CWORD} -eq 2 ]]; then',\n ' COMPREPLY=( $(compgen -W \"list\" -- ${cur}) )',\n ' fi',\n ' ;;',\n ' esac',\n ' ',\n ' # オプションの補完',\n ' if [[ \"${cur}\" == -* ]]; then',\n ' case \"${COMP_WORDS[1]}\" in',\n ' create)',\n ' opts=\"--base --open --setup --help\"',\n ' ;;',\n ' delete|rm)',\n ' opts=\"--force --remove-remote --help\"',\n ' ;;',\n ' exec|e)',\n ' opts=\"--silent --all --help\"',\n ' ;;',\n ' github|gh)',\n ' opts=\"--open --setup --help\"',\n ' ;;',\n ' tmux|t)',\n ' opts=\"--new-window --split-pane --vertical --help\"',\n ' ;;',\n ' where|w)',\n ' opts=\"--fzf --current --help\"',\n ' ;;',\n ' list|ls)',\n ' opts=\"--json --fzf --filter --sort --last-commit --help\"',\n ' ;;',\n ' *)',\n ' opts=\"--help\"',\n ' ;;',\n ' esac',\n ' COMPREPLY=( $(compgen -W \"${opts}\" -- ${cur}) )',\n ' fi',\n '}',\n '',\n 'complete -F _maestro_completions maestro',\n].join('\\n')\n\nconst ZSH_COMPLETION = [\n '#compdef maestro',\n '# maestro zsh completion',\n '',\n '_maestro() {',\n ' local -a commands',\n ' commands=(',\n \" 'create:新しい演奏者(worktree)を招集する'\",\n \" 'list:オーケストラ編成(worktree)の一覧を表示'\",\n \" 'delete:演奏者(worktree)を解散'\",\n \" 'shell:演奏者のシェルに入る'\",\n \" 'exec:演奏者でコマンドを実行'\",\n \" 'attach:既存のブランチから演奏者を招集する'\",\n \" 'github:GitHub PR/Issueから演奏者を招集する'\",\n \" 'config:設定を管理'\",\n \" 'completion:シェル補完スクリプトを生成'\",\n \" 'tmux:tmux/fzfで演奏者を選択して開く'\",\n \" 'where:演奏者のパスを表示'\",\n \" 'sync:ブランチ間でファイルを同期'\",\n \" 'review:Pull Request レビューを管理'\",\n \" 'issue:GitHub Issues を管理'\",\n \" 'history:操作履歴を表示'\",\n \" 'graph:オーケストラ関係図を表示'\",\n \" 'watch:ファイル変更を監視して自動同期'\",\n \" 'health:オーケストラの健全性をチェック'\",\n \" 'snapshot:作業状態のスナップショットを管理'\",\n \" 'init:プロジェクト設定を初期化'\",\n \" 'push:ブランチをプッシュしてPRを作成'\",\n ' )',\n ' ',\n ' local -a aliases',\n ' aliases=(',\n \" 'ls:list'\",\n \" 'rm:delete'\",\n \" 'sh:shell'\",\n \" 'e:exec'\",\n \" 'a:attach'\",\n \" 'gh:github'\",\n \" 't:tmux'\",\n \" 'w:where'\",\n \" 'i:issue'\",\n ' )',\n ' ',\n ' if (( CURRENT == 2 )); then',\n \" _describe -t commands 'maestro commands' commands\",\n \" _describe -t aliases 'maestro aliases' aliases\",\n ' return',\n ' fi',\n ' ',\n ' case \"${words[2]}\" in',\n ' create)',\n ' if (( CURRENT == 3 )); then',\n ' _git_branch_names',\n ' fi',\n ' _arguments \\\\',\n \" '-b[ベースブランチ]:branch:_git_branch_names' \\\\\",\n \" '--base[ベースブランチ]:branch:_git_branch_names' \\\\\",\n \" '-o[VSCode/Cursorで開く]' \\\\\",\n \" '--open[VSCode/Cursorで開く]' \\\\\",\n \" '-s[環境セットアップを実行]' \\\\\",\n \" '--setup[環境セットアップを実行]'\",\n ' ;;',\n ' list|ls)',\n ' _arguments \\\\',\n \" '-j[JSON形式で出力]' \\\\\",\n \" '--json[JSON形式で出力]' \\\\\",\n \" '--fzf[fzfで選択]' \\\\\",\n \" '--filter[フィルタ]:keyword:' \\\\\",\n \" '--sort[ソート]:field:(branch age size)' \\\\\",\n \" '--last-commit[最終コミット情報を表示]'\",\n ' ;;',\n ' shell|sh|exec|e|delete|rm)',\n ' if (( CURRENT == 3 )); then',\n ' local worktrees',\n \" worktrees=($(git worktree list --porcelain 2>/dev/null | grep \\\"^branch\\\" | sed 's/^branch refs\\\\/heads\\\\//' | tr '\\\\n' ' '))\",\n \" _values 'worktrees' $worktrees\",\n ' fi',\n ' ;;',\n ' github|gh)',\n ' if (( CURRENT == 3 )); then',\n \" _values 'type' 'checkout' 'pr' 'issue'\",\n ' fi',\n ' _arguments \\\\',\n \" '-o[VSCode/Cursorで開く]' \\\\\",\n \" '--open[VSCode/Cursorで開く]' \\\\\",\n \" '-s[環境セットアップを実行]' \\\\\",\n \" '--setup[環境セットアップを実行]'\",\n ' ;;',\n ' config)',\n ' if (( CURRENT == 3 )); then',\n \" _values 'action' 'init' 'show' 'path'\",\n ' fi',\n ' _arguments \\\\',\n \" '-g[グローバル設定を対象にする]' \\\\\",\n \" '--global[グローバル設定を対象にする]'\",\n ' ;;',\n ' completion)',\n ' if (( CURRENT == 3 )); then',\n \" _values 'shell' 'bash' 'zsh' 'fish'\",\n ' fi',\n ' ;;',\n ' tmux|t)',\n ' _arguments \\\\',\n \" '-n[新しいウィンドウで開く]' \\\\\",\n \" '--new-window[新しいウィンドウで開く]' \\\\\",\n \" '-p[現在のペインを分割して開く]' \\\\\",\n \" '--split-pane[現在のペインを分割して開く]' \\\\\",\n \" '-v[垂直分割]' \\\\\",\n \" '--vertical[垂直分割]'\",\n ' ;;',\n ' where|w)',\n ' if (( CURRENT == 3 )); then',\n ' local worktrees',\n \" worktrees=($(git worktree list --porcelain 2>/dev/null | grep \\\"^branch\\\" | sed 's/^branch refs\\\\/heads\\\\//' | tr '\\\\n' ' '))\",\n \" _values 'worktrees' $worktrees\",\n ' fi',\n ' _arguments \\\\',\n \" '--fzf[fzfで選択]' \\\\\",\n \" '--current[現在のworktreeのパスを表示]'\",\n ' ;;',\n ' issue|i)',\n ' if (( CURRENT == 3 )); then',\n \" _values 'command' 'list'\",\n ' fi',\n ' _arguments \\\\',\n \" '-l[Issueを一覧表示]' \\\\\",\n \" '--list[Issueを一覧表示]' \\\\\",\n \" '-c[新しいIssueを作成]' \\\\\",\n \" '--create[新しいIssueを作成]' \\\\\",\n \" '--close[Issueをクローズ]' \\\\\",\n \" '-w[ブラウザでIssueを開く]' \\\\\",\n \" '--web[ブラウザでIssueを開く]' \\\\\",\n \" '-a[ユーザーをアサイン]:user:' \\\\\",\n \" '--assign[ユーザーをアサイン]:user:' \\\\\",\n \" '--label[ラベルを追加]:labels:' \\\\\",\n \" '--milestone[マイルストーンを設定]:milestone:'\",\n ' ;;',\n ' esac',\n '}',\n '',\n '_maestro \"$@\"',\n].join('\\n')\n\nconst FISH_COMPLETION = [\n '# maestro fish completion',\n '',\n '# コマンドの補完を無効化',\n 'complete -c maestro -e',\n 'complete -c maestro -e',\n '',\n '# メインコマンド',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"create\" -d \"新しい演奏者(worktree)を招集する\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"list ls\" -d \"オーケストラ編成(worktree)の一覧を表示\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"delete rm\" -d \"演奏者(worktree)を解散\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"shell sh\" -d \"演奏者のシェルに入る\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"exec e\" -d \"演奏者でコマンドを実行\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"attach a\" -d \"既存のブランチから演奏者を招集する\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"github gh\" -d \"GitHub PR/Issueから演奏者を招集する\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"config\" -d \"設定を管理\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"completion\" -d \"シェル補完スクリプトを生成\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"tmux t\" -d \"tmux/fzfで演奏者を選択して開く\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"where w\" -d \"演奏者のパスを表示\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"sync\" -d \"ブランチ間でファイルを同期\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"review\" -d \"Pull Request レビューを管理\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"issue i\" -d \"GitHub Issues を管理\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"history\" -d \"操作履歴を表示\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"graph\" -d \"オーケストラ関係図を表示\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"watch\" -d \"ファイル変更を監視して自動同期\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"health\" -d \"オーケストラの健全性をチェック\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"snapshot\" -d \"作業状態のスナップショットを管理\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"init\" -d \"プロジェクト設定を初期化\"',\n 'complete -c maestro -n \"__fish_use_subcommand\" -a \"push\" -d \"ブランチをプッシュしてPRを作成\"',\n '',\n '# create コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from create\" -s b -l base -d \"ベースブランチ\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from create\" -s o -l open -d \"VSCode/Cursorで開く\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from create\" -s s -l setup -d \"環境セットアップを実行\"',\n '',\n '# list コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from list ls\" -s j -l json -d \"JSON形式で出力\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from list ls\" -l fzf -d \"fzfで選択\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from list ls\" -l filter -d \"フィルタ\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from list ls\" -l sort -d \"ソート\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from list ls\" -l last-commit -d \"最終コミット情報を表示\"',\n '',\n '# delete コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from delete rm\" -s f -l force -d \"強制削除\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from delete rm\" -s r -l remove-remote -d \"リモートブランチも削除\"',\n '',\n '# exec コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from exec e\" -s s -l silent -d \"出力を抑制\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from exec e\" -s a -l all -d \"すべての演奏者で実行\"',\n '',\n '# github コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from github gh\" -s o -l open -d \"VSCode/Cursorで開く\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from github gh\" -s s -l setup -d \"環境セットアップを実行\"',\n '',\n '# config コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from config\" -s g -l global -d \"グローバル設定を対象にする\"',\n '',\n '# tmux コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from tmux t\" -s n -l new-window -d \"新しいウィンドウで開く\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from tmux t\" -s p -l split-pane -d \"現在のペインを分割して開く\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from tmux t\" -s v -l vertical -d \"垂直分割\"',\n '',\n '# where コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from where w\" -l fzf -d \"fzfで選択\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from where w\" -l current -d \"現在のworktreeのパスを表示\"',\n '',\n '# issue コマンドのオプション',\n 'complete -c maestro -n \"__fish_seen_subcommand_from issue i\" -s l -l list -d \"Issueを一覧表示\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from issue i\" -s c -l create -d \"新しいIssueを作成\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from issue i\" -l close -d \"Issueをクローズ\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from issue i\" -s w -l web -d \"ブラウザでIssueを開く\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from issue i\" -s a -l assign -d \"ユーザーをアサイン\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from issue i\" -l label -d \"ラベルを追加\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from issue i\" -l milestone -d \"マイルストーンを設定\"',\n '',\n '# サブコマンドの引数補完',\n 'complete -c maestro -n \"__fish_seen_subcommand_from config; and __fish_is_nth_token 3\" -a \"init show path\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from completion; and __fish_is_nth_token 3\" -a \"bash zsh fish\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from github gh; and __fish_is_nth_token 3\" -a \"checkout pr issue\"',\n 'complete -c maestro -n \"__fish_seen_subcommand_from issue i; and __fish_is_nth_token 3\" -a \"list\"',\n '',\n '# worktreeブランチ名の補完(動的)',\n 'complete -c maestro -n \"__fish_seen_subcommand_from shell sh exec e delete rm where w\" -a \"(git worktree list --porcelain 2>/dev/null | grep \\'^branch\\' | sed \\'s/^branch refs\\\\/heads\\\\///\\')\"',\n '',\n].join('\\n')\n\nexport const completionCommand = new Command('completion')\n .description('シェル補完スクリプトを生成')\n .argument('[shell]', 'シェルの種類 (bash, zsh, fish)')\n .exitOverride()\n .action(async (shell?: string) => {\n if (!shell) {\n console.log(chalk.bold('🎼 maestro シェル補完\\n'))\n console.log('使い方:')\n console.log(' maestro completion <shell> # 補完スクリプトを表示')\n console.log('\\nサポートされているシェル:')\n console.log(' - bash')\n console.log(' - zsh')\n console.log(' - fish')\n console.log('\\n' + chalk.gray('セットアップ方法:'))\n console.log(chalk.gray(' maestro completion bash >> ~/.bashrc'))\n console.log(chalk.gray(' maestro completion zsh > ~/.zsh/completions/_maestro'))\n console.log(chalk.gray(' maestro completion fish > ~/.config/fish/completions/maestro.fish'))\n return\n }\n\n switch (shell.toLowerCase()) {\n case 'bash':\n console.log(BASH_COMPLETION)\n console.error(chalk.gray('\\n# セットアップ方法:'))\n console.error(chalk.gray('# 1. 以下を実行:'))\n console.error(chalk.cyan(' maestro completion bash >> ~/.bashrc'))\n console.error(chalk.gray('# 2. シェルを再起動するか:'))\n console.error(chalk.cyan(' source ~/.bashrc'))\n break\n\n case 'zsh':\n console.log(ZSH_COMPLETION)\n console.error(chalk.gray('\\n# セットアップ方法:'))\n console.error(chalk.gray('# 1. 補完ディレクトリを作成(まだない場合):'))\n console.error(chalk.cyan(' mkdir -p ~/.zsh/completions'))\n console.error(chalk.gray('# 2. 補完スクリプトを保存:'))\n console.error(chalk.cyan(' maestro completion zsh > ~/.zsh/completions/_maestro'))\n console.error(chalk.gray('# 3. ~/.zshrcに以下を追加(まだない場合):'))\n console.error(chalk.cyan(' fpath=(~/.zsh/completions $fpath)'))\n console.error(chalk.cyan(' autoload -U compinit && compinit'))\n console.error(chalk.gray('# 4. シェルを再起動'))\n break\n\n case 'fish':\n console.log(FISH_COMPLETION)\n console.error(chalk.gray('\\n# セットアップ方法:'))\n console.error(chalk.gray('# 1. 補完ディレクトリを作成(まだない場合):'))\n console.error(chalk.cyan(' mkdir -p ~/.config/fish/completions'))\n console.error(chalk.gray('# 2. 補完スクリプトを保存:'))\n console.error(\n chalk.cyan(' maestro completion fish > ~/.config/fish/completions/maestro.fish')\n )\n console.error(chalk.gray('# 3. 新しいシェルセッションで自動的に有効になります'))\n break\n\n default:\n console.error(chalk.red(`エラー: サポートされていないシェル '${shell}'`))\n console.error(chalk.gray('サポートされているシェル: bash, zsh, fish'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { execa } from 'execa'\nimport { spawn } from 'child_process'\nimport { attachToTmuxWithProperTTY, createAndAttachTmuxSession } from '../utils/tty.js'\n\n// 型定義\ninterface TmuxOptions {\n newWindow?: boolean\n splitPane?: boolean\n vertical?: boolean\n editor?: string\n detach?: boolean\n}\n\ninterface TmuxSession {\n name: string\n attached: boolean\n windows: number\n created: string\n}\n\n// エラークラス\nclass TmuxCommandError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'TmuxCommandError'\n }\n}\n\n// tmuxセッション一覧を取得\nasync function getTmuxSessions(): Promise<TmuxSession[]> {\n try {\n const { stdout } = await execa('tmux', [\n 'list-sessions',\n '-F',\n '#{session_name}:#{session_attached}:#{session_windows}:#{session_created}',\n ])\n\n return stdout\n .split('\\n')\n .filter(Boolean)\n .map(line => {\n const [name, attached, windows, created] = line.split(':')\n return {\n name: name || 'unknown',\n attached: attached === '1',\n windows: parseInt(windows || '0', 10),\n created: new Date(parseInt(created || '0', 10) * 1000).toLocaleString(),\n }\n })\n } catch {\n return []\n }\n}\n\n// セッション一覧をテーブル表示\nfunction displaySessionsTable(sessions: TmuxSession[]): void {\n if (sessions.length === 0) {\n console.log(chalk.gray('アクティブなセッションはありません'))\n return\n }\n\n console.log(chalk.bold('\\n📋 Tmuxセッション一覧:\\n'))\n\n // ヘッダー\n console.log(\n chalk.gray('Name'.padEnd(30)) +\n chalk.gray('Attached'.padEnd(12)) +\n chalk.gray('Windows'.padEnd(10)) +\n chalk.gray('Created')\n )\n console.log(chalk.gray('─'.repeat(80)))\n\n // セッション情報\n sessions.forEach(session => {\n const nameDisplay = session.attached\n ? chalk.green(session.name.padEnd(30))\n : chalk.cyan(session.name.padEnd(30))\n const attachedDisplay = session.attached\n ? chalk.green('Yes'.padEnd(12))\n : chalk.gray('No'.padEnd(12))\n const windowsDisplay = chalk.white(session.windows.toString().padEnd(10))\n const createdDisplay = chalk.gray(session.created)\n\n console.log(nameDisplay + attachedDisplay + windowsDisplay + createdDisplay)\n })\n\n console.log(\n chalk.gray('\\n💡 ヒント: tmux attach -t <session-name> でセッションにアタッチできます')\n )\n}\n\n// エディタを起動するコマンドを生成\nfunction getEditorCommand(editor: string): string {\n switch (editor) {\n case 'nvim':\n case 'vim':\n return `${editor} .`\n case 'code':\n return `code .`\n case 'emacs':\n return `emacs .`\n default:\n return ''\n }\n}\n\nexport const tmuxCommand = new Command('tmux')\n .alias('t')\n .description('tmux/fzfで演奏者を選択して開く')\n .argument('[branch-name]', 'ブランチ名(省略時はfzfで選択)')\n .option('-n, --new-window', '新しいウィンドウで開く')\n .option('-p, --split-pane', '現在のペインを分割して開く')\n .option('-v, --vertical', '垂直分割(-pと併用)')\n .option('-e, --editor <editor>', 'エディタを自動起動 (nvim, vim, code, emacs)')\n .option('-d, --detach', '新セッション作成のみ (attachしない)')\n .exitOverride()\n .action(async (branchName?: string, options: TmuxOptions = {}) => {\n const spinner = ora('オーケストレーション!').start()\n\n try {\n // tmuxがインストールされているか確認\n try {\n await execa('tmux', ['-V'])\n } catch {\n spinner.fail('tmuxがインストールされていません')\n console.log(chalk.yellow('\\nインストール方法:'))\n console.log(' brew install tmux')\n console.log(' または https://github.com/tmux/tmux')\n process.exit(1)\n }\n\n // fzfがインストールされているか確認\n try {\n await execa('fzf', ['--version'])\n } catch {\n spinner.fail('fzfがインストールされていません')\n console.log(chalk.yellow('\\nインストール方法:'))\n console.log(' brew install fzf')\n console.log(' または https://github.com/junegunn/fzf')\n process.exit(1)\n }\n\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n spinner.fail('このディレクトリはGitリポジトリではありません')\n process.exit(1)\n }\n\n spinner.stop()\n\n // worktree一覧を取得\n const worktrees = await gitManager.listWorktrees()\n\n if (worktrees.length === 0) {\n console.log(chalk.yellow('演奏者が存在しません'))\n console.log(chalk.gray('\\n作成方法:'))\n console.log(' maestro create <branch-name>')\n process.exit(0)\n }\n\n // ブランチ名が指定されている場合\n if (branchName) {\n const worktree = worktrees.find(wt => {\n const branch = wt.branch?.replace('refs/heads/', '')\n return branch === branchName\n })\n\n if (!worktree) {\n console.error(chalk.red(`ワークツリー '${branchName}' が見つかりません`))\n process.exit(1)\n }\n\n // 直接tmuxセッションを作成\n const sessionName = branchName.replace(/[^a-zA-Z0-9_-]/g, '-')\n const editorCmd = options.editor ? getEditorCommand(options.editor) : ''\n const tmuxArgs = ['new-session', '-s', sessionName, '-c', worktree.path]\n\n if (options.detach) {\n tmuxArgs.push('-d')\n if (editorCmd) {\n tmuxArgs.push(editorCmd)\n }\n\n try {\n await execa('tmux', tmuxArgs)\n console.log(chalk.cyan(`\\n新しいtmuxセッション '${sessionName}' を作成しました`))\n const sessions = await getTmuxSessions()\n displaySessionsTable(sessions)\n } catch (error) {\n if (error instanceof Error && error.message.includes('duplicate session')) {\n console.log(chalk.yellow(`\\nセッション '${sessionName}' は既に存在します`))\n const sessions = await getTmuxSessions()\n displaySessionsTable(sessions)\n } else {\n throw error\n }\n }\n } else {\n console.log(chalk.cyan(`\\n新しいtmuxセッション '${sessionName}' を作成します...`))\n await createAndAttachTmuxSession(sessionName, worktree.path, editorCmd)\n console.log(chalk.gray('\\ntmuxセッションから戻りました'))\n }\n return\n }\n\n // ブランチ名が指定されていない場合、fzfで選択\n const fzfInput = worktrees\n .map(w => {\n const status = []\n if (w.isCurrentDirectory) status.push(chalk.green('現在'))\n if (w.locked) status.push(chalk.red('ロック'))\n if (w.prunable) status.push(chalk.yellow('削除可能'))\n\n const statusStr = status.length > 0 ? ` [${status.join(', ')}]` : ''\n return `${w.branch}${statusStr} | ${w.path}`\n })\n .join('\\n')\n\n const fzfProcess = spawn(\n 'fzf',\n [\n '--ansi',\n '--header=演奏者を選択 (Ctrl-C でキャンセル)',\n '--preview',\n 'echo {} | cut -d\"|\" -f2 | xargs ls -la',\n '--preview-window=right:50%:wrap',\n ],\n {\n stdio: ['pipe', 'pipe', 'inherit'],\n }\n )\n\n // fzfにデータを送る\n fzfProcess.stdin.write(fzfInput)\n fzfProcess.stdin.end()\n\n // 選択結果を取得\n let selected = ''\n fzfProcess.stdout.on('data', data => {\n selected += data.toString()\n })\n\n fzfProcess.on('close', async code => {\n if (code !== 0 || !selected.trim()) {\n console.log(chalk.gray('キャンセルされました'))\n return\n }\n\n // パスを抽出\n const selectedPath = selected.split('|')[1]?.trim()\n if (!selectedPath) {\n console.error(chalk.red('エラー: パスを取得できませんでした'))\n process.exit(1)\n }\n\n const selectedBranch = selected\n .split('|')[0]\n ?.trim()\n .replace(/\\[.*\\]/, '')\n .trim()\n\n // tmuxセッション内かチェック\n const inTmux = process.env.TMUX !== undefined\n\n if (!inTmux) {\n // tmux外から実行された場合は新しいセッションを作成\n const sessionName = selectedBranch?.replace(/[^a-zA-Z0-9_-]/g, '-') || 'maestro'\n\n // エディタコマンドを構築\n const editorCmd = options.editor ? getEditorCommand(options.editor) : ''\n const tmuxArgs = ['new-session', '-s', sessionName, '-c', selectedPath]\n\n if (options.detach) {\n tmuxArgs.push('-d')\n if (editorCmd) {\n tmuxArgs.push(editorCmd)\n }\n\n console.log(chalk.cyan(`\\n新しいtmuxセッション '${sessionName}' を作成しました`))\n\n try {\n await execa('tmux', tmuxArgs)\n\n // detachモードの場合はセッション一覧を表示\n const sessions = await getTmuxSessions()\n displaySessionsTable(sessions)\n } catch (error) {\n // セッションが既に存在する場合\n if (error instanceof Error && error.message.includes('duplicate session')) {\n console.log(chalk.yellow(`\\nセッション '${sessionName}' は既に存在します`))\n const sessions = await getTmuxSessions()\n displaySessionsTable(sessions)\n } else {\n throw error\n }\n }\n } else {\n console.log(chalk.cyan(`\\n新しいtmuxセッション '${sessionName}' を作成します...`))\n\n try {\n // インタラクティブモード\n await createAndAttachTmuxSession(sessionName, selectedPath, editorCmd)\n console.log(chalk.gray('\\ntmuxセッションから戻りました'))\n } catch (error) {\n // セッションが既に存在する場合はアタッチ\n if (error instanceof Error && error.message?.includes('duplicate session')) {\n try {\n await attachToTmuxWithProperTTY(sessionName)\n console.log(chalk.gray('\\ntmuxセッションから戻りました'))\n } catch {\n console.error(chalk.red('tmuxセッションの作成/アタッチに失敗しました'))\n process.exit(1)\n }\n } else {\n throw error\n }\n }\n }\n } else if (options?.newWindow) {\n // tmux内から実行された場合\n // 新しいウィンドウで開く\n const windowArgs = ['new-window', '-n', selectedBranch || '', '-c', selectedPath]\n\n // エディタオプションが指定されている場合\n if (options.editor) {\n const editorCmd = getEditorCommand(options.editor)\n if (editorCmd) {\n windowArgs.push(editorCmd)\n }\n }\n\n await execa('tmux', windowArgs)\n console.log(chalk.green(`✨ 新しいウィンドウ '${selectedBranch}' を開きました`))\n } else if (options?.splitPane) {\n // ペインを分割して開く\n const splitOption = options?.vertical ? '-h' : '-v'\n const paneArgs = ['split-window', splitOption, '-c', selectedPath]\n\n // エディタオプションが指定されている場合\n if (options.editor) {\n const editorCmd = getEditorCommand(options.editor)\n if (editorCmd) {\n paneArgs.push(editorCmd)\n }\n }\n\n await execa('tmux', paneArgs)\n console.log(\n chalk.green(\n `✨ ペインを${options?.vertical ? '垂直' : '水平'}分割して '${selectedBranch}' を開きました`\n )\n )\n } else {\n // デフォルト: 現在のペインでディレクトリを変更\n console.log(chalk.green(`\\n✨ 演奏者 '${selectedBranch}' を選択しました`))\n console.log(chalk.gray(`cd ${selectedPath} で移動してください`))\n\n // エディタ起動オプションが指定されている場合\n if (options.editor) {\n const editorCmd = getEditorCommand(options.editor)\n if (editorCmd) {\n console.log(chalk.gray(`エディタを起動: ${editorCmd}`))\n // 現在のディレクトリでエディタを起動\n await execa('tmux', ['send-keys', `cd ${selectedPath} && ${editorCmd}`, 'Enter'])\n }\n }\n }\n })\n } catch (error) {\n spinner.fail('エラーが発生しました')\n if (error instanceof TmuxCommandError) {\n console.error(chalk.red(error.message))\n process.exitCode = 1\n } else {\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exitCode = 1\n }\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { spawn } from 'child_process'\nimport { ConfigManager } from '../core/config.js'\nimport { formatPath } from '../utils/path.js'\n\nexport const whereCommand = new Command('where')\n .alias('w')\n .description('演奏者(worktree)のパスを表示')\n .argument('[branch-name]', 'ブランチ名')\n .option('--fzf', 'fzfで選択')\n .option('--current', '現在のworktreeのパスを表示')\n .exitOverride()\n .action(async (branchName?: string, options: { fzf?: boolean; current?: boolean } = {}) => {\n try {\n const gitManager = new GitWorktreeManager()\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n console.error(chalk.red('エラー: このディレクトリはGitリポジトリではありません'))\n process.exit(1)\n }\n\n // 現在のworktreeのパスを表示\n if (options?.current) {\n const currentPath = formatPath(process.cwd(), config)\n console.log(currentPath)\n return\n }\n\n const worktrees = await gitManager.listWorktrees()\n\n // fzfで選択\n if (options?.fzf) {\n if (worktrees.length === 0) {\n console.log(chalk.yellow('演奏者が存在しません'))\n process.exit(0)\n }\n\n // fzfで選択\n const fzfInput = worktrees\n .map(w => {\n const status = []\n if (w.isCurrentDirectory) status.push(chalk.green('現在'))\n if (w.locked) status.push(chalk.red('ロック'))\n if (w.prunable) status.push(chalk.yellow('削除可能'))\n\n const statusStr = status.length > 0 ? ` [${status.join(', ')}]` : ''\n const displayPath = formatPath(w.path, config)\n return `${w.branch}${statusStr} | ${displayPath}`\n })\n .join('\\n')\n\n const fzfProcess = spawn(\n 'fzf',\n [\n '--ansi',\n '--header=演奏者を選択 (Ctrl-C でキャンセル)',\n '--preview',\n 'echo {} | cut -d\"|\" -f2 | xargs ls -la',\n '--preview-window=right:50%:wrap',\n ],\n {\n stdio: ['pipe', 'pipe', 'inherit'],\n }\n )\n\n // fzfにデータを送る\n fzfProcess.stdin.write(fzfInput)\n fzfProcess.stdin.end()\n\n // 選択結果を取得\n let selected = ''\n fzfProcess.stdout.on('data', data => {\n selected += data.toString()\n })\n\n fzfProcess.on('close', code => {\n if (code !== 0 || !selected.trim()) {\n console.log(chalk.gray('キャンセルされました'))\n return\n }\n\n // パスを抽出して表示\n const selectedPath = selected.split('|')[1]?.trim()\n if (selectedPath) {\n console.log(selectedPath)\n }\n })\n return\n }\n\n // ブランチ名が指定されていない場合\n if (!branchName) {\n console.error(\n chalk.red(\n 'エラー: ブランチ名を指定するか、--fzf または --current オプションを使用してください'\n )\n )\n console.log(chalk.gray('使い方:'))\n console.log(' maestro where <branch-name> # 指定した演奏者のパスを表示')\n console.log(' maestro where --fzf # fzfで演奏者を選択')\n console.log(' maestro where --current # 現在のworktreeのパスを表示')\n process.exit(1)\n }\n\n // refs/heads/プレフィックスを処理\n const searchBranch = branchName.startsWith('refs/heads/')\n ? branchName\n : `refs/heads/${branchName}`\n\n // 指定されたブランチのworktreeを検索\n const worktree = worktrees.find(\n w =>\n w.branch === searchBranch ||\n w.branch === `refs/heads/${branchName}` ||\n w.branch.endsWith(`/${branchName}`)\n )\n\n if (!worktree) {\n console.error(chalk.red(`エラー: 演奏者 '${branchName}' が見つかりません`))\n\n // 類似した演奏者を提案\n const suggestions = worktrees\n .filter(w => w.branch.toLowerCase().includes(branchName.toLowerCase()))\n .map(w => w.branch.replace('refs/heads/', ''))\n\n if (suggestions.length > 0) {\n console.log(chalk.yellow('\\n類似した演奏者:'))\n suggestions.forEach(s => console.log(` - ${s}`))\n }\n\n process.exit(1)\n }\n\n // パスを表示\n const displayPath = formatPath(worktree.path, config)\n console.log(displayPath)\n } catch (error) {\n console.error(chalk.red('エラー:'), error instanceof Error ? error.message : '不明なエラー')\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora, { type Ora } from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { ConfigManager, Config } from '../core/config.js'\nimport { formatPath } from '../utils/path.js'\nimport { execa } from 'execa'\nimport { spawn } from 'child_process'\nimport cliProgress from 'cli-progress'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport pLimit from 'p-limit'\nimport { Worktree } from '../types/index.js'\n\ninterface SyncOptions {\n all?: boolean\n main?: string\n fzf?: boolean\n rebase?: boolean\n dryRun?: boolean\n push?: boolean\n files?: boolean\n interactive?: boolean\n preset?: string\n concurrency?: number\n filter?: string\n pattern?: string\n}\n\ninterface SyncResult {\n branch: string\n status: 'success' | 'failed' | 'skipped' | 'up-to-date'\n method?: 'merge' | 'rebase'\n reason?: string\n error?: string\n pushed?: boolean\n}\n\n// メインブランチを特定\nasync function detectMainBranch(\n _gitManager: GitWorktreeManager,\n specified?: string\n): Promise<string> {\n if (specified) return specified\n\n try {\n // デフォルトブランチを取得\n const { stdout } = await execa('git', ['symbolic-ref', 'refs/remotes/origin/HEAD'])\n return stdout.replace('refs/remotes/origin/', '')\n } catch {\n // フォールバック\n try {\n const { stdout } = await execa('git', ['branch', '--list', '--format=%(refname:short)'])\n const branchList = stdout.split('\\n').filter(Boolean)\n if (!branchList.includes('main') && branchList.includes('master')) {\n return 'master'\n }\n } catch {\n // エラーが発生した場合はデフォルトのmainを使用\n }\n return 'main'\n }\n}\n\n// fzfで演奏者を選択\nasync function selectWithFzf(orchestraMembers: Worktree[]): Promise<Worktree[]> {\n const fzfInput = orchestraMembers\n .map(w => {\n const branch = w.branch?.replace('refs/heads/', '') || w.branch\n return `${branch} | ${w.path}`\n })\n .join('\\n')\n\n const fzfProcess = spawn(\n 'fzf',\n [\n '--ansi',\n '--multi',\n '--header=同期する演奏者を選択 (Tab で複数選択, Ctrl-C でキャンセル)',\n '--preview',\n 'echo {} | cut -d\"|\" -f2 | xargs ls -la',\n '--preview-window=right:50%:wrap',\n ],\n {\n stdio: ['pipe', 'pipe', 'inherit'],\n }\n )\n\n fzfProcess.stdin.write(fzfInput)\n fzfProcess.stdin.end()\n\n let selected = ''\n fzfProcess.stdout.on('data', data => {\n selected += data.toString()\n })\n\n return new Promise<Worktree[]>(resolve => {\n fzfProcess.on('close', code => {\n if (code !== 0 || !selected.trim()) {\n console.log(chalk.gray('キャンセルされました'))\n process.exit(0)\n }\n\n const selectedBranches = selected\n .trim()\n .split('\\n')\n .map(line => line.split('|')[0]?.trim())\n .filter(Boolean)\n\n const targetWorktrees = orchestraMembers.filter(wt => {\n const branch = wt.branch?.replace('refs/heads/', '')\n return selectedBranches.includes(branch)\n })\n\n resolve(targetWorktrees)\n })\n })\n}\n\n// worktreeをフィルタリング\nfunction filterWorktrees(orchestraMembers: Worktree[], options: SyncOptions): Worktree[] {\n let filteredWorktrees = orchestraMembers\n\n // --filter オプション(キーワードフィルタ)\n if (options.filter) {\n const keyword = options.filter.toLowerCase()\n filteredWorktrees = filteredWorktrees.filter(wt => {\n const branch =\n wt.branch?.replace('refs/heads/', '')?.toLowerCase() || wt.branch?.toLowerCase()\n const path = wt.path.toLowerCase()\n return branch?.includes(keyword) || path.includes(keyword)\n })\n }\n\n // --pattern オプション(ワイルドカードパターン)\n if (options.pattern) {\n const pattern = options.pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // 特殊文字をエスケープ\n .replace(/\\*/g, '.*') // * を .* に置換\n const regex = new RegExp(`^(refs/heads/)?${pattern}$`)\n\n filteredWorktrees = filteredWorktrees.filter(wt => {\n const branch = wt.branch || ''\n return regex.test(branch) || regex.test(branch.replace('refs/heads/', ''))\n })\n }\n\n return filteredWorktrees\n}\n\n// 同期対象を選択\nasync function selectTargetWorktrees(\n orchestraMembers: Worktree[],\n config: Config,\n branchName?: string,\n options: SyncOptions = {}\n): Promise<Worktree[]> {\n // まずフィルタリングを適用\n const filteredWorktrees = filterWorktrees(orchestraMembers, options)\n\n if (filteredWorktrees.length === 0) {\n throw new Error('フィルター条件に一致する演奏者が見つかりません')\n }\n\n if (options.all) {\n return filteredWorktrees\n }\n\n if (options.fzf && !branchName) {\n return selectWithFzf(filteredWorktrees)\n }\n\n if (branchName) {\n const target = filteredWorktrees.find(wt => {\n const branch = wt.branch?.replace('refs/heads/', '')\n return branch === branchName || wt.branch === branchName\n })\n\n if (!target) {\n throw new Error(`演奏者 '${branchName}' が見つかりません`)\n }\n\n return [target]\n }\n\n // インタラクティブ選択\n const { selectedBranches } = await inquirer.prompt([\n {\n type: 'checkbox',\n name: 'selectedBranches',\n message: '同期する演奏者を選択してください:',\n choices: filteredWorktrees.map(wt => {\n const branchName = wt.branch?.replace('refs/heads/', '') || wt.branch\n const displayPath = formatPath(wt.path, config)\n return {\n name: `${chalk.cyan(branchName)} ${chalk.gray(displayPath)}`,\n value: wt,\n }\n }),\n },\n ])\n\n if (selectedBranches.length === 0) {\n console.log(chalk.gray('キャンセルされました'))\n process.exit(0)\n }\n\n return selectedBranches\n}\n\n// Dry-run処理\nasync function performDryRun(\n targetWorktrees: Worktree[],\n mainBranch: string,\n options: SyncOptions\n): Promise<void> {\n console.log('\\n' + chalk.bold('🔍 実行内容プレビュー:'))\n console.log(chalk.gray(`メインブランチ: ${mainBranch}`))\n console.log(chalk.gray(`同期方法: ${options.rebase ? 'rebase' : 'merge'}`))\n console.log(chalk.gray(`同期後のpush: ${options.push ? 'あり' : 'なし'}`))\n console.log('\\n' + chalk.bold('同期予定の演奏者:'))\n\n for (const worktree of targetWorktrees) {\n const branchName = worktree.branch?.replace('refs/heads/', '') || worktree.branch\n\n try {\n const { stdout: status } = await execa('git', ['status', '--porcelain'], {\n cwd: worktree.path,\n })\n\n const { stdout: behind } = await execa(\n 'git',\n ['rev-list', '--count', `${branchName}..${mainBranch}`],\n {\n cwd: worktree.path,\n }\n )\n\n const behindCount = parseInt(behind.trim())\n\n if (status.trim()) {\n console.log(\n `⏭️ ${chalk.cyan(branchName)} - ${chalk.yellow('スキップ')} (未コミットの変更)`\n )\n } else if (behindCount === 0) {\n console.log(`✅ ${chalk.cyan(branchName)} - ${chalk.green('up-to-date')} (スキップ)`)\n } else {\n console.log(\n `🔄 ${chalk.cyan(branchName)} - ${chalk.blue(`${behindCount}コミット遅れ`)} (${options.rebase ? 'rebase' : 'merge'})`\n )\n }\n } catch (error) {\n console.log(\n `❌ ${chalk.cyan(branchName)} - ${chalk.red('エラー')} (${error instanceof Error ? error.message : '不明なエラー'})`\n )\n }\n }\n\n console.log('\\n' + chalk.gray('実際に同期を実行するには --dry-run を外して再実行してください'))\n}\n\n// 単一のWorktreeを同期\nasync function syncSingleWorktree(\n worktree: Worktree,\n mainBranch: string,\n options: SyncOptions\n): Promise<SyncResult> {\n const branchName = worktree.branch?.replace('refs/heads/', '') || worktree.branch || ''\n\n try {\n // 現在のブランチの状態を保存\n const { stdout: status } = await execa('git', ['status', '--porcelain'], {\n cwd: worktree.path,\n })\n\n if (status.trim()) {\n return { branch: branchName, status: 'skipped', reason: '未コミットの変更' }\n }\n\n // up-to-dateチェック\n const { stdout: behind } = await execa(\n 'git',\n ['rev-list', '--count', `${branchName}..${mainBranch}`],\n {\n cwd: worktree.path,\n }\n )\n\n const behindCount = parseInt(behind.trim())\n\n if (behindCount === 0) {\n return { branch: branchName, status: 'up-to-date', reason: '既に最新' }\n }\n\n // 同期実行\n if (options.rebase) {\n await execa('git', ['rebase', mainBranch], { cwd: worktree.path })\n\n // pushオプション\n if (options.push) {\n await execa('git', ['push', '--force-with-lease'], { cwd: worktree.path })\n }\n\n return {\n branch: branchName,\n status: 'success',\n method: 'rebase',\n pushed: options.push,\n }\n } else {\n await execa('git', ['merge', mainBranch, '--no-edit'], { cwd: worktree.path })\n\n // pushオプション\n if (options.push) {\n await execa('git', ['push'], { cwd: worktree.path })\n }\n\n return {\n branch: branchName,\n status: 'success',\n method: 'merge',\n pushed: options.push,\n }\n }\n } catch (error) {\n return {\n branch: branchName,\n status: 'failed',\n error: error instanceof Error ? error.message : '不明なエラー',\n }\n }\n}\n\n// 結果サマリーを表示\nfunction displaySyncResults(results: SyncResult[]): void {\n console.log('\\n' + chalk.bold('🎼 同期結果:\\n'))\n\n const successCount = results.filter(r => r.status === 'success').length\n const failedCount = results.filter(r => r.status === 'failed').length\n const skippedCount = results.filter(r => r.status === 'skipped').length\n const upToDateCount = results.filter(r => r.status === 'up-to-date').length\n\n results.forEach(result => {\n const icon =\n result.status === 'success'\n ? '✅'\n : result.status === 'failed'\n ? '❌'\n : result.status === 'up-to-date'\n ? '🔄'\n : '⏭️'\n const statusText =\n result.status === 'success'\n ? chalk.green(`成功 (${result.method}${result.pushed ? ' + push' : ''})`)\n : result.status === 'failed'\n ? chalk.red('失敗')\n : result.status === 'up-to-date'\n ? chalk.blue('up-to-date')\n : chalk.yellow('スキップ')\n\n console.log(`${icon} ${chalk.cyan(result.branch)} - ${statusText}`)\n if (result.reason) {\n console.log(` ${chalk.gray(result.reason)}`)\n }\n if (result.error) {\n console.log(` ${chalk.red(result.error)}`)\n }\n })\n\n console.log(\n chalk.gray(\n `\\n合計: ${successCount} 成功, ${failedCount} 失敗, ${skippedCount} スキップ, ${upToDateCount} up-to-date`\n )\n )\n\n if (failedCount > 0) {\n console.log(chalk.yellow('\\n💡 ヒント: 競合が発生した場合は、各演奏者で手動で解決してください'))\n }\n}\n\nexport const syncCommand = new Command('sync')\n .alias('s')\n .description('メインブランチの変更を演奏者に同期')\n .argument('[branch-name]', '同期する演奏者のブランチ名')\n .option('-a, --all', '全ての演奏者に同期')\n .option('-m, --main <branch>', 'メインブランチを指定 (デフォルト: main または master)')\n .option('--fzf', 'fzfで同期する演奏者を選択')\n .option('--rebase', 'マージの代わりにrebaseを使用')\n .option('--dry-run', '実行内容のみ表示(実際の同期は行わない)')\n .option('--push', 'merge/rebase後にgit pushを実施')\n .option('--filter <keyword>', 'ブランチ名またはパスでworktreeをフィルタ')\n .option(\n '--pattern <pattern>',\n 'ワイルドカードパターンでworktreeをフィルタ (例: feature/*, bug-fix-*)'\n )\n .option('-f, --files', '環境変数・設定ファイルを同期')\n .option('-i, --interactive', 'インタラクティブモードで同期するファイルを選択')\n .option('-p, --preset <name>', '同期プリセットを使用(env, config, all)')\n .option('-c, --concurrency <number>', '並列実行数 (デフォルト: 5)', parseInt)\n .exitOverride()\n .action(async (branchName?: string, options: SyncOptions = {}) => {\n await executeSyncCommand(branchName, options)\n })\n\n// 同期コマンドのメイン処理\nasync function executeSyncCommand(branchName?: string, options: SyncOptions = {}): Promise<void> {\n const spinner = ora('演奏者を確認中...').start()\n\n try {\n // 設定を取得\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n\n // 初期化\n const { worktrees, orchestraMembers, mainBranch } = await initializeSync(spinner, options)\n\n // 同期対象を選択\n spinner.stop()\n const targetWorktrees = await selectTargetWorktrees(\n orchestraMembers,\n config,\n branchName,\n options\n )\n spinner.start()\n\n // メインブランチを更新\n await updateMainBranch(spinner, worktrees, mainBranch)\n\n // Dry-run処理\n if (options.dryRun) {\n await performDryRun(targetWorktrees, mainBranch, options)\n return\n }\n\n // 同期実行\n const results = await performSync(targetWorktrees, mainBranch, options)\n\n // 結果表示\n displaySyncResults(results)\n\n if (options.push && results.some(r => r.status === 'success')) {\n console.log(chalk.cyan('\\n🚀 リモートリポジトリにプッシュしました'))\n }\n\n // 環境変数・設定ファイルの同期\n if (options.files || options.interactive || options.preset) {\n await syncEnvironmentFiles(worktrees, targetWorktrees, options)\n }\n } catch (error) {\n spinner.fail('同期に失敗しました')\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exit(1)\n }\n}\n\n// 初期化処理\nasync function initializeSync(\n spinner: Ora,\n options: SyncOptions\n): Promise<{\n worktrees: Worktree[]\n orchestraMembers: Worktree[]\n mainBranch: string\n}> {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n spinner.fail('このディレクトリはGitリポジトリではありません')\n process.exit(1)\n }\n\n // メインブランチを特定\n const mainBranch = await detectMainBranch(gitManager, options.main)\n\n spinner.text = 'ワークツリーを取得中...'\n const worktrees = await gitManager.listWorktrees()\n const orchestraMembers = worktrees.filter(wt => !wt.path.endsWith('.'))\n\n if (orchestraMembers.length === 0) {\n spinner.fail('演奏者が存在しません')\n process.exit(0)\n }\n\n return { worktrees, orchestraMembers, mainBranch }\n}\n\n// メインブランチの更新\nasync function updateMainBranch(\n spinner: Ora,\n worktrees: Worktree[],\n mainBranch: string\n): Promise<void> {\n spinner.text = `${mainBranch} ブランチを最新に更新中...`\n\n const mainWorktree = worktrees.find(wt => wt.path.endsWith('.'))\n if (mainWorktree) {\n await execa('git', ['fetch', 'origin', mainBranch], { cwd: mainWorktree.path })\n await execa('git', ['checkout', mainBranch], { cwd: mainWorktree.path })\n await execa('git', ['pull', 'origin', mainBranch], { cwd: mainWorktree.path })\n }\n\n spinner.succeed(`${mainBranch} ブランチを最新に更新しました`)\n}\n\n// 同期の実行\nasync function performSync(\n targetWorktrees: Worktree[],\n mainBranch: string,\n options: SyncOptions\n): Promise<SyncResult[]> {\n const progressBar = new cliProgress.SingleBar({\n format: '同期進捗 |' + chalk.cyan('{bar}') + '| {percentage}% | {value}/{total} | {branch}',\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true,\n })\n\n const results: SyncResult[] = []\n progressBar.start(targetWorktrees.length, 0)\n\n // 並列実行制限を設定\n const concurrency = options.concurrency || 5\n const limit = pLimit(concurrency)\n\n const syncPromises = targetWorktrees.map((worktree, index) =>\n limit(async () => {\n const result = await syncSingleWorktree(worktree, mainBranch, options)\n progressBar.update(index + 1, { branch: result.branch })\n return result\n })\n )\n\n const syncResults = await Promise.allSettled(syncPromises)\n\n syncResults.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n results.push(result.value)\n } else {\n const branchName =\n targetWorktrees[index]?.branch?.replace('refs/heads/', '') ||\n targetWorktrees[index]?.branch ||\n 'unknown'\n results.push({\n branch: branchName,\n status: 'failed',\n error: result.reason instanceof Error ? result.reason.message : '不明なエラー',\n })\n }\n })\n\n progressBar.stop()\n return results\n}\n\n// プリセット定義\nconst FILE_SYNC_PRESETS = {\n env: ['.env', '.env.local', '.env.development', '.env.production'],\n config: ['config.json', 'settings.json', '.vscode/settings.json', 'tsconfig.json'],\n all: [\n '.env',\n '.env.local',\n '.env.development',\n '.env.production',\n 'config.json',\n 'settings.json',\n '.vscode/settings.json',\n 'tsconfig.json',\n 'package.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'package-lock.json',\n ],\n}\n\n// 同期するファイルを決定\nasync function determineFilesToSync(\n options: SyncOptions,\n config: { development?: { syncFiles?: string[] } },\n allWorktrees: Worktree[]\n): Promise<string[]> {\n let filesToSync: string[] = config.development?.syncFiles || ['.env', '.env.local']\n\n if (options.preset && FILE_SYNC_PRESETS[options.preset as keyof typeof FILE_SYNC_PRESETS]) {\n filesToSync = FILE_SYNC_PRESETS[options.preset as keyof typeof FILE_SYNC_PRESETS]\n }\n\n // メインワークツリーのパス\n const mainWorktree = allWorktrees.find(wt => wt.path.endsWith('.'))\n if (!mainWorktree) {\n console.error(chalk.red('メインワークツリーが見つかりません'))\n return []\n }\n\n // インタラクティブモード\n if (options.interactive) {\n const availableFiles = await findAvailableFiles(mainWorktree.path, filesToSync)\n\n if (availableFiles.length === 0) {\n console.log(chalk.yellow('同期可能なファイルが見つかりません'))\n return []\n }\n\n const { selectedFiles } = await inquirer.prompt([\n {\n type: 'checkbox',\n name: 'selectedFiles',\n message: '同期するファイルを選択:',\n choices: availableFiles.map(file => ({\n name: file,\n value: file,\n checked: filesToSync.includes(file),\n })),\n },\n ])\n\n filesToSync = selectedFiles\n }\n\n return filesToSync\n}\n\n// 利用可能なファイルを検索\nasync function findAvailableFiles(\n mainWorktreePath: string,\n defaultFiles: string[]\n): Promise<string[]> {\n const availableFiles: string[] = []\n const potentialFiles = [\n ...new Set([\n ...defaultFiles,\n ...FILE_SYNC_PRESETS.all,\n '.env',\n '.env.local',\n '.env.development',\n '.env.production',\n '.env.test',\n 'config.json',\n 'settings.json',\n '.vscode/settings.json',\n 'tsconfig.json',\n 'jsconfig.json',\n '.prettierrc',\n '.eslintrc.json',\n 'CLAUDE.md',\n ]),\n ]\n\n for (const file of potentialFiles) {\n try {\n await fs.access(path.join(mainWorktreePath, file))\n availableFiles.push(file)\n } catch {\n // ファイルが存在しない\n }\n }\n\n return availableFiles\n}\n\n// ファイル同期の実行\nasync function performFileSync(\n targetWorktrees: Worktree[],\n filesToSync: string[],\n mainWorktreePath: string\n): Promise<{ syncedCount: number; failedCount: number }> {\n const syncSpinner = ora('ファイルを同期中...').start()\n let syncedCount = 0\n let failedCount = 0\n\n for (const worktree of targetWorktrees) {\n for (const file of filesToSync) {\n try {\n const sourcePath = path.join(mainWorktreePath, file)\n const destPath = path.join(worktree.path, file)\n\n // ソースファイルが存在するか確認\n await fs.access(sourcePath)\n\n // ディレクトリを作成\n await fs.mkdir(path.dirname(destPath), { recursive: true })\n\n // ファイルをコピー\n await fs.copyFile(sourcePath, destPath)\n syncedCount++\n } catch {\n failedCount++\n // エラーは無視して続行\n }\n }\n }\n\n syncSpinner.stop()\n return { syncedCount, failedCount }\n}\n\n// ファイル同期結果の表示\nfunction displayFileSyncResults(\n filesToSync: string[],\n syncedCount: number,\n failedCount: number\n): void {\n console.log(chalk.green(`\\n✨ ファイル同期完了: ${syncedCount}件成功, ${failedCount}件失敗`))\n\n if (filesToSync.length > 0) {\n console.log(chalk.gray('\\n同期したファイル:'))\n filesToSync.forEach(file => {\n console.log(chalk.gray(` - ${file}`))\n })\n }\n}\n\n// 環境変数・設定ファイルの同期\n\nasync function syncEnvironmentFiles(\n allWorktrees: Worktree[],\n targetWorktrees: Worktree[],\n options: SyncOptions\n): Promise<void> {\n console.log(chalk.bold('\\n🔧 環境変数・設定ファイルの同期\\n'))\n\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n\n const filesToSync = await determineFilesToSync(options, config, allWorktrees)\n\n // メインワークツリーのパス\n const mainWorktree = allWorktrees.find(wt => wt.path.endsWith('.'))\n if (!mainWorktree) {\n console.error(chalk.red('メインワークツリーが見つかりません'))\n return\n }\n\n if (!filesToSync || filesToSync.length === 0) {\n return\n }\n\n // 同期実行\n const { syncedCount, failedCount } = await performFileSync(\n targetWorktrees,\n filesToSync,\n mainWorktree.path\n )\n\n // 結果表示\n displayFileSyncResults(filesToSync, syncedCount, failedCount)\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { ConfigManager } from '../core/config.js'\nimport { execa } from 'execa'\nimport { formatPath } from '../utils/path.js'\n\n// 型定義\ninterface ReviewOptions {\n checkout?: boolean\n diff?: boolean\n web?: boolean\n approve?: boolean\n requestChanges?: boolean\n comment?: string\n assign?: string\n autoFlow?: boolean\n}\n\ninterface GithubUser {\n login: string\n}\n\ninterface PullRequest {\n number: number\n title: string\n author: GithubUser\n body?: string\n headRefName: string\n baseRefName: string\n state: string\n url: string\n isDraft?: boolean\n reviewers?: GithubUser[]\n assignees?: GithubUser[]\n}\n\n// エラークラス\nclass ReviewCommandError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ReviewCommandError'\n }\n}\n\n// ハンドラ関数\nasync function checkoutPR(pr: PullRequest, gitManager: GitWorktreeManager): Promise<void> {\n const checkoutSpinner = ora('PRを演奏者として招集中...').start()\n\n try {\n // 既存のワークツリーを確認\n const worktrees = await gitManager.listWorktrees()\n const prBranchName = `pr/${pr.number}`\n const existingWorktree = worktrees.find(wt => wt.branch?.includes(prBranchName))\n\n if (existingWorktree) {\n checkoutSpinner.warn(`演奏者 '${prBranchName}' は既に存在します`)\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n console.log(chalk.gray(`📁 ${formatPath(existingWorktree.path, config)}`))\n } else {\n // gh pr checkoutを使用してPRをフェッチ\n await execa('gh', ['pr', 'checkout', pr.number.toString(), '--recurse-submodules'])\n\n // 現在のブランチ名を取得\n const { stdout: currentBranch } = await execa('git', ['branch', '--show-current'])\n\n // ワークツリーを作成\n const worktreePath = await gitManager.createWorktree(currentBranch)\n\n checkoutSpinner.succeed(`PR #${pr.number} を演奏者 '${currentBranch}' として招集しました`)\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n console.log(chalk.gray(`📁 ${formatPath(worktreePath, config)}`))\n console.log(chalk.green(`\\ncd ${formatPath(worktreePath, config)} で移動できます`))\n }\n } catch (error) {\n checkoutSpinner.fail('PRのチェックアウトに失敗しました')\n throw new ReviewCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function showDiff(prNumber: string): Promise<void> {\n console.log(chalk.bold('\\n📝 PRの差分:\\n'))\n await execa('gh', ['pr', 'diff', prNumber], { stdio: 'inherit' })\n}\n\nasync function openInBrowser(prNumber: string): Promise<void> {\n console.log(chalk.cyan(`\\n🌐 ブラウザでPR #${prNumber} を開いています...`))\n await execa('gh', ['pr', 'view', prNumber, '--web'])\n}\n\nasync function addComment(prNumber: string, comment: string): Promise<void> {\n const commentSpinner = ora('コメントを投稿中...').start()\n try {\n await execa('gh', ['pr', 'comment', prNumber, '--body', comment])\n commentSpinner.succeed('コメントを投稿しました')\n } catch (error) {\n commentSpinner.fail('コメントの投稿に失敗しました')\n throw new ReviewCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function approvePR(prNumber: string): Promise<void> {\n const approveSpinner = ora('PRを承認中...').start()\n try {\n await execa('gh', ['pr', 'review', prNumber, '--approve'])\n approveSpinner.succeed(`PR #${prNumber} を承認しました`)\n } catch (error) {\n approveSpinner.fail('PRの承認に失敗しました')\n throw new ReviewCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function requestChanges(prNumber: string, comment?: string): Promise<void> {\n const requestSpinner = ora('変更を要求中...').start()\n try {\n const args = ['pr', 'review', prNumber, '--request-changes']\n if (comment) {\n args.push('--body', comment)\n }\n await execa('gh', args)\n requestSpinner.succeed(`PR #${prNumber} に変更を要求しました`)\n } catch (error) {\n requestSpinner.fail('変更要求に失敗しました')\n throw new ReviewCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function addReviewer(prNumber: string, reviewer: string): Promise<void> {\n const reviewerSpinner = ora(`${reviewer} をレビュアーに追加中...`).start()\n try {\n await execa('gh', ['pr', 'edit', prNumber, '--add-reviewer', reviewer])\n reviewerSpinner.succeed(`PR #${prNumber} に ${reviewer} をレビュアーとして追加しました`)\n } catch (error) {\n reviewerSpinner.fail('レビュアーの追加に失敗しました')\n throw new ReviewCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function refreshStatus(prNumber: string): Promise<PullRequest> {\n const statusSpinner = ora('PR情報を再取得中...').start()\n try {\n const { stdout: prJson } = await execa('gh', [\n 'pr',\n 'view',\n prNumber,\n '--json',\n 'number,title,author,body,headRefName,baseRefName,state,url,reviewers,assignees',\n ])\n\n const pr = JSON.parse(prJson) as PullRequest\n statusSpinner.succeed('PR情報を更新しました')\n\n // 更新された情報を表示\n console.log(chalk.bold(`\\n📋 PR #${pr.number}: ${pr.title}\\n`))\n console.log(chalk.gray(`Author: ${pr.author.login}`))\n console.log(chalk.gray(`Branch: ${pr.headRefName} → ${pr.baseRefName}`))\n console.log(chalk.gray(`State: ${pr.state}`))\n\n if (pr.reviewers && pr.reviewers.length > 0) {\n console.log(chalk.gray(`Reviewers: ${pr.reviewers.map(r => r.login).join(', ')}`))\n }\n\n if (pr.assignees && pr.assignees.length > 0) {\n console.log(chalk.gray(`Assignees: ${pr.assignees.map(a => a.login).join(', ')}`))\n }\n\n return pr\n } catch (error) {\n statusSpinner.fail('PR情報の取得に失敗しました')\n throw new ReviewCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\n// 自動レビュー&マージフロー\nasync function autoReviewFlow(_branchName: string, baseBranch: string = 'main'): Promise<void> {\n const autoSpinner = ora('自動レビュー&マージフローを開始中...').start()\n\n try {\n // 1. fetch origin main && rebase origin/main\n autoSpinner.text = 'ベースブランチをフェッチ中...'\n await execa('git', ['fetch', 'origin', baseBranch])\n\n autoSpinner.text = 'リベース中...'\n try {\n await execa('git', ['rebase', `origin/${baseBranch}`])\n autoSpinner.succeed('リベースが完了しました')\n } catch {\n autoSpinner.warn('競合が発生しました')\n\n // 2. 競合が出たらclaude /resolve-conflictを起動\n console.log(chalk.yellow('\\n🔧 競合を解決するためにClaude Codeを起動します...'))\n console.log(chalk.gray('Claude Codeで以下のコマンドを実行してください:'))\n console.log(chalk.cyan(' /resolve-conflict'))\n\n try {\n await execa('claude', [], { stdio: 'inherit' })\n } catch {\n console.log(chalk.red('Claude Codeの起動に失敗しました'))\n throw new ReviewCommandError('競合解決のためにClaude Codeを手動で起動してください')\n }\n\n return\n }\n\n // 3. claude /review --diff origin/main でコードレビュー\n console.log(chalk.blue('\\n📝 Claude Codeでコードレビューを実行します...'))\n console.log(chalk.gray('Claude Codeで以下のコマンドを実行してください:'))\n console.log(chalk.cyan(` /review --diff origin/${baseBranch}`))\n\n try {\n await execa('claude', [], { stdio: 'inherit' })\n } catch {\n console.log(chalk.yellow('Claude Codeの起動に失敗しました'))\n }\n\n // 4. claude \"Generate Conventional Commit message\" でコミット作成\n const { useConventionalCommit } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'useConventionalCommit',\n message: 'Conventional Commitメッセージを自動生成しますか?',\n default: true,\n },\n ])\n\n if (useConventionalCommit) {\n console.log(chalk.blue('\\n💬 Conventional Commitメッセージを生成中...'))\n console.log(chalk.gray('Claude Codeで以下のコマンドを実行してください:'))\n console.log(chalk.cyan(' \"Generate Conventional Commit message for current changes\"'))\n\n try {\n await execa('claude', [], { stdio: 'inherit' })\n } catch {\n console.log(chalk.yellow('Claude Codeの起動に失敗しました'))\n }\n }\n\n // 5. GitHub PR を API 経由で作成\n const { createPR } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'createPR',\n message: 'GitHub PRを作成しますか?',\n default: true,\n },\n ])\n\n if (createPR) {\n const prSpinner = ora('GitHub PRを作成中...').start()\n try {\n await execa('gh', ['pr', 'create', '--fill'])\n prSpinner.succeed('GitHub PRを作成しました')\n } catch (error) {\n prSpinner.fail('GitHub PRの作成に失敗しました')\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n }\n }\n } catch (error) {\n autoSpinner.fail('自動レビューフローでエラーが発生しました')\n throw new ReviewCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nexport const reviewCommand = new Command('review')\n .alias('r')\n .description('PRレビューをサポート')\n .argument('[pr-number]', 'PR番号')\n .option('-c, --checkout', 'PRを演奏者として招集してチェックアウト')\n .option('-d, --diff', 'PRの差分を表示')\n .option('-w, --web', 'ブラウザでPRを開く')\n .option('-a, --approve', 'PRを承認')\n .option('--request-changes', '変更を要求')\n .option('--comment <comment>', 'コメントを追加')\n .option('--assign <user>', 'レビュアーを追加')\n .option('--auto-flow', '自動レビュー&マージフローを実行')\n .exitOverride()\n .action(async (prNumber?: string, options: ReviewOptions = {}) => {\n const spinner = ora('PR情報を取得中...').start()\n\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n throw new ReviewCommandError('このディレクトリはGitリポジトリではありません')\n }\n\n // GitHubリポジトリか確認\n try {\n await execa('gh', ['repo', 'view'])\n } catch {\n spinner.fail('GitHubリポジトリではありません')\n console.log(chalk.yellow('gh CLIがインストールされていないか、認証されていません'))\n throw new ReviewCommandError('GitHubリポジトリへのアクセスに失敗しました')\n }\n\n // PR番号が指定されていない場合は一覧から選択\n if (!prNumber) {\n spinner.text = 'PR一覧を取得中...'\n\n const { stdout: prListJson } = await execa('gh', [\n 'pr',\n 'list',\n '--json',\n 'number,title,author,isDraft,state',\n '--limit',\n '30',\n ])\n\n const prs = JSON.parse(prListJson) as PullRequest[]\n\n if (prs.length === 0) {\n throw new ReviewCommandError('オープンなPRが見つかりません')\n }\n\n spinner.stop()\n\n const { selectedPR } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedPR',\n message: 'レビューするPRを選択:',\n choices: prs.map(pr => ({\n name: `#${pr.number} ${pr.title} ${chalk.gray(`by ${pr.author.login}`)}${\n pr.isDraft ? chalk.yellow(' [draft]') : ''\n }`,\n value: pr.number.toString(),\n })),\n pageSize: 15,\n },\n ])\n\n prNumber = selectedPR\n }\n\n if (!prNumber) {\n throw new ReviewCommandError('PR番号が指定されていません')\n }\n\n spinner.text = `PR #${prNumber} の情報を取得中...`\n\n // PR情報を取得\n const { stdout: prJson } = await execa('gh', [\n 'pr',\n 'view',\n prNumber,\n '--json',\n 'number,title,author,body,headRefName,baseRefName,state,url',\n ])\n\n const pr = JSON.parse(prJson) as PullRequest\n\n spinner.succeed(`PR #${pr.number}: ${pr.title}`)\n console.log(chalk.gray(`Author: ${pr.author.login}`))\n console.log(chalk.gray(`Branch: ${pr.headRefName} → ${pr.baseRefName}`))\n console.log(chalk.gray(`URL: ${pr.url}`))\n\n // 自動レビューフローの処理\n if (options.autoFlow) {\n await autoReviewFlow(pr.headRefName, pr.baseRefName)\n return\n }\n\n // コマンドラインオプションの処理\n if (options.checkout) {\n await checkoutPR(pr, gitManager)\n return\n }\n\n if (options.diff) {\n await showDiff(prNumber)\n return\n }\n\n if (options.web) {\n await openInBrowser(prNumber)\n return\n }\n\n if (options.comment) {\n await addComment(prNumber, options.comment)\n return\n }\n\n if (options.approve) {\n await approvePR(prNumber)\n return\n }\n\n if (options.requestChanges) {\n await requestChanges(prNumber)\n return\n }\n\n if (options.assign) {\n await addReviewer(prNumber, options.assign)\n return\n }\n\n // インタラクティブメニュー\n console.log()\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: '何をしますか?',\n choices: [\n { name: '🎼 PRを演奏者として招集する', value: 'checkout' },\n { name: '📝 差分を表示', value: 'diff' },\n { name: '🌐 ブラウザで開く', value: 'web' },\n { name: '💬 コメントを追加', value: 'comment' },\n { name: '✅ PRを承認', value: 'approve' },\n { name: '🛠️ 変更を要求', value: 'request-changes' },\n { name: '👥 レビュアーを追加', value: 'add-reviewer' },\n { name: '🚀 自動レビュー&マージフロー', value: 'auto-flow' },\n { name: '🔄 ステータスを再取得', value: 'refresh' },\n { name: '❌ キャンセル', value: 'cancel' },\n ],\n },\n ])\n\n switch (action) {\n case 'checkout':\n await checkoutPR(pr, gitManager)\n break\n case 'diff':\n await showDiff(prNumber)\n break\n case 'web':\n await openInBrowser(prNumber)\n break\n case 'comment': {\n const { comment } = await inquirer.prompt([\n {\n type: 'input',\n name: 'comment',\n message: 'コメント内容:',\n validate: input => input.trim().length > 0 || 'コメントを入力してください',\n },\n ])\n await addComment(prNumber, comment)\n break\n }\n case 'approve':\n await approvePR(prNumber)\n break\n case 'request-changes': {\n const { includeComment } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'includeComment',\n message: 'コメントを含めますか?',\n default: true,\n },\n ])\n\n let comment\n if (includeComment) {\n const response = await inquirer.prompt([\n {\n type: 'input',\n name: 'comment',\n message: '変更要求の理由:',\n validate: input => input.trim().length > 0 || '理由を入力してください',\n },\n ])\n comment = response.comment\n }\n\n await requestChanges(prNumber, comment)\n break\n }\n case 'add-reviewer': {\n const { reviewer } = await inquirer.prompt([\n {\n type: 'input',\n name: 'reviewer',\n message: 'レビュアーのユーザー名:',\n validate: input => input.trim().length > 0 || 'ユーザー名を入力してください',\n },\n ])\n await addReviewer(prNumber, reviewer)\n break\n }\n case 'auto-flow':\n await autoReviewFlow(pr.headRefName, pr.baseRefName)\n break\n case 'refresh':\n await refreshStatus(prNumber)\n break\n case 'cancel':\n console.log(chalk.gray('キャンセルされました'))\n break\n }\n } catch (error) {\n spinner.fail('エラーが発生しました')\n if (error instanceof ReviewCommandError) {\n console.error(chalk.red(error.message))\n process.exitCode = 1\n } else {\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exitCode = 1\n }\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { execa } from 'execa'\n\n// 型定義\ninterface IssueOptions {\n list?: boolean\n create?: boolean\n close?: boolean\n web?: boolean\n assign?: string\n label?: string\n milestone?: string\n}\n\ninterface GithubLabel {\n name: string\n color: string\n}\n\ninterface GithubUser {\n login: string\n}\n\ninterface GithubIssue {\n number: number\n title: string\n author: GithubUser\n body?: string\n state: string\n url: string\n labels: GithubLabel[]\n assignees: GithubUser[]\n}\n\n// エラークラス\nclass IssueCommandError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'IssueCommandError'\n }\n}\n\n// ハンドラ関数\nasync function closeIssue(issueNumber: string): Promise<void> {\n const closeSpinner = ora('Issueをクローズ中...').start()\n try {\n await execa('gh', ['issue', 'close', issueNumber])\n closeSpinner.succeed(`Issue #${issueNumber} をクローズしました`)\n } catch (error) {\n closeSpinner.fail('Issueのクローズに失敗しました')\n throw new IssueCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function openInBrowser(issueNumber: string): Promise<void> {\n console.log(chalk.cyan(`\\n🌐 ブラウザでIssue #${issueNumber} を開いています...`))\n await execa('gh', ['issue', 'view', issueNumber, '--web'])\n}\n\nasync function assignUser(issueNumber: string, assignee: string): Promise<void> {\n const assignSpinner = ora(`${assignee} にアサイン中...`).start()\n try {\n await execa('gh', ['issue', 'edit', issueNumber, '--add-assignee', assignee])\n assignSpinner.succeed(`Issue #${issueNumber} を ${assignee} にアサインしました`)\n } catch (error) {\n assignSpinner.fail('アサインに失敗しました')\n throw new IssueCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function addLabels(issueNumber: string, labels: string): Promise<void> {\n const labelList = labels\n .split(',')\n .map(l => l.trim())\n .filter(Boolean)\n const labelSpinner = ora(`ラベル '${labelList.join(', ')}' を追加中...`).start()\n\n try {\n const args = ['issue', 'edit', issueNumber]\n labelList.forEach(label => {\n args.push('--add-label', label)\n })\n\n await execa('gh', args)\n labelSpinner.succeed(`Issue #${issueNumber} にラベル '${labelList.join(', ')}' を追加しました`)\n } catch (error) {\n labelSpinner.fail('ラベルの追加に失敗しました')\n throw new IssueCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function setMilestone(issueNumber: string, milestone: string): Promise<void> {\n const milestoneSpinner = ora(`マイルストーン '${milestone}' を設定中...`).start()\n try {\n await execa('gh', ['issue', 'edit', issueNumber, '--milestone', milestone])\n milestoneSpinner.succeed(`Issue #${issueNumber} にマイルストーン '${milestone}' を設定しました`)\n } catch (error) {\n milestoneSpinner.fail('マイルストーンの設定に失敗しました')\n throw new IssueCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nexport const issueCommand = new Command('issue')\n .alias('i')\n .description('GitHub Issueを管理')\n .argument('[issue-number]', 'Issue番号')\n .option('-l, --list', 'Issue一覧を表示')\n .option('-c, --create', '新しいIssueを作成')\n .option('--close', 'Issueをクローズ')\n .option('-w, --web', 'ブラウザでIssueを開く')\n .option('-a, --assign <user>', 'Issueをアサイン')\n .option('--label <label>', 'ラベルを追加(カンマ区切りで複数指定可)')\n .option('--milestone <milestone>', 'マイルストーンを設定')\n .exitOverride()\n .action(async (issueNumber?: string, options: IssueOptions = {}) => {\n const spinner = ora('Issue情報を取得中...').start()\n\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n throw new IssueCommandError('このディレクトリはGitリポジトリではありません')\n }\n\n // GitHubリポジトリか確認\n try {\n await execa('gh', ['repo', 'view'])\n } catch {\n spinner.fail('GitHubリポジトリではありません')\n console.log(chalk.yellow('gh CLIがインストールされていないか、認証されていません'))\n throw new IssueCommandError('GitHubリポジトリへのアクセスに失敗しました')\n }\n\n // 'list' という引数が渡された場合は --list オプションとして扱う\n if (issueNumber === 'list') {\n options.list = true\n issueNumber = undefined\n }\n\n // Issue一覧を表示\n if (options.list) {\n spinner.text = 'Issue一覧を取得中...'\n\n const { stdout: issueListJson } = await execa('gh', [\n 'issue',\n 'list',\n '--json',\n 'number,title,author,state,labels,assignees',\n '--limit',\n '30',\n ])\n\n const issues = JSON.parse(issueListJson) as GithubIssue[]\n spinner.stop()\n\n if (issues.length === 0) {\n console.log(chalk.yellow('オープンなIssueが見つかりません'))\n return\n }\n\n console.log(chalk.bold('\\n📋 Issue一覧:\\n'))\n\n issues.forEach(issue => {\n const labels = issue.labels.map(l => chalk.hex('#' + l.color)(`[${l.name}]`)).join(' ')\n const assignees =\n issue.assignees.length > 0\n ? chalk.gray(` → ${issue.assignees.map(a => a.login).join(', ')}`)\n : ''\n\n console.log(\n `#${chalk.cyan(issue.number.toString().padEnd(5))} ${issue.title} ${labels}${assignees}`\n )\n console.log(chalk.gray(` by ${issue.author.login}\\n`))\n })\n\n return\n }\n\n // 新しいIssueを作成\n if (options.create) {\n spinner.stop()\n\n const { title } = await inquirer.prompt([\n {\n type: 'input',\n name: 'title',\n message: 'Issueのタイトル:',\n validate: input => input.trim().length > 0 || 'タイトルを入力してください',\n },\n ])\n\n const { body } = await inquirer.prompt([\n {\n type: 'editor',\n name: 'body',\n message: 'Issueの本文 (エディタが開きます):',\n },\n ])\n\n const createSpinner = ora('Issueを作成中...').start()\n\n try {\n const { stdout } = await execa('gh', [\n 'issue',\n 'create',\n '--title',\n title,\n '--body',\n body,\n ])\n\n const issueUrl = stdout.trim()\n createSpinner.succeed('Issueを作成しました')\n console.log(chalk.gray(`URL: ${issueUrl}`))\n\n // 作成したIssueから演奏者を招集するか確認\n const { createBranch } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'createBranch',\n message: 'このIssueから演奏者を招集しますか?',\n default: true,\n },\n ])\n\n if (createBranch) {\n const issueNumberMatch = issueUrl.match(/\\/(\\d+)$/)\n if (issueNumberMatch) {\n const newIssueNumber = issueNumberMatch[1]\n const branchName = `issue-${newIssueNumber}`\n\n const branchSpinner = ora('演奏者を招集中...').start()\n const worktreePath = await gitManager.createWorktree(branchName)\n branchSpinner.succeed(`演奏者 '${chalk.cyan(branchName)}' を招集しました`)\n console.log(chalk.gray(`📁 ${worktreePath}`))\n }\n }\n } catch (error) {\n createSpinner.fail('Issueの作成に失敗しました')\n throw new IssueCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n\n return\n }\n\n // Issue番号が必要な操作\n if (!issueNumber && !options.list && !options.create) {\n spinner.text = 'Issue一覧を取得中...'\n\n const { stdout: issueListJson } = await execa('gh', [\n 'issue',\n 'list',\n '--json',\n 'number,title,author,state',\n '--limit',\n '30',\n ])\n\n const issues = JSON.parse(issueListJson) as GithubIssue[]\n\n if (issues.length === 0) {\n throw new IssueCommandError('オープンなIssueが見つかりません')\n }\n\n spinner.stop()\n\n const { selectedIssue } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedIssue',\n message: 'Issueを選択:',\n choices: issues.map(issue => ({\n name: `#${issue.number} ${issue.title} ${chalk.gray(`by ${issue.author.login}`)}`,\n value: issue.number.toString(),\n })),\n pageSize: 15,\n },\n ])\n\n issueNumber = selectedIssue\n }\n\n if (issueNumber) {\n spinner.text = `Issue #${issueNumber} の情報を取得中...`\n\n // Issue情報を取得\n const { stdout: issueJson } = await execa('gh', [\n 'issue',\n 'view',\n issueNumber,\n '--json',\n 'number,title,author,body,state,url,labels,assignees',\n ])\n\n const issue = JSON.parse(issueJson) as GithubIssue\n spinner.stop()\n\n // コマンドラインオプションの処理\n if (options.close) {\n await closeIssue(issueNumber)\n return\n }\n\n if (options.web) {\n await openInBrowser(issueNumber)\n return\n }\n\n if (options.assign) {\n await assignUser(issueNumber, options.assign)\n return\n }\n\n if (options.label) {\n await addLabels(issueNumber, options.label)\n return\n }\n\n if (options.milestone) {\n await setMilestone(issueNumber, options.milestone)\n return\n }\n\n // Issue詳細を表示\n console.log(chalk.bold(`\\n📋 Issue #${issue.number}: ${issue.title}\\n`))\n console.log(chalk.gray(`Author: ${issue.author.login}`))\n console.log(chalk.gray(`State: ${issue.state}`))\n\n if (issue.labels.length > 0) {\n const labels = issue.labels.map(l => chalk.hex('#' + l.color)(`[${l.name}]`)).join(' ')\n console.log(chalk.gray(`Labels: ${labels}`))\n }\n\n if (issue.assignees.length > 0) {\n console.log(chalk.gray(`Assignees: ${issue.assignees.map(a => a.login).join(', ')}`))\n }\n\n console.log(chalk.gray(`URL: ${issue.url}`))\n\n if (issue.body) {\n console.log(chalk.gray('\\n--- 本文 ---'))\n console.log(issue.body)\n }\n\n // インタラクティブメニュー\n console.log()\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: '何をしますか?',\n choices: [\n { name: '🎼 このIssueから演奏者を招集する', value: 'create-branch' },\n { name: '🌐 ブラウザで開く', value: 'web' },\n { name: '✅ Issueをクローズ', value: 'close' },\n { name: '👤 アサイン', value: 'assign' },\n { name: '🏷️ ラベルを追加', value: 'label' },\n { name: '🏁 マイルストーンを設定', value: 'milestone' },\n { name: '❌ キャンセル', value: 'cancel' },\n ],\n },\n ])\n\n switch (action) {\n case 'create-branch': {\n const branchName = `issue-${issueNumber}`\n const branchSpinner = ora('演奏者を招集中...').start()\n\n try {\n const worktreePath = await gitManager.createWorktree(branchName)\n branchSpinner.succeed(`演奏者 '${chalk.cyan(branchName)}' を招集しました`)\n console.log(chalk.gray(`📁 ${worktreePath}`))\n } catch (error) {\n branchSpinner.fail('演奏者の招集に失敗しました')\n throw new IssueCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n break\n }\n case 'web':\n await openInBrowser(issueNumber)\n break\n case 'close':\n await closeIssue(issueNumber)\n break\n case 'assign': {\n const { assignee } = await inquirer.prompt([\n {\n type: 'input',\n name: 'assignee',\n message: 'アサインするユーザー名:',\n validate: input => input.trim().length > 0 || 'ユーザー名を入力してください',\n },\n ])\n await assignUser(issueNumber, assignee)\n break\n }\n case 'label': {\n const { label } = await inquirer.prompt([\n {\n type: 'input',\n name: 'label',\n message: 'ラベル名(カンマ区切りで複数指定可):',\n validate: input => input.trim().length > 0 || 'ラベル名を入力してください',\n },\n ])\n await addLabels(issueNumber, label)\n break\n }\n case 'milestone': {\n const { milestone } = await inquirer.prompt([\n {\n type: 'input',\n name: 'milestone',\n message: 'マイルストーン名:',\n validate: input => input.trim().length > 0 || 'マイルストーン名を入力してください',\n },\n ])\n await setMilestone(issueNumber, milestone)\n break\n }\n case 'cancel':\n console.log(chalk.gray('キャンセルされました'))\n break\n }\n }\n } catch (error) {\n spinner.fail('エラーが発生しました')\n if (error instanceof IssueCommandError) {\n console.error(chalk.red(error.message))\n process.exitCode = 1\n } else {\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exitCode = 1\n }\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { ConfigManager } from '../core/config.js'\nimport path from 'path'\nimport fs from 'fs/promises'\nimport { homedir } from 'os'\n\ninterface HistoryOptions {\n list?: boolean\n show?: string\n export?: string\n merge?: boolean\n cleanup?: boolean\n sync?: boolean\n json?: boolean\n}\n\ninterface ClaudeHistory {\n branch: string\n worktreePath: string\n historyPath: string\n lastModified?: Date\n size?: number\n}\n\n// Claude履歴ディレクトリのパスを取得\nfunction getClaudeHistoryDir(): string {\n return path.join(homedir(), '.claude', 'history')\n}\n\n// ブランチ名から履歴ファイルパスを生成\nfunction getHistoryPathForBranch(branchName: string): string {\n const template = '~/.claude/history/{branch}.md'\n const expandedPath = template\n .replace('~', homedir())\n .replace('{branch}', branchName.replace(/\\//g, '-'))\n return expandedPath\n}\n\n// 全ての履歴を検索\nasync function findAllHistories(gitManager: GitWorktreeManager): Promise<ClaudeHistory[]> {\n const histories: ClaudeHistory[] = []\n const worktrees = await gitManager.listWorktrees()\n\n for (const worktree of worktrees) {\n if (!worktree.branch) continue\n\n const historyPath = getHistoryPathForBranch(worktree.branch)\n\n try {\n const stats = await fs.stat(historyPath)\n histories.push({\n branch: worktree.branch,\n worktreePath: worktree.path,\n historyPath,\n lastModified: stats.mtime,\n size: stats.size,\n })\n } catch {\n // 履歴ファイルが存在しない場合はスキップ\n }\n }\n\n // グローバル履歴ディレクトリも検索\n const historyDir = getClaudeHistoryDir()\n try {\n const files = await fs.readdir(historyDir)\n for (const file of files) {\n if (!file.endsWith('.md')) continue\n\n const filePath = path.join(historyDir, file)\n const branchName = file.replace('.md', '').replace(/-/g, '/')\n\n // 既に見つかっているものはスキップ\n if (histories.some(h => h.historyPath === filePath)) continue\n\n try {\n const stats = await fs.stat(filePath)\n histories.push({\n branch: branchName,\n worktreePath: '', // worktreeが削除されている可能性\n historyPath: filePath,\n lastModified: stats.mtime,\n size: stats.size,\n })\n } catch {\n // ファイルが読めない場合はスキップ\n }\n }\n } catch {\n // 履歴ディレクトリが存在しない場合\n }\n\n return histories\n}\n\n// 履歴を表示\nasync function listHistories(histories: ClaudeHistory[]): Promise<void> {\n if (histories.length === 0) {\n console.log(chalk.yellow('Claude Code履歴が見つかりません'))\n return\n }\n\n console.log(chalk.bold('\\n📚 Claude Code履歴一覧:\\n'))\n\n // 最終更新日でソート\n histories.sort((a, b) => {\n if (!a.lastModified || !b.lastModified) return 0\n return b.lastModified.getTime() - a.lastModified.getTime()\n })\n\n histories.forEach((history, index) => {\n const sizeKB = history.size ? (history.size / 1024).toFixed(1) : '0'\n const modifiedStr = history.lastModified ? history.lastModified.toLocaleString() : 'Unknown'\n const worktreeInfo = history.worktreePath ? chalk.green(' ✓') : chalk.gray(' (削除済み)')\n\n console.log(`${index + 1}. ${chalk.cyan(history.branch)}${worktreeInfo}`)\n console.log(chalk.gray(` 最終更新: ${modifiedStr} | サイズ: ${sizeKB} KB`))\n console.log(chalk.gray(` パス: ${history.historyPath}`))\n console.log()\n })\n}\n\n// 履歴を表示\nasync function showHistory(historyPath: string): Promise<void> {\n try {\n const content = await fs.readFile(historyPath, 'utf-8')\n console.log(content)\n } catch (error) {\n throw new Error(`履歴の読み込みに失敗しました: ${error}`)\n }\n}\n\n// 履歴をエクスポート\nasync function exportHistories(histories: ClaudeHistory[], outputPath: string): Promise<void> {\n const spinner = ora('履歴をエクスポート中...').start()\n\n try {\n interface HistoryExport {\n branch: string\n worktreePath: string\n lastModified?: Date\n content: string\n }\n\n const exportData = {\n exportedAt: new Date().toISOString(),\n totalHistories: histories.length,\n histories: [] as HistoryExport[],\n }\n\n for (const history of histories) {\n try {\n const content = await fs.readFile(history.historyPath, 'utf-8')\n exportData.histories.push({\n branch: history.branch,\n worktreePath: history.worktreePath,\n lastModified: history.lastModified,\n content,\n })\n } catch {\n // 読めない履歴はスキップ\n }\n }\n\n // 出力形式を判定\n if (outputPath.endsWith('.json')) {\n await fs.writeFile(outputPath, JSON.stringify(exportData, null, 2))\n } else {\n // Markdown形式でエクスポート\n let markdown = `# Claude Code履歴エクスポート\\n\\n`\n markdown += `エクスポート日時: ${exportData.exportedAt}\\n\\n`\n\n for (const history of exportData.histories) {\n markdown += `## ${history.branch}\\n\\n`\n markdown += `最終更新: ${history.lastModified}\\n\\n`\n markdown += `### 内容:\\n\\n`\n markdown += history.content\n markdown += `\\n\\n---\\n\\n`\n }\n\n await fs.writeFile(outputPath, markdown)\n }\n\n spinner.succeed(`履歴を ${outputPath} にエクスポートしました`)\n } catch (error) {\n spinner.fail('エクスポートに失敗しました')\n throw error\n }\n}\n\n// 履歴をマージ\nasync function mergeHistories(histories: ClaudeHistory[], outputPath: string): Promise<void> {\n const spinner = ora('履歴をマージ中...').start()\n\n try {\n let mergedContent = `# Claude Code統合履歴\\n\\n`\n mergedContent += `マージ日時: ${new Date().toLocaleString()}\\n\\n`\n\n // 時系列でソート\n histories.sort((a, b) => {\n if (!a.lastModified || !b.lastModified) return 0\n return a.lastModified.getTime() - b.lastModified.getTime()\n })\n\n for (const history of histories) {\n try {\n const content = await fs.readFile(history.historyPath, 'utf-8')\n mergedContent += `## ${history.branch} (${history.lastModified?.toLocaleString()})\\n\\n`\n mergedContent += content\n mergedContent += `\\n\\n---\\n\\n`\n } catch {\n // 読めない履歴はスキップ\n }\n }\n\n await fs.writeFile(outputPath, mergedContent)\n spinner.succeed(`履歴を ${outputPath} にマージしました`)\n } catch (error) {\n spinner.fail('マージに失敗しました')\n throw error\n }\n}\n\n// 古い履歴をクリーンアップ\nasync function cleanupHistories(histories: ClaudeHistory[]): Promise<void> {\n // worktreeが削除されている履歴を検出\n const orphanedHistories = histories.filter(h => !h.worktreePath)\n\n if (orphanedHistories.length === 0) {\n console.log(chalk.green('✨ クリーンアップする履歴はありません'))\n return\n }\n\n console.log(chalk.bold('\\n🗑️ 以下の履歴は対応するworktreeが削除されています:\\n'))\n orphanedHistories.forEach(h => {\n console.log(chalk.gray(`- ${h.branch} (${h.historyPath})`))\n })\n\n const { confirmDelete } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmDelete',\n message: `${orphanedHistories.length}個の履歴を削除しますか?`,\n default: false,\n },\n ])\n\n if (confirmDelete) {\n const spinner = ora('履歴を削除中...').start()\n let deletedCount = 0\n\n for (const history of orphanedHistories) {\n try {\n await fs.unlink(history.historyPath)\n deletedCount++\n } catch {\n // 削除に失敗してもスキップ\n }\n }\n\n spinner.succeed(`${deletedCount}個の履歴を削除しました`)\n }\n}\n\n// 履歴を同期(worktreeパスに移動)\nasync function syncHistories(histories: ClaudeHistory[]): Promise<void> {\n const spinner = ora('履歴を同期中...').start()\n let syncedCount = 0\n\n for (const history of histories) {\n if (!history.worktreePath) continue\n\n // 理想的なパスを計算\n const idealPath = getHistoryPathForBranch(history.branch)\n\n if (history.historyPath !== idealPath) {\n try {\n // ディレクトリを作成\n await fs.mkdir(path.dirname(idealPath), { recursive: true })\n // ファイルを移動\n await fs.rename(history.historyPath, idealPath)\n syncedCount++\n } catch {\n // 同期に失敗してもスキップ\n }\n }\n }\n\n spinner.succeed(`${syncedCount}個の履歴を同期しました`)\n}\n\nexport const historyCommand = new Command('history')\n .alias('h')\n .description('Claude Code会話履歴を管理')\n .option('-l, --list', '全ての履歴を一覧表示')\n .option('-s, --show <branch>', '特定のブランチの履歴を表示')\n .option('-e, --export <path>', '履歴をエクスポート(.json/.md)')\n .option('-m, --merge <path>', '全履歴を1ファイルにマージ')\n .option('-c, --cleanup', '不要な履歴をクリーンアップ')\n .option('--sync', '履歴を正しいパスに同期')\n .option('-j, --json', 'JSON形式で出力')\n .exitOverride()\n .action(async (options: HistoryOptions) => {\n try {\n const gitManager = new GitWorktreeManager()\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n\n // 全履歴を検索\n const histories = await findAllHistories(gitManager)\n\n if (\n options.list ||\n (!options.show && !options.export && !options.merge && !options.cleanup && !options.sync)\n ) {\n // JSON出力の場合\n if (options.json) {\n const jsonOutput = histories.map(history => ({\n branch: history.branch,\n worktreePath: history.worktreePath,\n historyPath: history.historyPath,\n lastModified: history.lastModified?.toISOString() || null,\n size: history.size || 0,\n exists: !!history.worktreePath,\n }))\n console.log(JSON.stringify(jsonOutput, null, 2))\n } else {\n // デフォルトは一覧表示\n await listHistories(histories)\n }\n }\n\n if (options.show) {\n // ブランチ名で履歴を検索\n const history = histories.find(h => h.branch === options.show)\n if (history) {\n await showHistory(history.historyPath)\n } else {\n console.error(chalk.red(`ブランチ '${options.show}' の履歴が見つかりません`))\n process.exit(1)\n }\n }\n\n if (options.export) {\n await exportHistories(histories, options.export)\n }\n\n if (options.merge) {\n await mergeHistories(histories, 'merged-history.md')\n }\n\n if (options.cleanup) {\n await cleanupHistories(histories)\n }\n\n if (options.sync) {\n await syncHistories(histories)\n }\n } catch (error) {\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { execa } from 'execa'\n\ninterface GraphOptions {\n format?: 'mermaid' | 'dot'\n output?: string\n showCommits?: boolean\n showDates?: boolean\n depth?: number\n}\n\ninterface BranchRelation {\n branch: string\n parent: string\n ahead: number\n behind: number\n lastCommit?: {\n hash: string\n date: Date\n message: string\n }\n}\n\n// ブランチの関係性を分析\nimport { Worktree } from '../types/index.js'\n\n// ブランチとmainとの関係を取得\nasync function getBranchMainRelation(\n branch: string,\n worktreePath: string\n): Promise<{\n ahead: number\n behind: number\n lastCommit?: { hash: string; date: Date; message: string }\n} | null> {\n try {\n await execa('git', ['merge-base', branch, 'main'], { cwd: worktreePath })\n\n const { stdout: ahead } = await execa('git', ['rev-list', '--count', `main..${branch}`], {\n cwd: worktreePath,\n })\n\n const { stdout: behind } = await execa('git', ['rev-list', '--count', `${branch}..main`], {\n cwd: worktreePath,\n })\n\n const { stdout: lastCommitInfo } = await execa(\n 'git',\n ['log', '-1', '--format=%H|%ai|%s', branch],\n { cwd: worktreePath }\n )\n\n const [hash, date, message] = lastCommitInfo.split('|')\n\n return {\n ahead: parseInt(ahead),\n behind: parseInt(behind),\n lastCommit: {\n hash: hash?.substring(0, 7) || '',\n date: new Date(date || ''),\n message: message?.substring(0, 50) || '',\n },\n }\n } catch {\n return null\n }\n}\n\n// 循環参照を検出する関数\nfunction detectCycles(relations: BranchRelation[]): string[] {\n const visited = new Set<string>()\n const recursionStack = new Set<string>()\n const cycles: string[] = []\n\n function dfs(branch: string, path: string[]): void {\n if (recursionStack.has(branch)) {\n const cycleStart = path.indexOf(branch)\n if (cycleStart >= 0) {\n const cycle = path.slice(cycleStart).concat(branch).join(' → ')\n cycles.push(cycle)\n }\n return\n }\n\n if (visited.has(branch)) return\n\n visited.add(branch)\n recursionStack.add(branch)\n\n const relation = relations.find(r => r.branch === branch)\n if (relation && relation.parent !== 'main') {\n dfs(relation.parent, [...path, branch])\n }\n\n recursionStack.delete(branch)\n }\n\n for (const relation of relations) {\n if (!visited.has(relation.branch)) {\n dfs(relation.branch, [])\n }\n }\n\n return cycles\n}\n\n// より正確な親ブランチを検出(循環参照チェック付き)\nasync function findBetterParent(\n branch: string,\n worktreePath: string,\n otherWorktrees: Worktree[],\n visitedBranches: Set<string> = new Set()\n): Promise<string> {\n // 循環参照を防ぐため、既に訪問したブランチはスキップ\n if (visitedBranches.has(branch)) {\n return 'main'\n }\n\n visitedBranches.add(branch)\n let parent = 'main'\n\n for (const otherWorktree of otherWorktrees) {\n if (!otherWorktree.branch) continue\n\n const otherBranch = otherWorktree.branch.replace('refs/heads/', '')\n\n // 自分自身や既に訪問したブランチはスキップ\n if (otherBranch === branch || visitedBranches.has(otherBranch)) continue\n\n try {\n await execa('git', ['merge-base', branch, otherBranch], { cwd: worktreePath })\n\n const { stdout: isParent } = await execa(\n 'git',\n ['rev-list', '--count', `${otherBranch}..${branch}`],\n { cwd: worktreePath }\n )\n\n if (parseInt(isParent) > 0 && parent === 'main') {\n parent = otherBranch\n }\n } catch {\n // エラーは無視\n }\n }\n\n visitedBranches.delete(branch)\n return parent\n}\n\nasync function analyzeBranchRelations(worktrees: Worktree[]): Promise<BranchRelation[]> {\n const relations: BranchRelation[] = []\n const visitedBranches = new Set<string>()\n\n for (const worktree of worktrees) {\n if (!worktree.branch) continue\n\n const branch = worktree.branch.replace('refs/heads/', '')\n const branchRelation = await getBranchMainRelation(branch, worktree.path)\n\n if (!branchRelation) continue\n\n const otherWorktrees = worktrees.filter(wt => wt !== worktree)\n const parent = await findBetterParent(branch, worktree.path, otherWorktrees, visitedBranches)\n\n relations.push({\n branch,\n parent,\n ahead: branchRelation.ahead,\n behind: branchRelation.behind,\n lastCommit: branchRelation.lastCommit,\n })\n }\n\n // 循環参照をチェックして警告を表示\n const cycles = detectCycles(relations)\n if (cycles.length > 0) {\n console.log(chalk.yellow('\\n⚠️ 循環参照が検出されました:'))\n cycles.forEach(cycle => {\n console.log(chalk.gray(` - ${cycle}`))\n })\n console.log(chalk.gray(' 循環参照のあるブランチは main から派生するよう調整されました\\n'))\n }\n\n return relations\n}\n\n// Mermaid形式でグラフを生成\nfunction renderMermaidGraph(relations: BranchRelation[]): string {\n let output = '```mermaid\\ngraph TD\\n'\n output += ' main[main]\\n'\n\n relations.forEach(relation => {\n const label = `${relation.branch}<br/>↑${relation.ahead} ↓${relation.behind}`\n output += ` ${relation.branch.replace(/[^a-zA-Z0-9]/g, '_')}[${label}]\\n`\n output += ` ${relation.parent.replace(/[^a-zA-Z0-9]/g, '_')} --> ${relation.branch.replace(/[^a-zA-Z0-9]/g, '_')}\\n`\n })\n\n output += '```\\n'\n return output\n}\n\n// Graphviz DOT形式でグラフを生成\nfunction renderDotGraph(relations: BranchRelation[]): string {\n let output = 'digraph worktree_dependencies {\\n'\n output += ' rankdir=TB;\\n'\n output += ' node [shape=box, style=rounded];\\n'\n output += ' main [label=\"main\", style=\"filled\", fillcolor=\"lightblue\"];\\n'\n\n relations.forEach(relation => {\n const label = `${relation.branch}\\\\n↑${relation.ahead} ↓${relation.behind}`\n const color = relation.behind > 10 ? 'lightpink' : 'lightgreen'\n output += ` \"${relation.branch}\" [label=\"${label}\", style=\"filled\", fillcolor=\"${color}\"];\\n`\n output += ` \"${relation.parent}\" -> \"${relation.branch}\";\\n`\n })\n\n output += '}\\n'\n return output\n}\n\nexport const graphCommand = new Command('graph')\n .alias('g')\n .description('worktree間の依存関係をグラフで可視化')\n .option('-f, --format <type>', '出力形式(mermaid, dot)', 'mermaid')\n .option('-o, --output <file>', '出力ファイル')\n .option('--show-commits', '最新コミットを表示')\n .option('--show-dates', '最終更新日を表示')\n .option('-d, --depth <number>', '表示する階層の深さ', '3')\n .exitOverride()\n .action(async (options: GraphOptions) => {\n const spinner = ora('worktree関係を分析中...').start()\n\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n spinner.fail('このディレクトリはGitリポジトリではありません')\n process.exit(1)\n }\n\n // worktreeを取得\n const worktrees = await gitManager.listWorktrees()\n const orchestraMembers = worktrees.filter(wt => !wt.path.endsWith('.'))\n\n if (orchestraMembers.length === 0) {\n spinner.fail('演奏者が存在しません')\n process.exit(0)\n }\n\n spinner.text = 'ブランチ関係を分析中...'\n\n // ブランチ関係を分析\n const relations = await analyzeBranchRelations(orchestraMembers)\n\n spinner.stop()\n\n // グラフを生成\n let graphOutput: string\n\n switch (options.format) {\n case 'dot':\n graphOutput = renderDotGraph(relations)\n break\n default:\n graphOutput = renderMermaidGraph(relations)\n }\n\n // 出力\n if (options.output) {\n const fs = await import('fs/promises')\n await fs.writeFile(options.output, graphOutput)\n console.log(chalk.green(`✨ グラフを ${options.output} に保存しました`))\n\n // Graphvizがインストールされている場合、画像を生成\n if (options.format === 'dot' && options.output.endsWith('.dot')) {\n try {\n const pngOutput = options.output.replace('.dot', '.png')\n await execa('dot', ['-Tpng', options.output, '-o', pngOutput])\n console.log(chalk.green(`🖼️ 画像を ${pngOutput} に生成しました`))\n } catch {\n console.log(chalk.yellow('💡 ヒント: Graphvizをインストールすると画像を生成できます'))\n console.log(chalk.gray(' brew install graphviz'))\n }\n }\n } else {\n console.log(graphOutput)\n }\n\n // 統計情報\n console.log(chalk.bold('\\n📊 統計情報:\\n'))\n console.log(chalk.gray(`総worktree数: ${orchestraMembers.length + 1}`))\n console.log(chalk.gray(`アクティブなブランチ: ${relations.length}`))\n\n const outdated = relations.filter(r => r.behind > 10)\n if (outdated.length > 0) {\n console.log(chalk.yellow(`\\n⚠️ 10コミット以上遅れているブランチ: ${outdated.length}個`))\n outdated.forEach(r => {\n console.log(chalk.gray(` - ${r.branch} (${r.behind}コミット遅れ)`))\n })\n }\n } catch (error) {\n spinner.fail('グラフの生成に失敗しました')\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora, { Ora } from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { ConfigManager } from '../core/config.js'\nimport { execa } from 'execa'\nimport fs from 'fs/promises'\nimport { formatPath } from '../utils/path.js'\n\ninterface HealthOptions {\n fix?: boolean\n prune?: boolean\n days?: number\n verbose?: boolean\n json?: boolean\n}\n\nimport { Worktree } from '../types/index.js'\n\ninterface HealthIssue {\n worktree: Worktree\n type: 'stale' | 'orphaned' | 'diverged' | 'uncommitted' | 'conflict' | 'missing'\n severity: 'critical' | 'warning' | 'info'\n message: string\n fixable: boolean\n}\n\n// worktreeの健全性をチェック\nasync function checkWorktreeHealth(\n worktree: Worktree,\n mainBranch: string,\n daysThreshold: number\n): Promise<HealthIssue[]> {\n const issues: HealthIssue[] = []\n const branch = worktree.branch?.replace('refs/heads/', '') || worktree.branch\n\n try {\n // 1. ディレクトリが存在するか\n try {\n await fs.access(worktree.path)\n } catch {\n issues.push({\n worktree,\n type: 'missing',\n severity: 'critical',\n message: 'Worktreeディレクトリが存在しません',\n fixable: true,\n })\n return issues // これ以上のチェックは不可能\n }\n\n // 2. 未コミットの変更をチェック\n const { stdout: status } = await execa('git', ['status', '--porcelain'], {\n cwd: worktree.path,\n })\n\n if (status.trim()) {\n const lines = status.trim().split('\\n').length\n issues.push({\n worktree,\n type: 'uncommitted',\n severity: 'warning',\n message: `${lines}件の未コミット変更があります`,\n fixable: false,\n })\n }\n\n // 3. mainブランチとの乖離をチェック\n try {\n const { stdout: behind } = await execa(\n 'git',\n ['rev-list', '--count', `${branch}..${mainBranch}`],\n { cwd: worktree.path }\n )\n\n const behindCount = parseInt(behind.trim())\n\n if (behindCount > 20) {\n issues.push({\n worktree,\n type: 'diverged',\n severity: 'warning',\n message: `${mainBranch}から${behindCount}コミット遅れています`,\n fixable: true,\n })\n }\n } catch {\n // ブランチ比較エラーは無視\n }\n\n // 4. 最終更新日をチェック\n try {\n const { stdout: lastCommitDate } = await execa('git', ['log', '-1', '--format=%ci', branch], {\n cwd: worktree.path,\n })\n\n const lastDate = new Date(lastCommitDate.trim())\n const daysSinceLastCommit = Math.floor(\n (Date.now() - lastDate.getTime()) / (1000 * 60 * 60 * 24)\n )\n\n if (daysSinceLastCommit > daysThreshold) {\n issues.push({\n worktree,\n type: 'stale',\n severity: 'info',\n message: `${daysSinceLastCommit}日間更新されていません`,\n fixable: true,\n })\n }\n } catch {\n // ログ取得エラーは無視\n }\n\n // 5. マージ競合の検出\n try {\n const { stdout: mergeStatus } = await execa('git', ['ls-files', '--unmerged'], {\n cwd: worktree.path,\n })\n\n if (mergeStatus.trim()) {\n issues.push({\n worktree,\n type: 'conflict',\n severity: 'critical',\n message: 'マージ競合が解決されていません',\n fixable: false,\n })\n }\n } catch {\n // エラーは無視\n }\n\n // 6. リモートブランチの存在確認\n try {\n await execa('git', ['rev-parse', `origin/${branch}`], { cwd: worktree.path })\n } catch {\n issues.push({\n worktree,\n type: 'orphaned',\n severity: 'info',\n message: 'リモートブランチが存在しません',\n fixable: false,\n })\n }\n } catch (error) {\n // 一般的なエラー\n issues.push({\n worktree,\n type: 'orphaned',\n severity: 'warning',\n message: `チェック中にエラーが発生: ${error}`,\n fixable: false,\n })\n }\n\n return issues\n}\n\n// 問題を修正\nasync function fixIssue(issue: HealthIssue, mainBranch: string): Promise<boolean> {\n try {\n switch (issue.type) {\n case 'missing':\n // worktreeを削除\n await execa('git', ['worktree', 'remove', issue.worktree.path, '--force'])\n return true\n\n case 'diverged':\n // mainブランチをマージ\n await execa('git', ['merge', mainBranch, '--no-edit'], {\n cwd: issue.worktree.path,\n })\n return true\n\n case 'stale':\n // 古いworktreeについては削除を提案するのみ\n return false\n\n default:\n return false\n }\n } catch {\n return false\n }\n}\n\n// メインブランチを特定\nasync function determineMainBranch(): Promise<string> {\n let mainBranch = 'main'\n try {\n const { stdout } = await execa('git', ['symbolic-ref', 'refs/remotes/origin/HEAD'])\n mainBranch = stdout.replace('refs/remotes/origin/', '')\n } catch {\n try {\n await execa('git', ['rev-parse', 'origin/master'])\n mainBranch = 'master'\n } catch {\n // デフォルトのmainを使用\n }\n }\n return mainBranch\n}\n\n// オーケストラメンバーを取得\nasync function getOrchestraMembers(\n gitManager: GitWorktreeManager,\n spinner: Ora\n): Promise<Worktree[]> {\n const worktrees = await gitManager.listWorktrees()\n const orchestraMembers = worktrees.filter(wt => !wt.path.endsWith('.'))\n\n if (orchestraMembers.length === 0) {\n spinner.succeed('演奏者が存在しません')\n process.exit(0)\n }\n\n return orchestraMembers\n}\n\n// すべてのworktreeをチェック\nasync function checkAllWorktrees(\n orchestraMembers: Worktree[],\n mainBranch: string,\n days: string | undefined,\n spinner: Ora\n): Promise<HealthIssue[]> {\n spinner.text = '各worktreeの状態を分析中...'\n\n const allIssues: HealthIssue[] = []\n const daysThreshold = parseInt(days?.toString() || '30')\n\n for (const worktree of orchestraMembers) {\n const issues = await checkWorktreeHealth(worktree, mainBranch, daysThreshold)\n allIssues.push(...issues)\n }\n\n return allIssues\n}\n\n// JSON形式でレポートを出力\nfunction outputJsonReport(allIssues: HealthIssue[]): void {\n const jsonOutput = {\n summary: {\n total: allIssues.length,\n critical: allIssues.filter(i => i.severity === 'critical').length,\n warning: allIssues.filter(i => i.severity === 'warning').length,\n info: allIssues.filter(i => i.severity === 'info').length,\n },\n issues: allIssues.map(issue => ({\n worktree: {\n branch: issue.worktree.branch?.replace('refs/heads/', '') || issue.worktree.branch,\n path: issue.worktree.path,\n },\n type: issue.type,\n severity: issue.severity,\n message: issue.message,\n fixable: issue.fixable,\n })),\n checkedAt: new Date().toISOString(),\n }\n console.log(JSON.stringify(jsonOutput, null, 2))\n}\n\n// 修正オプションを処理\nasync function handleFixOption(allIssues: HealthIssue[], mainBranch: string): Promise<void> {\n if (!allIssues.some(i => i.fixable)) return\n\n const fixableIssues = allIssues.filter(i => i.fixable)\n console.log(chalk.bold(`\\n🔧 ${fixableIssues.length}件の修正可能な問題があります\\n`))\n\n const { confirmFix } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmFix',\n message: '自動修正を実行しますか?',\n default: false,\n },\n ])\n\n if (confirmFix) {\n const fixSpinner = ora('問題を修正中...').start()\n let fixedCount = 0\n\n for (const issue of fixableIssues) {\n if (await fixIssue(issue, mainBranch)) {\n fixedCount++\n }\n }\n\n fixSpinner.succeed(`${fixedCount}件の問題を修正しました`)\n }\n}\n\n// プルーンオプションを処理\nasync function handlePruneOption(\n allIssues: HealthIssue[],\n gitManager: GitWorktreeManager\n): Promise<void> {\n const staleWorktrees = allIssues\n .filter(i => i.type === 'stale')\n .map(i => i.worktree)\n .filter((wt, index, self) => self.findIndex(w => w.path === wt.path) === index)\n\n if (staleWorktrees.length === 0) return\n\n console.log(chalk.bold(`\\n🗑️ ${staleWorktrees.length}件の古いworktreeがあります\\n`))\n\n const configManager = new ConfigManager()\n await configManager.loadProjectConfig()\n const config = configManager.getAll()\n staleWorktrees.forEach(wt => {\n const branch = wt.branch?.replace('refs/heads/', '') || wt.branch\n console.log(chalk.gray(` - ${branch} (${formatPath(wt.path, config)})`))\n })\n\n const { confirmPrune } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmPrune',\n message: 'これらを削除しますか?',\n default: false,\n },\n ])\n\n if (confirmPrune) {\n const pruneSpinner = ora('古いworktreeを削除中...').start()\n let prunedCount = 0\n\n for (const worktree of staleWorktrees) {\n try {\n await gitManager.deleteWorktree(worktree.branch, true)\n prunedCount++\n } catch {\n // エラーは無視\n }\n }\n\n pruneSpinner.succeed(`${prunedCount}件のworktreeを削除しました`)\n }\n}\n\n// 推奨事項を表示\nfunction showRecommendations(allIssues: HealthIssue[], hasFix?: boolean, hasPrune?: boolean): void {\n if (allIssues.length === 0 || hasFix || hasPrune) return\n\n console.log(chalk.bold('\\n💡 推奨事項:\\n'))\n\n if (allIssues.some(i => i.fixable)) {\n console.log(chalk.gray(' • --fix オプションで修正可能な問題を自動修正できます'))\n }\n\n if (allIssues.some(i => i.type === 'stale')) {\n console.log(chalk.gray(' • --prune オプションで古いworktreeを削除できます'))\n }\n\n if (allIssues.some(i => i.type === 'uncommitted')) {\n console.log(chalk.gray(' • 未コミットの変更がある場合は手動でコミットまたは破棄してください'))\n }\n}\n\n// 健全性レポートを表示\nfunction displayHealthReport(allIssues: HealthIssue[], verbose: boolean): void {\n const criticalCount = allIssues.filter(i => i.severity === 'critical').length\n const warningCount = allIssues.filter(i => i.severity === 'warning').length\n const infoCount = allIssues.filter(i => i.severity === 'info').length\n\n console.log(chalk.bold('\\n🏥 Worktree健全性チェック結果\\n'))\n\n if (allIssues.length === 0) {\n console.log(chalk.green('✨ すべてのworktreeは健全です!'))\n return\n }\n\n // サマリー\n console.log(chalk.bold('📊 サマリー:'))\n if (criticalCount > 0) console.log(chalk.red(` 🚨 重大: ${criticalCount}件`))\n if (warningCount > 0) console.log(chalk.yellow(` ⚠️ 警告: ${warningCount}件`))\n if (infoCount > 0) console.log(chalk.blue(` ℹ️ 情報: ${infoCount}件`))\n console.log()\n\n // 詳細表示\n const groupedIssues = new Map<string, HealthIssue[]>()\n\n allIssues.forEach(issue => {\n const branch =\n issue.worktree.branch?.replace('refs/heads/', '') || issue.worktree.branch || 'unknown'\n if (!groupedIssues.has(branch)) {\n groupedIssues.set(branch, [])\n }\n groupedIssues.get(branch)?.push(issue)\n })\n\n const configManager = new ConfigManager()\n const config = configManager.getAll()\n groupedIssues.forEach((issues, branch) => {\n console.log(chalk.cyan(`📁 ${branch}`))\n console.log(chalk.gray(` ${formatPath(issues[0]?.worktree.path || 'unknown', config)}`))\n\n issues.forEach(issue => {\n const icon =\n issue.severity === 'critical' ? '🚨' : issue.severity === 'warning' ? '⚠️ ' : 'ℹ️ '\n const color =\n issue.severity === 'critical'\n ? chalk.red\n : issue.severity === 'warning'\n ? chalk.yellow\n : chalk.blue\n\n console.log(` ${icon} ${color(issue.message)}`)\n if (issue.fixable && verbose) {\n console.log(chalk.gray(` 💊 修正可能`))\n }\n })\n console.log()\n })\n}\n\nexport const healthCommand = new Command('health')\n .alias('check')\n .description('worktreeの健全性をチェック')\n .option('-f, --fix', '修正可能な問題を自動修正')\n .option('-p, --prune', '古いworktreeを削除')\n .option('-d, --days <number>', '古いと判定する日数', '30')\n .option('-v, --verbose', '詳細情報を表示')\n .option('-j, --json', 'JSON形式で出力')\n .exitOverride()\n .action(async (options: HealthOptions) => {\n const spinner = ora('worktreeの健全性をチェック中...').start()\n\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n spinner.fail('このディレクトリはGitリポジトリではありません')\n process.exit(1)\n }\n\n const mainBranch = await determineMainBranch()\n const orchestraMembers = await getOrchestraMembers(gitManager, spinner)\n const allIssues = await checkAllWorktrees(\n orchestraMembers,\n mainBranch,\n options.days?.toString(),\n spinner\n )\n\n spinner.stop()\n\n // JSON出力の場合\n if (options.json) {\n outputJsonReport(allIssues)\n return\n }\n\n // レポートを表示\n displayHealthReport(allIssues, options.verbose || false)\n\n // 修正オプション\n if (options.fix) {\n await handleFixOption(allIssues, mainBranch)\n }\n\n // 古いworktreeの削除\n if (options.prune) {\n await handlePruneOption(allIssues, gitManager)\n }\n\n // 推奨事項\n showRecommendations(allIssues, options.fix, options.prune)\n } catch (error) {\n spinner.fail('健全性チェックに失敗しました')\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { execa } from 'execa'\nimport fs from 'fs/promises'\nimport path from 'path'\n\ninterface SnapshotOptions {\n message?: string\n stash?: boolean\n all?: boolean\n json?: boolean\n}\n\n// worktreeメタデータ型定義\ninterface WorktreeMetadata {\n createdAt: string\n branch: string\n worktreePath: string\n github?: {\n type: 'issue' | 'pr'\n title: string\n body: string\n author: string\n labels: string[]\n assignees: string[]\n milestone?: string\n url: string\n issueNumber?: string\n }\n template?: string\n}\n\ninterface WorktreeSnapshot {\n id: string\n branch: string\n worktreePath: string\n createdAt: string\n message: string\n gitStatus: {\n branch: string\n tracking: string\n ahead: number\n behind: number\n staged: string[]\n modified: string[]\n untracked: string[]\n }\n stash?: {\n hash: string\n message: string\n }\n lastCommit: {\n hash: string\n message: string\n author: string\n date: string\n }\n metadata?: WorktreeMetadata\n}\n\n// スナップショットIDを生成\nfunction generateSnapshotId(): string {\n const timestamp = Date.now().toString()\n const random = Math.random().toString(36).substring(2, 8)\n return `snapshot-${timestamp}-${random}`\n}\n\n// Git状態を取得\nasync function getGitStatus(worktreePath: string): Promise<WorktreeSnapshot['gitStatus']> {\n const status: WorktreeSnapshot['gitStatus'] = {\n branch: '',\n tracking: '',\n ahead: 0,\n behind: 0,\n staged: [],\n modified: [],\n untracked: [],\n }\n\n try {\n // ブランチ情報を取得\n const { stdout: branchInfo } = await execa('git', ['branch', '-vv', '--no-color'], {\n cwd: worktreePath,\n })\n const currentBranch = branchInfo.split('\\n').find(line => line.startsWith('*'))\n if (currentBranch) {\n const match = currentBranch.match(/\\* (\\S+)\\s+\\S+\\s+(?:\\[([^\\]]+)\\])?\\s+(.+)/)\n if (match) {\n status.branch = match[1] || 'unknown'\n if (match[2]) {\n const trackingMatch = match[2].match(\n /([^:]+)(?::\\s*ahead\\s+(\\d+))?(?:,?\\s*behind\\s+(\\d+))?/\n )\n if (trackingMatch) {\n status.tracking = trackingMatch[1] || ''\n status.ahead = parseInt(trackingMatch[2] || '0')\n status.behind = parseInt(trackingMatch[3] || '0')\n }\n }\n }\n }\n\n // ステージング済みファイル\n const { stdout: staged } = await execa('git', ['diff', '--cached', '--name-only'], {\n cwd: worktreePath,\n })\n if (staged) status.staged = staged.split('\\n').filter(Boolean)\n\n // 変更されたファイル\n const { stdout: modified } = await execa('git', ['diff', '--name-only'], { cwd: worktreePath })\n if (modified) status.modified = modified.split('\\n').filter(Boolean)\n\n // 未追跡ファイル\n const { stdout: untracked } = await execa(\n 'git',\n ['ls-files', '--others', '--exclude-standard'],\n { cwd: worktreePath }\n )\n if (untracked) status.untracked = untracked.split('\\n').filter(Boolean)\n } catch {\n console.error(chalk.yellow('Git状態の取得に失敗しました'))\n }\n\n return status\n}\n\n// 最終コミット情報を取得\nasync function getLastCommitInfo(worktreePath: string): Promise<WorktreeSnapshot['lastCommit']> {\n try {\n const { stdout } = await execa('git', ['log', '-1', '--pretty=format:%H|%s|%an|%ai'], {\n cwd: worktreePath,\n })\n\n const [hash, message, author, date] = stdout.split('|')\n return { hash: hash || '', message: message || '', author: author || '', date: date || '' }\n } catch {\n return {\n hash: '',\n message: 'コミットなし',\n author: '',\n date: '',\n }\n }\n}\n\n// スナップショットを作成\nimport { Worktree } from '../types/index.js'\n\nasync function createSnapshot(\n worktree: Worktree,\n message: string,\n includeStash: boolean\n): Promise<WorktreeSnapshot> {\n const snapshotId = generateSnapshotId()\n const gitStatus = await getGitStatus(worktree.path)\n const lastCommit = await getLastCommitInfo(worktree.path)\n\n const snapshot: WorktreeSnapshot = {\n id: snapshotId,\n branch: worktree.branch?.replace('refs/heads/', '') || worktree.branch,\n worktreePath: worktree.path,\n createdAt: new Date().toISOString(),\n message,\n gitStatus,\n lastCommit,\n }\n\n // スタッシュを作成\n if (includeStash && (gitStatus.staged.length > 0 || gitStatus.modified.length > 0)) {\n try {\n const stashMessage = `Orchestra Snapshot: ${snapshotId}`\n await execa('git', ['stash', 'push', '-m', stashMessage, '--include-untracked'], {\n cwd: worktree.path,\n })\n\n // スタッシュのハッシュを取得\n const { stdout: stashList } = await execa('git', ['stash', 'list', '-1', '--format=%H %s'], {\n cwd: worktree.path,\n })\n if (stashList) {\n const [hash, ...messageParts] = stashList.split(' ')\n snapshot.stash = {\n hash: hash || '',\n message: messageParts.join(' '),\n }\n }\n } catch {\n console.warn(chalk.yellow('スタッシュの作成に失敗しました'))\n }\n }\n\n // メタデータを読み込み\n try {\n const metadataPath = path.join(worktree.path, '.maestro-metadata.json')\n const metadataContent = await fs.readFile(metadataPath, 'utf-8')\n snapshot.metadata = JSON.parse(metadataContent)\n } catch {\n // メタデータがない場合は無視\n }\n\n return snapshot\n}\n\n// スナップショットを保存\nasync function saveSnapshot(snapshot: WorktreeSnapshot): Promise<void> {\n const snapshotDir = path.join(process.cwd(), '.maestro', 'snapshots')\n await fs.mkdir(snapshotDir, { recursive: true })\n\n const snapshotPath = path.join(snapshotDir, `${snapshot.id}.json`)\n await fs.writeFile(snapshotPath, JSON.stringify(snapshot, null, 2))\n}\n\n// スナップショット一覧を取得\nasync function listSnapshots(): Promise<WorktreeSnapshot[]> {\n const snapshotDir = path.join(process.cwd(), '.maestro', 'snapshots')\n\n try {\n const files = await fs.readdir(snapshotDir)\n const snapshots: WorktreeSnapshot[] = []\n\n for (const file of files) {\n if (file.endsWith('.json')) {\n const content = await fs.readFile(path.join(snapshotDir, file), 'utf-8')\n snapshots.push(JSON.parse(content))\n }\n }\n\n // 作成日時で降順ソート\n return snapshots.sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n )\n } catch {\n return []\n }\n}\n\n// スナップショットを復元\nasync function restoreSnapshot(snapshot: WorktreeSnapshot): Promise<void> {\n const spinner = ora('スナップショットを復元中...').start()\n\n try {\n // worktreeが存在するか確認\n try {\n await fs.access(snapshot.worktreePath)\n } catch {\n spinner.fail(`worktree '${snapshot.worktreePath}' が存在しません`)\n return\n }\n\n // 現在の状態を確認\n const currentStatus = await getGitStatus(snapshot.worktreePath)\n if (\n currentStatus.staged.length > 0 ||\n currentStatus.modified.length > 0 ||\n currentStatus.untracked.length > 0\n ) {\n spinner.stop()\n\n const { confirmRestore } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmRestore',\n message: '現在の変更が失われる可能性があります。続行しますか?',\n default: false,\n },\n ])\n\n if (!confirmRestore) {\n console.log(chalk.gray('復元をキャンセルしました'))\n return\n }\n\n spinner.start('スナップショットを復元中...')\n }\n\n // ブランチを切り替え\n if (currentStatus.branch !== snapshot.gitStatus.branch) {\n await execa('git', ['checkout', snapshot.gitStatus.branch], { cwd: snapshot.worktreePath })\n }\n\n // スタッシュを適用\n if (snapshot.stash) {\n try {\n // スタッシュリストから該当のスタッシュを探す\n const { stdout: stashList } = await execa('git', ['stash', 'list'], {\n cwd: snapshot.worktreePath,\n })\n const stashLines = stashList.split('\\n')\n const stashIndex = stashLines.findIndex(line => line.includes(snapshot.id))\n\n if (stashIndex >= 0) {\n await execa('git', ['stash', 'apply', `stash@{${stashIndex}}`], {\n cwd: snapshot.worktreePath,\n })\n spinner.succeed('スタッシュを適用しました')\n } else {\n spinner.warn('保存されたスタッシュが見つかりませんでした')\n }\n } catch {\n spinner.warn('スタッシュの適用に失敗しました')\n }\n }\n\n spinner.succeed(`スナップショット '${snapshot.id}' を復元しました`)\n\n // 復元後の状態を表示\n console.log(chalk.bold('\\n📸 復元されたスナップショット:\\n'))\n console.log(chalk.gray(`ID: ${snapshot.id}`))\n console.log(chalk.gray(`ブランチ: ${snapshot.branch}`))\n console.log(chalk.gray(`作成日時: ${new Date(snapshot.createdAt).toLocaleString()}`))\n console.log(chalk.gray(`メッセージ: ${snapshot.message}`))\n\n if (snapshot.gitStatus.staged.length > 0) {\n console.log(chalk.green(`\\nステージング済み: ${snapshot.gitStatus.staged.length}ファイル`))\n }\n if (snapshot.gitStatus.modified.length > 0) {\n console.log(chalk.yellow(`変更あり: ${snapshot.gitStatus.modified.length}ファイル`))\n }\n if (snapshot.gitStatus.untracked.length > 0) {\n console.log(chalk.blue(`未追跡: ${snapshot.gitStatus.untracked.length}ファイル`))\n }\n } catch (error) {\n spinner.fail('スナップショットの復元に失敗しました')\n console.error(chalk.red(error instanceof Error ? error.message : '不明なエラー'))\n }\n}\n\nexport const snapshotCommand = new Command('snapshot')\n .alias('snap')\n .description('worktreeの作業状態を保存・復元')\n .option('-m, --message <message>', 'スナップショットのメッセージ')\n .option('-s, --stash', '変更をスタッシュに保存')\n .option('-a, --all', '全てのworktreeのスナップショットを作成')\n .option('-l, --list', 'スナップショット一覧を表示')\n .option('-r, --restore <id>', 'スナップショットを復元')\n .option('-d, --delete <id>', 'スナップショットを削除')\n .option('-j, --json', 'JSON形式で出力')\n .exitOverride()\n .action(\n async (options: SnapshotOptions & { list?: boolean; restore?: string; delete?: string }) => {\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリかチェック\n const isGitRepo = await gitManager.isGitRepository()\n if (!isGitRepo) {\n console.error(chalk.red('このディレクトリはGitリポジトリではありません'))\n process.exit(1)\n }\n\n // スナップショット一覧を表示\n if (options.list) {\n const snapshots = await listSnapshots()\n\n if (options.json) {\n // JSON形式で出力\n const jsonOutput = snapshots.map(snapshot => ({\n id: snapshot.id,\n branch: snapshot.branch,\n worktreePath: snapshot.worktreePath,\n createdAt: snapshot.createdAt,\n message: snapshot.message,\n gitStatus: {\n branch: snapshot.gitStatus.branch,\n tracking: snapshot.gitStatus.tracking,\n ahead: snapshot.gitStatus.ahead,\n behind: snapshot.gitStatus.behind,\n staged: snapshot.gitStatus.staged.length,\n modified: snapshot.gitStatus.modified.length,\n untracked: snapshot.gitStatus.untracked.length,\n },\n hasStash: !!snapshot.stash,\n lastCommit: snapshot.lastCommit,\n metadata: snapshot.metadata || null,\n }))\n console.log(JSON.stringify(jsonOutput, null, 2))\n return\n }\n\n if (snapshots.length === 0) {\n console.log(chalk.yellow('スナップショットが存在しません'))\n return\n }\n\n console.log(chalk.bold('\\n📸 スナップショット一覧:\\n'))\n\n snapshots.forEach(snapshot => {\n console.log(chalk.cyan(`${snapshot.id}`))\n console.log(chalk.gray(` ブランチ: ${snapshot.branch}`))\n console.log(chalk.gray(` 作成日時: ${new Date(snapshot.createdAt).toLocaleString()}`))\n console.log(chalk.gray(` メッセージ: ${snapshot.message}`))\n console.log(chalk.gray(` パス: ${snapshot.worktreePath}`))\n\n const changes = []\n if (snapshot.gitStatus.staged.length > 0)\n changes.push(`${snapshot.gitStatus.staged.length} staged`)\n if (snapshot.gitStatus.modified.length > 0)\n changes.push(`${snapshot.gitStatus.modified.length} modified`)\n if (snapshot.gitStatus.untracked.length > 0)\n changes.push(`${snapshot.gitStatus.untracked.length} untracked`)\n\n if (changes.length > 0) {\n console.log(chalk.gray(` 変更: ${changes.join(', ')}`))\n }\n\n if (snapshot.stash) {\n console.log(chalk.gray(` スタッシュ: あり`))\n }\n\n console.log()\n })\n\n return\n }\n\n // スナップショットを復元\n if (options.restore) {\n const snapshots = await listSnapshots()\n const snapshot = snapshots.find(\n s => s.id === options.restore || s.id.startsWith(options.restore!)\n )\n\n if (!snapshot) {\n console.error(chalk.red(`スナップショット '${options.restore}' が見つかりません`))\n process.exit(1)\n }\n\n await restoreSnapshot(snapshot)\n return\n }\n\n // スナップショットを削除\n if (options.delete) {\n const snapshotPath = path.join(\n process.cwd(),\n '.maestro',\n 'snapshots',\n `${options.delete}.json`\n )\n\n try {\n await fs.unlink(snapshotPath)\n console.log(chalk.green(`✨ スナップショット '${options.delete}' を削除しました`))\n } catch {\n // 短縮IDでの削除を試みる\n const snapshots = await listSnapshots()\n const snapshot = snapshots.find(s => s.id.startsWith(options.delete!))\n\n if (snapshot) {\n const fullPath = path.join(\n process.cwd(),\n '.maestro',\n 'snapshots',\n `${snapshot.id}.json`\n )\n await fs.unlink(fullPath)\n console.log(chalk.green(`✨ スナップショット '${snapshot.id}' を削除しました`))\n } else {\n console.error(chalk.red(`スナップショット '${options.delete}' が見つかりません`))\n process.exit(1)\n }\n }\n\n return\n }\n\n // スナップショットを作成\n const message = options.message || `Snapshot at ${new Date().toLocaleString()}`\n\n if (options.all) {\n // 全worktreeのスナップショットを作成\n const spinner = ora('全worktreeのスナップショットを作成中...').start()\n\n const worktrees = await gitManager.listWorktrees()\n const orchestraMembers = worktrees.filter(wt => !wt.path.endsWith('.'))\n\n if (orchestraMembers.length === 0) {\n spinner.fail('演奏者が存在しません')\n return\n }\n\n const snapshots: WorktreeSnapshot[] = []\n\n for (const worktree of orchestraMembers) {\n try {\n const snapshot = await createSnapshot(worktree, message, options.stash || false)\n await saveSnapshot(snapshot)\n snapshots.push(snapshot)\n } catch {\n console.warn(chalk.yellow(`${worktree.branch} のスナップショット作成に失敗しました`))\n }\n }\n\n spinner.succeed(`${snapshots.length}件のスナップショットを作成しました`)\n\n snapshots.forEach(snapshot => {\n console.log(chalk.gray(` - ${snapshot.branch}: ${snapshot.id}`))\n })\n } else {\n // 現在のworktreeのスナップショットを作成\n const currentPath = process.cwd()\n const worktrees = await gitManager.listWorktrees()\n const currentWorktree = worktrees.find(wt => wt.path === currentPath)\n\n if (!currentWorktree) {\n console.error(chalk.red('現在のディレクトリはworktreeではありません'))\n process.exit(1)\n }\n\n const spinner = ora('スナップショットを作成中...').start()\n\n const snapshot = await createSnapshot(currentWorktree, message, options.stash || false)\n await saveSnapshot(snapshot)\n\n spinner.succeed('スナップショットを作成しました')\n\n console.log(chalk.bold('\\n📸 作成されたスナップショット:\\n'))\n console.log(chalk.gray(`ID: ${snapshot.id}`))\n console.log(chalk.gray(`ブランチ: ${snapshot.branch}`))\n console.log(chalk.gray(`メッセージ: ${snapshot.message}`))\n\n if (snapshot.stash) {\n console.log(chalk.green('\\n✅ 変更をスタッシュに保存しました'))\n }\n }\n } catch (error) {\n console.error(chalk.red('エラー:'), error instanceof Error ? error.message : '不明なエラー')\n process.exit(1)\n }\n }\n )\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport { existsSync, readFileSync, writeFileSync } from 'fs'\nimport path from 'path'\nimport ora from 'ora'\nimport { detectPackageManager, type PackageManager } from '../utils/packageManager.js'\n\nexport interface InitOptions {\n minimal?: boolean\n packageManager?: PackageManager\n template?: string\n yes?: boolean\n}\n\nexport interface ProjectType {\n name: string\n detected: boolean\n packageManager?: PackageManager\n setupCommands?: string[]\n syncFiles?: string[]\n}\n\nexport const initCommand = new Command('init')\n .description('プロジェクトにMaestro設定を初期化')\n .option('-m, --minimal', 'ミニマル設定で初期化')\n .option('-p, --package-manager <manager>', 'パッケージマネージャーを指定 (pnpm/npm/yarn/none)')\n .option('-t, --template <name>', 'テンプレートを指定')\n .option('-y, --yes', 'プロンプトをスキップしてデフォルト値を使用')\n .exitOverride()\n .action(async (options: InitOptions) => {\n try {\n console.log(chalk.cyan('🎼 Welcome to Maestro Setup!\\n'))\n\n // 既存の.maestro.jsonチェック\n const configPath = path.join(process.cwd(), '.maestro.json')\n if (existsSync(configPath)) {\n if (!options.yes) {\n const { overwrite } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'overwrite',\n message: '.maestro.json が既に存在します。上書きしますか?',\n default: false,\n },\n ])\n if (!overwrite) {\n console.log(chalk.yellow('設定の初期化をキャンセルしました'))\n return\n }\n }\n }\n\n // プロジェクトタイプの検出\n const projectType = detectProjectType()\n console.log(\n chalk.gray(\n `検出されたプロジェクト: ${projectType.name}${\n projectType.detected ? ' ✅' : ' (自動検出なし)'\n }\\n`\n )\n )\n\n let config: Record<string, unknown>\n\n if (options.minimal) {\n config = createMinimalConfig()\n } else if (options.yes) {\n config = createDefaultConfig(projectType, options.packageManager)\n } else {\n config = await createInteractiveConfig(projectType)\n }\n\n // 設定ファイルを書き込み\n const spinner = ora('設定ファイルを作成中...').start()\n try {\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n')\n spinner.succeed('✨ .maestro.json が作成されました!')\n } catch (error) {\n spinner.fail('設定ファイルの作成に失敗しました')\n throw error\n }\n\n // 使用方法の表示\n console.log(chalk.green('\\n🎉 Maestro の設定が完了しました!\\n'))\n console.log(chalk.cyan('次のステップ:'))\n console.log(chalk.gray(' mst create <branch-name> # 新しい演奏者を招集'))\n console.log(chalk.gray(' mst list # 演奏者一覧を表示'))\n console.log(chalk.gray(' mst --help # その他のコマンドを確認'))\n\n const postCreate = config.postCreate as { commands?: string[] } | undefined\n if (postCreate?.commands && postCreate.commands.length > 0) {\n console.log(\n chalk.yellow(\n `\\n💡 worktree作成時に自動で実行されるコマンド: ${postCreate.commands.join(', ')}`\n )\n )\n }\n } catch (error) {\n console.error(chalk.red('エラーが発生しました:'), error)\n process.exit(1)\n }\n })\n\nexport function detectProjectType(): ProjectType {\n const cwd = process.cwd()\n\n // package.jsonの存在確認とパッケージマネージャー検出\n if (existsSync(path.join(cwd, 'package.json'))) {\n const packageJson = JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf-8'))\n\n const packageManager = detectPackageManager(cwd)\n\n // プロジェクトタイプの判定\n const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies }\n\n if (dependencies['next']) {\n return {\n name: 'Next.js',\n detected: true,\n packageManager,\n setupCommands: [`${packageManager} install`],\n syncFiles: ['.env', '.env.local', '.env.development.local'],\n }\n } else if (dependencies['react']) {\n return {\n name: 'React',\n detected: true,\n packageManager,\n setupCommands: [`${packageManager} install`],\n syncFiles: ['.env', '.env.local'],\n }\n } else if (dependencies['vue']) {\n return {\n name: 'Vue.js',\n detected: true,\n packageManager,\n setupCommands: [`${packageManager} install`],\n syncFiles: ['.env', '.env.local'],\n }\n } else {\n return {\n name: 'Node.js',\n detected: true,\n packageManager,\n setupCommands: [`${packageManager} install`],\n syncFiles: ['.env'],\n }\n }\n }\n\n // Pythonプロジェクト\n if (\n existsSync(path.join(cwd, 'requirements.txt')) ||\n existsSync(path.join(cwd, 'pyproject.toml'))\n ) {\n return {\n name: 'Python',\n detected: true,\n packageManager: 'none',\n setupCommands: ['pip install -r requirements.txt'],\n syncFiles: ['.env'],\n }\n }\n\n // Go プロジェクト\n if (existsSync(path.join(cwd, 'go.mod'))) {\n return {\n name: 'Go',\n detected: true,\n packageManager: 'none',\n setupCommands: ['go mod download'],\n syncFiles: ['.env'],\n }\n }\n\n return {\n name: 'Generic',\n detected: false,\n packageManager: 'none',\n setupCommands: [],\n syncFiles: ['.env'],\n }\n}\n\nexport function createMinimalConfig() {\n return {\n worktrees: {\n path: '.git/orchestra-members',\n },\n development: {\n autoSetup: true,\n defaultEditor: 'cursor',\n },\n }\n}\n\nexport function createDefaultConfig(\n projectType: ProjectType,\n packageManager?: PackageManager\n): Record<string, unknown> {\n let commands: string[] = []\n\n if (packageManager && packageManager !== 'none') {\n // 明示的にpackage managerが指定された場合は、それを使用\n commands = [`${packageManager} install`]\n } else if (projectType.setupCommands && projectType.setupCommands.length > 0) {\n // プロジェクトタイプに特有のsetupCommandsがある場合\n commands = projectType.setupCommands\n } else {\n // デフォルトまたは検出されたpackage managerを使用\n const pm = projectType.packageManager || 'npm'\n if (pm !== 'none') {\n commands = [`${pm} install`]\n }\n }\n\n return {\n worktrees: {\n path: '.git/orchestra-members',\n branchPrefix: 'feature/',\n },\n development: {\n autoSetup: true,\n defaultEditor: 'cursor',\n },\n postCreate: {\n copyFiles: projectType.syncFiles || ['.env'],\n commands,\n },\n hooks: {\n beforeDelete: 'echo \"演奏者を削除します: $ORCHESTRA_MEMBER\"',\n },\n }\n}\n\nexport async function createInteractiveConfig(\n projectType: ProjectType\n): Promise<Record<string, unknown>> {\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'packageManager',\n message: 'どのパッケージマネージャーを使用しますか?',\n choices: [\n { name: 'pnpm', value: 'pnpm' },\n { name: 'npm', value: 'npm' },\n { name: 'yarn', value: 'yarn' },\n { name: 'none (パッケージマネージャーを使用しない)', value: 'none' },\n ],\n default: projectType.packageManager || 'pnpm',\n },\n {\n type: 'input',\n name: 'worktreePath',\n message: 'worktreeを作成するディレクトリは?',\n default: '.git/orchestra-members',\n },\n {\n type: 'input',\n name: 'branchPrefix',\n message: 'ブランチ名のプレフィックスは?',\n default: 'feature/',\n },\n {\n type: 'list',\n name: 'defaultEditor',\n message: 'デフォルトのエディタは?',\n choices: [\n { name: 'Cursor', value: 'cursor' },\n { name: 'VS Code', value: 'vscode' },\n { name: 'Vim', value: 'vim' },\n { name: 'その他', value: 'other' },\n ],\n default: 'cursor',\n },\n {\n type: 'confirm',\n name: 'autoSetup',\n message: '依存関係の自動インストールを有効にしますか?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'copyEnvFiles',\n message: '環境ファイルをworktreeにコピーしますか?',\n default: true,\n when: answers => answers.autoSetup,\n },\n {\n type: 'input',\n name: 'syncFiles',\n message: 'コピーするファイルを指定 (カンマ区切り):',\n default: (projectType.syncFiles || ['.env']).join(', '),\n when: answers => answers.copyEnvFiles,\n filter: (input: string) =>\n input\n .split(',')\n .map(s => s.trim())\n .filter(Boolean),\n },\n ])\n\n const commands = []\n if (answers.autoSetup && answers.packageManager !== 'none') {\n commands.push(`${answers.packageManager} install`)\n }\n\n return {\n worktrees: {\n path: answers.worktreePath,\n branchPrefix: answers.branchPrefix,\n },\n development: {\n autoSetup: answers.autoSetup,\n defaultEditor: answers.defaultEditor,\n },\n postCreate: {\n copyFiles: answers.syncFiles || [],\n commands,\n },\n hooks: {\n beforeDelete: 'echo \"演奏者を削除します: $ORCHESTRA_MEMBER\"',\n },\n }\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport inquirer from 'inquirer'\nimport { GitWorktreeManager } from '../core/git.js'\nimport { execa } from 'execa'\n\ninterface PushOptions {\n pr?: boolean\n draftPr?: boolean\n base?: string\n title?: string\n body?: string\n noEdit?: boolean\n force?: boolean\n all?: boolean\n issue?: number\n}\n\nclass PushCommandError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'PushCommandError'\n }\n}\n\nasync function getCurrentBranch(): Promise<string> {\n try {\n const { stdout } = await execa('git', ['branch', '--show-current'])\n return stdout.trim()\n } catch {\n throw new PushCommandError('現在のブランチを取得できませんでした')\n }\n}\n\nasync function hasRemoteOrigin(): Promise<boolean> {\n try {\n await execa('git', ['remote', 'get-url', 'origin'])\n return true\n } catch {\n return false\n }\n}\n\nasync function pushToRemote(branchName: string, force: boolean = false): Promise<void> {\n const pushSpinner = ora('リモートにプッシュ中...').start()\n\n try {\n const args = ['push']\n\n if (force) {\n args.push('--force-with-lease')\n }\n\n // リモートブランチが存在しない場合は -u を追加\n try {\n await execa('git', ['rev-parse', `origin/${branchName}`])\n } catch {\n args.push('-u', 'origin', branchName)\n }\n\n await execa('git', args)\n pushSpinner.succeed(chalk.green(`✨ ブランチ '${branchName}' をリモートにプッシュしました`))\n } catch (error) {\n pushSpinner.fail(chalk.red('プッシュに失敗しました'))\n throw new PushCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function createPullRequest(branchName: string, options: PushOptions): Promise<void> {\n const prSpinner = ora('Pull Requestを作成中...').start()\n\n try {\n const args = ['pr', 'create']\n\n if (options.draftPr) {\n args.push('--draft')\n }\n\n if (options.base) {\n args.push('--base', options.base)\n }\n\n if (options.title) {\n args.push('--title', options.title)\n } else {\n // デフォルトタイトル\n const defaultTitle = options.draftPr ? `WIP: ${branchName}` : branchName\n args.push('--title', defaultTitle)\n }\n\n if (options.body) {\n args.push('--body', options.body)\n } else if (options.draftPr) {\n args.push('--body', 'Work in progress')\n }\n\n if (options.noEdit) {\n args.push('--fill')\n }\n\n await execa('gh', args)\n\n const prType = options.draftPr ? 'Draft PR' : 'PR'\n prSpinner.succeed(chalk.green(`✨ ${prType}を作成しました`))\n } catch (error) {\n const prType = options.draftPr ? 'Draft PR' : 'PR'\n prSpinner.fail(chalk.red(`${prType}の作成に失敗しました`))\n throw new PushCommandError(error instanceof Error ? error.message : '不明なエラー')\n }\n}\n\nasync function pushWorktree(branchName: string, options: PushOptions): Promise<void> {\n // リモートの存在確認\n if (!(await hasRemoteOrigin())) {\n throw new PushCommandError('リモートリポジトリ (origin) が設定されていません')\n }\n\n // GitHub CLIの確認(PR作成時のみ)\n if (options.pr || options.draftPr) {\n try {\n await execa('gh', ['auth', 'status'])\n } catch {\n throw new PushCommandError(\n 'GitHub CLIが認証されていません。`gh auth login` を実行してください'\n )\n }\n }\n\n // プッシュ実行\n await pushToRemote(branchName, options.force)\n\n // PR作成\n if (options.pr || options.draftPr) {\n await createPullRequest(branchName, options)\n }\n}\n\nasync function pushAllWorktrees(options: PushOptions): Promise<void> {\n const gitManager = new GitWorktreeManager()\n const worktrees = await gitManager.listWorktrees()\n\n // メインworktreeを除外\n const orchestraMembers = worktrees.filter(wt => wt.path !== process.cwd())\n\n if (orchestraMembers.length === 0) {\n console.log(chalk.yellow('プッシュ対象の演奏者(worktree)が見つかりません'))\n return\n }\n\n console.log(chalk.cyan(`\\n📋 ${orchestraMembers.length}個の演奏者を処理します:`))\n\n for (const worktree of orchestraMembers) {\n const branchName = worktree.branch\n if (!branchName) continue\n\n console.log(chalk.blue(`\\n🎼 演奏者 '${branchName}' を処理中...`))\n\n try {\n // worktreeディレクトリに移動して処理\n const originalCwd = process.cwd()\n process.chdir(worktree.path)\n\n await pushWorktree(branchName, options)\n\n // 元のディレクトリに戻る\n process.chdir(originalCwd)\n } catch (error) {\n console.error(\n chalk.red(\n `✖ 演奏者 '${branchName}' の処理に失敗: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n }\n }\n}\n\nexport const pushCommand = new Command('push')\n .description('現在のブランチをリモートにプッシュし、オプションでPRを作成')\n .option('--pr', '通常のPull Requestを作成')\n .option('--draft-pr', 'Draft Pull Requestを作成')\n .option('--base <branch>', 'ベースブランチを指定 (デフォルト: main)')\n .option('--title <title>', 'PRタイトルを指定')\n .option('--body <body>', 'PR本文を指定')\n .option('--no-edit', 'エディタを開かずにPRを作成')\n .option('--force', 'force pushを実行(--force-with-lease)')\n .option('--all', 'すべての演奏者(worktree)をプッシュ')\n .option('--issue <number>', '関連Issue番号を指定', parseInt)\n .exitOverride()\n .action(async (options: PushOptions) => {\n try {\n const gitManager = new GitWorktreeManager()\n\n // Gitリポジトリの確認\n if (!(await gitManager.isGitRepository())) {\n throw new PushCommandError('このディレクトリはGitリポジトリではありません')\n }\n\n // 全worktree処理\n if (options.all) {\n await pushAllWorktrees(options)\n return\n }\n\n // 現在のブランチを取得\n const currentBranch = await getCurrentBranch()\n\n if (!currentBranch) {\n throw new PushCommandError('ブランチが detached HEAD 状態です')\n }\n\n // メインブランチの場合は警告\n const mainBranches = ['main', 'master', 'develop', 'development']\n if (mainBranches.includes(currentBranch)) {\n const { confirmPush } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmPush',\n message: `メインブランチ '${currentBranch}' をプッシュしますか?`,\n default: false,\n },\n ])\n\n if (!confirmPush) {\n console.log(chalk.yellow('キャンセルされました'))\n return\n }\n }\n\n // プッシュ実行\n await pushWorktree(currentBranch, options)\n } catch (error) {\n if (error instanceof PushCommandError) {\n console.error(chalk.red(`✖ ${error.message}`))\n process.exitCode = 1\n } else {\n console.error(\n chalk.red(\n `✖ 予期しないエラー: ${error instanceof Error ? error.message : '不明なエラー'}`\n )\n )\n process.exitCode = 1\n }\n }\n })\n"],"mappings":"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EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA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","names":["Command","chalk","readFileSync","fileURLToPath","dirname","join","chalk","inquirer","path","fs","execa","path","fs","spawn","execa","chalk","inquirer","spawn","execa","path","execa","chalk","inquirer","existsSync","path","packageJson","existsSync","readFileSync","path","path","execa","path","fs","createTmuxSession","chalk","inquirer","path","fs","chalk","spawn","execa","Command","chalk","spawn","fs","path","formatPath","Command","chalk","path","fs","spawn","Command","chalk","ora","inquirer","execa","spawn","execa","ora","chalk","chalk","spawn","inquirer","ora","execa","Command","Command","chalk","spawn","inquirer","execa","path","spawn","chalk","Command","startNormalShell","chalk","getShell","getShellEnv","spawn","branchName","inquirer","configManager","config","execa","Command","chalk","execa","ora","chalk","execa","ora","Command","Command","chalk","ora","inquirer","execa","spawn","inquirer","chalk","setupEnvironment","ora","execa","openInEditor","Command","spawn","Command","chalk","inquirer","fs","path","chalk","Command","Command","chalk","ora","inquirer","execa","path","fs","execa","chalk","ora","setupEnvironment","path","fs","openInEditor","inquirer","configManager","fullConfig","Command","Command","chalk","Command","chalk","ora","execa","spawn","execa","chalk","Command","ora","spawn","Command","chalk","spawn","Command","chalk","displayPath","spawn","Command","chalk","ora","inquirer","execa","spawn","fs","path","chalk","inquirer","branchName","Command","ora","Command","chalk","ora","inquirer","execa","ora","chalk","execa","addComment","inquirer","Command","pr","Command","chalk","ora","inquirer","execa","ora","openInBrowser","chalk","Command","inquirer","Command","chalk","ora","inquirer","path","fs","chalk","ora","inquirer","Command","Command","chalk","ora","execa","path","chalk","Command","ora","fs","Command","chalk","ora","inquirer","execa","fs","fs","execa","chalk","inquirer","ora","Command","Command","chalk","ora","inquirer","execa","fs","path","chalk","ora","inquirer","Command","Command","chalk","inquirer","existsSync","readFileSync","writeFileSync","path","ora","Command","chalk","path","existsSync","inquirer","ora","writeFileSync","packageJson","readFileSync","answers","Command","chalk","ora","inquirer","execa","ora","chalk","Command","inquirer","__dirname","dirname","fileURLToPath","readFileSync","join","Command","chalk"]}
|