@iloom/cli 0.1.16 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -7
- package/dist/ClaudeContextManager-LD3VB6EM.js +13 -0
- package/dist/ClaudeService-CFFI7DD5.js +12 -0
- package/dist/{GitHubService-F7Z3XJOS.js → GitHubService-SH4H6VS5.js} +3 -3
- package/dist/{LoomLauncher-MODG2SEM.js → LoomLauncher-FB2MV2ZI.js} +7 -7
- package/dist/{PromptTemplateManager-7FINLRDE.js → PromptTemplateManager-WM5GIPEF.js} +2 -2
- package/dist/{SettingsManager-VAZF26S2.js → SettingsManager-SKLUVE3K.js} +6 -2
- package/dist/{add-issue-22JBNOML.js → add-issue-L5HX6LEV.js} +23 -8
- package/dist/add-issue-L5HX6LEV.js.map +1 -0
- package/dist/{chunk-U3WU5OWO.js → chunk-4XIDC3NF.js} +2 -2
- package/dist/chunk-4XIDC3NF.js.map +1 -0
- package/dist/{chunk-SSR5AVRJ.js → chunk-6OTVPRXH.js} +21 -8
- package/dist/chunk-6OTVPRXH.js.map +1 -0
- package/dist/{chunk-KQDEK2ZW.js → chunk-DGEKUT7Q.js} +9 -5
- package/dist/chunk-DGEKUT7Q.js.map +1 -0
- package/dist/chunk-FXV24OYZ.js +83 -0
- package/dist/chunk-FXV24OYZ.js.map +1 -0
- package/dist/{chunk-HPJJSYNS.js → chunk-H5LDRGVK.js} +6 -8
- package/dist/{chunk-HPJJSYNS.js.map → chunk-H5LDRGVK.js.map} +1 -1
- package/dist/{chunk-WKEWRSDB.js → chunk-HURVAQRK.js} +3 -3
- package/dist/{chunk-T7QPXANZ.js → chunk-IIPTBZQW.js} +17 -17
- package/dist/chunk-IIPTBZQW.js.map +1 -0
- package/dist/{chunk-QEPVTTHD.js → chunk-IO4WFTL2.js} +17 -11
- package/dist/chunk-IO4WFTL2.js.map +1 -0
- package/dist/{chunk-JQ7VOSTC.js → chunk-KOCQAD2E.js} +3 -3
- package/dist/{chunk-F3XBU2R7.js → chunk-L4QGC27H.js} +68 -2
- package/dist/chunk-L4QGC27H.js.map +1 -0
- package/dist/{chunk-YYSKGAZT.js → chunk-LAPY6NAE.js} +17 -8
- package/dist/chunk-LAPY6NAE.js.map +1 -0
- package/dist/{chunk-O2QWO64Z.js → chunk-PV3GAXQO.js} +56 -3
- package/dist/chunk-PV3GAXQO.js.map +1 -0
- package/dist/{chunk-CP2NU2JC.js → chunk-Q2KYPAH2.js} +7 -7
- package/dist/{chunk-CP2NU2JC.js.map → chunk-Q2KYPAH2.js.map} +1 -1
- package/dist/{chunk-Y7SAGNUT.js → chunk-SLIMABFA.js} +2 -2
- package/dist/{chunk-W3DQTW63.js → chunk-USVVV3FP.js} +4 -4
- package/dist/chunk-VVH3ANF2.js +307 -0
- package/dist/chunk-VVH3ANF2.js.map +1 -0
- package/dist/{chunk-JBH2ZYYZ.js → chunk-VYQLLHZ7.js} +22 -3
- package/dist/chunk-VYQLLHZ7.js.map +1 -0
- package/dist/{chunk-SJUQ2NDR.js → chunk-ZMNQBJUI.js} +24 -19
- package/dist/chunk-ZMNQBJUI.js.map +1 -0
- package/dist/{cleanup-3LUWPSM7.js → cleanup-ZHROIBSQ.js} +12 -16
- package/dist/cleanup-ZHROIBSQ.js.map +1 -0
- package/dist/cli.js +97 -49
- package/dist/cli.js.map +1 -1
- package/dist/{enhance-XJIQHVPD.js → enhance-VVMAKMVZ.js} +18 -8
- package/dist/enhance-VVMAKMVZ.js.map +1 -0
- package/dist/{feedback-23CLXKFT.js → feedback-AKHD7QIM.js} +8 -8
- package/dist/{finish-CY4CIH6O.js → finish-WGPISUEH.js} +60 -313
- package/dist/finish-WGPISUEH.js.map +1 -0
- package/dist/{git-LVRZ57GJ.js → git-OUYMVYJX.js} +2 -2
- package/dist/{ignite-WXEF2ID5.js → ignite-JEN3K3OT.js} +7 -7
- package/dist/index.d.ts +791 -712
- package/dist/index.js +126 -32
- package/dist/index.js.map +1 -1
- package/dist/init-EVUT4ZQJ.js +339 -0
- package/dist/init-EVUT4ZQJ.js.map +1 -0
- package/dist/mcp/github-comment-server.js +12 -9
- package/dist/mcp/github-comment-server.js.map +1 -1
- package/dist/neon-helpers-ZVIRPKCI.js +10 -0
- package/dist/{open-X6BTENPV.js → open-ETZUFSE4.js} +15 -17
- package/dist/{open-X6BTENPV.js.map → open-ETZUFSE4.js.map} +1 -1
- package/dist/prompts/init-prompt.txt +746 -0
- package/dist/prompts/issue-prompt.txt +48 -5
- package/dist/prompts/pr-prompt.txt +46 -1
- package/dist/prompts/regular-prompt.txt +22 -0
- package/dist/rebase-KBWFDZCN.js +95 -0
- package/dist/rebase-KBWFDZCN.js.map +1 -0
- package/dist/remote-GJEZWRCC.js +14 -0
- package/dist/{run-2JCPQAX3.js → run-4SVQ3WEU.js} +15 -17
- package/dist/{run-2JCPQAX3.js.map → run-4SVQ3WEU.js.map} +1 -1
- package/dist/schema/settings.schema.json +51 -1
- package/dist/{start-LWVRBJ6S.js → start-2NEZU7SE.js} +54 -53
- package/dist/{start-LWVRBJ6S.js.map → start-2NEZU7SE.js.map} +1 -1
- package/dist/{test-git-XPF4SZXJ.js → test-git-MKZATGZN.js} +3 -3
- package/dist/{test-prefix-XGFXFAYN.js → test-prefix-ZNLWDI3K.js} +3 -3
- package/dist/{update-3ZT2XX2G.js → update-4TDDUR5K.js} +11 -5
- package/dist/{update-3ZT2XX2G.js.map → update-4TDDUR5K.js.map} +1 -1
- package/dist/{update-notifier-QSSEB5KC.js → update-notifier-QEX3CJHA.js} +2 -2
- package/package.json +1 -1
- package/dist/ClaudeContextManager-XOSXQ67R.js +0 -13
- package/dist/ClaudeService-YSZ6EXWP.js +0 -12
- package/dist/NeonProvider-PAGPUH7F.js +0 -12
- package/dist/add-issue-22JBNOML.js.map +0 -1
- package/dist/chunk-37DYYFVK.js +0 -29
- package/dist/chunk-37DYYFVK.js.map +0 -1
- package/dist/chunk-F3XBU2R7.js.map +0 -1
- package/dist/chunk-JBH2ZYYZ.js.map +0 -1
- package/dist/chunk-KQDEK2ZW.js.map +0 -1
- package/dist/chunk-O2QWO64Z.js.map +0 -1
- package/dist/chunk-QEPVTTHD.js.map +0 -1
- package/dist/chunk-SJUQ2NDR.js.map +0 -1
- package/dist/chunk-SSR5AVRJ.js.map +0 -1
- package/dist/chunk-T7QPXANZ.js.map +0 -1
- package/dist/chunk-U3WU5OWO.js.map +0 -1
- package/dist/chunk-YYSKGAZT.js.map +0 -1
- package/dist/cleanup-3LUWPSM7.js.map +0 -1
- package/dist/enhance-XJIQHVPD.js.map +0 -1
- package/dist/env-MDFL4ZXL.js +0 -23
- package/dist/finish-CY4CIH6O.js.map +0 -1
- package/dist/init-RHACUR4E.js +0 -123
- package/dist/init-RHACUR4E.js.map +0 -1
- /package/dist/{ClaudeContextManager-XOSXQ67R.js.map → ClaudeContextManager-LD3VB6EM.js.map} +0 -0
- /package/dist/{ClaudeService-YSZ6EXWP.js.map → ClaudeService-CFFI7DD5.js.map} +0 -0
- /package/dist/{GitHubService-F7Z3XJOS.js.map → GitHubService-SH4H6VS5.js.map} +0 -0
- /package/dist/{LoomLauncher-MODG2SEM.js.map → LoomLauncher-FB2MV2ZI.js.map} +0 -0
- /package/dist/{NeonProvider-PAGPUH7F.js.map → PromptTemplateManager-WM5GIPEF.js.map} +0 -0
- /package/dist/{PromptTemplateManager-7FINLRDE.js.map → SettingsManager-SKLUVE3K.js.map} +0 -0
- /package/dist/{chunk-WKEWRSDB.js.map → chunk-HURVAQRK.js.map} +0 -0
- /package/dist/{chunk-JQ7VOSTC.js.map → chunk-KOCQAD2E.js.map} +0 -0
- /package/dist/{chunk-Y7SAGNUT.js.map → chunk-SLIMABFA.js.map} +0 -0
- /package/dist/{chunk-W3DQTW63.js.map → chunk-USVVV3FP.js.map} +0 -0
- /package/dist/{feedback-23CLXKFT.js.map → feedback-AKHD7QIM.js.map} +0 -0
- /package/dist/{SettingsManager-VAZF26S2.js.map → git-OUYMVYJX.js.map} +0 -0
- /package/dist/{ignite-WXEF2ID5.js.map → ignite-JEN3K3OT.js.map} +0 -0
- /package/dist/{env-MDFL4ZXL.js.map → neon-helpers-ZVIRPKCI.js.map} +0 -0
- /package/dist/{git-LVRZ57GJ.js.map → remote-GJEZWRCC.js.map} +0 -0
- /package/dist/{test-git-XPF4SZXJ.js.map → test-git-MKZATGZN.js.map} +0 -0
- /package/dist/{test-prefix-XGFXFAYN.js.map → test-prefix-ZNLWDI3K.js.map} +0 -0
- /package/dist/{update-notifier-QSSEB5KC.js.map → update-notifier-QEX3CJHA.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/cleanup.ts"],"sourcesContent":["import { logger } from '../utils/logger.js'\nimport { GitWorktreeManager } from '../lib/GitWorktreeManager.js'\nimport { ResourceCleanup } from '../lib/ResourceCleanup.js'\nimport { ProcessManager } from '../lib/process/ProcessManager.js'\nimport { DatabaseManager } from '../lib/DatabaseManager.js'\nimport { EnvironmentManager } from '../lib/EnvironmentManager.js'\nimport { CLIIsolationManager } from '../lib/CLIIsolationManager.js'\nimport { SettingsManager } from '../lib/SettingsManager.js'\nimport { promptConfirmation } from '../utils/prompt.js'\nimport { IdentifierParser } from '../utils/IdentifierParser.js'\nimport { loadEnvIntoProcess } from '../utils/env.js'\nimport { createNeonProviderFromSettings } from '../utils/neon-helpers.js'\nimport type { CleanupOptions } from '../types/index.js'\nimport type { CleanupResult } from '../types/cleanup.js'\nimport type { ParsedInput } from './start.js'\n\n/**\n * Input structure for CleanupCommand.execute()\n */\nexport interface CleanupCommandInput {\n identifier?: string\n options: CleanupOptions\n}\n\n/**\n * Parsed and validated cleanup command input\n * Mode determines which cleanup operation to perform\n */\nexport interface ParsedCleanupInput {\n mode: 'list' | 'single' | 'issue' | 'all'\n identifier?: string\n issueNumber?: number\n branchName?: string\n originalInput?: string\n options: CleanupOptions\n}\n\n/**\n * Manages cleanup command execution with option parsing and validation\n * Follows the command pattern established by StartCommand\n *\n * This implementation handles ONLY parsing, validation, and mode determination.\n * Actual cleanup operations are deferred to subsequent sub-issues.\n */\nexport class CleanupCommand {\n private readonly gitWorktreeManager: GitWorktreeManager\n private resourceCleanup?: ResourceCleanup\n private readonly identifierParser: IdentifierParser\n\n constructor(\n gitWorktreeManager?: GitWorktreeManager,\n resourceCleanup?: ResourceCleanup\n ) {\n // Load environment variables first\n const envResult = loadEnvIntoProcess()\n if (envResult.error) {\n logger.debug(`Environment loading warning: ${envResult.error.message}`)\n }\n if (envResult.parsed) {\n logger.debug(`Loaded ${Object.keys(envResult.parsed).length} environment variables`)\n }\n\n this.gitWorktreeManager = gitWorktreeManager ?? new GitWorktreeManager()\n\n // Initialize ResourceCleanup with DatabaseManager and CLIIsolationManager\n // ResourceCleanup will be initialized lazily with proper configuration\n if (resourceCleanup) {\n this.resourceCleanup = resourceCleanup\n }\n\n // Initialize IdentifierParser for pattern-based detection\n this.identifierParser = new IdentifierParser(this.gitWorktreeManager)\n }\n\n /**\n * Lazy initialization of ResourceCleanup with properly configured DatabaseManager\n */\n private async ensureResourceCleanup(): Promise<void> {\n if (this.resourceCleanup) {\n return\n }\n\n const settingsManager = new SettingsManager()\n const settings = await settingsManager.loadSettings()\n const databaseUrlEnvVarName = settings.capabilities?.database?.databaseUrlEnvVarName ?? 'DATABASE_URL'\n\n const environmentManager = new EnvironmentManager()\n const neonProvider = createNeonProviderFromSettings(settings)\n const databaseManager = new DatabaseManager(neonProvider, environmentManager, databaseUrlEnvVarName)\n const cliIsolationManager = new CLIIsolationManager()\n\n this.resourceCleanup = new ResourceCleanup(\n this.gitWorktreeManager,\n new ProcessManager(),\n databaseManager,\n cliIsolationManager\n )\n }\n\n /**\n * Main entry point for the cleanup command\n * Parses input, validates options, and determines operation mode\n */\n public async execute(input: CleanupCommandInput): Promise<void> {\n try {\n // Step 1: Parse input and determine mode\n const parsed = this.parseInput(input)\n\n // Step 2: Validate option combinations\n this.validateInput(parsed)\n\n // Step 3: Execute based on mode\n logger.info(`Cleanup mode: ${parsed.mode}`)\n\n if (parsed.mode === 'single') {\n await this.executeSingleCleanup(parsed)\n } else if (parsed.mode === 'list') {\n logger.info('Would list all worktrees') // TODO: Implement in Sub-issue #2\n logger.success('Command parsing and validation successful')\n } else if (parsed.mode === 'all') {\n logger.info('Would remove all worktrees') // TODO: Implement in Sub-issue #5\n logger.success('Command parsing and validation successful')\n } else if (parsed.mode === 'issue') {\n await this.executeIssueCleanup(parsed)\n }\n } catch (error) {\n if (error instanceof Error) {\n logger.error(`${error.message}`)\n } else {\n logger.error('An unknown error occurred')\n }\n throw error\n }\n }\n\n /**\n * Parse input to determine cleanup mode and extract relevant data\n * Implements auto-detection: numeric input = issue number, non-numeric = branch name\n *\n * @private\n */\n private parseInput(input: CleanupCommandInput): ParsedCleanupInput {\n const { identifier, options } = input\n\n // Trim identifier if present\n const trimmedIdentifier = identifier?.trim() ?? undefined\n\n // Mode: List (takes priority - it's informational only)\n if (options.list) {\n const result: ParsedCleanupInput = {\n mode: 'list',\n options\n }\n if (trimmedIdentifier) {\n result.identifier = trimmedIdentifier\n }\n return result\n }\n\n // Mode: All (remove everything)\n if (options.all) {\n const result: ParsedCleanupInput = {\n mode: 'all',\n options\n }\n if (trimmedIdentifier) {\n result.identifier = trimmedIdentifier\n }\n if (options.issue !== undefined) {\n result.issueNumber = options.issue\n }\n return result\n }\n\n // Mode: Explicit issue number via --issue flag\n if (options.issue !== undefined) {\n // Need to determine if identifier is branch or numeric to set branchName\n if (trimmedIdentifier) {\n const numericPattern = /^[0-9]+$/\n if (!numericPattern.test(trimmedIdentifier)) {\n // Identifier is a branch name with explicit --issue flag\n return {\n mode: 'issue',\n issueNumber: options.issue,\n branchName: trimmedIdentifier,\n identifier: trimmedIdentifier,\n originalInput: trimmedIdentifier,\n options\n }\n }\n }\n const result: ParsedCleanupInput = {\n mode: 'issue',\n issueNumber: options.issue,\n options\n }\n if (trimmedIdentifier) {\n result.identifier = trimmedIdentifier\n }\n return result\n }\n\n // Mode: Auto-detect from identifier\n if (!trimmedIdentifier) {\n throw new Error('Missing required argument: identifier. Use --all to remove all worktrees or --list to list them.')\n }\n\n // Auto-detection: Check if identifier is purely numeric\n // Pattern from bash script line 364: ^[0-9]+$\n const numericPattern = /^[0-9]+$/\n if (numericPattern.test(trimmedIdentifier)) {\n // Numeric input = issue number\n return {\n mode: 'issue',\n issueNumber: parseInt(trimmedIdentifier, 10),\n identifier: trimmedIdentifier,\n originalInput: trimmedIdentifier,\n options\n }\n } else {\n // Non-numeric = branch name\n return {\n mode: 'single',\n branchName: trimmedIdentifier,\n identifier: trimmedIdentifier,\n originalInput: trimmedIdentifier,\n options\n }\n }\n }\n\n /**\n * Validate parsed input for option conflicts\n * Throws descriptive errors for invalid option combinations\n *\n * @private\n */\n private validateInput(parsed: ParsedCleanupInput): void {\n const { mode, options, branchName } = parsed\n\n // Conflict: --list is informational only, incompatible with destructive operations\n if (mode === 'list') {\n if (options.all) {\n throw new Error('Cannot use --list with --all (list is informational only)')\n }\n if (options.issue !== undefined) {\n throw new Error('Cannot use --list with --issue (list is informational only)')\n }\n if (parsed.identifier) {\n throw new Error('Cannot use --list with a specific identifier (list shows all worktrees)')\n }\n }\n\n // Conflict: --all removes everything, can't combine with specific identifier or --issue\n if (mode === 'all') {\n if (parsed.identifier) {\n throw new Error('Cannot use --all with a specific identifier. Use one or the other.')\n }\n if (parsed.issueNumber !== undefined) {\n throw new Error('Cannot use --all with a specific identifier. Use one or the other.')\n }\n }\n\n // Conflict: explicit --issue flag with branch name identifier\n // (This prevents confusion when user provides both)\n if (options.issue !== undefined && branchName) {\n throw new Error('Cannot use --issue flag with branch name identifier. Use numeric identifier or --issue flag alone.')\n }\n\n // Note: --force and --dry-run are compatible with all modes (no conflicts)\n }\n\n /**\n * Execute cleanup for single worktree\n * Implements two-stage confirmation: worktree removal, then branch deletion\n * Uses IdentifierParser for pattern-based detection without GitHub API calls\n */\n private async executeSingleCleanup(parsed: ParsedCleanupInput): Promise<void> {\n const identifier = parsed.branchName ?? parsed.identifier ?? ''\n if (!identifier) {\n throw new Error('No identifier found for cleanup')\n }\n const { force, dryRun } = parsed.options\n\n // Step 1: Parse identifier using pattern-based detection\n const parsedInput: ParsedInput = await this.identifierParser.parseForPatternDetection(identifier)\n\n // Step 2: Display worktree details\n logger.info(`Preparing to cleanup worktree: ${identifier}`)\n\n // Step 3: Confirmation - worktree removal\n if (!force) {\n const confirmWorktree = await promptConfirmation('Remove this worktree?', true)\n if (!confirmWorktree) {\n logger.info('Cleanup cancelled')\n return\n }\n }\n\n // Step 4: Execute worktree cleanup (includes safety validation)\n // With --force, delete branch automatically; otherwise handle separately\n await this.ensureResourceCleanup()\n if (!this.resourceCleanup) {\n throw new Error('Failed to initialize ResourceCleanup')\n }\n const cleanupResult = await this.resourceCleanup.cleanupWorktree(parsedInput, {\n dryRun: dryRun ?? false,\n force: force ?? false,\n deleteBranch: force ?? false, // Delete branch immediately if --force, otherwise prompt later\n keepDatabase: false,\n })\n\n // Step 5: Report cleanup results\n this.reportCleanupResults(cleanupResult)\n\n // Step 6: Second confirmation - branch deletion (only if not forced and worktree cleanup succeeded)\n if (cleanupResult.success && !force && cleanupResult.branchName) {\n const confirmBranch = await promptConfirmation('Also delete the git branch?', true)\n if (confirmBranch) {\n await this.deleteBranchForCleanup(cleanupResult.branchName, { force: force ?? false, dryRun: dryRun ?? false })\n }\n }\n\n // Final success message\n if (cleanupResult.success) {\n logger.success('Cleanup completed successfully')\n } else {\n logger.warn('Cleanup completed with errors - see details above')\n }\n }\n\n /**\n * Delete branch as part of cleanup operation\n */\n private async deleteBranchForCleanup(\n branchName: string,\n options: { force?: boolean; dryRun?: boolean }\n ): Promise<void> {\n try {\n await this.ensureResourceCleanup()\n if (!this.resourceCleanup) {\n throw new Error('Failed to initialize ResourceCleanup')\n }\n await this.resourceCleanup.deleteBranch(branchName, options)\n logger.success(`Branch deleted: ${branchName}`)\n } catch (error) {\n if (error instanceof Error) {\n logger.error(`Failed to delete branch: ${error.message}`)\n }\n // Don't throw - branch deletion is optional/secondary operation\n }\n }\n\n /**\n * Report cleanup operation results to user\n */\n private reportCleanupResults(result: CleanupResult): void {\n logger.info('Cleanup operations:')\n\n result.operations.forEach(op => {\n const status = op.success ? '✓' : '✗'\n const message = op.error ? `${op.message}: ${op.error}` : op.message\n\n if (op.success) {\n logger.info(` ${status} ${message}`)\n } else {\n logger.error(` ${status} ${message}`)\n }\n })\n\n if (result.errors.length > 0) {\n logger.warn(`${result.errors.length} error(s) occurred during cleanup`)\n }\n }\n\n /**\n * Execute cleanup for all worktrees associated with an issue or PR number\n * Searches for worktrees by their path patterns (e.g., issue-25, pr-25, 25-feature, _pr_25)\n * Implements bash cleanup-worktree.sh remove_worktrees_by_issue() (lines 157-242)\n */\n private async executeIssueCleanup(parsed: ParsedCleanupInput): Promise<void> {\n const issueNumber = parsed.issueNumber\n if (issueNumber === undefined) {\n throw new Error('No issue/PR number provided for cleanup')\n }\n\n const { force, dryRun } = parsed.options\n\n logger.info(`Finding worktrees related to GitHub issue/PR #${issueNumber}...`)\n\n // Step 1: Get all worktrees and filter by path pattern\n const worktrees = await this.gitWorktreeManager.listWorktrees()\n const matchingWorktrees = worktrees.filter(wt => {\n const path = wt.path.toLowerCase()\n const numStr = String(issueNumber)\n\n // Check if path contains the number with proper word boundaries\n // Matches: issue-25, pr-25, 25-feature, _pr_25, etc.\n // Does NOT match: issue-250, 125-feature (where 25 is part of a larger number)\n const pattern = new RegExp(`(?<!\\\\d)${numStr}(?!\\\\d)`)\n return pattern.test(path)\n })\n\n if (matchingWorktrees.length === 0) {\n logger.warn(`No worktrees found for GitHub issue/PR #${issueNumber}`)\n logger.info(`Searched for worktree paths containing: ${issueNumber}, _pr_${issueNumber}, issue-${issueNumber}, etc.`)\n return\n }\n\n // Step 2: Build targets list from matching worktrees\n const targets: Array<{ branchName: string; hasWorktree: boolean; worktreePath?: string }> =\n matchingWorktrees.map(wt => ({\n branchName: wt.branch,\n hasWorktree: true,\n worktreePath: wt.path\n }))\n\n // Step 3: Display preview\n logger.info(`Found ${targets.length} worktree(s) related to issue/PR #${issueNumber}:`)\n for (const target of targets) {\n logger.info(` 🌿 ${target.branchName} (${target.worktreePath})`)\n }\n\n // Step 4: Batch confirmation (unless --force)\n if (!force) {\n const confirmCleanup = await promptConfirmation(\n `Remove ${targets.length} worktree(s)?`,\n true\n )\n if (!confirmCleanup) {\n logger.info('Cleanup cancelled')\n return\n }\n }\n\n // Step 5: Process each target sequentially\n let worktreesRemoved = 0\n let branchesDeleted = 0\n const databaseBranchesDeletedList: string[] = []\n let failed = 0\n\n for (const target of targets) {\n logger.info(`Processing worktree: ${target.branchName}`)\n\n // Cleanup worktree using ResourceCleanup with ParsedInput\n try {\n // Parse the branch name using IdentifierParser\n const parsedInput: ParsedInput = await this.identifierParser.parseForPatternDetection(target.branchName)\n\n await this.ensureResourceCleanup()\n if (!this.resourceCleanup) {\n throw new Error('Failed to initialize ResourceCleanup')\n }\n const result = await this.resourceCleanup.cleanupWorktree(parsedInput, {\n dryRun: dryRun ?? false,\n force: force ?? false,\n deleteBranch: false, // Handle branch deletion separately\n keepDatabase: false\n })\n\n if (result.success) {\n worktreesRemoved++\n logger.success(` Worktree removed: ${target.branchName}`)\n\n // Check if database branch was actually deleted (use explicit deleted field)\n const dbOperation = result.operations.find(op => op.type === 'database')\n if (dbOperation?.deleted) {\n // Get branch name from result or use the target branch name\n const deletedBranchName = target.branchName\n databaseBranchesDeletedList.push(deletedBranchName)\n }\n } else {\n failed++\n logger.error(` Failed to remove worktree: ${target.branchName}`)\n }\n } catch (error) {\n failed++\n const errMsg = error instanceof Error ? error.message : 'Unknown error'\n logger.error(` Failed to remove worktree: ${errMsg}`)\n continue // Continue with next worktree even if this one failed\n }\n\n // Step 6: Delete branch\n try {\n await this.ensureResourceCleanup()\n if (!this.resourceCleanup) {\n throw new Error('Failed to initialize ResourceCleanup')\n }\n await this.resourceCleanup.deleteBranch(target.branchName, {\n force: force ?? false,\n dryRun: dryRun ?? false\n })\n branchesDeleted++\n logger.success(` Branch deleted: ${target.branchName}`)\n } catch (error) {\n // Don't count unmerged branch as failure - it's a safety feature\n const errMsg = error instanceof Error ? error.message : String(error)\n if (errMsg.includes('not fully merged')) {\n logger.warn(` Branch not fully merged, skipping deletion`)\n logger.warn(` Use --force to delete anyway`)\n } else {\n // Other errors are real failures\n logger.error(` Failed to delete branch: ${errMsg}`)\n }\n }\n }\n\n // Step 7: Report statistics\n logger.success(`Completed cleanup for issue/PR #${issueNumber}:`)\n logger.info(` 📁 Worktrees removed: ${worktreesRemoved}`)\n logger.info(` 🌿 Branches deleted: ${branchesDeleted}`)\n if (databaseBranchesDeletedList.length > 0) {\n // Display branch names in the format requested\n logger.info(` 🗂️ Database branches deleted: ${databaseBranchesDeletedList.join(', ')}`)\n }\n if (failed > 0) {\n logger.warn(` ❌ Failed operations: ${failed}`)\n }\n }\n}\n"],"mappings":"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","names":["numericPattern"]}
|
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
ShellCompletion
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-PV3GAXQO.js";
|
|
5
5
|
import {
|
|
6
6
|
GitWorktreeManager
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-IO4WFTL2.js";
|
|
8
|
+
import "./chunk-KOCQAD2E.js";
|
|
9
9
|
import {
|
|
10
10
|
logger
|
|
11
11
|
} from "./chunk-GEHQXLEI.js";
|
|
@@ -53,7 +53,7 @@ program.name("iloom").description(packageJson.description).version(packageJson.v
|
|
|
53
53
|
process.exit(0);
|
|
54
54
|
}
|
|
55
55
|
try {
|
|
56
|
-
const { checkAndNotifyUpdate } = await import("./update-notifier-
|
|
56
|
+
const { checkAndNotifyUpdate } = await import("./update-notifier-QEX3CJHA.js");
|
|
57
57
|
const { detectInstallationMethod } = await import("./installation-detector-VARGFFRZ.js");
|
|
58
58
|
const installMethod = detectInstallationMethod(__filename);
|
|
59
59
|
await checkAndNotifyUpdate(packageJson.version, packageJson.name, installMethod);
|
|
@@ -66,19 +66,66 @@ program.name("iloom").description(packageJson.description).version(packageJson.v
|
|
|
66
66
|
} catch (error) {
|
|
67
67
|
logger.debug(`Settings migration failed: ${error instanceof Error ? error.message : "Unknown"}`);
|
|
68
68
|
}
|
|
69
|
-
await validateSettingsForCommand();
|
|
69
|
+
await validateSettingsForCommand(thisCommand);
|
|
70
70
|
});
|
|
71
|
-
async function validateSettingsForCommand() {
|
|
71
|
+
async function validateSettingsForCommand(command) {
|
|
72
|
+
var _a, _b;
|
|
73
|
+
const commandName = command.args[0] ?? "";
|
|
74
|
+
const bypassCommands = ["help", "init", "update"];
|
|
75
|
+
if (bypassCommands.includes(commandName)) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
72
78
|
try {
|
|
73
|
-
const { SettingsManager } = await import("./SettingsManager-
|
|
79
|
+
const { SettingsManager } = await import("./SettingsManager-SKLUVE3K.js");
|
|
74
80
|
const settingsManager = new SettingsManager();
|
|
75
|
-
await settingsManager.loadSettings();
|
|
81
|
+
const settings = await settingsManager.loadSettings();
|
|
82
|
+
const { hasMultipleRemotes } = await import("./remote-GJEZWRCC.js");
|
|
83
|
+
const multipleRemotes = await hasMultipleRemotes();
|
|
84
|
+
if (multipleRemotes && !((_b = (_a = settings.issueManagement) == null ? void 0 : _a.github) == null ? void 0 : _b.remote)) {
|
|
85
|
+
await autoLaunchInitForMultipleRemotes();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
76
88
|
} catch (error) {
|
|
77
89
|
logger.error(`Configuration error: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
78
90
|
logger.info("Please fix your .iloom/settings.json file and try again.");
|
|
79
91
|
process.exit(1);
|
|
80
92
|
}
|
|
81
93
|
}
|
|
94
|
+
async function autoLaunchInitForMultipleRemotes() {
|
|
95
|
+
var _a, _b;
|
|
96
|
+
logger.info("Multiple git remotes detected, but no GitHub remote is configured.");
|
|
97
|
+
logger.info("");
|
|
98
|
+
logger.info("iloom will now launch an interactive configuration session with Claude");
|
|
99
|
+
logger.info("to help you select which remote to use for GitHub operations.");
|
|
100
|
+
logger.info("");
|
|
101
|
+
const { waitForKeypress } = await import("./prompt-ANTQWHUF.js");
|
|
102
|
+
await waitForKeypress("Press any key to start configuration...");
|
|
103
|
+
logger.info("");
|
|
104
|
+
try {
|
|
105
|
+
const { InitCommand } = await import("./init-EVUT4ZQJ.js");
|
|
106
|
+
const initCommand = new InitCommand();
|
|
107
|
+
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.";
|
|
108
|
+
await initCommand.execute(customInitialMessage);
|
|
109
|
+
logger.info("");
|
|
110
|
+
logger.info("Configuration complete! Continuing with your original command...");
|
|
111
|
+
logger.info("");
|
|
112
|
+
const { SettingsManager } = await import("./SettingsManager-SKLUVE3K.js");
|
|
113
|
+
const settingsManager = new SettingsManager();
|
|
114
|
+
const settings = await settingsManager.loadSettings();
|
|
115
|
+
const { hasMultipleRemotes } = await import("./remote-GJEZWRCC.js");
|
|
116
|
+
const multipleRemotes = await hasMultipleRemotes();
|
|
117
|
+
if (multipleRemotes && !((_b = (_a = settings.issueManagement) == null ? void 0 : _a.github) == null ? void 0 : _b.remote)) {
|
|
118
|
+
logger.error("Configuration incomplete: GitHub remote is still not configured.");
|
|
119
|
+
logger.info('Please run "iloom init" again and configure the GitHub remote setting.');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
} catch (error) {
|
|
124
|
+
logger.error(`Failed to configure remotes: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
125
|
+
logger.info('You can manually run "iloom init" to configure settings.');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
82
129
|
var shellCompletion = new ShellCompletion();
|
|
83
130
|
shellCompletion.init();
|
|
84
131
|
program.command("start").alias("create").alias("up").description("Create isolated workspace for an issue/PR").argument("[identifier]", "Issue number, PR number, or branch name (optional - will prompt if not provided)").option("--claude", "Enable Claude integration (default: true)").option("--no-claude", "Disable Claude integration").option("--code", "Enable VSCode (default: true)").option("--no-code", "Disable VSCode").option("--dev-server", "Enable dev server in terminal (default: true)").option("--no-dev-server", "Disable dev server").option("--terminal", "Enable terminal without dev server (default: false)").option("--no-terminal", "Disable terminal").addOption(
|
|
@@ -94,7 +141,7 @@ program.command("start").alias("create").alias("up").description("Create isolate
|
|
|
94
141
|
process.exit(1);
|
|
95
142
|
}
|
|
96
143
|
}
|
|
97
|
-
const { StartCommand } = await import("./start-
|
|
144
|
+
const { StartCommand } = await import("./start-2NEZU7SE.js");
|
|
98
145
|
const command = new StartCommand();
|
|
99
146
|
await command.execute({ identifier: finalIdentifier, options });
|
|
100
147
|
} catch (error) {
|
|
@@ -104,7 +151,7 @@ program.command("start").alias("create").alias("up").description("Create isolate
|
|
|
104
151
|
});
|
|
105
152
|
program.command("add-issue").alias("a").description("Create and enhance GitHub issue without starting workspace").argument("<description>", "Natural language description of the issue (>50 chars, >2 spaces)").action(async (description) => {
|
|
106
153
|
try {
|
|
107
|
-
const { AddIssueCommand } = await import("./add-issue-
|
|
154
|
+
const { AddIssueCommand } = await import("./add-issue-L5HX6LEV.js");
|
|
108
155
|
const command = new AddIssueCommand();
|
|
109
156
|
const issueNumber = await command.execute({
|
|
110
157
|
description,
|
|
@@ -119,7 +166,7 @@ program.command("add-issue").alias("a").description("Create and enhance GitHub i
|
|
|
119
166
|
});
|
|
120
167
|
program.command("feedback").alias("f").description("Submit feedback/bug report to iloom-cli repository").argument("<description>", "Natural language description of feedback (>50 chars, >2 spaces)").action(async (description) => {
|
|
121
168
|
try {
|
|
122
|
-
const { FeedbackCommand } = await import("./feedback-
|
|
169
|
+
const { FeedbackCommand } = await import("./feedback-AKHD7QIM.js");
|
|
123
170
|
const command = new FeedbackCommand();
|
|
124
171
|
const issueNumber = await command.execute({
|
|
125
172
|
description,
|
|
@@ -134,7 +181,7 @@ program.command("feedback").alias("f").description("Submit feedback/bug report t
|
|
|
134
181
|
});
|
|
135
182
|
program.command("enhance").description("Apply enhancement agent to existing GitHub issue").argument("<issue-number>", "GitHub issue number to enhance", parseInt).option("--no-browser", "Skip browser opening prompt").option("--author <username>", "GitHub username to tag in questions (for CI usage)").action(async (issueNumber, options) => {
|
|
136
183
|
try {
|
|
137
|
-
const { EnhanceCommand } = await import("./enhance-
|
|
184
|
+
const { EnhanceCommand } = await import("./enhance-VVMAKMVZ.js");
|
|
138
185
|
const command = new EnhanceCommand();
|
|
139
186
|
await command.execute({
|
|
140
187
|
issueNumber,
|
|
@@ -152,7 +199,7 @@ program.command("enhance").description("Apply enhancement agent to existing GitH
|
|
|
152
199
|
});
|
|
153
200
|
program.command("finish").alias("dn").description("Merge work and cleanup workspace").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("-f, --force", "Skip confirmation prompts").option("-n, --dry-run", "Preview actions without executing").option("--pr <number>", "Treat input as PR number", parseFloat).option("--skip-build", "Skip post-merge build verification").action(async (identifier, options) => {
|
|
154
201
|
try {
|
|
155
|
-
const { FinishCommand } = await import("./finish-
|
|
202
|
+
const { FinishCommand } = await import("./finish-WGPISUEH.js");
|
|
156
203
|
const command = new FinishCommand();
|
|
157
204
|
await command.execute({ identifier, options });
|
|
158
205
|
} catch (error) {
|
|
@@ -160,11 +207,21 @@ program.command("finish").alias("dn").description("Merge work and cleanup worksp
|
|
|
160
207
|
process.exit(1);
|
|
161
208
|
}
|
|
162
209
|
});
|
|
210
|
+
program.command("rebase").description("Rebase current branch on main with Claude-assisted conflict resolution").option("-f, --force", "Skip confirmation prompts").option("-n, --dry-run", "Preview actions without executing").action(async (options) => {
|
|
211
|
+
try {
|
|
212
|
+
const { RebaseCommand } = await import("./rebase-KBWFDZCN.js");
|
|
213
|
+
const command = new RebaseCommand();
|
|
214
|
+
await command.execute(options);
|
|
215
|
+
} catch (error) {
|
|
216
|
+
logger.error(`Failed to rebase: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
163
220
|
program.command("spin").alias("ignite").description("Launch Claude with auto-detected workspace context").addOption(
|
|
164
221
|
new Option("--one-shot <mode>", "One-shot automation mode").choices(["default", "noReview", "bypassPermissions"]).default("default")
|
|
165
222
|
).action(async (options) => {
|
|
166
223
|
try {
|
|
167
|
-
const { IgniteCommand } = await import("./ignite-
|
|
224
|
+
const { IgniteCommand } = await import("./ignite-JEN3K3OT.js");
|
|
168
225
|
const command = new IgniteCommand();
|
|
169
226
|
await command.execute(options.oneShot ?? "default");
|
|
170
227
|
} catch (error) {
|
|
@@ -175,7 +232,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
|
|
|
175
232
|
program.command("open").description("Open workspace in browser or run CLI tool").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
|
|
176
233
|
try {
|
|
177
234
|
const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
|
|
178
|
-
const { OpenCommand } = await import("./open-
|
|
235
|
+
const { OpenCommand } = await import("./open-ETZUFSE4.js");
|
|
179
236
|
const cmd = new OpenCommand();
|
|
180
237
|
const input = identifier ? { identifier, args } : { args };
|
|
181
238
|
await cmd.execute(input);
|
|
@@ -187,7 +244,7 @@ program.command("open").description("Open workspace in browser or run CLI tool")
|
|
|
187
244
|
program.command("run").description("Run CLI tool or open workspace in browser").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
|
|
188
245
|
try {
|
|
189
246
|
const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
|
|
190
|
-
const { RunCommand } = await import("./run-
|
|
247
|
+
const { RunCommand } = await import("./run-4SVQ3WEU.js");
|
|
191
248
|
const cmd = new RunCommand();
|
|
192
249
|
const input = identifier ? { identifier, args } : { args };
|
|
193
250
|
await cmd.execute(input);
|
|
@@ -198,7 +255,7 @@ program.command("run").description("Run CLI tool or open workspace in browser").
|
|
|
198
255
|
});
|
|
199
256
|
program.command("cleanup").description("Remove workspaces").argument("[identifier]", "Branch name or issue number to cleanup (auto-detected)").option("-l, --list", "List all worktrees").option("-a, --all", "Remove all worktrees (interactive confirmation)").option("-i, --issue <number>", "Cleanup by issue number", parseInt).option("-f, --force", "Skip confirmations and force removal").option("--dry-run", "Show what would be done without doing it").action(async (identifier, options) => {
|
|
200
257
|
try {
|
|
201
|
-
const { CleanupCommand } = await import("./cleanup-
|
|
258
|
+
const { CleanupCommand } = await import("./cleanup-ZHROIBSQ.js");
|
|
202
259
|
const command = new CleanupCommand();
|
|
203
260
|
const input = {
|
|
204
261
|
options: options ?? {}
|
|
@@ -238,7 +295,7 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
238
295
|
});
|
|
239
296
|
program.command("init").description("Initialize iloom configuration and setup shell autocomplete").action(async () => {
|
|
240
297
|
try {
|
|
241
|
-
const { InitCommand } = await import("./init-
|
|
298
|
+
const { InitCommand } = await import("./init-EVUT4ZQJ.js");
|
|
242
299
|
const command = new InitCommand();
|
|
243
300
|
await command.execute();
|
|
244
301
|
} catch (error) {
|
|
@@ -248,7 +305,7 @@ program.command("init").description("Initialize iloom configuration and setup sh
|
|
|
248
305
|
});
|
|
249
306
|
program.command("update").description("Update iloom-cli to the latest version").option("--dry-run", "Show what would be done without actually updating").action(async (options) => {
|
|
250
307
|
try {
|
|
251
|
-
const { UpdateCommand } = await import("./update-
|
|
308
|
+
const { UpdateCommand } = await import("./update-4TDDUR5K.js");
|
|
252
309
|
const command = new UpdateCommand();
|
|
253
310
|
await command.execute(options);
|
|
254
311
|
} catch (error) {
|
|
@@ -258,7 +315,7 @@ program.command("update").description("Update iloom-cli to the latest version").
|
|
|
258
315
|
});
|
|
259
316
|
program.command("test-github").description("Test GitHub integration (Issue #3)").argument("<identifier>", "Issue number or PR number").option("--no-claude", "Skip Claude for branch name generation").action(async (identifier, options) => {
|
|
260
317
|
try {
|
|
261
|
-
const { GitHubService } = await import("./GitHubService-
|
|
318
|
+
const { GitHubService } = await import("./GitHubService-SH4H6VS5.js");
|
|
262
319
|
logger.info("Testing GitHub Integration\n");
|
|
263
320
|
const service = new GitHubService(options.claude !== void 0 ? { useClaude: options.claude } : {});
|
|
264
321
|
logger.info("Detecting input type...");
|
|
@@ -314,9 +371,9 @@ program.command("test-github").description("Test GitHub integration (Issue #3)")
|
|
|
314
371
|
program.command("test-claude").description("Test Claude integration (Issue #10)").option("--detect", "Test Claude CLI detection").option("--version", "Get Claude CLI version").option("--branch <title>", "Test branch name generation with given title").option("--issue <number>", "Issue number for branch generation", "123").option("--launch <prompt>", "Launch Claude with a prompt (headless)").option("--interactive", "Launch Claude interactively (requires --launch)").option("--template <name>", "Test template loading").action(async (options) => {
|
|
315
372
|
try {
|
|
316
373
|
const { detectClaudeCli, getClaudeVersion, generateBranchName, launchClaude } = await import("./claude-7LUVDZZ4.js");
|
|
317
|
-
const { PromptTemplateManager } = await import("./PromptTemplateManager-
|
|
318
|
-
const { ClaudeService } = await import("./ClaudeService-
|
|
319
|
-
const { ClaudeContextManager } = await import("./ClaudeContextManager-
|
|
374
|
+
const { PromptTemplateManager } = await import("./PromptTemplateManager-WM5GIPEF.js");
|
|
375
|
+
const { ClaudeService } = await import("./ClaudeService-CFFI7DD5.js");
|
|
376
|
+
const { ClaudeContextManager } = await import("./ClaudeContextManager-LD3VB6EM.js");
|
|
320
377
|
logger.info("Testing Claude Integration\n");
|
|
321
378
|
if (options.detect) {
|
|
322
379
|
logger.info("Detecting Claude CLI...");
|
|
@@ -464,7 +521,7 @@ program.command("test-webserver").description("Test if a web server is running o
|
|
|
464
521
|
});
|
|
465
522
|
program.command("test-git").description("Test Git integration - findMainWorktreePath() function (reads .iloom/settings.json)").action(async () => {
|
|
466
523
|
try {
|
|
467
|
-
const { TestGitCommand } = await import("./test-git-
|
|
524
|
+
const { TestGitCommand } = await import("./test-git-MKZATGZN.js");
|
|
468
525
|
const command = new TestGitCommand();
|
|
469
526
|
await command.execute();
|
|
470
527
|
} catch (error) {
|
|
@@ -490,7 +547,7 @@ program.command("test-tabs").description("Test iTerm2 dual tab functionality - o
|
|
|
490
547
|
});
|
|
491
548
|
program.command("test-prefix").description("Test worktree prefix configuration - preview worktree paths (reads .iloom/settings.json)").action(async () => {
|
|
492
549
|
try {
|
|
493
|
-
const { TestPrefixCommand } = await import("./test-prefix-
|
|
550
|
+
const { TestPrefixCommand } = await import("./test-prefix-ZNLWDI3K.js");
|
|
494
551
|
const command = new TestPrefixCommand();
|
|
495
552
|
await command.execute();
|
|
496
553
|
} catch (error) {
|
|
@@ -502,29 +559,20 @@ program.command("test-prefix").description("Test worktree prefix configuration -
|
|
|
502
559
|
}
|
|
503
560
|
});
|
|
504
561
|
program.command("test-neon").description("Test Neon integration and debug configuration").action(async () => {
|
|
562
|
+
var _a;
|
|
505
563
|
try {
|
|
506
|
-
const {
|
|
507
|
-
const {
|
|
564
|
+
const { SettingsManager } = await import("./SettingsManager-SKLUVE3K.js");
|
|
565
|
+
const { createNeonProviderFromSettings } = await import("./neon-helpers-ZVIRPKCI.js");
|
|
508
566
|
logger.info("Testing Neon Integration\n");
|
|
509
|
-
logger.info("
|
|
510
|
-
const
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
logger.success(` Loaded ${Object.keys(envResult.parsed).length} environment variables`);
|
|
516
|
-
} else {
|
|
517
|
-
logger.info(" No .env files found or parsed");
|
|
518
|
-
}
|
|
519
|
-
logger.info("\n1. Environment Variables:");
|
|
520
|
-
logger.info(` NEON_PROJECT_ID: ${process.env.NEON_PROJECT_ID ?? "(not set)"}`);
|
|
521
|
-
logger.info(` NEON_PARENT_BRANCH: ${process.env.NEON_PARENT_BRANCH ?? "(not set)"}`);
|
|
567
|
+
logger.info("1. Settings Configuration:");
|
|
568
|
+
const settingsManager = new SettingsManager();
|
|
569
|
+
const settings = await settingsManager.loadSettings();
|
|
570
|
+
const neonConfig = (_a = settings.databaseProviders) == null ? void 0 : _a.neon;
|
|
571
|
+
logger.info(` projectId: ${(neonConfig == null ? void 0 : neonConfig.projectId) ?? "(not configured)"}`);
|
|
572
|
+
logger.info(` parentBranch: ${(neonConfig == null ? void 0 : neonConfig.parentBranch) ?? "(not configured)"}`);
|
|
522
573
|
logger.info("\n2. Creating NeonProvider...");
|
|
523
574
|
try {
|
|
524
|
-
const neonProvider =
|
|
525
|
-
projectId: process.env.NEON_PROJECT_ID ?? "",
|
|
526
|
-
parentBranch: process.env.NEON_PARENT_BRANCH ?? ""
|
|
527
|
-
});
|
|
575
|
+
const neonProvider = createNeonProviderFromSettings(settings);
|
|
528
576
|
logger.success(" NeonProvider created successfully");
|
|
529
577
|
logger.info("\n3. Testing Neon CLI availability...");
|
|
530
578
|
const isAvailable = await neonProvider.isCliAvailable();
|
|
@@ -544,7 +592,7 @@ program.command("test-neon").description("Test Neon integration and debug config
|
|
|
544
592
|
logger.info(" Run: neon auth");
|
|
545
593
|
return;
|
|
546
594
|
}
|
|
547
|
-
if (
|
|
595
|
+
if (neonConfig == null ? void 0 : neonConfig.projectId) {
|
|
548
596
|
logger.info("\n5. Testing branch listing...");
|
|
549
597
|
try {
|
|
550
598
|
const branches = await neonProvider.listBranches();
|
|
@@ -559,13 +607,13 @@ program.command("test-neon").description("Test Neon integration and debug config
|
|
|
559
607
|
logger.error(` Failed to list branches: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
560
608
|
}
|
|
561
609
|
} else {
|
|
562
|
-
logger.warn("\n5. Skipping branch listing (
|
|
610
|
+
logger.warn("\n5. Skipping branch listing (Neon not configured in settings)");
|
|
563
611
|
}
|
|
564
612
|
} catch (error) {
|
|
565
613
|
logger.error(` Failed to create NeonProvider: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
566
|
-
if (error instanceof Error && error.message.includes("
|
|
567
|
-
logger.info("\n This is expected if
|
|
568
|
-
logger.info("
|
|
614
|
+
if (error instanceof Error && error.message.includes("not configured")) {
|
|
615
|
+
logger.info("\n This is expected if Neon is not configured.");
|
|
616
|
+
logger.info(" Configure databaseProviders.neon in .iloom/settings.json to test fully.");
|
|
569
617
|
}
|
|
570
618
|
}
|
|
571
619
|
logger.info("\n" + "=".repeat(50));
|