sync-worktrees 1.8.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/index.js +2862 -203
- package/dist/index.js.map +7 -1
- package/package.json +19 -11
- package/dist/constants.d.ts +0 -54
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -66
- package/dist/constants.js.map +0 -1
- package/dist/errors/index.d.ts +0 -51
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -119
- package/dist/errors/index.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/services/config-loader.service.d.ts +0 -9
- package/dist/services/config-loader.service.d.ts.map +0 -1
- package/dist/services/config-loader.service.js +0 -193
- package/dist/services/config-loader.service.js.map +0 -1
- package/dist/services/git.service.d.ts +0 -51
- package/dist/services/git.service.d.ts.map +0 -1
- package/dist/services/git.service.js +0 -749
- package/dist/services/git.service.js.map +0 -1
- package/dist/services/path-resolution.service.d.ts +0 -7
- package/dist/services/path-resolution.service.d.ts.map +0 -1
- package/dist/services/path-resolution.service.js +0 -58
- package/dist/services/path-resolution.service.js.map +0 -1
- package/dist/services/worktree-metadata.service.d.ts +0 -22
- package/dist/services/worktree-metadata.service.d.ts.map +0 -1
- package/dist/services/worktree-metadata.service.js +0 -276
- package/dist/services/worktree-metadata.service.js.map +0 -1
- package/dist/services/worktree-status.service.d.ts +0 -28
- package/dist/services/worktree-status.service.d.ts.map +0 -1
- package/dist/services/worktree-status.service.js +0 -229
- package/dist/services/worktree-status.service.js.map +0 -1
- package/dist/services/worktree-sync.service.d.ts +0 -17
- package/dist/services/worktree-sync.service.d.ts.map +0 -1
- package/dist/services/worktree-sync.service.js +0 -454
- package/dist/services/worktree-sync.service.js.map +0 -1
- package/dist/types/index.d.ts +0 -32
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
- package/dist/types/sync-metadata.d.ts +0 -16
- package/dist/types/sync-metadata.d.ts.map +0 -1
- package/dist/types/sync-metadata.js +0 -3
- package/dist/types/sync-metadata.js.map +0 -1
- package/dist/utils/cli.d.ts +0 -14
- package/dist/utils/cli.d.ts.map +0 -1
- package/dist/utils/cli.js +0 -117
- package/dist/utils/cli.js.map +0 -1
- package/dist/utils/config-generator.d.ts +0 -4
- package/dist/utils/config-generator.d.ts.map +0 -1
- package/dist/utils/config-generator.js +0 -112
- package/dist/utils/config-generator.js.map +0 -1
- package/dist/utils/date-filter.d.ts +0 -10
- package/dist/utils/date-filter.d.ts.map +0 -1
- package/dist/utils/date-filter.js +0 -47
- package/dist/utils/date-filter.js.map +0 -1
- package/dist/utils/git-url.d.ts +0 -15
- package/dist/utils/git-url.d.ts.map +0 -1
- package/dist/utils/git-url.js +0 -46
- package/dist/utils/git-url.js.map +0 -1
- package/dist/utils/interactive.d.ts +0 -3
- package/dist/utils/interactive.d.ts.map +0 -1
- package/dist/utils/interactive.js +0 -195
- package/dist/utils/interactive.js.map +0 -1
- package/dist/utils/lfs-error.d.ts +0 -23
- package/dist/utils/lfs-error.d.ts.map +0 -1
- package/dist/utils/lfs-error.js +0 -45
- package/dist/utils/lfs-error.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -15
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -78
- package/dist/utils/retry.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/services/config-loader.service.ts", "../src/services/InteractiveUIService.tsx", "../src/components/App.tsx", "../src/components/StatusBar.tsx", "../src/components/HelpModal.tsx", "../src/services/worktree-sync.service.ts", "../src/utils/date-filter.ts", "../src/utils/lfs-error.ts", "../src/utils/retry.ts", "../src/services/git.service.ts", "../src/utils/git-url.ts", "../src/services/worktree-metadata.service.ts", "../src/constants.ts", "../src/services/worktree-status.service.ts", "../src/errors/index.ts", "../src/utils/disk-space.ts", "../src/utils/cli.ts", "../src/utils/interactive.ts", "../src/utils/config-generator.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport * as path from \"path\";\n\nimport { confirm } from \"@inquirer/prompts\";\nimport * as cron from \"node-cron\";\n\nimport { ConfigLoaderService } from \"./services/config-loader.service\";\nimport { InteractiveUIService } from \"./services/InteractiveUIService\";\nimport { WorktreeSyncService } from \"./services/worktree-sync.service\";\nimport { isInteractiveMode, parseArguments, reconstructCliCommand } from \"./utils/cli\";\nimport { promptForConfig } from \"./utils/interactive\";\n\nimport type { Config, RepositoryConfig } from \"./types\";\n\nasync function runSingleRepository(config: Config): Promise<void> {\n console.log(\"\\n\uD83D\uDCCB CLI Command (for future reference):\");\n console.log(` ${reconstructCliCommand(config)}`);\n console.log(\"\");\n\n const syncService = new WorktreeSyncService(config);\n\n try {\n await syncService.initialize();\n\n if (config.runOnce) {\n console.log(\"Running the sync process once as requested by --runOnce flag.\");\n await syncService.sync();\n } else {\n const uiService = new InteractiveUIService([syncService], undefined, config.cronSchedule);\n\n await syncService.sync();\n uiService.updateLastSyncTime();\n void uiService.calculateAndUpdateDiskSpace();\n\n cron.schedule(config.cronSchedule, async () => {\n try {\n uiService.setStatus(\"syncing\");\n await syncService.sync();\n uiService.updateLastSyncTime();\n void uiService.calculateAndUpdateDiskSpace();\n } catch (error) {\n console.error(`Error during scheduled sync: ${(error as Error).message}`);\n uiService.setStatus(\"idle\");\n }\n });\n }\n } catch (error) {\n console.error(\"\u274C Fatal Error during initialization:\", (error as Error).message);\n process.exit(1);\n }\n}\n\nasync function runMultipleRepositories(\n repositories: RepositoryConfig[],\n runOnce: boolean,\n configPath?: string,\n): Promise<void> {\n const services = new Map<string, WorktreeSyncService>();\n\n console.log(`\\n\uD83D\uDD04 Syncing ${repositories.length} repositories...`);\n\n for (const repoConfig of repositories) {\n console.log(`\\n\uD83D\uDCE6 Repository: ${repoConfig.name}`);\n console.log(` URL: ${repoConfig.repoUrl}`);\n console.log(` Worktrees: ${repoConfig.worktreeDir}`);\n if (repoConfig.bareRepoDir) {\n console.log(` Bare repo: ${repoConfig.bareRepoDir}`);\n }\n\n const syncService = new WorktreeSyncService(repoConfig);\n services.set(repoConfig.name, syncService);\n\n try {\n await syncService.initialize();\n await syncService.sync();\n } catch (error) {\n console.error(`\u274C Error syncing repository '${repoConfig.name}':`, (error as Error).message);\n }\n }\n\n if (!runOnce) {\n const uniqueSchedules = [...new Set(repositories.map((r) => r.cronSchedule))];\n const displaySchedule = uniqueSchedules.length === 1 ? uniqueSchedules[0] : undefined;\n const allServices = Array.from(services.values());\n const uiService = new InteractiveUIService(allServices, configPath, displaySchedule);\n\n uiService.updateLastSyncTime();\n void uiService.calculateAndUpdateDiskSpace();\n\n const cronJobs = new Map<string, string>();\n\n for (const repoConfig of repositories) {\n const syncService = services.get(repoConfig.name);\n if (!syncService) continue;\n\n if (!cronJobs.has(repoConfig.cronSchedule)) {\n cronJobs.set(repoConfig.cronSchedule, repoConfig.cronSchedule);\n\n cron.schedule(repoConfig.cronSchedule, async () => {\n const reposToSync = repositories.filter((r) => r.cronSchedule === repoConfig.cronSchedule);\n\n uiService.setStatus(\"syncing\");\n for (const repo of reposToSync) {\n const service = services.get(repo.name);\n if (!service) continue;\n\n console.log(`Running scheduled sync for: ${repo.name}`);\n try {\n await service.sync();\n } catch (error) {\n console.error(`Error syncing '${repo.name}': ${(error as Error).message}`);\n }\n }\n uiService.updateLastSyncTime();\n void uiService.calculateAndUpdateDiskSpace();\n });\n }\n }\n\n console.log(`All ${repositories.length} repositories scheduled`);\n\n for (const [schedule] of cronJobs) {\n const repoCount = repositories.filter((r) => r.cronSchedule === schedule).length;\n console.log(`${schedule}: ${repoCount} repository(ies)`);\n }\n }\n}\n\nasync function listRepositories(configPath: string, filter?: string): Promise<void> {\n const configLoader = new ConfigLoaderService();\n\n try {\n const configFile = await configLoader.loadConfigFile(configPath);\n const configDir = path.dirname(path.resolve(configPath));\n\n let repositories = configFile.repositories.map((repo) =>\n configLoader.resolveRepositoryConfig(repo, configFile.defaults, configDir, configFile.retry),\n );\n\n if (filter) {\n repositories = configLoader.filterRepositories(repositories, filter);\n if (repositories.length === 0) {\n console.error(`\u274C No repositories match filter: ${filter}`);\n process.exit(1);\n }\n }\n\n console.log(\"\\n\uD83D\uDCCB Configured repositories:\\n\");\n\n repositories.forEach((repo, index) => {\n console.log(`${index + 1}. ${repo.name}`);\n console.log(` URL: ${repo.repoUrl}`);\n console.log(` Worktrees: ${repo.worktreeDir}`);\n console.log(` Schedule: ${repo.cronSchedule}`);\n console.log(` Run Once: ${repo.runOnce}`);\n if (repo.bareRepoDir) {\n console.log(` Bare repo: ${repo.bareRepoDir}`);\n }\n if (repo.skipLfs) {\n console.log(` Skip LFS: ${repo.skipLfs}`);\n }\n console.log(\"\");\n });\n } catch (error) {\n console.error(\"\u274C Error loading config file:\", (error as Error).message);\n process.exit(1);\n }\n}\n\nasync function main(): Promise<void> {\n const options = parseArguments();\n\n if (options.config) {\n const configLoader = new ConfigLoaderService();\n\n if (options.list) {\n await listRepositories(options.config, options.filter);\n return;\n }\n\n try {\n const configFile = await configLoader.loadConfigFile(options.config);\n const configDir = path.dirname(path.resolve(options.config));\n\n let repositories = configFile.repositories.map((repo) =>\n configLoader.resolveRepositoryConfig(repo, configFile.defaults, configDir, configFile.retry),\n );\n\n if (options.filter) {\n repositories = configLoader.filterRepositories(repositories, options.filter);\n if (repositories.length === 0) {\n console.error(`\u274C No repositories match filter: ${options.filter}`);\n process.exit(1);\n }\n }\n\n const globalRunOnce = options.runOnce ?? configFile.defaults?.runOnce ?? false;\n\n // Apply CLI overrides\n if (options.noUpdateExisting) {\n repositories = repositories.map((repo) => ({\n ...repo,\n updateExistingWorktrees: false,\n }));\n }\n\n if (options.debug) {\n repositories = repositories.map((repo) => ({\n ...repo,\n debug: true,\n }));\n }\n\n await runMultipleRepositories(repositories, globalRunOnce, options.config);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"Config file not found\")) {\n console.error(`\\n\u274C Config file not found: ${options.config}`);\n\n const createConfig = await confirm({\n message: \"Would you like to run interactive setup to create a config file?\",\n default: true,\n });\n\n if (createConfig) {\n // Run interactive mode which will offer to save config\n const config = await promptForConfig({});\n await runSingleRepository(config);\n } else {\n console.log(\"\\n\uD83D\uDCA1 You can create a config file manually or run without --config for interactive setup.\");\n process.exit(1);\n }\n } else {\n console.error(\"\u274C Error loading config file:\", (error as Error).message);\n process.exit(1);\n }\n }\n } else {\n let config: Config;\n if (isInteractiveMode(options)) {\n config = await promptForConfig(options);\n } else {\n config = options as Config;\n }\n\n // Apply CLI overrides\n if (options.noUpdateExisting) {\n config.updateExistingWorktrees = false;\n } else if (config.updateExistingWorktrees === undefined) {\n config.updateExistingWorktrees = true; // Default to true\n }\n\n if (options.debug !== undefined) {\n config.debug = options.debug;\n }\n\n await runSingleRepository(config);\n }\n}\n\nmain().catch((error) => {\n console.error(\"\u274C Unhandled error:\", error);\n process.exit(1);\n});\n", "import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { pathToFileURL } from \"url\";\n\nimport type { Config, ConfigFile, RepositoryConfig } from \"../types\";\n\nexport class ConfigLoaderService {\n async loadConfigFile(configPath: string): Promise<ConfigFile> {\n const absolutePath = path.resolve(configPath);\n\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`Config file not found: ${absolutePath}`);\n }\n\n try {\n const fileUrl = pathToFileURL(absolutePath);\n fileUrl.searchParams.set(\"t\", Date.now().toString());\n const configModule = await import(fileUrl.href);\n const config = configModule.default;\n\n if (!config) {\n throw new Error(\"Config file must use 'export default' syntax\");\n }\n\n this.validateConfigFile(config);\n\n return config;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"Config file not found\")) {\n throw error;\n }\n throw new Error(`Failed to load config file: ${(error as Error).message}`);\n }\n }\n\n private validateConfigFile(config: unknown): asserts config is ConfigFile {\n if (!config || typeof config !== \"object\") {\n throw new Error(\"Config file must export an object\");\n }\n\n const configObj = config as Record<string, unknown>;\n\n if (!Array.isArray(configObj.repositories)) {\n throw new Error(\"Config file must have a 'repositories' array\");\n }\n\n if (configObj.repositories.length === 0) {\n throw new Error(\"Config file must have at least one repository\");\n }\n\n const seenNames = new Set<string>();\n\n configObj.repositories.forEach((repo: unknown, index: number) => {\n if (!repo || typeof repo !== \"object\") {\n throw new Error(`Repository at index ${index} must be an object`);\n }\n\n const repoObj = repo as Record<string, unknown>;\n\n if (!repoObj.name || typeof repoObj.name !== \"string\") {\n throw new Error(`Repository at index ${index} must have a 'name' property`);\n }\n\n if (seenNames.has(repoObj.name)) {\n throw new Error(`Duplicate repository name: ${repoObj.name}`);\n }\n seenNames.add(repoObj.name);\n\n if (!repoObj.repoUrl || typeof repoObj.repoUrl !== \"string\") {\n throw new Error(`Repository '${repoObj.name}' must have a 'repoUrl' property`);\n }\n\n if (!repoObj.worktreeDir || typeof repoObj.worktreeDir !== \"string\") {\n throw new Error(`Repository '${repoObj.name}' must have a 'worktreeDir' property`);\n }\n\n if (repoObj.bareRepoDir !== undefined && typeof repoObj.bareRepoDir !== \"string\") {\n throw new Error(`Repository '${repoObj.name}' has invalid 'bareRepoDir' property`);\n }\n\n if (repoObj.cronSchedule !== undefined && typeof repoObj.cronSchedule !== \"string\") {\n throw new Error(`Repository '${repoObj.name}' has invalid 'cronSchedule' property`);\n }\n\n if (repoObj.runOnce !== undefined && typeof repoObj.runOnce !== \"boolean\") {\n throw new Error(`Repository '${repoObj.name}' has invalid 'runOnce' property`);\n }\n });\n\n if (configObj.defaults) {\n if (typeof configObj.defaults !== \"object\") {\n throw new Error(\"'defaults' must be an object\");\n }\n\n const defaults = configObj.defaults as Record<string, unknown>;\n\n if (defaults.cronSchedule !== undefined && typeof defaults.cronSchedule !== \"string\") {\n throw new Error(\"Invalid 'cronSchedule' in defaults\");\n }\n if (defaults.runOnce !== undefined && typeof defaults.runOnce !== \"boolean\") {\n throw new Error(\"Invalid 'runOnce' in defaults\");\n }\n if (defaults.retry !== undefined && typeof defaults.retry !== \"object\") {\n throw new Error(\"Invalid 'retry' in defaults\");\n }\n }\n\n if (configObj.retry !== undefined) {\n if (typeof configObj.retry !== \"object\") {\n throw new Error(\"'retry' must be an object\");\n }\n\n const retry = configObj.retry as Record<string, unknown>;\n\n if (retry.maxAttempts !== undefined) {\n if (retry.maxAttempts !== \"unlimited\" && (typeof retry.maxAttempts !== \"number\" || retry.maxAttempts < 1)) {\n throw new Error(\"Invalid 'maxAttempts' in retry config. Must be 'unlimited' or a positive number\");\n }\n }\n\n if (retry.maxLfsRetries !== undefined) {\n if (typeof retry.maxLfsRetries !== \"number\" || retry.maxLfsRetries < 0) {\n throw new Error(\"Invalid 'maxLfsRetries' in retry config. Must be a non-negative number\");\n }\n }\n if (\n retry.initialDelayMs !== undefined &&\n (typeof retry.initialDelayMs !== \"number\" || retry.initialDelayMs < 0)\n ) {\n throw new Error(\"Invalid 'initialDelayMs' in retry config\");\n }\n if (retry.maxDelayMs !== undefined && (typeof retry.maxDelayMs !== \"number\" || retry.maxDelayMs < 0)) {\n throw new Error(\"Invalid 'maxDelayMs' in retry config\");\n }\n if (\n retry.backoffMultiplier !== undefined &&\n (typeof retry.backoffMultiplier !== \"number\" || retry.backoffMultiplier < 1)\n ) {\n throw new Error(\"Invalid 'backoffMultiplier' in retry config\");\n }\n }\n }\n\n resolveRepositoryConfig(\n repo: RepositoryConfig,\n defaults?: Partial<Config>,\n configDir?: string,\n globalRetry?: Config[\"retry\"],\n ): RepositoryConfig {\n const resolved: RepositoryConfig = {\n name: repo.name,\n repoUrl: repo.repoUrl,\n worktreeDir: this.resolvePath(repo.worktreeDir, configDir),\n cronSchedule: repo.cronSchedule ?? defaults?.cronSchedule ?? \"0 * * * *\",\n runOnce: repo.runOnce ?? defaults?.runOnce ?? false,\n };\n\n if (repo.bareRepoDir) {\n resolved.bareRepoDir = this.resolvePath(repo.bareRepoDir, configDir);\n }\n\n if (repo.branchMaxAge || defaults?.branchMaxAge) {\n resolved.branchMaxAge = repo.branchMaxAge ?? defaults?.branchMaxAge;\n }\n\n if (repo.skipLfs !== undefined || defaults?.skipLfs !== undefined) {\n resolved.skipLfs = repo.skipLfs ?? defaults?.skipLfs ?? false;\n }\n\n if (repo.retry || defaults?.retry || globalRetry) {\n resolved.retry = {\n ...(globalRetry || {}),\n ...(defaults?.retry || {}),\n ...(repo.retry || {}),\n };\n }\n\n if (repo.updateExistingWorktrees !== undefined || defaults?.updateExistingWorktrees !== undefined) {\n resolved.updateExistingWorktrees = repo.updateExistingWorktrees ?? defaults?.updateExistingWorktrees ?? true;\n }\n\n return resolved;\n }\n\n private resolvePath(inputPath: string, baseDir?: string): string {\n if (path.isAbsolute(inputPath)) {\n return inputPath;\n }\n\n return path.resolve(baseDir || process.cwd(), inputPath);\n }\n\n filterRepositories(repositories: RepositoryConfig[], filter?: string): RepositoryConfig[] {\n if (!filter) {\n return repositories;\n }\n\n const patterns = filter.split(\",\").map((p) => p.trim());\n\n return repositories.filter((repo) => {\n return patterns.some((pattern) => {\n if (pattern.includes(\"*\")) {\n const regex = new RegExp(\"^\" + pattern.replace(/\\*/g, \".*\") + \"$\");\n return regex.test(repo.name);\n }\n return repo.name === pattern;\n });\n });\n }\n}\n", "import React from \"react\";\nimport { render, Instance } from \"ink\";\nimport * as cron from \"node-cron\";\nimport App from \"../components/App\";\nimport { WorktreeSyncService } from \"./worktree-sync.service\";\nimport { ConfigLoaderService } from \"./config-loader.service\";\nimport { calculateSyncDiskSpace } from \"../utils/disk-space\";\nimport { getDefaultBareRepoDir } from \"../utils/git-url\";\nimport type { RepositoryConfig } from \"../types\";\n\nexport class InteractiveUIService {\n private app: Instance | null = null;\n private syncServices: WorktreeSyncService[];\n private configPath?: string;\n private cronSchedule?: string;\n private cronJobs: cron.ScheduledTask[] = [];\n private repositoryCount: number;\n private originalConsoleLog: typeof console.log;\n private originalConsoleWarn: typeof console.warn;\n private originalConsoleError: typeof console.error;\n\n constructor(syncServices: WorktreeSyncService[], configPath?: string, cronSchedule?: string) {\n if (syncServices.length === 0) {\n throw new Error(\"InteractiveUIService requires at least one WorktreeSyncService\");\n }\n\n this.syncServices = syncServices;\n this.configPath = configPath;\n this.cronSchedule = cronSchedule;\n this.repositoryCount = syncServices.length;\n\n this.originalConsoleLog = console.log.bind(console);\n this.originalConsoleWarn = console.warn.bind(console);\n this.originalConsoleError = console.error.bind(console);\n\n this.redirectConsole();\n this.setupCronJobs();\n this.renderUI();\n }\n\n private redirectConsole(): void {\n console.log = (...args: unknown[]): void => {\n const message = args.map((arg) => (typeof arg === \"string\" ? arg : JSON.stringify(arg, null, 2))).join(\" \");\n this.originalConsoleLog(message);\n };\n\n console.warn = (...args: unknown[]): void => {\n const message = args.map((arg) => (typeof arg === \"string\" ? arg : JSON.stringify(arg, null, 2))).join(\" \");\n this.originalConsoleWarn(message);\n };\n\n console.error = (...args: unknown[]): void => {\n const message = args.map((arg) => (typeof arg === \"string\" ? arg : JSON.stringify(arg, null, 2))).join(\" \");\n this.originalConsoleError(message);\n };\n }\n\n private restoreConsole(): void {\n console.log = this.originalConsoleLog;\n console.warn = this.originalConsoleWarn;\n console.error = this.originalConsoleError;\n }\n\n private setupCronJobs(): void {\n if (!this.cronSchedule) {\n return;\n }\n\n for (const service of this.syncServices) {\n if (service.config.runOnce) {\n continue;\n }\n\n const schedule = service.config.cronSchedule || this.cronSchedule;\n const task = cron.schedule(schedule, async () => {\n this.setStatus(\"syncing\");\n try {\n await service.sync();\n } catch (error) {\n console.error(`Error syncing: ${(error as Error).message}`);\n } finally {\n this.setStatus(\"idle\");\n }\n this.updateLastSyncTime();\n await this.calculateAndUpdateDiskSpace();\n });\n\n this.cronJobs.push(task);\n }\n }\n\n private cancelCronJobs(): void {\n for (const job of this.cronJobs) {\n job.stop();\n }\n this.cronJobs = [];\n }\n\n private renderUI(): void {\n if (this.app) {\n this.app.unmount();\n }\n\n this.app = render(\n <App\n repositoryCount={this.repositoryCount}\n cronSchedule={this.cronSchedule}\n onManualSync={() => this.handleManualSync()}\n onReload={() => this.handleReload()}\n onQuit={() => this.handleQuit()}\n />\n );\n }\n\n private async handleManualSync(): Promise<void> {\n this.setStatus(\"syncing\");\n\n try {\n for (const service of this.syncServices) {\n await service.sync();\n }\n\n this.updateLastSyncTime();\n await this.calculateAndUpdateDiskSpace();\n } catch (error) {\n console.error(\"Manual sync failed:\", error);\n } finally {\n this.setStatus(\"idle\");\n }\n }\n\n private async handleReload(): Promise<void> {\n try {\n if (!this.configPath) {\n this.setStatus(\"idle\");\n return;\n }\n\n await this.waitForInProgressSyncs();\n\n this.cancelCronJobs();\n\n console.log(\"Reloading configuration...\");\n this.setStatus(\"syncing\");\n\n const configLoader = new ConfigLoaderService();\n const configFile = await configLoader.loadConfigFile(this.configPath);\n\n const newServices: WorktreeSyncService[] = [];\n for (const repoConfig of configFile.repositories) {\n try {\n const service = new WorktreeSyncService(repoConfig);\n await service.initialize();\n newServices.push(service);\n } catch (error) {\n console.error(`Failed to initialize repository ${repoConfig.name}: ${(error as Error).message}`);\n }\n }\n\n if (newServices.length === 0) {\n throw new Error(\"No repositories could be initialized from the configuration\");\n }\n\n this.syncServices = newServices;\n this.repositoryCount = this.syncServices.length;\n\n this.setupCronJobs();\n\n const failures: Array<{ repo: string; error: string }> = [];\n\n for (const service of this.syncServices) {\n try {\n await service.sync();\n } catch (error) {\n const repoName = (service.config as RepositoryConfig).name || service.config.repoUrl;\n const errorMessage = (error as Error).message;\n console.error(`Failed to sync repository ${repoName}: ${errorMessage}`);\n failures.push({ repo: repoName, error: errorMessage });\n }\n }\n\n this.renderUI();\n this.updateLastSyncTime();\n await this.calculateAndUpdateDiskSpace();\n this.setStatus(\"idle\");\n\n if (failures.length > 0) {\n console.warn(`Reload completed with ${failures.length} repository failure(s)`);\n }\n } catch (error) {\n console.error(`Reload failed: ${(error as Error).message}`);\n this.setupCronJobs();\n this.setStatus(\"idle\");\n }\n }\n\n private async handleQuit(): Promise<void> {\n await this.waitForInProgressSyncs();\n\n this.destroy();\n process.exit(0);\n }\n\n private async waitForInProgressSyncs(): Promise<void> {\n const inProgressServices = this.syncServices.filter((s) => s.isSyncInProgress());\n\n if (inProgressServices.length === 0) {\n return;\n }\n\n const syncChecks = inProgressServices.map(async (service) => {\n const timeout = 30000;\n const checkInterval = 500;\n const startTime = Date.now();\n\n while (service.isSyncInProgress()) {\n if (Date.now() - startTime > timeout) {\n throw new Error(\"Timeout waiting for sync operations to complete\");\n }\n await new Promise((resolve) => setTimeout(resolve, checkInterval));\n }\n });\n\n try {\n await Promise.all(syncChecks);\n } catch (error) {\n // Silently handle timeout\n }\n }\n\n public updateLastSyncTime(): void {\n const methods = (globalThis as any).__inkAppMethods;\n if (methods && methods.updateLastSyncTime) {\n methods.updateLastSyncTime();\n }\n }\n\n public setStatus(status: \"idle\" | \"syncing\"): void {\n const methods = (globalThis as any).__inkAppMethods;\n if (methods && methods.setStatus) {\n methods.setStatus(status);\n }\n }\n\n public setDiskSpace(diskSpace: string): void {\n const methods = (globalThis as any).__inkAppMethods;\n if (methods && methods.setDiskSpace) {\n methods.setDiskSpace(diskSpace);\n }\n }\n\n public async calculateAndUpdateDiskSpace(): Promise<void> {\n try {\n const bareRepoDirs = this.syncServices.map(\n (service) => service.config.bareRepoDir || getDefaultBareRepoDir(service.config.repoUrl),\n );\n const worktreeDirs = this.syncServices.map((service) => service.config.worktreeDir);\n\n const diskSpace = await calculateSyncDiskSpace(bareRepoDirs, worktreeDirs);\n this.setDiskSpace(diskSpace);\n } catch (error) {\n console.error(\"Failed to calculate disk space:\", error);\n this.setDiskSpace(\"N/A\");\n }\n }\n\n public destroy(): void {\n this.cancelCronJobs();\n this.restoreConsole();\n if (this.app) {\n this.app.unmount();\n this.app = null;\n }\n delete (globalThis as any).__inkAppMethods;\n }\n}\n", "import React, { useState, useEffect, useCallback } from \"react\";\nimport { Box, useInput } from \"ink\";\nimport StatusBar from \"./StatusBar\";\nimport HelpModal from \"./HelpModal\";\n\nexport interface AppProps {\n repositoryCount: number;\n cronSchedule?: string;\n onManualSync: () => void;\n onReload: () => void;\n onQuit: () => Promise<void>;\n}\n\nexport interface LogEntry {\n id: string;\n message: string;\n level: \"info\" | \"warn\" | \"error\";\n timestamp: Date;\n}\n\nconst App: React.FC<AppProps> = ({ repositoryCount, cronSchedule, onManualSync, onReload, onQuit }) => {\n const [showHelp, setShowHelp] = useState(false);\n const [status, setStatus] = useState<\"idle\" | \"syncing\">(\"idle\");\n const [lastSyncTime, setLastSyncTime] = useState<Date | null>(null);\n const [diskSpaceUsed, setDiskSpaceUsed] = useState<string | null>(null);\n\n useInput((input, key) => {\n if (showHelp) {\n if (input === \"?\" || input === \"h\") {\n setShowHelp(false);\n }\n return;\n }\n\n if (key.escape || input === \"q\") {\n void onQuit();\n } else if (input === \"?\" || input === \"h\") {\n setShowHelp(true);\n } else if (input === \"s\" && status !== \"syncing\") {\n setStatus(\"syncing\");\n void (async () => {\n try {\n await onManualSync();\n } catch (error) {\n console.error(\"Manual sync failed:\", error);\n setStatus(\"idle\");\n }\n })();\n } else if (input === \"r\" && status !== \"syncing\") {\n setStatus(\"syncing\");\n void (async () => {\n try {\n await onReload();\n } catch (error) {\n console.error(\"Reload failed:\", error);\n setStatus(\"idle\");\n }\n })();\n }\n });\n\n const updateLastSyncTime = useCallback(() => {\n setLastSyncTime(new Date());\n setStatus(\"idle\");\n }, []);\n\n useEffect(() => {\n (globalThis as any).__inkAppMethods = {\n updateLastSyncTime,\n setStatus,\n setDiskSpace: setDiskSpaceUsed,\n };\n\n return () => {\n delete (globalThis as any).__inkAppMethods;\n };\n }, [updateLastSyncTime, setStatus]);\n\n return (\n <Box flexDirection=\"column\">\n <StatusBar\n status={status}\n repositoryCount={repositoryCount}\n lastSyncTime={lastSyncTime}\n cronSchedule={cronSchedule}\n diskSpaceUsed={diskSpaceUsed ?? undefined}\n />\n\n {showHelp && <HelpModal onClose={() => setShowHelp(false)} />}\n </Box>\n );\n};\n\nexport default App;\n", "import React, { useState, useEffect } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { CronExpressionParser } from \"cron-parser\";\n\nexport interface StatusBarProps {\n status: \"idle\" | \"syncing\";\n repositoryCount: number;\n lastSyncTime: Date | null;\n cronSchedule?: string;\n diskSpaceUsed?: string;\n}\n\nconst StatusBar: React.FC<StatusBarProps> = ({ status, repositoryCount, lastSyncTime, cronSchedule, diskSpaceUsed }) => {\n const [nextSyncTime, setNextSyncTime] = useState<Date | null>(null);\n\n useEffect(() => {\n if (!cronSchedule) {\n setNextSyncTime(null);\n return undefined;\n }\n\n try {\n const interval = CronExpressionParser.parse(cronSchedule);\n setNextSyncTime(interval.next().toDate());\n\n const timer = setInterval(() => {\n const nextInterval = CronExpressionParser.parse(cronSchedule);\n setNextSyncTime(nextInterval.next().toDate());\n }, 60000);\n\n return () => clearInterval(timer);\n } catch (error) {\n setNextSyncTime(null);\n return undefined;\n }\n }, [cronSchedule]);\n\n const formatTime = (date: Date | null): string => {\n if (!date) return \"N/A\";\n return date.toLocaleTimeString();\n };\n\n const getStatusColor = (): \"green\" | \"yellow\" => {\n return status === \"syncing\" ? \"yellow\" : \"green\";\n };\n\n const getStatusIcon = (): string => {\n return status === \"syncing\" ? \"\u27F3\" : \"\u2713\";\n };\n\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Box flexDirection=\"column\" width=\"100%\">\n <Box justifyContent=\"space-between\">\n <Text bold>\n {getStatusIcon()} Status:{\" \"}\n <Text color={getStatusColor()}>{status === \"syncing\" ? \"Syncing...\" : \"Running\"}</Text>\n </Text>\n <Text>\n Repositories: <Text bold color=\"cyan\">{repositoryCount}</Text>\n </Text>\n </Box>\n <Box justifyContent=\"space-between\">\n <Text>\n Last Sync: <Text color=\"gray\">{formatTime(lastSyncTime)}</Text>\n </Text>\n {cronSchedule && (\n <Text>\n Next Sync: <Text color=\"gray\">{formatTime(nextSyncTime)}</Text>\n </Text>\n )}\n </Box>\n <Box justifyContent=\"space-between\">\n <Text>\n Disk Space: <Text color=\"magenta\">{diskSpaceUsed || \"Calculating...\"}</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n );\n};\n\nexport default StatusBar;\n", "import React from \"react\";\nimport { Box, Text, useInput } from \"ink\";\n\nexport interface HelpModalProps {\n onClose: () => void;\n}\n\nconst HelpModal: React.FC<HelpModalProps> = ({ onClose }) => {\n useInput(() => {\n onClose();\n });\n return (\n <Box justifyContent=\"center\" alignItems=\"center\" flexDirection=\"column\" marginTop={2} marginBottom={2}>\n <Box borderStyle=\"double\" borderColor=\"cyan\" paddingX={2} paddingY={1} flexDirection=\"column\" width={60}>\n <Box justifyContent=\"center\" marginBottom={1}>\n <Text bold color=\"cyan\">\n \uD83C\uDF33 sync-worktrees - Keyboard Shortcuts\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" gap={0}>\n <Box>\n <Box width={15}>\n <Text bold color=\"yellow\">\n ?\n </Text>\n <Text> or </Text>\n <Text bold color=\"yellow\">\n h\n </Text>\n </Box>\n <Text>Toggle this help screen</Text>\n </Box>\n\n <Box>\n <Box width={15}>\n <Text bold color=\"yellow\">\n s\n </Text>\n </Box>\n <Text>Manually trigger sync for all repositories</Text>\n </Box>\n\n <Box>\n <Box width={15}>\n <Text bold color=\"yellow\">\n r\n </Text>\n </Box>\n <Text>Reload configuration and re-sync all repos</Text>\n </Box>\n\n <Box>\n <Box width={15}>\n <Text bold color=\"yellow\">\n q\n </Text>\n <Text> or </Text>\n <Text bold color=\"yellow\">\n Esc\n </Text>\n </Box>\n <Text>Gracefully quit</Text>\n </Box>\n </Box>\n\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>Press any key to close</Text>\n </Box>\n </Box>\n </Box>\n );\n};\n\nexport default HelpModal;\n", "import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport { filterBranchesByAge, formatDuration } from \"../utils/date-filter\";\nimport { getErrorMessage, isLfsError } from \"../utils/lfs-error\";\nimport { retry } from \"../utils/retry\";\n\nimport { GitService } from \"./git.service\";\n\nimport type { Config } from \"../types\";\nimport type { WorktreeStatusDetails } from \"./worktree-status.service\";\nimport type { RetryOptions } from \"../utils/retry\";\n\nexport class WorktreeSyncService {\n private gitService: GitService;\n private syncInProgress: boolean = false;\n\n constructor(public readonly config: Config) {\n this.gitService = new GitService(config);\n }\n\n async initialize(): Promise<void> {\n await this.gitService.initialize();\n }\n\n isSyncInProgress(): boolean {\n return this.syncInProgress;\n }\n\n async sync(): Promise<void> {\n if (this.syncInProgress) {\n console.warn(\"\u26A0\uFE0F Sync already in progress, skipping...\");\n return;\n }\n this.syncInProgress = true;\n console.log(`[${new Date().toISOString()}] Starting worktree synchronization...`);\n\n let lfsSkipEnabled = false;\n\n const retryOptions: RetryOptions = {\n maxAttempts: this.config.retry?.maxAttempts ?? 3,\n maxLfsRetries: this.config.retry?.maxLfsRetries ?? 2,\n initialDelayMs: this.config.retry?.initialDelayMs ?? 1000,\n maxDelayMs: this.config.retry?.maxDelayMs ?? 30000,\n backoffMultiplier: this.config.retry?.backoffMultiplier ?? 2,\n onRetry: (error, attempt, context) => {\n const errorMessage = getErrorMessage(error);\n console.log(`\\n\u26A0\uFE0F Sync attempt ${attempt} failed: ${errorMessage}`);\n\n if (context?.isLfsError && !this.config.skipLfs) {\n console.log(`\uD83D\uDD04 LFS error detected. Will retry with LFS skipped...`);\n } else {\n console.log(`\uD83D\uDD04 Retrying synchronization...\\n`);\n }\n },\n lfsRetryHandler: () => {\n if (!this.config.skipLfs && !lfsSkipEnabled) {\n console.log(\"\u26A0\uFE0F Temporarily disabling LFS downloads for this sync...\");\n process.env.GIT_LFS_SKIP_SMUDGE = \"1\";\n lfsSkipEnabled = true;\n }\n },\n };\n\n try {\n await retry(async () => {\n await this.gitService.pruneWorktrees();\n\n console.log(\"Step 1: Fetching latest data from remote...\");\n\n try {\n await this.gitService.fetchAll();\n } catch (fetchError) {\n const errorMessage = getErrorMessage(fetchError);\n\n if (isLfsError(errorMessage) && !lfsSkipEnabled && !this.config.skipLfs) {\n console.log(\"\u26A0\uFE0F Fetch all failed due to LFS error. Attempting branch-by-branch fetch...\");\n console.log(\"\u26A0\uFE0F Temporarily disabling LFS downloads for branch-by-branch fetch...\");\n process.env.GIT_LFS_SKIP_SMUDGE = \"1\";\n lfsSkipEnabled = true;\n await this.fetchBranchByBranch();\n } else {\n throw fetchError;\n }\n }\n\n let remoteBranches: string[];\n\n if (this.config.branchMaxAge) {\n const branchesWithActivity = await this.gitService.getRemoteBranchesWithActivity();\n const filteredBranches = filterBranchesByAge(branchesWithActivity, this.config.branchMaxAge);\n remoteBranches = filteredBranches.map((b) => b.branch);\n\n console.log(`Found ${branchesWithActivity.length} remote branches.`);\n console.log(\n `After filtering by age (${formatDuration(this.config.branchMaxAge)}): ${remoteBranches.length} branches.`,\n );\n\n if (branchesWithActivity.length > remoteBranches.length) {\n const excludedCount = branchesWithActivity.length - remoteBranches.length;\n console.log(` - Excluded ${excludedCount} stale branches.`);\n }\n } else {\n // Use original method if no age filtering\n remoteBranches = await this.gitService.getRemoteBranches();\n console.log(`Found ${remoteBranches.length} remote branches.`);\n }\n\n // Always retain the default branch, even if excluded by age filters\n const defaultBranch = this.gitService.getDefaultBranch();\n if (!remoteBranches.includes(defaultBranch)) {\n remoteBranches.push(defaultBranch);\n console.log(`Ensuring default branch '${defaultBranch}' is retained.`);\n }\n\n await fs.mkdir(this.config.worktreeDir, { recursive: true });\n\n // Get actual Git worktrees instead of just directories\n const worktrees = await this.gitService.getWorktrees();\n const worktreeBranches = worktrees.map((w) => w.branch);\n console.log(`Found ${worktrees.length} existing Git worktrees.`);\n\n // Clean up orphaned directories\n await this.cleanupOrphanedDirectories(worktrees);\n\n await this.createNewWorktrees(remoteBranches, worktreeBranches, defaultBranch);\n\n await this.pruneOldWorktrees(remoteBranches, worktreeBranches);\n\n // Update existing worktrees if enabled\n if (this.config.updateExistingWorktrees !== false) {\n await this.updateExistingWorktrees(worktrees, remoteBranches);\n }\n\n await this.gitService.pruneWorktrees();\n console.log(\"Step 5: Pruned worktree metadata.\");\n }, retryOptions);\n } catch (error) {\n console.error(\"\\n\u274C Error during worktree synchronization after all retry attempts:\", error);\n throw error;\n } finally {\n if (lfsSkipEnabled && !this.config.skipLfs) {\n delete process.env.GIT_LFS_SKIP_SMUDGE;\n }\n this.syncInProgress = false;\n console.log(`[${new Date().toISOString()}] Synchronization finished.\\n`);\n }\n }\n\n private async createNewWorktrees(\n remoteBranches: string[],\n existingWorktreeBranches: string[],\n defaultBranch: string,\n ): Promise<void> {\n const newBranches = remoteBranches\n .filter((b) => !existingWorktreeBranches.includes(b))\n .filter((b) => b !== defaultBranch);\n\n if (newBranches.length > 0) {\n console.log(`Step 2: Creating new worktrees for: ${newBranches.join(\", \")}`);\n for (const branchName of newBranches) {\n const worktreePath = path.join(this.config.worktreeDir, branchName);\n await this.gitService.addWorktree(branchName, worktreePath);\n }\n } else {\n console.log(\"Step 2: No new branches to create worktrees for.\");\n }\n }\n\n private async pruneOldWorktrees(remoteBranches: string[], existingWorktreeBranches: string[]): Promise<void> {\n const deletedBranches = existingWorktreeBranches.filter((branch) => !remoteBranches.includes(branch));\n\n if (deletedBranches.length > 0) {\n console.log(`Step 3: Checking for stale worktrees to prune: ${deletedBranches.join(\", \")}`);\n\n for (const branchName of deletedBranches) {\n const worktreePath = path.join(this.config.worktreeDir, branchName);\n\n try {\n const status = await this.gitService.getFullWorktreeStatus(worktreePath, this.config.debug);\n\n if (status.canRemove) {\n await this.gitService.removeWorktree(worktreePath);\n } else {\n if (status.upstreamGone && status.hasUnpushedCommits) {\n console.warn(` - \u26A0\uFE0F Cannot automatically remove '${branchName}' - upstream branch was deleted.`);\n console.log(` Please review manually: cd ${worktreePath} && git log`);\n console.log(\n ` If changes were squash-merged, you can safely remove with: git worktree remove ${worktreePath}`,\n );\n } else {\n console.log(` - \u26A0\uFE0F Skipping removal of '${branchName}' due to: ${status.reasons.join(\", \")}.`);\n }\n\n if (this.config.debug && status.details) {\n this.logDebugDetails(branchName, status.details);\n }\n }\n } catch (error) {\n console.error(` - Error checking worktree '${branchName}':`, error);\n }\n }\n } else {\n console.log(\"Step 3: No stale worktrees to prune.\");\n }\n }\n\n private logDebugDetails(branchName: string, details: WorktreeStatusDetails): void {\n console.log(`\\n \uD83D\uDD0D Debug details for '${branchName}':`);\n\n if (details.modifiedFiles > 0 && details.modifiedFilesList) {\n console.log(` - Modified files (${details.modifiedFiles}):`);\n details.modifiedFilesList.forEach((file) => console.log(` \u2022 ${file}`));\n }\n if (details.deletedFiles > 0 && details.deletedFilesList) {\n console.log(` - Deleted files (${details.deletedFiles}):`);\n details.deletedFilesList.forEach((file) => console.log(` \u2022 ${file}`));\n }\n if (details.renamedFiles > 0 && details.renamedFilesList) {\n console.log(` - Renamed files (${details.renamedFiles}):`);\n details.renamedFilesList.forEach((file) => console.log(` \u2022 ${file.from} \u2192 ${file.to}`));\n }\n if (details.createdFiles > 0 && details.createdFilesList) {\n console.log(` - Created files (${details.createdFiles}):`);\n details.createdFilesList.forEach((file) => console.log(` \u2022 ${file}`));\n }\n if (details.conflictedFiles > 0 && details.conflictedFilesList) {\n console.log(` - Conflicted files (${details.conflictedFiles}):`);\n details.conflictedFilesList.forEach((file) => console.log(` \u2022 ${file}`));\n }\n if (details.untrackedFiles > 0 && details.untrackedFilesList) {\n console.log(` - Untracked files (not ignored) (${details.untrackedFiles}):`);\n details.untrackedFilesList.forEach((file) => console.log(` \u2022 ${file}`));\n }\n if (details.unpushedCommitCount !== undefined && details.unpushedCommitCount > 0) {\n console.log(` - Unpushed commits: ${details.unpushedCommitCount}`);\n }\n if (details.stashCount !== undefined && details.stashCount > 0) {\n console.log(` - Stashed changes: ${details.stashCount}`);\n }\n if (details.operationType) {\n console.log(` - Operation in progress: ${details.operationType}`);\n }\n if (details.modifiedSubmodules && details.modifiedSubmodules.length > 0) {\n console.log(` - Modified submodules (${details.modifiedSubmodules.length}):`);\n details.modifiedSubmodules.forEach((submodule) => console.log(` \u2022 ${submodule}`));\n }\n\n console.log(\"\");\n }\n\n private async fetchBranchByBranch(): Promise<void> {\n console.log(\"Fetching branches individually to isolate LFS errors...\");\n\n // First, get the list of remote branches (this shouldn't fail due to LFS)\n const remoteBranches = await this.gitService.getRemoteBranches();\n console.log(`Found ${remoteBranches.length} remote branches to fetch.`);\n\n const failedBranches: string[] = [];\n let successCount = 0;\n\n for (const branch of remoteBranches) {\n try {\n await this.gitService.fetchBranch(branch);\n successCount++;\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n console.log(` \u26A0\uFE0F Failed to fetch branch '${branch}': ${errorMessage}`);\n failedBranches.push(branch);\n }\n }\n\n console.log(`Branch-by-branch fetch completed: ${successCount}/${remoteBranches.length} successful`);\n\n if (failedBranches.length > 0) {\n console.log(`\u26A0\uFE0F Failed to fetch ${failedBranches.length} branches due to errors.`);\n console.log(` These branches will be skipped: ${failedBranches.join(\", \")}`);\n }\n }\n\n private async updateExistingWorktrees(\n worktrees: { path: string; branch: string }[],\n remoteBranches: string[],\n ): Promise<void> {\n const worktreesToUpdate: { path: string; branch: string }[] = [];\n\n console.log(\"Step 4: Checking for worktrees that need updates...\");\n\n // Check for diverged worktrees\n const divergedDir = path.join(this.config.worktreeDir, \".diverged\");\n try {\n const diverged = await fs.readdir(divergedDir);\n if (diverged.length > 0) {\n console.log(`\uD83D\uDCE6 Note: ${diverged.length} diverged worktree(s) in ${path.relative(process.cwd(), divergedDir)}`);\n }\n } catch {\n // No diverged directory, that's fine\n }\n\n // Only check worktrees whose branches still exist remotely\n const activeWorktrees = worktrees.filter((w) => remoteBranches.includes(w.branch));\n\n // Check each active worktree to see if it's behind and clean\n for (const worktree of activeWorktrees) {\n try {\n // First check if the worktree directory actually exists\n try {\n await fs.access(worktree.path);\n } catch {\n // Directory doesn't exist, skip it\n continue;\n }\n\n // Skip if an operation is in progress (merge/rebase/etc.)\n const hasOp = await this.gitService.hasOperationInProgress(worktree.path);\n if (hasOp) {\n continue;\n }\n\n const isClean = await this.gitService.checkWorktreeStatus(worktree.path);\n if (!isClean) {\n continue; // Skip worktrees with local changes\n }\n\n // Check if we can fast-forward before attempting update\n const canFastForward = await this.gitService.canFastForward(worktree.path, worktree.branch);\n if (!canFastForward) {\n // Handle diverged branch\n await this.handleDivergedBranch(worktree);\n continue;\n }\n\n const isBehind = await this.gitService.isWorktreeBehind(worktree.path);\n if (isBehind) {\n worktreesToUpdate.push(worktree);\n }\n } catch (error) {\n console.error(` - Error checking worktree '${worktree.branch}':`, error);\n }\n }\n\n if (worktreesToUpdate.length > 0) {\n console.log(` - Found ${worktreesToUpdate.length} worktrees behind their upstream branches.`);\n\n for (const worktree of worktreesToUpdate) {\n try {\n console.log(` - Updating worktree '${worktree.branch}'...`);\n await this.gitService.updateWorktree(worktree.path);\n console.log(` \u2705 Successfully updated '${worktree.branch}'.`);\n } catch (error) {\n // Check if this is specifically a fast-forward error indicating diverged history\n const errorMessage = getErrorMessage(error);\n\n // Only treat as diverged if it's specifically a fast-forward failure\n // Other errors (network issues, permission problems, etc.) should not trigger divergence handling\n if (\n errorMessage.includes(\"Not possible to fast-forward\") ||\n errorMessage.includes(\"fatal: Not possible to fast-forward, aborting\") ||\n errorMessage.includes(\"cannot fast-forward\")\n ) {\n console.log(` \u26A0\uFE0F Branch '${worktree.branch}' cannot be fast-forwarded. Checking for divergence...`);\n try {\n await this.handleDivergedBranch(worktree);\n } catch (divergedError) {\n console.error(` \u274C Failed to handle diverged branch '${worktree.branch}':`, divergedError);\n }\n } else {\n // Other errors: network issues, permission problems, disk space, etc.\n console.error(` \u274C Failed to update '${worktree.branch}':`, error);\n }\n }\n }\n } else {\n console.log(\" - All worktrees are up to date.\");\n }\n }\n\n private async cleanupOrphanedDirectories(worktrees: { path: string; branch: string }[]): Promise<void> {\n try {\n const worktreeRelativePaths = worktrees.map((w) => path.relative(this.config.worktreeDir, w.path));\n const allDirs = await fs.readdir(this.config.worktreeDir);\n\n // Filter out special directories like .diverged\n const regularDirs = allDirs.filter((dir) => !dir.startsWith(\".\"));\n\n // For each directory, check if it's part of any worktree path\n const orphanedDirs: string[] = [];\n for (const dir of regularDirs) {\n // Check if this directory is part of any worktree path\n const isPartOfWorktree = worktreeRelativePaths.some((worktreePath) => {\n // Either the directory IS a worktree or it's a parent of a worktree\n return worktreePath === dir || worktreePath.startsWith(dir + path.sep);\n });\n\n if (!isPartOfWorktree) {\n orphanedDirs.push(dir);\n }\n }\n\n if (orphanedDirs.length > 0) {\n console.log(`Found ${orphanedDirs.length} orphaned directories: ${orphanedDirs.join(\", \")}`);\n\n for (const dir of orphanedDirs) {\n const dirPath = path.join(this.config.worktreeDir, dir);\n try {\n const stat = await fs.stat(dirPath);\n if (stat.isDirectory()) {\n await fs.rm(dirPath, { recursive: true, force: true });\n console.log(` - Removed orphaned directory: ${dir}`);\n }\n } catch (error) {\n console.error(` - Failed to remove orphaned directory ${dir}:`, error);\n }\n }\n }\n } catch (error) {\n console.error(\"Error during orphaned directory cleanup:\", error);\n }\n }\n\n private async handleDivergedBranch(worktree: { path: string; branch: string }): Promise<void> {\n console.log(`\u26A0\uFE0F Branch '${worktree.branch}' has diverged from upstream. Analyzing...`);\n\n const treesIdentical = await this.gitService.compareTreeContent(worktree.path, worktree.branch);\n\n if (treesIdentical) {\n console.log(`\u2705 Branch '${worktree.branch}' was rebased but files are identical. Resetting to upstream...`);\n await this.gitService.resetToUpstream(worktree.path, worktree.branch);\n console.log(` Successfully updated '${worktree.branch}' to match upstream.`);\n } else {\n const hasLocalChanges = await this.hasLocalChangesSinceLastSync(worktree.path);\n\n if (!hasLocalChanges) {\n console.log(\n `\u2705 Branch '${worktree.branch}' has diverged but you made no local changes. Resetting to upstream...`,\n );\n await this.gitService.resetToUpstream(worktree.path, worktree.branch);\n console.log(` Successfully updated '${worktree.branch}' to match upstream.`);\n } else {\n console.log(`\uD83D\uDD12 Branch '${worktree.branch}' has diverged with local changes. Moving to diverged...`);\n\n const divergedPath = await this.divergeWorktree(worktree.path, worktree.branch);\n const relativePath = path.relative(process.cwd(), divergedPath);\n\n console.log(` Moved to: ${relativePath}`);\n console.log(` Your local changes are preserved. To review:`);\n console.log(` cd ${relativePath}`);\n console.log(` git diff origin/${worktree.branch}`);\n\n await this.gitService.removeWorktree(worktree.path);\n await this.gitService.addWorktree(worktree.branch, worktree.path);\n console.log(` Created fresh worktree from upstream at: ${worktree.path}`);\n }\n }\n }\n\n private async hasLocalChangesSinceLastSync(worktreePath: string): Promise<boolean> {\n try {\n const metadata = await this.gitService.getWorktreeMetadata(worktreePath);\n if (!metadata || !metadata.lastSyncCommit) {\n return true;\n }\n\n const currentCommit = await this.gitService.getCurrentCommit(worktreePath);\n return currentCommit !== metadata.lastSyncCommit;\n } catch {\n return true;\n }\n }\n\n private async divergeWorktree(worktreePath: string, branchName: string): Promise<string> {\n // Create .diverged directory inside worktreeDir\n const divergedBaseDir = path.join(this.config.worktreeDir, \".diverged\");\n\n const timestamp = new Date().toISOString().split(\"T\")[0];\n const uniqueSuffix = Date.now().toString(36) + Math.random().toString(36).substr(2, 5);\n const safeBranchName = branchName.replace(/\\//g, \"-\");\n const divergedName = `${timestamp}-${safeBranchName}-${uniqueSuffix}`;\n const divergedPath = path.join(divergedBaseDir, divergedName);\n\n // Ensure diverged directory exists\n await fs.mkdir(divergedBaseDir, { recursive: true });\n\n // Move the worktree directory; on cross-device errors, fall back to copy+remove\n try {\n await fs.rename(worktreePath, divergedPath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes(\"EXDEV\")) {\n // Cross-device link not permitted: copy then remove\n await fs.cp(worktreePath, divergedPath, { recursive: true });\n await fs.rm(worktreePath, { recursive: true, force: true });\n } else {\n throw err;\n }\n }\n\n // Save metadata about why it was moved\n const metadata = {\n originalBranch: branchName,\n divergedAt: new Date().toISOString(),\n reason: \"diverged-history-with-changes\",\n originalPath: worktreePath,\n localCommit: await this.gitService.getCurrentCommit(divergedPath),\n remoteCommit: await this.gitService.getRemoteCommit(`origin/${branchName}`),\n instruction: `To preserve your changes:\n 1. Review: git diff origin/${branchName}\n 2. Keep changes: git push --force-with-lease origin ${branchName}\n 3. Discard changes: rm -rf this directory\n\n Original worktree location: ${worktreePath}`,\n };\n\n await fs.writeFile(path.join(divergedPath, \".diverged-info.json\"), JSON.stringify(metadata, null, 2));\n\n return divergedPath;\n }\n}\n", "export function parseDuration(durationStr: string): number | null {\n const match = durationStr.match(/^(\\d+)([hdwmy])$/);\n if (!match) {\n return null;\n }\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n const multipliers: Record<string, number> = {\n h: 60 * 60 * 1000, // hours\n d: 24 * 60 * 60 * 1000, // days\n w: 7 * 24 * 60 * 60 * 1000, // weeks\n m: 30 * 24 * 60 * 60 * 1000, // months (approximate)\n y: 365 * 24 * 60 * 60 * 1000, // years (approximate)\n };\n\n return value * multipliers[unit];\n}\n\nexport function filterBranchesByAge(\n branches: { branch: string; lastActivity: Date }[],\n maxAge: string,\n): { branch: string; lastActivity: Date }[] {\n const maxAgeMs = parseDuration(maxAge);\n if (maxAgeMs === null) {\n console.warn(`Invalid duration format: ${maxAge}. Using all branches.`);\n return branches;\n }\n\n const cutoffDate = new Date(Date.now() - maxAgeMs);\n\n return branches.filter(({ lastActivity }) => lastActivity >= cutoffDate);\n}\n\nexport function formatDuration(durationStr: string): string {\n const match = durationStr.match(/^(\\d+)([hdwmy])$/);\n if (!match) {\n return durationStr;\n }\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n const unitNames: Record<string, string> = {\n h: value === 1 ? \"hour\" : \"hours\",\n d: value === 1 ? \"day\" : \"days\",\n w: value === 1 ? \"week\" : \"weeks\",\n m: value === 1 ? \"month\" : \"months\",\n y: value === 1 ? \"year\" : \"years\",\n };\n\n return `${value} ${unitNames[unit]}`;\n}\n", "/**\n * Extracts error message from unknown error type\n * @param error The error to extract message from\n * @returns The error message string\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (error && typeof error === \"object\" && \"message\" in error) {\n return String((error as { message: unknown }).message);\n }\n return String(error);\n}\n\n/**\n * Common LFS error patterns that indicate Git LFS-related failures\n */\nexport const LFS_ERROR_PATTERNS = Object.freeze([\n \"smudge filter lfs failed\",\n \"Object does not exist on the server\",\n \"external filter 'git-lfs filter-process' failed\",\n] as const);\n\n/**\n * Checks if an error message contains any known LFS error patterns\n * @param errorMessage The error message to check\n * @returns true if the error is related to Git LFS\n */\nexport function isLfsError(errorMessage: string): boolean {\n return LFS_ERROR_PATTERNS.some((pattern) => errorMessage.includes(pattern));\n}\n\n/**\n * Checks if an error object contains any known LFS error patterns\n * @param error The error object to check\n * @returns true if the error is related to Git LFS\n */\nexport function isLfsErrorFromError(error: unknown): boolean {\n return isLfsError(getErrorMessage(error));\n}\n", "import { isLfsErrorFromError } from \"./lfs-error\";\n\ninterface ErrorWithCode {\n code?: string;\n message?: string;\n}\n\nexport interface LfsErrorContext {\n isLfsError: boolean;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number | \"unlimited\";\n maxLfsRetries?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffMultiplier?: number;\n shouldRetry?: (error: unknown, context?: LfsErrorContext) => boolean;\n onRetry?: (error: unknown, attempt: number, context?: LfsErrorContext) => void;\n lfsRetryHandler?: (context: LfsErrorContext) => void;\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<RetryOptions, \"maxAttempts\">> & { maxAttempts: number | \"unlimited\" } = {\n maxAttempts: \"unlimited\",\n maxLfsRetries: 2,\n initialDelayMs: 1000,\n maxDelayMs: 600000, // 10 minutes\n backoffMultiplier: 2,\n shouldRetry: (error, context) => {\n const err = error as ErrorWithCode;\n\n // Check for LFS errors\n if (isLfsErrorFromError(error)) {\n if (context) {\n context.isLfsError = true;\n }\n return true;\n }\n\n if (err.code === \"ENOTFOUND\" || err.code === \"ECONNREFUSED\" || err.code === \"ETIMEDOUT\") {\n return true;\n }\n\n if (err.code === \"EBUSY\" || err.code === \"ENOENT\" || err.code === \"EACCES\") {\n return true;\n }\n\n if (err.message?.includes(\"Could not read from remote repository\")) {\n return true;\n }\n\n if (err.message?.includes(\"fatal: unable to access\")) {\n return true;\n }\n\n return false;\n },\n onRetry: () => {},\n lfsRetryHandler: (_context) => {},\n};\n\nexport async function retry<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n let attempt = 1;\n let lfsAttempt = 0;\n const lfsContext: LfsErrorContext = { isLfsError: false };\n\n while (true) {\n try {\n return await fn();\n } catch (error) {\n // Reset LFS error flag for each attempt\n lfsContext.isLfsError = false;\n\n // Check if we should retry\n if (!opts.shouldRetry(error, lfsContext)) {\n throw error;\n }\n\n // Track LFS attempts separately\n if (lfsContext.isLfsError) {\n lfsAttempt++;\n\n // Check if we've exceeded LFS retry limit\n if (lfsAttempt > opts.maxLfsRetries) {\n const err = error as Error;\n throw new Error(\n `LFS error retry limit exceeded (${opts.maxLfsRetries} attempts). ` +\n `Consider using --skip-lfs option to bypass LFS downloads.`,\n { cause: err },\n );\n }\n }\n\n const isLastAttempt = opts.maxAttempts !== \"unlimited\" && attempt >= opts.maxAttempts;\n if (isLastAttempt) {\n throw error;\n }\n\n // Handle LFS errors specifically\n if (lfsContext.isLfsError && opts.lfsRetryHandler) {\n opts.lfsRetryHandler(lfsContext);\n }\n\n const delay = Math.min(opts.initialDelayMs * Math.pow(opts.backoffMultiplier, attempt - 1), opts.maxDelayMs);\n\n opts.onRetry(error, attempt, lfsContext);\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n attempt++;\n }\n }\n}\n", "import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport simpleGit from \"simple-git\";\n\nimport { getDefaultBareRepoDir } from \"../utils/git-url\";\nimport { getErrorMessage } from \"../utils/lfs-error\";\n\nimport { WorktreeMetadataService } from \"./worktree-metadata.service\";\nimport { WorktreeStatusService } from \"./worktree-status.service\";\n\nimport type { Config } from \"../types\";\nimport type { WorktreeStatusResult } from \"./worktree-status.service\";\nimport type { SyncMetadata } from \"../types/sync-metadata\";\nimport type { SimpleGit } from \"simple-git\";\n\nexport class GitService {\n private git: SimpleGit | null = null;\n private bareRepoPath: string;\n private mainWorktreePath: string;\n private defaultBranch: string = \"main\"; // Will be updated after detection\n private metadataService: WorktreeMetadataService;\n private statusService: WorktreeStatusService;\n\n constructor(private config: Config) {\n this.bareRepoPath = this.config.bareRepoDir || getDefaultBareRepoDir(this.config.repoUrl);\n this.mainWorktreePath = path.join(this.config.worktreeDir, \"main\"); // Temporary, will be updated\n this.metadataService = new WorktreeMetadataService();\n this.statusService = new WorktreeStatusService({ skipLfs: this.config.skipLfs });\n }\n\n async initialize(): Promise<SimpleGit> {\n const { repoUrl } = this.config;\n\n try {\n // Check if bare repo already exists\n await fs.access(path.join(this.bareRepoPath, \"HEAD\"));\n console.log(`Bare repository at \"${this.bareRepoPath}\" already exists. Using it.`);\n } catch {\n // Clone as bare repository\n console.log(`Cloning from \"${repoUrl}\" as bare repository into \"${this.bareRepoPath}\"...`);\n await fs.mkdir(path.dirname(this.bareRepoPath), { recursive: true });\n const cloneGit = this.isLfsSkipEnabled() ? simpleGit().env({ GIT_LFS_SKIP_SMUDGE: \"1\" }) : simpleGit();\n await cloneGit.clone(repoUrl, this.bareRepoPath, [\"--bare\"]);\n console.log(\"\u2705 Clone successful.\");\n }\n\n // Configure bare repository for worktrees\n const bareGit = simpleGit(this.bareRepoPath);\n\n // Check if fetch config already exists\n try {\n const existingConfig = await bareGit.raw([\"config\", \"--get-all\", \"remote.origin.fetch\"]);\n const targetConfig = \"+refs/heads/*:refs/remotes/origin/*\";\n\n if (!existingConfig.includes(targetConfig)) {\n await bareGit.addConfig(\"remote.origin.fetch\", targetConfig);\n }\n } catch {\n // Config doesn't exist, add it\n await bareGit.addConfig(\"remote.origin.fetch\", \"+refs/heads/*:refs/remotes/origin/*\");\n }\n\n // Fetch all remote branches to ensure they exist locally\n console.log(\"Fetching remote branches...\");\n await bareGit.fetch([\"--all\"]);\n\n // Detect the default branch\n this.defaultBranch = await this.detectDefaultBranch(bareGit);\n this.mainWorktreePath = path.join(this.config.worktreeDir, this.defaultBranch);\n console.log(`Detected default branch: ${this.defaultBranch}`);\n\n // Check if main worktree exists\n let needsMainWorktree = true;\n try {\n const worktrees = await this.getWorktreesFromBare(bareGit);\n needsMainWorktree = !worktrees.some((w) => path.resolve(w.path) === path.resolve(this.mainWorktreePath));\n } catch {\n // If worktree list fails, assume we need main worktree\n }\n\n if (needsMainWorktree) {\n // Create main worktree if it doesn't exist\n console.log(`Creating ${this.defaultBranch} worktree at \"${this.mainWorktreePath}\"...`);\n await fs.mkdir(this.config.worktreeDir, { recursive: true });\n // Use absolute path for worktree add to avoid relative path issues\n const absoluteWorktreePath = path.resolve(this.mainWorktreePath);\n\n try {\n // Check if local branch exists\n const branches = await bareGit.branch();\n const defaultBranchExists = branches.all.includes(this.defaultBranch);\n\n if (defaultBranchExists) {\n await bareGit.raw([\"worktree\", \"add\", absoluteWorktreePath, this.defaultBranch]);\n // Set upstream tracking after creating worktree\n const worktreeGit = this.isLfsSkipEnabled()\n ? simpleGit(absoluteWorktreePath).env({ GIT_LFS_SKIP_SMUDGE: \"1\" })\n : simpleGit(absoluteWorktreePath);\n await worktreeGit.branch([\"--set-upstream-to\", `origin/${this.defaultBranch}`, this.defaultBranch]);\n } else {\n // Create new branch tracking the remote branch\n await bareGit.raw([\n \"worktree\",\n \"add\",\n \"--track\",\n \"-b\",\n this.defaultBranch,\n absoluteWorktreePath,\n `origin/${this.defaultBranch}`,\n ]);\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n // Check if error is because directory already exists\n if (errorMessage.includes(\"already exists\")) {\n console.log(\n `${this.defaultBranch} worktree directory already exists at '${absoluteWorktreePath}', skipping creation.`,\n );\n } else {\n // Fallback to simple add if tracking setup fails\n console.warn(`Failed to create ${this.defaultBranch} worktree with tracking, using simple add: ${error}`);\n try {\n await bareGit.raw([\"worktree\", \"add\", absoluteWorktreePath, this.defaultBranch]);\n } catch (fallbackError) {\n const fallbackErrorMessage = getErrorMessage(fallbackError);\n if (fallbackErrorMessage.includes(\"already exists\")) {\n console.log(\n `${this.defaultBranch} worktree directory already exists at '${absoluteWorktreePath}', skipping creation.`,\n );\n } else {\n throw fallbackError;\n }\n }\n }\n }\n\n // Ensure the worktree is registered by checking it exists in the list\n const updatedWorktrees = await this.getWorktreesFromBare(bareGit);\n const mainWorktreeRegistered = updatedWorktrees.some(\n (w) => path.resolve(w.path) === path.resolve(this.mainWorktreePath),\n );\n\n if (!mainWorktreeRegistered) {\n // Only warn in non-test environments as this is common in tests due to Git state\n if (process.env.NODE_ENV !== \"test\") {\n console.warn(`Main worktree was created but not found in worktree list. This may cause issues.`);\n }\n }\n }\n\n // Use the main worktree as our primary git instance\n this.git = simpleGit(this.mainWorktreePath);\n return this.git;\n }\n\n getGit(): SimpleGit {\n if (!this.git) {\n throw new Error(\"Git service not initialized. Call initialize() first.\");\n }\n return this.git;\n }\n\n getDefaultBranch(): string {\n return this.defaultBranch;\n }\n\n async fetchAll(): Promise<void> {\n const git = this.getGit();\n console.log(\"Fetching latest data from remote...\");\n\n if (this.isLfsSkipEnabled()) {\n await git.env({ GIT_LFS_SKIP_SMUDGE: \"1\" }).fetch([\"--all\", \"--prune\"]);\n } else {\n await git.fetch([\"--all\", \"--prune\"]);\n }\n }\n\n async fetchBranch(branchName: string): Promise<void> {\n const git = this.getGit();\n\n // Update only the remote ref for the branch to keep refs/remotes/origin/* fresh\n if (this.isLfsSkipEnabled()) {\n await git.env({ GIT_LFS_SKIP_SMUDGE: \"1\" }).fetch([\"origin\", branchName, \"--prune\"]);\n } else {\n await git.fetch([\"origin\", branchName, \"--prune\"]);\n }\n }\n\n async getRemoteBranches(): Promise<string[]> {\n const git = this.getGit();\n const branches = await git.branch([\"-r\"]);\n return branches.all\n .filter((b) => b.startsWith(\"origin/\") && !b.endsWith(\"/HEAD\"))\n .map((b) => b.replace(\"origin/\", \"\"))\n .filter((b) => b !== \"origin\" && b.length > 0);\n }\n\n async getRemoteBranchesWithActivity(): Promise<{ branch: string; lastActivity: Date }[]> {\n const git = this.getGit();\n // Use for-each-ref to get branch names with their last commit dates\n const result = await git.raw([\n \"for-each-ref\",\n \"--format=%(refname:short)|%(committerdate:iso8601)\",\n \"refs/remotes/origin\",\n ]);\n\n const branches: { branch: string; lastActivity: Date }[] = [];\n const lines = result\n .trim()\n .split(\"\\n\")\n .filter((line) => line);\n\n for (const line of lines) {\n const [ref, dateStr] = line.split(\"|\", 2);\n if (ref && dateStr && !ref.endsWith(\"/HEAD\")) {\n const branch = ref.replace(\"origin/\", \"\");\n // Skip invalid branch names\n if (branch === \"origin\" || branch.length === 0) {\n continue;\n }\n const lastActivity = new Date(dateStr);\n // Skip if the date is invalid\n if (!isNaN(lastActivity.getTime())) {\n branches.push({ branch, lastActivity });\n }\n }\n }\n\n return branches;\n }\n\n private async verifyLfsFilesDownloaded(worktreePath: string, branchName: string): Promise<void> {\n const worktreeGit = simpleGit(worktreePath);\n\n try {\n const lfsFiles = await worktreeGit.raw([\"lfs\", \"ls-files\", \"--name-only\"]);\n const lfsFileList = lfsFiles\n .trim()\n .split(\"\\n\")\n .filter((f) => f.length > 0);\n\n if (lfsFileList.length === 0) {\n return;\n }\n\n if (this.config.debug) {\n console.log(` - Verifying ${lfsFileList.length} LFS files are downloaded...`);\n }\n\n const sampleSize = Math.min(5, lfsFileList.length);\n const samplesToCheck = [];\n for (let i = 0; i < sampleSize; i++) {\n const randomIndex = Math.floor(Math.random() * lfsFileList.length);\n samplesToCheck.push(lfsFileList[randomIndex]);\n }\n\n let retries = 0;\n const maxRetries = 30;\n const retryDelay = 1000;\n\n while (retries < maxRetries) {\n let allDownloaded = true;\n const notDownloaded: string[] = [];\n\n for (const file of samplesToCheck) {\n const filePath = path.join(worktreePath, file);\n try {\n const handle = await fs.open(filePath, \"r\");\n try {\n const buffer = Buffer.alloc(200);\n const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);\n const header = buffer.subarray(0, bytesRead).toString(\"utf8\");\n if (header.startsWith(\"version https://git-lfs.github.com/spec/\")) {\n allDownloaded = false;\n notDownloaded.push(file);\n }\n } finally {\n await handle.close();\n }\n } catch {\n allDownloaded = false;\n notDownloaded.push(file);\n }\n }\n\n if (allDownloaded) {\n if (this.config.debug) {\n console.log(` - \u2705 LFS files verified (${samplesToCheck.length} samples checked)`);\n }\n return;\n }\n\n retries++;\n if (retries < maxRetries) {\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n }\n }\n\n console.warn(\n ` - \u26A0\uFE0F Warning: Some LFS files may not be fully downloaded after ${maxRetries} seconds. ` +\n `This might cause issues if tools access the worktree immediately.`,\n );\n } catch (error) {\n console.warn(` - \u26A0\uFE0F Warning: Could not verify LFS files for '${branchName}': ${error}`);\n }\n }\n\n private async createWorktreeMetadata(bareGit: SimpleGit, worktreePath: string, branchName: string): Promise<void> {\n try {\n const worktreeGit = this.isLfsSkipEnabled()\n ? simpleGit(worktreePath).env({ GIT_LFS_SKIP_SMUDGE: \"1\" })\n : simpleGit(worktreePath);\n const currentCommit = await worktreeGit.revparse([\"HEAD\"]);\n const parentCommit = await bareGit.revparse([this.defaultBranch]);\n\n await this.metadataService.createInitialMetadataFromPath(\n this.bareRepoPath,\n worktreePath,\n currentCommit.trim(),\n `origin/${branchName}`,\n this.defaultBranch,\n parentCommit.trim(),\n );\n } catch (metadataError) {\n console.error(` - \u274C Failed to create metadata for '${branchName}': ${metadataError}`);\n throw new Error(`Metadata creation failed for ${branchName}. This worktree cannot be auto-managed.`);\n }\n }\n\n async addWorktree(branchName: string, worktreePath: string): Promise<void> {\n const bareGit = this.isLfsSkipEnabled()\n ? simpleGit(this.bareRepoPath).env({ GIT_LFS_SKIP_SMUDGE: \"1\" })\n : simpleGit(this.bareRepoPath);\n // Use absolute path for worktree add to avoid relative path issues\n const absoluteWorktreePath = path.resolve(worktreePath);\n // Ensure parent directory exists for nested branch paths\n await fs.mkdir(path.dirname(absoluteWorktreePath), { recursive: true });\n\n // Check if directory already exists (could be from a failed previous attempt)\n try {\n await fs.access(absoluteWorktreePath);\n // Directory exists - check if it's already a valid worktree\n const worktrees = await this.getWorktreesFromBare(bareGit);\n const isValidWorktree = worktrees.some((w) => path.resolve(w.path) === absoluteWorktreePath);\n\n if (isValidWorktree) {\n console.log(` - Worktree for '${branchName}' already exists at '${absoluteWorktreePath}'`);\n return;\n } else {\n // Directory exists but is not a valid worktree - clean it up\n console.log(` - Cleaning up orphaned directory at '${absoluteWorktreePath}'`);\n await fs.rm(absoluteWorktreePath, { recursive: true, force: true });\n }\n } catch {\n // Directory doesn't exist, which is expected - continue with creation\n }\n\n try {\n // Check if local branch already exists\n const branches = await bareGit.branch();\n const localBranchExists = branches.all.includes(branchName);\n\n if (localBranchExists || branchName.includes(\"/\")) {\n await bareGit.raw([\"worktree\", \"add\", absoluteWorktreePath, branchName]);\n\n const worktreeGit = this.isLfsSkipEnabled()\n ? simpleGit(absoluteWorktreePath).env({ GIT_LFS_SKIP_SMUDGE: \"1\" })\n : simpleGit(absoluteWorktreePath);\n await worktreeGit.branch([\"--set-upstream-to\", `origin/${branchName}`, branchName]);\n } else {\n // Create new branch tracking the remote branch\n await bareGit.raw([\n \"worktree\",\n \"add\",\n \"--track\",\n \"-b\",\n branchName,\n absoluteWorktreePath,\n `origin/${branchName}`,\n ]);\n }\n\n console.log(` - Created worktree for '${branchName}' with tracking to origin/${branchName}`);\n\n // Verify LFS files are properly downloaded (if not skipping LFS)\n if (!this.isLfsSkipEnabled()) {\n await this.verifyLfsFilesDownloaded(absoluteWorktreePath, branchName);\n }\n\n // Create metadata for the new worktree\n await this.createWorktreeMetadata(bareGit, absoluteWorktreePath, branchName);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n // Re-throw metadata creation errors - these are fatal and should not fall back\n if (errorMessage.includes(\"Metadata creation failed\")) {\n throw error;\n }\n\n // Check if this is an \"already registered\" error\n if (errorMessage.includes(\"already registered worktree\")) {\n console.warn(` - Worktree already registered but missing. Pruning and retrying...`);\n await bareGit.raw([\"worktree\", \"prune\"]);\n // Clean up directory if it exists\n try {\n await fs.rm(absoluteWorktreePath, { recursive: true, force: true });\n } catch {\n // Directory might not exist, ignore\n }\n // Retry once after pruning\n try {\n await bareGit.raw([\n \"worktree\",\n \"add\",\n \"--track\",\n \"-b\",\n branchName,\n absoluteWorktreePath,\n `origin/${branchName}`,\n ]);\n console.log(` - Created worktree for '${branchName}' after pruning`);\n\n // Verify LFS files are properly downloaded (if not skipping LFS)\n if (!this.isLfsSkipEnabled()) {\n await this.verifyLfsFilesDownloaded(absoluteWorktreePath, branchName);\n }\n\n await this.createWorktreeMetadata(bareGit, absoluteWorktreePath, branchName);\n return;\n } catch (retryError) {\n console.error(` - Failed to create worktree after pruning: ${retryError}`);\n throw retryError;\n }\n }\n\n // If the worktree add fails with tracking, fall back to non-tracking version\n // This handles edge cases where the remote branch might not exist yet\n console.warn(` - Failed to create worktree with tracking, falling back to simple add: ${error}`);\n\n // Check again if directory exists before fallback attempt\n try {\n await fs.access(absoluteWorktreePath);\n // Directory exists - check if it's already a valid worktree\n const worktrees = await this.getWorktreesFromBare(bareGit);\n const isValidWorktree = worktrees.some((w) => path.resolve(w.path) === absoluteWorktreePath);\n\n if (isValidWorktree) {\n console.log(` - Worktree for '${branchName}' already exists at '${absoluteWorktreePath}'`);\n return;\n } else {\n // Directory exists but is not a valid worktree - clean it up\n console.log(` - Cleaning up orphaned directory at '${absoluteWorktreePath}' before fallback attempt`);\n await fs.rm(absoluteWorktreePath, { recursive: true, force: true });\n }\n } catch {\n // Directory doesn't exist, which is expected - continue with fallback\n }\n\n await bareGit.raw([\"worktree\", \"add\", absoluteWorktreePath, branchName]);\n console.log(` - Created worktree for '${branchName}' (without tracking)`);\n\n // Verify LFS files are properly downloaded (if not skipping LFS)\n if (!this.isLfsSkipEnabled()) {\n await this.verifyLfsFilesDownloaded(absoluteWorktreePath, branchName);\n }\n\n // Try to create metadata even without tracking\n await this.createWorktreeMetadata(bareGit, absoluteWorktreePath, branchName);\n }\n }\n\n async removeWorktree(worktreePath: string): Promise<void> {\n const bareGit = simpleGit(this.bareRepoPath);\n\n await bareGit.raw([\"worktree\", \"remove\", worktreePath, \"--force\"]);\n console.log(` - \u2705 Safely removed stale worktree at '${worktreePath}'.`);\n\n // Clean up metadata using the worktree path\n try {\n await this.metadataService.deleteMetadataFromPath(this.bareRepoPath, worktreePath);\n } catch (metadataError) {\n console.warn(`Failed to delete metadata for worktree: ${metadataError}`);\n }\n }\n\n async pruneWorktrees(): Promise<void> {\n const bareGit = simpleGit(this.bareRepoPath);\n await bareGit.raw([\"worktree\", \"prune\"]);\n console.log(\"Pruned worktree metadata.\");\n }\n\n async checkWorktreeStatus(worktreePath: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n const status = await worktreeGit.status();\n return status.isClean();\n }\n\n private async isDetachedHead(worktreeGit: SimpleGit): Promise<boolean> {\n try {\n const branchSummary = await worktreeGit.branch();\n return !branchSummary.current || branchSummary.detached;\n } catch {\n return true;\n }\n }\n\n async hasUnpushedCommits(worktreePath: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n try {\n // Check if in detached HEAD state\n if (await this.isDetachedHead(worktreeGit)) {\n return false;\n }\n\n // Get the current branch name\n const branchSummary = await worktreeGit.branch();\n const currentBranch = branchSummary.current;\n\n // Check if upstream is gone\n const upstreamGone = await this.hasUpstreamGone(worktreePath);\n if (upstreamGone) {\n // Load metadata to check for commits after last sync (use path-based method)\n const metadata = await this.metadataService.loadMetadataFromPath(this.bareRepoPath, worktreePath);\n if (metadata?.lastSyncCommit) {\n try {\n // Check for commits after last sync\n const newCommitsResult = await worktreeGit.raw([\"rev-list\", \"--count\", `${metadata.lastSyncCommit}..HEAD`]);\n const newCommitsCount = parseInt(newCommitsResult.trim(), 10);\n return newCommitsCount > 0;\n } catch {\n // If lastSyncCommit doesn't exist, fall through to regular check\n }\n }\n }\n\n // Count commits that exist in the current branch but not in any remote\n const result = await worktreeGit.raw([\"rev-list\", \"--count\", currentBranch, \"--not\", \"--remotes\"]);\n\n const unpushedCount = parseInt(result.trim(), 10);\n return unpushedCount > 0;\n } catch (error) {\n // If the command fails (e.g., branch doesn't exist), assume it's safe\n console.error(`Error checking unpushed commits: ${error}`);\n return false;\n }\n }\n\n async hasUpstreamGone(worktreePath: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n try {\n // Check if in detached HEAD state\n if (await this.isDetachedHead(worktreeGit)) {\n return false;\n }\n\n const branchSummary = await worktreeGit.branch();\n const currentBranch = branchSummary.current;\n\n // Try to get upstream branch\n const upstream = await worktreeGit.raw([\"rev-parse\", \"--abbrev-ref\", `${currentBranch}@{upstream}`]);\n\n // Check if upstream exists in remotes\n const remoteBranches = await worktreeGit.branch([\"-r\"]);\n return !remoteBranches.all.includes(upstream.trim());\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (\n errorMessage.includes(\"fatal: no upstream configured\") ||\n errorMessage.includes(\"no upstream configured for branch\")\n ) {\n return false;\n }\n\n if (errorMessage.includes(\"fatal: ambiguous argument\") || errorMessage.includes(\"unknown revision or path\")) {\n try {\n const branchSummary = await worktreeGit.branch();\n const currentBranch = branchSummary.current;\n\n const remoteResult = await worktreeGit\n .raw([\"config\", \"--get\", `branch.${currentBranch}.remote`])\n .catch(() => \"\");\n const mergeResult = await worktreeGit\n .raw([\"config\", \"--get\", `branch.${currentBranch}.merge`])\n .catch(() => \"\");\n\n const remote = remoteResult.trim();\n const merge = mergeResult.trim();\n\n if (remote && merge) {\n const remoteBranchName = merge.replace(\"refs/heads/\", \"\");\n const expectedUpstream = `${remote}/${remoteBranchName}`;\n\n const remoteBranches = await worktreeGit.branch([\"-r\"]);\n return !remoteBranches.all.includes(expectedUpstream);\n }\n } catch {\n // Can't determine config, be conservative\n }\n\n return false;\n }\n\n console.error(\n `Unexpected error checking upstream status for ${worktreePath}. ` +\n `This might indicate a real issue rather than a missing upstream. ` +\n `Error: ${errorMessage}`,\n );\n\n return false;\n }\n }\n\n async hasStashedChanges(worktreePath: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n try {\n const stashList = await worktreeGit.stashList();\n return stashList.total > 0;\n } catch (error) {\n // If stash check fails, assume it's unsafe to delete\n console.error(`Error checking stash: ${error}`);\n return true;\n }\n }\n\n async getFullWorktreeStatus(worktreePath: string, includeDetails = false): Promise<WorktreeStatusResult> {\n const metadata = await this.metadataService.loadMetadataFromPath(this.bareRepoPath, worktreePath);\n return this.statusService.getFullWorktreeStatus(worktreePath, includeDetails, metadata?.lastSyncCommit);\n }\n\n async hasModifiedSubmodules(worktreePath: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n try {\n const result = await worktreeGit.raw([\"submodule\", \"status\"]);\n // Check for '+' or '-' prefix indicating modifications\n return /^[+-]/m.test(result);\n } catch {\n return false; // No submodules or submodule command failed\n }\n }\n\n async hasOperationInProgress(worktreePath: string): Promise<boolean> {\n // Resolve the actual git directory; in worktrees .git is a file pointing to the real gitdir\n let resolvedGitDir = path.join(worktreePath, \".git\");\n try {\n const stat = await fs.stat(resolvedGitDir);\n if (stat.isFile()) {\n const content = await fs.readFile(resolvedGitDir, \"utf-8\");\n const match = content.match(/gitdir:\\s*(.*)/i);\n if (match && match[1]) {\n resolvedGitDir = match[1].trim();\n if (!path.isAbsolute(resolvedGitDir)) {\n resolvedGitDir = path.resolve(worktreePath, resolvedGitDir);\n }\n }\n }\n } catch {\n // Fall back to default .git directory\n }\n\n const checkFiles = [\"MERGE_HEAD\", \"CHERRY_PICK_HEAD\", \"REVERT_HEAD\", \"BISECT_LOG\", \"rebase-merge\", \"rebase-apply\"];\n for (const file of checkFiles) {\n try {\n await fs.access(path.join(resolvedGitDir, file));\n return true; // Operation in progress\n } catch {\n // File doesn't exist, continue checking\n }\n }\n return false;\n }\n\n async getCurrentBranch(): Promise<string> {\n const git = this.getGit();\n const branchSummary = await git.branch();\n return branchSummary.current;\n }\n\n private async detectDefaultBranch(bareGit: SimpleGit): Promise<string> {\n try {\n // Try to get the symbolic ref for origin/HEAD\n const headRef = await bareGit.raw([\"symbolic-ref\", \"refs/remotes/origin/HEAD\"]);\n // Extract branch name from refs/remotes/origin/main or refs/remotes/origin/master\n const branch = headRef.trim().split(\"/\").pop();\n if (branch) {\n return branch;\n }\n } catch {\n // If that fails, try to set HEAD automatically\n try {\n await bareGit.raw([\"remote\", \"set-head\", \"origin\", \"-a\"]);\n const headRef = await bareGit.raw([\"symbolic-ref\", \"refs/remotes/origin/HEAD\"]);\n const branch = headRef.trim().split(\"/\").pop();\n if (branch) {\n return branch;\n }\n } catch {\n // If all else fails, try to detect from remote branches\n try {\n const remoteBranches = await bareGit.branch([\"-r\"]);\n // Common default branch names in order of preference\n const commonDefaults = [\"main\", \"master\", \"develop\", \"trunk\"];\n for (const defaultName of commonDefaults) {\n if (remoteBranches.all.some((branch) => branch === `origin/${defaultName}`)) {\n return defaultName;\n }\n }\n } catch {\n // Ignore and fall through to default\n }\n }\n }\n // Final fallback\n return \"main\";\n }\n\n private isLfsSkipEnabled(): boolean {\n return this.config.skipLfs || process.env.GIT_LFS_SKIP_SMUDGE === \"1\";\n }\n\n async getWorktrees(): Promise<{ path: string; branch: string }[]> {\n const bareGit = simpleGit(this.bareRepoPath);\n return this.getWorktreesFromBare(bareGit);\n }\n\n async isWorktreeBehind(worktreePath: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n try {\n // Get the current branch\n const branchSummary = await worktreeGit.branch();\n const currentBranch = branchSummary.current;\n\n // Check if the branch has an upstream\n const upstreamInfo = await worktreeGit.raw([\"rev-parse\", \"--abbrev-ref\", `${currentBranch}@{upstream}`]);\n if (!upstreamInfo.trim()) {\n return false; // No upstream, can't be behind\n }\n\n // Count commits behind upstream\n const behindCount = await worktreeGit.raw([\"rev-list\", \"--count\", `HEAD..${upstreamInfo.trim()}`]);\n return parseInt(behindCount.trim(), 10) > 0;\n } catch {\n // If any command fails, assume not behind\n return false;\n }\n }\n\n async updateWorktree(worktreePath: string): Promise<void> {\n const worktreeGit = this.isLfsSkipEnabled()\n ? simpleGit(worktreePath).env({ GIT_LFS_SKIP_SMUDGE: \"1\" })\n : simpleGit(worktreePath);\n\n // Perform a fast-forward merge\n const branchSummary = await worktreeGit.branch();\n const currentBranch = branchSummary.current;\n\n await worktreeGit.merge([`origin/${currentBranch}`, \"--ff-only\"]);\n\n // Skip metadata update for main worktree\n const isMainWorktree = path.resolve(worktreePath) === path.resolve(this.mainWorktreePath);\n if (isMainWorktree) {\n return;\n }\n\n // Update metadata after successful update (use path-based method)\n try {\n const currentCommit = await worktreeGit.revparse([\"HEAD\"]);\n await this.metadataService.updateLastSyncFromPath(\n this.bareRepoPath,\n worktreePath,\n currentCommit.trim(),\n \"updated\",\n this.defaultBranch,\n );\n } catch (metadataError) {\n console.warn(`Failed to update metadata for worktree: ${metadataError}`);\n }\n }\n\n async hasDivergedHistory(worktreePath: string, expectedBranch: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n\n // Validate branch matches\n const branchInfo = await worktreeGit.branch();\n if (branchInfo.current !== expectedBranch) {\n console.warn(`Branch mismatch in hasDivergedHistory: expected ${expectedBranch}, got ${branchInfo.current}`);\n return false; // Conservative: assume can fast-forward\n }\n\n try {\n // Check if HEAD is an ancestor of the remote branch (can fast-forward)\n await worktreeGit.raw([\"merge-base\", \"--is-ancestor\", \"HEAD\", `origin/${expectedBranch}`]);\n return false; // Can fast-forward\n } catch {\n return true; // Histories have diverged\n }\n }\n\n async canFastForward(worktreePath: string, branch: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n try {\n // Get the merge base between HEAD and the remote branch\n const mergeBase = await worktreeGit.raw([\"merge-base\", \"HEAD\", `origin/${branch}`]);\n const mergeBaseSha = mergeBase.trim();\n\n // Get current HEAD SHA\n const headSha = await worktreeGit.revparse([\"HEAD\"]);\n const headShaTrimmed = headSha.trim();\n\n // If merge base equals HEAD, then HEAD is an ancestor of remote and can fast-forward\n return mergeBaseSha === headShaTrimmed;\n } catch {\n // If merge-base fails, branches have diverged\n return false;\n }\n }\n\n async compareTreeContent(worktreePath: string, branch: string): Promise<boolean> {\n const worktreeGit = simpleGit(worktreePath);\n try {\n // Get the tree SHA for the current HEAD\n const localTree = await worktreeGit.raw([\"rev-parse\", \"HEAD^{tree}\"]);\n // Get the tree SHA for the remote branch\n const remoteTree = await worktreeGit.raw([\"rev-parse\", `origin/${branch}^{tree}`]);\n\n return localTree.trim() === remoteTree.trim();\n } catch (error) {\n console.error(`Error comparing tree content: ${error}`);\n return false; // Assume trees are different if we can't compare\n }\n }\n\n async resetToUpstream(worktreePath: string, branch: string): Promise<void> {\n const worktreeGit = this.isLfsSkipEnabled()\n ? simpleGit(worktreePath).env({ GIT_LFS_SKIP_SMUDGE: \"1\" })\n : simpleGit(worktreePath);\n\n await worktreeGit.reset([\"--hard\", `origin/${branch}`]);\n\n // Update metadata after reset (use path-based method)\n try {\n const currentCommit = await worktreeGit.revparse([\"HEAD\"]);\n await this.metadataService.updateLastSyncFromPath(\n this.bareRepoPath,\n worktreePath,\n currentCommit.trim(),\n \"updated\",\n this.defaultBranch,\n );\n } catch (metadataError) {\n console.warn(`Failed to update metadata after reset: ${metadataError}`);\n }\n }\n\n async getCurrentCommit(worktreePath: string): Promise<string> {\n const worktreeGit = simpleGit(worktreePath);\n const commit = await worktreeGit.revparse([\"HEAD\"]);\n return commit.trim();\n }\n\n async getRemoteCommit(ref: string): Promise<string> {\n // Use the bare repository to read remote commit to avoid dependency on main worktree path\n const git = simpleGit(this.bareRepoPath);\n const commit = await git.revparse([ref]);\n return commit.trim();\n }\n\n async getWorktreeMetadata(worktreePath: string): Promise<SyncMetadata | null> {\n return this.metadataService.loadMetadataFromPath(this.bareRepoPath, worktreePath);\n }\n\n private async getWorktreesFromBare(bareGit: SimpleGit): Promise<{ path: string; branch: string }[]> {\n const result = await bareGit.raw([\"worktree\", \"list\", \"--porcelain\"]);\n\n const worktrees: { path: string; branch: string }[] = [];\n const lines = result.trim().split(\"\\n\");\n\n let currentWorktree: { path?: string; branch?: string; detached?: boolean } = {};\n\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) {\n currentWorktree.path = line.substring(9);\n } else if (line.startsWith(\"branch \")) {\n currentWorktree.branch = line.substring(7).replace(\"refs/heads/\", \"\");\n } else if (line === \"detached\") {\n currentWorktree.detached = true;\n } else if (line.trim() === \"\") {\n if (currentWorktree.path) {\n // Only include worktrees that have a branch (not detached)\n if (currentWorktree.branch && !currentWorktree.detached) {\n worktrees.push({ path: currentWorktree.path, branch: currentWorktree.branch });\n }\n }\n currentWorktree = {};\n }\n }\n\n // Handle the last worktree if there's no trailing empty line\n if (currentWorktree.path && currentWorktree.branch && !currentWorktree.detached) {\n worktrees.push({ path: currentWorktree.path, branch: currentWorktree.branch });\n }\n\n return worktrees;\n }\n}\n", "/**\n * Extracts the repository name from a Git URL\n * @param gitUrl - The Git URL (HTTPS or SSH format)\n * @returns The repository name without .git extension\n * @throws Error if the URL format is invalid\n */\nexport function extractRepoNameFromUrl(gitUrl: string): string {\n // Remove trailing spaces\n const url = gitUrl.trim();\n\n // Handle SSH format: git@github.com:user/repo.git or ssh://git@domain/path/repo.git\n const sshMatch = url.match(/^git@[^:]+:(?:.+\\/)?([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return sshMatch[1];\n }\n\n // Handle SSH URL format: ssh://git@domain.com/path/repo.git\n const sshUrlMatch = url.match(/^ssh:\\/\\/[^/]+\\/(?:.+\\/)?([^/]+?)(?:\\.git)?$/);\n if (sshUrlMatch) {\n return sshUrlMatch[1];\n }\n\n // Handle HTTPS format: https://github.com/user/repo.git\n const httpsMatch = url.match(/^https?:\\/\\/[^/]+\\/(?:.+\\/)?([^/]+?)(?:\\.git)?$/);\n if (httpsMatch) {\n return httpsMatch[1];\n }\n\n // Handle file:// URLs for local repositories\n const fileMatch = url.match(/^file:\\/\\/(?:.+\\/)?([^/]+?)(?:\\.git)?$/);\n if (fileMatch) {\n return fileMatch[1];\n }\n\n throw new Error(`Invalid Git URL format: ${gitUrl}`);\n}\n\n/**\n * Generates the default bare repository directory path\n * @param repoUrl - The Git repository URL\n * @param baseDir - The base directory for bare repos (default: .bare)\n * @returns The path to the bare repository\n */\nexport function getDefaultBareRepoDir(repoUrl: string, baseDir: string = \".bare\"): string {\n const repoName = extractRepoNameFromUrl(repoUrl);\n return `${baseDir}/${repoName}`;\n}\n", "import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport simpleGit from \"simple-git\";\n\nimport { METADATA_CONSTANTS } from \"../constants\";\n\nimport type { SyncMetadata } from \"../types/sync-metadata\";\n\nexport class WorktreeMetadataService {\n /**\n * Gets the internal worktree directory name from a worktree path.\n * Git uses the basename of the worktree path as the internal directory name.\n * For example: /worktrees/fix/test-branch -> test-branch (not fix/test-branch)\n */\n private getWorktreeDirectoryName(worktreePath: string): string {\n return path.basename(worktreePath);\n }\n\n async getMetadataPath(bareRepoPath: string, worktreeName: string): Promise<string> {\n // Git stores worktree metadata in .git/worktrees/[worktree-name]/\n // We'll store our metadata alongside Git's metadata\n return path.join(bareRepoPath, \".git\", \"worktrees\", worktreeName, \"sync-metadata.json\");\n }\n\n async getMetadataPathFromWorktreePath(bareRepoPath: string, worktreePath: string): Promise<string> {\n // Extract the worktree directory name (basename) that Git actually uses\n const worktreeDirName = this.getWorktreeDirectoryName(worktreePath);\n return this.getMetadataPath(bareRepoPath, worktreeDirName);\n }\n\n async saveMetadata(bareRepoPath: string, worktreeName: string, metadata: SyncMetadata): Promise<void> {\n const metadataPath = await this.getMetadataPath(bareRepoPath, worktreeName);\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(metadataPath), { recursive: true });\n\n // Write metadata as JSON\n await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), \"utf-8\");\n }\n\n async loadMetadata(bareRepoPath: string, worktreeName: string): Promise<SyncMetadata | null> {\n const metadataPath = await this.getMetadataPath(bareRepoPath, worktreeName);\n\n try {\n const content = await fs.readFile(metadataPath, \"utf-8\");\n return JSON.parse(content) as SyncMetadata;\n } catch {\n // Return null if file doesn't exist or can't be parsed\n return null;\n }\n }\n\n async loadMetadataFromPath(bareRepoPath: string, worktreePath: string): Promise<SyncMetadata | null> {\n const metadataPath = await this.getMetadataPathFromWorktreePath(bareRepoPath, worktreePath);\n\n try {\n const content = await fs.readFile(metadataPath, \"utf-8\");\n const metadata = JSON.parse(content) as SyncMetadata;\n\n if (!(await this.validateMetadata(metadata))) {\n console.warn(`Corrupted metadata for ${worktreePath}, treating as missing`);\n return null;\n }\n\n return metadata;\n } catch {\n // Fallback: try loading from old path (using branch name with slashes)\n // This handles migration from the old broken path structure\n try {\n const branchName = path.basename(worktreePath);\n // Check if branch name might have had slashes (parent dir would exist)\n const parentDir = path.dirname(worktreePath);\n const possibleBranchWithSlash = path.join(path.basename(parentDir), branchName);\n\n // Try the old path with potential slash in branch name\n const oldPath = path.join(bareRepoPath, \".git\", \"worktrees\", possibleBranchWithSlash, \"sync-metadata.json\");\n const content = await fs.readFile(oldPath, \"utf-8\");\n const metadata = JSON.parse(content) as SyncMetadata;\n\n if (!(await this.validateMetadata(metadata))) {\n console.warn(`Corrupted metadata at old path ${oldPath}, treating as missing`);\n return null;\n }\n\n // Migrate to new path\n await this.saveMetadata(bareRepoPath, this.getWorktreeDirectoryName(worktreePath), metadata);\n\n // Clean up old path\n try {\n await fs.unlink(oldPath);\n // Try to remove empty parent directory\n await fs.rm(path.dirname(oldPath), { recursive: false, force: true });\n } catch {\n // Ignore cleanup errors\n }\n\n return metadata;\n } catch {\n // Return null if file doesn't exist or can't be parsed\n return null;\n }\n }\n }\n\n async deleteMetadata(bareRepoPath: string, worktreeName: string): Promise<void> {\n const metadataPath = await this.getMetadataPath(bareRepoPath, worktreeName);\n\n try {\n await fs.unlink(metadataPath);\n } catch (error) {\n // Ignore errors if file doesn't exist\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n async deleteMetadataFromPath(bareRepoPath: string, worktreePath: string): Promise<void> {\n const metadataPath = await this.getMetadataPathFromWorktreePath(bareRepoPath, worktreePath);\n\n try {\n await fs.unlink(metadataPath);\n } catch (error) {\n // Ignore errors if file doesn't exist\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n async updateLastSync(\n bareRepoPath: string,\n worktreeName: string,\n commit: string,\n action: \"created\" | \"updated\" | \"fetched\" = \"updated\",\n ): Promise<void> {\n const existing = await this.loadMetadata(bareRepoPath, worktreeName);\n\n if (!existing) {\n // If no metadata exists, we can't update it\n console.warn(`No metadata found for worktree ${worktreeName}, skipping update`);\n return;\n }\n\n // Update metadata\n existing.lastSyncCommit = commit;\n existing.lastSyncDate = new Date().toISOString();\n\n existing.syncHistory.push({\n date: existing.lastSyncDate,\n commit,\n action,\n });\n\n if (existing.syncHistory.length > METADATA_CONSTANTS.MAX_HISTORY_ENTRIES) {\n existing.syncHistory = existing.syncHistory.slice(-METADATA_CONSTANTS.MAX_HISTORY_ENTRIES);\n }\n\n await this.saveMetadata(bareRepoPath, worktreeName, existing);\n }\n\n async updateLastSyncFromPath(\n bareRepoPath: string,\n worktreePath: string,\n commit: string,\n action: \"created\" | \"updated\" | \"fetched\" = \"updated\",\n defaultBranch?: string,\n ): Promise<void> {\n const worktreeDirName = this.getWorktreeDirectoryName(worktreePath);\n const existing = await this.loadMetadataFromPath(bareRepoPath, worktreePath);\n\n if (!existing) {\n console.warn(`No metadata found for worktree ${worktreeDirName}`);\n console.log(` Attempting to create initial metadata...`);\n\n try {\n const worktreeGit = simpleGit(worktreePath);\n const currentCommit = await worktreeGit.revparse([\"HEAD\"]);\n\n const branchSummary = await worktreeGit.branch();\n const actualBranchName = branchSummary.current;\n\n if (!actualBranchName) {\n throw new Error(\"Could not determine current branch name\");\n }\n\n let upstreamBranch = `origin/${actualBranchName}`;\n try {\n const configuredUpstream = await worktreeGit.raw([\n \"rev-parse\",\n \"--abbrev-ref\",\n `${actualBranchName}@{upstream}`,\n ]);\n if (configuredUpstream.trim()) {\n upstreamBranch = configuredUpstream.trim();\n }\n } catch {\n // No configured upstream, use constructed value\n }\n\n const parentBranch = defaultBranch || \"main\";\n\n await this.createInitialMetadataFromPath(\n bareRepoPath,\n worktreePath,\n currentCommit.trim(),\n upstreamBranch,\n parentBranch,\n currentCommit.trim(),\n );\n console.log(` \u2705 Created metadata for ${worktreeDirName}`);\n return;\n } catch (error) {\n console.error(` \u274C Failed to create metadata: ${error}`);\n throw error;\n }\n }\n\n // Update metadata\n existing.lastSyncCommit = commit;\n existing.lastSyncDate = new Date().toISOString();\n\n existing.syncHistory.push({\n date: existing.lastSyncDate,\n commit,\n action,\n });\n\n if (existing.syncHistory.length > METADATA_CONSTANTS.MAX_HISTORY_ENTRIES) {\n existing.syncHistory = existing.syncHistory.slice(-METADATA_CONSTANTS.MAX_HISTORY_ENTRIES);\n }\n\n // Save using the directory name\n await this.saveMetadata(bareRepoPath, worktreeDirName, existing);\n }\n\n async createInitialMetadata(\n bareRepoPath: string,\n worktreeName: string,\n commit: string,\n upstreamBranch: string,\n parentBranch: string,\n parentCommit: string,\n ): Promise<void> {\n const metadata: SyncMetadata = {\n lastSyncCommit: commit,\n lastSyncDate: new Date().toISOString(),\n upstreamBranch,\n createdFrom: {\n branch: parentBranch,\n commit: parentCommit,\n },\n syncHistory: [\n {\n date: new Date().toISOString(),\n commit,\n action: \"created\",\n },\n ],\n };\n\n await this.saveMetadata(bareRepoPath, worktreeName, metadata);\n }\n\n async createInitialMetadataFromPath(\n bareRepoPath: string,\n worktreePath: string,\n commit: string,\n upstreamBranch: string,\n parentBranch: string,\n parentCommit: string,\n ): Promise<void> {\n const worktreeDirName = this.getWorktreeDirectoryName(worktreePath);\n const metadata: SyncMetadata = {\n lastSyncCommit: commit,\n lastSyncDate: new Date().toISOString(),\n upstreamBranch,\n createdFrom: {\n branch: parentBranch,\n commit: parentCommit,\n },\n syncHistory: [\n {\n date: new Date().toISOString(),\n commit,\n action: \"created\",\n },\n ],\n };\n\n await this.saveMetadata(bareRepoPath, worktreeDirName, metadata);\n }\n\n async validateMetadata(metadata: SyncMetadata): Promise<boolean> {\n if (!metadata.lastSyncCommit || !metadata.lastSyncDate || !metadata.upstreamBranch) {\n return false;\n }\n\n if (!/^[0-9a-f]+$/i.test(metadata.lastSyncCommit)) {\n return false;\n }\n\n if (Number.isNaN(new Date(metadata.lastSyncDate).getTime())) {\n return false;\n }\n\n return true;\n }\n}\n", "export const GIT_CONSTANTS = {\n REMOTE_PREFIX: \"origin/\",\n REMOTE_NAME: \"origin\",\n HEAD_REF: \"/HEAD\",\n DEFAULT_BRANCH: \"main\",\n BARE_DIR_NAME: \".bare\",\n DIVERGED_DIR_NAME: \".diverged\",\n REFS: {\n HEADS: \"refs/heads/\",\n REMOTES: \"refs/remotes/origin\",\n REMOTES_ORIGIN: \"refs/remotes/origin/*\",\n },\n FETCH_CONFIG: \"+refs/heads/*:refs/remotes/origin/*\",\n} as const;\n\nexport const GIT_OPERATIONS = {\n MERGE_HEAD: \"MERGE_HEAD\",\n CHERRY_PICK_HEAD: \"CHERRY_PICK_HEAD\",\n REVERT_HEAD: \"REVERT_HEAD\",\n BISECT_LOG: \"BISECT_LOG\",\n REBASE_MERGE: \"rebase-merge\",\n REBASE_APPLY: \"rebase-apply\",\n} as const;\n\nexport const DEFAULT_CONFIG = {\n CRON_SCHEDULE: \"0 * * * *\",\n RETRY: {\n MAX_ATTEMPTS: 3,\n MAX_LFS_RETRIES: 2,\n INITIAL_DELAY_MS: 1000,\n MAX_DELAY_MS: 30000,\n BACKOFF_MULTIPLIER: 2,\n },\n UPDATE_EXISTING_WORKTREES: true,\n} as const;\n\nexport const ERROR_MESSAGES = {\n GIT_NOT_INITIALIZED: \"Git service not initialized. Call initialize() first.\",\n ALREADY_EXISTS: \"already exists\",\n ALREADY_REGISTERED: \"already registered worktree\",\n FAST_FORWARD_FAILED: [\n \"Not possible to fast-forward\",\n \"fatal: Not possible to fast-forward, aborting\",\n \"cannot fast-forward\",\n ],\n NO_UPSTREAM: [\n \"fatal: no upstream configured\",\n \"no upstream configured for branch\",\n \"fatal: ambiguous argument\",\n \"unknown revision or path\",\n ],\n LFS_ERROR: [\"smudge filter lfs failed\", \"git-lfs\", \"LFS\"],\n EXDEV: \"EXDEV\",\n} as const;\n\nexport const TEST_TIMEOUT = {\n DEFAULT: 10000,\n E2E: 60000,\n} as const;\n\nexport const PATH_CONSTANTS = {\n GIT_DIR: \".git\",\n README: \"README\",\n} as const;\n\nexport const METADATA_CONSTANTS = {\n MAX_HISTORY_ENTRIES: 10,\n} as const;\n", "import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport simpleGit from \"simple-git\";\n\nimport { GIT_OPERATIONS, PATH_CONSTANTS } from \"../constants\";\nimport { GitOperationError, WorktreeNotCleanError } from \"../errors\";\nimport { getErrorMessage } from \"../utils/lfs-error\";\n\nimport type { SimpleGit } from \"simple-git\";\n\nexport interface WorktreeStatusDetails {\n modifiedFiles: number;\n deletedFiles: number;\n renamedFiles: number;\n createdFiles: number;\n conflictedFiles: number;\n untrackedFiles: number;\n unpushedCommitCount?: number;\n stashCount?: number;\n operationType?: string;\n modifiedSubmodules?: string[];\n modifiedFilesList?: string[];\n deletedFilesList?: string[];\n renamedFilesList?: Array<{ from: string; to: string }>;\n createdFilesList?: string[];\n conflictedFilesList?: string[];\n untrackedFilesList?: string[];\n}\n\nexport interface WorktreeStatusResult {\n isClean: boolean;\n hasUnpushedCommits: boolean;\n hasStashedChanges: boolean;\n hasOperationInProgress: boolean;\n hasModifiedSubmodules: boolean;\n upstreamGone: boolean;\n canRemove: boolean;\n reasons: string[];\n details?: WorktreeStatusDetails;\n}\n\nexport class WorktreeStatusService {\n constructor(private readonly config: { skipLfs?: boolean } = {}) {}\n\n async checkWorktreeStatus(worktreePath: string): Promise<boolean> {\n const worktreeGit = this.createGitInstance(worktreePath);\n const status = await worktreeGit.status();\n\n const hasTrackedChanges =\n status.modified.length > 0 ||\n status.deleted.length > 0 ||\n status.renamed.length > 0 ||\n status.created.length > 0 ||\n status.conflicted.length > 0;\n\n if (hasTrackedChanges) {\n return false;\n }\n\n if (status.not_added.length > 0) {\n const untrackedFiles = status.not_added;\n const notIgnoredFiles = await this.filterUntrackedFiles(worktreePath, untrackedFiles);\n return notIgnoredFiles.length === 0;\n }\n\n return true;\n }\n\n async getFullWorktreeStatus(\n worktreePath: string,\n includeDetails = false,\n lastSyncCommit?: string,\n ): Promise<WorktreeStatusResult> {\n const isClean = await this.checkWorktreeStatus(worktreePath);\n const hasUnpushedCommits = await this.hasUnpushedCommits(worktreePath, lastSyncCommit);\n const hasStashedChanges = await this.hasStashedChanges(worktreePath);\n const hasOperationInProgress = await this.hasOperationInProgress(worktreePath);\n const hasModifiedSubmodules = await this.hasModifiedSubmodules(worktreePath);\n const upstreamGone = await this.hasUpstreamGone(worktreePath);\n\n const reasons: string[] = [];\n if (!isClean) reasons.push(\"uncommitted changes\");\n if (hasUnpushedCommits) reasons.push(\"unpushed commits\");\n if (hasStashedChanges) reasons.push(\"stashed changes\");\n if (hasOperationInProgress) reasons.push(\"operation in progress\");\n if (hasModifiedSubmodules) reasons.push(\"modified submodules\");\n\n const canRemove =\n isClean && !hasUnpushedCommits && !hasStashedChanges && !hasOperationInProgress && !hasModifiedSubmodules;\n\n let details: WorktreeStatusDetails | undefined;\n if (includeDetails) {\n details = await this.getStatusDetails(worktreePath);\n }\n\n return {\n isClean,\n hasUnpushedCommits,\n hasStashedChanges,\n hasOperationInProgress,\n hasModifiedSubmodules,\n upstreamGone,\n canRemove,\n reasons,\n details,\n };\n }\n\n async hasUnpushedCommits(worktreePath: string, lastSyncCommit?: string): Promise<boolean> {\n const worktreeGit = this.createGitInstance(worktreePath);\n\n try {\n if (await this.isDetachedHead(worktreeGit)) {\n return false;\n }\n\n const branchSummary = await worktreeGit.branch();\n const currentBranch = branchSummary.current;\n\n if (lastSyncCommit) {\n try {\n const newCommitsResult = await worktreeGit.raw([\"rev-list\", \"--count\", `${lastSyncCommit}..HEAD`]);\n const newCommitsCount = parseInt(newCommitsResult.trim(), 10);\n return newCommitsCount > 0;\n } catch {\n // Fall through to regular check\n }\n }\n\n const result = await worktreeGit.raw([\"rev-list\", \"--count\", currentBranch, \"--not\", \"--remotes\"]);\n const unpushedCount = parseInt(result.trim(), 10);\n return unpushedCount > 0;\n } catch (error) {\n console.error(`Error checking unpushed commits: ${error}`);\n return false;\n }\n }\n\n async hasUpstreamGone(worktreePath: string): Promise<boolean> {\n const worktreeGit = this.createGitInstance(worktreePath);\n\n try {\n if (await this.isDetachedHead(worktreeGit)) {\n return false;\n }\n\n const branchSummary = await worktreeGit.branch();\n const currentBranch = branchSummary.current;\n\n const upstream = await worktreeGit.raw([\"rev-parse\", \"--abbrev-ref\", `${currentBranch}@{upstream}`]);\n const remoteBranches = await worktreeGit.branch([\"-r\"]);\n\n return !remoteBranches.all.includes(upstream.trim());\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (\n errorMessage.includes(\"fatal: no upstream configured\") ||\n errorMessage.includes(\"no upstream configured for branch\") ||\n errorMessage.includes(\"fatal: ambiguous argument\") ||\n errorMessage.includes(\"unknown revision or path\")\n ) {\n return false;\n }\n\n console.error(`Unexpected error checking upstream status for ${worktreePath}: ${errorMessage}`);\n return false;\n }\n }\n\n async hasStashedChanges(worktreePath: string): Promise<boolean> {\n const worktreeGit = this.createGitInstance(worktreePath);\n\n try {\n const stashList = await worktreeGit.stashList();\n return stashList.total > 0;\n } catch (error) {\n console.error(`Error checking stash: ${error}`);\n return true; // Conservative: assume unsafe to delete\n }\n }\n\n async hasModifiedSubmodules(worktreePath: string): Promise<boolean> {\n const worktreeGit = this.createGitInstance(worktreePath);\n\n try {\n const result = await worktreeGit.raw([\"submodule\", \"status\"]);\n const lines = result.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n const firstChar = line.charAt(0);\n if (firstChar === \"+\" || firstChar === \"-\") {\n return true;\n }\n }\n return false;\n } catch {\n return false;\n }\n }\n\n async hasOperationInProgress(worktreePath: string): Promise<boolean> {\n try {\n const gitDir = await this.resolveGitDir(worktreePath);\n\n const operationFiles = [\n GIT_OPERATIONS.MERGE_HEAD,\n GIT_OPERATIONS.CHERRY_PICK_HEAD,\n GIT_OPERATIONS.REVERT_HEAD,\n GIT_OPERATIONS.BISECT_LOG,\n GIT_OPERATIONS.REBASE_MERGE,\n GIT_OPERATIONS.REBASE_APPLY,\n ];\n\n for (const file of operationFiles) {\n try {\n await fs.access(path.join(gitDir, file));\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n async validateWorktreeForRemoval(worktreePath: string, lastSyncCommit?: string): Promise<void> {\n const status = await this.getFullWorktreeStatus(worktreePath, false, lastSyncCommit);\n\n if (!status.canRemove) {\n throw new WorktreeNotCleanError(worktreePath, status.reasons);\n }\n }\n\n async getStatusDetails(worktreePath: string): Promise<WorktreeStatusDetails> {\n const worktreeGit = this.createGitInstance(worktreePath);\n const status = await worktreeGit.status();\n\n const details: WorktreeStatusDetails = {\n modifiedFiles: status.modified.length,\n deletedFiles: status.deleted.length,\n renamedFiles: status.renamed.length,\n createdFiles: status.created.length,\n conflictedFiles: status.conflicted.length,\n untrackedFiles: 0,\n };\n\n if (status.modified.length > 0) {\n details.modifiedFilesList = status.modified;\n }\n if (status.deleted.length > 0) {\n details.deletedFilesList = status.deleted;\n }\n if (status.renamed.length > 0) {\n details.renamedFilesList = status.renamed.map((r) => ({ from: r.from, to: r.to }));\n }\n if (status.created.length > 0) {\n details.createdFilesList = status.created;\n }\n if (status.conflicted.length > 0) {\n details.conflictedFilesList = status.conflicted;\n }\n\n if (status.not_added.length > 0) {\n const notIgnoredFiles = await this.filterUntrackedFiles(worktreePath, status.not_added);\n details.untrackedFiles = notIgnoredFiles.length;\n if (notIgnoredFiles.length > 0) {\n details.untrackedFilesList = notIgnoredFiles;\n }\n }\n\n try {\n if (!(await this.isDetachedHead(worktreeGit))) {\n const branchSummary = await worktreeGit.branch();\n const currentBranch = branchSummary.current;\n const result = await worktreeGit.raw([\"rev-list\", \"--count\", currentBranch, \"--not\", \"--remotes\"]);\n details.unpushedCommitCount = parseInt(result.trim(), 10);\n }\n } catch {\n details.unpushedCommitCount = undefined;\n }\n\n try {\n const stashList = await worktreeGit.stashList();\n details.stashCount = stashList.total;\n } catch {\n details.stashCount = undefined;\n }\n\n const operationType = await this.getOperationType(worktreePath);\n if (operationType) {\n details.operationType = operationType;\n }\n\n try {\n const result = await worktreeGit.raw([\"submodule\", \"status\"]);\n const lines = result.split(\"\\n\").filter((line) => line.trim());\n const modifiedSubmodules: string[] = [];\n\n for (const line of lines) {\n const firstChar = line.charAt(0);\n if (firstChar === \"+\" || firstChar === \"-\") {\n const match = line.match(/^[+-]\\s*(\\S+)/);\n if (match) {\n modifiedSubmodules.push(match[1]);\n }\n }\n }\n\n if (modifiedSubmodules.length > 0) {\n details.modifiedSubmodules = modifiedSubmodules;\n }\n } catch {\n // No submodules or error\n }\n\n return details;\n }\n\n private async getOperationType(worktreePath: string): Promise<string | undefined> {\n try {\n const gitDir = await this.resolveGitDir(worktreePath);\n\n const operations = [\n { file: GIT_OPERATIONS.MERGE_HEAD, type: \"merge\" },\n { file: GIT_OPERATIONS.CHERRY_PICK_HEAD, type: \"cherry-pick\" },\n { file: GIT_OPERATIONS.REVERT_HEAD, type: \"revert\" },\n { file: GIT_OPERATIONS.BISECT_LOG, type: \"bisect\" },\n { file: GIT_OPERATIONS.REBASE_MERGE, type: \"rebase\" },\n { file: GIT_OPERATIONS.REBASE_APPLY, type: \"rebase (apply)\" },\n ];\n\n for (const op of operations) {\n try {\n await fs.access(path.join(gitDir, op.file));\n return op.type;\n } catch {\n continue;\n }\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n }\n\n private async filterUntrackedFiles(worktreePath: string, files: string[]): Promise<string[]> {\n if (files.length === 0) return [];\n\n const worktreeGit = this.createGitInstance(worktreePath);\n\n try {\n const result = await worktreeGit.raw([\"check-ignore\", \"--\", ...files]);\n\n const ignoredFiles = new Set(\n result\n .trim()\n .split(\"\\n\")\n .filter((f) => f),\n );\n return files.filter((f) => !ignoredFiles.has(f));\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (errorMessage.includes(\"exit code: 1\")) {\n return files;\n }\n\n console.warn(`Warning: Could not check gitignore status for files in ${worktreePath}: ${errorMessage}`);\n return files;\n }\n }\n\n private async isDetachedHead(worktreeGit: SimpleGit): Promise<boolean> {\n try {\n const branchSummary = await worktreeGit.branch();\n return !branchSummary.current || branchSummary.detached;\n } catch {\n return true;\n }\n }\n\n private async resolveGitDir(worktreePath: string): Promise<string> {\n const gitPath = path.join(worktreePath, PATH_CONSTANTS.GIT_DIR);\n\n try {\n const stat = await fs.stat(gitPath);\n\n if (stat.isFile()) {\n const content = await fs.readFile(gitPath, \"utf-8\");\n const gitdirMatch = content.match(/^gitdir:\\s*(.+)$/m);\n if (gitdirMatch) {\n return path.resolve(worktreePath, gitdirMatch[1].trim());\n }\n }\n\n return gitPath;\n } catch (error) {\n throw new GitOperationError(\n \"resolve-git-dir\",\n `Failed to resolve .git directory for ${worktreePath}`,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n private createGitInstance(worktreePath: string): SimpleGit {\n const git = simpleGit(worktreePath);\n return this.config.skipLfs ? git.env({ GIT_LFS_SKIP_SMUDGE: \"1\" }) : git;\n }\n}\n", "import { ERROR_MESSAGES } from \"../constants\";\n\nexport class SyncWorktreesError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n if (cause && cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${cause.stack}`;\n }\n }\n}\n\nexport class GitError extends SyncWorktreesError {\n constructor(message: string, code: string, cause?: Error) {\n super(message, `GIT_${code}`, cause);\n }\n}\n\nexport class GitNotInitializedError extends GitError {\n constructor() {\n super(ERROR_MESSAGES.GIT_NOT_INITIALIZED, \"NOT_INITIALIZED\");\n }\n}\n\nexport class GitOperationError extends GitError {\n constructor(operation: string, details: string, cause?: Error) {\n super(`Git operation '${operation}' failed: ${details}`, \"OPERATION_FAILED\", cause);\n }\n}\n\nexport class FastForwardError extends GitError {\n constructor(\n public readonly branchName: string,\n cause?: Error,\n ) {\n super(`Cannot fast-forward branch '${branchName}'`, \"FAST_FORWARD_FAILED\", cause);\n }\n}\n\nexport class WorktreeError extends SyncWorktreesError {\n constructor(message: string, code: string, cause?: Error) {\n super(message, `WORKTREE_${code}`, cause);\n }\n}\n\nexport class WorktreeAlreadyExistsError extends WorktreeError {\n constructor(\n public readonly path: string,\n public readonly branchName: string,\n ) {\n super(`Worktree already exists at '${path}' for branch '${branchName}'`, \"ALREADY_EXISTS\");\n }\n}\n\nexport class WorktreeNotCleanError extends WorktreeError {\n constructor(\n public readonly path: string,\n public readonly reasons: string[],\n ) {\n super(`Worktree at '${path}' is not clean: ${reasons.join(\", \")}`, \"NOT_CLEAN\");\n }\n}\n\nexport class ConfigError extends SyncWorktreesError {\n constructor(message: string, code: string, cause?: Error) {\n super(message, `CONFIG_${code}`, cause);\n }\n}\n\nexport class ConfigValidationError extends ConfigError {\n constructor(\n public readonly field: string,\n public readonly reason: string,\n ) {\n super(`Invalid configuration for '${field}': ${reason}`, \"VALIDATION_FAILED\");\n }\n}\n\nexport class PathResolutionError extends SyncWorktreesError {\n constructor(\n public readonly path: string,\n public readonly reason: string,\n ) {\n super(`Path resolution failed for '${path}': ${reason}`, \"PATH_RESOLUTION_FAILED\");\n }\n}\n\nexport class LfsError extends GitError {\n constructor(message: string, cause?: Error) {\n super(`LFS operation failed: ${message}`, \"LFS_ERROR\", cause);\n }\n}\n\nexport function isLfsError(error: Error | string): boolean {\n const message = typeof error === \"string\" ? error : error.message;\n return ERROR_MESSAGES.LFS_ERROR.some((pattern) => message.includes(pattern));\n}\n\nexport function isFastForwardError(error: Error | string): boolean {\n const message = typeof error === \"string\" ? error : error.message;\n return ERROR_MESSAGES.FAST_FORWARD_FAILED.some((pattern) => message.includes(pattern));\n}\n\nexport function isNoUpstreamError(error: Error | string): boolean {\n const message = typeof error === \"string\" ? error : error.message;\n return ERROR_MESSAGES.NO_UPSTREAM.some((pattern) => message.includes(pattern));\n}\n", "import fastFolderSize from \"fast-folder-size\";\n\n/**\n * Calculates the total size of a directory in bytes using native OS utilities.\n * Uses the `du` command on Unix systems for optimal performance (10-100x faster than pure Node.js).\n * @param dirPath - The path to the directory\n * @returns The total size in bytes\n */\nexport async function calculateDirectorySize(dirPath: string): Promise<number> {\n return new Promise((resolve) => {\n fastFolderSize(dirPath, (err, bytes) => {\n if (err || bytes === undefined) {\n resolve(0);\n } else {\n resolve(bytes);\n }\n });\n });\n}\n\n/**\n * Formats bytes into a human-readable string.\n * @param bytes - The number of bytes\n * @returns Formatted string (e.g., \"1.2 GB\", \"345 MB\", \"12 KB\")\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const k = 1024;\n const decimals = 2;\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = bytes / Math.pow(k, i);\n\n return `${value.toFixed(decimals)} ${units[i]}`;\n}\n\n/**\n * Calculates the total disk space used by sync-worktrees repositories.\n * This includes bare repository directories and all worktree directories.\n *\n * @param repoPaths - Array of bare repository directory paths (e.g., from config.bareRepoDir)\n * @param worktreeDirs - Array of worktree base directories\n * @returns Formatted disk space string (e.g., \"1.2 GB\") or \"N/A\" if calculation fails\n */\nexport async function calculateSyncDiskSpace(repoPaths: string[], worktreeDirs: string[]): Promise<string> {\n try {\n let totalBytes = 0;\n\n // Calculate size of all bare repository directories\n for (const repoPath of repoPaths) {\n const bareSize = await calculateDirectorySize(repoPath);\n totalBytes += bareSize;\n }\n\n // Calculate size of all worktree directories\n for (const worktreeDir of worktreeDirs) {\n const worktreeSize = await calculateDirectorySize(worktreeDir);\n totalBytes += worktreeSize;\n }\n\n return formatBytes(totalBytes);\n } catch (error) {\n console.error(\"Failed to calculate disk space:\", error);\n return \"N/A\";\n }\n}\n", "import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\n\nimport type { Config } from \"../types\";\n\nexport interface CliOptions extends Partial<Config> {\n config?: string;\n filter?: string;\n list?: boolean;\n bareRepoDir?: string;\n branchMaxAge?: string;\n skipLfs?: boolean;\n noUpdateExisting?: boolean;\n debug?: boolean;\n}\n\nexport function parseArguments(): CliOptions {\n const argv = yargs(hideBin(process.argv))\n .option(\"config\", {\n alias: \"c\",\n type: \"string\",\n description: \"Path to JavaScript config file\",\n })\n .option(\"filter\", {\n alias: \"f\",\n type: \"string\",\n description: \"Filter repositories by name (supports wildcards and comma-separated values)\",\n })\n .option(\"list\", {\n alias: \"l\",\n type: \"boolean\",\n description: \"List configured repositories and exit\",\n default: false,\n })\n .option(\"bareRepoDir\", {\n alias: \"b\",\n type: \"string\",\n description: \"Directory for storing bare repositories (default: .bare/<repo-name>).\",\n })\n .option(\"repoUrl\", {\n alias: \"u\",\n type: \"string\",\n description: \"Git repository URL (e.g., SSH or HTTPS).\",\n })\n .option(\"worktreeDir\", {\n alias: \"w\",\n type: \"string\",\n description: \"Absolute path to the directory for storing worktrees.\",\n })\n .option(\"cronSchedule\", {\n alias: \"s\",\n type: \"string\",\n description: \"Cron schedule for how often to run the sync.\",\n default: \"0 * * * *\",\n })\n .option(\"runOnce\", {\n type: \"boolean\",\n description: \"Run the sync process once and then exit, without scheduling.\",\n default: false,\n })\n .option(\"branchMaxAge\", {\n alias: \"a\",\n type: \"string\",\n description: \"Maximum age of branches to sync (e.g., '30d', '6m', '1y').\",\n })\n .option(\"skipLfs\", {\n type: \"boolean\",\n description: \"Skip Git LFS downloads when fetching and creating worktrees.\",\n default: false,\n })\n .option(\"no-update-existing\", {\n type: \"boolean\",\n description: \"Disable automatic updates of existing worktrees.\",\n default: false,\n })\n .option(\"debug\", {\n alias: \"d\",\n type: \"boolean\",\n description: \"Enable debug mode to show detailed reasons why worktrees are not cleaned up.\",\n default: false,\n })\n .help()\n .alias(\"help\", \"h\")\n .parseSync();\n\n return {\n config: argv.config,\n filter: argv.filter,\n list: argv.list,\n repoUrl: argv.repoUrl,\n worktreeDir: argv.worktreeDir,\n cronSchedule: argv.cronSchedule,\n runOnce: argv.runOnce,\n bareRepoDir: argv.bareRepoDir,\n branchMaxAge: argv.branchMaxAge,\n skipLfs: argv.skipLfs,\n noUpdateExisting: argv[\"no-update-existing\"] as boolean,\n debug: argv.debug,\n };\n}\n\nexport function isInteractiveMode(config: Partial<Config>): boolean {\n return !config.repoUrl || !config.worktreeDir;\n}\n\nexport function reconstructCliCommand(config: Config): string {\n const executable = process.argv[1].includes(\"ts-node\") ? \"ts-node src/index.ts\" : \"sync-worktrees\";\n\n const args: string[] = [];\n\n args.push(`--repoUrl \"${config.repoUrl}\"`);\n\n if (config.worktreeDir) {\n args.push(`--worktreeDir \"${config.worktreeDir}\"`);\n }\n\n if (config.bareRepoDir) {\n args.push(`--bareRepoDir \"${config.bareRepoDir}\"`);\n }\n\n if (config.cronSchedule && config.cronSchedule !== \"0 * * * *\") {\n args.push(`--cronSchedule \"${config.cronSchedule}\"`);\n }\n\n if (config.runOnce) {\n args.push(\"--runOnce\");\n }\n\n if (config.branchMaxAge) {\n args.push(`--branchMaxAge \"${config.branchMaxAge}\"`);\n }\n\n if (config.skipLfs) {\n args.push(\"--skip-lfs\");\n }\n\n if (config.updateExistingWorktrees === false) {\n args.push(\"--no-update-existing\");\n }\n\n if (config.debug) {\n args.push(\"--debug\");\n }\n\n return `${executable} ${args.join(\" \")}`;\n}\n", "import * as path from \"path\";\n\nimport { confirm, input, select } from \"@inquirer/prompts\";\n\nimport { generateConfigFile, getDefaultConfigPath } from \"./config-generator\";\nimport { extractRepoNameFromUrl } from \"./git-url\";\n\nimport type { Config } from \"../types\";\n\nexport async function promptForConfig(partialConfig: Partial<Config>): Promise<Config> {\n console.log(\"\uD83D\uDD27 Welcome to sync-worktrees interactive setup!\\n\");\n\n let repoUrl = partialConfig.repoUrl;\n if (!repoUrl) {\n repoUrl = await input({\n message: \"Enter the Git repository URL (e.g., https://github.com/user/repo.git):\",\n validate: (value: string) => {\n if (!value.trim()) {\n return \"Repository URL is required\";\n }\n try {\n // Basic URL validation\n if (!value.match(/^(https?:\\/\\/|ssh:\\/\\/|git@|file:\\/\\/).*$/)) {\n return \"Please enter a valid Git URL (https://, ssh://, git@, or file://)\";\n }\n return true;\n } catch {\n return \"Please enter a valid URL\";\n }\n },\n });\n }\n\n let worktreeDir = partialConfig.worktreeDir;\n if (!worktreeDir) {\n // Extract repository name from URL to suggest as default\n const repoName = repoUrl ? extractRepoNameFromUrl(repoUrl) : \"\";\n const defaultWorktreeDir = repoName ? `./${repoName}` : \"\";\n\n worktreeDir = await input({\n message: \"Enter the directory for storing worktrees:\",\n default: defaultWorktreeDir,\n validate: (value: string) => {\n // Allow empty input to use default value\n if (!value.trim() && !defaultWorktreeDir) {\n return \"Worktree directory is required\";\n }\n return true;\n },\n });\n\n // Use default if empty input\n if (!worktreeDir.trim() && defaultWorktreeDir) {\n worktreeDir = defaultWorktreeDir;\n }\n\n if (!path.isAbsolute(worktreeDir)) {\n worktreeDir = path.resolve(worktreeDir);\n }\n }\n\n let bareRepoDir = partialConfig.bareRepoDir;\n const askForBareDir = await confirm({\n message: \"Would you like to specify a custom location for the bare repository?\",\n default: false,\n });\n\n if (askForBareDir) {\n bareRepoDir = await input({\n message: \"Enter the directory for the bare repository:\",\n default: \"\",\n validate: (value: string) => {\n if (!value.trim()) {\n return \"Bare repository directory is required\";\n }\n return true;\n },\n });\n if (!path.isAbsolute(bareRepoDir)) {\n bareRepoDir = path.resolve(bareRepoDir);\n }\n }\n\n let runOnce = partialConfig.runOnce;\n let cronSchedule = partialConfig.cronSchedule || \"0 * * * *\";\n\n if (runOnce === undefined) {\n const runMode = await select({\n message: \"How would you like to run the sync?\",\n choices: [\n { name: \"Run once\", value: \"once\" },\n { name: \"Schedule with cron\", value: \"scheduled\" },\n ],\n });\n runOnce = runMode === \"once\";\n\n if (!runOnce && !partialConfig.cronSchedule) {\n cronSchedule = await input({\n message: \"Enter the cron schedule (or press enter for default):\",\n default: \"0 * * * *\",\n validate: (value: string) => {\n if (!value.trim()) {\n return \"Cron schedule is required\";\n }\n const parts = value.trim().split(\" \");\n if (parts.length < 5) {\n return \"Invalid cron pattern. Expected format: '* * * * *'\";\n }\n return true;\n },\n });\n }\n }\n\n const finalConfig: Config = {\n repoUrl,\n worktreeDir,\n cronSchedule,\n runOnce: runOnce || false,\n bareRepoDir,\n };\n\n console.log(\"\\n\uD83D\uDCCB Configuration summary:\");\n console.log(` Repository URL: ${finalConfig.repoUrl}`);\n console.log(` Worktrees: ${finalConfig.worktreeDir}`);\n if (finalConfig.bareRepoDir) {\n console.log(` Bare repo: ${finalConfig.bareRepoDir}`);\n } else {\n console.log(` Bare repo: .bare/<repo-name> (default)`);\n }\n if (finalConfig.runOnce) {\n console.log(` Mode: Run once`);\n } else {\n console.log(` Mode: Scheduled (${finalConfig.cronSchedule})`);\n }\n console.log(\"\");\n\n // Ask if user wants to save configuration to a file\n const saveConfig = await confirm({\n message: \"Would you like to save this configuration to a file for future use?\",\n default: true,\n });\n\n if (saveConfig) {\n const defaultConfigPath = getDefaultConfigPath();\n let configPath = await input({\n message: \"Enter the path for the config file:\",\n default: defaultConfigPath,\n validate: (value: string) => {\n if (!value.trim()) {\n return \"Config file path is required\";\n }\n if (!value.endsWith(\".js\")) {\n return \"Config file must have a .js extension\";\n }\n return true;\n },\n });\n\n if (!path.isAbsolute(configPath)) {\n configPath = path.resolve(configPath);\n }\n\n try {\n await generateConfigFile(finalConfig, configPath);\n console.log(`\\n\u2705 Configuration saved to: ${configPath}`);\n console.log(`\\n\uD83D\uDCA1 You can now use this config file with:`);\n console.log(` sync-worktrees --config ${path.relative(process.cwd(), configPath)}`);\n console.log(\"\");\n } catch (error) {\n console.error(`\\n\u274C Failed to save config file: ${(error as Error).message}`);\n }\n }\n\n return finalConfig;\n}\n", "import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport { extractRepoNameFromUrl } from \"./git-url\";\n\nimport type { Config } from \"../types\";\n\ntype SerializableValue = string | number | boolean | null | undefined | SerializableObject | SerializableValue[];\ninterface SerializableObject {\n [key: string]: SerializableValue;\n}\n\n/**\n * Serializes a JavaScript object to a clean ESM export default format\n */\nfunction serializeToESM(obj: SerializableValue, indent: number = 0): string {\n const spaces = \" \".repeat(indent);\n const innerSpaces = \" \".repeat(indent + 2);\n\n if (typeof obj === \"string\") {\n return `\"${obj}\"`;\n }\n\n if (typeof obj === \"number\" || typeof obj === \"boolean\") {\n return String(obj);\n }\n\n if (Array.isArray(obj)) {\n if (obj.length === 0) return \"[]\";\n const items = obj.map((item) => `${innerSpaces}${serializeToESM(item, indent + 2)}`).join(\",\\n\");\n return `[\\n${items}\\n${spaces}]`;\n }\n\n if (obj && typeof obj === \"object\") {\n const entries = Object.entries(obj)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => {\n const serializedValue = serializeToESM(value, indent + 2);\n return `${innerSpaces}${key}: ${serializedValue}`;\n });\n\n if (entries.length === 0) return \"{}\";\n return `{\\n${entries.join(\",\\n\")}\\n${spaces}}`;\n }\n\n return String(obj);\n}\n\nexport async function generateConfigFile(config: Config, configPath: string): Promise<void> {\n const configDir = path.dirname(configPath);\n await fs.mkdir(configDir, { recursive: true });\n\n // Calculate relative paths from config file location\n const worktreeDirRelative = path.relative(configDir, config.worktreeDir);\n const useRelativeWorktree = !worktreeDirRelative.startsWith(\"../../../\");\n\n const repoName = extractRepoNameFromUrl(config.repoUrl);\n\n // Build the repository object\n const repository: SerializableObject = {\n name: repoName,\n repoUrl: config.repoUrl,\n worktreeDir: useRelativeWorktree ? `./${worktreeDirRelative}` : config.worktreeDir,\n };\n\n // Add bareRepoDir if provided\n if (config.bareRepoDir) {\n const bareRepoDirRelative = path.relative(configDir, config.bareRepoDir);\n const useRelativeBare = !bareRepoDirRelative.startsWith(\"../../../\");\n repository.bareRepoDir = useRelativeBare ? `./${bareRepoDirRelative}` : config.bareRepoDir;\n }\n\n // Build the complete config object\n const configObject = {\n defaults: {\n cronSchedule: config.cronSchedule,\n runOnce: config.runOnce,\n },\n repositories: [repository],\n };\n\n // Generate the config file content\n const configContent = `/**\n * Sync-worktrees configuration file\n * Generated on ${new Date().toISOString()}\n */\n\nexport default ${serializeToESM(configObject)};\n`;\n\n await fs.writeFile(configPath, configContent, \"utf-8\");\n}\n\nexport function getDefaultConfigPath(): string {\n return path.join(process.cwd(), \"sync-worktrees.config.js\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "confirm", "cron", "retry", "React", "React", "useState", "useEffect", "Box", "useInput", "React", "Box", "Text", "useState", "useInput", "input", "useEffect", "React", "Box", "fs", "path", "resolve", "fs", "path", "simpleGit", "fs", "path", "fs", "path", "simpleGit", "path", "stat", "simpleGit", "simpleGit", "resolve", "stat", "stat", "resolve", "schedule", "React", "resolve", "path", "fs", "path", "schedule", "confirm"]
|
|
7
|
+
}
|