@iloom/cli 0.1.19 → 0.2.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.
Files changed (97) hide show
  1. package/README.md +16 -0
  2. package/dist/ClaudeContextManager-LVCYRM6Q.js +13 -0
  3. package/dist/ClaudeService-WVTWB3DK.js +12 -0
  4. package/dist/{GitHubService-LWP4GKGH.js → GitHubService-7E2S5NNZ.js} +3 -3
  5. package/dist/{LoomLauncher-UMMLPIZO.js → LoomLauncher-CTSWJL35.js} +6 -6
  6. package/dist/README.md +16 -0
  7. package/dist/{SettingsManager-SKLUVE3K.js → SettingsManager-XOYCLH3D.js} +2 -2
  8. package/dist/{add-issue-X56V3XPB.js → add-issue-OBI325W7.js} +7 -7
  9. package/dist/{chunk-DEPYQRRB.js → chunk-2PLUQT6J.js} +2 -2
  10. package/dist/{chunk-VVH3ANF2.js → chunk-4IV6W4U5.js} +4 -4
  11. package/dist/{chunk-PV3GAXQO.js → chunk-6LEQW46Y.js} +2 -2
  12. package/dist/{chunk-VCMMAFXQ.js → chunk-CVLAZRNB.js} +2 -2
  13. package/dist/{chunk-FXV24OYZ.js → chunk-DJUGYNQE.js} +9 -2
  14. package/dist/{chunk-FXV24OYZ.js.map → chunk-DJUGYNQE.js.map} +1 -1
  15. package/dist/{chunk-KOCQAD2E.js → chunk-HBVFXN7R.js} +3 -3
  16. package/dist/{chunk-ELFT36PV.js → chunk-LHP6ROUM.js} +3 -3
  17. package/dist/{chunk-PXZBAC2M.js → chunk-MFU53H6J.js} +2 -2
  18. package/dist/{chunk-PR7FKQBG.js → chunk-RF2YI2XJ.js} +2 -2
  19. package/dist/{chunk-JXQXSC45.js → chunk-SWCRXDZC.js} +2 -2
  20. package/dist/{chunk-Q2KYPAH2.js → chunk-SYOSCMIT.js} +6 -6
  21. package/dist/{chunk-VYQLLHZ7.js → chunk-T3KEIB4D.js} +6 -2
  22. package/dist/{chunk-VYQLLHZ7.js.map → chunk-T3KEIB4D.js.map} +1 -1
  23. package/dist/{chunk-ZWXJBSUW.js → chunk-TS6DL67T.js} +2 -2
  24. package/dist/{chunk-IO4WFTL2.js → chunk-VETG35MF.js} +2 -2
  25. package/dist/{chunk-RSRO7564.js → chunk-ZE74H5BR.js} +28 -3
  26. package/dist/chunk-ZE74H5BR.js.map +1 -0
  27. package/dist/{claude-7LUVDZZ4.js → claude-ZIWDG4XG.js} +2 -2
  28. package/dist/{cleanup-ZHROIBSQ.js → cleanup-FEIVZSIV.js} +5 -5
  29. package/dist/cli.js +29 -29
  30. package/dist/cli.js.map +1 -1
  31. package/dist/{contribute-3MQJ3XAQ.js → contribute-EMZKCAC6.js} +6 -3
  32. package/dist/{contribute-3MQJ3XAQ.js.map → contribute-EMZKCAC6.js.map} +1 -1
  33. package/dist/{enhance-VGWUX474.js → enhance-MNA4ZGXW.js} +7 -7
  34. package/dist/{feedback-ZOUCCHN4.js → feedback-LFNMQBAZ.js} +6 -6
  35. package/dist/{finish-QJSK6Z7J.js → finish-TX5CJICB.js} +411 -17
  36. package/dist/finish-TX5CJICB.js.map +1 -0
  37. package/dist/{git-OUYMVYJX.js → git-WC6HZLOT.js} +2 -2
  38. package/dist/{ignite-HICLZEYU.js → ignite-MQWVJEAB.js} +7 -7
  39. package/dist/index.d.ts +20 -0
  40. package/dist/index.js +32 -3
  41. package/dist/index.js.map +1 -1
  42. package/dist/{init-UMKNHNV5.js → init-GJDYN2IK.js} +6 -6
  43. package/dist/mcp/{claude-YHHHLSXH.js → claude-NDFOCQQQ.js} +2 -2
  44. package/dist/mcp/{terminal-SDCMDVD7.js → terminal-OMNRFWB3.js} +28 -3
  45. package/dist/mcp/terminal-OMNRFWB3.js.map +1 -0
  46. package/dist/{open-ETZUFSE4.js → open-NXSN7XOC.js} +4 -4
  47. package/dist/prompts/init-prompt.txt +29 -0
  48. package/dist/{rebase-KBWFDZCN.js → rebase-DUNFOJVS.js} +6 -6
  49. package/dist/{remote-GJEZWRCC.js → remote-ZCXJVVNW.js} +4 -2
  50. package/dist/{run-4SVQ3WEU.js → run-O7ZK7CKA.js} +4 -4
  51. package/dist/schema/settings.schema.json +18 -0
  52. package/dist/{start-CT2ZEFP2.js → start-73I5W7WW.js} +15 -15
  53. package/dist/{terminal-3D6TUAKJ.js → terminal-BIRBZ4AZ.js} +2 -2
  54. package/dist/{test-git-MKZATGZN.js → test-git-T76HOTIA.js} +3 -3
  55. package/dist/{test-prefix-ZNLWDI3K.js → test-prefix-6HJUVQMH.js} +3 -3
  56. package/dist/{test-tabs-JRKY3QMM.js → test-tabs-RXDBZ6J7.js} +2 -2
  57. package/package.json +1 -1
  58. package/dist/ClaudeContextManager-JKR4WGNU.js +0 -13
  59. package/dist/ClaudeService-55DQGB7T.js +0 -12
  60. package/dist/chunk-RSRO7564.js.map +0 -1
  61. package/dist/finish-QJSK6Z7J.js.map +0 -1
  62. package/dist/mcp/terminal-SDCMDVD7.js.map +0 -1
  63. /package/dist/{ClaudeContextManager-JKR4WGNU.js.map → ClaudeContextManager-LVCYRM6Q.js.map} +0 -0
  64. /package/dist/{ClaudeService-55DQGB7T.js.map → ClaudeService-WVTWB3DK.js.map} +0 -0
  65. /package/dist/{GitHubService-LWP4GKGH.js.map → GitHubService-7E2S5NNZ.js.map} +0 -0
  66. /package/dist/{LoomLauncher-UMMLPIZO.js.map → LoomLauncher-CTSWJL35.js.map} +0 -0
  67. /package/dist/{SettingsManager-SKLUVE3K.js.map → SettingsManager-XOYCLH3D.js.map} +0 -0
  68. /package/dist/{add-issue-X56V3XPB.js.map → add-issue-OBI325W7.js.map} +0 -0
  69. /package/dist/{chunk-DEPYQRRB.js.map → chunk-2PLUQT6J.js.map} +0 -0
  70. /package/dist/{chunk-VVH3ANF2.js.map → chunk-4IV6W4U5.js.map} +0 -0
  71. /package/dist/{chunk-PV3GAXQO.js.map → chunk-6LEQW46Y.js.map} +0 -0
  72. /package/dist/{chunk-VCMMAFXQ.js.map → chunk-CVLAZRNB.js.map} +0 -0
  73. /package/dist/{chunk-KOCQAD2E.js.map → chunk-HBVFXN7R.js.map} +0 -0
  74. /package/dist/{chunk-ELFT36PV.js.map → chunk-LHP6ROUM.js.map} +0 -0
  75. /package/dist/{chunk-PXZBAC2M.js.map → chunk-MFU53H6J.js.map} +0 -0
  76. /package/dist/{chunk-PR7FKQBG.js.map → chunk-RF2YI2XJ.js.map} +0 -0
  77. /package/dist/{chunk-JXQXSC45.js.map → chunk-SWCRXDZC.js.map} +0 -0
  78. /package/dist/{chunk-Q2KYPAH2.js.map → chunk-SYOSCMIT.js.map} +0 -0
  79. /package/dist/{chunk-ZWXJBSUW.js.map → chunk-TS6DL67T.js.map} +0 -0
  80. /package/dist/{chunk-IO4WFTL2.js.map → chunk-VETG35MF.js.map} +0 -0
  81. /package/dist/{claude-7LUVDZZ4.js.map → claude-ZIWDG4XG.js.map} +0 -0
  82. /package/dist/{cleanup-ZHROIBSQ.js.map → cleanup-FEIVZSIV.js.map} +0 -0
  83. /package/dist/{enhance-VGWUX474.js.map → enhance-MNA4ZGXW.js.map} +0 -0
  84. /package/dist/{feedback-ZOUCCHN4.js.map → feedback-LFNMQBAZ.js.map} +0 -0
  85. /package/dist/{git-OUYMVYJX.js.map → git-WC6HZLOT.js.map} +0 -0
  86. /package/dist/{ignite-HICLZEYU.js.map → ignite-MQWVJEAB.js.map} +0 -0
  87. /package/dist/{init-UMKNHNV5.js.map → init-GJDYN2IK.js.map} +0 -0
  88. /package/dist/mcp/{claude-YHHHLSXH.js.map → claude-NDFOCQQQ.js.map} +0 -0
  89. /package/dist/{open-ETZUFSE4.js.map → open-NXSN7XOC.js.map} +0 -0
  90. /package/dist/{rebase-KBWFDZCN.js.map → rebase-DUNFOJVS.js.map} +0 -0
  91. /package/dist/{remote-GJEZWRCC.js.map → remote-ZCXJVVNW.js.map} +0 -0
  92. /package/dist/{run-4SVQ3WEU.js.map → run-O7ZK7CKA.js.map} +0 -0
  93. /package/dist/{start-CT2ZEFP2.js.map → start-73I5W7WW.js.map} +0 -0
  94. /package/dist/{terminal-3D6TUAKJ.js.map → terminal-BIRBZ4AZ.js.map} +0 -0
  95. /package/dist/{test-git-MKZATGZN.js.map → test-git-T76HOTIA.js.map} +0 -0
  96. /package/dist/{test-prefix-ZNLWDI3K.js.map → test-prefix-6HJUVQMH.js.map} +0 -0
  97. /package/dist/{test-tabs-JRKY3QMM.js.map → test-tabs-RXDBZ6J7.js.map} +0 -0
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/utils/package-info.ts"],"sourcesContent":["import { program, Command, Option } from 'commander'\nimport { logger } from './utils/logger.js'\nimport { GitWorktreeManager } from './lib/GitWorktreeManager.js'\nimport { ShellCompletion } from './lib/ShellCompletion.js'\nimport type { StartOptions, CleanupOptions, FinishOptions } from './types/index.js'\nimport { getPackageInfo } from './utils/package-info.js'\nimport { fileURLToPath } from 'url'\n\n// Get package.json for version\nconst __filename = fileURLToPath(import.meta.url)\nconst packageJson = getPackageInfo(__filename)\n\nprogram\n .name('iloom')\n .description(packageJson.description)\n .version(packageJson.version)\n .option('--debug', 'Enable debug output (default: based on ILOOM_DEBUG env var)')\n .option('--completion', 'Output shell completion script for current shell')\n .option('--set <key=value>', 'Override any setting using dot notation (repeatable, e.g., --set workflows.issue.startIde=false)')\n .allowUnknownOption() // Allow --set to be used multiple times\n .hook('preAction', async (thisCommand) => {\n // Set debug mode based on flag or environment variable\n const options = thisCommand.opts()\n // Default to environment variable value, then false if not set\n const envDebug = process.env.ILOOM_DEBUG === 'true'\n const debugEnabled = options.debug !== undefined ? options.debug : envDebug\n logger.setDebug(debugEnabled)\n\n // Handle --completion flag\n if (options.completion) {\n const shellCompletion = new ShellCompletion()\n shellCompletion.printCompletionScript()\n process.exit(0)\n }\n\n // Check for updates before command execution for global installations\n try {\n const { checkAndNotifyUpdate } = await import('./utils/update-notifier.js')\n const { detectInstallationMethod } = await import('./utils/installation-detector.js')\n\n // Detect installation method\n const installMethod = detectInstallationMethod(__filename)\n\n // Check and notify (non-blocking, all errors handled internally)\n await checkAndNotifyUpdate(packageJson.version, packageJson.name, installMethod)\n } catch {\n // Silently fail - update check should never break user experience\n }\n\n // Migrate legacy .hatchbox settings to .iloom (BEFORE settings validation)\n try {\n const { SettingsMigrationManager } = await import('./lib/SettingsMigrationManager.js')\n const migrationManager = new SettingsMigrationManager()\n await migrationManager.migrateSettingsIfNeeded()\n } catch (error) {\n // Log warning but don't fail - migration is best-effort\n logger.debug(`Settings migration failed: ${error instanceof Error ? error.message : 'Unknown'}`)\n }\n\n // Validate settings for all commands\n await validateSettingsForCommand(thisCommand)\n })\n\n// Helper function to validate settings at startup\nasync function validateSettingsForCommand(command: Command): Promise<void> {\n const commandName = command.args[0] ?? ''\n\n // Tier 1: Commands that bypass ALL validation\n const bypassCommands = ['help', 'init', 'update', 'contribute']\n\n if (bypassCommands.includes(commandName)) {\n return\n }\n\n // Tier 2: All other commands require FULL validation (settings + multi-remote)\n // Commands: start, add-issue, enhance, finish, list, cleanup, open, run, etc.\n try {\n const { SettingsManager } = await import('./lib/SettingsManager.js')\n const settingsManager = new SettingsManager()\n\n // Attempt to load settings - this will throw on validation errors\n // Missing file is OK (returns {})\n const settings = await settingsManager.loadSettings()\n\n // Check for multi-remote configuration requirement\n const { hasMultipleRemotes } = await import('./utils/remote.js')\n const multipleRemotes = await hasMultipleRemotes()\n\n if (multipleRemotes && !settings.issueManagement?.github?.remote) {\n // Auto-launch init command to configure remotes\n // After init completes, function returns and Commander.js continues with original command\n await autoLaunchInitForMultipleRemotes()\n return // Settings now configured, let preAction complete\n }\n } catch (error) {\n logger.error(`Configuration error: ${error instanceof Error ? error.message : 'Unknown error'}`)\n logger.info('Please fix your .iloom/settings.json file and try again.')\n process.exit(1)\n }\n}\n\n/**\n * Auto-launch init command when multiple remotes are detected but not configured\n * Shows message, waits for keypress, launches interactive Claude configuration,\n * then returns to let Commander.js continue with the original command\n */\nasync function autoLaunchInitForMultipleRemotes(): Promise<void> {\n logger.info('Multiple git remotes detected, but no GitHub remote is configured.')\n logger.info('')\n logger.info('iloom will now launch an interactive configuration session with Claude')\n logger.info('to help you select which remote to use for GitHub operations.')\n logger.info('')\n\n // Wait for keypress to continue\n const { waitForKeypress } = await import('./utils/prompt.js')\n await waitForKeypress('Press any key to start configuration...')\n\n logger.info('')\n\n try {\n // Launch init command with focused initial message\n const { InitCommand } = await import('./commands/init.js')\n const initCommand = new InitCommand()\n\n // Custom initial message that focuses on multi-remote configuration\n const customInitialMessage = 'Help me configure which git remote iloom should use for GitHub operations. I have multiple remotes and need to select the correct one.'\n\n await initCommand.execute(customInitialMessage)\n\n logger.info('')\n logger.info('Configuration complete! Continuing with your original command...')\n logger.info('')\n\n // Re-validate settings after init to ensure multi-remote is now configured\n const { SettingsManager } = await import('./lib/SettingsManager.js')\n const settingsManager = new SettingsManager()\n const settings = await settingsManager.loadSettings()\n\n const { hasMultipleRemotes } = await import('./utils/remote.js')\n const multipleRemotes = await hasMultipleRemotes()\n\n // Verify the issue is resolved\n if (multipleRemotes && !settings.issueManagement?.github?.remote) {\n logger.error('Configuration incomplete: GitHub remote is still not configured.')\n logger.info('Please run \"iloom init\" again and configure the GitHub remote setting.')\n process.exit(1)\n }\n\n // Configuration verified - simply return to let Commander.js continue\n // with the original command (preAction hook will complete normally)\n return\n\n } catch (error) {\n logger.error(`Failed to configure remotes: ${error instanceof Error ? error.message : 'Unknown error'}`)\n logger.info('You can manually run \"iloom init\" to configure settings.')\n process.exit(1)\n }\n}\n\n// Initialize shell completion (must be after program setup, before parseAsync)\nconst shellCompletion = new ShellCompletion()\nshellCompletion.init()\n\nprogram\n .command('start')\n .alias('create')\n .alias('up')\n .description('Create isolated workspace for an issue/PR')\n .argument('[identifier]', 'Issue number, PR number, or branch name (optional - will prompt if not provided)')\n .option('--claude', 'Enable Claude integration (default: true)')\n .option('--no-claude', 'Disable Claude integration')\n .option('--code', 'Enable VSCode (default: true)')\n .option('--no-code', 'Disable VSCode')\n .option('--dev-server', 'Enable dev server in terminal (default: true)')\n .option('--no-dev-server', 'Disable dev server')\n .option('--terminal', 'Enable terminal without dev server (default: false)')\n .option('--no-terminal', 'Disable terminal')\n .addOption(\n new Option('--one-shot <mode>', 'One-shot automation mode')\n .choices(['default', 'noReview', 'bypassPermissions'])\n .default('default')\n )\n .action(async (identifier: string | undefined, options: StartOptions) => {\n try {\n let finalIdentifier = identifier\n\n // Interactive prompting when no identifier provided\n if (!finalIdentifier) {\n const { promptInput } = await import('./utils/prompt.js')\n finalIdentifier = await promptInput('Enter issue number, PR number (pr/123), or branch name')\n\n // Validate non-empty after prompting\n if (!finalIdentifier?.trim()) {\n logger.error('Identifier is required')\n process.exit(1)\n }\n }\n\n const { StartCommand } = await import('./commands/start.js')\n const command = new StartCommand()\n await command.execute({ identifier: finalIdentifier, options })\n } catch (error) {\n logger.error(`Failed to start workspace: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('add-issue')\n .alias('a')\n .description('Create and enhance GitHub issue without starting workspace')\n .argument('<description>', 'Natural language description of the issue (>50 chars, >2 spaces)')\n .action(async (description: string) => {\n try {\n const { AddIssueCommand } = await import('./commands/add-issue.js')\n const command = new AddIssueCommand()\n const issueNumber = await command.execute({\n description,\n options: {}\n })\n logger.success(`Issue #${issueNumber} created successfully`)\n process.exit(0)\n } catch (error) {\n logger.error(`Failed to create issue: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('feedback')\n .alias('f')\n .description('Submit feedback/bug report to iloom-cli repository')\n .argument('<description>', 'Natural language description of feedback (>50 chars, >2 spaces)')\n .action(async (description: string) => {\n try {\n const { FeedbackCommand } = await import('./commands/feedback.js')\n const command = new FeedbackCommand()\n const issueNumber = await command.execute({\n description,\n options: {}\n })\n logger.success(`Feedback submitted as issue #${issueNumber} in iloom-cli repository`)\n process.exit(0)\n } catch (error) {\n logger.error(`Failed to submit feedback: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('enhance')\n .description('Apply enhancement agent to existing GitHub issue')\n .argument('<issue-number>', 'GitHub issue number to enhance', parseInt)\n .option('--no-browser', 'Skip browser opening prompt')\n .option('--author <username>', 'GitHub username to tag in questions (for CI usage)')\n .action(async (issueNumber: number, options: { browser?: boolean; author?: string }) => {\n try {\n const { EnhanceCommand } = await import('./commands/enhance.js')\n const command = new EnhanceCommand()\n await command.execute({\n issueNumber,\n options: {\n noBrowser: options.browser === false,\n ...(options.author && { author: options.author })\n }\n })\n logger.success(`Enhancement process completed for issue #${issueNumber}`)\n process.exit(0)\n } catch (error) {\n logger.error(`Failed to enhance issue: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('finish')\n .alias('dn')\n .description('Merge work and cleanup workspace')\n .argument('[identifier]', 'Issue number, PR number, or branch name (auto-detected if omitted)')\n .option('-f, --force', 'Skip confirmation prompts')\n .option('-n, --dry-run', 'Preview actions without executing')\n .option('--pr <number>', 'Treat input as PR number', parseFloat)\n .option('--skip-build', 'Skip post-merge build verification')\n .action(async (identifier: string | undefined, options: FinishOptions) => {\n try {\n const { FinishCommand } = await import('./commands/finish.js')\n const command = new FinishCommand()\n await command.execute({ identifier, options })\n } catch (error) {\n logger.error(`Failed to finish workspace: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('rebase')\n .description('Rebase current branch on main with Claude-assisted conflict resolution')\n .option('-f, --force', 'Skip confirmation prompts')\n .option('-n, --dry-run', 'Preview actions without executing')\n .action(async (options: { force?: boolean; dryRun?: boolean }) => {\n try {\n const { RebaseCommand } = await import('./commands/rebase.js')\n const command = new RebaseCommand()\n await command.execute(options)\n } catch (error) {\n logger.error(`Failed to rebase: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('spin')\n .alias('ignite')\n .description('Launch Claude with auto-detected workspace context')\n .addOption(\n new Option('--one-shot <mode>', 'One-shot automation mode')\n .choices(['default', 'noReview', 'bypassPermissions'])\n .default('default')\n )\n .action(async (options: { oneShot?: import('./types/index.js').OneShotMode }) => {\n try {\n const { IgniteCommand } = await import('./commands/ignite.js')\n const command = new IgniteCommand()\n await command.execute(options.oneShot ?? 'default')\n } catch (error) {\n logger.error(`Failed to spin up loom: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('open')\n .description('Open workspace in browser or run CLI tool')\n .argument('[identifier]', 'Issue number, PR number, or branch name (auto-detected if omitted)')\n .allowUnknownOption()\n .action(async (identifier?: string, _options?: Record<string, unknown>, command?: Command) => {\n try {\n // Extract additional arguments - everything after identifier\n const args = command?.args ? command.args.slice(identifier ? 1 : 0) : []\n\n const { OpenCommand } = await import('./commands/open.js')\n const cmd = new OpenCommand()\n const input = identifier ? { identifier, args } : { args }\n await cmd.execute(input)\n } catch (error) {\n logger.error(`Failed to open: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('run')\n .description('Run CLI tool or open workspace in browser')\n .argument('[identifier]', 'Issue number, PR number, or branch name (auto-detected if omitted)')\n .allowUnknownOption()\n .action(async (identifier?: string, _options?: Record<string, unknown>, command?: Command) => {\n try {\n // Extract additional arguments - everything after identifier\n const args = command?.args ? command.args.slice(identifier ? 1 : 0) : []\n\n const { RunCommand } = await import('./commands/run.js')\n const cmd = new RunCommand()\n const input = identifier ? { identifier, args } : { args }\n await cmd.execute(input)\n } catch (error) {\n logger.error(`Failed to run: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('cleanup')\n .description('Remove workspaces')\n .argument('[identifier]', 'Branch name or issue number to cleanup (auto-detected)')\n .option('-l, --list', 'List all worktrees')\n .option('-a, --all', 'Remove all worktrees (interactive confirmation)')\n .option('-i, --issue <number>', 'Cleanup by issue number', parseInt)\n .option('-f, --force', 'Skip confirmations and force removal')\n .option('--dry-run', 'Show what would be done without doing it')\n .action(async (identifier?: string, options?: CleanupOptions) => {\n try {\n const { CleanupCommand } = await import('./commands/cleanup.js')\n const command = new CleanupCommand()\n const input: { identifier?: string; options: CleanupOptions } = {\n options: options ?? {}\n }\n if (identifier) {\n input.identifier = identifier\n }\n await command.execute(input)\n } catch (error) {\n logger.error(`Failed to cleanup worktrees: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('list')\n .description('Show active workspaces')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n try {\n const manager = new GitWorktreeManager()\n const worktrees = await manager.listWorktrees({ porcelain: true })\n\n if (options.json) {\n console.log(JSON.stringify(worktrees, null, 2))\n return\n }\n\n if (worktrees.length === 0) {\n logger.info('No worktrees found')\n return\n }\n\n logger.info('Active workspaces:')\n for (const worktree of worktrees) {\n const formatted = manager.formatWorktree(worktree)\n logger.info(` ${formatted.title}`)\n logger.info(` Path: ${formatted.path}`)\n logger.info(` Commit: ${formatted.commit}`)\n }\n } catch (error) {\n logger.error(`Failed to list worktrees: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\n\nprogram\n .command('init')\n .alias('config')\n .description('Initialize iloom configuration and setup shell autocomplete')\n .action(async () => {\n try {\n const { InitCommand } = await import('./commands/init.js')\n const command = new InitCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Failed to initialize: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('contribute')\n .description('Set up local development environment for contributing to iloom')\n .action(async () => {\n try {\n const { ContributeCommand } = await import('./commands/contribute.js')\n const command = new ContributeCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Failed to set up contributor environment: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('update')\n .description('Update iloom-cli to the latest version')\n .option('--dry-run', 'Show what would be done without actually updating')\n .action(async (options: { dryRun?: boolean }) => {\n try {\n const { UpdateCommand } = await import('./commands/update.js')\n const command = new UpdateCommand()\n await command.execute(options)\n } catch (error) {\n logger.error(`Failed to update: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\n// Test command for GitHub integration\nprogram\n .command('test-github')\n .description('Test GitHub integration (Issue #3)')\n .argument('<identifier>', 'Issue number or PR number')\n .option('--no-claude', 'Skip Claude for branch name generation')\n .action(async (identifier: string, options: { claude?: boolean }) => {\n try {\n const { GitHubService } = await import('./lib/GitHubService.js')\n\n logger.info('Testing GitHub Integration\\n')\n\n const service = new GitHubService(options.claude !== undefined ? { useClaude: options.claude } : {})\n\n // Test 1: Input detection\n logger.info('Detecting input type...')\n const detection = await service.detectInputType(identifier)\n logger.info(` Type: ${detection.type}`)\n logger.info(` Number: ${detection.number}`) \n\n if (detection.type === 'unknown') {\n logger.error('Could not detect if input is an issue or PR')\n process.exit(1)\n }\n\n // Test 2: Fetch the issue/PR\n logger.info('Fetching from GitHub...')\n if (detection.type === 'issue') {\n if (!detection.number) {\n throw new Error('Issue number not detected')\n }\n const issue = await service.fetchIssue(detection.number)\n logger.success(` Issue #${issue.number}: ${issue.title}`)\n logger.info(` State: ${issue.state}`)\n logger.info(` Labels: ${issue.labels.join(', ') || 'none'}`)\n logger.info(` URL: ${issue.url}`)\n\n // Test 3: Generate branch name\n \n logger.info('Generating branch name...')\n const branchName = await service.generateBranchName({\n issueNumber: issue.number,\n title: issue.title\n })\n logger.success(` Branch: ${branchName}`)\n\n // Test 4: Extract context\n \n logger.info('Extracting context for Claude...')\n const context = service.extractContext(issue)\n logger.info(` ${context.split('\\n').join('\\n ')}`)\n\n } else {\n if (!detection.number) {\n throw new Error('PR number not detected')\n }\n const pr = await service.fetchPR(detection.number)\n logger.success(` PR #${pr.number}: ${pr.title}`)\n logger.info(` State: ${pr.state}`)\n logger.info(` Branch: ${pr.branch}`)\n logger.info(` Base: ${pr.baseBranch}`)\n logger.info(` URL: ${pr.url}`)\n\n // Test 3: Extract context\n \n logger.info('Extracting context for Claude...')\n const context = service.extractContext(pr)\n logger.info(` ${context.split('\\n').join('\\n ')}`)\n }\n\n \n logger.success('All GitHub integration tests passed!')\n\n } catch (error) {\n logger.error(`Test failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for Claude integration\nprogram\n .command('test-claude')\n .description('Test Claude integration (Issue #10)')\n .option('--detect', 'Test Claude CLI detection')\n .option('--version', 'Get Claude CLI version')\n .option('--branch <title>', 'Test branch name generation with given title')\n .option('--issue <number>', 'Issue number for branch generation', '123')\n .option('--launch <prompt>', 'Launch Claude with a prompt (headless)')\n .option('--interactive', 'Launch Claude interactively (requires --launch)')\n .option('--template <name>', 'Test template loading')\n .action(async (options: {\n detect?: boolean\n version?: boolean\n branch?: string\n issue?: string\n launch?: string\n interactive?: boolean\n template?: 'issue' | 'pr' | 'regular'\n }) => {\n try {\n const { detectClaudeCli, getClaudeVersion, generateBranchName, launchClaude } = await import('./utils/claude.js')\n const { PromptTemplateManager } = await import('./lib/PromptTemplateManager.js')\n const { ClaudeService } = await import('./lib/ClaudeService.js')\n const { ClaudeContextManager } = await import('./lib/ClaudeContextManager.js')\n\n logger.info('Testing Claude Integration\\n')\n\n // Test 1: Detection\n if (options.detect) {\n logger.info('Detecting Claude CLI...')\n const isAvailable = await detectClaudeCli()\n if (isAvailable) {\n logger.success(' Claude CLI is available')\n } else {\n logger.error(' Claude CLI not found')\n }\n }\n\n // Test 2: Version\n if (options.version) {\n logger.info('Getting Claude version...')\n const version = await getClaudeVersion()\n if (version) {\n logger.success(` Version: ${version}`)\n } else {\n logger.error(' Could not get version')\n }\n }\n\n // Test 3: Branch name generation\n if (options.branch) {\n logger.info('Generating branch name...')\n const issueNumber = parseInt(options.issue ?? '123')\n logger.info(` Issue #${issueNumber}: ${options.branch}`)\n const branchName = await generateBranchName(options.branch, issueNumber)\n logger.success(` Generated: ${branchName}`)\n }\n\n // Test 4: Launch Claude\n if (options.launch) {\n logger.info('Launching Claude...')\n logger.info(` Prompt: \"${options.launch}\"`)\n logger.info(` Mode: ${options.interactive ? 'Interactive' : 'Headless'}`)\n\n if (options.interactive) {\n logger.info(' Launching Claude in new terminal...')\n await launchClaude(options.launch, { headless: false })\n logger.info(' (Claude should open in a separate process)')\n } else {\n logger.info(' Waiting for response...')\n const result = await launchClaude(options.launch, { headless: true })\n if (result) {\n logger.success(' Response:')\n logger.info(` ${result.split('\\n').join('\\n ')}`)\n }\n }\n }\n\n // Test 5: Template loading\n if (options.template) {\n logger.info('Loading template...')\n logger.info(` Template: ${options.template}`)\n const manager = new PromptTemplateManager()\n try {\n const content = await manager.loadTemplate(options.template)\n logger.success(' Template loaded successfully')\n logger.info(' First 200 chars:')\n logger.info(` ${content.substring(0, 200).split('\\n').join('\\n ')}...`)\n } catch (error) {\n logger.error(` Failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n\n // Run all tests in sequence when no specific options provided\n if (!options.detect && !options.version && !options.branch && !options.launch && !options.template) {\n logger.info('Running full Claude integration test suite...\\n')\n\n // Test 1: Detection\n logger.info('1. Testing Claude CLI detection...')\n const isAvailable = await detectClaudeCli()\n if (isAvailable) {\n logger.success(' Claude CLI is available')\n } else {\n logger.error(' Claude CLI not found')\n logger.info('\\nSkipping remaining tests since Claude CLI is not available')\n return\n }\n\n // Test 2: Version\n logger.info('\\n2. Getting Claude version...')\n const version = await getClaudeVersion()\n if (version) {\n logger.success(` Version: ${version}`)\n } else {\n logger.error(' Could not get version')\n }\n\n // Test 3: Branch name generation\n logger.info('\\n3. Testing branch name generation...')\n const testIssueNumber = 123\n const testTitle = 'Add user authentication feature'\n logger.info(` Issue #${testIssueNumber}: ${testTitle}`)\n const branchName = await generateBranchName(testTitle, testIssueNumber)\n logger.success(` Generated: ${branchName}`)\n\n // Test 4: Service initialization\n logger.info('\\n4. Testing ClaudeService initialization...')\n new ClaudeService() // Just verify it can be instantiated\n logger.success(' Service initialized')\n\n // Test 5: Context manager\n logger.info('\\n5. Testing ClaudeContextManager...')\n const contextManager = new ClaudeContextManager()\n await contextManager.prepareContext({\n type: 'issue',\n identifier: 123,\n title: 'Test issue',\n workspacePath: process.cwd(),\n port: 3123\n })\n logger.success(' Context prepared')\n\n // Test 6: Template loading\n logger.info('\\n6. Testing template loading...')\n const templateManager = new PromptTemplateManager()\n const templates: Array<'issue' | 'pr' | 'regular'> = ['issue', 'pr', 'regular']\n let templateCount = 0\n for (const template of templates) {\n try {\n await templateManager.loadTemplate(template)\n logger.success(` ${template} template loaded`)\n templateCount++\n } catch {\n logger.warn(` ${template} template not found`)\n }\n }\n logger.info(` Loaded ${templateCount}/${templates.length} templates`)\n\n // Test 7: Launch Claude headless (quick test)\n logger.info('\\n7. Testing Claude launch (headless)...')\n logger.info(' Sending test prompt: \"Say hello\"')\n try {\n const result = await launchClaude('Say hello', { headless: true })\n if (result) {\n logger.success(' Claude responded successfully')\n logger.info(` Response preview: ${result.substring(0, 100)}...`)\n } else {\n logger.warn(' No response received')\n }\n } catch (error) {\n logger.error(` Launch failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n\n logger.info('\\n' + '='.repeat(50))\n logger.success('All Claude integration tests complete!')\n logger.info('Summary: All core Claude features are working correctly')\n }\n\n } catch (error) {\n logger.error(`Test failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for webserver detection\nprogram\n .command('test-webserver')\n .description('Test if a web server is running on a workspace port')\n .argument('<issue-number>', 'Issue number (port will be calculated as 3000 + issue number)', parseInt)\n .option('--kill', 'Kill the web server if detected')\n .action(async (issueNumber: number, options: { kill?: boolean }) => {\n try {\n const { TestWebserverCommand } = await import('./commands/test-webserver.js')\n const command = new TestWebserverCommand()\n await command.execute({ issueNumber, options })\n } catch (error) {\n logger.error(`Test webserver failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for Git integration\nprogram\n .command('test-git')\n .description('Test Git integration - findMainWorktreePath() function (reads .iloom/settings.json)')\n .action(async () => {\n try {\n const { TestGitCommand } = await import('./commands/test-git.js')\n const command = new TestGitCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Test git failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for iTerm2 dual tab functionality\nprogram\n .command('test-tabs')\n .description('Test iTerm2 dual tab functionality - opens two tabs with test commands')\n .action(async () => {\n try {\n const { TestTabsCommand } = await import('./commands/test-tabs.js')\n const command = new TestTabsCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Test tabs failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for worktree prefix configuration\nprogram\n .command('test-prefix')\n .description('Test worktree prefix configuration - preview worktree paths (reads .iloom/settings.json)')\n .action(async () => {\n try {\n const { TestPrefixCommand } = await import('./commands/test-prefix.js')\n const command = new TestPrefixCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Test prefix failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for Neon integration\nprogram\n .command('test-neon')\n .description('Test Neon integration and debug configuration')\n .action(async () => {\n try {\n const { SettingsManager } = await import('./lib/SettingsManager.js')\n const { createNeonProviderFromSettings } = await import('./utils/neon-helpers.js')\n\n logger.info('Testing Neon Integration\\n')\n\n // Test 1: Settings Configuration\n logger.info('1. Settings Configuration:')\n const settingsManager = new SettingsManager()\n const settings = await settingsManager.loadSettings()\n const neonConfig = settings.databaseProviders?.neon\n logger.info(` projectId: ${neonConfig?.projectId ?? '(not configured)'}`)\n logger.info(` parentBranch: ${neonConfig?.parentBranch ?? '(not configured)'}`)\n\n // Test 2: Create provider and test initialization\n logger.info('\\n2. Creating NeonProvider...')\n try {\n const neonProvider = createNeonProviderFromSettings(settings)\n logger.success(' NeonProvider created successfully')\n\n // Test 3: CLI availability\n logger.info('\\n3. Testing Neon CLI availability...')\n const isAvailable = await neonProvider.isCliAvailable()\n if (isAvailable) {\n logger.success(' Neon CLI is available')\n } else {\n logger.error(' Neon CLI not found')\n logger.info(' Install with: npm install -g @neon/cli')\n return\n }\n\n // Test 4: Authentication\n logger.info('\\n4. Testing Neon CLI authentication...')\n const isAuthenticated = await neonProvider.isAuthenticated()\n if (isAuthenticated) {\n logger.success(' Neon CLI is authenticated')\n } else {\n logger.error(' Neon CLI not authenticated')\n logger.info(' Run: neon auth')\n return\n }\n\n // Test 5: List branches (if config is valid)\n if (neonConfig?.projectId) {\n logger.info('\\n5. Testing branch listing...')\n try {\n const branches = await neonProvider.listBranches()\n logger.success(` Found ${branches.length} branches:`)\n for (const branch of branches.slice(0, 5)) { // Show first 5\n logger.info(` - ${branch}`)\n }\n if (branches.length > 5) {\n logger.info(` ... and ${branches.length - 5} more`)\n }\n } catch (error) {\n logger.error(` Failed to list branches: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n } else {\n logger.warn('\\n5. Skipping branch listing (Neon not configured in settings)')\n }\n\n } catch (error) {\n logger.error(` Failed to create NeonProvider: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.message.includes('not configured')) {\n logger.info('\\n This is expected if Neon is not configured.')\n logger.info(' Configure databaseProviders.neon in .iloom/settings.json to test fully.')\n }\n }\n\n logger.info('\\n' + '='.repeat(50))\n logger.success('Neon integration test complete!')\n\n } catch (error) {\n logger.error(`Test failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Add custom help command in order to get preAction to run (update check handled by preAction hook)\nprogram\n .command('help')\n .description('Display help information')\n .argument('[command]', 'Show help for specific command')\n .action(async (command?: string) => {\n // Show help (update check already ran in preAction)\n if (command) {\n // Show help for specific command\n const subCommand = program.commands.find(cmd => cmd.name() === command)\n if (subCommand) {\n subCommand.outputHelp()\n } else {\n logger.error(`Unknown command: ${command}`)\n program.outputHelp()\n }\n } else {\n program.outputHelp()\n }\n\n process.exit(0)\n })\n\n// Parse CLI arguments\ntry {\n await program.parseAsync()\n} catch (error) {\n if (error instanceof Error) {\n logger.error(`Error: ${error.message}`)\n process.exit(1)\n }\n}\n","import { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { dirname, join } from 'path'\n\n/**\n * Package information from package.json\n */\nexport interface PackageInfo {\n name: string\n version: string\n description: string\n [key: string]: unknown\n}\n\n/**\n * Get package.json information\n *\n * @param scriptPath - Optional path to use for finding package.json (defaults to current file location)\n * @returns Parsed package.json contents\n * @throws Error if package.json cannot be read or parsed\n */\nexport function getPackageInfo(scriptPath?: string): PackageInfo {\n try {\n // Determine the base path to use\n let basePath: string\n if (scriptPath) {\n basePath = scriptPath\n } else {\n // Use import.meta.url to get the current file path\n const __filename = fileURLToPath(import.meta.url)\n basePath = __filename\n }\n\n // Navigate from current file to package.json\n // The compiled CLI runs from dist/cli.js, so we need dist/../package.json (one level up)\n const __dirname = dirname(basePath)\n const packageJsonPath = join(__dirname, '..', 'package.json')\n\n // Read and parse package.json\n const packageJsonContent = readFileSync(packageJsonPath, 'utf8')\n const packageJson = JSON.parse(packageJsonContent) as PackageInfo\n\n return packageJson\n } catch (error) {\n throw new Error(\n `Failed to read package.json: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,SAAkB,cAAc;;;ACAzC,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AAmBvB,SAAS,eAAe,YAAkC;AAC/D,MAAI;AAEF,QAAI;AACJ,QAAI,YAAY;AACd,iBAAW;AAAA,IACb,OAAO;AAEL,YAAMA,cAAa,cAAc,YAAY,GAAG;AAChD,iBAAWA;AAAA,IACb;AAIA,UAAM,YAAY,QAAQ,QAAQ;AAClC,UAAM,kBAAkB,KAAK,WAAW,MAAM,cAAc;AAG5D,UAAM,qBAAqB,aAAa,iBAAiB,MAAM;AAC/D,UAAMC,eAAc,KAAK,MAAM,kBAAkB;AAEjD,WAAOA;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IAC1F;AAAA,EACF;AACF;;;AD1CA,SAAS,iBAAAC,sBAAqB;AAG9B,IAAM,aAAaA,eAAc,YAAY,GAAG;AAChD,IAAM,cAAc,eAAe,UAAU;AAE7C,QACG,KAAK,OAAO,EACZ,YAAY,YAAY,WAAW,EACnC,QAAQ,YAAY,OAAO,EAC3B,OAAO,WAAW,6DAA6D,EAC/E,OAAO,gBAAgB,kDAAkD,EACzE,OAAO,qBAAqB,kGAAkG,EAC9H,mBAAmB,EACnB,KAAK,aAAa,OAAO,gBAAgB;AAExC,QAAM,UAAU,YAAY,KAAK;AAEjC,QAAM,WAAW,QAAQ,IAAI,gBAAgB;AAC7C,QAAM,eAAe,QAAQ,UAAU,SAAY,QAAQ,QAAQ;AACnE,SAAO,SAAS,YAAY;AAG5B,MAAI,QAAQ,YAAY;AACtB,UAAMC,mBAAkB,IAAI,gBAAgB;AAC5C,IAAAA,iBAAgB,sBAAsB;AACtC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACF,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,+BAA4B;AAC1E,UAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,qCAAkC;AAGpF,UAAM,gBAAgB,yBAAyB,UAAU;AAGzD,UAAM,qBAAqB,YAAY,SAAS,YAAY,MAAM,aAAa;AAAA,EACjF,QAAQ;AAAA,EAER;AAGA,MAAI;AACF,UAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,wCAAmC;AACrF,UAAM,mBAAmB,IAAI,yBAAyB;AACtD,UAAM,iBAAiB,wBAAwB;AAAA,EACjD,SAAS,OAAO;AAEd,WAAO,MAAM,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,SAAS,EAAE;AAAA,EACjG;AAGA,QAAM,2BAA2B,WAAW;AAC9C,CAAC;AAGH,eAAe,2BAA2B,SAAiC;AAhE3E;AAiEE,QAAM,cAAc,QAAQ,KAAK,CAAC,KAAK;AAGvC,QAAM,iBAAiB,CAAC,QAAQ,QAAQ,UAAU,YAAY;AAE9D,MAAI,eAAe,SAAS,WAAW,GAAG;AACxC;AAAA,EACF;AAIA,MAAI;AACF,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,+BAA0B;AACnE,UAAM,kBAAkB,IAAI,gBAAgB;AAI5C,UAAM,WAAW,MAAM,gBAAgB,aAAa;AAGpD,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,sBAAmB;AAC/D,UAAM,kBAAkB,MAAM,mBAAmB;AAEjD,QAAI,mBAAmB,GAAC,oBAAS,oBAAT,mBAA0B,WAA1B,mBAAkC,SAAQ;AAGhE,YAAM,iCAAiC;AACvC;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC/F,WAAO,KAAK,0DAA0D;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAOA,eAAe,mCAAkD;AA1GjE;AA2GE,SAAO,KAAK,oEAAoE;AAChF,SAAO,KAAK,EAAE;AACd,SAAO,KAAK,wEAAwE;AACpF,SAAO,KAAK,+DAA+D;AAC3E,SAAO,KAAK,EAAE;AAGd,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,sBAAmB;AAC5D,QAAM,gBAAgB,yCAAyC;AAE/D,SAAO,KAAK,EAAE;AAEd,MAAI;AAEF,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAoB;AACzD,UAAM,cAAc,IAAI,YAAY;AAGpC,UAAM,uBAAuB;AAE7B,UAAM,YAAY,QAAQ,oBAAoB;AAE9C,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,kEAAkE;AAC9E,WAAO,KAAK,EAAE;AAGd,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,+BAA0B;AACnE,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,WAAW,MAAM,gBAAgB,aAAa;AAEpD,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,sBAAmB;AAC/D,UAAM,kBAAkB,MAAM,mBAAmB;AAGjD,QAAI,mBAAmB,GAAC,oBAAS,oBAAT,mBAA0B,WAA1B,mBAAkC,SAAQ;AAChE,aAAO,MAAM,kEAAkE;AAC/E,aAAO,KAAK,wEAAwE;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAIA;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,MAAM,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACvG,WAAO,KAAK,0DAA0D;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,IAAM,kBAAkB,IAAI,gBAAgB;AAC5C,gBAAgB,KAAK;AAErB,QACG,QAAQ,OAAO,EACf,MAAM,QAAQ,EACd,MAAM,IAAI,EACV,YAAY,2CAA2C,EACvD,SAAS,gBAAgB,kFAAkF,EAC3G,OAAO,YAAY,2CAA2C,EAC9D,OAAO,eAAe,4BAA4B,EAClD,OAAO,UAAU,+BAA+B,EAChD,OAAO,aAAa,gBAAgB,EACpC,OAAO,gBAAgB,+CAA+C,EACtE,OAAO,mBAAmB,oBAAoB,EAC9C,OAAO,cAAc,qDAAqD,EAC1E,OAAO,iBAAiB,kBAAkB,EAC1C;AAAA,EACC,IAAI,OAAO,qBAAqB,0BAA0B,EACvD,QAAQ,CAAC,WAAW,YAAY,mBAAmB,CAAC,EACpD,QAAQ,SAAS;AACtB,EACC,OAAO,OAAO,YAAgC,YAA0B;AACvE,MAAI;AACF,QAAI,kBAAkB;AAGtB,QAAI,CAAC,iBAAiB;AACpB,YAAM,EAAE,YAAY,IAAI,MAAM,OAAO,sBAAmB;AACxD,wBAAkB,MAAM,YAAY,wDAAwD;AAG5F,UAAI,EAAC,mDAAiB,SAAQ;AAC5B,eAAO,MAAM,wBAAwB;AACrC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,qBAAqB;AAC3D,UAAM,UAAU,IAAI,aAAa;AACjC,UAAM,QAAQ,QAAQ,EAAE,YAAY,iBAAiB,QAAQ,CAAC;AAAA,EAChE,SAAS,OAAO;AACd,WAAO,MAAM,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACrG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,WAAW,EACnB,MAAM,GAAG,EACT,YAAY,4DAA4D,EACxE,SAAS,iBAAiB,kEAAkE,EAC5F,OAAO,OAAO,gBAAwB;AACrC,MAAI;AACF,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,yBAAyB;AAClE,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,cAAc,MAAM,QAAQ,QAAQ;AAAA,MACxC;AAAA,MACA,SAAS,CAAC;AAAA,IACZ,CAAC;AACD,WAAO,QAAQ,UAAU,WAAW,uBAAuB;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,WAAO,MAAM,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAClG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,MAAM,GAAG,EACT,YAAY,oDAAoD,EAChE,SAAS,iBAAiB,iEAAiE,EAC3F,OAAO,OAAO,gBAAwB;AACrC,MAAI;AACF,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,wBAAwB;AACjE,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,cAAc,MAAM,QAAQ,QAAQ;AAAA,MACxC;AAAA,MACA,SAAS,CAAC;AAAA,IACZ,CAAC;AACD,WAAO,QAAQ,gCAAgC,WAAW,0BAA0B;AACpF,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,WAAO,MAAM,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACrG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,kDAAkD,EAC9D,SAAS,kBAAkB,kCAAkC,QAAQ,EACrE,OAAO,gBAAgB,6BAA6B,EACpD,OAAO,uBAAuB,oDAAoD,EAClF,OAAO,OAAO,aAAqB,YAAoD;AACtF,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,uBAAuB;AAC/D,UAAM,UAAU,IAAI,eAAe;AACnC,UAAM,QAAQ,QAAQ;AAAA,MACpB;AAAA,MACA,SAAS;AAAA,QACP,WAAW,QAAQ,YAAY;AAAA,QAC/B,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACjD;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,4CAA4C,WAAW,EAAE;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,WAAO,MAAM,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACnG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,MAAM,IAAI,EACV,YAAY,kCAAkC,EAC9C,SAAS,gBAAgB,oEAAoE,EAC7F,OAAO,eAAe,2BAA2B,EACjD,OAAO,iBAAiB,mCAAmC,EAC3D,OAAO,iBAAiB,4BAA4B,UAAU,EAC9D,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAgC,YAA2B;AACxE,MAAI;AACF,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAsB;AAC7D,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,QAAQ,QAAQ,EAAE,YAAY,QAAQ,CAAC;AAAA,EAC/C,SAAS,OAAO;AACd,WAAO,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACtG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,wEAAwE,EACpF,OAAO,eAAe,2BAA2B,EACjD,OAAO,iBAAiB,mCAAmC,EAC3D,OAAO,OAAO,YAAmD;AAChE,MAAI;AACF,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAsB;AAC7D,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,QAAQ,QAAQ,OAAO;AAAA,EAC/B,SAAS,OAAO;AACd,WAAO,MAAM,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC5F,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,MAAM,QAAQ,EACd,YAAY,oDAAoD,EAChE;AAAA,EACC,IAAI,OAAO,qBAAqB,0BAA0B,EACvD,QAAQ,CAAC,WAAW,YAAY,mBAAmB,CAAC,EACpD,QAAQ,SAAS;AACtB,EACC,OAAO,OAAO,YAAkE;AAC/E,MAAI;AACF,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAsB;AAC7D,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,QAAQ,QAAQ,QAAQ,WAAW,SAAS;AAAA,EACpD,SAAS,OAAO;AACd,WAAO,MAAM,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAClG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,SAAS,gBAAgB,oEAAoE,EAC7F,mBAAmB,EACnB,OAAO,OAAO,YAAqB,UAAoC,YAAsB;AAC5F,MAAI;AAEF,UAAM,QAAO,mCAAS,QAAO,QAAQ,KAAK,MAAM,aAAa,IAAI,CAAC,IAAI,CAAC;AAEvE,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAoB;AACzD,UAAM,MAAM,IAAI,YAAY;AAC5B,UAAM,QAAQ,aAAa,EAAE,YAAY,KAAK,IAAI,EAAE,KAAK;AACzD,UAAM,IAAI,QAAQ,KAAK;AAAA,EACzB,SAAS,OAAO;AACd,WAAO,MAAM,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,2CAA2C,EACvD,SAAS,gBAAgB,oEAAoE,EAC7F,mBAAmB,EACnB,OAAO,OAAO,YAAqB,UAAoC,YAAsB;AAC5F,MAAI;AAEF,UAAM,QAAO,mCAAS,QAAO,QAAQ,KAAK,MAAM,aAAa,IAAI,CAAC,IAAI,CAAC;AAEvE,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,mBAAmB;AACvD,UAAM,MAAM,IAAI,WAAW;AAC3B,UAAM,QAAQ,aAAa,EAAE,YAAY,KAAK,IAAI,EAAE,KAAK;AACzD,UAAM,IAAI,QAAQ,KAAK;AAAA,EACzB,SAAS,OAAO;AACd,WAAO,MAAM,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACzF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,mBAAmB,EAC/B,SAAS,gBAAgB,wDAAwD,EACjF,OAAO,cAAc,oBAAoB,EACzC,OAAO,aAAa,iDAAiD,EACrE,OAAO,wBAAwB,2BAA2B,QAAQ,EAClE,OAAO,eAAe,sCAAsC,EAC5D,OAAO,aAAa,0CAA0C,EAC9D,OAAO,OAAO,YAAqB,YAA6B;AAC/D,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,uBAAuB;AAC/D,UAAM,UAAU,IAAI,eAAe;AACnC,UAAM,QAA0D;AAAA,MAC9D,SAAS,WAAW,CAAC;AAAA,IACvB;AACA,QAAI,YAAY;AACd,YAAM,aAAa;AAAA,IACrB;AACA,UAAM,QAAQ,QAAQ,KAAK;AAAA,EAC7B,SAAS,OAAO;AACd,WAAO,MAAM,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACvG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAgC;AAC7C,MAAI;AACF,UAAM,UAAU,IAAI,mBAAmB;AACvC,UAAM,YAAY,MAAM,QAAQ,cAAc,EAAE,WAAW,KAAK,CAAC;AAEjE,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAC9C;AAAA,IACF;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO,KAAK,oBAAoB;AAChC;AAAA,IACF;AAEA,WAAO,KAAK,oBAAoB;AAChC,eAAW,YAAY,WAAW;AAChC,YAAM,YAAY,QAAQ,eAAe,QAAQ;AACjD,aAAO,KAAK,KAAK,UAAU,KAAK,EAAE;AAClC,aAAO,KAAK,aAAa,UAAU,IAAI,EAAE;AACzC,aAAO,KAAK,eAAe,UAAU,MAAM,EAAE;AAAA,IAC/C;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACpG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,MAAM,EACd,MAAM,QAAQ,EACd,YAAY,6DAA6D,EACzE,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAoB;AACzD,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,QAAQ,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,MAAM,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAChG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,YAAY,EACpB,YAAY,gEAAgE,EAC5E,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,0BAA0B;AACrE,UAAM,UAAU,IAAI,kBAAkB;AACtC,UAAM,QAAQ,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,MAAM,6CAA6C,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACpH,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,wCAAwC,EACpD,OAAO,aAAa,mDAAmD,EACvE,OAAO,OAAO,YAAkC;AAC/C,MAAI;AACF,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAsB;AAC7D,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,QAAQ,QAAQ,OAAO;AAAA,EAC/B,SAAS,OAAO;AACd,WAAO,MAAM,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC5F,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,aAAa,EACrB,YAAY,oCAAoC,EAChD,SAAS,gBAAgB,2BAA2B,EACpD,OAAO,eAAe,wCAAwC,EAC9D,OAAO,OAAO,YAAoB,YAAkC;AACnE,MAAI;AACF,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,6BAAwB;AAE/D,WAAO,KAAK,8BAA8B;AAE1C,UAAM,UAAU,IAAI,cAAc,QAAQ,WAAW,SAAY,EAAE,WAAW,QAAQ,OAAO,IAAI,CAAC,CAAC;AAGnG,WAAO,KAAK,yBAAyB;AACrC,UAAM,YAAY,MAAM,QAAQ,gBAAgB,UAAU;AAC1D,WAAO,KAAK,YAAY,UAAU,IAAI,EAAE;AACxC,WAAO,KAAK,cAAc,UAAU,MAAM,EAAE;AAE5C,QAAI,UAAU,SAAS,WAAW;AAChC,aAAO,MAAM,6CAA6C;AAC1D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,WAAO,KAAK,yBAAyB;AACrC,QAAI,UAAU,SAAS,SAAS;AAC9B,UAAI,CAAC,UAAU,QAAQ;AACrB,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AACA,YAAM,QAAQ,MAAM,QAAQ,WAAW,UAAU,MAAM;AACvD,aAAO,QAAQ,aAAa,MAAM,MAAM,KAAK,MAAM,KAAK,EAAE;AAC1D,aAAO,KAAK,aAAa,MAAM,KAAK,EAAE;AACtC,aAAO,KAAK,cAAc,MAAM,OAAO,KAAK,IAAI,KAAK,MAAM,EAAE;AAC7D,aAAO,KAAK,WAAW,MAAM,GAAG,EAAE;AAIlC,aAAO,KAAK,2BAA2B;AACvC,YAAM,aAAa,MAAM,QAAQ,mBAAmB;AAAA,QAClD,aAAa,MAAM;AAAA,QACnB,OAAO,MAAM;AAAA,MACf,CAAC;AACD,aAAO,QAAQ,cAAc,UAAU,EAAE;AAIzC,aAAO,KAAK,kCAAkC;AAC9C,YAAM,UAAU,QAAQ,eAAe,KAAK;AAC5C,aAAO,KAAK,MAAM,QAAQ,MAAM,IAAI,EAAE,KAAK,OAAO,CAAC,EAAE;AAAA,IAEvD,OAAO;AACL,UAAI,CAAC,UAAU,QAAQ;AACrB,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AACA,YAAM,KAAK,MAAM,QAAQ,QAAQ,UAAU,MAAM;AACjD,aAAO,QAAQ,UAAU,GAAG,MAAM,KAAK,GAAG,KAAK,EAAE;AACjD,aAAO,KAAK,aAAa,GAAG,KAAK,EAAE;AACnC,aAAO,KAAK,cAAc,GAAG,MAAM,EAAE;AACrC,aAAO,KAAK,YAAY,GAAG,UAAU,EAAE;AACvC,aAAO,KAAK,WAAW,GAAG,GAAG,EAAE;AAI/B,aAAO,KAAK,kCAAkC;AAC9C,YAAM,UAAU,QAAQ,eAAe,EAAE;AACzC,aAAO,KAAK,MAAM,QAAQ,MAAM,IAAI,EAAE,KAAK,OAAO,CAAC,EAAE;AAAA,IACvD;AAGA,WAAO,QAAQ,sCAAsC;AAAA,EAEvD,SAAS,OAAO;AACd,WAAO,MAAM,gBAAgB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACvF,QAAI,iBAAiB,SAAS,MAAM,OAAO;AACzC,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,aAAa,EACrB,YAAY,qCAAqC,EACjD,OAAO,YAAY,2BAA2B,EAC9C,OAAO,aAAa,wBAAwB,EAC5C,OAAO,oBAAoB,8CAA8C,EACzE,OAAO,oBAAoB,sCAAsC,KAAK,EACtE,OAAO,qBAAqB,wCAAwC,EACpE,OAAO,iBAAiB,iDAAiD,EACzE,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,YAQT;AACJ,MAAI;AACF,UAAM,EAAE,iBAAiB,kBAAkB,oBAAoB,aAAa,IAAI,MAAM,OAAO,sBAAmB;AAChH,UAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,qCAAgC;AAC/E,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,6BAAwB;AAC/D,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,oCAA+B;AAE7E,WAAO,KAAK,8BAA8B;AAG1C,QAAI,QAAQ,QAAQ;AAClB,aAAO,KAAK,yBAAyB;AACrC,YAAM,cAAc,MAAM,gBAAgB;AAC1C,UAAI,aAAa;AACf,eAAO,QAAQ,4BAA4B;AAAA,MAC7C,OAAO;AACL,eAAO,MAAM,yBAAyB;AAAA,MACxC;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS;AACnB,aAAO,KAAK,2BAA2B;AACvC,YAAM,UAAU,MAAM,iBAAiB;AACvC,UAAI,SAAS;AACX,eAAO,QAAQ,eAAe,OAAO,EAAE;AAAA,MACzC,OAAO;AACL,eAAO,MAAM,0BAA0B;AAAA,MACzC;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ;AAClB,aAAO,KAAK,2BAA2B;AACvC,YAAM,cAAc,SAAS,QAAQ,SAAS,KAAK;AACnD,aAAO,KAAK,aAAa,WAAW,KAAK,QAAQ,MAAM,EAAE;AACzD,YAAM,aAAa,MAAM,mBAAmB,QAAQ,QAAQ,WAAW;AACvE,aAAO,QAAQ,iBAAiB,UAAU,EAAE;AAAA,IAC9C;AAGA,QAAI,QAAQ,QAAQ;AAClB,aAAO,KAAK,qBAAqB;AACjC,aAAO,KAAK,eAAe,QAAQ,MAAM,GAAG;AAC5C,aAAO,KAAK,YAAY,QAAQ,cAAc,gBAAgB,UAAU,EAAE;AAE1E,UAAI,QAAQ,aAAa;AACvB,eAAO,KAAK,wCAAwC;AACpD,cAAM,aAAa,QAAQ,QAAQ,EAAE,UAAU,MAAM,CAAC;AACtD,eAAO,KAAK,+CAA+C;AAAA,MAC7D,OAAO;AACL,eAAO,KAAK,4BAA4B;AACxC,cAAM,SAAS,MAAM,aAAa,QAAQ,QAAQ,EAAE,UAAU,KAAK,CAAC;AACpE,YAAI,QAAQ;AACV,iBAAO,QAAQ,cAAc;AAC7B,iBAAO,KAAK,MAAM,OAAO,MAAM,IAAI,EAAE,KAAK,OAAO,CAAC,EAAE;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,UAAU;AACpB,aAAO,KAAK,qBAAqB;AACjC,aAAO,KAAK,gBAAgB,QAAQ,QAAQ,EAAE;AAC9C,YAAM,UAAU,IAAI,sBAAsB;AAC1C,UAAI;AACF,cAAM,UAAU,MAAM,QAAQ,aAAa,QAAQ,QAAQ;AAC3D,eAAO,QAAQ,iCAAiC;AAChD,eAAO,KAAK,qBAAqB;AACjC,eAAO,KAAK,MAAM,QAAQ,UAAU,GAAG,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,OAAO,CAAC,KAAK;AAAA,MAC5E,SAAS,OAAO;AACd,eAAO,MAAM,cAAc,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,MACvF;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,WAAW,CAAC,QAAQ,UAAU,CAAC,QAAQ,UAAU,CAAC,QAAQ,UAAU;AAClG,aAAO,KAAK,iDAAiD;AAG7D,aAAO,KAAK,oCAAoC;AAChD,YAAM,cAAc,MAAM,gBAAgB;AAC1C,UAAI,aAAa;AACf,eAAO,QAAQ,4BAA4B;AAAA,MAC7C,OAAO;AACL,eAAO,MAAM,yBAAyB;AACtC,eAAO,KAAK,8DAA8D;AAC1E;AAAA,MACF;AAGA,aAAO,KAAK,gCAAgC;AAC5C,YAAM,UAAU,MAAM,iBAAiB;AACvC,UAAI,SAAS;AACX,eAAO,QAAQ,eAAe,OAAO,EAAE;AAAA,MACzC,OAAO;AACL,eAAO,MAAM,0BAA0B;AAAA,MACzC;AAGA,aAAO,KAAK,wCAAwC;AACpD,YAAM,kBAAkB;AACxB,YAAM,YAAY;AAClB,aAAO,KAAK,aAAa,eAAe,KAAK,SAAS,EAAE;AACxD,YAAM,aAAa,MAAM,mBAAmB,WAAW,eAAe;AACtE,aAAO,QAAQ,iBAAiB,UAAU,EAAE;AAG5C,aAAO,KAAK,8CAA8C;AAC1D,UAAI,cAAc;AAClB,aAAO,QAAQ,wBAAwB;AAGvC,aAAO,KAAK,sCAAsC;AAClD,YAAM,iBAAiB,IAAI,qBAAqB;AAChD,YAAM,eAAe,eAAe;AAAA,QAClC,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,eAAe,QAAQ,IAAI;AAAA,QAC3B,MAAM;AAAA,MACR,CAAC;AACD,aAAO,QAAQ,qBAAqB;AAGpC,aAAO,KAAK,kCAAkC;AAC9C,YAAM,kBAAkB,IAAI,sBAAsB;AAClD,YAAM,YAA+C,CAAC,SAAS,MAAM,SAAS;AAC9E,UAAI,gBAAgB;AACpB,iBAAW,YAAY,WAAW;AAChC,YAAI;AACF,gBAAM,gBAAgB,aAAa,QAAQ;AAC3C,iBAAO,QAAQ,MAAM,QAAQ,kBAAkB;AAC/C;AAAA,QACF,QAAQ;AACN,iBAAO,KAAK,MAAM,QAAQ,qBAAqB;AAAA,QACjD;AAAA,MACF;AACA,aAAO,KAAK,aAAa,aAAa,IAAI,UAAU,MAAM,YAAY;AAGtE,aAAO,KAAK,0CAA0C;AACtD,aAAO,KAAK,qCAAqC;AACjD,UAAI;AACF,cAAM,SAAS,MAAM,aAAa,aAAa,EAAE,UAAU,KAAK,CAAC;AACjE,YAAI,QAAQ;AACV,iBAAO,QAAQ,kCAAkC;AACjD,iBAAO,KAAK,wBAAwB,OAAO,UAAU,GAAG,GAAG,CAAC,KAAK;AAAA,QACnE,OAAO;AACL,iBAAO,KAAK,yBAAyB;AAAA,QACvC;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,MAC9F;AAEA,aAAO,KAAK,OAAO,IAAI,OAAO,EAAE,CAAC;AACjC,aAAO,QAAQ,wCAAwC;AACvD,aAAO,KAAK,yDAAyD;AAAA,IACvE;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,MAAM,gBAAgB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACvF,QAAI,iBAAiB,SAAS,MAAM,OAAO;AACzC,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,gBAAgB,EACxB,YAAY,qDAAqD,EACjE,SAAS,kBAAkB,iEAAiE,QAAQ,EACpG,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,aAAqB,YAAgC;AAClE,MAAI;AACF,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,8BAA8B;AAC5E,UAAM,UAAU,IAAI,qBAAqB;AACzC,UAAM,QAAQ,QAAQ,EAAE,aAAa,QAAQ,CAAC;AAAA,EAChD,SAAS,OAAO;AACd,WAAO,MAAM,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACjG,QAAI,iBAAiB,SAAS,MAAM,OAAO;AACzC,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,UAAU,EAClB,YAAY,qFAAqF,EACjG,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,wBAAwB;AAChE,UAAM,UAAU,IAAI,eAAe;AACnC,UAAM,QAAQ,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,MAAM,oBAAoB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC3F,QAAI,iBAAiB,SAAS,MAAM,OAAO;AACzC,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,WAAW,EACnB,YAAY,wEAAwE,EACpF,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,yBAAyB;AAClE,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,QAAQ,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,MAAM,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC5F,QAAI,iBAAiB,SAAS,MAAM,OAAO;AACzC,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,aAAa,EACrB,YAAY,0FAA0F,EACtG,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,2BAA2B;AACtE,UAAM,UAAU,IAAI,kBAAkB;AACtC,UAAM,QAAQ,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,MAAM,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC9F,QAAI,iBAAiB,SAAS,MAAM,OAAO;AACzC,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,WAAW,EACnB,YAAY,+CAA+C,EAC3D,OAAO,YAAY;AArzBtB;AAszBI,MAAI;AACF,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,+BAA0B;AACnE,UAAM,EAAE,+BAA+B,IAAI,MAAM,OAAO,4BAAyB;AAEjF,WAAO,KAAK,4BAA4B;AAGxC,WAAO,KAAK,4BAA4B;AACxC,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,WAAW,MAAM,gBAAgB,aAAa;AACpD,UAAM,cAAa,cAAS,sBAAT,mBAA4B;AAC/C,WAAO,KAAK,kBAAiB,yCAAY,cAAa,kBAAkB,EAAE;AAC1E,WAAO,KAAK,qBAAoB,yCAAY,iBAAgB,kBAAkB,EAAE;AAGhF,WAAO,KAAK,+BAA+B;AAC3C,QAAI;AACF,YAAM,eAAe,+BAA+B,QAAQ;AAC5D,aAAO,QAAQ,sCAAsC;AAGrD,aAAO,KAAK,uCAAuC;AACnD,YAAM,cAAc,MAAM,aAAa,eAAe;AACtD,UAAI,aAAa;AACf,eAAO,QAAQ,0BAA0B;AAAA,MAC3C,OAAO;AACL,eAAO,MAAM,uBAAuB;AACpC,eAAO,KAAK,2CAA2C;AACvD;AAAA,MACF;AAGA,aAAO,KAAK,yCAAyC;AACrD,YAAM,kBAAkB,MAAM,aAAa,gBAAgB;AAC3D,UAAI,iBAAiB;AACnB,eAAO,QAAQ,8BAA8B;AAAA,MAC/C,OAAO;AACL,eAAO,MAAM,+BAA+B;AAC5C,eAAO,KAAK,mBAAmB;AAC/B;AAAA,MACF;AAGA,UAAI,yCAAY,WAAW;AACzB,eAAO,KAAK,gCAAgC;AAC5C,YAAI;AACF,gBAAM,WAAW,MAAM,aAAa,aAAa;AACjD,iBAAO,QAAQ,YAAY,SAAS,MAAM,YAAY;AACtD,qBAAW,UAAU,SAAS,MAAM,GAAG,CAAC,GAAG;AACzC,mBAAO,KAAK,UAAU,MAAM,EAAE;AAAA,UAChC;AACA,cAAI,SAAS,SAAS,GAAG;AACvB,mBAAO,KAAK,gBAAgB,SAAS,SAAS,CAAC,OAAO;AAAA,UACxD;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,QACxG;AAAA,MACF,OAAO;AACL,eAAO,KAAK,gEAAgE;AAAA,MAC9E;AAAA,IAEF,SAAS,OAAO;AACd,aAAO,MAAM,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC5G,UAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,gBAAgB,GAAG;AACtE,eAAO,KAAK,kDAAkD;AAC9D,eAAO,KAAK,4EAA4E;AAAA,MAC1F;AAAA,IACF;AAEA,WAAO,KAAK,OAAO,IAAI,OAAO,EAAE,CAAC;AACjC,WAAO,QAAQ,iCAAiC;AAAA,EAElD,SAAS,OAAO;AACd,WAAO,MAAM,gBAAgB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AACvF,QAAI,iBAAiB,SAAS,MAAM,OAAO;AACzC,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,MAAM,EACd,YAAY,0BAA0B,EACtC,SAAS,aAAa,gCAAgC,EACtD,OAAO,OAAO,YAAqB;AAElC,MAAI,SAAS;AAEX,UAAM,aAAa,QAAQ,SAAS,KAAK,SAAO,IAAI,KAAK,MAAM,OAAO;AACtE,QAAI,YAAY;AACd,iBAAW,WAAW;AAAA,IACxB,OAAO;AACL,aAAO,MAAM,oBAAoB,OAAO,EAAE;AAC1C,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,OAAO;AACL,YAAQ,WAAW;AAAA,EACrB;AAEA,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGH,IAAI;AACF,QAAM,QAAQ,WAAW;AAC3B,SAAS,OAAO;AACd,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM,UAAU,MAAM,OAAO,EAAE;AACtC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":["__filename","packageJson","fileURLToPath","shellCompletion"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/utils/package-info.ts"],"sourcesContent":["import { program, Command, Option } from 'commander'\nimport { logger } from './utils/logger.js'\nimport { GitWorktreeManager } from './lib/GitWorktreeManager.js'\nimport { ShellCompletion } from './lib/ShellCompletion.js'\nimport type { StartOptions, CleanupOptions, FinishOptions } from './types/index.js'\nimport { getPackageInfo } from './utils/package-info.js'\nimport { fileURLToPath } from 'url'\n\n// Get package.json for version\nconst __filename = fileURLToPath(import.meta.url)\nconst packageJson = getPackageInfo(__filename)\n\nprogram\n .name('iloom')\n .description(packageJson.description)\n .version(packageJson.version)\n .option('--debug', 'Enable debug output (default: based on ILOOM_DEBUG env var)')\n .option('--completion', 'Output shell completion script for current shell')\n .option('--set <key=value>', 'Override any setting using dot notation (repeatable, e.g., --set workflows.issue.startIde=false)')\n .allowUnknownOption() // Allow --set to be used multiple times\n .hook('preAction', async (thisCommand) => {\n // Set debug mode based on flag or environment variable\n const options = thisCommand.opts()\n // Default to environment variable value, then false if not set\n const envDebug = process.env.ILOOM_DEBUG === 'true'\n const debugEnabled = options.debug !== undefined ? options.debug : envDebug\n logger.setDebug(debugEnabled)\n\n // Handle --completion flag\n if (options.completion) {\n const shellCompletion = new ShellCompletion()\n shellCompletion.printCompletionScript()\n process.exit(0)\n }\n\n // Check for updates before command execution for global installations\n try {\n const { checkAndNotifyUpdate } = await import('./utils/update-notifier.js')\n const { detectInstallationMethod } = await import('./utils/installation-detector.js')\n\n // Detect installation method\n const installMethod = detectInstallationMethod(__filename)\n\n // Check and notify (non-blocking, all errors handled internally)\n await checkAndNotifyUpdate(packageJson.version, packageJson.name, installMethod)\n } catch {\n // Silently fail - update check should never break user experience\n }\n\n // Migrate legacy .hatchbox settings to .iloom (BEFORE settings validation)\n try {\n const { SettingsMigrationManager } = await import('./lib/SettingsMigrationManager.js')\n const migrationManager = new SettingsMigrationManager()\n await migrationManager.migrateSettingsIfNeeded()\n } catch (error) {\n // Log warning but don't fail - migration is best-effort\n logger.debug(`Settings migration failed: ${error instanceof Error ? error.message : 'Unknown'}`)\n }\n\n // Validate settings for all commands\n await validateSettingsForCommand(thisCommand)\n })\n\n// Helper function to validate settings at startup\nasync function validateSettingsForCommand(command: Command): Promise<void> {\n const commandName = command.args[0] ?? ''\n\n // Tier 1: Commands that bypass ALL validation\n const bypassCommands = ['help', 'init', 'update', 'contribute']\n\n if (bypassCommands.includes(commandName)) {\n return\n }\n\n // Tier 2: All other commands require FULL validation (settings + multi-remote)\n // Commands: start, add-issue, enhance, finish, list, cleanup, open, run, etc.\n try {\n const { SettingsManager } = await import('./lib/SettingsManager.js')\n const settingsManager = new SettingsManager()\n\n // Attempt to load settings - this will throw on validation errors\n // Missing file is OK (returns {})\n const settings = await settingsManager.loadSettings()\n\n // Check for multi-remote configuration requirement\n const { hasMultipleRemotes } = await import('./utils/remote.js')\n const multipleRemotes = await hasMultipleRemotes()\n\n if (multipleRemotes && !settings.issueManagement?.github?.remote) {\n // Auto-launch init command to configure remotes\n // After init completes, function returns and Commander.js continues with original command\n await autoLaunchInitForMultipleRemotes()\n return // Settings now configured, let preAction complete\n }\n } catch (error) {\n logger.error(`Configuration error: ${error instanceof Error ? error.message : 'Unknown error'}`)\n logger.info('Please fix your .iloom/settings.json file and try again.')\n process.exit(1)\n }\n}\n\n/**\n * Auto-launch init command when multiple remotes are detected but not configured\n * Shows message, waits for keypress, launches interactive Claude configuration,\n * then returns to let Commander.js continue with the original command\n */\nasync function autoLaunchInitForMultipleRemotes(): Promise<void> {\n logger.info('Multiple git remotes detected, but no GitHub remote is configured.')\n logger.info('')\n logger.info('iloom will now launch an interactive configuration session with Claude')\n logger.info('to help you select which remote to use for GitHub operations.')\n logger.info('')\n\n // Wait for keypress to continue\n const { waitForKeypress } = await import('./utils/prompt.js')\n await waitForKeypress('Press any key to start configuration...')\n\n logger.info('')\n\n try {\n // Launch init command with focused initial message\n const { InitCommand } = await import('./commands/init.js')\n const initCommand = new InitCommand()\n\n // Custom initial message that focuses on multi-remote configuration\n const customInitialMessage = 'Help me configure which git remote iloom should use for GitHub operations. I have multiple remotes and need to select the correct one.'\n\n await initCommand.execute(customInitialMessage)\n\n logger.info('')\n logger.info('Configuration complete! Continuing with your original command...')\n logger.info('')\n\n // Re-validate settings after init to ensure multi-remote is now configured\n const { SettingsManager } = await import('./lib/SettingsManager.js')\n const settingsManager = new SettingsManager()\n const settings = await settingsManager.loadSettings()\n\n const { hasMultipleRemotes } = await import('./utils/remote.js')\n const multipleRemotes = await hasMultipleRemotes()\n\n // Verify the issue is resolved\n if (multipleRemotes && !settings.issueManagement?.github?.remote) {\n logger.error('Configuration incomplete: GitHub remote is still not configured.')\n logger.info('Please run \"iloom init\" again and configure the GitHub remote setting.')\n process.exit(1)\n }\n\n // Configuration verified - simply return to let Commander.js continue\n // with the original command (preAction hook will complete normally)\n return\n\n } catch (error) {\n logger.error(`Failed to configure remotes: ${error instanceof Error ? error.message : 'Unknown error'}`)\n logger.info('You can manually run \"iloom init\" to configure settings.')\n process.exit(1)\n }\n}\n\n// Initialize shell completion (must be after program setup, before parseAsync)\nconst shellCompletion = new ShellCompletion()\nshellCompletion.init()\n\nprogram\n .command('start')\n .alias('create')\n .alias('up')\n .description('Create isolated workspace for an issue/PR')\n .argument('[identifier]', 'Issue number, PR number, or branch name (optional - will prompt if not provided)')\n .option('--claude', 'Enable Claude integration (default: true)')\n .option('--no-claude', 'Disable Claude integration')\n .option('--code', 'Enable VSCode (default: true)')\n .option('--no-code', 'Disable VSCode')\n .option('--dev-server', 'Enable dev server in terminal (default: true)')\n .option('--no-dev-server', 'Disable dev server')\n .option('--terminal', 'Enable terminal without dev server (default: false)')\n .option('--no-terminal', 'Disable terminal')\n .addOption(\n new Option('--one-shot <mode>', 'One-shot automation mode')\n .choices(['default', 'noReview', 'bypassPermissions'])\n .default('default')\n )\n .action(async (identifier: string | undefined, options: StartOptions) => {\n try {\n let finalIdentifier = identifier\n\n // Interactive prompting when no identifier provided\n if (!finalIdentifier) {\n const { promptInput } = await import('./utils/prompt.js')\n finalIdentifier = await promptInput('Enter issue number, PR number (pr/123), or branch name')\n\n // Validate non-empty after prompting\n if (!finalIdentifier?.trim()) {\n logger.error('Identifier is required')\n process.exit(1)\n }\n }\n\n const { StartCommand } = await import('./commands/start.js')\n const command = new StartCommand()\n await command.execute({ identifier: finalIdentifier, options })\n } catch (error) {\n logger.error(`Failed to start workspace: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('add-issue')\n .alias('a')\n .description('Create and enhance GitHub issue without starting workspace')\n .argument('<description>', 'Natural language description of the issue (>50 chars, >2 spaces)')\n .action(async (description: string) => {\n try {\n const { AddIssueCommand } = await import('./commands/add-issue.js')\n const command = new AddIssueCommand()\n const issueNumber = await command.execute({\n description,\n options: {}\n })\n logger.success(`Issue #${issueNumber} created successfully`)\n process.exit(0)\n } catch (error) {\n logger.error(`Failed to create issue: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('feedback')\n .alias('f')\n .description('Submit feedback/bug report to iloom-cli repository')\n .argument('<description>', 'Natural language description of feedback (>50 chars, >2 spaces)')\n .action(async (description: string) => {\n try {\n const { FeedbackCommand } = await import('./commands/feedback.js')\n const command = new FeedbackCommand()\n const issueNumber = await command.execute({\n description,\n options: {}\n })\n logger.success(`Feedback submitted as issue #${issueNumber} in iloom-cli repository`)\n process.exit(0)\n } catch (error) {\n logger.error(`Failed to submit feedback: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('enhance')\n .description('Apply enhancement agent to existing GitHub issue')\n .argument('<issue-number>', 'GitHub issue number to enhance', parseInt)\n .option('--no-browser', 'Skip browser opening prompt')\n .option('--author <username>', 'GitHub username to tag in questions (for CI usage)')\n .action(async (issueNumber: number, options: { browser?: boolean; author?: string }) => {\n try {\n const { EnhanceCommand } = await import('./commands/enhance.js')\n const command = new EnhanceCommand()\n await command.execute({\n issueNumber,\n options: {\n noBrowser: options.browser === false,\n ...(options.author && { author: options.author })\n }\n })\n logger.success(`Enhancement process completed for issue #${issueNumber}`)\n process.exit(0)\n } catch (error) {\n logger.error(`Failed to enhance issue: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('finish')\n .alias('dn')\n .description('Merge work and cleanup workspace')\n .argument('[identifier]', 'Issue number, PR number, or branch name (auto-detected if omitted)')\n .option('-f, --force', 'Skip confirmation prompts')\n .option('-n, --dry-run', 'Preview actions without executing')\n .option('--pr <number>', 'Treat input as PR number', parseFloat)\n .option('--skip-build', 'Skip post-merge build verification')\n .option('--no-browser', 'Skip opening PR in browser (github-pr mode only)')\n .option('--cleanup', 'Clean up worktree after PR creation (github-pr mode only)')\n .option('--no-cleanup', 'Keep worktree after PR creation (github-pr mode only)')\n .action(async (identifier: string | undefined, options: FinishOptions) => {\n try {\n const { FinishCommand } = await import('./commands/finish.js')\n const command = new FinishCommand()\n await command.execute({ identifier, options })\n } catch (error) {\n logger.error(`Failed to finish workspace: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('rebase')\n .description('Rebase current branch on main with Claude-assisted conflict resolution')\n .option('-f, --force', 'Skip confirmation prompts')\n .option('-n, --dry-run', 'Preview actions without executing')\n .action(async (options: { force?: boolean; dryRun?: boolean }) => {\n try {\n const { RebaseCommand } = await import('./commands/rebase.js')\n const command = new RebaseCommand()\n await command.execute(options)\n } catch (error) {\n logger.error(`Failed to rebase: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('spin')\n .alias('ignite')\n .description('Launch Claude with auto-detected workspace context')\n .addOption(\n new Option('--one-shot <mode>', 'One-shot automation mode')\n .choices(['default', 'noReview', 'bypassPermissions'])\n .default('default')\n )\n .action(async (options: { oneShot?: import('./types/index.js').OneShotMode }) => {\n try {\n const { IgniteCommand } = await import('./commands/ignite.js')\n const command = new IgniteCommand()\n await command.execute(options.oneShot ?? 'default')\n } catch (error) {\n logger.error(`Failed to spin up loom: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('open')\n .description('Open workspace in browser or run CLI tool')\n .argument('[identifier]', 'Issue number, PR number, or branch name (auto-detected if omitted)')\n .allowUnknownOption()\n .action(async (identifier?: string, _options?: Record<string, unknown>, command?: Command) => {\n try {\n // Extract additional arguments - everything after identifier\n const args = command?.args ? command.args.slice(identifier ? 1 : 0) : []\n\n const { OpenCommand } = await import('./commands/open.js')\n const cmd = new OpenCommand()\n const input = identifier ? { identifier, args } : { args }\n await cmd.execute(input)\n } catch (error) {\n logger.error(`Failed to open: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('run')\n .description('Run CLI tool or open workspace in browser')\n .argument('[identifier]', 'Issue number, PR number, or branch name (auto-detected if omitted)')\n .allowUnknownOption()\n .action(async (identifier?: string, _options?: Record<string, unknown>, command?: Command) => {\n try {\n // Extract additional arguments - everything after identifier\n const args = command?.args ? command.args.slice(identifier ? 1 : 0) : []\n\n const { RunCommand } = await import('./commands/run.js')\n const cmd = new RunCommand()\n const input = identifier ? { identifier, args } : { args }\n await cmd.execute(input)\n } catch (error) {\n logger.error(`Failed to run: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('cleanup')\n .description('Remove workspaces')\n .argument('[identifier]', 'Branch name or issue number to cleanup (auto-detected)')\n .option('-l, --list', 'List all worktrees')\n .option('-a, --all', 'Remove all worktrees (interactive confirmation)')\n .option('-i, --issue <number>', 'Cleanup by issue number', parseInt)\n .option('-f, --force', 'Skip confirmations and force removal')\n .option('--dry-run', 'Show what would be done without doing it')\n .action(async (identifier?: string, options?: CleanupOptions) => {\n try {\n const { CleanupCommand } = await import('./commands/cleanup.js')\n const command = new CleanupCommand()\n const input: { identifier?: string; options: CleanupOptions } = {\n options: options ?? {}\n }\n if (identifier) {\n input.identifier = identifier\n }\n await command.execute(input)\n } catch (error) {\n logger.error(`Failed to cleanup worktrees: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('list')\n .description('Show active workspaces')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n try {\n const manager = new GitWorktreeManager()\n const worktrees = await manager.listWorktrees({ porcelain: true })\n\n if (options.json) {\n console.log(JSON.stringify(worktrees, null, 2))\n return\n }\n\n if (worktrees.length === 0) {\n logger.info('No worktrees found')\n return\n }\n\n logger.info('Active workspaces:')\n for (const worktree of worktrees) {\n const formatted = manager.formatWorktree(worktree)\n logger.info(` ${formatted.title}`)\n logger.info(` Path: ${formatted.path}`)\n logger.info(` Commit: ${formatted.commit}`)\n }\n } catch (error) {\n logger.error(`Failed to list worktrees: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\n\nprogram\n .command('init')\n .alias('config')\n .description('Initialize iloom configuration and setup shell autocomplete')\n .action(async () => {\n try {\n const { InitCommand } = await import('./commands/init.js')\n const command = new InitCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Failed to initialize: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('contribute')\n .description('Set up local development environment for contributing to iloom')\n .action(async () => {\n try {\n const { ContributeCommand } = await import('./commands/contribute.js')\n const command = new ContributeCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Failed to set up contributor environment: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\nprogram\n .command('update')\n .description('Update iloom-cli to the latest version')\n .option('--dry-run', 'Show what would be done without actually updating')\n .action(async (options: { dryRun?: boolean }) => {\n try {\n const { UpdateCommand } = await import('./commands/update.js')\n const command = new UpdateCommand()\n await command.execute(options)\n } catch (error) {\n logger.error(`Failed to update: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n })\n\n// Test command for GitHub integration\nprogram\n .command('test-github')\n .description('Test GitHub integration (Issue #3)')\n .argument('<identifier>', 'Issue number or PR number')\n .option('--no-claude', 'Skip Claude for branch name generation')\n .action(async (identifier: string, options: { claude?: boolean }) => {\n try {\n const { GitHubService } = await import('./lib/GitHubService.js')\n\n logger.info('Testing GitHub Integration\\n')\n\n const service = new GitHubService(options.claude !== undefined ? { useClaude: options.claude } : {})\n\n // Test 1: Input detection\n logger.info('Detecting input type...')\n const detection = await service.detectInputType(identifier)\n logger.info(` Type: ${detection.type}`)\n logger.info(` Number: ${detection.number}`) \n\n if (detection.type === 'unknown') {\n logger.error('Could not detect if input is an issue or PR')\n process.exit(1)\n }\n\n // Test 2: Fetch the issue/PR\n logger.info('Fetching from GitHub...')\n if (detection.type === 'issue') {\n if (!detection.number) {\n throw new Error('Issue number not detected')\n }\n const issue = await service.fetchIssue(detection.number)\n logger.success(` Issue #${issue.number}: ${issue.title}`)\n logger.info(` State: ${issue.state}`)\n logger.info(` Labels: ${issue.labels.join(', ') || 'none'}`)\n logger.info(` URL: ${issue.url}`)\n\n // Test 3: Generate branch name\n \n logger.info('Generating branch name...')\n const branchName = await service.generateBranchName({\n issueNumber: issue.number,\n title: issue.title\n })\n logger.success(` Branch: ${branchName}`)\n\n // Test 4: Extract context\n \n logger.info('Extracting context for Claude...')\n const context = service.extractContext(issue)\n logger.info(` ${context.split('\\n').join('\\n ')}`)\n\n } else {\n if (!detection.number) {\n throw new Error('PR number not detected')\n }\n const pr = await service.fetchPR(detection.number)\n logger.success(` PR #${pr.number}: ${pr.title}`)\n logger.info(` State: ${pr.state}`)\n logger.info(` Branch: ${pr.branch}`)\n logger.info(` Base: ${pr.baseBranch}`)\n logger.info(` URL: ${pr.url}`)\n\n // Test 3: Extract context\n \n logger.info('Extracting context for Claude...')\n const context = service.extractContext(pr)\n logger.info(` ${context.split('\\n').join('\\n ')}`)\n }\n\n \n logger.success('All GitHub integration tests passed!')\n\n } catch (error) {\n logger.error(`Test failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for Claude integration\nprogram\n .command('test-claude')\n .description('Test Claude integration (Issue #10)')\n .option('--detect', 'Test Claude CLI detection')\n .option('--version', 'Get Claude CLI version')\n .option('--branch <title>', 'Test branch name generation with given title')\n .option('--issue <number>', 'Issue number for branch generation', '123')\n .option('--launch <prompt>', 'Launch Claude with a prompt (headless)')\n .option('--interactive', 'Launch Claude interactively (requires --launch)')\n .option('--template <name>', 'Test template loading')\n .action(async (options: {\n detect?: boolean\n version?: boolean\n branch?: string\n issue?: string\n launch?: string\n interactive?: boolean\n template?: 'issue' | 'pr' | 'regular'\n }) => {\n try {\n const { detectClaudeCli, getClaudeVersion, generateBranchName, launchClaude } = await import('./utils/claude.js')\n const { PromptTemplateManager } = await import('./lib/PromptTemplateManager.js')\n const { ClaudeService } = await import('./lib/ClaudeService.js')\n const { ClaudeContextManager } = await import('./lib/ClaudeContextManager.js')\n\n logger.info('Testing Claude Integration\\n')\n\n // Test 1: Detection\n if (options.detect) {\n logger.info('Detecting Claude CLI...')\n const isAvailable = await detectClaudeCli()\n if (isAvailable) {\n logger.success(' Claude CLI is available')\n } else {\n logger.error(' Claude CLI not found')\n }\n }\n\n // Test 2: Version\n if (options.version) {\n logger.info('Getting Claude version...')\n const version = await getClaudeVersion()\n if (version) {\n logger.success(` Version: ${version}`)\n } else {\n logger.error(' Could not get version')\n }\n }\n\n // Test 3: Branch name generation\n if (options.branch) {\n logger.info('Generating branch name...')\n const issueNumber = parseInt(options.issue ?? '123')\n logger.info(` Issue #${issueNumber}: ${options.branch}`)\n const branchName = await generateBranchName(options.branch, issueNumber)\n logger.success(` Generated: ${branchName}`)\n }\n\n // Test 4: Launch Claude\n if (options.launch) {\n logger.info('Launching Claude...')\n logger.info(` Prompt: \"${options.launch}\"`)\n logger.info(` Mode: ${options.interactive ? 'Interactive' : 'Headless'}`)\n\n if (options.interactive) {\n logger.info(' Launching Claude in new terminal...')\n await launchClaude(options.launch, { headless: false })\n logger.info(' (Claude should open in a separate process)')\n } else {\n logger.info(' Waiting for response...')\n const result = await launchClaude(options.launch, { headless: true })\n if (result) {\n logger.success(' Response:')\n logger.info(` ${result.split('\\n').join('\\n ')}`)\n }\n }\n }\n\n // Test 5: Template loading\n if (options.template) {\n logger.info('Loading template...')\n logger.info(` Template: ${options.template}`)\n const manager = new PromptTemplateManager()\n try {\n const content = await manager.loadTemplate(options.template)\n logger.success(' Template loaded successfully')\n logger.info(' First 200 chars:')\n logger.info(` ${content.substring(0, 200).split('\\n').join('\\n ')}...`)\n } catch (error) {\n logger.error(` Failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n }\n\n // Run all tests in sequence when no specific options provided\n if (!options.detect && !options.version && !options.branch && !options.launch && !options.template) {\n logger.info('Running full Claude integration test suite...\\n')\n\n // Test 1: Detection\n logger.info('1. Testing Claude CLI detection...')\n const isAvailable = await detectClaudeCli()\n if (isAvailable) {\n logger.success(' Claude CLI is available')\n } else {\n logger.error(' Claude CLI not found')\n logger.info('\\nSkipping remaining tests since Claude CLI is not available')\n return\n }\n\n // Test 2: Version\n logger.info('\\n2. Getting Claude version...')\n const version = await getClaudeVersion()\n if (version) {\n logger.success(` Version: ${version}`)\n } else {\n logger.error(' Could not get version')\n }\n\n // Test 3: Branch name generation\n logger.info('\\n3. Testing branch name generation...')\n const testIssueNumber = 123\n const testTitle = 'Add user authentication feature'\n logger.info(` Issue #${testIssueNumber}: ${testTitle}`)\n const branchName = await generateBranchName(testTitle, testIssueNumber)\n logger.success(` Generated: ${branchName}`)\n\n // Test 4: Service initialization\n logger.info('\\n4. Testing ClaudeService initialization...')\n new ClaudeService() // Just verify it can be instantiated\n logger.success(' Service initialized')\n\n // Test 5: Context manager\n logger.info('\\n5. Testing ClaudeContextManager...')\n const contextManager = new ClaudeContextManager()\n await contextManager.prepareContext({\n type: 'issue',\n identifier: 123,\n title: 'Test issue',\n workspacePath: process.cwd(),\n port: 3123\n })\n logger.success(' Context prepared')\n\n // Test 6: Template loading\n logger.info('\\n6. Testing template loading...')\n const templateManager = new PromptTemplateManager()\n const templates: Array<'issue' | 'pr' | 'regular'> = ['issue', 'pr', 'regular']\n let templateCount = 0\n for (const template of templates) {\n try {\n await templateManager.loadTemplate(template)\n logger.success(` ${template} template loaded`)\n templateCount++\n } catch {\n logger.warn(` ${template} template not found`)\n }\n }\n logger.info(` Loaded ${templateCount}/${templates.length} templates`)\n\n // Test 7: Launch Claude headless (quick test)\n logger.info('\\n7. Testing Claude launch (headless)...')\n logger.info(' Sending test prompt: \"Say hello\"')\n try {\n const result = await launchClaude('Say hello', { headless: true })\n if (result) {\n logger.success(' Claude responded successfully')\n logger.info(` Response preview: ${result.substring(0, 100)}...`)\n } else {\n logger.warn(' No response received')\n }\n } catch (error) {\n logger.error(` Launch failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n\n logger.info('\\n' + '='.repeat(50))\n logger.success('All Claude integration tests complete!')\n logger.info('Summary: All core Claude features are working correctly')\n }\n\n } catch (error) {\n logger.error(`Test failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for webserver detection\nprogram\n .command('test-webserver')\n .description('Test if a web server is running on a workspace port')\n .argument('<issue-number>', 'Issue number (port will be calculated as 3000 + issue number)', parseInt)\n .option('--kill', 'Kill the web server if detected')\n .action(async (issueNumber: number, options: { kill?: boolean }) => {\n try {\n const { TestWebserverCommand } = await import('./commands/test-webserver.js')\n const command = new TestWebserverCommand()\n await command.execute({ issueNumber, options })\n } catch (error) {\n logger.error(`Test webserver failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for Git integration\nprogram\n .command('test-git')\n .description('Test Git integration - findMainWorktreePath() function (reads .iloom/settings.json)')\n .action(async () => {\n try {\n const { TestGitCommand } = await import('./commands/test-git.js')\n const command = new TestGitCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Test git failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for iTerm2 dual tab functionality\nprogram\n .command('test-tabs')\n .description('Test iTerm2 dual tab functionality - opens two tabs with test commands')\n .action(async () => {\n try {\n const { TestTabsCommand } = await import('./commands/test-tabs.js')\n const command = new TestTabsCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Test tabs failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for worktree prefix configuration\nprogram\n .command('test-prefix')\n .description('Test worktree prefix configuration - preview worktree paths (reads .iloom/settings.json)')\n .action(async () => {\n try {\n const { TestPrefixCommand } = await import('./commands/test-prefix.js')\n const command = new TestPrefixCommand()\n await command.execute()\n } catch (error) {\n logger.error(`Test prefix failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Test command for Neon integration\nprogram\n .command('test-neon')\n .description('Test Neon integration and debug configuration')\n .action(async () => {\n try {\n const { SettingsManager } = await import('./lib/SettingsManager.js')\n const { createNeonProviderFromSettings } = await import('./utils/neon-helpers.js')\n\n logger.info('Testing Neon Integration\\n')\n\n // Test 1: Settings Configuration\n logger.info('1. Settings Configuration:')\n const settingsManager = new SettingsManager()\n const settings = await settingsManager.loadSettings()\n const neonConfig = settings.databaseProviders?.neon\n logger.info(` projectId: ${neonConfig?.projectId ?? '(not configured)'}`)\n logger.info(` parentBranch: ${neonConfig?.parentBranch ?? '(not configured)'}`)\n\n // Test 2: Create provider and test initialization\n logger.info('\\n2. Creating NeonProvider...')\n try {\n const neonProvider = createNeonProviderFromSettings(settings)\n logger.success(' NeonProvider created successfully')\n\n // Test 3: CLI availability\n logger.info('\\n3. Testing Neon CLI availability...')\n const isAvailable = await neonProvider.isCliAvailable()\n if (isAvailable) {\n logger.success(' Neon CLI is available')\n } else {\n logger.error(' Neon CLI not found')\n logger.info(' Install with: npm install -g @neon/cli')\n return\n }\n\n // Test 4: Authentication\n logger.info('\\n4. Testing Neon CLI authentication...')\n const isAuthenticated = await neonProvider.isAuthenticated()\n if (isAuthenticated) {\n logger.success(' Neon CLI is authenticated')\n } else {\n logger.error(' Neon CLI not authenticated')\n logger.info(' Run: neon auth')\n return\n }\n\n // Test 5: List branches (if config is valid)\n if (neonConfig?.projectId) {\n logger.info('\\n5. Testing branch listing...')\n try {\n const branches = await neonProvider.listBranches()\n logger.success(` Found ${branches.length} branches:`)\n for (const branch of branches.slice(0, 5)) { // Show first 5\n logger.info(` - ${branch}`)\n }\n if (branches.length > 5) {\n logger.info(` ... and ${branches.length - 5} more`)\n }\n } catch (error) {\n logger.error(` Failed to list branches: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n } else {\n logger.warn('\\n5. Skipping branch listing (Neon not configured in settings)')\n }\n\n } catch (error) {\n logger.error(` Failed to create NeonProvider: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.message.includes('not configured')) {\n logger.info('\\n This is expected if Neon is not configured.')\n logger.info(' Configure databaseProviders.neon in .iloom/settings.json to test fully.')\n }\n }\n\n logger.info('\\n' + '='.repeat(50))\n logger.success('Neon integration test complete!')\n\n } catch (error) {\n logger.error(`Test failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n if (error instanceof Error && error.stack) {\n logger.debug(error.stack)\n }\n process.exit(1)\n }\n })\n\n// Add custom help command in order to get preAction to run (update check handled by preAction hook)\nprogram\n .command('help')\n .description('Display help information')\n .argument('[command]', 'Show help for specific command')\n .action(async (command?: string) => {\n // Show help (update check already ran in preAction)\n if (command) {\n // Show help for specific command\n const subCommand = program.commands.find(cmd => cmd.name() === command)\n if (subCommand) {\n subCommand.outputHelp()\n } else {\n logger.error(`Unknown command: ${command}`)\n program.outputHelp()\n }\n } else {\n program.outputHelp()\n }\n\n process.exit(0)\n })\n\n// Parse CLI arguments\ntry {\n await program.parseAsync()\n} catch (error) {\n if (error instanceof Error) {\n logger.error(`Error: ${error.message}`)\n process.exit(1)\n }\n}\n","import { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { dirname, join } from 'path'\n\n/**\n * Package information from package.json\n */\nexport interface PackageInfo {\n name: string\n version: string\n description: string\n [key: string]: unknown\n}\n\n/**\n * Get package.json information\n *\n * @param scriptPath - Optional path to use for finding package.json (defaults to current file location)\n * @returns Parsed package.json contents\n * @throws Error if package.json cannot be read or parsed\n */\nexport function getPackageInfo(scriptPath?: string): PackageInfo {\n try {\n // Determine the base path to use\n let basePath: string\n if (scriptPath) {\n basePath = scriptPath\n } else {\n // Use import.meta.url to get the current file path\n const __filename = fileURLToPath(import.meta.url)\n basePath = __filename\n }\n\n // Navigate from current file to package.json\n // The compiled CLI runs from dist/cli.js, so we need dist/../package.json (one level up)\n const __dirname = dirname(basePath)\n const packageJsonPath = join(__dirname, '..', 'package.json')\n\n // Read and parse package.json\n const packageJsonContent = readFileSync(packageJsonPath, 'utf8')\n const packageJson = JSON.parse(packageJsonContent) as PackageInfo\n\n return packageJson\n } catch (error) {\n throw new Error(\n `Failed to read package.json: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n"],"mappings":"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","names":["__filename","packageJson","fileURLToPath","shellCompletion"]}
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  checkGhAuth,
4
4
  executeGhCommand
5
- } from "./chunk-JXQXSC45.js";
5
+ } from "./chunk-SWCRXDZC.js";
6
6
  import {
7
7
  executeGitCommand
8
- } from "./chunk-KOCQAD2E.js";
8
+ } from "./chunk-HBVFXN7R.js";
9
9
  import {
10
10
  promptInput
11
11
  } from "./chunk-JNKJ7NJV.js";
@@ -243,6 +243,9 @@ Happy contributing!`);
243
243
  github: {
244
244
  remote: "upstream"
245
245
  }
246
+ },
247
+ mergeBehavior: {
248
+ mode: "github-pr"
246
249
  }
247
250
  };
248
251
  await writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n");
@@ -253,4 +256,4 @@ export {
253
256
  validateDirectoryName,
254
257
  validateDirectoryPath
255
258
  };
256
- //# sourceMappingURL=contribute-3MQJ3XAQ.js.map
259
+ //# sourceMappingURL=contribute-EMZKCAC6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/contribute.ts"],"sourcesContent":["import { logger } from '../utils/logger.js'\nimport { checkGhAuth, executeGhCommand } from '../utils/github.js'\nimport { executeGitCommand } from '../utils/git.js'\nimport { promptInput } from '../utils/prompt.js'\nimport { existsSync, accessSync, constants } from 'fs'\nimport { writeFile, mkdir } from 'fs/promises'\nimport path from 'path'\nimport { InitCommand } from './init.js'\nimport chalk from 'chalk'\n\nconst ILOOM_REPO = 'iloom-ai/iloom-cli'\nconst UPSTREAM_URL = 'https://github.com/iloom-ai/iloom-cli.git'\n\n// Maximum path length for most file systems\nconst MAX_PATH_LENGTH = 255\n\n// Reserved names on Windows (also avoid on all platforms for portability)\nconst RESERVED_NAMES = [\n\t'CON', 'PRN', 'AUX', 'NUL',\n\t'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',\n\t'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9',\n]\n\n// Invalid characters for directory names (cross-platform)\n// eslint-disable-next-line no-control-regex\nconst INVALID_CHARS_PATTERN = /[<>:\"|?*\\x00-\\x1f]/\n\n\n/**\n * Validation result for directory input\n */\ninterface DirectoryValidationResult {\n\tisValid: boolean\n\terror?: string\n}\n\n/**\n * Validate directory name format\n * @param directoryName - The directory name (not full path)\n * @returns Validation result with error message if invalid\n */\nexport function validateDirectoryName(directoryName: string): DirectoryValidationResult {\n\t// Check for empty or whitespace-only\n\tif (!directoryName || directoryName.trim() === '') {\n\t\treturn { isValid: false, error: 'Directory name cannot be empty' }\n\t}\n\n\tconst trimmed = directoryName.trim()\n\tconst baseName = path.basename(trimmed)\n\n\t// Check for invalid characters\n\tif (INVALID_CHARS_PATTERN.test(baseName)) {\n\t\treturn { isValid: false, error: 'Directory name contains invalid characters (<>:\"|?*)' }\n\t}\n\n\t// Check for reserved names (case-insensitive)\n\tif (RESERVED_NAMES.includes(baseName.toUpperCase())) {\n\t\treturn { isValid: false, error: `\"${baseName}\" is a reserved name and cannot be used` }\n\t}\n\n\t// Check for names that start/end with dots or spaces (problematic on some systems)\n\tif (baseName.startsWith('.') && baseName === '.') {\n\t\treturn { isValid: false, error: 'Directory name cannot be just a dot' }\n\t}\n\tif (baseName.endsWith('.') || baseName.endsWith(' ')) {\n\t\treturn { isValid: false, error: 'Directory name cannot end with a dot or space' }\n\t}\n\n\treturn { isValid: true }\n}\n\n/**\n * Validate full directory path\n * @param directoryPath - The full directory path\n * @returns Validation result with error message if invalid\n */\nexport function validateDirectoryPath(directoryPath: string): DirectoryValidationResult {\n\t// First validate the directory name component\n\tconst nameValidation = validateDirectoryName(directoryPath)\n\tif (!nameValidation.isValid) {\n\t\treturn nameValidation\n\t}\n\n\tconst trimmed = directoryPath.trim()\n\tconst absolutePath = path.resolve(trimmed)\n\n\t// Check path length\n\tif (absolutePath.length > MAX_PATH_LENGTH) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Path is too long (${absolutePath.length} characters). Maximum is ${MAX_PATH_LENGTH} characters.`\n\t\t}\n\t}\n\n\t// Check if directory already exists\n\tif (existsSync(absolutePath)) {\n\t\treturn { isValid: false, error: `Directory already exists: ${trimmed}` }\n\t}\n\n\t// Check if parent directory exists\n\tconst parentDir = path.dirname(absolutePath)\n\tif (!existsSync(parentDir)) {\n\t\treturn { isValid: false, error: `Parent directory does not exist: ${parentDir}` }\n\t}\n\n\t// Check if parent directory is writable\n\ttry {\n\t\taccessSync(parentDir, constants.W_OK)\n\t} catch {\n\t\treturn { isValid: false, error: `Parent directory is not writable: ${parentDir}` }\n\t}\n\n\treturn { isValid: true }\n}\n\n\n/**\n * ContributeCommand - Set up local development environment for contributing to iloom\n * Implements issue #220: streamlined contributor onboarding workflow\n */\nexport class ContributeCommand {\n\tconstructor(_initCommand?: InitCommand) {}\n\n\t/**\n\t * Main entry point for the contribute command\n\t * Automates fork creation, cloning, and upstream configuration\n\t */\n\tpublic async execute(): Promise<void> {\n\t\tlogger.info(chalk.bold('Setting up iloom contributor environment...'))\n\n\t\t// Step 1: Verify gh CLI authenticated\n\t\tconst username = await this.getAuthenticatedUsername()\n\t\tlogger.success(`Authenticated as ${chalk.cyan(username)}`)\n\n\t\t// Step 2: Check for existing fork\n\t\tconst hasFork = await this.forkExists(username)\n\n\t\t// Step 3: Create fork if needed\n\t\tif (!hasFork) {\n\t\t\tlogger.info('Creating fork of iloom-ai/iloom-cli...')\n\t\t\tawait this.createFork()\n\t\t\tlogger.success('Fork created successfully')\n\t\t} else {\n\t\t\tlogger.info('Using existing fork')\n\t\t}\n\n\t\t// Step 4: Prompt for directory with validation and retry loop\n\t\tconst directory = await this.promptForDirectory()\n\n\t\t// Handle cancelled input\n\t\tif (!directory) {\n\t\t\tlogger.info('Setup cancelled by user')\n\t\t\tprocess.exit(0)\n\t\t}\n\n\t\tconst absolutePath = path.resolve(directory)\n\n\t\t// Step 5: Clone repository (gh CLI handles SSH/HTTPS automatically based on git config)\n\t\tlogger.info(`Cloning repository to ${directory}...`)\n\t\tawait this.cloneRepository(username, directory)\n\t\tlogger.success('Repository cloned successfully')\n\n\t\t// Step 6: Add upstream remote if it doesn't exist\n\t\tawait this.addUpstreamRemote(absolutePath)\n\n\t\t// Step 7: Configure settings\n\t\tlogger.info('Configuring iloom settings...')\n\t\tawait this.configureSettings(absolutePath)\n\t\tlogger.success('Settings configured')\n\n\t\tlogger.success(chalk.bold.green('\\nContributor environment setup complete!'))\n\t\tlogger.info(`\\nNext steps:`)\n\t\tlogger.info(` 1. cd ${directory}`)\n\t\tlogger.info(` 2. pnpm install`)\n\t\tlogger.info(` 3. iloom start <issue_number>`)\n\t\tlogger.info(`\\nHappy contributing!`)\n\t}\n\n\t/**\n\t * Get authenticated GitHub username\n\t * @throws Error if not authenticated\n\t */\n\tprivate async getAuthenticatedUsername(): Promise<string> {\n\t\tconst authStatus = await checkGhAuth()\n\n\t\tif (!authStatus.hasAuth) {\n\t\t\tthrow new Error(\n\t\t\t\t'GitHub CLI is not authenticated. Please run: gh auth login'\n\t\t\t)\n\t\t}\n\n\t\tif (!authStatus.username) {\n\t\t\t// Try to fetch username from gh api if not in auth status\n\t\t\ttry {\n\t\t\t\tconst user = await executeGhCommand<{ login: string }>(['api', 'user', '--json', 'login'])\n\t\t\t\treturn user.login\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\t\tthrow new Error(`Unable to determine GitHub username: ${message}`)\n\t\t\t}\n\t\t}\n\n\t\treturn authStatus.username\n\t}\n\n\t/**\n\t * Check if user already has a fork of iloom-cli\n\t */\n\tprivate async forkExists(username: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait executeGhCommand(['api', `repos/${username}/iloom-cli`])\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\t// 404 means no fork exists\n\t\t\tif (error instanceof Error && error.message.includes('Not Found')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Re-throw unexpected errors\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t/**\n\t * Create a fork of iloom-cli without cloning\n\t */\n\tprivate async createFork(): Promise<void> {\n\t\tawait executeGhCommand(['repo', 'fork', ILOOM_REPO, '--clone=false'])\n\t}\n\n\n\t/**\n\t * Clone the repository using simplified gh CLI approach\n\t */\n\tprivate async cloneRepository(\n\t\tusername: string,\n\t\tdirectory: string\n\t): Promise<void> {\n\t\tconst repoIdentifier = `${username}/iloom-cli`\n\t\t// Always use gh repo clone - it handles SSH/HTTPS based on user's git config\n\t\tawait executeGhCommand(['repo', 'clone', repoIdentifier, directory])\n\t}\n\n\t/**\n\t * Add upstream remote if it doesn't already exist\n\t */\n\tprivate async addUpstreamRemote(directory: string): Promise<void> {\n\t\ttry {\n\t\t\t// Check if upstream remote exists\n\t\t\tawait executeGitCommand(['remote', 'get-url', 'upstream'], { cwd: directory })\n\t\t\tlogger.info('Upstream remote already configured')\n\t\t} catch {\n\t\t\t// Upstream doesn't exist, add it\n\t\t\tlogger.info('Adding upstream remote...')\n\t\t\tawait executeGitCommand(\n\t\t\t\t['remote', 'add', 'upstream', UPSTREAM_URL],\n\t\t\t\t{ cwd: directory }\n\t\t\t)\n\t\t\tlogger.success('Upstream remote configured')\n\t\t}\n\t}\n\n\t/**\n\t * Prompt for directory with validation and retry loop\n\t * @returns The validated directory path, or null if user cancels\n\t */\n\tprivate async promptForDirectory(): Promise<string | null> {\n\t\tconst maxRetries = 3\n\t\tlet attempts = 0\n\n\t\twhile (attempts < maxRetries) {\n\t\t\tconst directory = await promptInput(\n\t\t\t\t'Where should the repository be cloned?',\n\t\t\t\t'./iloom-cli'\n\t\t\t)\n\n\t\t\t// Handle empty input (user cancelled by entering empty string after exhausting default)\n\t\t\tif (!directory || directory.trim() === '') {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst trimmed = directory.trim()\n\n\t\t\t// Validate the directory path\n\t\t\tconst validation = validateDirectoryPath(trimmed)\n\t\t\tif (validation.isValid) {\n\t\t\t\treturn trimmed\n\t\t\t}\n\n\t\t\t// Show error and increment attempts\n\t\t\tattempts++\n\t\t\tif (attempts < maxRetries) {\n\t\t\t\tlogger.error(`${validation.error}`)\n\t\t\t\tlogger.info(`Please try again (${maxRetries - attempts} attempts remaining)`)\n\t\t\t} else {\n\t\t\t\tlogger.error(`${validation.error}`)\n\t\t\t\tlogger.error('Maximum retry attempts reached')\n\t\t\t\tthrow new Error(`Invalid directory after ${maxRetries} attempts: ${validation.error}`)\n\t\t\t}\n\t\t}\n\n\t\treturn null\n\t}\n\n\n\t/**\n\t * Configure .iloom/settings.json with upstream remote\n\t */\n\tprivate async configureSettings(directory: string): Promise<void> {\n\t\tconst iloomDir = path.join(directory, '.iloom')\n\t\tconst settingsPath = path.join(iloomDir, 'settings.local.json')\n\n\t\t// Create .iloom directory\n\t\tawait mkdir(iloomDir, { recursive: true })\n\n\t\t// Create settings.json with upstream remote configuration\n\t\tconst settings = {\n\t\t\tissueManagement: {\n\t\t\t\tgithub: {\n\t\t\t\t\tremote: 'upstream',\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\tawait writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\\n')\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAIA,SAAS,YAAY,YAAY,iBAAiB;AAClD,SAAS,WAAW,aAAa;AACjC,OAAO,UAAU;AAEjB,OAAO,WAAW;AAElB,IAAM,aAAa;AACnB,IAAM,eAAe;AAGrB,IAAM,kBAAkB;AAGxB,IAAM,iBAAiB;AAAA,EACtB;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACrB;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AACjE;AAIA,IAAM,wBAAwB;AAgBvB,SAAS,sBAAsB,eAAkD;AAEvF,MAAI,CAAC,iBAAiB,cAAc,KAAK,MAAM,IAAI;AAClD,WAAO,EAAE,SAAS,OAAO,OAAO,iCAAiC;AAAA,EAClE;AAEA,QAAM,UAAU,cAAc,KAAK;AACnC,QAAM,WAAW,KAAK,SAAS,OAAO;AAGtC,MAAI,sBAAsB,KAAK,QAAQ,GAAG;AACzC,WAAO,EAAE,SAAS,OAAO,OAAO,uDAAuD;AAAA,EACxF;AAGA,MAAI,eAAe,SAAS,SAAS,YAAY,CAAC,GAAG;AACpD,WAAO,EAAE,SAAS,OAAO,OAAO,IAAI,QAAQ,0CAA0C;AAAA,EACvF;AAGA,MAAI,SAAS,WAAW,GAAG,KAAK,aAAa,KAAK;AACjD,WAAO,EAAE,SAAS,OAAO,OAAO,sCAAsC;AAAA,EACvE;AACA,MAAI,SAAS,SAAS,GAAG,KAAK,SAAS,SAAS,GAAG,GAAG;AACrD,WAAO,EAAE,SAAS,OAAO,OAAO,gDAAgD;AAAA,EACjF;AAEA,SAAO,EAAE,SAAS,KAAK;AACxB;AAOO,SAAS,sBAAsB,eAAkD;AAEvF,QAAM,iBAAiB,sBAAsB,aAAa;AAC1D,MAAI,CAAC,eAAe,SAAS;AAC5B,WAAO;AAAA,EACR;AAEA,QAAM,UAAU,cAAc,KAAK;AACnC,QAAM,eAAe,KAAK,QAAQ,OAAO;AAGzC,MAAI,aAAa,SAAS,iBAAiB;AAC1C,WAAO;AAAA,MACN,SAAS;AAAA,MACT,OAAO,qBAAqB,aAAa,MAAM,4BAA4B,eAAe;AAAA,IAC3F;AAAA,EACD;AAGA,MAAI,WAAW,YAAY,GAAG;AAC7B,WAAO,EAAE,SAAS,OAAO,OAAO,6BAA6B,OAAO,GAAG;AAAA,EACxE;AAGA,QAAM,YAAY,KAAK,QAAQ,YAAY;AAC3C,MAAI,CAAC,WAAW,SAAS,GAAG;AAC3B,WAAO,EAAE,SAAS,OAAO,OAAO,oCAAoC,SAAS,GAAG;AAAA,EACjF;AAGA,MAAI;AACH,eAAW,WAAW,UAAU,IAAI;AAAA,EACrC,QAAQ;AACP,WAAO,EAAE,SAAS,OAAO,OAAO,qCAAqC,SAAS,GAAG;AAAA,EAClF;AAEA,SAAO,EAAE,SAAS,KAAK;AACxB;AAOO,IAAM,oBAAN,MAAwB;AAAA,EAC9B,YAAY,cAA4B;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzC,MAAa,UAAyB;AACrC,WAAO,KAAK,MAAM,KAAK,6CAA6C,CAAC;AAGrE,UAAM,WAAW,MAAM,KAAK,yBAAyB;AACrD,WAAO,QAAQ,oBAAoB,MAAM,KAAK,QAAQ,CAAC,EAAE;AAGzD,UAAM,UAAU,MAAM,KAAK,WAAW,QAAQ;AAG9C,QAAI,CAAC,SAAS;AACb,aAAO,KAAK,wCAAwC;AACpD,YAAM,KAAK,WAAW;AACtB,aAAO,QAAQ,2BAA2B;AAAA,IAC3C,OAAO;AACN,aAAO,KAAK,qBAAqB;AAAA,IAClC;AAGA,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAGhD,QAAI,CAAC,WAAW;AACf,aAAO,KAAK,yBAAyB;AACrC,cAAQ,KAAK,CAAC;AAAA,IACf;AAEA,UAAM,eAAe,KAAK,QAAQ,SAAS;AAG3C,WAAO,KAAK,yBAAyB,SAAS,KAAK;AACnD,UAAM,KAAK,gBAAgB,UAAU,SAAS;AAC9C,WAAO,QAAQ,gCAAgC;AAG/C,UAAM,KAAK,kBAAkB,YAAY;AAGzC,WAAO,KAAK,+BAA+B;AAC3C,UAAM,KAAK,kBAAkB,YAAY;AACzC,WAAO,QAAQ,qBAAqB;AAEpC,WAAO,QAAQ,MAAM,KAAK,MAAM,2CAA2C,CAAC;AAC5E,WAAO,KAAK;AAAA,YAAe;AAC3B,WAAO,KAAK,WAAW,SAAS,EAAE;AAClC,WAAO,KAAK,mBAAmB;AAC/B,WAAO,KAAK,iCAAiC;AAC7C,WAAO,KAAK;AAAA,oBAAuB;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,2BAA4C;AACzD,UAAM,aAAa,MAAM,YAAY;AAErC,QAAI,CAAC,WAAW,SAAS;AACxB,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAEA,QAAI,CAAC,WAAW,UAAU;AAEzB,UAAI;AACH,cAAM,OAAO,MAAM,iBAAoC,CAAC,OAAO,QAAQ,UAAU,OAAO,CAAC;AACzF,eAAO,KAAK;AAAA,MACb,SAAS,OAAO;AACf,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAM,IAAI,MAAM,wCAAwC,OAAO,EAAE;AAAA,MAClE;AAAA,IACD;AAEA,WAAO,WAAW;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,UAAoC;AAC5D,QAAI;AACH,YAAM,iBAAiB,CAAC,OAAO,SAAS,QAAQ,YAAY,CAAC;AAC7D,aAAO;AAAA,IACR,SAAS,OAAO;AAEf,UAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,WAAW,GAAG;AAClE,eAAO;AAAA,MACR;AAEA,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAA4B;AACzC,UAAM,iBAAiB,CAAC,QAAQ,QAAQ,YAAY,eAAe,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBACb,UACA,WACgB;AAChB,UAAM,iBAAiB,GAAG,QAAQ;AAElC,UAAM,iBAAiB,CAAC,QAAQ,SAAS,gBAAgB,SAAS,CAAC;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAkB,WAAkC;AACjE,QAAI;AAEH,YAAM,kBAAkB,CAAC,UAAU,WAAW,UAAU,GAAG,EAAE,KAAK,UAAU,CAAC;AAC7E,aAAO,KAAK,oCAAoC;AAAA,IACjD,QAAQ;AAEP,aAAO,KAAK,2BAA2B;AACvC,YAAM;AAAA,QACL,CAAC,UAAU,OAAO,YAAY,YAAY;AAAA,QAC1C,EAAE,KAAK,UAAU;AAAA,MAClB;AACA,aAAO,QAAQ,4BAA4B;AAAA,IAC5C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,qBAA6C;AAC1D,UAAM,aAAa;AACnB,QAAI,WAAW;AAEf,WAAO,WAAW,YAAY;AAC7B,YAAM,YAAY,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,MACD;AAGA,UAAI,CAAC,aAAa,UAAU,KAAK,MAAM,IAAI;AAC1C,eAAO;AAAA,MACR;AAEA,YAAM,UAAU,UAAU,KAAK;AAG/B,YAAM,aAAa,sBAAsB,OAAO;AAChD,UAAI,WAAW,SAAS;AACvB,eAAO;AAAA,MACR;AAGA;AACA,UAAI,WAAW,YAAY;AAC1B,eAAO,MAAM,GAAG,WAAW,KAAK,EAAE;AAClC,eAAO,KAAK,qBAAqB,aAAa,QAAQ,sBAAsB;AAAA,MAC7E,OAAO;AACN,eAAO,MAAM,GAAG,WAAW,KAAK,EAAE;AAClC,eAAO,MAAM,gCAAgC;AAC7C,cAAM,IAAI,MAAM,2BAA2B,UAAU,cAAc,WAAW,KAAK,EAAE;AAAA,MACtF;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,kBAAkB,WAAkC;AACjE,UAAM,WAAW,KAAK,KAAK,WAAW,QAAQ;AAC9C,UAAM,eAAe,KAAK,KAAK,UAAU,qBAAqB;AAG9D,UAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAGzC,UAAM,WAAW;AAAA,MAChB,iBAAiB;AAAA,QAChB,QAAQ;AAAA,UACP,QAAQ;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAEA,UAAM,UAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,IAAI;AAAA,EACvE;AACD;","names":[]}
1
+ {"version":3,"sources":["../src/commands/contribute.ts"],"sourcesContent":["import { logger } from '../utils/logger.js'\nimport { checkGhAuth, executeGhCommand } from '../utils/github.js'\nimport { executeGitCommand } from '../utils/git.js'\nimport { promptInput } from '../utils/prompt.js'\nimport { existsSync, accessSync, constants } from 'fs'\nimport { writeFile, mkdir } from 'fs/promises'\nimport path from 'path'\nimport { InitCommand } from './init.js'\nimport chalk from 'chalk'\n\nconst ILOOM_REPO = 'iloom-ai/iloom-cli'\nconst UPSTREAM_URL = 'https://github.com/iloom-ai/iloom-cli.git'\n\n// Maximum path length for most file systems\nconst MAX_PATH_LENGTH = 255\n\n// Reserved names on Windows (also avoid on all platforms for portability)\nconst RESERVED_NAMES = [\n\t'CON', 'PRN', 'AUX', 'NUL',\n\t'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',\n\t'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9',\n]\n\n// Invalid characters for directory names (cross-platform)\n// eslint-disable-next-line no-control-regex\nconst INVALID_CHARS_PATTERN = /[<>:\"|?*\\x00-\\x1f]/\n\n\n/**\n * Validation result for directory input\n */\ninterface DirectoryValidationResult {\n\tisValid: boolean\n\terror?: string\n}\n\n/**\n * Validate directory name format\n * @param directoryName - The directory name (not full path)\n * @returns Validation result with error message if invalid\n */\nexport function validateDirectoryName(directoryName: string): DirectoryValidationResult {\n\t// Check for empty or whitespace-only\n\tif (!directoryName || directoryName.trim() === '') {\n\t\treturn { isValid: false, error: 'Directory name cannot be empty' }\n\t}\n\n\tconst trimmed = directoryName.trim()\n\tconst baseName = path.basename(trimmed)\n\n\t// Check for invalid characters\n\tif (INVALID_CHARS_PATTERN.test(baseName)) {\n\t\treturn { isValid: false, error: 'Directory name contains invalid characters (<>:\"|?*)' }\n\t}\n\n\t// Check for reserved names (case-insensitive)\n\tif (RESERVED_NAMES.includes(baseName.toUpperCase())) {\n\t\treturn { isValid: false, error: `\"${baseName}\" is a reserved name and cannot be used` }\n\t}\n\n\t// Check for names that start/end with dots or spaces (problematic on some systems)\n\tif (baseName.startsWith('.') && baseName === '.') {\n\t\treturn { isValid: false, error: 'Directory name cannot be just a dot' }\n\t}\n\tif (baseName.endsWith('.') || baseName.endsWith(' ')) {\n\t\treturn { isValid: false, error: 'Directory name cannot end with a dot or space' }\n\t}\n\n\treturn { isValid: true }\n}\n\n/**\n * Validate full directory path\n * @param directoryPath - The full directory path\n * @returns Validation result with error message if invalid\n */\nexport function validateDirectoryPath(directoryPath: string): DirectoryValidationResult {\n\t// First validate the directory name component\n\tconst nameValidation = validateDirectoryName(directoryPath)\n\tif (!nameValidation.isValid) {\n\t\treturn nameValidation\n\t}\n\n\tconst trimmed = directoryPath.trim()\n\tconst absolutePath = path.resolve(trimmed)\n\n\t// Check path length\n\tif (absolutePath.length > MAX_PATH_LENGTH) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Path is too long (${absolutePath.length} characters). Maximum is ${MAX_PATH_LENGTH} characters.`\n\t\t}\n\t}\n\n\t// Check if directory already exists\n\tif (existsSync(absolutePath)) {\n\t\treturn { isValid: false, error: `Directory already exists: ${trimmed}` }\n\t}\n\n\t// Check if parent directory exists\n\tconst parentDir = path.dirname(absolutePath)\n\tif (!existsSync(parentDir)) {\n\t\treturn { isValid: false, error: `Parent directory does not exist: ${parentDir}` }\n\t}\n\n\t// Check if parent directory is writable\n\ttry {\n\t\taccessSync(parentDir, constants.W_OK)\n\t} catch {\n\t\treturn { isValid: false, error: `Parent directory is not writable: ${parentDir}` }\n\t}\n\n\treturn { isValid: true }\n}\n\n\n/**\n * ContributeCommand - Set up local development environment for contributing to iloom\n * Implements issue #220: streamlined contributor onboarding workflow\n */\nexport class ContributeCommand {\n\tconstructor(_initCommand?: InitCommand) {}\n\n\t/**\n\t * Main entry point for the contribute command\n\t * Automates fork creation, cloning, and upstream configuration\n\t */\n\tpublic async execute(): Promise<void> {\n\t\tlogger.info(chalk.bold('Setting up iloom contributor environment...'))\n\n\t\t// Step 1: Verify gh CLI authenticated\n\t\tconst username = await this.getAuthenticatedUsername()\n\t\tlogger.success(`Authenticated as ${chalk.cyan(username)}`)\n\n\t\t// Step 2: Check for existing fork\n\t\tconst hasFork = await this.forkExists(username)\n\n\t\t// Step 3: Create fork if needed\n\t\tif (!hasFork) {\n\t\t\tlogger.info('Creating fork of iloom-ai/iloom-cli...')\n\t\t\tawait this.createFork()\n\t\t\tlogger.success('Fork created successfully')\n\t\t} else {\n\t\t\tlogger.info('Using existing fork')\n\t\t}\n\n\t\t// Step 4: Prompt for directory with validation and retry loop\n\t\tconst directory = await this.promptForDirectory()\n\n\t\t// Handle cancelled input\n\t\tif (!directory) {\n\t\t\tlogger.info('Setup cancelled by user')\n\t\t\tprocess.exit(0)\n\t\t}\n\n\t\tconst absolutePath = path.resolve(directory)\n\n\t\t// Step 5: Clone repository (gh CLI handles SSH/HTTPS automatically based on git config)\n\t\tlogger.info(`Cloning repository to ${directory}...`)\n\t\tawait this.cloneRepository(username, directory)\n\t\tlogger.success('Repository cloned successfully')\n\n\t\t// Step 6: Add upstream remote if it doesn't exist\n\t\tawait this.addUpstreamRemote(absolutePath)\n\n\t\t// Step 7: Configure settings\n\t\tlogger.info('Configuring iloom settings...')\n\t\tawait this.configureSettings(absolutePath)\n\t\tlogger.success('Settings configured')\n\n\t\tlogger.success(chalk.bold.green('\\nContributor environment setup complete!'))\n\t\tlogger.info(`\\nNext steps:`)\n\t\tlogger.info(` 1. cd ${directory}`)\n\t\tlogger.info(` 2. pnpm install`)\n\t\tlogger.info(` 3. iloom start <issue_number>`)\n\t\tlogger.info(`\\nHappy contributing!`)\n\t}\n\n\t/**\n\t * Get authenticated GitHub username\n\t * @throws Error if not authenticated\n\t */\n\tprivate async getAuthenticatedUsername(): Promise<string> {\n\t\tconst authStatus = await checkGhAuth()\n\n\t\tif (!authStatus.hasAuth) {\n\t\t\tthrow new Error(\n\t\t\t\t'GitHub CLI is not authenticated. Please run: gh auth login'\n\t\t\t)\n\t\t}\n\n\t\tif (!authStatus.username) {\n\t\t\t// Try to fetch username from gh api if not in auth status\n\t\t\ttry {\n\t\t\t\tconst user = await executeGhCommand<{ login: string }>(['api', 'user', '--json', 'login'])\n\t\t\t\treturn user.login\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\t\tthrow new Error(`Unable to determine GitHub username: ${message}`)\n\t\t\t}\n\t\t}\n\n\t\treturn authStatus.username\n\t}\n\n\t/**\n\t * Check if user already has a fork of iloom-cli\n\t */\n\tprivate async forkExists(username: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait executeGhCommand(['api', `repos/${username}/iloom-cli`])\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\t// 404 means no fork exists\n\t\t\tif (error instanceof Error && error.message.includes('Not Found')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Re-throw unexpected errors\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t/**\n\t * Create a fork of iloom-cli without cloning\n\t */\n\tprivate async createFork(): Promise<void> {\n\t\tawait executeGhCommand(['repo', 'fork', ILOOM_REPO, '--clone=false'])\n\t}\n\n\n\t/**\n\t * Clone the repository using simplified gh CLI approach\n\t */\n\tprivate async cloneRepository(\n\t\tusername: string,\n\t\tdirectory: string\n\t): Promise<void> {\n\t\tconst repoIdentifier = `${username}/iloom-cli`\n\t\t// Always use gh repo clone - it handles SSH/HTTPS based on user's git config\n\t\tawait executeGhCommand(['repo', 'clone', repoIdentifier, directory])\n\t}\n\n\t/**\n\t * Add upstream remote if it doesn't already exist\n\t */\n\tprivate async addUpstreamRemote(directory: string): Promise<void> {\n\t\ttry {\n\t\t\t// Check if upstream remote exists\n\t\t\tawait executeGitCommand(['remote', 'get-url', 'upstream'], { cwd: directory })\n\t\t\tlogger.info('Upstream remote already configured')\n\t\t} catch {\n\t\t\t// Upstream doesn't exist, add it\n\t\t\tlogger.info('Adding upstream remote...')\n\t\t\tawait executeGitCommand(\n\t\t\t\t['remote', 'add', 'upstream', UPSTREAM_URL],\n\t\t\t\t{ cwd: directory }\n\t\t\t)\n\t\t\tlogger.success('Upstream remote configured')\n\t\t}\n\t}\n\n\t/**\n\t * Prompt for directory with validation and retry loop\n\t * @returns The validated directory path, or null if user cancels\n\t */\n\tprivate async promptForDirectory(): Promise<string | null> {\n\t\tconst maxRetries = 3\n\t\tlet attempts = 0\n\n\t\twhile (attempts < maxRetries) {\n\t\t\tconst directory = await promptInput(\n\t\t\t\t'Where should the repository be cloned?',\n\t\t\t\t'./iloom-cli'\n\t\t\t)\n\n\t\t\t// Handle empty input (user cancelled by entering empty string after exhausting default)\n\t\t\tif (!directory || directory.trim() === '') {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst trimmed = directory.trim()\n\n\t\t\t// Validate the directory path\n\t\t\tconst validation = validateDirectoryPath(trimmed)\n\t\t\tif (validation.isValid) {\n\t\t\t\treturn trimmed\n\t\t\t}\n\n\t\t\t// Show error and increment attempts\n\t\t\tattempts++\n\t\t\tif (attempts < maxRetries) {\n\t\t\t\tlogger.error(`${validation.error}`)\n\t\t\t\tlogger.info(`Please try again (${maxRetries - attempts} attempts remaining)`)\n\t\t\t} else {\n\t\t\t\tlogger.error(`${validation.error}`)\n\t\t\t\tlogger.error('Maximum retry attempts reached')\n\t\t\t\tthrow new Error(`Invalid directory after ${maxRetries} attempts: ${validation.error}`)\n\t\t\t}\n\t\t}\n\n\t\treturn null\n\t}\n\n\n\t/**\n\t * Configure .iloom/settings.json with upstream remote\n\t */\n\tprivate async configureSettings(directory: string): Promise<void> {\n\t\tconst iloomDir = path.join(directory, '.iloom')\n\t\tconst settingsPath = path.join(iloomDir, 'settings.local.json')\n\n\t\t// Create .iloom directory\n\t\tawait mkdir(iloomDir, { recursive: true })\n\n\t\t// Create settings.json with upstream remote configuration and github-pr mode\n\t\tconst settings = {\n\t\t\tissueManagement: {\n\t\t\t\tgithub: {\n\t\t\t\t\tremote: 'upstream',\n\t\t\t\t},\n\t\t\t},\n\t\t\tmergeBehavior: {\n\t\t\t\tmode: 'github-pr',\n\t\t\t},\n\t\t}\n\n\t\tawait writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\\n')\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  generateGitHubCommentMcpConfig
4
- } from "./chunk-VCMMAFXQ.js";
4
+ } from "./chunk-CVLAZRNB.js";
5
5
  import {
6
6
  AgentManager
7
7
  } from "./chunk-OC4H6HJD.js";
@@ -11,17 +11,17 @@ import {
11
11
  import {
12
12
  getConfiguredRepoFromSettings,
13
13
  hasMultipleRemotes
14
- } from "./chunk-FXV24OYZ.js";
14
+ } from "./chunk-DJUGYNQE.js";
15
15
  import {
16
16
  GitHubService
17
- } from "./chunk-ZWXJBSUW.js";
18
- import "./chunk-JXQXSC45.js";
17
+ } from "./chunk-TS6DL67T.js";
18
+ import "./chunk-SWCRXDZC.js";
19
19
  import {
20
20
  launchClaude
21
- } from "./chunk-PXZBAC2M.js";
21
+ } from "./chunk-MFU53H6J.js";
22
22
  import {
23
23
  SettingsManager
24
- } from "./chunk-VYQLLHZ7.js";
24
+ } from "./chunk-T3KEIB4D.js";
25
25
  import {
26
26
  waitForKeypress
27
27
  } from "./chunk-JNKJ7NJV.js";
@@ -173,4 +173,4 @@ IMPORTANT: When you create your analysis comment, tag @${author} in the "Questio
173
173
  export {
174
174
  EnhanceCommand
175
175
  };
176
- //# sourceMappingURL=enhance-VGWUX474.js.map
176
+ //# sourceMappingURL=enhance-MNA4ZGXW.js.map
@@ -5,21 +5,21 @@ import {
5
5
  import "./chunk-2ZPFJQ3B.js";
6
6
  import {
7
7
  IssueEnhancementService
8
- } from "./chunk-PR7FKQBG.js";
8
+ } from "./chunk-RF2YI2XJ.js";
9
9
  import {
10
10
  AgentManager
11
11
  } from "./chunk-OC4H6HJD.js";
12
12
  import "./chunk-YETJNRQM.js";
13
13
  import {
14
14
  GitHubService
15
- } from "./chunk-ZWXJBSUW.js";
16
- import "./chunk-JXQXSC45.js";
15
+ } from "./chunk-TS6DL67T.js";
16
+ import "./chunk-SWCRXDZC.js";
17
17
  import {
18
18
  getClaudeVersion
19
- } from "./chunk-PXZBAC2M.js";
19
+ } from "./chunk-MFU53H6J.js";
20
20
  import {
21
21
  SettingsManager
22
- } from "./chunk-VYQLLHZ7.js";
22
+ } from "./chunk-T3KEIB4D.js";
23
23
  import "./chunk-JNKJ7NJV.js";
24
24
  import {
25
25
  logger
@@ -155,4 +155,4 @@ ${description}`;
155
155
  export {
156
156
  FeedbackCommand
157
157
  };
158
- //# sourceMappingURL=feedback-ZOUCCHN4.js.map
158
+ //# sourceMappingURL=feedback-LFNMQBAZ.js.map