workon 3.5.0 → 3.5.2
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/dist/cli.js +81 -53
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +13 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +13 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/config.ts","../src/lib/project.ts","../src/lib/environment.ts","../src/events/core/cwd.ts","../src/events/core/ide.ts","../src/events/core/web.ts","../src/events/extensions/claude.ts","../src/events/extensions/docker.ts","../src/events/extensions/npm.ts","../src/events/registry.ts","../src/lib/sanitize.ts","../src/lib/tmux.ts","../src/types/constants.ts","../src/lib/worktree.ts","../src/commands/worktrees/utils.ts","../src/commands/worktrees/list.ts","../src/commands/worktrees/add.ts","../src/commands/worktrees/remove.ts","../src/commands/worktrees/merge.ts","../src/commands/worktrees/branch.ts","../src/commands/worktrees/index.ts","../src/commands/worktrees/open.ts","../src/commands/interactive.ts","../src/commands/open.ts","../src/commands/index.ts","../src/commands/config/index.ts","../src/commands/config/list.ts","../src/commands/config/set.ts","../src/commands/config/unset.ts","../src/commands/manage.ts","../src/commands/add.ts","../src/commands/worktree.ts","../src/cli.ts"],"sourcesContent":["import Conf from 'conf';\nimport { openSync, closeSync, unlinkSync, existsSync, mkdirSync } from 'fs';\nimport { dirname } from 'path';\nimport type { AppConfig, ProjectConfig, ProjectDefaults } from '../types/index.js';\n\nconst TRANSIENT_PROPS = ['pkg', 'work'] as const;\n\n/**\n * Simple file-based lock for preventing concurrent writes.\n * Uses exclusive file creation to ensure only one process can hold the lock.\n */\nclass FileLock {\n private lockPath: string;\n private fd: number | null = null;\n private static readonly LOCK_TIMEOUT_MS = 5000;\n private static readonly RETRY_INTERVAL_MS = 50;\n\n constructor(configPath: string) {\n this.lockPath = `${configPath}.lock`;\n }\n\n async acquire(): Promise<void> {\n const startTime = Date.now();\n const lockDir = dirname(this.lockPath);\n\n // Ensure directory exists\n if (!existsSync(lockDir)) {\n mkdirSync(lockDir, { recursive: true });\n }\n\n while (Date.now() - startTime < FileLock.LOCK_TIMEOUT_MS) {\n try {\n // Try to create lock file exclusively (fails if exists)\n this.fd = openSync(this.lockPath, 'wx');\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n // Lock file exists, check if it's stale (older than timeout)\n try {\n const stat = await import('fs').then((fs) => fs.promises.stat(this.lockPath));\n const age = Date.now() - stat.mtimeMs;\n if (age > FileLock.LOCK_TIMEOUT_MS) {\n // Stale lock, try to remove it\n try {\n unlinkSync(this.lockPath);\n } catch {\n // Another process might have removed it\n }\n }\n } catch {\n // Lock file might have been removed, try again\n }\n // Wait and retry\n await new Promise((resolve) => setTimeout(resolve, FileLock.RETRY_INTERVAL_MS));\n } else {\n throw error;\n }\n }\n }\n throw new Error('Failed to acquire config lock: timeout');\n }\n\n release(): void {\n if (this.fd !== null) {\n try {\n closeSync(this.fd);\n } catch {\n // Ignore close errors\n }\n this.fd = null;\n }\n try {\n unlinkSync(this.lockPath);\n } catch {\n // Ignore unlink errors (file might not exist)\n }\n }\n}\n\n/**\n * Config class with singleton pattern and file locking to prevent\n * race conditions that could clear the config.\n */\nexport class Config {\n private static _instance: Config | null = null;\n private _transient: Record<string, unknown> = {};\n // Using definite assignment assertion since singleton pattern may return existing instance\n private _store!: Conf<AppConfig>;\n private _lock!: FileLock;\n\n constructor() {\n // If an instance already exists, return it (soft singleton)\n // This allows tests to create new instances while preventing\n // accidental multiple instances in production\n if (Config._instance && process.env.NODE_ENV !== 'test') {\n return Config._instance;\n }\n\n // Allow overriding config directory via env var (used for test isolation)\n // This is necessary because `conf` on macOS ignores XDG_CONFIG_HOME\n this._store = new Conf<AppConfig>({\n projectName: 'workon',\n ...(process.env.WORKON_CONFIG_DIR && { cwd: process.env.WORKON_CONFIG_DIR }),\n });\n this._lock = new FileLock(this._store.path);\n\n if (process.env.NODE_ENV !== 'test') {\n Config._instance = this;\n }\n }\n\n /**\n * Get the singleton instance (creates one if needed)\n */\n static getInstance(): Config {\n if (!Config._instance) {\n Config._instance = new Config();\n }\n return Config._instance;\n }\n\n /**\n * Reset the singleton instance (for testing purposes)\n */\n static resetInstance(): void {\n Config._instance = null;\n }\n\n get<T = unknown>(key: string, defaultValue?: T): T | undefined {\n const rootKey = key.split('.')[0];\n if (TRANSIENT_PROPS.includes(rootKey as (typeof TRANSIENT_PROPS)[number])) {\n return (this._transient[key] as T) ?? defaultValue;\n }\n return this._store.get(key as keyof AppConfig, defaultValue as AppConfig[keyof AppConfig]) as\n | T\n | undefined;\n }\n\n set(key: string, value: unknown): void {\n const rootKey = key.split('.')[0];\n if (TRANSIENT_PROPS.includes(rootKey as (typeof TRANSIENT_PROPS)[number])) {\n this._transient[key] = value;\n } else {\n // Don't allow setting undefined values - use delete() instead\n if (value === undefined) {\n throw new Error(`Cannot set '${key}' to undefined. Use delete() to remove keys.`);\n }\n this._store.set(key as keyof AppConfig, value as never);\n }\n }\n\n has(key: string): boolean {\n const rootKey = key.split('.')[0];\n if (TRANSIENT_PROPS.includes(rootKey as (typeof TRANSIENT_PROPS)[number])) {\n return Object.prototype.hasOwnProperty.call(this._transient, key);\n }\n return this._store.has(key as keyof AppConfig);\n }\n\n delete(key: string): void {\n const rootKey = key.split('.')[0];\n if (TRANSIENT_PROPS.includes(rootKey as (typeof TRANSIENT_PROPS)[number])) {\n delete this._transient[key];\n } else {\n this._store.delete(key as keyof AppConfig);\n }\n }\n\n /**\n * Get all projects. Returns a fresh copy from the store.\n */\n getProjects(): Record<string, ProjectConfig> {\n return this.get<Record<string, ProjectConfig>>('projects') ?? {};\n }\n\n getProject(name: string): ProjectConfig | undefined {\n const projects = this.getProjects();\n return projects[name];\n }\n\n /**\n * Set a project with file locking to prevent race conditions.\n * This ensures atomic read-modify-write operations.\n */\n async setProjectSafe(name: string, config: ProjectConfig): Promise<void> {\n await this._lock.acquire();\n try {\n // Re-read projects from disk to get latest state\n const freshProjects = this._store.get('projects') ?? {};\n freshProjects[name] = config;\n this._store.set('projects', freshProjects as never);\n } finally {\n this._lock.release();\n }\n }\n\n /**\n * Synchronous version of setProject for backwards compatibility.\n * Note: This is less safe than setProjectSafe() in concurrent scenarios.\n * Consider migrating to setProjectSafe() for critical operations.\n */\n setProject(name: string, config: ProjectConfig): void {\n // Re-read from store to minimize race window\n const freshProjects = this._store.get('projects') ?? {};\n freshProjects[name] = config;\n this._store.set('projects', freshProjects as never);\n }\n\n /**\n * Delete a project with file locking to prevent race conditions.\n */\n async deleteProjectSafe(name: string): Promise<void> {\n await this._lock.acquire();\n try {\n // Re-read projects from disk to get latest state\n const freshProjects = this._store.get('projects') ?? {};\n delete freshProjects[name];\n this._store.set('projects', freshProjects as never);\n } finally {\n this._lock.release();\n }\n }\n\n /**\n * Synchronous version of deleteProject for backwards compatibility.\n */\n deleteProject(name: string): void {\n // Re-read from store to minimize race window\n const freshProjects = this._store.get('projects') ?? {};\n delete freshProjects[name];\n this._store.set('projects', freshProjects as never);\n }\n\n getDefaults(): ProjectDefaults | undefined {\n return this.get<ProjectDefaults>('project_defaults');\n }\n\n setDefaults(defaults: ProjectDefaults): void {\n this.set('project_defaults', defaults);\n }\n\n get path(): string {\n return this._store.path;\n }\n\n get store(): AppConfig {\n return this._store.store;\n }\n}\n","import File from 'phylo';\nimport deepAssign from 'deep-assign';\nimport type { ProjectConfig, EventsConfig, IdeType, ProjectDefaults } from '../types/index.js';\n\nexport class Project {\n name: string;\n private _base?: ReturnType<typeof File.from>;\n private _path?: ReturnType<typeof File.from>;\n private _ide?: IdeType;\n private _events: EventsConfig = {};\n private _branch?: string;\n private _homepage?: string;\n private _defaults: ProjectDefaults;\n private _initialCfg: ProjectConfig;\n\n constructor(name: string, cfg?: Partial<ProjectConfig>, defaults?: ProjectDefaults) {\n this._defaults = defaults ?? { base: '' };\n this._initialCfg = { path: name, events: {}, ...cfg };\n\n this.name = cfg?.name ?? name;\n\n // Apply defaults first, then config\n const merged = deepAssign({}, this._defaults, this._initialCfg) as ProjectConfig & {\n base?: string;\n };\n\n if (merged.base) {\n this.base = merged.base;\n }\n if (merged.path) {\n this.path = merged.path;\n }\n if (merged.ide) {\n this._ide = merged.ide;\n }\n if (merged.events) {\n this._events = merged.events;\n }\n if (merged.branch) {\n this._branch = merged.branch;\n }\n if (merged.homepage) {\n this._homepage = merged.homepage;\n }\n }\n\n set base(path: string) {\n this._base = File.from(path).absolutify();\n }\n\n get base(): ReturnType<typeof File.from> | undefined {\n return this._base;\n }\n\n set ide(cmd: IdeType | undefined) {\n this._ide = cmd;\n }\n\n get ide(): IdeType | undefined {\n return this._ide;\n }\n\n set events(eventCfg: EventsConfig) {\n this._events = eventCfg;\n }\n\n get events(): EventsConfig {\n return this._events;\n }\n\n set path(path: string) {\n if (this._base) {\n this._path = this._base.join(path);\n } else {\n this._path = File.from(path);\n }\n this._path = this._path.absolutify();\n }\n\n get path(): ReturnType<typeof File.from> {\n if (!this._path) {\n throw new Error('Project path not set');\n }\n return this._path;\n }\n\n set branch(branch: string | undefined) {\n this._branch = branch;\n }\n\n get branch(): string | undefined {\n return this._branch;\n }\n\n set homepage(url: string | undefined) {\n this._homepage = url;\n }\n\n get homepage(): string | undefined {\n return this._homepage;\n }\n\n static $isProject = true;\n $isProject = true;\n}\n","import File from 'phylo';\nimport { simpleGit } from 'simple-git';\nimport { Config } from './config.js';\nimport { Project } from './project.js';\nimport type { Logger, ProjectConfig, ProjectDefaults } from '../types/index.js';\n\nexport class BaseEnvironment {\n $isProjectEnvironment = false as const;\n}\n\nexport class ProjectEnvironment {\n $isProjectEnvironment = true as const;\n project: Project;\n\n constructor(projectCfg: ProjectConfig & { name: string; exactName?: string }) {\n this.project = new Project(projectCfg.name, projectCfg);\n }\n\n static load(\n cfg: ProjectConfig & { name: string },\n defaults?: ProjectDefaults\n ): ProjectEnvironment {\n const project = new Project(cfg.name, cfg, defaults);\n return new ProjectEnvironment({ ...cfg, name: project.name });\n }\n}\n\nexport type Environment = BaseEnvironment | ProjectEnvironment;\n\ninterface ProjectWithPath {\n name: string;\n path: ReturnType<typeof File.from>;\n ide?: ProjectConfig['ide'];\n homepage?: string;\n events: ProjectConfig['events'];\n branch?: string;\n}\n\nexport class EnvironmentRecognizer {\n private static config: Config;\n private static log: Logger;\n private static projects: ProjectWithPath[] = [];\n private static configured = false;\n\n static configure(config: Config, log: Logger): void {\n if (this.configured) {\n return;\n }\n this.config = config;\n this.log = log;\n this.configured = true;\n }\n\n static async recognize(dir: string | ReturnType<typeof File.from>): Promise<Environment> {\n this.ensureConfigured();\n\n const theDir = File.from(dir).canonicalize();\n this.log.debug('Directory to recognize is: ' + theDir.canonicalPath());\n\n const allProjects = this.getAllProjects();\n const matching = allProjects.filter((p) => p.path.canonicalPath() === theDir.path);\n\n if (matching.length === 0) {\n return new BaseEnvironment();\n }\n\n this.log.debug(`Found ${matching.length} matching projects`);\n\n // Find base project (without branch suffix)\n const base = matching.find((p) => !p.name.includes('#')) ?? matching[0];\n this.log.debug('Base project is: ' + base.name);\n\n // Try to detect git branch\n const gitDir = base.path.up('.git');\n if (gitDir) {\n try {\n const git = simpleGit(gitDir.path);\n const branchSummary = await git.branchLocal();\n (base as ProjectWithPath & { branch?: string }).branch = branchSummary.current;\n } catch (error) {\n this.log.debug(`Git branch detection failed: ${(error as Error).message}`);\n }\n }\n\n return this.getProjectEnvironment(base, matching);\n }\n\n private static getAllProjects(refresh = false): ProjectWithPath[] {\n if (this.projects.length > 0 && !refresh) {\n return this.projects;\n }\n\n const defaults = this.config.getDefaults();\n if (!defaults?.base) {\n this.projects = [];\n return this.projects;\n }\n\n const baseDir = File.from(defaults.base);\n const projectsMap = this.config.getProjects();\n\n this.projects = Object.entries(projectsMap).map(([name, project]) => ({\n ...project,\n name,\n path: baseDir.join(project.path),\n }));\n\n return this.projects;\n }\n\n private static getProjectEnvironment(\n base: ProjectWithPath & { branch?: string },\n _matching: ProjectWithPath[]\n ): ProjectEnvironment {\n const exactName = `${base.name}#${base.branch}`;\n\n // Check if there's an exact branch-specific config\n const exactProj = this.projects.find((p) => p.name === exactName);\n\n // Convert ProjectWithPath to ProjectConfig format (path as string)\n const toProjectConfig = (\n p: ProjectWithPath\n ): ProjectConfig & { name: string; exactName?: string } => ({\n name: p.name,\n path: p.path.path, // Convert PhyloFile to string path\n ide: p.ide,\n homepage: p.homepage,\n events: p.events,\n branch: p.branch,\n exactName,\n });\n\n if (exactProj) {\n return new ProjectEnvironment({ ...toProjectConfig(exactProj), branch: base.branch });\n }\n\n return new ProjectEnvironment(toProjectConfig(base));\n }\n\n private static ensureConfigured(): void {\n if (!this.configured) {\n // Use singleton instance to avoid multiple Config instances\n this.config = Config.getInstance();\n // Create a no-op logger if not configured\n this.log = {\n debug: () => {},\n info: () => {},\n log: () => {},\n warn: () => {},\n error: () => {},\n setLogLevel: () => {},\n };\n this.configured = true;\n }\n }\n}\n","import { spawn } from 'child_process';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventHelp,\n EventProcessingContext,\n} from '../../types/index.js';\n\nexport class CwdEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'cwd',\n displayName: 'Change directory (cwd)',\n description: 'Change current working directory to project path',\n category: 'core',\n requiresTmux: false,\n dependencies: [],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n return 'cwd config must be a boolean (true/false)';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<boolean> {\n return true;\n },\n getDefaultConfig(): boolean {\n return true;\n },\n };\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const projectPath = project.path.path;\n\n if (isShellMode) {\n // Use pushd so user can popd to go back\n shellCommands.push(`pushd \"${projectPath}\" > /dev/null`);\n } else {\n // Spawn a new interactive shell in the project directory and wait for it\n const shell = process.env.SHELL || '/bin/bash';\n const child = spawn(shell, ['-i'], {\n cwd: projectPath,\n stdio: 'inherit',\n });\n\n // Wait for the shell to exit\n await new Promise<void>((resolve, reject) => {\n child.on('close', () => resolve());\n child.on('error', (err) => reject(err));\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const projectPath = context.project.path.path;\n return [`pushd \"${projectPath}\" > /dev/null`];\n },\n };\n }\n\n static get tmux() {\n return null;\n }\n\n static get help(): EventHelp {\n return {\n usage: 'cwd: true | false',\n description: 'Change the current working directory to the project path',\n examples: [\n { config: true, description: 'Enable directory change' },\n { config: false, description: 'Disable directory change' },\n ],\n };\n }\n}\n\nexport default CwdEvent;\n","import { spawn } from 'child_process';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventHelp,\n EventProcessingContext,\n} from '../../types/index.js';\n\nexport class IdeEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'ide',\n displayName: 'Open in IDE',\n description: 'Open project in configured IDE/editor',\n category: 'core',\n requiresTmux: false,\n dependencies: [],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n return 'ide config must be a boolean (true/false)';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<boolean> {\n return true;\n },\n getDefaultConfig(): boolean {\n return true;\n },\n };\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const projectPath = project.path.path;\n const ide = project.ide || 'code';\n\n if (isShellMode) {\n // Disable job monitoring to suppress [n] pid and done messages\n // that interfere with tmux -CC control mode\n shellCommands.push(`set +m; ${ide} \"${projectPath}\" &>/dev/null &`);\n } else {\n spawn(ide, [projectPath], {\n detached: true,\n stdio: 'ignore',\n }).unref();\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const projectPath = context.project.path.path;\n const ide = context.project.ide || 'code';\n // Disable job monitoring to suppress [n] pid and done messages\n // that interfere with tmux -CC control mode\n return [`set +m; ${ide} \"${projectPath}\" &>/dev/null &`];\n },\n };\n }\n\n static get tmux() {\n return null;\n }\n\n static get help(): EventHelp {\n return {\n usage: 'ide: true | false',\n description: 'Open the project in the configured IDE',\n examples: [\n { config: true, description: 'Enable IDE opening' },\n { config: false, description: 'Disable IDE opening' },\n ],\n };\n }\n}\n\nexport default IdeEvent;\n","import { spawn } from 'child_process';\nimport { platform } from 'os';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventHelp,\n EventProcessingContext,\n} from '../../types/index.js';\n\nexport class WebEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'web',\n displayName: 'Open homepage in browser',\n description: 'Open project homepage in web browser',\n category: 'core',\n requiresTmux: false,\n dependencies: [],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n return 'web config must be a boolean (true/false)';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<boolean> {\n return true;\n },\n getDefaultConfig(): boolean {\n return true;\n },\n };\n }\n\n static getOpenCommand(): string {\n const os = platform();\n switch (os) {\n case 'darwin':\n return 'open';\n case 'win32':\n return 'start';\n default:\n return 'xdg-open';\n }\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const homepage = project.homepage;\n\n if (!homepage) {\n console.warn('No homepage configured for project');\n return;\n }\n\n const openCmd = WebEvent.getOpenCommand();\n\n if (isShellMode) {\n shellCommands.push(`${openCmd} \"${homepage}\" &`);\n } else {\n spawn(openCmd, [homepage], {\n detached: true,\n stdio: 'ignore',\n }).unref();\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const homepage = context.project.homepage;\n if (!homepage) return [];\n\n const openCmd = WebEvent.getOpenCommand();\n return [`${openCmd} \"${homepage}\" &`];\n },\n };\n }\n\n static get tmux() {\n return null;\n }\n\n static get help(): EventHelp {\n return {\n usage: 'web: true | false',\n description: 'Open the project homepage in the default browser',\n examples: [\n { config: true, description: 'Enable browser opening' },\n { config: false, description: 'Disable browser opening' },\n ],\n };\n }\n}\n\nexport default WebEvent;\n","import { spawn } from 'child_process';\nimport { input, confirm } from '@inquirer/prompts';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventTmux,\n EventHelp,\n EventProcessingContext,\n ClaudeConfig,\n} from '../../types/index.js';\n\nexport class ClaudeEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'claude',\n displayName: 'Launch Claude Code',\n description: 'Launch Claude Code with optional flags and configuration',\n category: 'development',\n requiresTmux: true,\n dependencies: ['claude'],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n\n if (typeof config === 'object' && config !== null) {\n const cfg = config as ClaudeConfig;\n\n if (cfg.flags !== undefined) {\n if (!Array.isArray(cfg.flags)) {\n return 'claude.flags must be an array of strings';\n }\n for (const flag of cfg.flags) {\n if (typeof flag !== 'string') {\n return 'claude.flags must contain only strings';\n }\n if (!flag.startsWith('-')) {\n return `Invalid flag \"${flag}\": flags must start with - or --`;\n }\n }\n }\n\n if (cfg.split_terminal !== undefined && typeof cfg.split_terminal !== 'boolean') {\n return 'claude.split_terminal must be a boolean';\n }\n\n return true;\n }\n\n return 'claude config must be a boolean or object with flags/split_terminal';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<boolean | ClaudeConfig> {\n const useAdvanced = await confirm({\n message: 'Configure advanced Claude options?',\n default: false,\n });\n\n if (!useAdvanced) {\n return true;\n }\n\n const flagsInput = await input({\n message: 'Enter Claude flags (comma-separated, e.g., --resume, --debug):',\n default: '',\n });\n\n const flags = flagsInput\n .split(',')\n .map((f) => f.trim())\n .filter((f) => f.length > 0 && f.startsWith('-'));\n\n const splitTerminal = await confirm({\n message: 'Use split terminal layout (Claude + shell)?',\n default: true,\n });\n\n if (flags.length === 0 && !splitTerminal) {\n return true;\n }\n\n const config: ClaudeConfig = {};\n if (flags.length > 0) config.flags = flags;\n if (splitTerminal) config.split_terminal = splitTerminal;\n\n return config;\n },\n getDefaultConfig(): boolean {\n return true;\n },\n };\n }\n\n static getClaudeCommand(config: boolean | ClaudeConfig | undefined): string {\n if (typeof config === 'boolean' || config === undefined) {\n return 'claude --dangerously-skip-permissions';\n }\n\n const flags = config.flags || [];\n return flags.length > 0\n ? `claude --dangerously-skip-permissions ${flags.join(' ')}`\n : 'claude --dangerously-skip-permissions';\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const claudeConfig = project.events.claude;\n const claudeCommand = ClaudeEvent.getClaudeCommand(claudeConfig as boolean | ClaudeConfig);\n\n if (isShellMode) {\n shellCommands.push(claudeCommand);\n } else {\n const args = claudeCommand.split(' ').slice(1);\n spawn('claude', args, {\n cwd: project.path.path,\n stdio: 'inherit',\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const claudeConfig = context.project.events.claude;\n return [ClaudeEvent.getClaudeCommand(claudeConfig as boolean | ClaudeConfig)];\n },\n };\n }\n\n static get tmux(): EventTmux {\n return {\n getLayoutPriority(): number {\n return 100; // High priority for Claude\n },\n contributeToLayout(enabledCommands: string[]): string {\n if (enabledCommands.includes('npm')) {\n return 'three-pane';\n }\n return 'split';\n },\n };\n }\n\n static get help(): EventHelp {\n return {\n usage: 'claude: true | { flags: string[], split_terminal: boolean }',\n description: 'Launch Claude Code in the project directory',\n examples: [\n { config: true, description: 'Launch Claude with defaults' },\n { config: { flags: ['--resume'] }, description: 'Resume previous session' },\n {\n config: { flags: ['--model', 'opus'], split_terminal: true },\n description: 'Use Opus model with split terminal',\n },\n ],\n };\n }\n}\n\nexport default ClaudeEvent;\n","import { spawn } from 'child_process';\nimport { input } from '@inquirer/prompts';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventHelp,\n EventProcessingContext,\n DockerConfig,\n} from '../../types/index.js';\n\nexport class DockerEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'docker',\n displayName: 'Docker container management',\n description: 'Start/stop Docker containers for the project',\n category: 'development',\n requiresTmux: false,\n dependencies: ['docker'],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n\n if (typeof config === 'string') {\n // Assume it's a compose file path\n return true;\n }\n\n if (typeof config === 'object' && config !== null) {\n const cfg = config as DockerConfig;\n\n if (cfg.compose_file !== undefined && typeof cfg.compose_file !== 'string') {\n return 'docker.compose_file must be a string';\n }\n\n if (cfg.services !== undefined) {\n if (!Array.isArray(cfg.services)) {\n return 'docker.services must be an array';\n }\n for (const service of cfg.services) {\n if (typeof service !== 'string') {\n return 'docker.services must contain only strings';\n }\n }\n }\n\n return true;\n }\n\n return 'docker config must be a boolean, string (compose file), or object';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<string | DockerConfig> {\n const composeFile = await input({\n message: 'Enter docker-compose file path:',\n default: 'docker-compose.yml',\n });\n\n const servicesInput = await input({\n message: 'Enter services to start (comma-separated, leave empty for all):',\n default: '',\n });\n\n const services = servicesInput\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n if (composeFile === 'docker-compose.yml' && services.length === 0) {\n return { compose_file: 'docker-compose.yml' };\n }\n\n if (services.length === 0) {\n return composeFile;\n }\n\n return {\n compose_file: composeFile,\n services,\n };\n },\n getDefaultConfig(): DockerConfig {\n return { compose_file: 'docker-compose.yml' };\n },\n };\n }\n\n static getDockerCommand(config: boolean | string | DockerConfig | undefined): string {\n if (typeof config === 'boolean' || config === undefined) {\n return 'docker-compose up -d';\n }\n\n if (typeof config === 'string') {\n return `docker-compose -f ${config} up -d`;\n }\n\n const composeFile = config.compose_file || 'docker-compose.yml';\n const services = config.services?.join(' ') || '';\n\n return `docker-compose -f ${composeFile} up -d ${services}`.trim();\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const dockerConfig = project.events.docker;\n const dockerCommand = DockerEvent.getDockerCommand(\n dockerConfig as boolean | string | DockerConfig\n );\n\n if (isShellMode) {\n shellCommands.push(dockerCommand);\n } else {\n const [cmd, ...args] = dockerCommand.split(' ');\n spawn(cmd, args, {\n cwd: project.path.path,\n stdio: 'inherit',\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const dockerConfig = context.project.events.docker;\n return [DockerEvent.getDockerCommand(dockerConfig as boolean | string | DockerConfig)];\n },\n };\n }\n\n static get tmux() {\n return null;\n }\n\n static get help(): EventHelp {\n return {\n usage: 'docker: true | \"compose-file.yml\" | { compose_file: string, services?: string[] }',\n description: 'Start Docker containers for the project',\n examples: [\n { config: true, description: 'Use default docker-compose.yml' },\n { config: 'docker-compose.dev.yml', description: 'Use custom compose file' },\n {\n config: { compose_file: 'docker-compose.yml', services: ['web', 'db'] },\n description: 'Start specific services',\n },\n ],\n };\n }\n}\n\nexport default DockerEvent;\n","import { spawn } from 'child_process';\nimport { input, confirm } from '@inquirer/prompts';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventTmux,\n EventHelp,\n EventProcessingContext,\n NpmConfig,\n} from '../../types/index.js';\n\nexport class NpmEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'npm',\n displayName: 'Run NPM command',\n description: 'Execute NPM scripts in project directory',\n category: 'development',\n requiresTmux: true,\n dependencies: ['npm'],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n\n if (typeof config === 'string') {\n if (config.trim().length === 0) {\n return 'npm script name cannot be empty';\n }\n return true;\n }\n\n if (typeof config === 'object' && config !== null) {\n const cfg = config as NpmConfig;\n\n if (typeof cfg.command !== 'string' || cfg.command.trim().length === 0) {\n return 'npm.command must be a non-empty string';\n }\n\n if (cfg.watch !== undefined && typeof cfg.watch !== 'boolean') {\n return 'npm.watch must be a boolean';\n }\n\n if (cfg.auto_restart !== undefined && typeof cfg.auto_restart !== 'boolean') {\n return 'npm.auto_restart must be a boolean';\n }\n\n return true;\n }\n\n return 'npm config must be a boolean, string (script name), or object';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<string | NpmConfig> {\n const scriptName = await input({\n message: 'Enter NPM script to run:',\n default: 'dev',\n });\n\n const useAdvanced = await confirm({\n message: 'Configure advanced NPM options?',\n default: false,\n });\n\n if (!useAdvanced) {\n return scriptName;\n }\n\n const watch = await confirm({\n message: 'Enable watch mode?',\n default: false,\n });\n\n const autoRestart = await confirm({\n message: 'Auto-restart on crash?',\n default: false,\n });\n\n if (!watch && !autoRestart) {\n return scriptName;\n }\n\n return {\n command: scriptName,\n watch,\n auto_restart: autoRestart,\n };\n },\n getDefaultConfig(): string {\n return 'dev';\n },\n };\n }\n\n static getNpmCommand(config: boolean | string | NpmConfig | undefined): string {\n if (typeof config === 'boolean' || config === undefined) {\n return 'npm run dev';\n }\n\n if (typeof config === 'string') {\n return `npm run ${config}`;\n }\n\n return `npm run ${config.command}`;\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const npmConfig = project.events.npm;\n const npmCommand = NpmEvent.getNpmCommand(npmConfig as boolean | string | NpmConfig);\n\n if (isShellMode) {\n shellCommands.push(npmCommand);\n } else {\n const [cmd, ...args] = npmCommand.split(' ');\n spawn(cmd, args, {\n cwd: project.path.path,\n stdio: 'inherit',\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const npmConfig = context.project.events.npm;\n return [NpmEvent.getNpmCommand(npmConfig as boolean | string | NpmConfig)];\n },\n };\n }\n\n static get tmux(): EventTmux {\n return {\n getLayoutPriority(): number {\n return 50; // Medium priority\n },\n contributeToLayout(enabledCommands: string[]): string {\n if (enabledCommands.includes('claude')) {\n return 'three-pane';\n }\n return 'two-pane-npm';\n },\n };\n }\n\n static get help(): EventHelp {\n return {\n usage: 'npm: true | \"script\" | { command: string, watch?: boolean, auto_restart?: boolean }',\n description: 'Run an NPM script in the project directory',\n examples: [\n { config: true, description: 'Run npm run dev' },\n { config: 'test', description: 'Run npm run test' },\n { config: { command: 'dev', watch: true }, description: 'Run dev with watch mode' },\n ],\n };\n }\n}\n\nexport default NpmEvent;\n","import type { EventHandlerClass, EventMetadata } from '../types/index.js';\n\n// Explicit imports for all events (works with bundled builds)\nimport { CwdEvent } from './core/cwd.js';\nimport { IdeEvent } from './core/ide.js';\nimport { WebEvent } from './core/web.js';\nimport { ClaudeEvent } from './extensions/claude.js';\nimport { DockerEvent } from './extensions/docker.js';\nimport { NpmEvent } from './extensions/npm.js';\n\n// All available event classes\nconst ALL_EVENTS = [CwdEvent, IdeEvent, WebEvent, ClaudeEvent, DockerEvent, NpmEvent] as const;\n\n/**\n * Event Registry for management of events\n * Uses explicit imports to work with bundled builds\n */\nclass EventRegistryClass {\n private _events = new Map<string, EventHandlerClass>();\n private _initialized = false;\n\n /**\n * Initialize the registry by registering all events\n */\n async initialize(): Promise<void> {\n if (this._initialized) return;\n\n this.registerEvents();\n this._initialized = true;\n }\n\n /**\n * Register all event classes\n */\n private registerEvents(): void {\n for (const EventClass of ALL_EVENTS) {\n if (this.isValidEventClass(EventClass)) {\n this._events.set(EventClass.metadata.name, EventClass);\n }\n }\n }\n\n /**\n * Type guard to check if an object is a valid EventHandlerClass\n */\n private isValidEventClass(obj: unknown): obj is EventHandlerClass {\n if (typeof obj !== 'function' && typeof obj !== 'object') return false;\n if (obj === null) return false;\n\n const candidate = obj as Partial<EventHandlerClass>;\n return (\n candidate.metadata !== undefined &&\n typeof candidate.metadata.name === 'string' &&\n typeof candidate.metadata.displayName === 'string' &&\n candidate.validation !== undefined &&\n typeof candidate.validation.validateConfig === 'function' &&\n candidate.configuration !== undefined &&\n typeof candidate.configuration.configureInteractive === 'function' &&\n candidate.processing !== undefined &&\n typeof candidate.processing.processEvent === 'function'\n );\n }\n\n /**\n * Get all valid event names from registered events\n */\n getValidEventNames(): string[] {\n this.ensureInitialized();\n return Array.from(this._events.keys());\n }\n\n /**\n * Get event by name\n */\n getEventByName(name: string): EventHandlerClass | null {\n this.ensureInitialized();\n return this._events.get(name) ?? null;\n }\n\n /**\n * Get all events for management UI\n */\n getEventsForManageUI(): Array<{ name: string; value: string; description: string }> {\n this.ensureInitialized();\n\n const events: Array<{ name: string; value: string; description: string }> = [];\n for (const [name, eventClass] of this._events) {\n events.push({\n name: eventClass.metadata.displayName,\n value: name,\n description: eventClass.metadata.description,\n });\n }\n\n return events.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Get events that support tmux integration\n */\n getTmuxEnabledEvents(): Array<{ name: string; event: EventHandlerClass; priority: number }> {\n this.ensureInitialized();\n\n const tmuxEvents: Array<{ name: string; event: EventHandlerClass; priority: number }> = [];\n for (const [name, eventClass] of this._events) {\n const tmux = eventClass.tmux;\n if (tmux) {\n tmuxEvents.push({\n name,\n event: eventClass,\n priority: tmux.getLayoutPriority(),\n });\n }\n }\n\n return tmuxEvents.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Get all available events with their metadata\n */\n getAllEvents(): Array<{\n name: string;\n metadata: EventMetadata;\n hasValidation: boolean;\n hasConfiguration: boolean;\n hasProcessing: boolean;\n hasTmux: boolean;\n hasHelp: boolean;\n }> {\n this.ensureInitialized();\n\n const events = [];\n for (const [name, eventClass] of this._events) {\n events.push({\n name,\n metadata: eventClass.metadata,\n hasValidation: !!eventClass.validation,\n hasConfiguration: !!eventClass.configuration,\n hasProcessing: !!eventClass.processing,\n hasTmux: !!eventClass.tmux,\n hasHelp: !!eventClass.help,\n });\n }\n\n return events;\n }\n\n /**\n * Ensure registry is initialized\n */\n private ensureInitialized(): void {\n if (!this._initialized) {\n throw new Error('EventRegistry must be initialized before use. Call initialize() first.');\n }\n }\n\n /**\n * Clear the registry (useful for testing)\n */\n clear(): void {\n this._events.clear();\n this._initialized = false;\n }\n}\n\n// Export singleton instance\nexport const EventRegistry = new EventRegistryClass();\n","/**\n * Shell command sanitization utilities.\n * Prevents shell injection attacks from malicious project names or paths.\n */\n\n/**\n * Sanitize a string for safe use as a shell identifier (e.g., tmux session name).\n * Only allows alphanumeric characters, underscores, hyphens, and dots.\n * All other characters are replaced with underscores.\n */\nexport function sanitizeForShell(input: string): string {\n if (!input) return '';\n return input.replace(/[^a-zA-Z0-9_\\-.]/g, '_');\n}\n\n/**\n * Escape a string for safe use in a double-quoted shell context.\n * Escapes characters that have special meaning in double quotes: $, `, \\, \", !\n */\nexport function escapeShellArg(input: string): string {\n if (!input) return '';\n return input.replace(/([\\\\$`\"!])/g, '\\\\$1');\n}\n\n/**\n * Escape a string for safe use in a single-quoted shell context.\n * Single quotes prevent all interpolation, but we need to handle\n * embedded single quotes by ending the string, adding an escaped quote,\n * and restarting the string.\n */\nexport function escapeForSingleQuotes(input: string): string {\n if (!input) return '';\n return input.replace(/'/g, \"'\\\\''\");\n}\n","import { exec as execCallback, spawn } from 'child_process';\nimport { promisify } from 'util';\nimport { sanitizeForShell, escapeForSingleQuotes } from './sanitize.js';\n\nconst exec = promisify(execCallback);\n\n/**\n * Wraps a command so it falls back to a shell when the command exits.\n * This prevents tmux panes from showing \"Pane is dead\" after a process ends.\n */\nfunction wrapWithShellFallback(command: string): string {\n // Use $SHELL to get the user's preferred shell.\n // Note: We use simple $SHELL syntax (not ${SHELL:-default}) for compatibility\n // with non-POSIX shells like fish and csh that tmux may use to execute commands.\n return `${command}; exec $SHELL`;\n}\n\nexport class TmuxManager {\n private sessionPrefix = 'workon-';\n\n async isTmuxAvailable(): Promise<boolean> {\n try {\n await exec('which tmux');\n return true;\n } catch {\n return false;\n }\n }\n\n async sessionExists(sessionName: string): Promise<boolean> {\n try {\n // sessionName is already sanitized by getSessionName\n await exec(`tmux has-session -t '${escapeForSingleQuotes(sessionName)}'`);\n return true;\n } catch {\n return false;\n }\n }\n\n getSessionName(projectName: string): string {\n // Sanitize project name to prevent shell injection\n return `${this.sessionPrefix}${sanitizeForShell(projectName)}`;\n }\n\n getWorktreeSessionName(projectName: string, worktreeName: string): string {\n // Session name format: workon-{project}-{worktree}\n const sanitizedProject = sanitizeForShell(projectName);\n const sanitizedWorktree = sanitizeForShell(worktreeName);\n return `${this.sessionPrefix}${sanitizedProject}-${sanitizedWorktree}`;\n }\n\n async killSession(sessionName: string): Promise<boolean> {\n try {\n await exec(`tmux kill-session -t '${escapeForSingleQuotes(sessionName)}'`);\n return true;\n } catch {\n return false;\n }\n }\n\n async createSplitSession(\n projectName: string,\n projectPath: string,\n claudeArgs: string[] = []\n ): Promise<string> {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n\n // Kill existing session if it exists\n if (await this.sessionExists(sessionName)) {\n await this.killSession(sessionName);\n }\n\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n\n // Create new tmux session with claude in the first pane\n await exec(\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`\n );\n\n // Split window horizontally and run shell in second pane\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`);\n\n // Set focus on claude pane (left pane)\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n\n return sessionName;\n }\n\n async createThreePaneSession(\n projectName: string,\n projectPath: string,\n claudeArgs: string[] = [],\n npmCommand = 'npm run dev'\n ): Promise<string> {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n\n // Kill existing session if it exists\n if (await this.sessionExists(sessionName)) {\n await this.killSession(sessionName);\n }\n\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n // Create new tmux session with claude in the first pane (left side)\n await exec(\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`\n );\n\n // Split window vertically - creates right side (50/50 split)\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`);\n\n // Split the right pane horizontally - creates top-right and bottom-right (50/50 split)\n await exec(\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${wrappedNpmCmd}'`\n );\n\n // Resize panes to ensure npm pane is visible (give it at least 10 lines)\n await exec(`tmux resize-pane -t '${escapedSession}:0.2' -y 10`);\n\n // Set focus on claude pane (left pane)\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n\n return sessionName;\n }\n\n async createTwoPaneNpmSession(\n projectName: string,\n projectPath: string,\n npmCommand = 'npm run dev'\n ): Promise<string> {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n // Kill existing session if it exists\n if (await this.sessionExists(sessionName)) {\n await this.killSession(sessionName);\n }\n\n // Create new tmux session with shell in the first pane (left side)\n await exec(`tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`);\n\n // Split window vertically and run npm command in right pane\n await exec(\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}' '${wrappedNpmCmd}'`\n );\n\n // Set focus on terminal pane (left pane)\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n\n return sessionName;\n }\n\n async attachToSession(sessionName: string): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n\n // Check if we're already in a tmux session\n if (process.env.TMUX) {\n // If we're already in tmux, switch to the session\n await exec(`tmux switch-client -t '${escapedSession}'`);\n } else {\n // Check if iTerm2 integration is available\n const isITerm =\n process.env.TERM_PROGRAM === 'iTerm.app' ||\n process.env.LC_TERMINAL === 'iTerm2' ||\n !!process.env.ITERM_SESSION_ID;\n const useiTermIntegration = isITerm && !process.env.TMUX_CC_NOT_SUPPORTED;\n\n if (useiTermIntegration) {\n // Use iTerm2 tmux integration - spawn detached to avoid blocking\n spawn('tmux', ['-CC', 'attach-session', '-t', sessionName], {\n stdio: 'inherit',\n detached: true,\n });\n } else {\n // Use regular tmux - spawn detached to avoid blocking\n spawn('tmux', ['attach-session', '-t', sessionName], {\n stdio: 'inherit',\n detached: true,\n });\n }\n }\n }\n\n buildShellCommands(\n projectName: string,\n projectPath: string,\n claudeArgs: string[] = []\n ): string[] {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n\n return [\n `# Create tmux split session for ${sanitizeForShell(projectName)}`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n this.getAttachCommand(sessionName),\n ];\n }\n\n buildThreePaneShellCommands(\n projectName: string,\n projectPath: string,\n claudeArgs: string[] = [],\n npmCommand = 'npm run dev'\n ): string[] {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n return [\n `# Create tmux three-pane session for ${sanitizeForShell(projectName)}`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${wrappedNpmCmd}'`,\n `tmux resize-pane -t '${escapedSession}:0.2' -y 10`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n this.getAttachCommand(sessionName),\n ];\n }\n\n buildTwoPaneNpmShellCommands(\n projectName: string,\n projectPath: string,\n npmCommand = 'npm run dev'\n ): string[] {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n return [\n `# Create tmux two-pane session with npm for ${sanitizeForShell(projectName)}`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}' '${wrappedNpmCmd}'`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n this.getAttachCommand(sessionName),\n ];\n }\n\n private getAttachCommand(sessionName: string): string {\n const escapedSession = escapeForSingleQuotes(sessionName);\n\n if (process.env.TMUX) {\n return `tmux switch-client -t '${escapedSession}'`;\n }\n\n const isITerm =\n process.env.TERM_PROGRAM === 'iTerm.app' ||\n process.env.LC_TERMINAL === 'iTerm2' ||\n process.env.ITERM_SESSION_ID;\n const useiTermIntegration = isITerm && !process.env.TMUX_CC_NOT_SUPPORTED;\n\n if (useiTermIntegration) {\n return `tmux -CC attach-session -t '${escapedSession}'`;\n }\n return `tmux attach-session -t '${escapedSession}'`;\n }\n\n async listWorkonSessions(): Promise<string[]> {\n try {\n const { stdout } = await exec('tmux list-sessions -F \"#{session_name}\"');\n return stdout\n .trim()\n .split('\\n')\n .filter((session) => session.startsWith(this.sessionPrefix))\n .map((session) => session.replace(this.sessionPrefix, ''));\n } catch {\n return [];\n }\n }\n}\n","import type { IdeType } from './index.js';\n\n/**\n * IDE choice options for interactive selection prompts.\n * Shared between interactive.ts and manage.ts.\n */\nexport const IDE_CHOICES = [\n { name: 'Cursor', value: 'cursor' as IdeType },\n { name: 'Visual Studio Code', value: 'vscode' as IdeType },\n { name: 'Visual Studio Code (code)', value: 'code' as IdeType },\n { name: 'IntelliJ IDEA', value: 'idea' as IdeType },\n { name: 'Atom', value: 'atom' as IdeType },\n { name: 'Sublime Text', value: 'subl' as IdeType },\n { name: 'Vim', value: 'vim' as IdeType },\n { name: 'Emacs', value: 'emacs' as IdeType },\n] as const;\n","import { exec as execCallback } from 'child_process';\nimport { promisify } from 'util';\nimport { existsSync, chmodSync } from 'fs';\nimport { join, basename } from 'path';\nimport { createHash } from 'crypto';\nimport { homedir } from 'os';\nimport { simpleGit, SimpleGit } from 'simple-git';\n\nconst exec = promisify(execCallback);\n\nexport interface WorktreeInfo {\n path: string;\n branch: string;\n head: string;\n isMain: boolean;\n name: string;\n}\n\nexport interface AddWorktreeOptions {\n branch: string;\n baseBranch?: string;\n force?: boolean;\n}\n\nexport interface MergeOptions {\n targetBranch: string;\n squash?: boolean;\n}\n\nconst WORKON_DIR = '.workon';\nconst WORKTREES_SUBDIR = 'worktrees';\nconst HOOK_DIR = '.workon';\nconst SETUP_HOOK = 'worktree-setup.sh';\n\n/**\n * Generate a short hash from a path for disambiguation\n */\nfunction shortHash(input: string): string {\n return createHash('sha256').update(input).digest('hex').substring(0, 8);\n}\n\n/**\n * Derive a unique project identifier from the project path\n * Uses basename + short hash of full path for uniqueness\n */\nexport function deriveProjectIdentifier(projectPath: string): string {\n const name = basename(projectPath);\n const hash = shortHash(projectPath);\n return `${name}-${hash}`;\n}\n\n/**\n * Get the worktrees directory for a project\n */\nexport function getWorktreesDirForProject(projectIdentifier: string): string {\n return join(homedir(), WORKON_DIR, WORKTREES_SUBDIR, projectIdentifier);\n}\n\nexport class WorktreeManager {\n private projectPath: string;\n private projectIdentifier: string;\n private git: SimpleGit;\n\n constructor(projectPath: string, _projectName?: string) {\n this.projectPath = projectPath;\n // Always use derived identifier for consistency between creation and detection\n // The project name parameter is kept for potential future use (e.g., display)\n this.projectIdentifier = deriveProjectIdentifier(projectPath);\n this.git = simpleGit(projectPath);\n }\n\n /**\n * Check if the project is a git repository\n */\n async isGitRepository(): Promise<boolean> {\n try {\n await this.git.revparse(['--git-dir']);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the worktrees directory path\n * Stored at ~/.workon/worktrees/{project-identifier}/\n */\n getWorktreesDir(): string {\n return join(homedir(), WORKON_DIR, WORKTREES_SUBDIR, this.projectIdentifier);\n }\n\n /**\n * Convert branch name to directory name (replace slashes with dashes)\n */\n branchToDir(branch: string): string {\n return branch.replace(/\\//g, '-');\n }\n\n /**\n * List all worktrees for this repository\n */\n async list(): Promise<WorktreeInfo[]> {\n const result = await this.git.raw(['worktree', 'list', '--porcelain']);\n return this.parseWorktreeList(result);\n }\n\n /**\n * List only worktrees managed by workon (under .worktrees/)\n */\n async listManagedWorktrees(): Promise<WorktreeInfo[]> {\n const all = await this.list();\n const worktreesDir = this.getWorktreesDir();\n return all.filter((wt) => wt.path.startsWith(worktreesDir));\n }\n\n /**\n * Get a specific worktree by name (searches all worktrees, not just managed ones)\n */\n async get(name: string): Promise<WorktreeInfo | null> {\n const worktrees = await this.list();\n // Search by name or branch name\n return (\n worktrees.find(\n (wt) => wt.name === name || wt.branch === name || this.branchToDir(wt.branch) === name\n ) || null\n );\n }\n\n /**\n * Create a new worktree\n */\n async add(options: AddWorktreeOptions): Promise<WorktreeInfo> {\n const { branch, baseBranch, force } = options;\n const dirName = this.branchToDir(branch);\n const worktreePath = join(this.getWorktreesDir(), dirName);\n\n // Check if worktree already exists\n const existing = await this.get(dirName);\n if (existing) {\n if (!force) {\n throw new Error(`Worktree '${dirName}' already exists at ${existing.path}`);\n }\n // Force specified: remove existing worktree first\n await this.git.raw(['worktree', 'remove', '--force', existing.path]);\n }\n\n // Check if branch exists\n const branchExists = await this.branchExists(branch);\n\n const args = ['worktree', 'add'];\n\n if (branchExists) {\n // Checkout existing branch - use --force in case branch is checked out elsewhere\n if (force) {\n args.push('--force');\n }\n args.push(worktreePath, branch);\n } else {\n // Create new branch from baseBranch or current HEAD\n args.push('-b', branch, worktreePath);\n if (baseBranch) {\n args.push(baseBranch);\n }\n }\n\n await this.git.raw(args);\n\n // Return the created worktree info\n const worktree = await this.get(dirName);\n if (!worktree) {\n throw new Error('Failed to create worktree');\n }\n return worktree;\n }\n\n /**\n * Remove a worktree\n */\n async remove(name: string, force = false): Promise<void> {\n const worktree = await this.get(name);\n if (!worktree) {\n throw new Error(`Worktree '${name}' not found`);\n }\n\n if (worktree.isMain) {\n throw new Error('Cannot remove the main worktree');\n }\n\n // Check for uncommitted changes\n if (!force && (await this.hasUncommittedChanges(name))) {\n throw new Error(`Worktree '${name}' has uncommitted changes. Use --force to remove anyway.`);\n }\n\n const args = ['worktree', 'remove'];\n if (force) {\n args.push('--force');\n }\n args.push(worktree.path);\n\n await this.git.raw(args);\n }\n\n /**\n * Check if a worktree has uncommitted changes\n * Accepts worktree name, branch name, or path\n */\n async hasUncommittedChanges(nameOrPath: string): Promise<boolean> {\n // Try to find by name first\n let worktree = await this.get(nameOrPath);\n\n // If not found and looks like a path, try direct access\n if (!worktree && nameOrPath.startsWith('/')) {\n const all = await this.list();\n worktree = all.find((wt) => wt.path === nameOrPath) || null;\n }\n\n if (!worktree) {\n throw new Error(`Worktree '${nameOrPath}' not found`);\n }\n\n const worktreeGit = simpleGit(worktree.path);\n const status = await worktreeGit.status();\n return !status.isClean();\n }\n\n /**\n * Get the current branch of the main worktree\n */\n async getCurrentBranch(): Promise<string> {\n const branch = await this.git.revparse(['--abbrev-ref', 'HEAD']);\n return branch.trim();\n }\n\n /**\n * Get all local branches\n */\n async getBranches(): Promise<string[]> {\n const result = await this.git.branchLocal();\n return result.all;\n }\n\n /**\n * Check if a branch exists\n */\n async branchExists(branch: string): Promise<boolean> {\n try {\n await this.git.revparse(['--verify', `refs/heads/${branch}`]);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Merge a worktree's branch into a target branch\n */\n async merge(name: string, options: MergeOptions): Promise<void> {\n const worktree = await this.get(name);\n if (!worktree) {\n throw new Error(`Worktree '${name}' not found`);\n }\n\n const { targetBranch, squash } = options;\n\n // Ensure target branch exists\n if (!(await this.branchExists(targetBranch))) {\n throw new Error(`Target branch '${targetBranch}' does not exist`);\n }\n\n // Checkout target branch in main worktree\n await this.git.checkout(targetBranch);\n\n // Merge the worktree's branch\n const mergeArgs = ['merge'];\n if (squash) {\n mergeArgs.push('--squash');\n }\n mergeArgs.push(worktree.branch);\n\n await this.git.raw(mergeArgs);\n\n // If squash merge, we need to commit\n if (squash) {\n await this.git.commit(`Merge ${worktree.branch} into ${targetBranch} (squashed)`);\n }\n }\n\n /**\n * Check if a post-setup hook exists\n */\n hasSetupHook(): boolean {\n const hookPath = this.getSetupHookPath();\n return existsSync(hookPath);\n }\n\n /**\n * Get the path to the setup hook\n */\n getSetupHookPath(): string {\n return join(this.projectPath, HOOK_DIR, SETUP_HOOK);\n }\n\n /**\n * Run the post-setup hook for a worktree\n */\n async runPostSetupHook(worktreePath: string): Promise<{ stdout: string; stderr: string }> {\n const hookPath = this.getSetupHookPath();\n\n if (!existsSync(hookPath)) {\n throw new Error('Setup hook not found');\n }\n\n // Ensure hook is executable\n try {\n chmodSync(hookPath, '755');\n } catch {\n // Ignore chmod errors on systems that don't support it\n }\n\n const env = {\n ...process.env,\n WORKTREE_PATH: worktreePath,\n PROJECT_PATH: this.projectPath,\n };\n\n const { stdout, stderr } = await exec(hookPath, {\n cwd: worktreePath,\n env,\n });\n\n return { stdout, stderr };\n }\n\n /**\n * Parse the porcelain output of git worktree list\n */\n private parseWorktreeList(output: string): WorktreeInfo[] {\n const worktrees: WorktreeInfo[] = [];\n const blocks = output.trim().split('\\n\\n');\n\n for (const block of blocks) {\n if (!block.trim()) continue;\n\n const lines = block.split('\\n');\n let path = '';\n let head = '';\n let branch = '';\n let isMain = false;\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n path = line.substring('worktree '.length);\n // First worktree is the main one\n isMain = worktrees.length === 0;\n } else if (line.startsWith('HEAD ')) {\n head = line.substring('HEAD '.length);\n } else if (line.startsWith('branch ')) {\n // Format: branch refs/heads/branch-name\n branch = line.substring('branch refs/heads/'.length);\n } else if (line === 'detached') {\n branch = '(detached)';\n }\n }\n\n if (path) {\n // Calculate name from path\n const worktreesDir = this.getWorktreesDir();\n let name: string;\n if (path.startsWith(worktreesDir)) {\n // Managed worktree under ~/.workon/worktrees/{project}/\n name = basename(path);\n } else if (path === this.projectPath) {\n // Main worktree\n name = '(main)';\n } else {\n // External worktree - use branch name converted to dir format, or basename\n name = branch && branch !== '(detached)' ? this.branchToDir(branch) : basename(path);\n }\n\n worktrees.push({\n path,\n branch,\n head,\n isMain,\n name,\n });\n }\n }\n\n return worktrees;\n }\n}\n","import File from 'phylo';\nimport path from 'path';\nimport { simpleGit } from 'simple-git';\nimport { deriveProjectIdentifier, getWorktreesDirForProject } from '../../lib/worktree.js';\nimport { select, checkbox, confirm, input } from '@inquirer/prompts';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger, ProjectConfig, EventsConfig } from '../../types/index.js';\nimport { EventRegistry } from '../../events/registry.js';\nimport { IDE_CHOICES } from '../../types/constants.js';\n\n/**\n * Context about whether we're inside a git worktree\n */\nexport interface WorktreeInfo {\n isWorktree: boolean; // True if we're inside a worktree (not main repo)\n worktreePath: string | null; // Path to current worktree root (if in worktree)\n mainRepoPath: string; // Path to main repository\n worktreeName: string | null; // Name of worktree (directory name)\n branch: string | null; // Current branch in worktree\n}\n\n/**\n * Context returned when resolving a project from the current working directory\n */\nexport interface ProjectContext {\n projectPath: string; // Absolute path to main repo (even if in worktree)\n projectName: string | null; // Name if registered, null otherwise\n projectConfig: ProjectConfig | null;\n isRegistered: boolean;\n worktreeInfo: WorktreeInfo; // Info about worktree context\n}\n\n/**\n * Detect if we're inside a git worktree and get context about it\n */\nexport async function detectWorktreeContext(\n cwd: string = process.cwd()\n): Promise<WorktreeInfo | null> {\n try {\n const git = simpleGit(cwd);\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n return null;\n }\n\n // Get the git directory and common directory\n // --git-dir returns the .git dir for current worktree\n // --git-common-dir returns the shared .git dir (main repo's .git)\n const gitDir = (await git.revparse(['--git-dir'])).trim();\n const gitCommonDir = (await git.revparse(['--git-common-dir'])).trim();\n const worktreeRoot = (await git.revparse(['--show-toplevel'])).trim();\n\n // Normalize paths for comparison\n const normalizedGitDir = path.resolve(cwd, gitDir);\n const normalizedCommonDir = path.resolve(cwd, gitCommonDir);\n\n // If git-dir and git-common-dir are different, we're in a worktree\n const isWorktree = normalizedGitDir !== normalizedCommonDir;\n\n if (isWorktree) {\n // We're in a worktree - find the main repo path\n // The common dir is inside the main repo's .git folder\n const mainRepoPath = path.dirname(normalizedCommonDir);\n\n // Get current branch\n let branch: string | null = null;\n try {\n branch = (await git.revparse(['--abbrev-ref', 'HEAD'])).trim();\n if (branch === 'HEAD') branch = '(detached)';\n } catch {\n branch = '(detached)';\n }\n\n // Find the worktree name by querying git worktree list from main repo\n // This ensures we get the correct name that WorktreeManager.get() expects\n const worktreeName = await findWorktreeNameByPath(mainRepoPath, worktreeRoot);\n\n return {\n isWorktree: true,\n worktreePath: worktreeRoot,\n mainRepoPath,\n worktreeName,\n branch,\n };\n } else {\n // We're in the main repository\n return {\n isWorktree: false,\n worktreePath: null,\n mainRepoPath: worktreeRoot,\n worktreeName: null,\n branch: null,\n };\n }\n } catch {\n return null;\n }\n}\n\n/**\n * Find a worktree's name by its path by querying git worktree list\n * Returns the name that WorktreeManager uses (branch-derived for external worktrees)\n */\nasync function findWorktreeNameByPath(\n mainRepoPath: string,\n worktreePath: string\n): Promise<string | null> {\n try {\n const git = simpleGit(mainRepoPath);\n const result = await git.raw(['worktree', 'list', '--porcelain']);\n\n const blocks = result.trim().split('\\n\\n');\n // Project-specific worktrees directory: ~/.workon/worktrees/{project-identifier}/\n // Use derived identifier since we don't know if the project is registered\n const projectIdentifier = deriveProjectIdentifier(mainRepoPath);\n const projectWorktreesDir = getWorktreesDirForProject(projectIdentifier);\n\n for (const block of blocks) {\n if (!block.trim()) continue;\n\n const lines = block.split('\\n');\n let wtPath = '';\n let branch = '';\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n wtPath = line.substring('worktree '.length);\n } else if (line.startsWith('branch ')) {\n branch = line.substring('branch refs/heads/'.length);\n } else if (line === 'detached') {\n branch = '(detached)';\n }\n }\n\n // Check if this is the worktree we're looking for\n if (wtPath === worktreePath) {\n // Use the same naming logic as WorktreeManager.parseWorktreeList\n if (wtPath.startsWith(projectWorktreesDir)) {\n // Managed worktree under ~/.workon/worktrees/{project}/\n return path.basename(wtPath);\n } else {\n // External worktree - use branch name converted to dir format, or basename\n return branch && branch !== '(detached)'\n ? branch.replace(/\\//g, '-')\n : path.basename(wtPath);\n }\n }\n }\n\n // Fallback to basename if not found (shouldn't happen)\n return path.basename(worktreePath);\n } catch {\n return path.basename(worktreePath);\n }\n}\n\n/**\n * Resolve the project from the current working directory\n * Finds the git root and checks if it's a registered project.\n * If inside a worktree, uses the main repo path for registration lookup.\n */\nexport async function resolveProjectFromCwd(\n config: Config,\n log: Logger\n): Promise<ProjectContext | null> {\n const cwd = process.cwd();\n\n // Detect worktree context\n const worktreeInfo = await detectWorktreeContext(cwd);\n if (!worktreeInfo) {\n return null;\n }\n\n // Use the main repo path for project lookup (not worktree path)\n const projectPath = worktreeInfo.mainRepoPath;\n\n if (worktreeInfo.isWorktree) {\n log.debug(`Inside worktree '${worktreeInfo.worktreeName}', main repo at ${projectPath}`);\n }\n\n // Search registered projects by comparing absolute paths\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n const basePath = defaults?.base || '';\n\n for (const [name, projectConfig] of Object.entries(projects)) {\n // Skip branch configs (contain #)\n if (name.includes('#')) continue;\n\n // Resolve the configured path to absolute\n let configuredPath: string;\n const configPath = File.from(projectConfig.path);\n\n if (configPath.path.startsWith('/') || configPath.path.startsWith('~')) {\n configuredPath = configPath.absolutify().path;\n } else if (basePath) {\n configuredPath = File.from(basePath).absolutify().join(projectConfig.path).path;\n } else {\n configuredPath = configPath.absolutify().path;\n }\n\n // Compare paths\n if (configuredPath === projectPath) {\n log.debug(`Found registered project '${name}' at ${projectPath}`);\n return {\n projectPath,\n projectName: name,\n projectConfig,\n isRegistered: true,\n worktreeInfo,\n };\n }\n }\n\n // Not registered\n log.debug(`Project at ${projectPath} is not registered`);\n return {\n projectPath,\n projectName: null,\n projectConfig: null,\n isRegistered: false,\n worktreeInfo,\n };\n}\n\n/**\n * Prompt to register a project that was found but not registered\n * Uses similar logic to the interactive add flow\n */\nexport async function promptToRegisterProject(\n projectPath: string,\n config: Config,\n log: Logger\n): Promise<{ projectName: string; projectConfig: ProjectConfig } | null> {\n const shouldAdd = await confirm({\n message: 'This project is not registered. Would you like to add it now?',\n default: true,\n });\n\n if (!shouldAdd) {\n return null;\n }\n\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n // Suggest a name based on directory\n const suggestedName = path.basename(projectPath);\n\n const name = await input({\n message: 'Project name:',\n default: suggestedName,\n validate: (value) => {\n if (!value.trim()) return 'Name is required';\n if (!/^[\\w-]+$/.test(value))\n return 'Name can only contain letters, numbers, underscores, and hyphens';\n if (value in projects) return 'Project already exists';\n return true;\n },\n });\n\n // Calculate relative path if we have a base\n let relativePath = projectPath;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base).absolutify();\n const projectFile = File.from(projectPath);\n try {\n if (projectFile.path.startsWith(baseDir.path)) {\n relativePath = projectFile.relativize(baseDir.path).path;\n }\n } catch {\n // Keep absolute path\n }\n }\n\n // IDE selection\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n default: 'vscode',\n });\n\n // Event selection\n const availableEvents = EventRegistry.getEventsForManageUI();\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: e.value === 'cwd' || e.value === 'ide' || e.value === 'claude',\n })),\n });\n\n const events: EventsConfig = {};\n for (const eventName of selectedEvents) {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n\n const projectConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n await config.setProjectSafe(name, projectConfig);\n log.info(`Project '${name}' registered successfully!`);\n\n return { projectName: name, projectConfig };\n}\n\n/**\n * Resolve a project name to its absolute path\n */\nexport function resolveProjectPath(\n projectName: string,\n config: Config,\n log: Logger\n): string | null {\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n if (!(projectName in projects)) {\n log.error(`Project '${projectName}' not found.`);\n log.info(`Run 'workon' to see available projects.`);\n return null;\n }\n\n const projectConfig = projects[projectName];\n const basePath = defaults?.base || '';\n\n let projectPath: string;\n // Check if the project path is already absolute\n const configPath = File.from(projectConfig.path);\n if (configPath.path.startsWith('/') || configPath.path.startsWith('~')) {\n // Path is absolute, use it directly\n projectPath = configPath.absolutify().path;\n } else if (basePath) {\n // Relative path, prepend base\n projectPath = File.from(basePath).absolutify().join(projectConfig.path).path;\n } else {\n // No base, try to absolutify the relative path\n projectPath = configPath.absolutify().path;\n }\n\n return projectPath;\n}\n\n/**\n * Format a branch name for display (truncate if too long)\n */\nexport function formatBranchName(branch: string, maxLength = 30): string {\n if (branch.length <= maxLength) {\n return branch;\n }\n return branch.substring(0, maxLength - 3) + '...';\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'path';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { resolveProjectFromCwd } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\nexport function createListCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('list')\n .description('List worktrees for the current project')\n .option('-a, --all', 'Show all worktrees (including main)')\n .action(async (options: { all?: boolean }) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const allWorktrees = await manager.list();\n const managedWorktrees = await manager.listManagedWorktrees();\n const managedPaths = new Set(managedWorktrees.map((wt) => wt.path));\n\n const worktrees = options.all ? allWorktrees : allWorktrees.filter((wt) => !wt.isMain);\n\n if (worktrees.length === 0) {\n if (options.all) {\n log.info('No worktrees found.');\n } else {\n log.info(`No worktrees found for '${displayName}'.`);\n log.info(`Use 'workon worktrees add <branch>' to create one.`);\n }\n return;\n }\n\n console.log(chalk.bold(`\\nWorktrees for ${displayName}:`));\n console.log('-'.repeat(60));\n\n for (const wt of worktrees) {\n const isManaged = managedPaths.has(wt.path);\n const mainLabel = wt.isMain ? chalk.gray(' (main)') : '';\n const externalLabel = !wt.isMain && !isManaged ? chalk.yellow(' (external)') : '';\n const branchDisplay =\n wt.branch === '(detached)' ? chalk.yellow(wt.branch) : chalk.green(wt.branch);\n\n console.log(` ${chalk.cyan(wt.name)}${mainLabel}${externalLabel}`);\n console.log(` Branch: ${branchDisplay}`);\n console.log(` Path: ${chalk.gray(wt.path)}`);\n console.log(` HEAD: ${chalk.gray(wt.head.substring(0, 8))}`);\n console.log();\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { select, confirm } from '@inquirer/prompts';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { resolveProjectFromCwd, promptToRegisterProject, type ProjectContext } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface AddOptions {\n base?: string;\n force?: boolean;\n open?: boolean;\n hook?: boolean; // Commander negated options: --no-hook sets hook=false\n}\n\nexport function createAddCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('add')\n .description('Create a new worktree for a branch')\n .argument('<branch>', 'Branch name for the worktree')\n .option('-b, --base <branch>', 'Base branch to create new branch from')\n .option('-f, --force', 'Overwrite existing worktree')\n .option('-o, --open', 'Open the worktree after creation')\n .option('--no-hook', 'Skip running the post-setup hook')\n .action(async (branch: string, options: AddOptions) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n // For full functionality (open session), we need registration\n if (!projectCtx.isRegistered) {\n const result = await promptToRegisterProject(projectCtx.projectPath, config, log);\n if (result) {\n projectCtx.projectName = result.projectName;\n projectCtx.projectConfig = result.projectConfig;\n projectCtx.isRegistered = true;\n }\n }\n\n const { projectPath, projectName } = projectCtx;\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n // If no base branch specified and branch doesn't exist, ask user\n const branchExists = await manager.branchExists(branch);\n let baseBranch = options.base;\n\n if (!branchExists && !baseBranch) {\n const branches = await manager.getBranches();\n const currentBranch = await manager.getCurrentBranch();\n\n baseBranch = await select({\n message: `Branch '${branch}' doesn't exist. Create from which branch?`,\n choices: branches.map((b) => ({\n name: b === currentBranch ? `${b} (current)` : b,\n value: b,\n })),\n default: currentBranch,\n });\n }\n\n const spinner = ora(`Creating worktree for branch '${branch}'...`).start();\n\n try {\n const worktree = await manager.add({\n branch,\n baseBranch,\n force: options.force,\n });\n\n spinner.succeed(`Worktree created at ${chalk.cyan(worktree.path)}`);\n\n // Run post-setup hook if it exists and not disabled (--no-hook sets options.hook=false)\n if (options.hook !== false && manager.hasSetupHook()) {\n const hookSpinner = ora('Running post-setup hook...').start();\n try {\n const { stdout, stderr } = await manager.runPostSetupHook(worktree.path);\n hookSpinner.succeed('Post-setup hook completed');\n if (stdout.trim()) {\n console.log(chalk.gray(stdout.trim()));\n }\n if (stderr.trim()) {\n console.log(chalk.yellow(stderr.trim()));\n }\n } catch (error) {\n hookSpinner.warn(`Post-setup hook failed: ${(error as Error).message}`);\n }\n }\n\n console.log(`\\n${chalk.bold('Worktree details:')}`);\n console.log(` Name: ${chalk.cyan(worktree.name)}`);\n console.log(` Branch: ${chalk.green(worktree.branch)}`);\n console.log(` Path: ${chalk.gray(worktree.path)}`);\n\n // Ask to open if --open flag or prompt (only if registered)\n if (projectCtx.isRegistered && projectName) {\n if (options.open) {\n await openWorktreeSession(projectCtx, worktree.name, config, log);\n } else {\n const shouldOpen = await confirm({\n message: 'Open workon session in this worktree?',\n default: true,\n });\n\n if (shouldOpen) {\n await openWorktreeSession(projectCtx, worktree.name, config, log);\n } else {\n console.log(\n `\\nTo open later: ${chalk.cyan(`workon worktrees open ${worktree.name}`)}`\n );\n }\n }\n } else {\n console.log(\n `\\n${chalk.yellow('Note:')} Register this project to enable full workon sessions.`\n );\n console.log(` cd ${worktree.path}`);\n }\n } catch (error) {\n spinner.fail(`Failed to create worktree: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n\nasync function openWorktreeSession(\n projectCtx: ProjectContext,\n worktreeName: string,\n config: Config,\n log: Logger\n): Promise<void> {\n if (!projectCtx.projectName) {\n log.warn('Cannot open session: project is not registered.');\n return;\n }\n // Import and call the open worktree command logic\n const { runWorktreeOpen } = await import('./open.js');\n await runWorktreeOpen(projectCtx, worktreeName, {}, { config, log });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport { confirm } from '@inquirer/prompts';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { TmuxManager } from '../../lib/tmux.js';\nimport { resolveProjectFromCwd } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface RemoveOptions {\n force?: boolean;\n yes?: boolean;\n}\n\nexport function createRemoveCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('remove')\n .description('Remove a worktree')\n .argument('<name>', 'Worktree name')\n .option('-f, --force', 'Force removal even with uncommitted changes')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (name: string, options: RemoveOptions) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const worktree = await manager.get(name);\n if (!worktree) {\n log.error(`Worktree '${name}' not found for '${displayName}'`);\n const worktrees = await manager.listManagedWorktrees();\n if (worktrees.length > 0) {\n log.info('Available worktrees:');\n worktrees.forEach((wt) => log.info(` - ${wt.name}`));\n }\n process.exit(1);\n }\n\n if (worktree.isMain) {\n log.error('Cannot remove the main worktree');\n process.exit(1);\n }\n\n // Check for uncommitted changes\n const hasChanges = await manager.hasUncommittedChanges(name);\n if (hasChanges && !options.force) {\n log.warn(`Worktree '${name}' has uncommitted changes.`);\n\n if (!options.yes) {\n const shouldForce = await confirm({\n message: 'Do you want to force removal and lose these changes?',\n default: false,\n });\n\n if (!shouldForce) {\n log.info('Removal cancelled.');\n return;\n }\n options.force = true;\n } else {\n log.error('Use --force to remove worktrees with uncommitted changes.');\n process.exit(1);\n }\n }\n\n // Confirm removal\n if (!options.yes) {\n console.log(`\\n${chalk.bold('Worktree to remove:')}`);\n console.log(` Name: ${chalk.cyan(worktree.name)}`);\n console.log(` Branch: ${chalk.green(worktree.branch)}`);\n console.log(` Path: ${chalk.gray(worktree.path)}`);\n console.log();\n\n const shouldRemove = await confirm({\n message: `Remove worktree '${name}'?`,\n default: true,\n });\n\n if (!shouldRemove) {\n log.info('Removal cancelled.');\n return;\n }\n }\n\n // Kill any associated tmux session\n const tmux = new TmuxManager();\n const sessionName = tmux.getWorktreeSessionName(displayName, name);\n if (await tmux.sessionExists(sessionName)) {\n log.debug(`Killing tmux session: ${sessionName}`);\n await tmux.killSession(sessionName);\n }\n\n const spinner = ora(`Removing worktree '${name}'...`).start();\n\n try {\n await manager.remove(name, options.force);\n spinner.succeed(`Worktree '${name}' removed successfully`);\n } catch (error) {\n spinner.fail(`Failed to remove worktree: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport { select, confirm } from '@inquirer/prompts';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { TmuxManager } from '../../lib/tmux.js';\nimport { resolveProjectFromCwd } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface MergeOptions {\n into?: string;\n squash?: boolean;\n keep?: boolean;\n yes?: boolean;\n}\n\nexport function createMergeCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('merge')\n .description('Merge a worktree branch and optionally remove the worktree')\n .argument('<name>', 'Worktree name')\n .option('-i, --into <branch>', 'Target branch to merge into')\n .option('-s, --squash', 'Use squash merge')\n .option('-k, --keep', 'Keep the worktree after merging')\n .option('-y, --yes', 'Skip confirmation prompts')\n .action(async (name: string, options: MergeOptions) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const worktree = await manager.get(name);\n if (!worktree) {\n log.error(`Worktree '${name}' not found for '${displayName}'`);\n const worktrees = await manager.listManagedWorktrees();\n if (worktrees.length > 0) {\n log.info('Available worktrees:');\n worktrees.forEach((wt) => log.info(` - ${wt.name}`));\n }\n process.exit(1);\n }\n\n if (worktree.isMain) {\n log.error('Cannot merge the main worktree');\n process.exit(1);\n }\n\n // Check for uncommitted changes\n const hasChanges = await manager.hasUncommittedChanges(name);\n if (hasChanges) {\n log.error(`Worktree '${name}' has uncommitted changes.`);\n log.info('Please commit or stash your changes before merging.');\n process.exit(1);\n }\n\n // Select target branch\n let targetBranch = options.into;\n if (!targetBranch) {\n const branches = await manager.getBranches();\n // Filter out the worktree's branch\n const targetBranches = branches.filter((b) => b !== worktree.branch);\n\n if (targetBranches.length === 0) {\n log.error('No other branches available to merge into.');\n process.exit(1);\n }\n\n // Try to find common target branches\n const commonTargets = ['main', 'master', 'develop', 'dev'];\n const defaultTarget =\n commonTargets.find((t) => targetBranches.includes(t)) || targetBranches[0];\n\n targetBranch = await select({\n message: `Merge '${worktree.branch}' into which branch?`,\n choices: targetBranches.map((b) => ({\n name: b,\n value: b,\n })),\n default: defaultTarget,\n });\n }\n\n // Verify target branch exists\n if (!(await manager.branchExists(targetBranch))) {\n log.error(`Target branch '${targetBranch}' does not exist.`);\n process.exit(1);\n }\n\n // Select merge strategy\n let squash = options.squash;\n if (squash === undefined && !options.yes) {\n squash = await confirm({\n message: 'Use squash merge? (combines all commits into one)',\n default: false,\n });\n }\n\n // Confirm the operation\n if (!options.yes) {\n console.log(`\\n${chalk.bold('Merge operation:')}`);\n console.log(` Source: ${chalk.green(worktree.branch)}`);\n console.log(` Target: ${chalk.cyan(targetBranch)}`);\n console.log(` Method: ${squash ? 'Squash merge' : 'Regular merge'}`);\n console.log(` Action: ${options.keep ? 'Keep worktree' : 'Remove worktree after merge'}`);\n console.log();\n\n const shouldProceed = await confirm({\n message: 'Proceed with merge?',\n default: true,\n });\n\n if (!shouldProceed) {\n log.info('Merge cancelled.');\n return;\n }\n }\n\n // Perform the merge\n const mergeSpinner = ora(`Merging '${worktree.branch}' into '${targetBranch}'...`).start();\n\n try {\n await manager.merge(name, {\n targetBranch,\n squash: squash || false,\n });\n mergeSpinner.succeed(`Successfully merged '${worktree.branch}' into '${targetBranch}'`);\n } catch (error) {\n mergeSpinner.fail(`Merge failed: ${(error as Error).message}`);\n log.info('You may need to resolve conflicts manually.');\n process.exit(1);\n }\n\n // Remove worktree if not keeping\n if (!options.keep) {\n // Kill any associated tmux session\n const tmux = new TmuxManager();\n const sessionName = tmux.getWorktreeSessionName(displayName, name);\n if (await tmux.sessionExists(sessionName)) {\n log.debug(`Killing tmux session: ${sessionName}`);\n await tmux.killSession(sessionName);\n }\n\n const removeSpinner = ora(`Removing worktree '${name}'...`).start();\n\n try {\n await manager.remove(name, true);\n removeSpinner.succeed(`Worktree '${name}' removed`);\n } catch (error) {\n removeSpinner.warn(`Failed to remove worktree: ${(error as Error).message}`);\n log.info(`You can remove it manually with: workon worktrees remove ${name}`);\n }\n\n // Optionally delete the branch\n if (!options.yes) {\n const shouldDeleteBranch = await confirm({\n message: `Delete the merged branch '${worktree.branch}'?`,\n default: false,\n });\n\n if (shouldDeleteBranch) {\n const deleteSpinner = ora(`Deleting branch '${worktree.branch}'...`).start();\n try {\n const { simpleGit } = await import('simple-git');\n const git = simpleGit(projectPath);\n await git.deleteLocalBranch(worktree.branch, true);\n deleteSpinner.succeed(`Branch '${worktree.branch}' deleted`);\n } catch (error) {\n deleteSpinner.warn(`Failed to delete branch: ${(error as Error).message}`);\n }\n }\n }\n }\n\n console.log(chalk.green('\\nMerge workflow completed successfully!'));\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport { confirm } from '@inquirer/prompts';\nimport { simpleGit } from 'simple-git';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { resolveProjectFromCwd } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface BranchOptions {\n push?: boolean;\n force?: boolean;\n}\n\nexport function createBranchCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('branch')\n .description('Create a branch from a worktree (useful for detached HEAD state)')\n .argument('<worktree>', 'Worktree name')\n .argument('<branch>', 'New branch name to create')\n .option('-p, --push', 'Push the branch to origin after creating')\n .option('-f, --force', 'Overwrite existing branch')\n .action(async (worktreeName: string, branchName: string, options: BranchOptions) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const worktree = await manager.get(worktreeName);\n if (!worktree) {\n log.error(`Worktree '${worktreeName}' not found for '${displayName}'`);\n const worktrees = await manager.list();\n const nonMain = worktrees.filter((wt) => !wt.isMain);\n if (nonMain.length > 0) {\n log.info('Available worktrees:');\n nonMain.forEach((wt) => log.info(` - ${wt.name} (${wt.branch})`));\n }\n process.exit(1);\n }\n\n const worktreeGit = simpleGit(worktree.path);\n\n // Check if branch already exists\n const branchExists = await manager.branchExists(branchName);\n if (branchExists && !options.force) {\n log.error(`Branch '${branchName}' already exists. Use --force to overwrite.`);\n process.exit(1);\n }\n\n const isDetached = worktree.branch === '(detached)';\n\n console.log(`\\n${chalk.bold('Worktree status:')}`);\n console.log(` Name: ${chalk.cyan(worktree.name)}`);\n console.log(\n ` State: ${isDetached ? chalk.yellow('detached HEAD') : chalk.green(worktree.branch)}`\n );\n console.log(` HEAD: ${chalk.gray(worktree.head.substring(0, 8))}`);\n console.log(`\\n${chalk.bold('Action:')}`);\n console.log(` Create branch: ${chalk.green(branchName)}`);\n if (options.push) {\n console.log(` Push to: ${chalk.cyan('origin/' + branchName)}`);\n }\n console.log();\n\n const spinner = ora(`Creating branch '${branchName}'...`).start();\n\n try {\n // Create the branch at current HEAD\n if (options.force && branchExists) {\n // Delete and recreate\n await worktreeGit.branch(['-D', branchName]);\n }\n await worktreeGit.checkoutLocalBranch(branchName);\n\n spinner.succeed(`Branch '${branchName}' created and checked out`);\n\n // Push if requested\n if (options.push) {\n const pushSpinner = ora(`Pushing to origin/${branchName}...`).start();\n try {\n await worktreeGit.push('origin', branchName, ['--set-upstream']);\n pushSpinner.succeed(`Pushed to origin/${branchName}`);\n\n console.log(\n chalk.green('\\nReady for PR! You can now create a pull request from this branch.')\n );\n } catch (error) {\n pushSpinner.fail(`Failed to push: ${(error as Error).message}`);\n log.info(`You can push manually with: git push -u origin ${branchName}`);\n }\n } else {\n const shouldPush = await confirm({\n message: 'Push branch to origin for PR?',\n default: true,\n });\n\n if (shouldPush) {\n const pushSpinner = ora(`Pushing to origin/${branchName}...`).start();\n try {\n await worktreeGit.push('origin', branchName, ['--set-upstream']);\n pushSpinner.succeed(`Pushed to origin/${branchName}`);\n\n console.log(\n chalk.green('\\nReady for PR! You can now create a pull request from this branch.')\n );\n } catch (error) {\n pushSpinner.fail(`Failed to push: ${(error as Error).message}`);\n log.info(`You can push manually with: git push -u origin ${branchName}`);\n }\n }\n }\n } catch (error) {\n spinner.fail(`Failed to create branch: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { createListCommand } from './list.js';\nimport { createAddCommand } from './add.js';\nimport { createOpenCommand } from './open.js';\nimport { createRemoveCommand } from './remove.js';\nimport { createMergeCommand } from './merge.js';\nimport { createBranchCommand } from './branch.js';\nimport { resolveProjectFromCwd, promptToRegisterProject } from './utils.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\n/**\n * Check if running from within a worktree and block with helpful message\n */\nexport function blockIfInWorktree(\n projectCtx: { worktreeInfo: { isWorktree: boolean; worktreeName: string | null } },\n log: Logger\n): boolean {\n if (projectCtx.worktreeInfo.isWorktree) {\n log.error(\n `You're inside worktree '${projectCtx.worktreeInfo.worktreeName}'. ` +\n `Run this command from the main project directory.`\n );\n log.info(`Tip: Use 'workon worktree' to operate on the current worktree.`);\n return true;\n }\n return false;\n}\n\nexport function createWorktreesCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n const command = new Command('worktrees').description(\n 'Manage git worktrees for the current project (run from the main repository)'\n );\n\n command.addCommand(createListCommand(ctx));\n command.addCommand(createAddCommand(ctx));\n command.addCommand(createOpenCommand(ctx));\n command.addCommand(createRemoveCommand(ctx));\n command.addCommand(createMergeCommand(ctx));\n command.addCommand(createBranchCommand(ctx));\n\n // Default action: show interactive menu\n command.action(async () => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n // If unregistered, prompt to register\n if (!projectCtx.isRegistered) {\n const result = await promptToRegisterProject(projectCtx.projectPath, config, log);\n if (!result) {\n log.info(`Tip: You can run 'workon add .' to register this project later.`);\n process.exit(0);\n }\n projectCtx.projectName = result.projectName;\n projectCtx.projectConfig = result.projectConfig;\n projectCtx.isRegistered = true;\n }\n\n // Show interactive menu\n const { manageWorktreesInteractive } = await import('../interactive.js');\n await manageWorktreesInteractive(projectCtx, ctx);\n });\n\n return command;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport File from 'phylo';\nimport path from 'path';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger, Project } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { TmuxManager } from '../../lib/tmux.js';\nimport { resolveProjectFromCwd, promptToRegisterProject, type ProjectContext } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\nimport { Project as ProjectClass } from '../../lib/project.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface OpenOptions {\n debug?: boolean;\n shell?: boolean;\n attach?: boolean; // Default true, set false to create session without attaching\n}\n\nexport function createOpenCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('open')\n .description('Open a workon session in a worktree')\n .argument('<name>', 'Worktree name')\n .option('-d, --debug', 'Enable debug logging')\n .option('--shell', 'Output shell commands instead of spawning processes')\n .action(async (name: string, options: OpenOptions) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n // For full tmux layout, we need registration (for events config)\n if (!projectCtx.isRegistered) {\n log.warn('Project is not registered. Opening with basic shell layout.');\n const shouldRegister = await promptToRegisterProject(projectCtx.projectPath, config, log);\n if (shouldRegister) {\n projectCtx.projectName = shouldRegister.projectName;\n projectCtx.projectConfig = shouldRegister.projectConfig;\n projectCtx.isRegistered = true;\n }\n }\n\n await runWorktreeOpen(projectCtx, name, options, { config, log });\n });\n}\n\nexport async function runWorktreeOpen(\n projectCtx: ProjectContext,\n worktreeName: string,\n options: OpenOptions,\n ctx: WorktreesContext\n): Promise<void> {\n const { config, log } = ctx;\n const { projectPath, projectName, projectConfig, isRegistered } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const worktree = await manager.get(worktreeName);\n if (!worktree) {\n log.error(`Worktree '${worktreeName}' not found for '${displayName}'`);\n const worktrees = await manager.listManagedWorktrees();\n if (worktrees.length > 0) {\n log.info('Available worktrees:');\n worktrees.forEach((wt) => log.info(` - ${wt.name}`));\n }\n process.exit(1);\n }\n\n const defaults = config.getDefaults();\n const tmux = new TmuxManager();\n const sessionName = tmux.getWorktreeSessionName(displayName, worktreeName);\n\n log.debug(`Opening worktree: ${worktreeName}`);\n log.debug(`Worktree path: ${worktree.path}`);\n log.debug(`Session name: ${sessionName}`);\n\n const isShellMode = options.shell || false;\n\n // Determine layout based on project events (if registered)\n let project: Project | null = null;\n let hasClaudeEvent = false;\n let hasNpmEvent = false;\n\n if (isRegistered && projectName && projectConfig) {\n // Create a project instance with the worktree path\n project = new ProjectClass(projectName, projectConfig, defaults) as unknown as Project;\n // Override the internal _path directly to bypass the setter which would join with base\n // The worktree path is already absolute, so we just need to wrap it in a phylo File object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (project as any)._path = File.from(worktree.path).absolutify();\n\n const events = project.events || {};\n hasClaudeEvent = !!events.claude;\n hasNpmEvent = !!events.npm;\n }\n\n const shouldAttach = options.attach !== false; // Default to true\n\n if (isShellMode) {\n const shellCommands = await buildWorktreeShellCommands(\n project,\n worktree.path,\n sessionName,\n tmux,\n { hasClaudeEvent, hasNpmEvent }\n );\n console.log(shellCommands.join('\\n'));\n } else {\n if (await tmux.isTmuxAvailable()) {\n try {\n await createWorktreeTmuxSession(project, worktree.path, sessionName, tmux, {\n hasClaudeEvent,\n hasNpmEvent,\n });\n\n if (shouldAttach) {\n await tmux.attachToSession(sessionName);\n console.log(\n chalk.green(`Opened worktree '${worktreeName}' in tmux session '${sessionName}'`)\n );\n } else {\n // Session created but not attached - return session info for caller to handle\n console.log(\n chalk.green(`\\nCreated tmux session '${sessionName}' for worktree '${worktreeName}'`)\n );\n console.log(`\\nTo attach to this session, run:`);\n console.log(chalk.cyan(` tmux attach -t '${sessionName}'`));\n }\n } catch (error) {\n log.error(`Failed to create tmux session: ${(error as Error).message}`);\n process.exit(1);\n }\n } else {\n log.error('tmux is not available. Install with: brew install tmux');\n log.info(`Worktree path: ${worktree.path}`);\n process.exit(1);\n }\n }\n}\n\nasync function buildWorktreeShellCommands(\n project: Project | null,\n worktreePath: string,\n sessionName: string,\n tmux: TmuxManager,\n eventFlags: { hasClaudeEvent: boolean; hasNpmEvent: boolean }\n): Promise<string[]> {\n const { hasClaudeEvent, hasNpmEvent } = eventFlags;\n\n // Get claude args if claude is enabled and project exists\n const claudeArgs = hasClaudeEvent && project ? getClaudeArgs(project) : [];\n const npmCommand = hasNpmEvent && project ? await getNpmCommand(project) : '';\n\n // Build tmux commands using a custom session name\n if (hasClaudeEvent && hasNpmEvent && project) {\n return buildThreePaneCommands(sessionName, worktreePath, claudeArgs, npmCommand, tmux);\n } else if (hasClaudeEvent && project) {\n return buildSplitClaudeCommands(sessionName, worktreePath, claudeArgs, tmux);\n } else if (hasNpmEvent && project) {\n return buildTwoPaneNpmCommands(sessionName, worktreePath, npmCommand, tmux);\n } else {\n // Just open a shell in the worktree\n return buildSimpleSessionCommands(sessionName, worktreePath, tmux);\n }\n}\n\nasync function createWorktreeTmuxSession(\n project: Project | null,\n worktreePath: string,\n sessionName: string,\n tmux: TmuxManager,\n eventFlags: { hasClaudeEvent: boolean; hasNpmEvent: boolean }\n): Promise<void> {\n const { hasClaudeEvent, hasNpmEvent } = eventFlags;\n\n // Kill existing session if it exists\n if (await tmux.sessionExists(sessionName)) {\n await tmux.killSession(sessionName);\n }\n\n // Get claude args if claude is enabled and project exists\n const claudeArgs = hasClaudeEvent && project ? getClaudeArgs(project) : [];\n const npmCommand = hasNpmEvent && project ? await getNpmCommand(project) : '';\n\n // Create appropriate session based on events\n if (hasClaudeEvent && hasNpmEvent && project) {\n await createThreePaneSession(sessionName, worktreePath, claudeArgs, npmCommand);\n } else if (hasClaudeEvent && project) {\n await createSplitClaudeSession(sessionName, worktreePath, claudeArgs);\n } else if (hasNpmEvent && project) {\n await createTwoPaneNpmSession(sessionName, worktreePath, npmCommand);\n } else {\n await createSimpleSession(sessionName, worktreePath);\n }\n}\n\nfunction getClaudeArgs(project: Project): string[] {\n const claudeConfig = project.events.claude;\n const userFlags =\n typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\n return ['--dangerously-skip-permissions', ...userFlags];\n}\n\nasync function getNpmCommand(project: Project): Promise<string> {\n const npmConfig = project.events.npm;\n const { NpmEvent } = await import('../../events/extensions/npm.js');\n return NpmEvent.getNpmCommand(npmConfig);\n}\n\n// Shell command builders\nimport { escapeForSingleQuotes } from '../../lib/sanitize.js';\n\nfunction wrapWithShellFallback(command: string): string {\n return `${command}; exec $SHELL`;\n}\n\nfunction buildSimpleSessionCommands(\n sessionName: string,\n path: string,\n _tmux: TmuxManager\n): string[] {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n\n return [\n `# Create tmux session for worktree`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`,\n getAttachCommand(sessionName),\n ];\n}\n\nfunction buildSplitClaudeCommands(\n sessionName: string,\n path: string,\n claudeArgs: string[],\n _tmux: TmuxManager\n): string[] {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n\n return [\n `# Create tmux split session for worktree`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n getAttachCommand(sessionName),\n ];\n}\n\nfunction buildTwoPaneNpmCommands(\n sessionName: string,\n path: string,\n npmCommand: string,\n _tmux: TmuxManager\n): string[] {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n return [\n `# Create tmux two-pane session with npm for worktree`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}' '${wrappedNpmCmd}'`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n getAttachCommand(sessionName),\n ];\n}\n\nfunction buildThreePaneCommands(\n sessionName: string,\n path: string,\n claudeArgs: string[],\n npmCommand: string,\n _tmux: TmuxManager\n): string[] {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n return [\n `# Create tmux three-pane session for worktree`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${wrappedNpmCmd}'`,\n `tmux resize-pane -t '${escapedSession}:0.2' -y 10`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n getAttachCommand(sessionName),\n ];\n}\n\nfunction getAttachCommand(sessionName: string): string {\n const escapedSession = escapeForSingleQuotes(sessionName);\n\n if (process.env.TMUX) {\n return `tmux switch-client -t '${escapedSession}'`;\n }\n\n const isITerm =\n process.env.TERM_PROGRAM === 'iTerm.app' ||\n process.env.LC_TERMINAL === 'iTerm2' ||\n process.env.ITERM_SESSION_ID;\n const useiTermIntegration = isITerm && !process.env.TMUX_CC_NOT_SUPPORTED;\n\n if (useiTermIntegration) {\n return `tmux -CC attach-session -t '${escapedSession}'`;\n }\n return `tmux attach-session -t '${escapedSession}'`;\n}\n\n// Direct session creation functions using exec\nimport { exec as execCallback } from 'child_process';\nimport { promisify } from 'util';\n\nconst exec = promisify(execCallback);\n\nasync function createSimpleSession(sessionName: string, path: string): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n\n await exec(`tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`);\n}\n\nasync function createSplitClaudeSession(\n sessionName: string,\n path: string,\n claudeArgs: string[]\n): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n\n await exec(\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`\n );\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`);\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n}\n\nasync function createTwoPaneNpmSession(\n sessionName: string,\n path: string,\n npmCommand: string\n): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n await exec(`tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`);\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}' '${wrappedNpmCmd}'`);\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n}\n\nasync function createThreePaneSession(\n sessionName: string,\n path: string,\n claudeArgs: string[],\n npmCommand: string\n): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n await exec(\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`\n );\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`);\n await exec(\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${wrappedNpmCmd}'`\n );\n await exec(`tmux resize-pane -t '${escapedSession}:0.2' -y 10`);\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n}\n","import { select, input, checkbox, confirm } from '@inquirer/prompts';\nimport File from 'phylo';\nimport path from 'path';\nimport deepAssign from 'deep-assign';\nimport chalk from 'chalk';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ProjectConfig, EventsConfig } from '../types/index.js';\nimport type { Environment, ProjectEnvironment as ProjectEnv } from '../lib/environment.js';\nimport { ProjectEnvironment } from '../lib/environment.js';\nimport { EventRegistry } from '../events/registry.js';\nimport { IDE_CHOICES } from '../types/constants.js';\nimport { WorktreeManager } from '../lib/worktree.js';\nimport type { ProjectContext } from './worktrees/utils.js';\n\ninterface InteractiveContext {\n config: Config;\n log: Logger;\n environment: Environment;\n suggestedName?: string;\n}\n\nexport async function runInteractive(ctx: InteractiveContext): Promise<void> {\n const { config, log, environment, suggestedName } = ctx;\n\n showLogo(config);\n log.log('');\n\n const defaultName =\n suggestedName ??\n (environment.$isProjectEnvironment\n ? (environment as ProjectEnv).project.name\n : File.cwd().name);\n\n const fromUser = !!suggestedName;\n\n await startInteractive(defaultName, fromUser, ctx);\n}\n\nfunction showLogo(config: Config): void {\n const version = config.get<{ version: string }>('pkg')?.version ?? 'unknown';\n\n console.log(\n ` 8\\x1b[2m${' '.repeat(Math.max(15 - version.length - 1, 1)) + 'v' + version}\\x1b[22m\nYb db dP .d8b. 8d8b 8.dP \\x1b[92m.d8b. 8d8b.\\x1b[0m\n YbdPYbdP 8' .8 8P 88b \\x1b[92m8' .8 8P Y8\\x1b[0m\n YP YP \\`Y8P' 8 8 Yb \\x1b[92m\\`Y8P' 8 8\\x1b[0m`\n );\n}\n\nasync function startInteractive(\n defaultName: string,\n fromUser: boolean,\n ctx: InteractiveContext,\n showMain = false\n): Promise<void> {\n const { log, environment } = ctx;\n\n log.debug(`Name '${defaultName}' was${fromUser ? '' : ' not'} provided by the user`);\n\n const question = getFirstQuestion(defaultName, fromUser, environment, showMain);\n const action = await select(question);\n\n switch (action) {\n case 'exit':\n return;\n\n case 'more':\n await startInteractive(defaultName, fromUser, ctx, true);\n return;\n\n case 'init-project':\n await initProject(defaultName, fromUser, ctx);\n return;\n\n case 'init-branch':\n await initBranch(defaultName, ctx);\n return;\n\n case 'switch-project':\n await switchProject(ctx);\n return;\n\n case 'switch-branch':\n await switchBranch(defaultName, ctx);\n return;\n\n case 'manage-projects':\n await manageProjects(ctx);\n return;\n\n case 'manage-branches':\n await manageBranches(defaultName, ctx);\n return;\n\n case 'manage-worktrees':\n await manageWorktrees(defaultName, ctx);\n return;\n }\n}\n\nfunction getFirstQuestion(\n defaultName: string,\n fromUser: boolean,\n environment: Environment,\n showMain: boolean\n): { message: string; choices: Array<{ name: string; value: string }> } {\n if (!showMain && environment.$isProjectEnvironment && !fromUser) {\n return {\n message: (environment as ProjectEnv).project.name,\n choices: [\n { name: 'Start a branch', value: 'init-branch' },\n { name: 'Switch branch', value: 'switch-branch' },\n { name: 'Manage branches', value: 'manage-branches' },\n { name: 'Manage worktrees', value: 'manage-worktrees' },\n { name: '---', value: '' },\n { name: 'More...', value: 'more' },\n { name: 'Exit', value: 'exit' },\n ].filter((c) => c.value !== ''),\n };\n }\n\n return {\n message: 'What do you want to do?',\n choices: [\n { name: 'Start a new project', value: 'init-project' },\n { name: 'Open an existing project', value: 'switch-project' },\n { name: 'Manage projects', value: 'manage-projects' },\n { name: '---', value: '' },\n { name: 'Exit', value: 'exit' },\n ].filter((c) => c.value !== ''),\n };\n}\n\nasync function initProject(\n defaultName: string,\n fromUser: boolean,\n ctx: InteractiveContext\n): Promise<void> {\n const { config, log } = ctx;\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n // Project name\n let name: string;\n if (fromUser) {\n name = defaultName;\n log.log(`Project name: ${name}`);\n } else {\n name = await input({\n message: 'What is the name of the project?',\n default: defaultName,\n validate: (value) => {\n if (value in projects) return 'Project already exists.';\n if (/\\w+#\\w+/.test(value)) {\n const projectName = value.substring(0, value.indexOf('#'));\n if (!(projectName in projects)) {\n return `Project '${projectName}' does not exist. Please create it before starting a branch.`;\n }\n }\n return true;\n },\n });\n }\n\n // Check if this is a branch config\n const isBranch = /\\w+#\\w+/.test(name);\n let basePath: string;\n\n if (isBranch) {\n const projectName = name.substring(0, name.indexOf('#'));\n basePath = defaults?.base\n ? File.from(defaults.base).join(projects[projectName].path).absolutePath()\n : projects[projectName].path;\n log.log(`Project path: ${basePath}`);\n } else {\n // Project path\n const pathAnswer = await input({\n message: 'What is the path to the project?',\n default: defaults?.base ? File.from(defaults.base).join(name).path : name,\n });\n\n // Convert to relative path\n let answerFile = File.from(pathAnswer);\n const defaultBase = defaults?.base ? File.from(defaults.base) : File.cwd();\n\n if (!answerFile.isAbsolute()) {\n answerFile = defaultBase.join(answerFile.path);\n }\n\n try {\n const canonical = answerFile.canonicalize();\n if (canonical) {\n answerFile = canonical;\n } else {\n answerFile = answerFile.absolutify();\n }\n } catch {\n answerFile = answerFile.absolutify();\n }\n\n basePath = answerFile.relativize(defaultBase.path as unknown as string).path;\n }\n\n // IDE selection\n const ide = await select({\n message: 'What is the IDE?',\n choices: IDE_CHOICES,\n });\n\n // Event selection\n const selectedEvents = await checkbox({\n message: 'Which events should take place when opening?',\n choices: [\n { name: 'Change terminal cwd to project path', value: 'cwd', checked: true },\n { name: 'Open project in IDE', value: 'ide', checked: true },\n ],\n });\n\n const events: EventsConfig = {\n cwd: selectedEvents.includes('cwd'),\n ide: selectedEvents.includes('ide'),\n };\n\n // Save project\n const projectConfig: ProjectConfig = {\n path: basePath,\n ide,\n events,\n };\n\n await config.setProjectSafe(name, projectConfig);\n\n log.info('Your project has been initialized.');\n log.info(`Use 'workon ${name}' to start working!`);\n}\n\nasync function initBranch(defaultName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n // Branch name\n const branch = await input({\n message: 'What is the name of the branch?',\n validate: (value) => {\n if (/\\w+#\\w+/.test(value)) return 'Branch name can\\'t contain the \"#\" sign';\n if (`${defaultName}#${value}` in projects) return 'Branch already exists.';\n return true;\n },\n });\n\n const branchName = `${defaultName}#${branch}`;\n const baseProject = projects[defaultName];\n\n // Create branch config by inheriting from base project (exclude name property)\n const { name: _excludedName, ...mergedConfig } = deepAssign({}, baseProject, {\n branch,\n }) as ProjectConfig;\n const branchConfig: ProjectConfig = mergedConfig;\n\n await config.setProjectSafe(branchName, branchConfig);\n\n log.info('Your branch configuration has been initialized.');\n log.info(`Use 'workon ${branchName}' to start working!`);\n}\n\nasync function switchProject(ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n // Filter to only base projects (not branch configs)\n const baseProjects = Object.keys(projects).filter((name) => !name.includes('#'));\n\n if (baseProjects.length === 0) {\n log.info('No projects configured yet. Use \"Start a new project\" to create one.');\n return;\n }\n\n const projectName = await select({\n message: 'Select a project to open:',\n choices: baseProjects.map((name) => ({\n name: `${name} (${projects[name].path})`,\n value: name,\n })),\n });\n\n await openProject(projectName, ctx);\n}\n\nasync function switchBranch(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n // Find all branch configs for this project\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n if (branches.length === 0) {\n log.info(`No branch configurations found for '${projectName}'.`);\n log.info('Use \"Start a branch\" to create one.');\n return;\n }\n\n const branchConfig = await select({\n message: 'Select a branch configuration:',\n choices: branches.map((name) => ({\n name: name.substring(branchPrefix.length),\n value: name,\n })),\n });\n\n await openProject(branchConfig, ctx);\n}\n\nasync function manageProjects(ctx: InteractiveContext): Promise<void> {\n const { config } = ctx;\n\n const projects = config.getProjects();\n const hasProjects = Object.keys(projects).length > 0;\n\n const choices = [\n { name: 'Create new project', value: 'create' },\n ...(hasProjects\n ? [\n { name: 'Edit project', value: 'edit' },\n { name: 'Delete project', value: 'delete' },\n { name: 'List projects', value: 'list' },\n ]\n : []),\n { name: 'Back', value: 'back' },\n ];\n\n const action = await select({\n message: 'Manage projects:',\n choices,\n });\n\n switch (action) {\n case 'create':\n await createProjectManage(ctx);\n break;\n case 'edit':\n await editProjectManage(ctx);\n break;\n case 'delete':\n await deleteProjectManage(ctx);\n break;\n case 'list':\n listProjectsManage(ctx);\n break;\n case 'back':\n return;\n }\n\n // Return to manage menu\n await manageProjects(ctx);\n}\n\nasync function manageBranches(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config } = ctx;\n const projects = config.getProjects();\n\n // Find all branch configs for this project\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n const choices = [\n { name: 'Create new branch config', value: 'create' },\n ...(branches.length > 0\n ? [\n { name: 'Edit branch config', value: 'edit' },\n { name: 'Delete branch config', value: 'delete' },\n { name: 'List branch configs', value: 'list' },\n ]\n : []),\n { name: 'Back', value: 'back' },\n ];\n\n const action = await select({\n message: `Manage branches for '${projectName}':`,\n choices,\n });\n\n switch (action) {\n case 'create':\n await initBranch(projectName, ctx);\n break;\n case 'edit':\n await editBranchManage(projectName, ctx);\n break;\n case 'delete':\n await deleteBranchManage(projectName, ctx);\n break;\n case 'list':\n listBranchesManage(projectName, ctx);\n break;\n case 'back':\n return;\n }\n\n // Return to manage branches menu\n await manageBranches(projectName, ctx);\n}\n\nasync function openProject(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n if (!(projectName in projects)) {\n log.error(`Project '${projectName}' not found.`);\n return;\n }\n\n const projectConfig = projects[projectName];\n const projectCfg = { ...projectConfig, name: projectName };\n const projectEnv = ProjectEnvironment.load(projectCfg, config.getDefaults());\n\n log.info(`Opening project '${projectName}'...`);\n\n // Execute events for the project\n const events = Object.keys(projectConfig.events).filter(\n (e) => projectConfig.events[e as keyof EventsConfig]\n );\n\n for (const event of events) {\n const eventHandler = EventRegistry.getEventByName(event);\n if (eventHandler) {\n await eventHandler.processing.processEvent({\n project: projectEnv.project,\n isShellMode: false,\n shellCommands: [],\n });\n }\n }\n}\n\n// Manage helper functions\nasync function createProjectManage(ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n const name = await input({\n message: 'Project name:',\n validate: (value) => {\n if (!value.trim()) return 'Name is required';\n if (!/^[\\w-]+$/.test(value))\n return 'Name can only contain letters, numbers, underscores, and hyphens';\n if (value in projects) return 'Project already exists';\n return true;\n },\n });\n\n const defaultPath = defaults?.base ? File.from(defaults.base).join(name).path : name;\n const pathInput = await input({\n message: 'Project path:',\n default: defaultPath,\n });\n\n let relativePath = pathInput;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base);\n const pathFile = File.from(pathInput);\n try {\n if (pathFile.isAbsolute()) {\n relativePath = pathFile.relativize(baseDir.path).path;\n }\n } catch {\n relativePath = pathInput;\n }\n }\n\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n });\n\n const availableEvents = EventRegistry.getEventsForManageUI();\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: e.value === 'cwd' || e.value === 'ide',\n })),\n });\n\n const events: EventsConfig = {};\n for (const eventName of selectedEvents) {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n\n const projectConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n const confirmed = await confirm({\n message: 'Save this project?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(name, projectConfig);\n log.info(`Project '${name}' created successfully!`);\n }\n}\n\nasync function editProjectManage(ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n // Filter to base projects only\n const baseProjects = Object.keys(projects).filter((name) => !name.includes('#'));\n\n if (baseProjects.length === 0) {\n log.info('No projects to edit.');\n return;\n }\n\n const name = await select({\n message: 'Select project to edit:',\n choices: baseProjects.map((n) => ({ name: n, value: n })),\n });\n\n const project = projects[name];\n\n const pathInput = await input({\n message: 'Project path:',\n default: project.path,\n });\n\n let relativePath = pathInput;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base);\n const pathFile = File.from(pathInput);\n try {\n if (pathFile.isAbsolute()) {\n relativePath = pathFile.relativize(baseDir.path).path;\n }\n } catch {\n relativePath = pathInput;\n }\n }\n\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n default: project.ide || 'vscode',\n });\n\n const keepEvents = await confirm({\n message: 'Keep existing event configuration?',\n default: true,\n });\n\n let events = project.events;\n if (!keepEvents) {\n const availableEvents = EventRegistry.getEventsForManageUI();\n const currentEvents = Object.keys(project.events);\n\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: currentEvents.includes(e.value),\n })),\n });\n\n events = {};\n for (const eventName of selectedEvents) {\n if (project.events[eventName as keyof EventsConfig]) {\n (events as Record<string, unknown>)[eventName] =\n project.events[eventName as keyof EventsConfig];\n } else {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n }\n }\n\n const updatedConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n const confirmed = await confirm({\n message: 'Save changes?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(name, updatedConfig);\n log.info(`Project '${name}' updated successfully!`);\n }\n}\n\nasync function deleteProjectManage(ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n // Filter to base projects only\n const baseProjects = Object.keys(projects).filter((name) => !name.includes('#'));\n\n if (baseProjects.length === 0) {\n log.info('No projects to delete.');\n return;\n }\n\n const name = await select({\n message: 'Select project to delete:',\n choices: baseProjects.map((n) => ({ name: n, value: n })),\n });\n\n // Check for branch configs\n const branchPrefix = `${name}#`;\n const branches = Object.keys(projects).filter((n) => n.startsWith(branchPrefix));\n\n if (branches.length > 0) {\n log.warn(`This project has ${branches.length} branch configuration(s).`);\n const deleteAll = await confirm({\n message: 'Delete all branch configurations as well?',\n default: false,\n });\n\n if (deleteAll) {\n for (const branch of branches) {\n await config.deleteProjectSafe(branch);\n }\n }\n }\n\n const confirmed = await confirm({\n message: `Are you sure you want to delete '${name}'?`,\n default: false,\n });\n\n if (confirmed) {\n await config.deleteProjectSafe(name);\n log.info(`Project '${name}' deleted.`);\n }\n}\n\nfunction listProjectsManage(ctx: InteractiveContext): void {\n const { config } = ctx;\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n console.log('\\nConfigured projects:\\n');\n\n // Filter to base projects only\n const baseProjects = Object.keys(projects).filter((name) => !name.includes('#'));\n\n for (const name of baseProjects) {\n const project = projects[name];\n const fullPath = defaults?.base\n ? File.from(defaults.base).join(project.path).path\n : project.path;\n\n console.log(` ${name}`);\n console.log(` Path: ${fullPath}`);\n console.log(` IDE: ${project.ide || 'not set'}`);\n console.log(` Events: ${Object.keys(project.events).join(', ') || 'none'}`);\n\n // Show branch count\n const branchPrefix = `${name}#`;\n const branches = Object.keys(projects).filter((n) => n.startsWith(branchPrefix));\n if (branches.length > 0) {\n console.log(` Branches: ${branches.length}`);\n }\n console.log();\n }\n}\n\nasync function editBranchManage(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n if (branches.length === 0) {\n log.info('No branch configurations to edit.');\n return;\n }\n\n const branchName = await select({\n message: 'Select branch configuration to edit:',\n choices: branches.map((n) => ({\n name: n.substring(branchPrefix.length),\n value: n,\n })),\n });\n\n const branch = projects[branchName];\n\n const keepEvents = await confirm({\n message: 'Keep existing event configuration?',\n default: true,\n });\n\n let events = branch.events;\n if (!keepEvents) {\n const availableEvents = EventRegistry.getEventsForManageUI();\n const currentEvents = Object.keys(branch.events);\n\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: currentEvents.includes(e.value),\n })),\n });\n\n events = {};\n for (const eventName of selectedEvents) {\n if (branch.events[eventName as keyof EventsConfig]) {\n (events as Record<string, unknown>)[eventName] =\n branch.events[eventName as keyof EventsConfig];\n } else {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n }\n }\n\n const updatedConfig: ProjectConfig = {\n ...branch,\n events,\n };\n\n const confirmed = await confirm({\n message: 'Save changes?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(branchName, updatedConfig);\n log.info(`Branch configuration '${branchName}' updated successfully!`);\n }\n}\n\nasync function deleteBranchManage(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n if (branches.length === 0) {\n log.info('No branch configurations to delete.');\n return;\n }\n\n const branchName = await select({\n message: 'Select branch configuration to delete:',\n choices: branches.map((n) => ({\n name: n.substring(branchPrefix.length),\n value: n,\n })),\n });\n\n const confirmed = await confirm({\n message: `Are you sure you want to delete '${branchName}'?`,\n default: false,\n });\n\n if (confirmed) {\n await config.deleteProjectSafe(branchName);\n log.info(`Branch configuration '${branchName}' deleted.`);\n }\n}\n\nfunction listBranchesManage(projectName: string, ctx: InteractiveContext): void {\n const { config } = ctx;\n const projects = config.getProjects();\n\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n console.log(`\\nBranch configurations for '${projectName}':\\n`);\n\n for (const branchName of branches) {\n const branch = projects[branchName];\n const shortName = branchName.substring(branchPrefix.length);\n\n console.log(` ${shortName}`);\n console.log(` Events: ${Object.keys(branch.events).join(', ') || 'none'}`);\n console.log();\n }\n}\n\n// Worktree management functions\nasync function manageWorktrees(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n if (!(projectName in projects)) {\n log.error(`Project '${projectName}' not found.`);\n return;\n }\n\n const projectConfig = projects[projectName];\n const basePath = defaults?.base || '';\n\n // Resolve project path\n let projectPath: string;\n const configPath = File.from(projectConfig.path);\n if (configPath.path.startsWith('/') || configPath.path.startsWith('~')) {\n projectPath = configPath.absolutify().path;\n } else if (basePath) {\n projectPath = File.from(basePath).absolutify().join(projectConfig.path).path;\n } else {\n projectPath = configPath.absolutify().path;\n }\n\n const manager = new WorktreeManager(projectPath, projectName);\n\n if (!(await manager.isGitRepository())) {\n log.error(`'${projectName}' is not a git repository`);\n return;\n }\n\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain);\n const hasWorktrees = nonMainWorktrees.length > 0;\n\n const choices = [\n { name: 'List worktrees', value: 'list' },\n { name: 'Create worktree', value: 'add' },\n ...(hasWorktrees\n ? [\n { name: 'Open worktree', value: 'open' },\n { name: 'Remove worktree', value: 'remove' },\n { name: 'Merge worktree', value: 'merge' },\n { name: 'Create branch from worktree', value: 'branch' },\n ]\n : []),\n { name: 'Back', value: 'back' },\n ];\n\n const action = await select({\n message: `Manage worktrees for '${projectName}':`,\n choices,\n });\n\n switch (action) {\n case 'list':\n await listWorktreesManage(projectName, manager);\n break;\n case 'add':\n await addWorktreeManage(projectName, manager, log);\n break;\n case 'open':\n await openWorktreeManage(projectName, manager, config, log);\n break;\n case 'remove':\n await removeWorktreeManage(projectName, manager, log);\n break;\n case 'merge':\n await mergeWorktreeManage(projectName, manager, log);\n break;\n case 'branch':\n await branchWorktreeManage(projectName, manager, log);\n break;\n case 'back':\n return;\n }\n\n // Return to manage worktrees menu\n await manageWorktrees(projectName, ctx);\n}\n\nasync function listWorktreesManage(projectName: string, manager: WorktreeManager): Promise<void> {\n const worktrees = await manager.list();\n const managedWorktrees = await manager.listManagedWorktrees();\n const managedPaths = new Set(managedWorktrees.map((wt) => wt.path));\n\n console.log(chalk.bold(`\\nWorktrees for ${projectName}:`));\n console.log('-'.repeat(60));\n\n for (const wt of worktrees) {\n const isManaged = managedPaths.has(wt.path);\n const mainLabel = wt.isMain ? chalk.gray(' (main)') : '';\n const externalLabel = !wt.isMain && !isManaged ? chalk.yellow(' (external)') : '';\n const branchDisplay =\n wt.branch === '(detached)' ? chalk.yellow(wt.branch) : chalk.green(wt.branch);\n\n console.log(` ${chalk.cyan(wt.name)}${mainLabel}${externalLabel}`);\n console.log(` Branch: ${branchDisplay}`);\n console.log(` Path: ${chalk.gray(wt.path)}`);\n console.log();\n }\n}\n\nasync function addWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n log: Logger\n): Promise<void> {\n const branchName = await input({\n message: 'Branch name for the new worktree:',\n validate: (value) => {\n if (!value.trim()) return 'Branch name is required';\n return true;\n },\n });\n\n const branchExists = await manager.branchExists(branchName);\n let baseBranch: string | undefined;\n\n if (!branchExists) {\n const branches = await manager.getBranches();\n const currentBranch = await manager.getCurrentBranch();\n\n baseBranch = await select({\n message: `Branch '${branchName}' doesn't exist. Create from which branch?`,\n choices: branches.map((b) => ({\n name: b === currentBranch ? `${b} (current)` : b,\n value: b,\n })),\n default: currentBranch,\n });\n }\n\n try {\n const worktree = await manager.add({ branch: branchName, baseBranch });\n log.info(`Worktree created at ${worktree.path}`);\n\n // Run post-setup hook if exists\n if (manager.hasSetupHook()) {\n const runHook = await confirm({\n message: 'Run post-setup hook?',\n default: true,\n });\n\n if (runHook) {\n try {\n await manager.runPostSetupHook(worktree.path);\n log.info('Post-setup hook completed');\n } catch (error) {\n log.warn(`Post-setup hook failed: ${(error as Error).message}`);\n }\n }\n }\n } catch (error) {\n log.error(`Failed to create worktree: ${(error as Error).message}`);\n }\n}\n\nasync function openWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n config: Config,\n log: Logger\n): Promise<void> {\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain);\n\n if (nonMainWorktrees.length === 0) {\n log.info('No worktrees to open.');\n return;\n }\n\n const worktreeName = await select({\n message: 'Select worktree to open:',\n choices: nonMainWorktrees.map((wt) => ({\n name: `${wt.name} (${wt.branch})`,\n value: wt.name,\n })),\n });\n\n // Build ProjectContext for runWorktreeOpen\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n const projectConfig = projects[projectName];\n const basePath = defaults?.base || '';\n\n let projectPath: string;\n const configPath = File.from(projectConfig.path);\n if (configPath.path.startsWith('/') || configPath.path.startsWith('~')) {\n projectPath = configPath.absolutify().path;\n } else if (basePath) {\n projectPath = File.from(basePath).absolutify().join(projectConfig.path).path;\n } else {\n projectPath = configPath.absolutify().path;\n }\n\n const projectCtx: ProjectContext = {\n projectPath,\n projectName,\n projectConfig,\n isRegistered: true,\n worktreeInfo: {\n isWorktree: false,\n worktreePath: null,\n mainRepoPath: projectPath,\n worktreeName: null,\n branch: null,\n },\n };\n\n // Import and call the open worktree command logic\n // Use attach: false since we're in interactive mode and can't properly hand off the terminal\n const { runWorktreeOpen } = await import('./worktrees/open.js');\n await runWorktreeOpen(projectCtx, worktreeName, { attach: false }, { config, log });\n}\n\nasync function removeWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n log: Logger\n): Promise<void> {\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain);\n\n if (nonMainWorktrees.length === 0) {\n log.info('No worktrees to remove.');\n return;\n }\n\n const worktreeName = await select({\n message: 'Select worktree to remove:',\n choices: nonMainWorktrees.map((wt) => ({\n name: `${wt.name} (${wt.branch})`,\n value: wt.name,\n })),\n });\n\n const hasChanges = await manager.hasUncommittedChanges(worktreeName);\n if (hasChanges) {\n log.warn(`Worktree '${worktreeName}' has uncommitted changes.`);\n const force = await confirm({\n message: 'Force removal and lose changes?',\n default: false,\n });\n\n if (!force) {\n log.info('Removal cancelled.');\n return;\n }\n }\n\n const confirmed = await confirm({\n message: `Remove worktree '${worktreeName}'?`,\n default: true,\n });\n\n if (confirmed) {\n try {\n await manager.remove(worktreeName, true);\n log.info(`Worktree '${worktreeName}' removed.`);\n } catch (error) {\n log.error(`Failed to remove worktree: ${(error as Error).message}`);\n }\n }\n}\n\nasync function mergeWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n log: Logger\n): Promise<void> {\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain && wt.branch !== '(detached)');\n\n if (nonMainWorktrees.length === 0) {\n log.info('No worktrees to merge (detached worktrees must be branched first).');\n return;\n }\n\n const worktreeName = await select({\n message: 'Select worktree to merge:',\n choices: nonMainWorktrees.map((wt) => ({\n name: `${wt.name} (${wt.branch})`,\n value: wt.name,\n })),\n });\n\n const worktree = await manager.get(worktreeName);\n if (!worktree) return;\n\n const hasChanges = await manager.hasUncommittedChanges(worktreeName);\n if (hasChanges) {\n log.error(`Worktree '${worktreeName}' has uncommitted changes. Commit or stash them first.`);\n return;\n }\n\n const branches = await manager.getBranches();\n const targetBranches = branches.filter((b) => b !== worktree.branch);\n\n const commonTargets = ['main', 'master', 'develop', 'dev'];\n const defaultTarget = commonTargets.find((t) => targetBranches.includes(t)) || targetBranches[0];\n\n const targetBranch = await select({\n message: `Merge '${worktree.branch}' into which branch?`,\n choices: targetBranches.map((b) => ({ name: b, value: b })),\n default: defaultTarget,\n });\n\n const squash = await confirm({\n message: 'Use squash merge?',\n default: false,\n });\n\n const removeAfter = await confirm({\n message: 'Remove worktree after merge?',\n default: true,\n });\n\n try {\n await manager.merge(worktreeName, { targetBranch, squash });\n log.info(`Merged '${worktree.branch}' into '${targetBranch}'`);\n\n if (removeAfter) {\n await manager.remove(worktreeName, true);\n log.info(`Worktree '${worktreeName}' removed.`);\n }\n } catch (error) {\n log.error(`Merge failed: ${(error as Error).message}`);\n }\n}\n\nasync function branchWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n log: Logger\n): Promise<void> {\n const worktrees = await manager.list();\n const detachedWorktrees = worktrees.filter((wt) => !wt.isMain);\n\n if (detachedWorktrees.length === 0) {\n log.info('No worktrees available.');\n return;\n }\n\n const worktreeName = await select({\n message: 'Select worktree to create branch from:',\n choices: detachedWorktrees.map((wt) => ({\n name: `${wt.name} (${wt.branch})`,\n value: wt.name,\n })),\n });\n\n const worktree = await manager.get(worktreeName);\n if (!worktree) return;\n\n const branchName = await input({\n message: 'New branch name:',\n validate: async (value) => {\n if (!value.trim()) return 'Branch name is required';\n if (await manager.branchExists(value)) return 'Branch already exists';\n return true;\n },\n });\n\n const { simpleGit } = await import('simple-git');\n const worktreeGit = simpleGit(worktree.path);\n\n try {\n await worktreeGit.checkoutLocalBranch(branchName);\n log.info(`Branch '${branchName}' created and checked out`);\n\n const push = await confirm({\n message: 'Push to origin for PR?',\n default: true,\n });\n\n if (push) {\n await worktreeGit.push('origin', branchName, ['--set-upstream']);\n log.info(`Pushed to origin/${branchName}`);\n }\n } catch (error) {\n log.error(`Failed to create branch: ${(error as Error).message}`);\n }\n}\n\n/**\n * Interactive worktree management using ProjectContext from CWD detection.\n * This is the entry point for `workon worktrees` when no subcommand is provided.\n */\nexport async function manageWorktreesInteractive(\n projectCtx: ProjectContext,\n ctx: { config: Config; log: Logger }\n): Promise<void> {\n const { config, log } = ctx;\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n if (!(await manager.isGitRepository())) {\n log.error(`'${displayName}' is not a git repository`);\n return;\n }\n\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain);\n const hasWorktrees = nonMainWorktrees.length > 0;\n\n const choices = [\n { name: 'List worktrees', value: 'list' },\n { name: 'Create worktree', value: 'add' },\n ...(hasWorktrees\n ? [\n { name: 'Open worktree', value: 'open' },\n { name: 'Remove worktree', value: 'remove' },\n { name: 'Merge worktree', value: 'merge' },\n { name: 'Create branch from worktree', value: 'branch' },\n ]\n : []),\n { name: 'Exit', value: 'exit' },\n ];\n\n const action = await select({\n message: `Manage worktrees for '${displayName}':`,\n choices,\n });\n\n switch (action) {\n case 'list':\n await listWorktreesManage(displayName, manager);\n break;\n case 'add':\n await addWorktreeManage(displayName, manager, log);\n break;\n case 'open':\n if (projectName) {\n await openWorktreeManage(projectName, manager, config, log);\n } else {\n log.warn('Cannot open worktree session: project is not registered.');\n log.info(`Register this project first with 'workon add .'`);\n }\n break;\n case 'remove':\n await removeWorktreeManage(displayName, manager, log);\n break;\n case 'merge':\n await mergeWorktreeManage(displayName, manager, log);\n break;\n case 'branch':\n await branchWorktreeManage(displayName, manager, log);\n break;\n case 'exit':\n return;\n }\n\n // Return to manage worktrees menu\n await manageWorktreesInteractive(projectCtx, ctx);\n}\n","import { Command } from 'commander';\nimport File from 'phylo';\nimport type { Config } from '../lib/config.js';\nimport type {\n Logger,\n ClaudeConfig,\n NpmConfig,\n Project,\n EventProcessingContext,\n} from '../types/index.js';\nimport { EnvironmentRecognizer, ProjectEnvironment } from '../lib/environment.js';\nimport { TmuxManager } from '../lib/tmux.js';\nimport { EventRegistry } from '../events/registry.js';\n\ninterface OpenContext {\n config: Config;\n log: Logger;\n}\n\ninterface OpenOptions {\n debug?: boolean;\n dryRun?: boolean;\n shell?: boolean;\n}\n\n/**\n * Run the open command logic directly (used when delegating from main CLI)\n */\nexport async function runOpen(\n projectArg: string,\n options: OpenOptions,\n ctx: OpenContext\n): Promise<void> {\n const { log } = ctx;\n\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n await processProject(projectArg, options, ctx);\n}\n\nexport function createOpenCommand(ctx: OpenContext): Command {\n const { config, log } = ctx;\n\n const command = new Command('open')\n .description('Open a project by passing its project id')\n .argument('[project]', 'The id of the project to open (supports project:command syntax)')\n .option('-d, --debug', 'Enable debug logging')\n .option('-n, --dry-run', 'Show what would happen without executing')\n .option('--shell', 'Output shell commands instead of spawning processes')\n .action(async (projectArg: string | undefined, options: OpenOptions) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n if (projectArg) {\n await processProject(projectArg, options, ctx);\n } else {\n log.debug('No project name provided, starting interactive mode');\n const { runInteractive } = await import('./interactive.js');\n const environment = await EnvironmentRecognizer.recognize(File.cwd());\n await runInteractive({ config, log, environment });\n }\n });\n\n return command;\n}\n\nasync function processProject(\n projectParam: string,\n options: OpenOptions,\n ctx: OpenContext\n): Promise<void> {\n const { config, log } = ctx;\n\n // Parse colon syntax: project:command1,command2\n const [projectName, commandsString] = projectParam.split(':');\n const requestedCommands = commandsString\n ? commandsString.split(',').map((cmd) => cmd.trim())\n : null;\n\n // Special case: project:help shows available commands\n if (commandsString === 'help') {\n await showProjectHelp(projectName, ctx);\n return;\n }\n\n log.debug(\n `Project: ${projectName}, Commands: ${requestedCommands ? requestedCommands.join(', ') : 'all'}`\n );\n\n const projects = config.getProjects();\n const environment = await EnvironmentRecognizer.recognize(File.cwd());\n\n // Handle \"this\" or \".\" for current project\n if (environment.$isProjectEnvironment && (projectName === 'this' || projectName === '.')) {\n log.info(`Opening current project: ${environment.project.name}`);\n await switchTo(environment, requestedCommands, options, ctx);\n return;\n }\n\n if (projectName in projects) {\n const cfg = projects[projectName];\n const projectCfg = { ...cfg, name: projectName };\n\n // Validate requested commands if specified\n if (requestedCommands) {\n validateRequestedCommands(requestedCommands, projectCfg, projectName);\n }\n\n const projectEnv = ProjectEnvironment.load(projectCfg, config.getDefaults());\n await switchTo(projectEnv, requestedCommands, options, ctx);\n } else {\n log.error(`Project '${projectName}' not found.`);\n log.info(`Run 'workon' without arguments to see available projects or create a new one.`);\n process.exit(1);\n }\n}\n\nfunction validateRequestedCommands(\n requestedCommands: string[],\n projectConfig: { events?: Record<string, unknown> },\n projectName: string\n): void {\n const configuredEvents = Object.keys(projectConfig.events || {});\n const invalidCommands = requestedCommands.filter((cmd) => !configuredEvents.includes(cmd));\n\n if (invalidCommands.length > 0) {\n const availableCommands = configuredEvents.join(', ');\n throw new Error(\n `Commands not configured for project '${projectName}': ${invalidCommands.join(', ')}\\n` +\n `Available commands: ${availableCommands}`\n );\n }\n}\n\nasync function switchTo(\n environment: ProjectEnvironment,\n requestedCommands: string[] | null,\n options: OpenOptions,\n ctx: OpenContext\n): Promise<void> {\n const { log } = ctx;\n const project = environment.project;\n\n // Determine which events to execute\n let events: string[];\n if (requestedCommands) {\n events = resolveCommandDependencies(requestedCommands, project);\n log.debug(`Executing requested commands: ${events.join(', ')}`);\n } else {\n events = Object.keys(project.events).filter(\n (e) => project.events[e as keyof typeof project.events]\n );\n log.debug(`Executing all configured commands: ${events.join(', ')}`);\n }\n\n log.debug(`Shell is ${process.env.SHELL}`);\n log.debug(`Project path is ${project.path.path}`);\n log.debug(`IDE command is: ${project.ide}`);\n log.debug(`Final events to execute: ${events.join(', ')}`);\n\n const shellCommands: string[] = [];\n const isShellMode = options.shell || false;\n\n // Intelligent layout detection\n const hasCwd = events.includes('cwd');\n const hasClaudeEvent = events.includes('claude');\n const hasNpmEvent = events.includes('npm');\n\n const dryRun = options.dryRun || false;\n\n if (hasCwd && hasClaudeEvent && hasNpmEvent) {\n await handleThreePaneLayout(project, isShellMode, dryRun, shellCommands, events, ctx);\n } else if (hasCwd && hasNpmEvent) {\n await handleTwoPaneNpmLayout(project, isShellMode, dryRun, shellCommands, events, ctx);\n } else if (hasCwd && hasClaudeEvent) {\n await handleSplitTerminal(project, isShellMode, dryRun, shellCommands, events, ctx);\n } else {\n // Normal event processing\n for (const event of events) {\n if (!dryRun) {\n await processEvent(event, { project, isShellMode, shellCommands }, ctx);\n }\n }\n }\n\n // In dry-run mode, show what would be executed\n if (dryRun) {\n log.info('Dry run - would execute events:', events.join(', '));\n }\n\n // Output collected shell commands\n if (isShellMode && shellCommands.length > 0) {\n console.log(shellCommands.join('\\n'));\n }\n}\n\nfunction resolveCommandDependencies(\n requestedCommands: string[],\n project: { events: Record<string, unknown> }\n): string[] {\n const resolved = [...requestedCommands];\n\n // Auto-add cwd dependency for commands that need it\n const needsCwd = ['claude', 'npm', 'ide'];\n const needsCwdCommands = requestedCommands.filter((cmd) => needsCwd.includes(cmd));\n\n if (needsCwdCommands.length > 0 && !requestedCommands.includes('cwd') && project.events.cwd) {\n resolved.unshift('cwd');\n }\n\n return [...new Set(resolved)];\n}\n\n// Layout types for tmux session configurations\ntype LayoutType = 'split-claude' | 'three-pane' | 'two-pane-npm';\n\ninterface LayoutConfig {\n type: LayoutType;\n handledEvents: string[];\n dryRunMessage: string;\n claudeArgs: string[];\n npmCommand: string | null;\n}\n\nfunction getClaudeArgs(project: Project): string[] {\n const claudeConfig = project.events.claude as ClaudeConfig | boolean;\n const userFlags =\n typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\n // Always include --dangerously-skip-permissions for automated tmux sessions\n return ['--dangerously-skip-permissions', ...userFlags];\n}\n\nasync function getNpmCommand(project: Project): Promise<string> {\n const npmConfig = project.events.npm as NpmConfig | string | boolean;\n const { NpmEvent } = await import('../events/extensions/npm.js');\n return NpmEvent.getNpmCommand(npmConfig);\n}\n\nasync function handleTmuxLayout(\n project: Project,\n layout: LayoutConfig,\n options: { isShellMode: boolean; dryRun: boolean },\n shellCommands: string[],\n events: string[],\n ctx: OpenContext\n): Promise<void> {\n const { log } = ctx;\n const tmux = new TmuxManager();\n const { isShellMode, dryRun } = options;\n\n let tmuxHandled = false;\n\n if (isShellMode) {\n if (await tmux.isTmuxAvailable()) {\n // Process remaining events (like IDE) FIRST, before any tmux commands\n // This prevents backgrounded commands from interfering with tmux -CC control mode\n const remainingEvents = events.filter((e) => !layout.handledEvents.includes(e));\n for (const event of remainingEvents) {\n const eventHandler = EventRegistry.getEventByName(event);\n if (eventHandler) {\n const cmds = eventHandler.processing.generateShellCommand({\n project,\n isShellMode: true,\n shellCommands: [],\n });\n shellCommands.push(...cmds);\n }\n }\n\n // Now add all tmux commands (create session, split panes, attach)\n const commands = buildLayoutShellCommands(tmux, project, layout);\n shellCommands.push(...commands);\n tmuxHandled = true;\n } else {\n log.debug('Tmux not available, falling back to normal mode');\n // Process remaining non-blocking events (like IDE) BEFORE npm in fallback mode\n // This ensures IDE opens before npm blocks\n const remainingEvents = events.filter((e) => !layout.handledEvents.includes(e));\n buildFallbackCommandsWithEvents(shellCommands, project, layout, remainingEvents, ctx);\n tmuxHandled = true;\n }\n } else if (!dryRun) {\n if (await tmux.isTmuxAvailable()) {\n try {\n const sessionName = await createTmuxSession(tmux, project, layout);\n await tmux.attachToSession(sessionName);\n tmuxHandled = true;\n } catch (error) {\n log.debug(`Failed to create tmux session: ${(error as Error).message}`);\n }\n } else {\n log.debug('Tmux not available, falling back to normal event processing');\n }\n } else {\n log.info(layout.dryRunMessage);\n tmuxHandled = true;\n }\n\n // If tmux didn't handle layout events, process them normally\n if (!tmuxHandled && !dryRun) {\n for (const event of events.filter((e) => layout.handledEvents.includes(e))) {\n await processEvent(event, { project, isShellMode, shellCommands }, ctx);\n }\n }\n\n // Process other events not handled by the layout\n // Skip in shell mode (events already handled inline above)\n if (!dryRun && !isShellMode) {\n for (const event of events.filter((e) => !layout.handledEvents.includes(e))) {\n await processEvent(event, { project, isShellMode, shellCommands }, ctx);\n }\n }\n}\n\nfunction buildLayoutShellCommands(\n tmux: TmuxManager,\n project: Project,\n layout: LayoutConfig\n): string[] {\n switch (layout.type) {\n case 'split-claude':\n return tmux.buildShellCommands(project.name, project.path.path, layout.claudeArgs);\n case 'three-pane':\n return tmux.buildThreePaneShellCommands(\n project.name,\n project.path.path,\n layout.claudeArgs,\n layout.npmCommand!\n );\n case 'two-pane-npm':\n return tmux.buildTwoPaneNpmShellCommands(project.name, project.path.path, layout.npmCommand!);\n }\n}\n\nfunction buildFallbackCommandsWithEvents(\n shellCommands: string[],\n project: Project,\n layout: LayoutConfig,\n remainingEvents: string[],\n _ctx: OpenContext\n): void {\n // Warn user that tmux is not available\n shellCommands.push(`echo \"⚠ tmux not available - install with: brew install tmux\" >&2`);\n\n // Use pushd so user can popd to go back\n shellCommands.push(`pushd \"${project.path.path}\" > /dev/null`);\n\n // Add non-blocking remaining events (like IDE)\n for (const event of remainingEvents) {\n const eventHandler = EventRegistry.getEventByName(event);\n if (eventHandler) {\n const cmds = eventHandler.processing.generateShellCommand({\n project,\n isShellMode: true,\n shellCommands: [],\n });\n shellCommands.push(...cmds);\n }\n }\n\n // Skip blocking commands (npm, claude) - they require tmux for proper UX\n}\n\nasync function createTmuxSession(\n tmux: TmuxManager,\n project: Project,\n layout: LayoutConfig\n): Promise<string> {\n switch (layout.type) {\n case 'split-claude':\n return tmux.createSplitSession(project.name, project.path.path, layout.claudeArgs);\n case 'three-pane':\n return tmux.createThreePaneSession(\n project.name,\n project.path.path,\n layout.claudeArgs,\n layout.npmCommand!\n );\n case 'two-pane-npm':\n return tmux.createTwoPaneNpmSession(project.name, project.path.path, layout.npmCommand!);\n }\n}\n\nasync function handleSplitTerminal(\n project: Project,\n isShellMode: boolean,\n dryRun: boolean,\n shellCommands: string[],\n events: string[],\n ctx: OpenContext\n): Promise<void> {\n const layout: LayoutConfig = {\n type: 'split-claude',\n handledEvents: ['cwd', 'claude'],\n dryRunMessage: `Would create split tmux session '${project.name}' with Claude`,\n claudeArgs: getClaudeArgs(project),\n npmCommand: null,\n };\n await handleTmuxLayout(project, layout, { isShellMode, dryRun }, shellCommands, events, ctx);\n}\n\nasync function handleThreePaneLayout(\n project: Project,\n isShellMode: boolean,\n dryRun: boolean,\n shellCommands: string[],\n events: string[],\n ctx: OpenContext\n): Promise<void> {\n const layout: LayoutConfig = {\n type: 'three-pane',\n handledEvents: ['cwd', 'claude', 'npm'],\n dryRunMessage: `Would create three-pane tmux session '${project.name}' with Claude and NPM`,\n claudeArgs: getClaudeArgs(project),\n npmCommand: await getNpmCommand(project),\n };\n await handleTmuxLayout(project, layout, { isShellMode, dryRun }, shellCommands, events, ctx);\n}\n\nasync function handleTwoPaneNpmLayout(\n project: Project,\n isShellMode: boolean,\n dryRun: boolean,\n shellCommands: string[],\n events: string[],\n ctx: OpenContext\n): Promise<void> {\n const layout: LayoutConfig = {\n type: 'two-pane-npm',\n handledEvents: ['cwd', 'npm'],\n dryRunMessage: `Would create two-pane tmux session '${project.name}' with NPM`,\n claudeArgs: [],\n npmCommand: await getNpmCommand(project),\n };\n await handleTmuxLayout(project, layout, { isShellMode, dryRun }, shellCommands, events, ctx);\n}\n\nasync function processEvent(\n event: string,\n context: EventProcessingContext,\n ctx: OpenContext\n): Promise<void> {\n const { log } = ctx;\n\n log.debug(`Processing event ${event}`);\n\n const eventHandler = EventRegistry.getEventByName(event);\n if (!eventHandler) {\n log.debug(`No event handler found for: ${event}`);\n return;\n }\n\n try {\n await eventHandler.processing.processEvent(context);\n } catch (error) {\n log.error(`Failed to process event '${event}': ${(error as Error).message}`);\n log.debug(`Event error stack: ${(error as Error).stack}`);\n // Continue processing other events rather than stopping completely\n }\n}\n\nasync function showProjectHelp(projectName: string, ctx: OpenContext): Promise<void> {\n const { config } = ctx;\n const projects = config.getProjects();\n\n if (!(projectName in projects)) {\n console.error(`Project '${projectName}' not found`);\n return;\n }\n\n const projectConfig = projects[projectName];\n const configuredEvents = Object.keys(projectConfig.events || {});\n\n console.log(`\\nAvailable commands for '${projectName}':`);\n console.log('-'.repeat(50));\n\n for (const eventName of configuredEvents) {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = projectConfig.events[eventName as keyof typeof projectConfig.events];\n let configDesc = '';\n if (eventConfig !== true && eventConfig !== 'true') {\n if (typeof eventConfig === 'object') {\n configDesc = ` (${JSON.stringify(eventConfig)})`;\n } else {\n configDesc = ` (${eventConfig})`;\n }\n }\n console.log(` ${eventName.padEnd(8)} - ${eventHandler.metadata.description}${configDesc}`);\n }\n }\n\n console.log('\\nUsage examples:');\n console.log(` workon ${projectName} # Execute all commands`);\n console.log(` workon ${projectName}:cwd # Just change directory`);\n console.log(` workon ${projectName}:claude # Just Claude (auto-adds cwd)`);\n\n if (configuredEvents.length > 1) {\n const twoCommands = configuredEvents.slice(0, 2).join(',');\n console.log(` workon ${projectName}:${twoCommands.padEnd(12)} # Multiple commands`);\n }\n\n console.log(` workon ${projectName}:cwd --shell # Output shell commands\\n`);\n}\n","import { Command } from 'commander';\nimport { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport loog from 'loog';\nimport omelette from 'omelette';\nimport File from 'phylo';\nimport { Config } from '../lib/config.js';\nimport { EnvironmentRecognizer } from '../lib/environment.js';\nimport { EventRegistry } from '../events/registry.js';\nimport { createOpenCommand } from './open.js';\nimport { createConfigCommand } from './config/index.js';\nimport { createManageCommand } from './manage.js';\nimport { createAddCommand } from './add.js';\nimport { createWorktreesCommand } from './worktrees/index.js';\nimport { createWorktreeCommand } from './worktree.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction findPackageJson(): string {\n // Try multiple paths to find package.json\n const paths = [\n join(__dirname, '../package.json'),\n join(__dirname, '../../package.json'),\n join(process.cwd(), 'package.json'),\n ];\n\n for (const p of paths) {\n if (existsSync(p)) {\n return p;\n }\n }\n\n throw new Error('Could not find package.json');\n}\n\ninterface GlobalOptions {\n debug?: boolean;\n shell?: boolean;\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n // Load package.json for version\n const packageJsonPath = findPackageJson();\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\n // Initialize config and logger\n const config = new Config();\n const log = loog({\n prefixStyle: 'ascii',\n logLevel: 'info',\n });\n\n // Store package info in config\n config.set('pkg', packageJson);\n\n // Configure environment recognizer\n EnvironmentRecognizer.configure(config, log);\n\n // Setup shell completion\n const completion = setupCompletion(config);\n\n program\n .name('workon')\n .description('Work on something great!')\n .version(packageJson.version)\n .enablePositionalOptions()\n .argument('[project]', 'Project name to open (supports project:command syntax)')\n .option('-d, --debug', 'Enable debug logging')\n .option('--completion', 'Setup shell tab completion')\n .option('--shell', 'Output shell commands for evaluation')\n .option('--init', 'Generate shell integration function')\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts<GlobalOptions>();\n if (opts.debug) {\n log.setLogLevel('debug');\n }\n // Initialize event registry once before any command runs\n await EventRegistry.initialize();\n })\n .action(\n async (\n project: string | undefined,\n options: GlobalOptions & { completion?: boolean; init?: boolean }\n ) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n if (options.completion) {\n log.debug('Setting up command-line completion');\n completion.setupShellInitFile();\n return;\n }\n\n if (options.init) {\n log.debug('Generating shell integration function');\n outputShellInit(program);\n return;\n }\n\n // If a project name was provided, delegate to the open command logic\n if (project) {\n // Import and call open logic directly instead of re-parsing\n const { runOpen } = await import('./open.js');\n await runOpen(project, { debug: options.debug, shell: options.shell }, { config, log });\n return;\n }\n\n // Default action: run interactive mode\n const environment = await EnvironmentRecognizer.recognize(File.cwd());\n program.setOptionValue('_environment', environment);\n program.setOptionValue('_config', config);\n program.setOptionValue('_log', log);\n\n // Import and run interactive command\n const { runInteractive } = await import('./interactive.js');\n await runInteractive({ config, log, environment });\n }\n );\n\n // Store shared state for subcommands\n program.setOptionValue('_config', config);\n program.setOptionValue('_log', log);\n\n // Add commands\n program.addCommand(createOpenCommand({ config, log }));\n program.addCommand(createAddCommand({ config, log }));\n program.addCommand(createConfigCommand({ config, log }));\n program.addCommand(createManageCommand({ config, log }));\n program.addCommand(createWorktreesCommand({ config, log }));\n program.addCommand(createWorktreeCommand({ config, log }));\n\n // Handle unknown commands as project names\n program.on('command:*', async (operands) => {\n const projectName = operands[0];\n\n // Check if it looks like a project name (not a flag)\n if (projectName && !projectName.startsWith('-')) {\n const openCmd = program.commands.find((c) => c.name() === 'open');\n if (openCmd) {\n // Re-parse with open command and project name\n const args = [\n 'open',\n ...operands,\n ...process.argv.slice(2).filter((a) => a.startsWith('-')),\n ];\n await program.parseAsync(['node', 'workon', ...args]);\n return;\n }\n }\n\n console.error(`Unknown command: ${operands.join(' ')}`);\n program.help();\n });\n\n program.showHelpAfterError(true);\n\n return program;\n}\n\nfunction setupCompletion(config: Config): ReturnType<typeof omelette> {\n const tree: Record<string, string[] | null> = {\n config: ['list', 'set', 'unset'],\n manage: null,\n };\n\n const projects = config.getProjects();\n if (projects) {\n Object.keys(projects).forEach((id) => {\n tree[id] = null;\n });\n }\n\n const completion = omelette('workon').tree(tree);\n completion.init();\n\n return completion;\n}\n\nfunction outputShellInit(program: Command): void {\n // Get list of available commands\n const cmdNames = program.commands.map((c) => c.name());\n\n // Get list of available options\n const switchFlags: string[] = [];\n program.options.forEach((opt) => {\n switchFlags.push('--' + opt.long?.replace(/^--/, ''));\n if (opt.short) {\n switchFlags.push(opt.short);\n }\n });\n\n // Built-in flags\n const builtinFlags = ['--help', '-h', '--version', '-V', 'help'];\n\n // Combine all non-shell commands and flags\n const nonShellCommands = [...new Set([...cmdNames, ...switchFlags, ...builtinFlags])];\n const casePattern = nonShellCommands.join('|');\n\n // Generate shell function\n const shellFunction = `\n# workon shell integration\nworkon() {\n # Commands and flags that should NOT use shell mode\n case \"$1\" in\n ${casePattern})\n command workon \"$@\"\n return $?\n ;;\n esac\n\n # If no arguments provided, run interactive mode directly\n if [[ $# -eq 0 ]]; then\n command workon \"$@\"\n return $?\n fi\n\n # Default behavior: use shell mode for project opening\n local output\n output=$(command workon --shell \"$@\" 2>&1)\n local exit_code=$?\n\n if [[ $exit_code -eq 0 && -n \"$output\" ]]; then\n # Execute shell commands if workon succeeded and output exists\n eval \"$output\"\n else\n # Show any error output\n [[ -n \"$output\" ]] && echo \"$output\" >&2\n return $exit_code\n fi\n}`;\n\n console.log(shellFunction);\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { createListCommand } from './list.js';\nimport { createSetCommand } from './set.js';\nimport { createUnsetCommand } from './unset.js';\n\ninterface ConfigContext {\n config: Config;\n log: Logger;\n}\n\nexport function createConfigCommand(ctx: ConfigContext): Command {\n const command = new Command('config').description('Manage configuration parameters');\n\n command.addCommand(createListCommand(ctx));\n command.addCommand(createSetCommand(ctx));\n command.addCommand(createUnsetCommand(ctx));\n\n // Default action shows list\n command.action(() => {\n command.commands.find((c) => c.name() === 'list')?.parse();\n });\n\n return command;\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\n\ninterface ConfigContext {\n config: Config;\n log: Logger;\n}\n\nfunction flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(result, flattenObject(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\nexport function createListCommand(ctx: ConfigContext): Command {\n const { config, log } = ctx;\n\n return new Command('list').description('List configuration parameters').action(() => {\n log.debug('Listing configuration');\n\n console.log(`Configuration file: ${config.path}\\n`);\n\n const store = config.store;\n const flattened = flattenObject(store as unknown as Record<string, unknown>);\n\n for (const [key, value] of Object.entries(flattened)) {\n const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);\n console.log(`${key}: ${displayValue}`);\n }\n });\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\n\ninterface ConfigContext {\n config: Config;\n log: Logger;\n}\n\nexport function createSetCommand(ctx: ConfigContext): Command {\n const { config, log } = ctx;\n\n return new Command('set')\n .description('Set a configuration parameter')\n .argument('<key>', 'The configuration parameter to set')\n .argument('<value>', 'The value to set')\n .action((key: string, value: string) => {\n log.debug(`Setting ${key} to ${value}`);\n\n // Try to parse as JSON if possible\n let parsedValue: unknown = value;\n try {\n // Handle booleans\n if (value === 'true') {\n parsedValue = true;\n } else if (value === 'false') {\n parsedValue = false;\n } else if (!isNaN(Number(value)) && value.trim() !== '') {\n // Handle numbers\n parsedValue = Number(value);\n } else {\n // Try JSON parse for objects/arrays\n parsedValue = JSON.parse(value);\n }\n } catch {\n // Keep as string if not valid JSON\n parsedValue = value;\n }\n\n config.set(key, parsedValue);\n console.log(\n `Set ${key} = ${typeof parsedValue === 'object' ? JSON.stringify(parsedValue) : parsedValue}`\n );\n });\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\n\ninterface ConfigContext {\n config: Config;\n log: Logger;\n}\n\nexport function createUnsetCommand(ctx: ConfigContext): Command {\n const { config, log } = ctx;\n\n return new Command('unset')\n .description('Remove a configuration parameter')\n .argument('<key>', 'The configuration parameter to remove')\n .option('--silent', 'Suppress console output')\n .action((key: string, options: { silent?: boolean }) => {\n log.debug(`Removing ${key}`);\n\n if (config.has(key)) {\n config.delete(key);\n if (!options.silent) {\n console.log(`Removed ${key}`);\n }\n } else {\n if (!options.silent) {\n console.log(`Key ${key} not found`);\n }\n }\n });\n}\n","import { Command } from 'commander';\nimport { select, input, confirm, checkbox } from '@inquirer/prompts';\nimport File from 'phylo';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ProjectConfig, EventsConfig } from '../types/index.js';\nimport { EventRegistry } from '../events/registry.js';\nimport { IDE_CHOICES } from '../types/constants.js';\n\ninterface ManageContext {\n config: Config;\n log: Logger;\n}\n\nexport function createManageCommand(ctx: ManageContext): Command {\n const { log } = ctx;\n\n return new Command('manage')\n .description('Interactive project management')\n .option('-d, --debug', 'Enable debug logging')\n .action(async (options: { debug?: boolean }) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n await mainMenu(ctx);\n });\n}\n\nasync function mainMenu(ctx: ManageContext): Promise<void> {\n const { config } = ctx;\n const projects = config.getProjects();\n const hasProjects = Object.keys(projects).length > 0;\n\n const choices = [\n { name: 'Create new project', value: 'create' },\n ...(hasProjects\n ? [\n { name: 'Edit project', value: 'edit' },\n { name: 'Delete project', value: 'delete' },\n { name: 'List projects', value: 'list' },\n ]\n : []),\n { name: 'Exit', value: 'exit' },\n ];\n\n const action = await select({\n message: 'What would you like to do?',\n choices,\n });\n\n switch (action) {\n case 'create':\n await createProject(ctx);\n break;\n case 'edit':\n await editProject(ctx);\n break;\n case 'delete':\n await deleteProject(ctx);\n break;\n case 'list':\n await listProjects(ctx);\n break;\n case 'exit':\n return;\n }\n\n // Return to main menu\n await mainMenu(ctx);\n}\n\nasync function createProject(ctx: ManageContext): Promise<void> {\n const { config, log } = ctx;\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n // Project name\n const name = await input({\n message: 'Project name:',\n validate: (value) => {\n if (!value.trim()) return 'Name is required';\n if (!/^[\\w-]+$/.test(value))\n return 'Name can only contain letters, numbers, underscores, and hyphens';\n if (value in projects) return 'Project already exists';\n return true;\n },\n });\n\n // Project path\n const defaultPath = defaults?.base ? File.from(defaults.base).join(name).path : name;\n const pathInput = await input({\n message: 'Project path:',\n default: defaultPath,\n validate: (value) => {\n const path = File.from(value);\n try {\n const exists = path.exists();\n if (!exists) return `Path does not exist: ${value}`;\n const stat = path.stat();\n if (!stat.isDirectory()) return 'Path must be a directory';\n return true;\n } catch {\n return `Invalid path: ${value}`;\n }\n },\n });\n\n // Convert to relative path if possible\n let relativePath = pathInput;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base);\n const pathFile = File.from(pathInput);\n try {\n relativePath = pathFile.relativize(baseDir.path).path;\n } catch {\n relativePath = pathInput;\n }\n }\n\n // IDE selection\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n });\n\n // Homepage (optional)\n const homepage = await input({\n message: 'Project homepage URL (optional):',\n default: '',\n });\n\n // Event selection\n const availableEvents = EventRegistry.getEventsForManageUI();\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: e.value === 'cwd' || e.value === 'ide',\n })),\n });\n\n // Configure each selected event\n const events: EventsConfig = {};\n for (const eventName of selectedEvents) {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n\n // Build project config\n const projectConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n if (homepage.trim()) {\n projectConfig.homepage = homepage.trim();\n }\n\n // Confirm\n console.log('\\nProject configuration:');\n console.log(JSON.stringify(projectConfig, null, 2));\n\n const confirmed = await confirm({\n message: 'Save this project?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(name, projectConfig);\n log.info(`Project '${name}' created successfully!`);\n log.info(`Use 'workon ${name}' to start working!`);\n } else {\n log.info('Project creation cancelled.');\n }\n}\n\nasync function editProject(ctx: ManageContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n const projectNames = Object.keys(projects);\n\n if (projectNames.length === 0) {\n log.info('No projects to edit.');\n return;\n }\n\n const name = await select({\n message: 'Select project to edit:',\n choices: projectNames.map((n) => ({ name: n, value: n })),\n });\n\n const project = projects[name];\n const defaults = config.getDefaults();\n\n // Path\n const pathInput = await input({\n message: 'Project path:',\n default: project.path,\n });\n\n let relativePath = pathInput;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base);\n const pathFile = File.from(pathInput);\n try {\n if (pathFile.isAbsolute()) {\n relativePath = pathFile.relativize(baseDir.path).path;\n }\n } catch {\n relativePath = pathInput;\n }\n }\n\n // IDE\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n default: project.ide || 'vscode',\n });\n\n // Homepage\n const homepage = await input({\n message: 'Project homepage URL:',\n default: project.homepage || '',\n });\n\n // Keep existing events or reconfigure?\n const keepEvents = await confirm({\n message: 'Keep existing event configuration?',\n default: true,\n });\n\n let events = project.events;\n if (!keepEvents) {\n const availableEvents = EventRegistry.getEventsForManageUI();\n const currentEvents = Object.keys(project.events);\n\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: currentEvents.includes(e.value),\n })),\n });\n\n events = {};\n for (const eventName of selectedEvents) {\n // Keep existing config if event was previously configured\n if (project.events[eventName]) {\n (events as Record<string, unknown>)[eventName] = project.events[eventName];\n } else {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n }\n }\n\n // Build updated config\n const updatedConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n if (homepage.trim()) {\n updatedConfig.homepage = homepage.trim();\n }\n\n // Confirm\n console.log('\\nUpdated configuration:');\n console.log(JSON.stringify(updatedConfig, null, 2));\n\n const confirmed = await confirm({\n message: 'Save changes?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(name, updatedConfig);\n log.info(`Project '${name}' updated successfully!`);\n } else {\n log.info('Edit cancelled.');\n }\n}\n\nasync function deleteProject(ctx: ManageContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n const projectNames = Object.keys(projects);\n\n if (projectNames.length === 0) {\n log.info('No projects to delete.');\n return;\n }\n\n const name = await select({\n message: 'Select project to delete:',\n choices: projectNames.map((n) => ({ name: n, value: n })),\n });\n\n const confirmed = await confirm({\n message: `Are you sure you want to delete '${name}'?`,\n default: false,\n });\n\n if (confirmed) {\n await config.deleteProjectSafe(name);\n log.info(`Project '${name}' deleted.`);\n } else {\n log.info('Delete cancelled.');\n }\n}\n\nasync function listProjects(ctx: ManageContext): Promise<void> {\n const { config } = ctx;\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n console.log('\\nConfigured projects:\\n');\n\n for (const [name, project] of Object.entries(projects)) {\n const fullPath = defaults?.base\n ? File.from(defaults.base).join(project.path).path\n : project.path;\n\n console.log(` ${name}`);\n console.log(` Path: ${fullPath}`);\n console.log(` IDE: ${project.ide || 'not set'}`);\n console.log(` Events: ${Object.keys(project.events).join(', ') || 'none'}`);\n if (project.homepage) {\n console.log(` Homepage: ${project.homepage}`);\n }\n console.log();\n }\n}\n","import { Command } from 'commander';\nimport { existsSync, readFileSync } from 'fs';\nimport { basename, resolve } from 'path';\nimport File from 'phylo';\nimport { confirm } from '@inquirer/prompts';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ProjectConfig, IdeType } from '../types/index.js';\n\ninterface AddContext {\n config: Config;\n log: Logger;\n}\n\ninterface AddOptions {\n debug?: boolean;\n name?: string;\n ide?: IdeType;\n force?: boolean;\n}\n\ninterface ProjectDiscovery {\n name: string;\n isNode: boolean;\n isBun: boolean;\n hasClaude: boolean;\n detectedIde: IdeType | null;\n packageJson: Record<string, unknown> | null;\n}\n\nexport function createAddCommand(ctx: AddContext): Command {\n const { log } = ctx;\n\n return new Command('add')\n .description('Add a project from a directory path')\n .argument('[path]', 'Path to the project directory (defaults to current directory)', '.')\n .option('-d, --debug', 'Enable debug logging')\n .option('-n, --name <name>', 'Override the detected project name')\n .option(\n '-i, --ide <ide>',\n 'Specify the IDE to use (vscode, idea, atom, code, subl, vim, emacs)'\n )\n .option('-f, --force', 'Overwrite existing project with same name')\n .action(async (pathArg: string, options: AddOptions) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n await addProject(pathArg, options, ctx);\n });\n}\n\nasync function addProject(pathArg: string, options: AddOptions, ctx: AddContext): Promise<void> {\n const { config, log } = ctx;\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n // Resolve the path\n const targetPath = resolve(pathArg);\n log.debug(`Resolved path: ${targetPath}`);\n\n // Validate path exists and is a directory\n if (!existsSync(targetPath)) {\n log.error(`Path does not exist: ${targetPath}`);\n process.exit(1);\n }\n\n const pathFile = File.from(targetPath);\n try {\n const stat = pathFile.stat();\n if (!stat.isDirectory()) {\n log.error(`Path is not a directory: ${targetPath}`);\n process.exit(1);\n }\n } catch {\n log.error(`Cannot access path: ${targetPath}`);\n process.exit(1);\n }\n\n // Auto-discover project details\n const discovery = discoverProject(targetPath, log);\n log.debug(`Discovery result: ${JSON.stringify(discovery)}`);\n\n // Determine project name\n const projectName = options.name || discovery.name;\n log.debug(`Project name: ${projectName}`);\n\n // Validate project name\n if (!/^[\\w-]+$/.test(projectName)) {\n log.error(`Invalid project name: ${projectName}`);\n log.error('Name can only contain letters, numbers, underscores, and hyphens');\n process.exit(1);\n }\n\n // Check for existing project\n if (projectName in projects && !options.force) {\n const overwrite = await confirm({\n message: `Project '${projectName}' already exists. Overwrite?`,\n default: false,\n });\n\n if (!overwrite) {\n log.info('Cancelled.');\n return;\n }\n }\n\n // Determine IDE\n const ide: IdeType = options.ide || discovery.detectedIde || 'code';\n log.debug(`IDE: ${ide}`);\n\n // Calculate relative path if possible\n let relativePath = targetPath;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base);\n try {\n const relPath = pathFile.relativize(baseDir.path);\n if (relPath && !relPath.path.startsWith('..')) {\n relativePath = relPath.path;\n }\n } catch {\n // Keep absolute path\n }\n }\n log.debug(`Relative path: ${relativePath}`);\n\n // Build project config\n const projectConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events: {\n cwd: true,\n ide: true,\n },\n };\n\n // Add npm event if it's a Node/Bun project with scripts\n if ((discovery.isNode || discovery.isBun) && discovery.packageJson) {\n const scripts = discovery.packageJson.scripts as Record<string, string> | undefined;\n if (scripts && (scripts.dev || scripts.start)) {\n projectConfig.events.npm = scripts.dev ? 'dev' : 'start';\n }\n }\n\n // Add claude event if CLAUDE.md is detected\n if (discovery.hasClaude) {\n projectConfig.events.claude = true;\n }\n\n // Save the project\n await config.setProjectSafe(projectName, projectConfig);\n\n // Output success\n log.info(`Added project '${projectName}'`);\n log.info(` Path: ${relativePath}`);\n log.info(` IDE: ${ide}`);\n log.info(` Events: ${Object.keys(projectConfig.events).join(', ')}`);\n log.info('');\n log.info(`Use 'workon ${projectName}' to start working!`);\n}\n\nfunction discoverProject(targetPath: string, log: Logger): ProjectDiscovery {\n const dirName = basename(targetPath);\n\n const discovery: ProjectDiscovery = {\n name: dirName,\n isNode: false,\n isBun: false,\n hasClaude: false,\n detectedIde: null,\n packageJson: null,\n };\n\n // Check for package.json (Node project)\n const packageJsonPath = resolve(targetPath, 'package.json');\n if (existsSync(packageJsonPath)) {\n discovery.isNode = true;\n log.debug('Detected Node project (package.json found)');\n\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n discovery.packageJson = JSON.parse(content);\n\n // Use package.json name if available and valid\n const pkgName = discovery.packageJson?.name as string | undefined;\n if (pkgName && /^[\\w-]+$/.test(pkgName)) {\n discovery.name = pkgName;\n log.debug(`Using name from package.json: ${pkgName}`);\n }\n } catch (error) {\n log.debug(`Failed to parse package.json: ${(error as Error).message}`);\n }\n }\n\n // Check for bun.lockb (Bun project)\n const bunLockPath = resolve(targetPath, 'bun.lockb');\n if (existsSync(bunLockPath)) {\n discovery.isBun = true;\n log.debug('Detected Bun project (bun.lockb found)');\n }\n\n // Detect IDE from config directories\n const vscodeDir = resolve(targetPath, '.vscode');\n const cursorDir = resolve(targetPath, '.cursor');\n const ideaDir = resolve(targetPath, '.idea');\n\n if (existsSync(cursorDir)) {\n discovery.detectedIde = 'cursor';\n log.debug('Detected Cursor (.cursor directory found)');\n } else if (existsSync(vscodeDir)) {\n discovery.detectedIde = 'code';\n log.debug('Detected VS Code (.vscode directory found)');\n } else if (existsSync(ideaDir)) {\n discovery.detectedIde = 'idea';\n log.debug('Detected IntelliJ IDEA (.idea directory found)');\n }\n\n // Detect Claude Code project\n const claudeMdPath = resolve(targetPath, 'CLAUDE.md');\n if (existsSync(claudeMdPath)) {\n discovery.hasClaude = true;\n log.debug('Detected Claude Code project (CLAUDE.md found)');\n }\n\n return discovery;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { select, confirm } from '@inquirer/prompts';\nimport { simpleGit } from 'simple-git';\nimport type { Config } from '../lib/config.js';\nimport type { Logger } from '../types/index.js';\nimport { WorktreeManager } from '../lib/worktree.js';\nimport { TmuxManager } from '../lib/tmux.js';\nimport { detectWorktreeContext, type WorktreeInfo } from './worktrees/utils.js';\n\ninterface WorktreeContext {\n config: Config;\n log: Logger;\n}\n\n/**\n * Create the singular 'worktree' command for operating on the current worktree\n */\nexport function createWorktreeCommand(ctx: WorktreeContext): Command {\n const { log } = ctx;\n\n const command = new Command('worktree').description(\n 'Operate on the current worktree (run from within a worktree)'\n );\n\n // Default action: show worktree status\n command.action(async () => {\n const worktreeInfo = await detectWorktreeContext();\n\n if (!worktreeInfo) {\n log.error('Not in a git repository.');\n process.exit(1);\n }\n\n if (!worktreeInfo.isWorktree) {\n log.error(\"You're in the main repository, not a worktree.\");\n log.info(`Use 'workon worktrees' to manage worktrees for this project.`);\n process.exit(1);\n }\n\n await showWorktreeStatus(worktreeInfo, log);\n });\n\n // Subcommand: status\n command\n .command('status')\n .description('Show status of the current worktree')\n .action(async () => {\n const worktreeInfo = await detectWorktreeContext();\n\n if (!worktreeInfo) {\n log.error('Not in a git repository.');\n process.exit(1);\n }\n\n if (!worktreeInfo.isWorktree) {\n log.error(\"You're in the main repository, not a worktree.\");\n process.exit(1);\n }\n\n await showWorktreeStatus(worktreeInfo, log);\n });\n\n // Subcommand: merge\n command\n .command('merge')\n .description('Merge this worktree branch into a target branch')\n .option('-i, --into <branch>', 'Target branch to merge into')\n .option('-s, --squash', 'Use squash merge')\n .option('-k, --keep', 'Keep the worktree after merging')\n .option('-y, --yes', 'Skip confirmation prompts')\n .action(async (options: { into?: string; squash?: boolean; keep?: boolean; yes?: boolean }) => {\n const worktreeInfo = await detectWorktreeContext();\n\n if (!worktreeInfo) {\n log.error('Not in a git repository.');\n process.exit(1);\n }\n\n if (!worktreeInfo.isWorktree) {\n log.error(\"You're in the main repository, not a worktree.\");\n log.info(`Use 'workon worktrees merge <name>' from the main repository.`);\n process.exit(1);\n }\n\n await mergeCurrentWorktree(worktreeInfo, options, ctx);\n });\n\n // Subcommand: remove\n command\n .command('remove')\n .description('Remove the current worktree')\n .option('-f, --force', 'Force removal even with uncommitted changes')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options: { force?: boolean; yes?: boolean }) => {\n const worktreeInfo = await detectWorktreeContext();\n\n if (!worktreeInfo) {\n log.error('Not in a git repository.');\n process.exit(1);\n }\n\n if (!worktreeInfo.isWorktree) {\n log.error(\"You're in the main repository, not a worktree.\");\n log.info(`Use 'workon worktrees remove <name>' from the main repository.`);\n process.exit(1);\n }\n\n await removeCurrentWorktree(worktreeInfo, options, ctx);\n });\n\n return command;\n}\n\nasync function showWorktreeStatus(worktreeInfo: WorktreeInfo, log: Logger): Promise<void> {\n if (!worktreeInfo.worktreePath) {\n log.error('Unable to determine worktree path.');\n return;\n }\n\n const git = simpleGit(worktreeInfo.worktreePath);\n\n // Get git status\n const status = await git.status();\n const hasChanges =\n status.modified.length > 0 ||\n status.not_added.length > 0 ||\n status.deleted.length > 0 ||\n status.staged.length > 0;\n\n console.log(chalk.bold('\\nCurrent Worktree:'));\n console.log('-'.repeat(50));\n console.log(` Name: ${chalk.cyan(worktreeInfo.worktreeName)}`);\n console.log(\n ` Branch: ${worktreeInfo.branch === '(detached)' ? chalk.yellow(worktreeInfo.branch) : chalk.green(worktreeInfo.branch)}`\n );\n console.log(` Path: ${chalk.gray(worktreeInfo.worktreePath)}`);\n console.log(` Main: ${chalk.gray(worktreeInfo.mainRepoPath)}`);\n console.log(\n ` Status: ${hasChanges ? chalk.yellow('uncommitted changes') : chalk.green('clean')}`\n );\n\n if (hasChanges) {\n console.log(`\\n${chalk.bold('Changes:')}`);\n if (status.staged.length > 0) {\n console.log(` Staged: ${status.staged.length} file(s)`);\n }\n if (status.modified.length > 0) {\n console.log(` Modified: ${status.modified.length} file(s)`);\n }\n if (status.not_added.length > 0) {\n console.log(` Untracked: ${status.not_added.length} file(s)`);\n }\n if (status.deleted.length > 0) {\n console.log(` Deleted: ${status.deleted.length} file(s)`);\n }\n }\n\n console.log(`\\n${chalk.bold('Commands:')}`);\n console.log(` workon worktree merge - Merge this branch and remove worktree`);\n console.log(` workon worktree remove - Remove this worktree`);\n console.log();\n}\n\nasync function mergeCurrentWorktree(\n worktreeInfo: WorktreeInfo,\n options: { into?: string; squash?: boolean; keep?: boolean; yes?: boolean },\n ctx: WorktreeContext\n): Promise<void> {\n const { log } = ctx;\n\n if (!worktreeInfo.worktreePath || !worktreeInfo.worktreeName) {\n log.error('Unable to determine worktree info.');\n process.exit(1);\n }\n\n if (worktreeInfo.branch === '(detached)') {\n log.error('Cannot merge a detached HEAD. Create a branch first.');\n log.info(`Use 'git checkout -b <branch-name>' to create a branch.`);\n process.exit(1);\n }\n\n const manager = new WorktreeManager(worktreeInfo.mainRepoPath);\n\n // Check for uncommitted changes\n const hasChanges = await manager.hasUncommittedChanges(worktreeInfo.worktreeName);\n if (hasChanges) {\n log.error('This worktree has uncommitted changes.');\n log.info('Please commit or stash your changes before merging.');\n process.exit(1);\n }\n\n // Select target branch\n let targetBranch = options.into;\n if (!targetBranch) {\n const branches = await manager.getBranches();\n const targetBranches = branches.filter((b) => b !== worktreeInfo.branch);\n\n if (targetBranches.length === 0) {\n log.error('No other branches available to merge into.');\n process.exit(1);\n }\n\n const commonTargets = ['main', 'master', 'develop', 'dev'];\n const defaultTarget =\n commonTargets.find((t) => targetBranches.includes(t)) || targetBranches[0];\n\n targetBranch = await select({\n message: `Merge '${worktreeInfo.branch}' into which branch?`,\n choices: targetBranches.map((b) => ({ name: b, value: b })),\n default: defaultTarget,\n });\n }\n\n // Verify target branch exists\n if (!(await manager.branchExists(targetBranch))) {\n log.error(`Target branch '${targetBranch}' does not exist.`);\n process.exit(1);\n }\n\n // Select merge strategy\n let squash = options.squash;\n if (squash === undefined && !options.yes) {\n squash = await confirm({\n message: 'Use squash merge? (combines all commits into one)',\n default: false,\n });\n }\n\n // Confirm the operation\n if (!options.yes) {\n console.log(`\\n${chalk.bold('Merge operation:')}`);\n console.log(` Source: ${chalk.green(worktreeInfo.branch)}`);\n console.log(` Target: ${chalk.cyan(targetBranch)}`);\n console.log(` Method: ${squash ? 'Squash merge' : 'Regular merge'}`);\n console.log(` Action: ${options.keep ? 'Keep worktree' : 'Remove worktree after merge'}`);\n console.log();\n\n const shouldProceed = await confirm({\n message: 'Proceed with merge?',\n default: true,\n });\n\n if (!shouldProceed) {\n log.info('Merge cancelled.');\n return;\n }\n }\n\n // Perform the merge\n const mergeSpinner = ora(`Merging '${worktreeInfo.branch}' into '${targetBranch}'...`).start();\n\n try {\n await manager.merge(worktreeInfo.worktreeName, {\n targetBranch,\n squash: squash || false,\n });\n mergeSpinner.succeed(`Successfully merged '${worktreeInfo.branch}' into '${targetBranch}'`);\n } catch (error) {\n mergeSpinner.fail(`Merge failed: ${(error as Error).message}`);\n log.info('You may need to resolve conflicts manually.');\n process.exit(1);\n }\n\n // Remove worktree if not keeping\n if (!options.keep) {\n log.warn('You need to exit this worktree directory before it can be removed.');\n\n const shouldContinue = await confirm({\n message: `Remove worktree '${worktreeInfo.worktreeName}'? (You'll need to cd out first)`,\n default: true,\n });\n\n if (shouldContinue) {\n // Kill any associated tmux session\n const tmux = new TmuxManager();\n const sessionName = tmux.getWorktreeSessionName(\n worktreeInfo.mainRepoPath.split('/').pop() || 'project',\n worktreeInfo.worktreeName\n );\n if (await tmux.sessionExists(sessionName)) {\n log.debug(`Killing tmux session: ${sessionName}`);\n await tmux.killSession(sessionName);\n }\n\n log.info(`\\nTo complete removal, run from the main project directory:`);\n console.log(chalk.cyan(` cd ${worktreeInfo.mainRepoPath}`));\n console.log(chalk.cyan(` workon worktrees remove ${worktreeInfo.worktreeName}`));\n }\n\n // Ask about deleting the branch\n if (!options.yes) {\n const shouldDeleteBranch = await confirm({\n message: `Delete the merged branch '${worktreeInfo.branch}'?`,\n default: false,\n });\n\n if (shouldDeleteBranch) {\n const deleteSpinner = ora(`Deleting branch '${worktreeInfo.branch}'...`).start();\n try {\n const git = simpleGit(worktreeInfo.mainRepoPath);\n await git.deleteLocalBranch(worktreeInfo.branch!, true);\n deleteSpinner.succeed(`Branch '${worktreeInfo.branch}' deleted`);\n } catch (error) {\n deleteSpinner.warn(`Failed to delete branch: ${(error as Error).message}`);\n }\n }\n }\n }\n\n console.log(chalk.green('\\nMerge completed!'));\n}\n\nasync function removeCurrentWorktree(\n worktreeInfo: WorktreeInfo,\n options: { force?: boolean; yes?: boolean },\n ctx: WorktreeContext\n): Promise<void> {\n const { log } = ctx;\n\n if (!worktreeInfo.worktreePath || !worktreeInfo.worktreeName) {\n log.error('Unable to determine worktree info.');\n process.exit(1);\n }\n\n const manager = new WorktreeManager(worktreeInfo.mainRepoPath);\n\n // Check for uncommitted changes\n const hasChanges = await manager.hasUncommittedChanges(worktreeInfo.worktreeName);\n if (hasChanges && !options.force) {\n log.warn('This worktree has uncommitted changes.');\n\n if (!options.yes) {\n const shouldForce = await confirm({\n message: 'Do you want to force removal and lose these changes?',\n default: false,\n });\n\n if (!shouldForce) {\n log.info('Removal cancelled.');\n return;\n }\n options.force = true;\n } else {\n log.error('Use --force to remove worktrees with uncommitted changes.');\n process.exit(1);\n }\n }\n\n // Confirm removal\n if (!options.yes) {\n console.log(`\\n${chalk.bold('Worktree to remove:')}`);\n console.log(` Name: ${chalk.cyan(worktreeInfo.worktreeName)}`);\n console.log(\n ` Branch: ${worktreeInfo.branch === '(detached)' ? chalk.yellow(worktreeInfo.branch) : chalk.green(worktreeInfo.branch)}`\n );\n console.log(` Path: ${chalk.gray(worktreeInfo.worktreePath)}`);\n console.log();\n\n const shouldRemove = await confirm({\n message: `Remove this worktree?`,\n default: true,\n });\n\n if (!shouldRemove) {\n log.info('Removal cancelled.');\n return;\n }\n }\n\n log.warn(\"You're currently inside this worktree. You need to exit before removal.\");\n log.info(`\\nTo remove this worktree:`);\n console.log(chalk.cyan(` cd ${worktreeInfo.mainRepoPath}`));\n console.log(\n chalk.cyan(\n ` workon worktrees remove ${worktreeInfo.worktreeName}${options.force ? ' --force' : ''}`\n )\n );\n}\n","#!/usr/bin/env node\n\n// Workaround for Node.js stdout buffering issues with interactive prompts\n// This ensures stdout is in the correct mode before any prompts are shown\nif (process.stdout.isTTY) {\n process.stdout.write('');\n}\n\nimport { createCli } from './commands/index.js';\n\nconst program = createCli();\n\nprogram.parseAsync().catch((error) => {\n // Handle user interrupts gracefully (Ctrl+C)\n if (error?.name === 'ExitPromptError' || error?.message?.includes('SIGINT')) {\n process.exit(130); // Standard exit code for SIGINT\n }\n // Re-throw other errors\n console.error(error);\n process.exit(1);\n});\n"],"mappings":"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","names":["resolve","path","File","resolve","spawn","spawn","spawn","spawn","input","spawn","input","confirm","input","spawn","execCallback","promisify","existsSync","simpleGit","input","exec","path","File","simpleGit","confirm","input","path","Command","chalk","select","confirm","runWorktreeOpen","Command","chalk","ora","path","confirm","Command","chalk","ora","path","select","confirm","simpleGit","Command","chalk","ora","path","confirm","simpleGit","Command","manageWorktreesInteractive","Command","chalk","File","path","execCallback","promisify","NpmEvent","wrapWithShellFallback","exec","select","input","checkbox","confirm","File","path","deepAssign","chalk","name","runWorktreeOpen","simpleGit","open_exports","createOpenCommand","Command","File","runInteractive","getClaudeArgs","getNpmCommand","NpmEvent","init_open","init_open","Command","readFileSync","existsSync","join","dirname","File","Command","Command","createListCommand","Command","Command","Command","createListCommand","Command","select","input","confirm","checkbox","File","path","Command","existsSync","basename","File","confirm","createAddCommand","Command","chalk","ora","select","confirm","simpleGit","dirname","join","existsSync","program","Command","readFileSync","runOpen","File","runInteractive","createOpenCommand","createAddCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/config.ts","../src/lib/project.ts","../src/lib/environment.ts","../src/events/core/cwd.ts","../src/events/core/ide.ts","../src/events/core/web.ts","../src/events/extensions/claude.ts","../src/events/extensions/docker.ts","../src/events/extensions/npm.ts","../src/events/registry.ts","../src/lib/sanitize.ts","../src/lib/tmux.ts","../src/types/constants.ts","../src/lib/worktree.ts","../src/commands/worktrees/utils.ts","../src/commands/worktrees/list.ts","../src/commands/worktrees/add.ts","../src/commands/worktrees/remove.ts","../src/commands/worktrees/merge.ts","../src/commands/worktrees/branch.ts","../src/commands/worktrees/index.ts","../src/commands/worktrees/open.ts","../src/commands/interactive.ts","../src/commands/open.ts","../src/commands/index.ts","../src/commands/config/index.ts","../src/commands/config/list.ts","../src/commands/config/set.ts","../src/commands/config/unset.ts","../src/commands/manage.ts","../src/commands/add.ts","../src/commands/worktree.ts","../src/cli.ts"],"sourcesContent":["import Conf from 'conf';\nimport { openSync, closeSync, unlinkSync, existsSync, mkdirSync } from 'fs';\nimport { dirname } from 'path';\nimport type { AppConfig, ProjectConfig, ProjectDefaults } from '../types/index.js';\n\nconst TRANSIENT_PROPS = ['pkg', 'work'] as const;\n\n/**\n * Simple file-based lock for preventing concurrent writes.\n * Uses exclusive file creation to ensure only one process can hold the lock.\n */\nclass FileLock {\n private lockPath: string;\n private fd: number | null = null;\n private static readonly LOCK_TIMEOUT_MS = 5000;\n private static readonly RETRY_INTERVAL_MS = 50;\n\n constructor(configPath: string) {\n this.lockPath = `${configPath}.lock`;\n }\n\n async acquire(): Promise<void> {\n const startTime = Date.now();\n const lockDir = dirname(this.lockPath);\n\n // Ensure directory exists\n if (!existsSync(lockDir)) {\n mkdirSync(lockDir, { recursive: true });\n }\n\n while (Date.now() - startTime < FileLock.LOCK_TIMEOUT_MS) {\n try {\n // Try to create lock file exclusively (fails if exists)\n this.fd = openSync(this.lockPath, 'wx');\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n // Lock file exists, check if it's stale (older than timeout)\n try {\n const stat = await import('fs').then((fs) => fs.promises.stat(this.lockPath));\n const age = Date.now() - stat.mtimeMs;\n if (age > FileLock.LOCK_TIMEOUT_MS) {\n // Stale lock, try to remove it\n try {\n unlinkSync(this.lockPath);\n } catch {\n // Another process might have removed it\n }\n }\n } catch {\n // Lock file might have been removed, try again\n }\n // Wait and retry\n await new Promise((resolve) => setTimeout(resolve, FileLock.RETRY_INTERVAL_MS));\n } else {\n throw error;\n }\n }\n }\n throw new Error('Failed to acquire config lock: timeout');\n }\n\n release(): void {\n if (this.fd !== null) {\n try {\n closeSync(this.fd);\n } catch {\n // Ignore close errors\n }\n this.fd = null;\n }\n try {\n unlinkSync(this.lockPath);\n } catch {\n // Ignore unlink errors (file might not exist)\n }\n }\n}\n\n/**\n * Config class with singleton pattern and file locking to prevent\n * race conditions that could clear the config.\n */\nexport class Config {\n private static _instance: Config | null = null;\n private _transient: Record<string, unknown> = {};\n // Using definite assignment assertion since singleton pattern may return existing instance\n private _store!: Conf<AppConfig>;\n private _lock!: FileLock;\n\n constructor() {\n // If an instance already exists, return it (soft singleton)\n // This allows tests to create new instances while preventing\n // accidental multiple instances in production\n if (Config._instance && process.env.NODE_ENV !== 'test') {\n return Config._instance;\n }\n\n // Allow overriding config directory via env var (used for test isolation)\n // This is necessary because `conf` on macOS ignores XDG_CONFIG_HOME\n this._store = new Conf<AppConfig>({\n projectName: 'workon',\n ...(process.env.WORKON_CONFIG_DIR && { cwd: process.env.WORKON_CONFIG_DIR }),\n });\n this._lock = new FileLock(this._store.path);\n\n if (process.env.NODE_ENV !== 'test') {\n Config._instance = this;\n }\n }\n\n /**\n * Get the singleton instance (creates one if needed)\n */\n static getInstance(): Config {\n if (!Config._instance) {\n Config._instance = new Config();\n }\n return Config._instance;\n }\n\n /**\n * Reset the singleton instance (for testing purposes)\n */\n static resetInstance(): void {\n Config._instance = null;\n }\n\n get<T = unknown>(key: string, defaultValue?: T): T | undefined {\n const rootKey = key.split('.')[0];\n if (TRANSIENT_PROPS.includes(rootKey as (typeof TRANSIENT_PROPS)[number])) {\n return (this._transient[key] as T) ?? defaultValue;\n }\n return this._store.get(key as keyof AppConfig, defaultValue as AppConfig[keyof AppConfig]) as\n | T\n | undefined;\n }\n\n set(key: string, value: unknown): void {\n const rootKey = key.split('.')[0];\n if (TRANSIENT_PROPS.includes(rootKey as (typeof TRANSIENT_PROPS)[number])) {\n this._transient[key] = value;\n } else {\n // Don't allow setting undefined values - use delete() instead\n if (value === undefined) {\n throw new Error(`Cannot set '${key}' to undefined. Use delete() to remove keys.`);\n }\n this._store.set(key as keyof AppConfig, value as never);\n }\n }\n\n has(key: string): boolean {\n const rootKey = key.split('.')[0];\n if (TRANSIENT_PROPS.includes(rootKey as (typeof TRANSIENT_PROPS)[number])) {\n return Object.prototype.hasOwnProperty.call(this._transient, key);\n }\n return this._store.has(key as keyof AppConfig);\n }\n\n delete(key: string): void {\n const rootKey = key.split('.')[0];\n if (TRANSIENT_PROPS.includes(rootKey as (typeof TRANSIENT_PROPS)[number])) {\n delete this._transient[key];\n } else {\n this._store.delete(key as keyof AppConfig);\n }\n }\n\n /**\n * Get all projects. Returns a fresh copy from the store.\n */\n getProjects(): Record<string, ProjectConfig> {\n return this.get<Record<string, ProjectConfig>>('projects') ?? {};\n }\n\n getProject(name: string): ProjectConfig | undefined {\n const projects = this.getProjects();\n return projects[name];\n }\n\n /**\n * Set a project with file locking to prevent race conditions.\n * This ensures atomic read-modify-write operations.\n */\n async setProjectSafe(name: string, config: ProjectConfig): Promise<void> {\n await this._lock.acquire();\n try {\n // Re-read projects from disk to get latest state\n const freshProjects = this._store.get('projects') ?? {};\n freshProjects[name] = config;\n this._store.set('projects', freshProjects as never);\n } finally {\n this._lock.release();\n }\n }\n\n /**\n * Synchronous version of setProject for backwards compatibility.\n * Note: This is less safe than setProjectSafe() in concurrent scenarios.\n * Consider migrating to setProjectSafe() for critical operations.\n */\n setProject(name: string, config: ProjectConfig): void {\n // Re-read from store to minimize race window\n const freshProjects = this._store.get('projects') ?? {};\n freshProjects[name] = config;\n this._store.set('projects', freshProjects as never);\n }\n\n /**\n * Delete a project with file locking to prevent race conditions.\n */\n async deleteProjectSafe(name: string): Promise<void> {\n await this._lock.acquire();\n try {\n // Re-read projects from disk to get latest state\n const freshProjects = this._store.get('projects') ?? {};\n delete freshProjects[name];\n this._store.set('projects', freshProjects as never);\n } finally {\n this._lock.release();\n }\n }\n\n /**\n * Synchronous version of deleteProject for backwards compatibility.\n */\n deleteProject(name: string): void {\n // Re-read from store to minimize race window\n const freshProjects = this._store.get('projects') ?? {};\n delete freshProjects[name];\n this._store.set('projects', freshProjects as never);\n }\n\n getDefaults(): ProjectDefaults | undefined {\n return this.get<ProjectDefaults>('project_defaults');\n }\n\n setDefaults(defaults: ProjectDefaults): void {\n this.set('project_defaults', defaults);\n }\n\n get path(): string {\n return this._store.path;\n }\n\n get store(): AppConfig {\n return this._store.store;\n }\n}\n","import File from 'phylo';\nimport deepAssign from 'deep-assign';\nimport type { ProjectConfig, EventsConfig, IdeType, ProjectDefaults } from '../types/index.js';\n\nexport class Project {\n name: string;\n private _base?: ReturnType<typeof File.from>;\n private _path?: ReturnType<typeof File.from>;\n private _ide?: IdeType;\n private _events: EventsConfig = {};\n private _branch?: string;\n private _homepage?: string;\n private _defaults: ProjectDefaults;\n private _initialCfg: ProjectConfig;\n\n constructor(name: string, cfg?: Partial<ProjectConfig>, defaults?: ProjectDefaults) {\n this._defaults = defaults ?? { base: '' };\n this._initialCfg = { path: name, events: {}, ...cfg };\n\n this.name = cfg?.name ?? name;\n\n // Apply defaults first, then config\n const merged = deepAssign({}, this._defaults, this._initialCfg) as ProjectConfig & {\n base?: string;\n };\n\n if (merged.base) {\n this.base = merged.base;\n }\n if (merged.path) {\n this.path = merged.path;\n }\n if (merged.ide) {\n this._ide = merged.ide;\n }\n if (merged.events) {\n this._events = merged.events;\n }\n if (merged.branch) {\n this._branch = merged.branch;\n }\n if (merged.homepage) {\n this._homepage = merged.homepage;\n }\n }\n\n set base(path: string) {\n this._base = File.from(path).absolutify();\n }\n\n get base(): ReturnType<typeof File.from> | undefined {\n return this._base;\n }\n\n set ide(cmd: IdeType | undefined) {\n this._ide = cmd;\n }\n\n get ide(): IdeType | undefined {\n return this._ide;\n }\n\n set events(eventCfg: EventsConfig) {\n this._events = eventCfg;\n }\n\n get events(): EventsConfig {\n return this._events;\n }\n\n set path(path: string) {\n const pathFile = File.from(path);\n if (this._base && !pathFile.isAbsolute()) {\n this._path = this._base.join(path);\n } else {\n this._path = pathFile;\n }\n this._path = this._path.absolutify();\n }\n\n get path(): ReturnType<typeof File.from> {\n if (!this._path) {\n throw new Error('Project path not set');\n }\n return this._path;\n }\n\n set branch(branch: string | undefined) {\n this._branch = branch;\n }\n\n get branch(): string | undefined {\n return this._branch;\n }\n\n set homepage(url: string | undefined) {\n this._homepage = url;\n }\n\n get homepage(): string | undefined {\n return this._homepage;\n }\n\n static $isProject = true;\n $isProject = true;\n}\n","import File from 'phylo';\nimport { simpleGit } from 'simple-git';\nimport { Config } from './config.js';\nimport { Project } from './project.js';\nimport type { Logger, ProjectConfig, ProjectDefaults } from '../types/index.js';\n\nexport class BaseEnvironment {\n $isProjectEnvironment = false as const;\n}\n\nexport class ProjectEnvironment {\n $isProjectEnvironment = true as const;\n project: Project;\n\n constructor(projectCfg: ProjectConfig & { name: string; exactName?: string }) {\n this.project = new Project(projectCfg.name, projectCfg);\n }\n\n static load(\n cfg: ProjectConfig & { name: string },\n defaults?: ProjectDefaults\n ): ProjectEnvironment {\n const project = new Project(cfg.name, cfg, defaults);\n return new ProjectEnvironment({ ...cfg, name: project.name });\n }\n}\n\nexport type Environment = BaseEnvironment | ProjectEnvironment;\n\ninterface ProjectWithPath {\n name: string;\n path: ReturnType<typeof File.from>;\n ide?: ProjectConfig['ide'];\n homepage?: string;\n events: ProjectConfig['events'];\n branch?: string;\n}\n\nexport class EnvironmentRecognizer {\n private static config: Config;\n private static log: Logger;\n private static projects: ProjectWithPath[] = [];\n private static configured = false;\n\n static configure(config: Config, log: Logger): void {\n if (this.configured) {\n return;\n }\n this.config = config;\n this.log = log;\n this.configured = true;\n }\n\n static async recognize(dir: string | ReturnType<typeof File.from>): Promise<Environment> {\n this.ensureConfigured();\n\n const theDir = File.from(dir).canonicalize();\n this.log.debug('Directory to recognize is: ' + theDir.canonicalPath());\n\n const allProjects = this.getAllProjects();\n const matching = allProjects.filter((p) => p.path.canonicalPath() === theDir.path);\n\n if (matching.length === 0) {\n return new BaseEnvironment();\n }\n\n this.log.debug(`Found ${matching.length} matching projects`);\n\n // Find base project (without branch suffix)\n const base = matching.find((p) => !p.name.includes('#')) ?? matching[0];\n this.log.debug('Base project is: ' + base.name);\n\n // Try to detect git branch\n const gitDir = base.path.up('.git');\n if (gitDir) {\n try {\n const git = simpleGit(gitDir.path);\n const branchSummary = await git.branchLocal();\n (base as ProjectWithPath & { branch?: string }).branch = branchSummary.current;\n } catch (error) {\n this.log.debug(`Git branch detection failed: ${(error as Error).message}`);\n }\n }\n\n return this.getProjectEnvironment(base, matching);\n }\n\n private static getAllProjects(refresh = false): ProjectWithPath[] {\n if (this.projects.length > 0 && !refresh) {\n return this.projects;\n }\n\n const defaults = this.config.getDefaults();\n const baseDir = defaults?.base ? File.from(defaults.base).absolutify() : null;\n const projectsMap = this.config.getProjects();\n\n this.projects = Object.entries(projectsMap).map(([name, project]) => {\n const projectPath = File.from(project.path);\n const resolvedPath =\n baseDir && !projectPath.isAbsolute() ? baseDir.join(project.path) : projectPath;\n\n return {\n ...project,\n name,\n path: resolvedPath,\n };\n });\n\n return this.projects;\n }\n\n private static getProjectEnvironment(\n base: ProjectWithPath & { branch?: string },\n _matching: ProjectWithPath[]\n ): ProjectEnvironment {\n const exactName = `${base.name}#${base.branch}`;\n\n // Check if there's an exact branch-specific config\n const exactProj = this.projects.find((p) => p.name === exactName);\n\n // Convert ProjectWithPath to ProjectConfig format (path as string)\n const toProjectConfig = (\n p: ProjectWithPath\n ): ProjectConfig & { name: string; exactName?: string } => ({\n name: p.name,\n path: p.path.path, // Convert PhyloFile to string path\n ide: p.ide,\n homepage: p.homepage,\n events: p.events,\n branch: p.branch,\n exactName,\n });\n\n if (exactProj) {\n return new ProjectEnvironment({ ...toProjectConfig(exactProj), branch: base.branch });\n }\n\n return new ProjectEnvironment(toProjectConfig(base));\n }\n\n private static ensureConfigured(): void {\n if (!this.configured) {\n // Use singleton instance to avoid multiple Config instances\n this.config = Config.getInstance();\n // Create a no-op logger if not configured\n this.log = {\n debug: () => {},\n info: () => {},\n log: () => {},\n warn: () => {},\n error: () => {},\n setLogLevel: () => {},\n };\n this.configured = true;\n }\n }\n}\n","import { spawn } from 'child_process';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventHelp,\n EventProcessingContext,\n} from '../../types/index.js';\n\nexport class CwdEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'cwd',\n displayName: 'Change directory (cwd)',\n description: 'Change current working directory to project path',\n category: 'core',\n requiresTmux: false,\n dependencies: [],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n return 'cwd config must be a boolean (true/false)';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<boolean> {\n return true;\n },\n getDefaultConfig(): boolean {\n return true;\n },\n };\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const projectPath = project.path.path;\n\n if (isShellMode) {\n // Use pushd so user can popd to go back\n shellCommands.push(`pushd \"${projectPath}\" > /dev/null`);\n } else {\n // Spawn a new interactive shell in the project directory and wait for it\n const shell = process.env.SHELL || '/bin/bash';\n const child = spawn(shell, ['-i'], {\n cwd: projectPath,\n stdio: 'inherit',\n });\n\n // Wait for the shell to exit\n await new Promise<void>((resolve, reject) => {\n child.on('close', () => resolve());\n child.on('error', (err) => reject(err));\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const projectPath = context.project.path.path;\n return [`pushd \"${projectPath}\" > /dev/null`];\n },\n };\n }\n\n static get tmux() {\n return null;\n }\n\n static get help(): EventHelp {\n return {\n usage: 'cwd: true | false',\n description: 'Change the current working directory to the project path',\n examples: [\n { config: true, description: 'Enable directory change' },\n { config: false, description: 'Disable directory change' },\n ],\n };\n }\n}\n\nexport default CwdEvent;\n","import { spawn } from 'child_process';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventHelp,\n EventProcessingContext,\n} from '../../types/index.js';\n\nexport class IdeEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'ide',\n displayName: 'Open in IDE',\n description: 'Open project in configured IDE/editor',\n category: 'core',\n requiresTmux: false,\n dependencies: [],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n return 'ide config must be a boolean (true/false)';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<boolean> {\n return true;\n },\n getDefaultConfig(): boolean {\n return true;\n },\n };\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const projectPath = project.path.path;\n const ide = project.ide || 'code';\n\n if (isShellMode) {\n // Disable job monitoring to suppress [n] pid and done messages\n // that interfere with tmux -CC control mode\n shellCommands.push(`set +m; ${ide} \"${projectPath}\" &>/dev/null &`);\n } else {\n spawn(ide, [projectPath], {\n detached: true,\n stdio: 'ignore',\n }).unref();\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const projectPath = context.project.path.path;\n const ide = context.project.ide || 'code';\n // Disable job monitoring to suppress [n] pid and done messages\n // that interfere with tmux -CC control mode\n return [`set +m; ${ide} \"${projectPath}\" &>/dev/null &`];\n },\n };\n }\n\n static get tmux() {\n return null;\n }\n\n static get help(): EventHelp {\n return {\n usage: 'ide: true | false',\n description: 'Open the project in the configured IDE',\n examples: [\n { config: true, description: 'Enable IDE opening' },\n { config: false, description: 'Disable IDE opening' },\n ],\n };\n }\n}\n\nexport default IdeEvent;\n","import { spawn } from 'child_process';\nimport { platform } from 'os';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventHelp,\n EventProcessingContext,\n} from '../../types/index.js';\n\nexport class WebEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'web',\n displayName: 'Open homepage in browser',\n description: 'Open project homepage in web browser',\n category: 'core',\n requiresTmux: false,\n dependencies: [],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n return 'web config must be a boolean (true/false)';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<boolean> {\n return true;\n },\n getDefaultConfig(): boolean {\n return true;\n },\n };\n }\n\n static getOpenCommand(): string {\n const os = platform();\n switch (os) {\n case 'darwin':\n return 'open';\n case 'win32':\n return 'start';\n default:\n return 'xdg-open';\n }\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const homepage = project.homepage;\n\n if (!homepage) {\n console.warn('No homepage configured for project');\n return;\n }\n\n const openCmd = WebEvent.getOpenCommand();\n\n if (isShellMode) {\n shellCommands.push(`${openCmd} \"${homepage}\" &`);\n } else {\n spawn(openCmd, [homepage], {\n detached: true,\n stdio: 'ignore',\n }).unref();\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const homepage = context.project.homepage;\n if (!homepage) return [];\n\n const openCmd = WebEvent.getOpenCommand();\n return [`${openCmd} \"${homepage}\" &`];\n },\n };\n }\n\n static get tmux() {\n return null;\n }\n\n static get help(): EventHelp {\n return {\n usage: 'web: true | false',\n description: 'Open the project homepage in the default browser',\n examples: [\n { config: true, description: 'Enable browser opening' },\n { config: false, description: 'Disable browser opening' },\n ],\n };\n }\n}\n\nexport default WebEvent;\n","import { spawn } from 'child_process';\nimport { input, confirm } from '@inquirer/prompts';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventTmux,\n EventHelp,\n EventProcessingContext,\n ClaudeConfig,\n} from '../../types/index.js';\n\nexport class ClaudeEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'claude',\n displayName: 'Launch Claude Code',\n description: 'Launch Claude Code with optional flags and configuration',\n category: 'development',\n requiresTmux: true,\n dependencies: ['claude'],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n\n if (typeof config === 'object' && config !== null) {\n const cfg = config as ClaudeConfig;\n\n if (cfg.flags !== undefined) {\n if (!Array.isArray(cfg.flags)) {\n return 'claude.flags must be an array of strings';\n }\n for (const flag of cfg.flags) {\n if (typeof flag !== 'string') {\n return 'claude.flags must contain only strings';\n }\n if (!flag.startsWith('-')) {\n return `Invalid flag \"${flag}\": flags must start with - or --`;\n }\n }\n }\n\n if (cfg.split_terminal !== undefined && typeof cfg.split_terminal !== 'boolean') {\n return 'claude.split_terminal must be a boolean';\n }\n\n return true;\n }\n\n return 'claude config must be a boolean or object with flags/split_terminal';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<boolean | ClaudeConfig> {\n const useAdvanced = await confirm({\n message: 'Configure advanced Claude options?',\n default: false,\n });\n\n if (!useAdvanced) {\n return true;\n }\n\n const flagsInput = await input({\n message: 'Enter Claude flags (comma-separated, e.g., --resume, --debug):',\n default: '',\n });\n\n const flags = flagsInput\n .split(',')\n .map((f) => f.trim())\n .filter((f) => f.length > 0 && f.startsWith('-'));\n\n const splitTerminal = await confirm({\n message: 'Use split terminal layout (Claude + shell)?',\n default: true,\n });\n\n if (flags.length === 0 && !splitTerminal) {\n return true;\n }\n\n const config: ClaudeConfig = {};\n if (flags.length > 0) config.flags = flags;\n if (splitTerminal) config.split_terminal = splitTerminal;\n\n return config;\n },\n getDefaultConfig(): boolean {\n return true;\n },\n };\n }\n\n static getClaudeCommand(config: boolean | ClaudeConfig | undefined): string {\n if (typeof config === 'boolean' || config === undefined) {\n return 'claude --dangerously-skip-permissions';\n }\n\n const flags = config.flags || [];\n return flags.length > 0\n ? `claude --dangerously-skip-permissions ${flags.join(' ')}`\n : 'claude --dangerously-skip-permissions';\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const claudeConfig = project.events.claude;\n const claudeCommand = ClaudeEvent.getClaudeCommand(claudeConfig as boolean | ClaudeConfig);\n\n if (isShellMode) {\n shellCommands.push(claudeCommand);\n } else {\n const args = claudeCommand.split(' ').slice(1);\n spawn('claude', args, {\n cwd: project.path.path,\n stdio: 'inherit',\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const claudeConfig = context.project.events.claude;\n return [ClaudeEvent.getClaudeCommand(claudeConfig as boolean | ClaudeConfig)];\n },\n };\n }\n\n static get tmux(): EventTmux {\n return {\n getLayoutPriority(): number {\n return 100; // High priority for Claude\n },\n contributeToLayout(enabledCommands: string[]): string {\n if (enabledCommands.includes('npm')) {\n return 'three-pane';\n }\n return 'split';\n },\n };\n }\n\n static get help(): EventHelp {\n return {\n usage: 'claude: true | { flags: string[], split_terminal: boolean }',\n description: 'Launch Claude Code in the project directory',\n examples: [\n { config: true, description: 'Launch Claude with defaults' },\n { config: { flags: ['--resume'] }, description: 'Resume previous session' },\n {\n config: { flags: ['--model', 'opus'], split_terminal: true },\n description: 'Use Opus model with split terminal',\n },\n ],\n };\n }\n}\n\nexport default ClaudeEvent;\n","import { spawn } from 'child_process';\nimport { input } from '@inquirer/prompts';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventHelp,\n EventProcessingContext,\n DockerConfig,\n} from '../../types/index.js';\n\nexport class DockerEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'docker',\n displayName: 'Docker container management',\n description: 'Start/stop Docker containers for the project',\n category: 'development',\n requiresTmux: false,\n dependencies: ['docker'],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n\n if (typeof config === 'string') {\n // Assume it's a compose file path\n return true;\n }\n\n if (typeof config === 'object' && config !== null) {\n const cfg = config as DockerConfig;\n\n if (cfg.compose_file !== undefined && typeof cfg.compose_file !== 'string') {\n return 'docker.compose_file must be a string';\n }\n\n if (cfg.services !== undefined) {\n if (!Array.isArray(cfg.services)) {\n return 'docker.services must be an array';\n }\n for (const service of cfg.services) {\n if (typeof service !== 'string') {\n return 'docker.services must contain only strings';\n }\n }\n }\n\n return true;\n }\n\n return 'docker config must be a boolean, string (compose file), or object';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<string | DockerConfig> {\n const composeFile = await input({\n message: 'Enter docker-compose file path:',\n default: 'docker-compose.yml',\n });\n\n const servicesInput = await input({\n message: 'Enter services to start (comma-separated, leave empty for all):',\n default: '',\n });\n\n const services = servicesInput\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n if (composeFile === 'docker-compose.yml' && services.length === 0) {\n return { compose_file: 'docker-compose.yml' };\n }\n\n if (services.length === 0) {\n return composeFile;\n }\n\n return {\n compose_file: composeFile,\n services,\n };\n },\n getDefaultConfig(): DockerConfig {\n return { compose_file: 'docker-compose.yml' };\n },\n };\n }\n\n static getDockerCommand(config: boolean | string | DockerConfig | undefined): string {\n if (typeof config === 'boolean' || config === undefined) {\n return 'docker-compose up -d';\n }\n\n if (typeof config === 'string') {\n return `docker-compose -f ${config} up -d`;\n }\n\n const composeFile = config.compose_file || 'docker-compose.yml';\n const services = config.services?.join(' ') || '';\n\n return `docker-compose -f ${composeFile} up -d ${services}`.trim();\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const dockerConfig = project.events.docker;\n const dockerCommand = DockerEvent.getDockerCommand(\n dockerConfig as boolean | string | DockerConfig\n );\n\n if (isShellMode) {\n shellCommands.push(dockerCommand);\n } else {\n const [cmd, ...args] = dockerCommand.split(' ');\n spawn(cmd, args, {\n cwd: project.path.path,\n stdio: 'inherit',\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const dockerConfig = context.project.events.docker;\n return [DockerEvent.getDockerCommand(dockerConfig as boolean | string | DockerConfig)];\n },\n };\n }\n\n static get tmux() {\n return null;\n }\n\n static get help(): EventHelp {\n return {\n usage: 'docker: true | \"compose-file.yml\" | { compose_file: string, services?: string[] }',\n description: 'Start Docker containers for the project',\n examples: [\n { config: true, description: 'Use default docker-compose.yml' },\n { config: 'docker-compose.dev.yml', description: 'Use custom compose file' },\n {\n config: { compose_file: 'docker-compose.yml', services: ['web', 'db'] },\n description: 'Start specific services',\n },\n ],\n };\n }\n}\n\nexport default DockerEvent;\n","import { spawn } from 'child_process';\nimport { input, confirm } from '@inquirer/prompts';\nimport type {\n EventMetadata,\n EventValidation,\n EventConfiguration,\n EventProcessing,\n EventTmux,\n EventHelp,\n EventProcessingContext,\n NpmConfig,\n} from '../../types/index.js';\n\nexport class NpmEvent {\n static get metadata(): EventMetadata {\n return {\n name: 'npm',\n displayName: 'Run NPM command',\n description: 'Execute NPM scripts in project directory',\n category: 'development',\n requiresTmux: true,\n dependencies: ['npm'],\n };\n }\n\n static get validation(): EventValidation {\n return {\n validateConfig(config: unknown): true | string {\n if (typeof config === 'boolean' || config === 'true' || config === 'false') {\n return true;\n }\n\n if (typeof config === 'string') {\n if (config.trim().length === 0) {\n return 'npm script name cannot be empty';\n }\n return true;\n }\n\n if (typeof config === 'object' && config !== null) {\n const cfg = config as NpmConfig;\n\n if (typeof cfg.command !== 'string' || cfg.command.trim().length === 0) {\n return 'npm.command must be a non-empty string';\n }\n\n if (cfg.watch !== undefined && typeof cfg.watch !== 'boolean') {\n return 'npm.watch must be a boolean';\n }\n\n if (cfg.auto_restart !== undefined && typeof cfg.auto_restart !== 'boolean') {\n return 'npm.auto_restart must be a boolean';\n }\n\n return true;\n }\n\n return 'npm config must be a boolean, string (script name), or object';\n },\n };\n }\n\n static get configuration(): EventConfiguration {\n return {\n async configureInteractive(): Promise<string | NpmConfig> {\n const scriptName = await input({\n message: 'Enter NPM script to run:',\n default: 'dev',\n });\n\n const useAdvanced = await confirm({\n message: 'Configure advanced NPM options?',\n default: false,\n });\n\n if (!useAdvanced) {\n return scriptName;\n }\n\n const watch = await confirm({\n message: 'Enable watch mode?',\n default: false,\n });\n\n const autoRestart = await confirm({\n message: 'Auto-restart on crash?',\n default: false,\n });\n\n if (!watch && !autoRestart) {\n return scriptName;\n }\n\n return {\n command: scriptName,\n watch,\n auto_restart: autoRestart,\n };\n },\n getDefaultConfig(): string {\n return 'dev';\n },\n };\n }\n\n static getNpmCommand(config: boolean | string | NpmConfig | undefined): string {\n if (typeof config === 'boolean' || config === undefined) {\n return 'npm run dev';\n }\n\n if (typeof config === 'string') {\n return `npm run ${config}`;\n }\n\n return `npm run ${config.command}`;\n }\n\n static get processing(): EventProcessing {\n return {\n async processEvent(context: EventProcessingContext): Promise<void> {\n const { project, isShellMode, shellCommands } = context;\n const npmConfig = project.events.npm;\n const npmCommand = NpmEvent.getNpmCommand(npmConfig as boolean | string | NpmConfig);\n\n if (isShellMode) {\n shellCommands.push(npmCommand);\n } else {\n const [cmd, ...args] = npmCommand.split(' ');\n spawn(cmd, args, {\n cwd: project.path.path,\n stdio: 'inherit',\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const npmConfig = context.project.events.npm;\n return [NpmEvent.getNpmCommand(npmConfig as boolean | string | NpmConfig)];\n },\n };\n }\n\n static get tmux(): EventTmux {\n return {\n getLayoutPriority(): number {\n return 50; // Medium priority\n },\n contributeToLayout(enabledCommands: string[]): string {\n if (enabledCommands.includes('claude')) {\n return 'three-pane';\n }\n return 'two-pane-npm';\n },\n };\n }\n\n static get help(): EventHelp {\n return {\n usage: 'npm: true | \"script\" | { command: string, watch?: boolean, auto_restart?: boolean }',\n description: 'Run an NPM script in the project directory',\n examples: [\n { config: true, description: 'Run npm run dev' },\n { config: 'test', description: 'Run npm run test' },\n { config: { command: 'dev', watch: true }, description: 'Run dev with watch mode' },\n ],\n };\n }\n}\n\nexport default NpmEvent;\n","import type { EventHandlerClass, EventMetadata } from '../types/index.js';\n\n// Explicit imports for all events (works with bundled builds)\nimport { CwdEvent } from './core/cwd.js';\nimport { IdeEvent } from './core/ide.js';\nimport { WebEvent } from './core/web.js';\nimport { ClaudeEvent } from './extensions/claude.js';\nimport { DockerEvent } from './extensions/docker.js';\nimport { NpmEvent } from './extensions/npm.js';\n\n// All available event classes\nconst ALL_EVENTS = [CwdEvent, IdeEvent, WebEvent, ClaudeEvent, DockerEvent, NpmEvent] as const;\n\n/**\n * Event Registry for management of events\n * Uses explicit imports to work with bundled builds\n */\nclass EventRegistryClass {\n private _events = new Map<string, EventHandlerClass>();\n private _initialized = false;\n\n /**\n * Initialize the registry by registering all events\n */\n async initialize(): Promise<void> {\n if (this._initialized) return;\n\n this.registerEvents();\n this._initialized = true;\n }\n\n /**\n * Register all event classes\n */\n private registerEvents(): void {\n for (const EventClass of ALL_EVENTS) {\n if (this.isValidEventClass(EventClass)) {\n this._events.set(EventClass.metadata.name, EventClass);\n }\n }\n }\n\n /**\n * Type guard to check if an object is a valid EventHandlerClass\n */\n private isValidEventClass(obj: unknown): obj is EventHandlerClass {\n if (typeof obj !== 'function' && typeof obj !== 'object') return false;\n if (obj === null) return false;\n\n const candidate = obj as Partial<EventHandlerClass>;\n return (\n candidate.metadata !== undefined &&\n typeof candidate.metadata.name === 'string' &&\n typeof candidate.metadata.displayName === 'string' &&\n candidate.validation !== undefined &&\n typeof candidate.validation.validateConfig === 'function' &&\n candidate.configuration !== undefined &&\n typeof candidate.configuration.configureInteractive === 'function' &&\n candidate.processing !== undefined &&\n typeof candidate.processing.processEvent === 'function'\n );\n }\n\n /**\n * Get all valid event names from registered events\n */\n getValidEventNames(): string[] {\n this.ensureInitialized();\n return Array.from(this._events.keys());\n }\n\n /**\n * Get event by name\n */\n getEventByName(name: string): EventHandlerClass | null {\n this.ensureInitialized();\n return this._events.get(name) ?? null;\n }\n\n /**\n * Get all events for management UI\n */\n getEventsForManageUI(): Array<{ name: string; value: string; description: string }> {\n this.ensureInitialized();\n\n const events: Array<{ name: string; value: string; description: string }> = [];\n for (const [name, eventClass] of this._events) {\n events.push({\n name: eventClass.metadata.displayName,\n value: name,\n description: eventClass.metadata.description,\n });\n }\n\n return events.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Get events that support tmux integration\n */\n getTmuxEnabledEvents(): Array<{ name: string; event: EventHandlerClass; priority: number }> {\n this.ensureInitialized();\n\n const tmuxEvents: Array<{ name: string; event: EventHandlerClass; priority: number }> = [];\n for (const [name, eventClass] of this._events) {\n const tmux = eventClass.tmux;\n if (tmux) {\n tmuxEvents.push({\n name,\n event: eventClass,\n priority: tmux.getLayoutPriority(),\n });\n }\n }\n\n return tmuxEvents.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Get all available events with their metadata\n */\n getAllEvents(): Array<{\n name: string;\n metadata: EventMetadata;\n hasValidation: boolean;\n hasConfiguration: boolean;\n hasProcessing: boolean;\n hasTmux: boolean;\n hasHelp: boolean;\n }> {\n this.ensureInitialized();\n\n const events = [];\n for (const [name, eventClass] of this._events) {\n events.push({\n name,\n metadata: eventClass.metadata,\n hasValidation: !!eventClass.validation,\n hasConfiguration: !!eventClass.configuration,\n hasProcessing: !!eventClass.processing,\n hasTmux: !!eventClass.tmux,\n hasHelp: !!eventClass.help,\n });\n }\n\n return events;\n }\n\n /**\n * Ensure registry is initialized\n */\n private ensureInitialized(): void {\n if (!this._initialized) {\n throw new Error('EventRegistry must be initialized before use. Call initialize() first.');\n }\n }\n\n /**\n * Clear the registry (useful for testing)\n */\n clear(): void {\n this._events.clear();\n this._initialized = false;\n }\n}\n\n// Export singleton instance\nexport const EventRegistry = new EventRegistryClass();\n","/**\n * Shell command sanitization utilities.\n * Prevents shell injection attacks from malicious project names or paths.\n */\n\n/**\n * Sanitize a string for safe use as a shell identifier (e.g., tmux session name).\n * Only allows alphanumeric characters, underscores, hyphens, and dots.\n * All other characters are replaced with underscores.\n */\nexport function sanitizeForShell(input: string): string {\n if (!input) return '';\n return input.replace(/[^a-zA-Z0-9_\\-.]/g, '_');\n}\n\n/**\n * Escape a string for safe use in a double-quoted shell context.\n * Escapes characters that have special meaning in double quotes: $, `, \\, \", !\n */\nexport function escapeShellArg(input: string): string {\n if (!input) return '';\n return input.replace(/([\\\\$`\"!])/g, '\\\\$1');\n}\n\n/**\n * Escape a string for safe use in a single-quoted shell context.\n * Single quotes prevent all interpolation, but we need to handle\n * embedded single quotes by ending the string, adding an escaped quote,\n * and restarting the string.\n */\nexport function escapeForSingleQuotes(input: string): string {\n if (!input) return '';\n return input.replace(/'/g, \"'\\\\''\");\n}\n","import { exec as execCallback, spawn } from 'child_process';\nimport { promisify } from 'util';\nimport { sanitizeForShell, escapeForSingleQuotes } from './sanitize.js';\n\nconst exec = promisify(execCallback);\n\n/**\n * Wraps a command so it falls back to a shell when the command exits.\n * This prevents tmux panes from showing \"Pane is dead\" after a process ends.\n */\nfunction wrapWithShellFallback(command: string): string {\n // Use $SHELL to get the user's preferred shell.\n // Note: We use simple $SHELL syntax (not ${SHELL:-default}) for compatibility\n // with non-POSIX shells like fish and csh that tmux may use to execute commands.\n return `${command}; exec $SHELL`;\n}\n\nexport class TmuxManager {\n private sessionPrefix = 'workon-';\n\n async isTmuxAvailable(): Promise<boolean> {\n try {\n await exec('which tmux');\n return true;\n } catch {\n return false;\n }\n }\n\n async sessionExists(sessionName: string): Promise<boolean> {\n try {\n // sessionName is already sanitized by getSessionName\n await exec(`tmux has-session -t '${escapeForSingleQuotes(sessionName)}'`);\n return true;\n } catch {\n return false;\n }\n }\n\n getSessionName(projectName: string): string {\n // Sanitize project name to prevent shell injection\n return `${this.sessionPrefix}${sanitizeForShell(projectName)}`;\n }\n\n getWorktreeSessionName(projectName: string, worktreeName: string): string {\n // Session name format: workon-{project}-{worktree}\n const sanitizedProject = sanitizeForShell(projectName);\n const sanitizedWorktree = sanitizeForShell(worktreeName);\n return `${this.sessionPrefix}${sanitizedProject}-${sanitizedWorktree}`;\n }\n\n async killSession(sessionName: string): Promise<boolean> {\n try {\n await exec(`tmux kill-session -t '${escapeForSingleQuotes(sessionName)}'`);\n return true;\n } catch {\n return false;\n }\n }\n\n async createSplitSession(\n projectName: string,\n projectPath: string,\n claudeArgs: string[] = []\n ): Promise<string> {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n\n // Kill existing session if it exists\n if (await this.sessionExists(sessionName)) {\n await this.killSession(sessionName);\n }\n\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n\n // Create new tmux session with claude in the first pane\n await exec(\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`\n );\n\n // Split window horizontally and run shell in second pane\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`);\n\n // Set focus on claude pane (left pane)\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n\n return sessionName;\n }\n\n async createThreePaneSession(\n projectName: string,\n projectPath: string,\n claudeArgs: string[] = [],\n npmCommand = 'npm run dev'\n ): Promise<string> {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n\n // Kill existing session if it exists\n if (await this.sessionExists(sessionName)) {\n await this.killSession(sessionName);\n }\n\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n // Create new tmux session with claude in the first pane (left side)\n await exec(\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`\n );\n\n // Split window vertically - creates right side (50/50 split)\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`);\n\n // Split the right pane horizontally - creates top-right and bottom-right (50/50 split)\n await exec(\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${wrappedNpmCmd}'`\n );\n\n // Resize panes to ensure npm pane is visible (give it at least 10 lines)\n await exec(`tmux resize-pane -t '${escapedSession}:0.2' -y 10`);\n\n // Set focus on claude pane (left pane)\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n\n return sessionName;\n }\n\n async createTwoPaneNpmSession(\n projectName: string,\n projectPath: string,\n npmCommand = 'npm run dev'\n ): Promise<string> {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n // Kill existing session if it exists\n if (await this.sessionExists(sessionName)) {\n await this.killSession(sessionName);\n }\n\n // Create new tmux session with shell in the first pane (left side)\n await exec(`tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`);\n\n // Split window vertically and run npm command in right pane\n await exec(\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}' '${wrappedNpmCmd}'`\n );\n\n // Set focus on terminal pane (left pane)\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n\n return sessionName;\n }\n\n async attachToSession(sessionName: string): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n\n // Check if we're already in a tmux session\n if (process.env.TMUX) {\n // If we're already in tmux, switch to the session\n await exec(`tmux switch-client -t '${escapedSession}'`);\n } else {\n // Check if iTerm2 integration is available\n const isITerm =\n process.env.TERM_PROGRAM === 'iTerm.app' ||\n process.env.LC_TERMINAL === 'iTerm2' ||\n !!process.env.ITERM_SESSION_ID;\n const useiTermIntegration = isITerm && !process.env.TMUX_CC_NOT_SUPPORTED;\n\n if (useiTermIntegration) {\n // Use iTerm2 tmux integration - spawn detached to avoid blocking\n spawn('tmux', ['-CC', 'attach-session', '-t', sessionName], {\n stdio: 'inherit',\n detached: true,\n });\n } else {\n // Use regular tmux - spawn detached to avoid blocking\n spawn('tmux', ['attach-session', '-t', sessionName], {\n stdio: 'inherit',\n detached: true,\n });\n }\n }\n }\n\n buildShellCommands(\n projectName: string,\n projectPath: string,\n claudeArgs: string[] = []\n ): string[] {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n\n return [\n `# Create tmux split session for ${sanitizeForShell(projectName)}`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n this.getAttachCommand(sessionName),\n ];\n }\n\n buildThreePaneShellCommands(\n projectName: string,\n projectPath: string,\n claudeArgs: string[] = [],\n npmCommand = 'npm run dev'\n ): string[] {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n return [\n `# Create tmux three-pane session for ${sanitizeForShell(projectName)}`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${wrappedNpmCmd}'`,\n `tmux resize-pane -t '${escapedSession}:0.2' -y 10`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n this.getAttachCommand(sessionName),\n ];\n }\n\n buildTwoPaneNpmShellCommands(\n projectName: string,\n projectPath: string,\n npmCommand = 'npm run dev'\n ): string[] {\n const sessionName = this.getSessionName(projectName);\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(projectPath);\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n return [\n `# Create tmux two-pane session with npm for ${sanitizeForShell(projectName)}`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}' '${wrappedNpmCmd}'`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n this.getAttachCommand(sessionName),\n ];\n }\n\n private getAttachCommand(sessionName: string): string {\n const escapedSession = escapeForSingleQuotes(sessionName);\n\n if (process.env.TMUX) {\n return `tmux switch-client -t '${escapedSession}'`;\n }\n\n const isITerm =\n process.env.TERM_PROGRAM === 'iTerm.app' ||\n process.env.LC_TERMINAL === 'iTerm2' ||\n process.env.ITERM_SESSION_ID;\n const useiTermIntegration = isITerm && !process.env.TMUX_CC_NOT_SUPPORTED;\n\n if (useiTermIntegration) {\n return `tmux -CC attach-session -t '${escapedSession}'`;\n }\n return `tmux attach-session -t '${escapedSession}'`;\n }\n\n async listWorkonSessions(): Promise<string[]> {\n try {\n const { stdout } = await exec('tmux list-sessions -F \"#{session_name}\"');\n return stdout\n .trim()\n .split('\\n')\n .filter((session) => session.startsWith(this.sessionPrefix))\n .map((session) => session.replace(this.sessionPrefix, ''));\n } catch {\n return [];\n }\n }\n}\n","import type { IdeType } from './index.js';\n\n/**\n * IDE choice options for interactive selection prompts.\n * Shared between interactive.ts and manage.ts.\n */\nexport const IDE_CHOICES = [\n { name: 'Cursor', value: 'cursor' as IdeType },\n { name: 'Visual Studio Code', value: 'vscode' as IdeType },\n { name: 'Visual Studio Code (code)', value: 'code' as IdeType },\n { name: 'IntelliJ IDEA', value: 'idea' as IdeType },\n { name: 'Atom', value: 'atom' as IdeType },\n { name: 'Sublime Text', value: 'subl' as IdeType },\n { name: 'Vim', value: 'vim' as IdeType },\n { name: 'Emacs', value: 'emacs' as IdeType },\n] as const;\n","import { exec as execCallback } from 'child_process';\nimport { promisify } from 'util';\nimport { existsSync, chmodSync } from 'fs';\nimport { join, basename } from 'path';\nimport { createHash } from 'crypto';\nimport { homedir } from 'os';\nimport { simpleGit, SimpleGit } from 'simple-git';\n\nconst exec = promisify(execCallback);\n\nexport interface WorktreeInfo {\n path: string;\n branch: string;\n head: string;\n isMain: boolean;\n name: string;\n}\n\nexport interface AddWorktreeOptions {\n branch: string;\n baseBranch?: string;\n force?: boolean;\n}\n\nexport interface MergeOptions {\n targetBranch: string;\n squash?: boolean;\n}\n\nconst WORKON_DIR = '.workon';\nconst WORKTREES_SUBDIR = 'worktrees';\nconst HOOK_DIR = '.workon';\nconst SETUP_HOOK = 'worktree-setup.sh';\n\n/**\n * Generate a short hash from a path for disambiguation\n */\nfunction shortHash(input: string): string {\n return createHash('sha256').update(input).digest('hex').substring(0, 8);\n}\n\n/**\n * Derive a unique project identifier from the project path\n * Uses basename + short hash of full path for uniqueness\n */\nexport function deriveProjectIdentifier(projectPath: string): string {\n const name = basename(projectPath);\n const hash = shortHash(projectPath);\n return `${name}-${hash}`;\n}\n\n/**\n * Get the worktrees directory for a project\n */\nexport function getWorktreesDirForProject(projectIdentifier: string): string {\n return join(homedir(), WORKON_DIR, WORKTREES_SUBDIR, projectIdentifier);\n}\n\nexport class WorktreeManager {\n private projectPath: string;\n private projectIdentifier: string;\n private git: SimpleGit;\n\n constructor(projectPath: string, _projectName?: string) {\n this.projectPath = projectPath;\n // Always use derived identifier for consistency between creation and detection\n // The project name parameter is kept for potential future use (e.g., display)\n this.projectIdentifier = deriveProjectIdentifier(projectPath);\n this.git = simpleGit(projectPath);\n }\n\n /**\n * Check if the project is a git repository\n */\n async isGitRepository(): Promise<boolean> {\n try {\n await this.git.revparse(['--git-dir']);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the worktrees directory path\n * Stored at ~/.workon/worktrees/{project-identifier}/\n */\n getWorktreesDir(): string {\n return join(homedir(), WORKON_DIR, WORKTREES_SUBDIR, this.projectIdentifier);\n }\n\n /**\n * Convert branch name to directory name (replace slashes with dashes)\n */\n branchToDir(branch: string): string {\n return branch.replace(/\\//g, '-');\n }\n\n /**\n * List all worktrees for this repository\n */\n async list(): Promise<WorktreeInfo[]> {\n const result = await this.git.raw(['worktree', 'list', '--porcelain']);\n return this.parseWorktreeList(result);\n }\n\n /**\n * List only worktrees managed by workon (under .worktrees/)\n */\n async listManagedWorktrees(): Promise<WorktreeInfo[]> {\n const all = await this.list();\n const worktreesDir = this.getWorktreesDir();\n return all.filter((wt) => wt.path.startsWith(worktreesDir));\n }\n\n /**\n * Get a specific worktree by name (searches all worktrees, not just managed ones)\n */\n async get(name: string): Promise<WorktreeInfo | null> {\n const worktrees = await this.list();\n // Search by name or branch name\n return (\n worktrees.find(\n (wt) => wt.name === name || wt.branch === name || this.branchToDir(wt.branch) === name\n ) || null\n );\n }\n\n /**\n * Create a new worktree\n */\n async add(options: AddWorktreeOptions): Promise<WorktreeInfo> {\n const { branch, baseBranch, force } = options;\n const dirName = this.branchToDir(branch);\n const worktreePath = join(this.getWorktreesDir(), dirName);\n\n // Check if worktree already exists\n const existing = await this.get(dirName);\n if (existing) {\n if (!force) {\n throw new Error(`Worktree '${dirName}' already exists at ${existing.path}`);\n }\n // Force specified: remove existing worktree first\n await this.git.raw(['worktree', 'remove', '--force', existing.path]);\n }\n\n // Check if branch exists\n const branchExists = await this.branchExists(branch);\n\n const args = ['worktree', 'add'];\n\n if (branchExists) {\n // Checkout existing branch - use --force in case branch is checked out elsewhere\n if (force) {\n args.push('--force');\n }\n args.push(worktreePath, branch);\n } else {\n // Create new branch from baseBranch or current HEAD\n args.push('-b', branch, worktreePath);\n if (baseBranch) {\n args.push(baseBranch);\n }\n }\n\n await this.git.raw(args);\n\n // Return the created worktree info\n const worktree = await this.get(dirName);\n if (!worktree) {\n throw new Error('Failed to create worktree');\n }\n return worktree;\n }\n\n /**\n * Remove a worktree\n */\n async remove(name: string, force = false): Promise<void> {\n const worktree = await this.get(name);\n if (!worktree) {\n throw new Error(`Worktree '${name}' not found`);\n }\n\n if (worktree.isMain) {\n throw new Error('Cannot remove the main worktree');\n }\n\n // If the directory is missing, force is required for git worktree remove\n const pathMissing = !existsSync(worktree.path);\n\n // Check for uncommitted changes (skipped if directory is missing)\n if (!pathMissing && !force && (await this.hasUncommittedChanges(name))) {\n throw new Error(`Worktree '${name}' has uncommitted changes. Use --force to remove anyway.`);\n }\n\n const args = ['worktree', 'remove'];\n if (force || pathMissing) {\n args.push('--force');\n }\n args.push(worktree.path);\n\n await this.git.raw(args);\n }\n\n /**\n * Check if a worktree has uncommitted changes\n * Accepts worktree name, branch name, or path\n */\n async hasUncommittedChanges(nameOrPath: string): Promise<boolean> {\n // Try to find by name first\n let worktree = await this.get(nameOrPath);\n\n // If not found and looks like a path, try direct access\n if (!worktree && nameOrPath.startsWith('/')) {\n const all = await this.list();\n worktree = all.find((wt) => wt.path === nameOrPath) || null;\n }\n\n if (!worktree) {\n throw new Error(`Worktree '${nameOrPath}' not found`);\n }\n\n // If the directory doesn't exist on disk, there are no changes to lose\n if (!existsSync(worktree.path)) {\n return false;\n }\n\n const worktreeGit = simpleGit(worktree.path);\n const status = await worktreeGit.status();\n return !status.isClean();\n }\n\n /**\n * Get the current branch of the main worktree\n */\n async getCurrentBranch(): Promise<string> {\n const branch = await this.git.revparse(['--abbrev-ref', 'HEAD']);\n return branch.trim();\n }\n\n /**\n * Get all local branches\n */\n async getBranches(): Promise<string[]> {\n const result = await this.git.branchLocal();\n return result.all;\n }\n\n /**\n * Check if a branch exists\n */\n async branchExists(branch: string): Promise<boolean> {\n try {\n await this.git.revparse(['--verify', `refs/heads/${branch}`]);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Merge a worktree's branch into a target branch\n */\n async merge(name: string, options: MergeOptions): Promise<void> {\n const worktree = await this.get(name);\n if (!worktree) {\n throw new Error(`Worktree '${name}' not found`);\n }\n\n const { targetBranch, squash } = options;\n\n // Ensure target branch exists\n if (!(await this.branchExists(targetBranch))) {\n throw new Error(`Target branch '${targetBranch}' does not exist`);\n }\n\n // Checkout target branch in main worktree\n await this.git.checkout(targetBranch);\n\n // Merge the worktree's branch\n const mergeArgs = ['merge'];\n if (squash) {\n mergeArgs.push('--squash');\n }\n mergeArgs.push(worktree.branch);\n\n await this.git.raw(mergeArgs);\n\n // If squash merge, we need to commit\n if (squash) {\n await this.git.commit(`Merge ${worktree.branch} into ${targetBranch} (squashed)`);\n }\n }\n\n /**\n * Check if a post-setup hook exists\n */\n hasSetupHook(): boolean {\n const hookPath = this.getSetupHookPath();\n return existsSync(hookPath);\n }\n\n /**\n * Get the path to the setup hook\n */\n getSetupHookPath(): string {\n return join(this.projectPath, HOOK_DIR, SETUP_HOOK);\n }\n\n /**\n * Run the post-setup hook for a worktree\n */\n async runPostSetupHook(worktreePath: string): Promise<{ stdout: string; stderr: string }> {\n const hookPath = this.getSetupHookPath();\n\n if (!existsSync(hookPath)) {\n throw new Error('Setup hook not found');\n }\n\n // Ensure hook is executable\n try {\n chmodSync(hookPath, '755');\n } catch {\n // Ignore chmod errors on systems that don't support it\n }\n\n const env = {\n ...process.env,\n WORKTREE_PATH: worktreePath,\n PROJECT_PATH: this.projectPath,\n };\n\n const { stdout, stderr } = await exec(hookPath, {\n cwd: worktreePath,\n env,\n });\n\n return { stdout, stderr };\n }\n\n /**\n * Parse the porcelain output of git worktree list\n */\n private parseWorktreeList(output: string): WorktreeInfo[] {\n const worktrees: WorktreeInfo[] = [];\n const blocks = output.trim().split('\\n\\n');\n\n for (const block of blocks) {\n if (!block.trim()) continue;\n\n const lines = block.split('\\n');\n let path = '';\n let head = '';\n let branch = '';\n let isMain = false;\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n path = line.substring('worktree '.length);\n // First worktree is the main one\n isMain = worktrees.length === 0;\n } else if (line.startsWith('HEAD ')) {\n head = line.substring('HEAD '.length);\n } else if (line.startsWith('branch ')) {\n // Format: branch refs/heads/branch-name\n branch = line.substring('branch refs/heads/'.length);\n } else if (line === 'detached') {\n branch = '(detached)';\n }\n }\n\n if (path) {\n // Calculate name from path\n const worktreesDir = this.getWorktreesDir();\n let name: string;\n if (path.startsWith(worktreesDir)) {\n // Managed worktree under ~/.workon/worktrees/{project}/\n name = basename(path);\n } else if (path === this.projectPath) {\n // Main worktree\n name = '(main)';\n } else {\n // External worktree - use branch name converted to dir format, or basename\n name = branch && branch !== '(detached)' ? this.branchToDir(branch) : basename(path);\n }\n\n worktrees.push({\n path,\n branch,\n head,\n isMain,\n name,\n });\n }\n }\n\n return worktrees;\n }\n}\n","import File from 'phylo';\nimport path from 'path';\nimport { simpleGit } from 'simple-git';\nimport { deriveProjectIdentifier, getWorktreesDirForProject } from '../../lib/worktree.js';\nimport { select, checkbox, confirm, input } from '@inquirer/prompts';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger, ProjectConfig, EventsConfig } from '../../types/index.js';\nimport { EventRegistry } from '../../events/registry.js';\nimport { IDE_CHOICES } from '../../types/constants.js';\n\n/**\n * Context about whether we're inside a git worktree\n */\nexport interface WorktreeInfo {\n isWorktree: boolean; // True if we're inside a worktree (not main repo)\n worktreePath: string | null; // Path to current worktree root (if in worktree)\n mainRepoPath: string; // Path to main repository\n worktreeName: string | null; // Name of worktree (directory name)\n branch: string | null; // Current branch in worktree\n}\n\n/**\n * Context returned when resolving a project from the current working directory\n */\nexport interface ProjectContext {\n projectPath: string; // Absolute path to main repo (even if in worktree)\n projectName: string | null; // Name if registered, null otherwise\n projectConfig: ProjectConfig | null;\n isRegistered: boolean;\n worktreeInfo: WorktreeInfo; // Info about worktree context\n}\n\n/**\n * Detect if we're inside a git worktree and get context about it\n */\nexport async function detectWorktreeContext(\n cwd: string = process.cwd()\n): Promise<WorktreeInfo | null> {\n try {\n const git = simpleGit(cwd);\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n return null;\n }\n\n // Get the git directory and common directory\n // --git-dir returns the .git dir for current worktree\n // --git-common-dir returns the shared .git dir (main repo's .git)\n const gitDir = (await git.revparse(['--git-dir'])).trim();\n const gitCommonDir = (await git.revparse(['--git-common-dir'])).trim();\n const worktreeRoot = (await git.revparse(['--show-toplevel'])).trim();\n\n // Normalize paths for comparison\n const normalizedGitDir = path.resolve(cwd, gitDir);\n const normalizedCommonDir = path.resolve(cwd, gitCommonDir);\n\n // If git-dir and git-common-dir are different, we're in a worktree\n const isWorktree = normalizedGitDir !== normalizedCommonDir;\n\n if (isWorktree) {\n // We're in a worktree - find the main repo path\n // The common dir is inside the main repo's .git folder\n const mainRepoPath = path.dirname(normalizedCommonDir);\n\n // Get current branch\n let branch: string | null = null;\n try {\n branch = (await git.revparse(['--abbrev-ref', 'HEAD'])).trim();\n if (branch === 'HEAD') branch = '(detached)';\n } catch {\n branch = '(detached)';\n }\n\n // Find the worktree name by querying git worktree list from main repo\n // This ensures we get the correct name that WorktreeManager.get() expects\n const worktreeName = await findWorktreeNameByPath(mainRepoPath, worktreeRoot);\n\n return {\n isWorktree: true,\n worktreePath: worktreeRoot,\n mainRepoPath,\n worktreeName,\n branch,\n };\n } else {\n // We're in the main repository\n return {\n isWorktree: false,\n worktreePath: null,\n mainRepoPath: worktreeRoot,\n worktreeName: null,\n branch: null,\n };\n }\n } catch {\n return null;\n }\n}\n\n/**\n * Find a worktree's name by its path by querying git worktree list\n * Returns the name that WorktreeManager uses (branch-derived for external worktrees)\n */\nasync function findWorktreeNameByPath(\n mainRepoPath: string,\n worktreePath: string\n): Promise<string | null> {\n try {\n const git = simpleGit(mainRepoPath);\n const result = await git.raw(['worktree', 'list', '--porcelain']);\n\n const blocks = result.trim().split('\\n\\n');\n // Project-specific worktrees directory: ~/.workon/worktrees/{project-identifier}/\n // Use derived identifier since we don't know if the project is registered\n const projectIdentifier = deriveProjectIdentifier(mainRepoPath);\n const projectWorktreesDir = getWorktreesDirForProject(projectIdentifier);\n\n for (const block of blocks) {\n if (!block.trim()) continue;\n\n const lines = block.split('\\n');\n let wtPath = '';\n let branch = '';\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n wtPath = line.substring('worktree '.length);\n } else if (line.startsWith('branch ')) {\n branch = line.substring('branch refs/heads/'.length);\n } else if (line === 'detached') {\n branch = '(detached)';\n }\n }\n\n // Check if this is the worktree we're looking for\n if (wtPath === worktreePath) {\n // Use the same naming logic as WorktreeManager.parseWorktreeList\n if (wtPath.startsWith(projectWorktreesDir)) {\n // Managed worktree under ~/.workon/worktrees/{project}/\n return path.basename(wtPath);\n } else {\n // External worktree - use branch name converted to dir format, or basename\n return branch && branch !== '(detached)'\n ? branch.replace(/\\//g, '-')\n : path.basename(wtPath);\n }\n }\n }\n\n // Fallback to basename if not found (shouldn't happen)\n return path.basename(worktreePath);\n } catch {\n return path.basename(worktreePath);\n }\n}\n\n/**\n * Resolve the project from the current working directory\n * Finds the git root and checks if it's a registered project.\n * If inside a worktree, uses the main repo path for registration lookup.\n */\nexport async function resolveProjectFromCwd(\n config: Config,\n log: Logger\n): Promise<ProjectContext | null> {\n const cwd = process.cwd();\n\n // Detect worktree context\n const worktreeInfo = await detectWorktreeContext(cwd);\n if (!worktreeInfo) {\n return null;\n }\n\n // Use the main repo path for project lookup (not worktree path)\n const projectPath = worktreeInfo.mainRepoPath;\n\n if (worktreeInfo.isWorktree) {\n log.debug(`Inside worktree '${worktreeInfo.worktreeName}', main repo at ${projectPath}`);\n }\n\n // Search registered projects by comparing absolute paths\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n const basePath = defaults?.base || '';\n\n for (const [name, projectConfig] of Object.entries(projects)) {\n // Skip branch configs (contain #)\n if (name.includes('#')) continue;\n\n // Resolve the configured path to absolute\n let configuredPath: string;\n const configPath = File.from(projectConfig.path);\n\n if (configPath.path.startsWith('/') || configPath.path.startsWith('~')) {\n configuredPath = configPath.absolutify().path;\n } else if (basePath) {\n configuredPath = File.from(basePath).absolutify().join(projectConfig.path).path;\n } else {\n configuredPath = configPath.absolutify().path;\n }\n\n // Compare paths\n if (configuredPath === projectPath) {\n log.debug(`Found registered project '${name}' at ${projectPath}`);\n return {\n projectPath,\n projectName: name,\n projectConfig,\n isRegistered: true,\n worktreeInfo,\n };\n }\n }\n\n // Not registered\n log.debug(`Project at ${projectPath} is not registered`);\n return {\n projectPath,\n projectName: null,\n projectConfig: null,\n isRegistered: false,\n worktreeInfo,\n };\n}\n\n/**\n * Prompt to register a project that was found but not registered\n * Uses similar logic to the interactive add flow\n */\nexport async function promptToRegisterProject(\n projectPath: string,\n config: Config,\n log: Logger\n): Promise<{ projectName: string; projectConfig: ProjectConfig } | null> {\n const shouldAdd = await confirm({\n message: 'This project is not registered. Would you like to add it now?',\n default: true,\n });\n\n if (!shouldAdd) {\n return null;\n }\n\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n // Suggest a name based on directory\n const suggestedName = path.basename(projectPath);\n\n const name = await input({\n message: 'Project name:',\n default: suggestedName,\n validate: (value) => {\n if (!value.trim()) return 'Name is required';\n if (!/^[\\w-]+$/.test(value))\n return 'Name can only contain letters, numbers, underscores, and hyphens';\n if (value in projects) return 'Project already exists';\n return true;\n },\n });\n\n // Calculate relative path if we have a base\n let relativePath = projectPath;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base).absolutify();\n const projectFile = File.from(projectPath);\n try {\n if (projectFile.path.startsWith(baseDir.path)) {\n relativePath = projectFile.relativize(baseDir.path).path;\n }\n } catch {\n // Keep absolute path\n }\n }\n\n // IDE selection\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n default: 'vscode',\n });\n\n // Event selection\n const availableEvents = EventRegistry.getEventsForManageUI();\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: e.value === 'cwd' || e.value === 'ide' || e.value === 'claude',\n })),\n });\n\n const events: EventsConfig = {};\n for (const eventName of selectedEvents) {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n\n const projectConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n await config.setProjectSafe(name, projectConfig);\n log.info(`Project '${name}' registered successfully!`);\n\n return { projectName: name, projectConfig };\n}\n\n/**\n * Resolve a project name to its absolute path\n */\nexport function resolveProjectPath(\n projectName: string,\n config: Config,\n log: Logger\n): string | null {\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n if (!(projectName in projects)) {\n log.error(`Project '${projectName}' not found.`);\n log.info(`Run 'workon' to see available projects.`);\n return null;\n }\n\n const projectConfig = projects[projectName];\n const basePath = defaults?.base || '';\n\n let projectPath: string;\n // Check if the project path is already absolute\n const configPath = File.from(projectConfig.path);\n if (configPath.path.startsWith('/') || configPath.path.startsWith('~')) {\n // Path is absolute, use it directly\n projectPath = configPath.absolutify().path;\n } else if (basePath) {\n // Relative path, prepend base\n projectPath = File.from(basePath).absolutify().join(projectConfig.path).path;\n } else {\n // No base, try to absolutify the relative path\n projectPath = configPath.absolutify().path;\n }\n\n return projectPath;\n}\n\n/**\n * Format a branch name for display (truncate if too long)\n */\nexport function formatBranchName(branch: string, maxLength = 30): string {\n if (branch.length <= maxLength) {\n return branch;\n }\n return branch.substring(0, maxLength - 3) + '...';\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { existsSync } from 'fs';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { resolveProjectFromCwd } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\nexport function createListCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('list')\n .description('List worktrees for the current project')\n .option('-a, --all', 'Show all worktrees (including main)')\n .action(async (options: { all?: boolean }) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const allWorktrees = await manager.list();\n const managedWorktrees = await manager.listManagedWorktrees();\n const managedPaths = new Set(managedWorktrees.map((wt) => wt.path));\n\n const worktrees = options.all ? allWorktrees : allWorktrees.filter((wt) => !wt.isMain);\n\n if (worktrees.length === 0) {\n if (options.all) {\n log.info('No worktrees found.');\n } else {\n log.info(`No worktrees found for '${displayName}'.`);\n log.info(`Use 'workon worktrees add <branch>' to create one.`);\n }\n return;\n }\n\n console.log(chalk.bold(`\\nWorktrees for ${displayName}:`));\n console.log('-'.repeat(60));\n\n for (const wt of worktrees) {\n const isManaged = managedPaths.has(wt.path);\n const mainLabel = wt.isMain ? chalk.gray(' (main)') : '';\n const missingLabel = !wt.isMain && !existsSync(wt.path) ? chalk.red(' (missing)') : '';\n const externalLabel =\n !wt.isMain && !isManaged && !missingLabel ? chalk.yellow(' (external)') : '';\n const branchDisplay =\n wt.branch === '(detached)' ? chalk.yellow(wt.branch) : chalk.green(wt.branch);\n\n console.log(` ${chalk.cyan(wt.name)}${mainLabel}${missingLabel}${externalLabel}`);\n console.log(` Branch: ${branchDisplay}`);\n console.log(` Path: ${chalk.gray(wt.path)}`);\n console.log(` HEAD: ${chalk.gray(wt.head.substring(0, 8))}`);\n console.log();\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { select, confirm } from '@inquirer/prompts';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { resolveProjectFromCwd, promptToRegisterProject, type ProjectContext } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface AddOptions {\n base?: string;\n force?: boolean;\n open?: boolean;\n hook?: boolean; // Commander negated options: --no-hook sets hook=false\n}\n\nexport function createAddCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('add')\n .description('Create a new worktree for a branch')\n .argument('<branch>', 'Branch name for the worktree')\n .option('-b, --base <branch>', 'Base branch to create new branch from')\n .option('-f, --force', 'Overwrite existing worktree')\n .option('-o, --open', 'Open the worktree after creation')\n .option('--no-hook', 'Skip running the post-setup hook')\n .action(async (branch: string, options: AddOptions) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n // For full functionality (open session), we need registration\n if (!projectCtx.isRegistered) {\n const result = await promptToRegisterProject(projectCtx.projectPath, config, log);\n if (result) {\n projectCtx.projectName = result.projectName;\n projectCtx.projectConfig = result.projectConfig;\n projectCtx.isRegistered = true;\n }\n }\n\n const { projectPath, projectName } = projectCtx;\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n // If no base branch specified and branch doesn't exist, ask user\n const branchExists = await manager.branchExists(branch);\n let baseBranch = options.base;\n\n if (!branchExists && !baseBranch) {\n const branches = await manager.getBranches();\n const currentBranch = await manager.getCurrentBranch();\n\n baseBranch = await select({\n message: `Branch '${branch}' doesn't exist. Create from which branch?`,\n choices: branches.map((b) => ({\n name: b === currentBranch ? `${b} (current)` : b,\n value: b,\n })),\n default: currentBranch,\n });\n }\n\n const spinner = ora(`Creating worktree for branch '${branch}'...`).start();\n\n try {\n const worktree = await manager.add({\n branch,\n baseBranch,\n force: options.force,\n });\n\n spinner.succeed(`Worktree created at ${chalk.cyan(worktree.path)}`);\n\n // Run post-setup hook if it exists and not disabled (--no-hook sets options.hook=false)\n if (options.hook !== false && manager.hasSetupHook()) {\n const hookSpinner = ora('Running post-setup hook...').start();\n try {\n const { stdout, stderr } = await manager.runPostSetupHook(worktree.path);\n hookSpinner.succeed('Post-setup hook completed');\n if (stdout.trim()) {\n console.log(chalk.gray(stdout.trim()));\n }\n if (stderr.trim()) {\n console.log(chalk.yellow(stderr.trim()));\n }\n } catch (error) {\n hookSpinner.warn(`Post-setup hook failed: ${(error as Error).message}`);\n }\n }\n\n console.log(`\\n${chalk.bold('Worktree details:')}`);\n console.log(` Name: ${chalk.cyan(worktree.name)}`);\n console.log(` Branch: ${chalk.green(worktree.branch)}`);\n console.log(` Path: ${chalk.gray(worktree.path)}`);\n\n // Ask to open if --open flag or prompt (only if registered)\n if (projectCtx.isRegistered && projectName) {\n if (options.open) {\n await openWorktreeSession(projectCtx, worktree.name, config, log);\n } else {\n const shouldOpen = await confirm({\n message: 'Open workon session in this worktree?',\n default: true,\n });\n\n if (shouldOpen) {\n await openWorktreeSession(projectCtx, worktree.name, config, log);\n } else {\n console.log(\n `\\nTo open later: ${chalk.cyan(`workon worktrees open ${worktree.name}`)}`\n );\n }\n }\n } else {\n console.log(\n `\\n${chalk.yellow('Note:')} Register this project to enable full workon sessions.`\n );\n console.log(` cd ${worktree.path}`);\n }\n } catch (error) {\n spinner.fail(`Failed to create worktree: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n\nasync function openWorktreeSession(\n projectCtx: ProjectContext,\n worktreeName: string,\n config: Config,\n log: Logger\n): Promise<void> {\n if (!projectCtx.projectName) {\n log.warn('Cannot open session: project is not registered.');\n return;\n }\n // Import and call the open worktree command logic\n const { runWorktreeOpen } = await import('./open.js');\n await runWorktreeOpen(projectCtx, worktreeName, {}, { config, log });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport { existsSync } from 'fs';\nimport { confirm } from '@inquirer/prompts';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { TmuxManager } from '../../lib/tmux.js';\nimport { resolveProjectFromCwd } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface RemoveOptions {\n force?: boolean;\n yes?: boolean;\n}\n\nexport function createRemoveCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('remove')\n .description('Remove a worktree')\n .argument('<name>', 'Worktree name')\n .option('-f, --force', 'Force removal even with uncommitted changes')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (name: string, options: RemoveOptions) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const worktree = await manager.get(name);\n if (!worktree) {\n log.error(`Worktree '${name}' not found for '${displayName}'`);\n const worktrees = await manager.listManagedWorktrees();\n if (worktrees.length > 0) {\n log.info('Available worktrees:');\n worktrees.forEach((wt) => log.info(` - ${wt.name}`));\n }\n process.exit(1);\n }\n\n if (worktree.isMain) {\n log.error('Cannot remove the main worktree');\n process.exit(1);\n }\n\n // Check if worktree directory exists on disk\n const pathMissing = !existsSync(worktree.path);\n if (pathMissing) {\n log.warn(`Worktree directory is missing from disk: ${worktree.path}`);\n // Force removal since git requires --force for missing directories\n options.force = true;\n }\n\n // Check for uncommitted changes (skip if directory is missing)\n if (!pathMissing) {\n const hasChanges = await manager.hasUncommittedChanges(name);\n if (hasChanges && !options.force) {\n log.warn(`Worktree '${name}' has uncommitted changes.`);\n\n if (!options.yes) {\n const shouldForce = await confirm({\n message: 'Do you want to force removal and lose these changes?',\n default: false,\n });\n\n if (!shouldForce) {\n log.info('Removal cancelled.');\n return;\n }\n options.force = true;\n } else {\n log.error('Use --force to remove worktrees with uncommitted changes.');\n process.exit(1);\n }\n }\n }\n\n // Confirm removal\n if (!options.yes) {\n console.log(`\\n${chalk.bold('Worktree to remove:')}`);\n console.log(` Name: ${chalk.cyan(worktree.name)}`);\n console.log(` Branch: ${chalk.green(worktree.branch)}`);\n console.log(` Path: ${chalk.gray(worktree.path)}`);\n console.log();\n\n const shouldRemove = await confirm({\n message: `Remove worktree '${name}'?`,\n default: true,\n });\n\n if (!shouldRemove) {\n log.info('Removal cancelled.');\n return;\n }\n }\n\n // Kill any associated tmux session\n const tmux = new TmuxManager();\n const sessionName = tmux.getWorktreeSessionName(displayName, name);\n if (await tmux.sessionExists(sessionName)) {\n log.debug(`Killing tmux session: ${sessionName}`);\n await tmux.killSession(sessionName);\n }\n\n const spinner = ora(`Removing worktree '${name}'...`).start();\n\n try {\n await manager.remove(name, options.force);\n spinner.succeed(`Worktree '${name}' removed successfully`);\n } catch (error) {\n spinner.fail(`Failed to remove worktree: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport { select, confirm } from '@inquirer/prompts';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { TmuxManager } from '../../lib/tmux.js';\nimport { resolveProjectFromCwd } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface MergeOptions {\n into?: string;\n squash?: boolean;\n keep?: boolean;\n yes?: boolean;\n}\n\nexport function createMergeCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('merge')\n .description('Merge a worktree branch and optionally remove the worktree')\n .argument('<name>', 'Worktree name')\n .option('-i, --into <branch>', 'Target branch to merge into')\n .option('-s, --squash', 'Use squash merge')\n .option('-k, --keep', 'Keep the worktree after merging')\n .option('-y, --yes', 'Skip confirmation prompts')\n .action(async (name: string, options: MergeOptions) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const worktree = await manager.get(name);\n if (!worktree) {\n log.error(`Worktree '${name}' not found for '${displayName}'`);\n const worktrees = await manager.listManagedWorktrees();\n if (worktrees.length > 0) {\n log.info('Available worktrees:');\n worktrees.forEach((wt) => log.info(` - ${wt.name}`));\n }\n process.exit(1);\n }\n\n if (worktree.isMain) {\n log.error('Cannot merge the main worktree');\n process.exit(1);\n }\n\n // Check for uncommitted changes\n const hasChanges = await manager.hasUncommittedChanges(name);\n if (hasChanges) {\n log.error(`Worktree '${name}' has uncommitted changes.`);\n log.info('Please commit or stash your changes before merging.');\n process.exit(1);\n }\n\n // Select target branch\n let targetBranch = options.into;\n if (!targetBranch) {\n const branches = await manager.getBranches();\n // Filter out the worktree's branch\n const targetBranches = branches.filter((b) => b !== worktree.branch);\n\n if (targetBranches.length === 0) {\n log.error('No other branches available to merge into.');\n process.exit(1);\n }\n\n // Try to find common target branches\n const commonTargets = ['main', 'master', 'develop', 'dev'];\n const defaultTarget =\n commonTargets.find((t) => targetBranches.includes(t)) || targetBranches[0];\n\n targetBranch = await select({\n message: `Merge '${worktree.branch}' into which branch?`,\n choices: targetBranches.map((b) => ({\n name: b,\n value: b,\n })),\n default: defaultTarget,\n });\n }\n\n // Verify target branch exists\n if (!(await manager.branchExists(targetBranch))) {\n log.error(`Target branch '${targetBranch}' does not exist.`);\n process.exit(1);\n }\n\n // Select merge strategy\n let squash = options.squash;\n if (squash === undefined && !options.yes) {\n squash = await confirm({\n message: 'Use squash merge? (combines all commits into one)',\n default: false,\n });\n }\n\n // Confirm the operation\n if (!options.yes) {\n console.log(`\\n${chalk.bold('Merge operation:')}`);\n console.log(` Source: ${chalk.green(worktree.branch)}`);\n console.log(` Target: ${chalk.cyan(targetBranch)}`);\n console.log(` Method: ${squash ? 'Squash merge' : 'Regular merge'}`);\n console.log(` Action: ${options.keep ? 'Keep worktree' : 'Remove worktree after merge'}`);\n console.log();\n\n const shouldProceed = await confirm({\n message: 'Proceed with merge?',\n default: true,\n });\n\n if (!shouldProceed) {\n log.info('Merge cancelled.');\n return;\n }\n }\n\n // Perform the merge\n const mergeSpinner = ora(`Merging '${worktree.branch}' into '${targetBranch}'...`).start();\n\n try {\n await manager.merge(name, {\n targetBranch,\n squash: squash || false,\n });\n mergeSpinner.succeed(`Successfully merged '${worktree.branch}' into '${targetBranch}'`);\n } catch (error) {\n mergeSpinner.fail(`Merge failed: ${(error as Error).message}`);\n log.info('You may need to resolve conflicts manually.');\n process.exit(1);\n }\n\n // Remove worktree if not keeping\n if (!options.keep) {\n // Kill any associated tmux session\n const tmux = new TmuxManager();\n const sessionName = tmux.getWorktreeSessionName(displayName, name);\n if (await tmux.sessionExists(sessionName)) {\n log.debug(`Killing tmux session: ${sessionName}`);\n await tmux.killSession(sessionName);\n }\n\n const removeSpinner = ora(`Removing worktree '${name}'...`).start();\n\n try {\n await manager.remove(name, true);\n removeSpinner.succeed(`Worktree '${name}' removed`);\n } catch (error) {\n removeSpinner.warn(`Failed to remove worktree: ${(error as Error).message}`);\n log.info(`You can remove it manually with: workon worktrees remove ${name}`);\n }\n\n // Optionally delete the branch\n if (!options.yes) {\n const shouldDeleteBranch = await confirm({\n message: `Delete the merged branch '${worktree.branch}'?`,\n default: false,\n });\n\n if (shouldDeleteBranch) {\n const deleteSpinner = ora(`Deleting branch '${worktree.branch}'...`).start();\n try {\n const { simpleGit } = await import('simple-git');\n const git = simpleGit(projectPath);\n await git.deleteLocalBranch(worktree.branch, true);\n deleteSpinner.succeed(`Branch '${worktree.branch}' deleted`);\n } catch (error) {\n deleteSpinner.warn(`Failed to delete branch: ${(error as Error).message}`);\n }\n }\n }\n }\n\n console.log(chalk.green('\\nMerge workflow completed successfully!'));\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport { confirm } from '@inquirer/prompts';\nimport { simpleGit } from 'simple-git';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { resolveProjectFromCwd } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface BranchOptions {\n push?: boolean;\n force?: boolean;\n}\n\nexport function createBranchCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('branch')\n .description('Create a branch from a worktree (useful for detached HEAD state)')\n .argument('<worktree>', 'Worktree name')\n .argument('<branch>', 'New branch name to create')\n .option('-p, --push', 'Push the branch to origin after creating')\n .option('-f, --force', 'Overwrite existing branch')\n .action(async (worktreeName: string, branchName: string, options: BranchOptions) => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const worktree = await manager.get(worktreeName);\n if (!worktree) {\n log.error(`Worktree '${worktreeName}' not found for '${displayName}'`);\n const worktrees = await manager.list();\n const nonMain = worktrees.filter((wt) => !wt.isMain);\n if (nonMain.length > 0) {\n log.info('Available worktrees:');\n nonMain.forEach((wt) => log.info(` - ${wt.name} (${wt.branch})`));\n }\n process.exit(1);\n }\n\n const worktreeGit = simpleGit(worktree.path);\n\n // Check if branch already exists\n const branchExists = await manager.branchExists(branchName);\n if (branchExists && !options.force) {\n log.error(`Branch '${branchName}' already exists. Use --force to overwrite.`);\n process.exit(1);\n }\n\n const isDetached = worktree.branch === '(detached)';\n\n console.log(`\\n${chalk.bold('Worktree status:')}`);\n console.log(` Name: ${chalk.cyan(worktree.name)}`);\n console.log(\n ` State: ${isDetached ? chalk.yellow('detached HEAD') : chalk.green(worktree.branch)}`\n );\n console.log(` HEAD: ${chalk.gray(worktree.head.substring(0, 8))}`);\n console.log(`\\n${chalk.bold('Action:')}`);\n console.log(` Create branch: ${chalk.green(branchName)}`);\n if (options.push) {\n console.log(` Push to: ${chalk.cyan('origin/' + branchName)}`);\n }\n console.log();\n\n const spinner = ora(`Creating branch '${branchName}'...`).start();\n\n try {\n // Create the branch at current HEAD\n if (options.force && branchExists) {\n // Delete and recreate\n await worktreeGit.branch(['-D', branchName]);\n }\n await worktreeGit.checkoutLocalBranch(branchName);\n\n spinner.succeed(`Branch '${branchName}' created and checked out`);\n\n // Push if requested\n if (options.push) {\n const pushSpinner = ora(`Pushing to origin/${branchName}...`).start();\n try {\n await worktreeGit.push('origin', branchName, ['--set-upstream']);\n pushSpinner.succeed(`Pushed to origin/${branchName}`);\n\n console.log(\n chalk.green('\\nReady for PR! You can now create a pull request from this branch.')\n );\n } catch (error) {\n pushSpinner.fail(`Failed to push: ${(error as Error).message}`);\n log.info(`You can push manually with: git push -u origin ${branchName}`);\n }\n } else {\n const shouldPush = await confirm({\n message: 'Push branch to origin for PR?',\n default: true,\n });\n\n if (shouldPush) {\n const pushSpinner = ora(`Pushing to origin/${branchName}...`).start();\n try {\n await worktreeGit.push('origin', branchName, ['--set-upstream']);\n pushSpinner.succeed(`Pushed to origin/${branchName}`);\n\n console.log(\n chalk.green('\\nReady for PR! You can now create a pull request from this branch.')\n );\n } catch (error) {\n pushSpinner.fail(`Failed to push: ${(error as Error).message}`);\n log.info(`You can push manually with: git push -u origin ${branchName}`);\n }\n }\n }\n } catch (error) {\n spinner.fail(`Failed to create branch: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { createListCommand } from './list.js';\nimport { createAddCommand } from './add.js';\nimport { createOpenCommand } from './open.js';\nimport { createRemoveCommand } from './remove.js';\nimport { createMergeCommand } from './merge.js';\nimport { createBranchCommand } from './branch.js';\nimport { resolveProjectFromCwd, promptToRegisterProject } from './utils.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\n/**\n * Check if running from within a worktree and block with helpful message\n */\nexport function blockIfInWorktree(\n projectCtx: { worktreeInfo: { isWorktree: boolean; worktreeName: string | null } },\n log: Logger\n): boolean {\n if (projectCtx.worktreeInfo.isWorktree) {\n log.error(\n `You're inside worktree '${projectCtx.worktreeInfo.worktreeName}'. ` +\n `Run this command from the main project directory.`\n );\n log.info(`Tip: Use 'workon worktree' to operate on the current worktree.`);\n return true;\n }\n return false;\n}\n\nexport function createWorktreesCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n const command = new Command('worktrees').description(\n 'Manage git worktrees for the current project (run from the main repository)'\n );\n\n command.addCommand(createListCommand(ctx));\n command.addCommand(createAddCommand(ctx));\n command.addCommand(createOpenCommand(ctx));\n command.addCommand(createRemoveCommand(ctx));\n command.addCommand(createMergeCommand(ctx));\n command.addCommand(createBranchCommand(ctx));\n\n // Default action: show interactive menu\n command.action(async () => {\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n // If unregistered, prompt to register\n if (!projectCtx.isRegistered) {\n const result = await promptToRegisterProject(projectCtx.projectPath, config, log);\n if (!result) {\n log.info(`Tip: You can run 'workon add .' to register this project later.`);\n process.exit(0);\n }\n projectCtx.projectName = result.projectName;\n projectCtx.projectConfig = result.projectConfig;\n projectCtx.isRegistered = true;\n }\n\n // Show interactive menu\n const { manageWorktreesInteractive } = await import('../interactive.js');\n await manageWorktreesInteractive(projectCtx, ctx);\n });\n\n return command;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport File from 'phylo';\nimport path from 'path';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger, Project } from '../../types/index.js';\nimport { WorktreeManager } from '../../lib/worktree.js';\nimport { TmuxManager } from '../../lib/tmux.js';\nimport { resolveProjectFromCwd, promptToRegisterProject, type ProjectContext } from './utils.js';\nimport { blockIfInWorktree } from './index.js';\nimport { Project as ProjectClass } from '../../lib/project.js';\n\ninterface WorktreesContext {\n config: Config;\n log: Logger;\n}\n\ninterface OpenOptions {\n debug?: boolean;\n shell?: boolean;\n attach?: boolean; // Default true, set false to create session without attaching\n}\n\nexport function createOpenCommand(ctx: WorktreesContext): Command {\n const { config, log } = ctx;\n\n return new Command('open')\n .description('Open a workon session in a worktree')\n .argument('<name>', 'Worktree name')\n .option('-d, --debug', 'Enable debug logging')\n .option('--shell', 'Output shell commands instead of spawning processes')\n .action(async (name: string, options: OpenOptions) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n const projectCtx = await resolveProjectFromCwd(config, log);\n\n if (!projectCtx) {\n log.error('Not in a git repository. Run this command from within a git project.');\n process.exit(1);\n }\n\n // Block if running from inside a worktree\n if (blockIfInWorktree(projectCtx, log)) {\n process.exit(1);\n }\n\n // For full tmux layout, we need registration (for events config)\n if (!projectCtx.isRegistered) {\n log.warn('Project is not registered. Opening with basic shell layout.');\n const shouldRegister = await promptToRegisterProject(projectCtx.projectPath, config, log);\n if (shouldRegister) {\n projectCtx.projectName = shouldRegister.projectName;\n projectCtx.projectConfig = shouldRegister.projectConfig;\n projectCtx.isRegistered = true;\n }\n }\n\n await runWorktreeOpen(projectCtx, name, options, { config, log });\n });\n}\n\nexport async function runWorktreeOpen(\n projectCtx: ProjectContext,\n worktreeName: string,\n options: OpenOptions,\n ctx: WorktreesContext\n): Promise<void> {\n const { config, log } = ctx;\n const { projectPath, projectName, projectConfig, isRegistered } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n const worktree = await manager.get(worktreeName);\n if (!worktree) {\n log.error(`Worktree '${worktreeName}' not found for '${displayName}'`);\n const worktrees = await manager.listManagedWorktrees();\n if (worktrees.length > 0) {\n log.info('Available worktrees:');\n worktrees.forEach((wt) => log.info(` - ${wt.name}`));\n }\n process.exit(1);\n }\n\n const defaults = config.getDefaults();\n const tmux = new TmuxManager();\n const sessionName = tmux.getWorktreeSessionName(displayName, worktreeName);\n\n log.debug(`Opening worktree: ${worktreeName}`);\n log.debug(`Worktree path: ${worktree.path}`);\n log.debug(`Session name: ${sessionName}`);\n\n const isShellMode = options.shell || false;\n\n // Determine layout based on project events (if registered)\n let project: Project | null = null;\n let hasClaudeEvent = false;\n let hasNpmEvent = false;\n\n if (isRegistered && projectName && projectConfig) {\n // Create a project instance with the worktree path\n project = new ProjectClass(projectName, projectConfig, defaults) as unknown as Project;\n // Override the internal _path directly to bypass the setter which would join with base\n // The worktree path is already absolute, so we just need to wrap it in a phylo File object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (project as any)._path = File.from(worktree.path).absolutify();\n\n const events = project.events || {};\n hasClaudeEvent = !!events.claude;\n hasNpmEvent = !!events.npm;\n }\n\n const shouldAttach = options.attach !== false; // Default to true\n\n if (isShellMode) {\n const shellCommands = await buildWorktreeShellCommands(\n project,\n worktree.path,\n sessionName,\n tmux,\n { hasClaudeEvent, hasNpmEvent }\n );\n console.log(shellCommands.join('\\n'));\n } else {\n if (await tmux.isTmuxAvailable()) {\n try {\n await createWorktreeTmuxSession(project, worktree.path, sessionName, tmux, {\n hasClaudeEvent,\n hasNpmEvent,\n });\n\n if (shouldAttach) {\n await tmux.attachToSession(sessionName);\n console.log(\n chalk.green(`Opened worktree '${worktreeName}' in tmux session '${sessionName}'`)\n );\n } else {\n // Session created but not attached - return session info for caller to handle\n console.log(\n chalk.green(`\\nCreated tmux session '${sessionName}' for worktree '${worktreeName}'`)\n );\n console.log(`\\nTo attach to this session, run:`);\n console.log(chalk.cyan(` tmux attach -t '${sessionName}'`));\n }\n } catch (error) {\n log.error(`Failed to create tmux session: ${(error as Error).message}`);\n process.exit(1);\n }\n } else {\n log.error('tmux is not available. Install with: brew install tmux');\n log.info(`Worktree path: ${worktree.path}`);\n process.exit(1);\n }\n }\n}\n\nasync function buildWorktreeShellCommands(\n project: Project | null,\n worktreePath: string,\n sessionName: string,\n tmux: TmuxManager,\n eventFlags: { hasClaudeEvent: boolean; hasNpmEvent: boolean }\n): Promise<string[]> {\n const { hasClaudeEvent, hasNpmEvent } = eventFlags;\n\n // Get claude args if claude is enabled and project exists\n const claudeArgs = hasClaudeEvent && project ? getClaudeArgs(project) : [];\n const npmCommand = hasNpmEvent && project ? await getNpmCommand(project) : '';\n\n // Build tmux commands using a custom session name\n if (hasClaudeEvent && hasNpmEvent && project) {\n return buildThreePaneCommands(sessionName, worktreePath, claudeArgs, npmCommand, tmux);\n } else if (hasClaudeEvent && project) {\n return buildSplitClaudeCommands(sessionName, worktreePath, claudeArgs, tmux);\n } else if (hasNpmEvent && project) {\n return buildTwoPaneNpmCommands(sessionName, worktreePath, npmCommand, tmux);\n } else {\n // Just open a shell in the worktree\n return buildSimpleSessionCommands(sessionName, worktreePath, tmux);\n }\n}\n\nasync function createWorktreeTmuxSession(\n project: Project | null,\n worktreePath: string,\n sessionName: string,\n tmux: TmuxManager,\n eventFlags: { hasClaudeEvent: boolean; hasNpmEvent: boolean }\n): Promise<void> {\n const { hasClaudeEvent, hasNpmEvent } = eventFlags;\n\n // Kill existing session if it exists\n if (await tmux.sessionExists(sessionName)) {\n await tmux.killSession(sessionName);\n }\n\n // Get claude args if claude is enabled and project exists\n const claudeArgs = hasClaudeEvent && project ? getClaudeArgs(project) : [];\n const npmCommand = hasNpmEvent && project ? await getNpmCommand(project) : '';\n\n // Create appropriate session based on events\n if (hasClaudeEvent && hasNpmEvent && project) {\n await createThreePaneSession(sessionName, worktreePath, claudeArgs, npmCommand);\n } else if (hasClaudeEvent && project) {\n await createSplitClaudeSession(sessionName, worktreePath, claudeArgs);\n } else if (hasNpmEvent && project) {\n await createTwoPaneNpmSession(sessionName, worktreePath, npmCommand);\n } else {\n await createSimpleSession(sessionName, worktreePath);\n }\n}\n\nfunction getClaudeArgs(project: Project): string[] {\n const claudeConfig = project.events.claude;\n const userFlags =\n typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\n return ['--dangerously-skip-permissions', ...userFlags];\n}\n\nasync function getNpmCommand(project: Project): Promise<string> {\n const npmConfig = project.events.npm;\n const { NpmEvent } = await import('../../events/extensions/npm.js');\n return NpmEvent.getNpmCommand(npmConfig);\n}\n\n// Shell command builders\nimport { escapeForSingleQuotes } from '../../lib/sanitize.js';\n\nfunction wrapWithShellFallback(command: string): string {\n return `${command}; exec $SHELL`;\n}\n\nfunction buildSimpleSessionCommands(\n sessionName: string,\n path: string,\n _tmux: TmuxManager\n): string[] {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n\n return [\n `# Create tmux session for worktree`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`,\n getAttachCommand(sessionName),\n ];\n}\n\nfunction buildSplitClaudeCommands(\n sessionName: string,\n path: string,\n claudeArgs: string[],\n _tmux: TmuxManager\n): string[] {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n\n return [\n `# Create tmux split session for worktree`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n getAttachCommand(sessionName),\n ];\n}\n\nfunction buildTwoPaneNpmCommands(\n sessionName: string,\n path: string,\n npmCommand: string,\n _tmux: TmuxManager\n): string[] {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n return [\n `# Create tmux two-pane session with npm for worktree`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}' '${wrappedNpmCmd}'`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n getAttachCommand(sessionName),\n ];\n}\n\nfunction buildThreePaneCommands(\n sessionName: string,\n path: string,\n claudeArgs: string[],\n npmCommand: string,\n _tmux: TmuxManager\n): string[] {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n return [\n `# Create tmux three-pane session for worktree`,\n `tmux has-session -t '${escapedSession}' 2>/dev/null && tmux kill-session -t '${escapedSession}'`,\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${wrappedNpmCmd}'`,\n `tmux resize-pane -t '${escapedSession}:0.2' -y 10`,\n `tmux select-pane -t '${escapedSession}:0.0'`,\n getAttachCommand(sessionName),\n ];\n}\n\nfunction getAttachCommand(sessionName: string): string {\n const escapedSession = escapeForSingleQuotes(sessionName);\n\n if (process.env.TMUX) {\n return `tmux switch-client -t '${escapedSession}'`;\n }\n\n const isITerm =\n process.env.TERM_PROGRAM === 'iTerm.app' ||\n process.env.LC_TERMINAL === 'iTerm2' ||\n process.env.ITERM_SESSION_ID;\n const useiTermIntegration = isITerm && !process.env.TMUX_CC_NOT_SUPPORTED;\n\n if (useiTermIntegration) {\n return `tmux -CC attach-session -t '${escapedSession}'`;\n }\n return `tmux attach-session -t '${escapedSession}'`;\n}\n\n// Direct session creation functions using exec\nimport { exec as execCallback } from 'child_process';\nimport { promisify } from 'util';\n\nconst exec = promisify(execCallback);\n\nasync function createSimpleSession(sessionName: string, path: string): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n\n await exec(`tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`);\n}\n\nasync function createSplitClaudeSession(\n sessionName: string,\n path: string,\n claudeArgs: string[]\n): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n\n await exec(\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`\n );\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`);\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n}\n\nasync function createTwoPaneNpmSession(\n sessionName: string,\n path: string,\n npmCommand: string\n): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n await exec(`tmux new-session -d -s '${escapedSession}' -c '${escapedPath}'`);\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}' '${wrappedNpmCmd}'`);\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n}\n\nasync function createThreePaneSession(\n sessionName: string,\n path: string,\n claudeArgs: string[],\n npmCommand: string\n): Promise<void> {\n const escapedSession = escapeForSingleQuotes(sessionName);\n const escapedPath = escapeForSingleQuotes(path);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n const wrappedClaudeCmd = escapeForSingleQuotes(wrapWithShellFallback(claudeCommand));\n const wrappedNpmCmd = escapeForSingleQuotes(wrapWithShellFallback(npmCommand));\n\n await exec(\n `tmux new-session -d -s '${escapedSession}' -c '${escapedPath}' '${wrappedClaudeCmd}'`\n );\n await exec(`tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`);\n await exec(\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${wrappedNpmCmd}'`\n );\n await exec(`tmux resize-pane -t '${escapedSession}:0.2' -y 10`);\n await exec(`tmux select-pane -t '${escapedSession}:0.0'`);\n}\n","import { select, input, checkbox, confirm } from '@inquirer/prompts';\nimport File from 'phylo';\nimport path from 'path';\nimport deepAssign from 'deep-assign';\nimport chalk from 'chalk';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ProjectConfig, EventsConfig } from '../types/index.js';\nimport type { Environment, ProjectEnvironment as ProjectEnv } from '../lib/environment.js';\nimport { ProjectEnvironment } from '../lib/environment.js';\nimport { EventRegistry } from '../events/registry.js';\nimport { IDE_CHOICES } from '../types/constants.js';\nimport { WorktreeManager } from '../lib/worktree.js';\nimport type { ProjectContext } from './worktrees/utils.js';\n\ninterface InteractiveContext {\n config: Config;\n log: Logger;\n environment: Environment;\n suggestedName?: string;\n}\n\nexport async function runInteractive(ctx: InteractiveContext): Promise<void> {\n const { config, log, environment, suggestedName } = ctx;\n\n showLogo(config);\n log.log('');\n\n const defaultName =\n suggestedName ??\n (environment.$isProjectEnvironment\n ? (environment as ProjectEnv).project.name\n : File.cwd().name);\n\n const fromUser = !!suggestedName;\n\n await startInteractive(defaultName, fromUser, ctx);\n}\n\nfunction showLogo(config: Config): void {\n const version = config.get<{ version: string }>('pkg')?.version ?? 'unknown';\n\n console.log(\n ` 8\\x1b[2m${' '.repeat(Math.max(15 - version.length - 1, 1)) + 'v' + version}\\x1b[22m\nYb db dP .d8b. 8d8b 8.dP \\x1b[92m.d8b. 8d8b.\\x1b[0m\n YbdPYbdP 8' .8 8P 88b \\x1b[92m8' .8 8P Y8\\x1b[0m\n YP YP \\`Y8P' 8 8 Yb \\x1b[92m\\`Y8P' 8 8\\x1b[0m`\n );\n}\n\nasync function startInteractive(\n defaultName: string,\n fromUser: boolean,\n ctx: InteractiveContext,\n showMain = false\n): Promise<void> {\n const { log, environment } = ctx;\n\n log.debug(`Name '${defaultName}' was${fromUser ? '' : ' not'} provided by the user`);\n\n const question = getFirstQuestion(defaultName, fromUser, environment, showMain);\n const action = await select(question);\n\n switch (action) {\n case 'exit':\n return;\n\n case 'more':\n await startInteractive(defaultName, fromUser, ctx, true);\n return;\n\n case 'init-project':\n await initProject(defaultName, fromUser, ctx);\n return;\n\n case 'init-branch':\n await initBranch(defaultName, ctx);\n return;\n\n case 'switch-project':\n await switchProject(ctx);\n return;\n\n case 'switch-branch':\n await switchBranch(defaultName, ctx);\n return;\n\n case 'manage-projects':\n await manageProjects(ctx);\n return;\n\n case 'manage-branches':\n await manageBranches(defaultName, ctx);\n return;\n\n case 'manage-worktrees':\n await manageWorktrees(defaultName, ctx);\n return;\n }\n}\n\nfunction getFirstQuestion(\n defaultName: string,\n fromUser: boolean,\n environment: Environment,\n showMain: boolean\n): { message: string; choices: Array<{ name: string; value: string }> } {\n if (!showMain && environment.$isProjectEnvironment && !fromUser) {\n return {\n message: (environment as ProjectEnv).project.name,\n choices: [\n { name: 'Start a branch', value: 'init-branch' },\n { name: 'Switch branch', value: 'switch-branch' },\n { name: 'Manage branches', value: 'manage-branches' },\n { name: 'Manage worktrees', value: 'manage-worktrees' },\n { name: '---', value: '' },\n { name: 'More...', value: 'more' },\n { name: 'Exit', value: 'exit' },\n ].filter((c) => c.value !== ''),\n };\n }\n\n return {\n message: 'What do you want to do?',\n choices: [\n { name: 'Start a new project', value: 'init-project' },\n { name: 'Open an existing project', value: 'switch-project' },\n { name: 'Manage projects', value: 'manage-projects' },\n { name: '---', value: '' },\n { name: 'Exit', value: 'exit' },\n ].filter((c) => c.value !== ''),\n };\n}\n\nasync function initProject(\n defaultName: string,\n fromUser: boolean,\n ctx: InteractiveContext\n): Promise<void> {\n const { config, log } = ctx;\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n // Project name\n let name: string;\n if (fromUser) {\n name = defaultName;\n log.log(`Project name: ${name}`);\n } else {\n name = await input({\n message: 'What is the name of the project?',\n default: defaultName,\n validate: (value) => {\n if (value in projects) return 'Project already exists.';\n if (/\\w+#\\w+/.test(value)) {\n const projectName = value.substring(0, value.indexOf('#'));\n if (!(projectName in projects)) {\n return `Project '${projectName}' does not exist. Please create it before starting a branch.`;\n }\n }\n return true;\n },\n });\n }\n\n // Check if this is a branch config\n const isBranch = /\\w+#\\w+/.test(name);\n let basePath: string;\n\n if (isBranch) {\n const projectName = name.substring(0, name.indexOf('#'));\n basePath = defaults?.base\n ? File.from(defaults.base).join(projects[projectName].path).absolutePath()\n : projects[projectName].path;\n log.log(`Project path: ${basePath}`);\n } else {\n // Project path\n const pathAnswer = await input({\n message: 'What is the path to the project?',\n default: defaults?.base ? File.from(defaults.base).join(name).path : name,\n });\n\n // Convert to relative path\n let answerFile = File.from(pathAnswer);\n const defaultBase = defaults?.base ? File.from(defaults.base).absolutify() : File.cwd();\n\n if (!answerFile.isAbsolute()) {\n answerFile = defaultBase.join(answerFile.path);\n }\n\n try {\n const canonical = answerFile.canonicalize();\n if (canonical) {\n answerFile = canonical;\n } else {\n answerFile = answerFile.absolutify();\n }\n } catch {\n answerFile = answerFile.absolutify();\n }\n\n const relPath = answerFile.relativize(defaultBase.path);\n basePath = relPath && !relPath.path.startsWith('..') ? relPath.path : answerFile.path;\n }\n\n // IDE selection\n const ide = await select({\n message: 'What is the IDE?',\n choices: IDE_CHOICES,\n });\n\n // Event selection\n const selectedEvents = await checkbox({\n message: 'Which events should take place when opening?',\n choices: [\n { name: 'Change terminal cwd to project path', value: 'cwd', checked: true },\n { name: 'Open project in IDE', value: 'ide', checked: true },\n ],\n });\n\n const events: EventsConfig = {\n cwd: selectedEvents.includes('cwd'),\n ide: selectedEvents.includes('ide'),\n };\n\n // Save project\n const projectConfig: ProjectConfig = {\n path: basePath,\n ide,\n events,\n };\n\n await config.setProjectSafe(name, projectConfig);\n\n log.info('Your project has been initialized.');\n log.info(`Use 'workon ${name}' to start working!`);\n}\n\nasync function initBranch(defaultName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n // Branch name\n const branch = await input({\n message: 'What is the name of the branch?',\n validate: (value) => {\n if (/\\w+#\\w+/.test(value)) return 'Branch name can\\'t contain the \"#\" sign';\n if (`${defaultName}#${value}` in projects) return 'Branch already exists.';\n return true;\n },\n });\n\n const branchName = `${defaultName}#${branch}`;\n const baseProject = projects[defaultName];\n\n // Create branch config by inheriting from base project (exclude name property)\n const { name: _excludedName, ...mergedConfig } = deepAssign({}, baseProject, {\n branch,\n }) as ProjectConfig;\n const branchConfig: ProjectConfig = mergedConfig;\n\n await config.setProjectSafe(branchName, branchConfig);\n\n log.info('Your branch configuration has been initialized.');\n log.info(`Use 'workon ${branchName}' to start working!`);\n}\n\nasync function switchProject(ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n // Filter to only base projects (not branch configs)\n const baseProjects = Object.keys(projects).filter((name) => !name.includes('#'));\n\n if (baseProjects.length === 0) {\n log.info('No projects configured yet. Use \"Start a new project\" to create one.');\n return;\n }\n\n const projectName = await select({\n message: 'Select a project to open:',\n choices: baseProjects.map((name) => ({\n name: `${name} (${projects[name].path})`,\n value: name,\n })),\n });\n\n await openProject(projectName, ctx);\n}\n\nasync function switchBranch(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n // Find all branch configs for this project\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n if (branches.length === 0) {\n log.info(`No branch configurations found for '${projectName}'.`);\n log.info('Use \"Start a branch\" to create one.');\n return;\n }\n\n const branchConfig = await select({\n message: 'Select a branch configuration:',\n choices: branches.map((name) => ({\n name: name.substring(branchPrefix.length),\n value: name,\n })),\n });\n\n await openProject(branchConfig, ctx);\n}\n\nasync function manageProjects(ctx: InteractiveContext): Promise<void> {\n const { config } = ctx;\n\n const projects = config.getProjects();\n const hasProjects = Object.keys(projects).length > 0;\n\n const choices = [\n { name: 'Create new project', value: 'create' },\n ...(hasProjects\n ? [\n { name: 'Edit project', value: 'edit' },\n { name: 'Delete project', value: 'delete' },\n { name: 'List projects', value: 'list' },\n ]\n : []),\n { name: 'Back', value: 'back' },\n ];\n\n const action = await select({\n message: 'Manage projects:',\n choices,\n });\n\n switch (action) {\n case 'create':\n await createProjectManage(ctx);\n break;\n case 'edit':\n await editProjectManage(ctx);\n break;\n case 'delete':\n await deleteProjectManage(ctx);\n break;\n case 'list':\n listProjectsManage(ctx);\n break;\n case 'back':\n return;\n }\n\n // Return to manage menu\n await manageProjects(ctx);\n}\n\nasync function manageBranches(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config } = ctx;\n const projects = config.getProjects();\n\n // Find all branch configs for this project\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n const choices = [\n { name: 'Create new branch config', value: 'create' },\n ...(branches.length > 0\n ? [\n { name: 'Edit branch config', value: 'edit' },\n { name: 'Delete branch config', value: 'delete' },\n { name: 'List branch configs', value: 'list' },\n ]\n : []),\n { name: 'Back', value: 'back' },\n ];\n\n const action = await select({\n message: `Manage branches for '${projectName}':`,\n choices,\n });\n\n switch (action) {\n case 'create':\n await initBranch(projectName, ctx);\n break;\n case 'edit':\n await editBranchManage(projectName, ctx);\n break;\n case 'delete':\n await deleteBranchManage(projectName, ctx);\n break;\n case 'list':\n listBranchesManage(projectName, ctx);\n break;\n case 'back':\n return;\n }\n\n // Return to manage branches menu\n await manageBranches(projectName, ctx);\n}\n\nasync function openProject(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n if (!(projectName in projects)) {\n log.error(`Project '${projectName}' not found.`);\n return;\n }\n\n const projectConfig = projects[projectName];\n const projectCfg = { ...projectConfig, name: projectName };\n const projectEnv = ProjectEnvironment.load(projectCfg, config.getDefaults());\n\n log.info(`Opening project '${projectName}'...`);\n\n // Execute events for the project\n const events = Object.keys(projectConfig.events).filter(\n (e) => projectConfig.events[e as keyof EventsConfig]\n );\n\n for (const event of events) {\n const eventHandler = EventRegistry.getEventByName(event);\n if (eventHandler) {\n await eventHandler.processing.processEvent({\n project: projectEnv.project,\n isShellMode: false,\n shellCommands: [],\n });\n }\n }\n}\n\n// Manage helper functions\nasync function createProjectManage(ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n const name = await input({\n message: 'Project name:',\n validate: (value) => {\n if (!value.trim()) return 'Name is required';\n if (!/^[\\w-]+$/.test(value))\n return 'Name can only contain letters, numbers, underscores, and hyphens';\n if (value in projects) return 'Project already exists';\n return true;\n },\n });\n\n const defaultPath = defaults?.base ? File.from(defaults.base).absolutify().join(name).path : name;\n const pathInput = await input({\n message: 'Project path:',\n default: defaultPath,\n });\n\n let relativePath = pathInput;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base).absolutify();\n const pathFile = File.from(pathInput);\n try {\n if (pathFile.isAbsolute()) {\n const relPath = pathFile.relativize(baseDir.path);\n if (relPath && !relPath.path.startsWith('..')) {\n relativePath = relPath.path;\n }\n }\n } catch {\n relativePath = pathInput;\n }\n }\n\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n });\n\n const availableEvents = EventRegistry.getEventsForManageUI();\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: e.value === 'cwd' || e.value === 'ide',\n })),\n });\n\n const events: EventsConfig = {};\n for (const eventName of selectedEvents) {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n\n const projectConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n const confirmed = await confirm({\n message: 'Save this project?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(name, projectConfig);\n log.info(`Project '${name}' created successfully!`);\n }\n}\n\nasync function editProjectManage(ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n // Filter to base projects only\n const baseProjects = Object.keys(projects).filter((name) => !name.includes('#'));\n\n if (baseProjects.length === 0) {\n log.info('No projects to edit.');\n return;\n }\n\n const name = await select({\n message: 'Select project to edit:',\n choices: baseProjects.map((n) => ({ name: n, value: n })),\n });\n\n const project = projects[name];\n\n const pathInput = await input({\n message: 'Project path:',\n default: project.path,\n });\n\n let relativePath = pathInput;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base).absolutify();\n const pathFile = File.from(pathInput);\n try {\n if (pathFile.isAbsolute()) {\n const relPath = pathFile.relativize(baseDir.path);\n if (relPath && !relPath.path.startsWith('..')) {\n relativePath = relPath.path;\n }\n }\n } catch {\n relativePath = pathInput;\n }\n }\n\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n default: project.ide || 'vscode',\n });\n\n const keepEvents = await confirm({\n message: 'Keep existing event configuration?',\n default: true,\n });\n\n let events = project.events;\n if (!keepEvents) {\n const availableEvents = EventRegistry.getEventsForManageUI();\n const currentEvents = Object.keys(project.events);\n\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: currentEvents.includes(e.value),\n })),\n });\n\n events = {};\n for (const eventName of selectedEvents) {\n if (project.events[eventName as keyof EventsConfig]) {\n (events as Record<string, unknown>)[eventName] =\n project.events[eventName as keyof EventsConfig];\n } else {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n }\n }\n\n const updatedConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n const confirmed = await confirm({\n message: 'Save changes?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(name, updatedConfig);\n log.info(`Project '${name}' updated successfully!`);\n }\n}\n\nasync function deleteProjectManage(ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n // Filter to base projects only\n const baseProjects = Object.keys(projects).filter((name) => !name.includes('#'));\n\n if (baseProjects.length === 0) {\n log.info('No projects to delete.');\n return;\n }\n\n const name = await select({\n message: 'Select project to delete:',\n choices: baseProjects.map((n) => ({ name: n, value: n })),\n });\n\n // Check for branch configs\n const branchPrefix = `${name}#`;\n const branches = Object.keys(projects).filter((n) => n.startsWith(branchPrefix));\n\n if (branches.length > 0) {\n log.warn(`This project has ${branches.length} branch configuration(s).`);\n const deleteAll = await confirm({\n message: 'Delete all branch configurations as well?',\n default: false,\n });\n\n if (deleteAll) {\n for (const branch of branches) {\n await config.deleteProjectSafe(branch);\n }\n }\n }\n\n const confirmed = await confirm({\n message: `Are you sure you want to delete '${name}'?`,\n default: false,\n });\n\n if (confirmed) {\n await config.deleteProjectSafe(name);\n log.info(`Project '${name}' deleted.`);\n }\n}\n\nfunction listProjectsManage(ctx: InteractiveContext): void {\n const { config } = ctx;\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n console.log('\\nConfigured projects:\\n');\n\n // Filter to base projects only\n const baseProjects = Object.keys(projects).filter((name) => !name.includes('#'));\n\n for (const name of baseProjects) {\n const project = projects[name];\n const fullPath = defaults?.base\n ? File.from(defaults.base).join(project.path).path\n : project.path;\n\n console.log(` ${name}`);\n console.log(` Path: ${fullPath}`);\n console.log(` IDE: ${project.ide || 'not set'}`);\n console.log(` Events: ${Object.keys(project.events).join(', ') || 'none'}`);\n\n // Show branch count\n const branchPrefix = `${name}#`;\n const branches = Object.keys(projects).filter((n) => n.startsWith(branchPrefix));\n if (branches.length > 0) {\n console.log(` Branches: ${branches.length}`);\n }\n console.log();\n }\n}\n\nasync function editBranchManage(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n if (branches.length === 0) {\n log.info('No branch configurations to edit.');\n return;\n }\n\n const branchName = await select({\n message: 'Select branch configuration to edit:',\n choices: branches.map((n) => ({\n name: n.substring(branchPrefix.length),\n value: n,\n })),\n });\n\n const branch = projects[branchName];\n\n const keepEvents = await confirm({\n message: 'Keep existing event configuration?',\n default: true,\n });\n\n let events = branch.events;\n if (!keepEvents) {\n const availableEvents = EventRegistry.getEventsForManageUI();\n const currentEvents = Object.keys(branch.events);\n\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: currentEvents.includes(e.value),\n })),\n });\n\n events = {};\n for (const eventName of selectedEvents) {\n if (branch.events[eventName as keyof EventsConfig]) {\n (events as Record<string, unknown>)[eventName] =\n branch.events[eventName as keyof EventsConfig];\n } else {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n }\n }\n\n const updatedConfig: ProjectConfig = {\n ...branch,\n events,\n };\n\n const confirmed = await confirm({\n message: 'Save changes?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(branchName, updatedConfig);\n log.info(`Branch configuration '${branchName}' updated successfully!`);\n }\n}\n\nasync function deleteBranchManage(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n if (branches.length === 0) {\n log.info('No branch configurations to delete.');\n return;\n }\n\n const branchName = await select({\n message: 'Select branch configuration to delete:',\n choices: branches.map((n) => ({\n name: n.substring(branchPrefix.length),\n value: n,\n })),\n });\n\n const confirmed = await confirm({\n message: `Are you sure you want to delete '${branchName}'?`,\n default: false,\n });\n\n if (confirmed) {\n await config.deleteProjectSafe(branchName);\n log.info(`Branch configuration '${branchName}' deleted.`);\n }\n}\n\nfunction listBranchesManage(projectName: string, ctx: InteractiveContext): void {\n const { config } = ctx;\n const projects = config.getProjects();\n\n const branchPrefix = `${projectName}#`;\n const branches = Object.keys(projects).filter((name) => name.startsWith(branchPrefix));\n\n console.log(`\\nBranch configurations for '${projectName}':\\n`);\n\n for (const branchName of branches) {\n const branch = projects[branchName];\n const shortName = branchName.substring(branchPrefix.length);\n\n console.log(` ${shortName}`);\n console.log(` Events: ${Object.keys(branch.events).join(', ') || 'none'}`);\n console.log();\n }\n}\n\n// Worktree management functions\nasync function manageWorktrees(projectName: string, ctx: InteractiveContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n if (!(projectName in projects)) {\n log.error(`Project '${projectName}' not found.`);\n return;\n }\n\n const projectConfig = projects[projectName];\n const basePath = defaults?.base || '';\n\n // Resolve project path\n let projectPath: string;\n const configPath = File.from(projectConfig.path);\n if (configPath.path.startsWith('/') || configPath.path.startsWith('~')) {\n projectPath = configPath.absolutify().path;\n } else if (basePath) {\n projectPath = File.from(basePath).absolutify().join(projectConfig.path).path;\n } else {\n projectPath = configPath.absolutify().path;\n }\n\n const manager = new WorktreeManager(projectPath, projectName);\n\n if (!(await manager.isGitRepository())) {\n log.error(`'${projectName}' is not a git repository`);\n return;\n }\n\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain);\n const hasWorktrees = nonMainWorktrees.length > 0;\n\n const choices = [\n { name: 'List worktrees', value: 'list' },\n { name: 'Create worktree', value: 'add' },\n ...(hasWorktrees\n ? [\n { name: 'Open worktree', value: 'open' },\n { name: 'Remove worktree', value: 'remove' },\n { name: 'Merge worktree', value: 'merge' },\n { name: 'Create branch from worktree', value: 'branch' },\n ]\n : []),\n { name: 'Back', value: 'back' },\n ];\n\n const action = await select({\n message: `Manage worktrees for '${projectName}':`,\n choices,\n });\n\n switch (action) {\n case 'list':\n await listWorktreesManage(projectName, manager);\n break;\n case 'add':\n await addWorktreeManage(projectName, manager, log);\n break;\n case 'open':\n await openWorktreeManage(projectName, manager, config, log);\n break;\n case 'remove':\n await removeWorktreeManage(projectName, manager, log);\n break;\n case 'merge':\n await mergeWorktreeManage(projectName, manager, log);\n break;\n case 'branch':\n await branchWorktreeManage(projectName, manager, log);\n break;\n case 'back':\n return;\n }\n\n // Return to manage worktrees menu\n await manageWorktrees(projectName, ctx);\n}\n\nasync function listWorktreesManage(projectName: string, manager: WorktreeManager): Promise<void> {\n const worktrees = await manager.list();\n const managedWorktrees = await manager.listManagedWorktrees();\n const managedPaths = new Set(managedWorktrees.map((wt) => wt.path));\n\n console.log(chalk.bold(`\\nWorktrees for ${projectName}:`));\n console.log('-'.repeat(60));\n\n for (const wt of worktrees) {\n const isManaged = managedPaths.has(wt.path);\n const mainLabel = wt.isMain ? chalk.gray(' (main)') : '';\n const externalLabel = !wt.isMain && !isManaged ? chalk.yellow(' (external)') : '';\n const branchDisplay =\n wt.branch === '(detached)' ? chalk.yellow(wt.branch) : chalk.green(wt.branch);\n\n console.log(` ${chalk.cyan(wt.name)}${mainLabel}${externalLabel}`);\n console.log(` Branch: ${branchDisplay}`);\n console.log(` Path: ${chalk.gray(wt.path)}`);\n console.log();\n }\n}\n\nasync function addWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n log: Logger\n): Promise<void> {\n const branchName = await input({\n message: 'Branch name for the new worktree:',\n validate: (value) => {\n if (!value.trim()) return 'Branch name is required';\n return true;\n },\n });\n\n const branchExists = await manager.branchExists(branchName);\n let baseBranch: string | undefined;\n\n if (!branchExists) {\n const branches = await manager.getBranches();\n const currentBranch = await manager.getCurrentBranch();\n\n baseBranch = await select({\n message: `Branch '${branchName}' doesn't exist. Create from which branch?`,\n choices: branches.map((b) => ({\n name: b === currentBranch ? `${b} (current)` : b,\n value: b,\n })),\n default: currentBranch,\n });\n }\n\n try {\n const worktree = await manager.add({ branch: branchName, baseBranch });\n log.info(`Worktree created at ${worktree.path}`);\n\n // Run post-setup hook if exists\n if (manager.hasSetupHook()) {\n const runHook = await confirm({\n message: 'Run post-setup hook?',\n default: true,\n });\n\n if (runHook) {\n try {\n await manager.runPostSetupHook(worktree.path);\n log.info('Post-setup hook completed');\n } catch (error) {\n log.warn(`Post-setup hook failed: ${(error as Error).message}`);\n }\n }\n }\n } catch (error) {\n log.error(`Failed to create worktree: ${(error as Error).message}`);\n }\n}\n\nasync function openWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n config: Config,\n log: Logger\n): Promise<void> {\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain);\n\n if (nonMainWorktrees.length === 0) {\n log.info('No worktrees to open.');\n return;\n }\n\n const worktreeName = await select({\n message: 'Select worktree to open:',\n choices: nonMainWorktrees.map((wt) => ({\n name: `${wt.name} (${wt.branch})`,\n value: wt.name,\n })),\n });\n\n // Build ProjectContext for runWorktreeOpen\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n const projectConfig = projects[projectName];\n const basePath = defaults?.base || '';\n\n let projectPath: string;\n const configPath = File.from(projectConfig.path);\n if (configPath.path.startsWith('/') || configPath.path.startsWith('~')) {\n projectPath = configPath.absolutify().path;\n } else if (basePath) {\n projectPath = File.from(basePath).absolutify().join(projectConfig.path).path;\n } else {\n projectPath = configPath.absolutify().path;\n }\n\n const projectCtx: ProjectContext = {\n projectPath,\n projectName,\n projectConfig,\n isRegistered: true,\n worktreeInfo: {\n isWorktree: false,\n worktreePath: null,\n mainRepoPath: projectPath,\n worktreeName: null,\n branch: null,\n },\n };\n\n // Import and call the open worktree command logic\n // Use attach: false since we're in interactive mode and can't properly hand off the terminal\n const { runWorktreeOpen } = await import('./worktrees/open.js');\n await runWorktreeOpen(projectCtx, worktreeName, { attach: false }, { config, log });\n}\n\nasync function removeWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n log: Logger\n): Promise<void> {\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain);\n\n if (nonMainWorktrees.length === 0) {\n log.info('No worktrees to remove.');\n return;\n }\n\n const worktreeName = await select({\n message: 'Select worktree to remove:',\n choices: nonMainWorktrees.map((wt) => ({\n name: `${wt.name} (${wt.branch})`,\n value: wt.name,\n })),\n });\n\n const hasChanges = await manager.hasUncommittedChanges(worktreeName);\n if (hasChanges) {\n log.warn(`Worktree '${worktreeName}' has uncommitted changes.`);\n const force = await confirm({\n message: 'Force removal and lose changes?',\n default: false,\n });\n\n if (!force) {\n log.info('Removal cancelled.');\n return;\n }\n }\n\n const confirmed = await confirm({\n message: `Remove worktree '${worktreeName}'?`,\n default: true,\n });\n\n if (confirmed) {\n try {\n await manager.remove(worktreeName, true);\n log.info(`Worktree '${worktreeName}' removed.`);\n } catch (error) {\n log.error(`Failed to remove worktree: ${(error as Error).message}`);\n }\n }\n}\n\nasync function mergeWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n log: Logger\n): Promise<void> {\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain && wt.branch !== '(detached)');\n\n if (nonMainWorktrees.length === 0) {\n log.info('No worktrees to merge (detached worktrees must be branched first).');\n return;\n }\n\n const worktreeName = await select({\n message: 'Select worktree to merge:',\n choices: nonMainWorktrees.map((wt) => ({\n name: `${wt.name} (${wt.branch})`,\n value: wt.name,\n })),\n });\n\n const worktree = await manager.get(worktreeName);\n if (!worktree) return;\n\n const hasChanges = await manager.hasUncommittedChanges(worktreeName);\n if (hasChanges) {\n log.error(`Worktree '${worktreeName}' has uncommitted changes. Commit or stash them first.`);\n return;\n }\n\n const branches = await manager.getBranches();\n const targetBranches = branches.filter((b) => b !== worktree.branch);\n\n const commonTargets = ['main', 'master', 'develop', 'dev'];\n const defaultTarget = commonTargets.find((t) => targetBranches.includes(t)) || targetBranches[0];\n\n const targetBranch = await select({\n message: `Merge '${worktree.branch}' into which branch?`,\n choices: targetBranches.map((b) => ({ name: b, value: b })),\n default: defaultTarget,\n });\n\n const squash = await confirm({\n message: 'Use squash merge?',\n default: false,\n });\n\n const removeAfter = await confirm({\n message: 'Remove worktree after merge?',\n default: true,\n });\n\n try {\n await manager.merge(worktreeName, { targetBranch, squash });\n log.info(`Merged '${worktree.branch}' into '${targetBranch}'`);\n\n if (removeAfter) {\n await manager.remove(worktreeName, true);\n log.info(`Worktree '${worktreeName}' removed.`);\n }\n } catch (error) {\n log.error(`Merge failed: ${(error as Error).message}`);\n }\n}\n\nasync function branchWorktreeManage(\n projectName: string,\n manager: WorktreeManager,\n log: Logger\n): Promise<void> {\n const worktrees = await manager.list();\n const detachedWorktrees = worktrees.filter((wt) => !wt.isMain);\n\n if (detachedWorktrees.length === 0) {\n log.info('No worktrees available.');\n return;\n }\n\n const worktreeName = await select({\n message: 'Select worktree to create branch from:',\n choices: detachedWorktrees.map((wt) => ({\n name: `${wt.name} (${wt.branch})`,\n value: wt.name,\n })),\n });\n\n const worktree = await manager.get(worktreeName);\n if (!worktree) return;\n\n const branchName = await input({\n message: 'New branch name:',\n validate: async (value) => {\n if (!value.trim()) return 'Branch name is required';\n if (await manager.branchExists(value)) return 'Branch already exists';\n return true;\n },\n });\n\n const { simpleGit } = await import('simple-git');\n const worktreeGit = simpleGit(worktree.path);\n\n try {\n await worktreeGit.checkoutLocalBranch(branchName);\n log.info(`Branch '${branchName}' created and checked out`);\n\n const push = await confirm({\n message: 'Push to origin for PR?',\n default: true,\n });\n\n if (push) {\n await worktreeGit.push('origin', branchName, ['--set-upstream']);\n log.info(`Pushed to origin/${branchName}`);\n }\n } catch (error) {\n log.error(`Failed to create branch: ${(error as Error).message}`);\n }\n}\n\n/**\n * Interactive worktree management using ProjectContext from CWD detection.\n * This is the entry point for `workon worktrees` when no subcommand is provided.\n */\nexport async function manageWorktreesInteractive(\n projectCtx: ProjectContext,\n ctx: { config: Config; log: Logger }\n): Promise<void> {\n const { config, log } = ctx;\n const { projectPath, projectName } = projectCtx;\n const displayName = projectName || path.basename(projectPath);\n\n const manager = new WorktreeManager(projectPath, projectName ?? undefined);\n\n if (!(await manager.isGitRepository())) {\n log.error(`'${displayName}' is not a git repository`);\n return;\n }\n\n const worktrees = await manager.list();\n const nonMainWorktrees = worktrees.filter((wt) => !wt.isMain);\n const hasWorktrees = nonMainWorktrees.length > 0;\n\n const choices = [\n { name: 'List worktrees', value: 'list' },\n { name: 'Create worktree', value: 'add' },\n ...(hasWorktrees\n ? [\n { name: 'Open worktree', value: 'open' },\n { name: 'Remove worktree', value: 'remove' },\n { name: 'Merge worktree', value: 'merge' },\n { name: 'Create branch from worktree', value: 'branch' },\n ]\n : []),\n { name: 'Exit', value: 'exit' },\n ];\n\n const action = await select({\n message: `Manage worktrees for '${displayName}':`,\n choices,\n });\n\n switch (action) {\n case 'list':\n await listWorktreesManage(displayName, manager);\n break;\n case 'add':\n await addWorktreeManage(displayName, manager, log);\n break;\n case 'open':\n if (projectName) {\n await openWorktreeManage(projectName, manager, config, log);\n } else {\n log.warn('Cannot open worktree session: project is not registered.');\n log.info(`Register this project first with 'workon add .'`);\n }\n break;\n case 'remove':\n await removeWorktreeManage(displayName, manager, log);\n break;\n case 'merge':\n await mergeWorktreeManage(displayName, manager, log);\n break;\n case 'branch':\n await branchWorktreeManage(displayName, manager, log);\n break;\n case 'exit':\n return;\n }\n\n // Return to manage worktrees menu\n await manageWorktreesInteractive(projectCtx, ctx);\n}\n","import { Command } from 'commander';\nimport File from 'phylo';\nimport type { Config } from '../lib/config.js';\nimport type {\n Logger,\n ClaudeConfig,\n NpmConfig,\n Project,\n EventProcessingContext,\n} from '../types/index.js';\nimport { EnvironmentRecognizer, ProjectEnvironment } from '../lib/environment.js';\nimport { TmuxManager } from '../lib/tmux.js';\nimport { EventRegistry } from '../events/registry.js';\n\ninterface OpenContext {\n config: Config;\n log: Logger;\n}\n\ninterface OpenOptions {\n debug?: boolean;\n dryRun?: boolean;\n shell?: boolean;\n}\n\n/**\n * Run the open command logic directly (used when delegating from main CLI)\n */\nexport async function runOpen(\n projectArg: string,\n options: OpenOptions,\n ctx: OpenContext\n): Promise<void> {\n const { log } = ctx;\n\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n await processProject(projectArg, options, ctx);\n}\n\nexport function createOpenCommand(ctx: OpenContext): Command {\n const { config, log } = ctx;\n\n const command = new Command('open')\n .description('Open a project by passing its project id')\n .argument('[project]', 'The id of the project to open (supports project:command syntax)')\n .option('-d, --debug', 'Enable debug logging')\n .option('-n, --dry-run', 'Show what would happen without executing')\n .option('--shell', 'Output shell commands instead of spawning processes')\n .action(async (projectArg: string | undefined, options: OpenOptions) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n if (projectArg) {\n await processProject(projectArg, options, ctx);\n } else {\n log.debug('No project name provided, starting interactive mode');\n const { runInteractive } = await import('./interactive.js');\n const environment = await EnvironmentRecognizer.recognize(File.cwd());\n await runInteractive({ config, log, environment });\n }\n });\n\n return command;\n}\n\nasync function processProject(\n projectParam: string,\n options: OpenOptions,\n ctx: OpenContext\n): Promise<void> {\n const { config, log } = ctx;\n\n // Parse colon syntax: project:command1,command2\n const [projectName, commandsString] = projectParam.split(':');\n const requestedCommands = commandsString\n ? commandsString.split(',').map((cmd) => cmd.trim())\n : null;\n\n // Special case: project:help shows available commands\n if (commandsString === 'help') {\n await showProjectHelp(projectName, ctx);\n return;\n }\n\n log.debug(\n `Project: ${projectName}, Commands: ${requestedCommands ? requestedCommands.join(', ') : 'all'}`\n );\n\n const projects = config.getProjects();\n const environment = await EnvironmentRecognizer.recognize(File.cwd());\n\n // Handle \"this\" or \".\" for current project\n if (environment.$isProjectEnvironment && (projectName === 'this' || projectName === '.')) {\n log.info(`Opening current project: ${environment.project.name}`);\n await switchTo(environment, requestedCommands, options, ctx);\n return;\n }\n\n if (projectName in projects) {\n const cfg = projects[projectName];\n const projectCfg = { ...cfg, name: projectName };\n\n // Validate requested commands if specified\n if (requestedCommands) {\n validateRequestedCommands(requestedCommands, projectCfg, projectName);\n }\n\n const projectEnv = ProjectEnvironment.load(projectCfg, config.getDefaults());\n await switchTo(projectEnv, requestedCommands, options, ctx);\n } else {\n log.error(`Project '${projectName}' not found.`);\n log.info(`Run 'workon' without arguments to see available projects or create a new one.`);\n process.exit(1);\n }\n}\n\nfunction validateRequestedCommands(\n requestedCommands: string[],\n projectConfig: { events?: Record<string, unknown> },\n projectName: string\n): void {\n const configuredEvents = Object.keys(projectConfig.events || {});\n const invalidCommands = requestedCommands.filter((cmd) => !configuredEvents.includes(cmd));\n\n if (invalidCommands.length > 0) {\n const availableCommands = configuredEvents.join(', ');\n throw new Error(\n `Commands not configured for project '${projectName}': ${invalidCommands.join(', ')}\\n` +\n `Available commands: ${availableCommands}`\n );\n }\n}\n\nasync function switchTo(\n environment: ProjectEnvironment,\n requestedCommands: string[] | null,\n options: OpenOptions,\n ctx: OpenContext\n): Promise<void> {\n const { log } = ctx;\n const project = environment.project;\n\n // Determine which events to execute\n let events: string[];\n if (requestedCommands) {\n events = resolveCommandDependencies(requestedCommands, project);\n log.debug(`Executing requested commands: ${events.join(', ')}`);\n } else {\n events = Object.keys(project.events).filter(\n (e) => project.events[e as keyof typeof project.events]\n );\n log.debug(`Executing all configured commands: ${events.join(', ')}`);\n }\n\n log.debug(`Shell is ${process.env.SHELL}`);\n log.debug(`Project path is ${project.path.path}`);\n log.debug(`IDE command is: ${project.ide}`);\n log.debug(`Final events to execute: ${events.join(', ')}`);\n\n const shellCommands: string[] = [];\n const isShellMode = options.shell || false;\n\n // Intelligent layout detection\n const hasCwd = events.includes('cwd');\n const hasClaudeEvent = events.includes('claude');\n const hasNpmEvent = events.includes('npm');\n\n const dryRun = options.dryRun || false;\n\n if (hasCwd && hasClaudeEvent && hasNpmEvent) {\n await handleThreePaneLayout(project, isShellMode, dryRun, shellCommands, events, ctx);\n } else if (hasCwd && hasNpmEvent) {\n await handleTwoPaneNpmLayout(project, isShellMode, dryRun, shellCommands, events, ctx);\n } else if (hasCwd && hasClaudeEvent) {\n await handleSplitTerminal(project, isShellMode, dryRun, shellCommands, events, ctx);\n } else {\n // Normal event processing\n for (const event of events) {\n if (!dryRun) {\n await processEvent(event, { project, isShellMode, shellCommands }, ctx);\n }\n }\n }\n\n // In dry-run mode, show what would be executed\n if (dryRun) {\n log.info('Dry run - would execute events:', events.join(', '));\n }\n\n // Output collected shell commands\n if (isShellMode && shellCommands.length > 0) {\n console.log(shellCommands.join('\\n'));\n }\n}\n\nfunction resolveCommandDependencies(\n requestedCommands: string[],\n project: { events: Record<string, unknown> }\n): string[] {\n const resolved = [...requestedCommands];\n\n // Auto-add cwd dependency for commands that need it\n const needsCwd = ['claude', 'npm', 'ide'];\n const needsCwdCommands = requestedCommands.filter((cmd) => needsCwd.includes(cmd));\n\n if (needsCwdCommands.length > 0 && !requestedCommands.includes('cwd') && project.events.cwd) {\n resolved.unshift('cwd');\n }\n\n return [...new Set(resolved)];\n}\n\n// Layout types for tmux session configurations\ntype LayoutType = 'split-claude' | 'three-pane' | 'two-pane-npm';\n\ninterface LayoutConfig {\n type: LayoutType;\n handledEvents: string[];\n dryRunMessage: string;\n claudeArgs: string[];\n npmCommand: string | null;\n}\n\nfunction getClaudeArgs(project: Project): string[] {\n const claudeConfig = project.events.claude as ClaudeConfig | boolean;\n const userFlags =\n typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\n // Always include --dangerously-skip-permissions for automated tmux sessions\n return ['--dangerously-skip-permissions', ...userFlags];\n}\n\nasync function getNpmCommand(project: Project): Promise<string> {\n const npmConfig = project.events.npm as NpmConfig | string | boolean;\n const { NpmEvent } = await import('../events/extensions/npm.js');\n return NpmEvent.getNpmCommand(npmConfig);\n}\n\nasync function handleTmuxLayout(\n project: Project,\n layout: LayoutConfig,\n options: { isShellMode: boolean; dryRun: boolean },\n shellCommands: string[],\n events: string[],\n ctx: OpenContext\n): Promise<void> {\n const { log } = ctx;\n const tmux = new TmuxManager();\n const { isShellMode, dryRun } = options;\n\n let tmuxHandled = false;\n\n if (isShellMode) {\n if (await tmux.isTmuxAvailable()) {\n // Process remaining events (like IDE) FIRST, before any tmux commands\n // This prevents backgrounded commands from interfering with tmux -CC control mode\n const remainingEvents = events.filter((e) => !layout.handledEvents.includes(e));\n for (const event of remainingEvents) {\n const eventHandler = EventRegistry.getEventByName(event);\n if (eventHandler) {\n const cmds = eventHandler.processing.generateShellCommand({\n project,\n isShellMode: true,\n shellCommands: [],\n });\n shellCommands.push(...cmds);\n }\n }\n\n // Now add all tmux commands (create session, split panes, attach)\n const commands = buildLayoutShellCommands(tmux, project, layout);\n shellCommands.push(...commands);\n tmuxHandled = true;\n } else {\n log.debug('Tmux not available, falling back to normal mode');\n // Process remaining non-blocking events (like IDE) BEFORE npm in fallback mode\n // This ensures IDE opens before npm blocks\n const remainingEvents = events.filter((e) => !layout.handledEvents.includes(e));\n buildFallbackCommandsWithEvents(shellCommands, project, layout, remainingEvents, ctx);\n tmuxHandled = true;\n }\n } else if (!dryRun) {\n if (await tmux.isTmuxAvailable()) {\n try {\n const sessionName = await createTmuxSession(tmux, project, layout);\n await tmux.attachToSession(sessionName);\n tmuxHandled = true;\n } catch (error) {\n log.debug(`Failed to create tmux session: ${(error as Error).message}`);\n }\n } else {\n log.debug('Tmux not available, falling back to normal event processing');\n }\n } else {\n log.info(layout.dryRunMessage);\n tmuxHandled = true;\n }\n\n // If tmux didn't handle layout events, process them normally\n if (!tmuxHandled && !dryRun) {\n for (const event of events.filter((e) => layout.handledEvents.includes(e))) {\n await processEvent(event, { project, isShellMode, shellCommands }, ctx);\n }\n }\n\n // Process other events not handled by the layout\n // Skip in shell mode (events already handled inline above)\n if (!dryRun && !isShellMode) {\n for (const event of events.filter((e) => !layout.handledEvents.includes(e))) {\n await processEvent(event, { project, isShellMode, shellCommands }, ctx);\n }\n }\n}\n\nfunction buildLayoutShellCommands(\n tmux: TmuxManager,\n project: Project,\n layout: LayoutConfig\n): string[] {\n switch (layout.type) {\n case 'split-claude':\n return tmux.buildShellCommands(project.name, project.path.path, layout.claudeArgs);\n case 'three-pane':\n return tmux.buildThreePaneShellCommands(\n project.name,\n project.path.path,\n layout.claudeArgs,\n layout.npmCommand!\n );\n case 'two-pane-npm':\n return tmux.buildTwoPaneNpmShellCommands(project.name, project.path.path, layout.npmCommand!);\n }\n}\n\nfunction buildFallbackCommandsWithEvents(\n shellCommands: string[],\n project: Project,\n layout: LayoutConfig,\n remainingEvents: string[],\n _ctx: OpenContext\n): void {\n // Warn user that tmux is not available\n shellCommands.push(`echo \"⚠ tmux not available - install with: brew install tmux\" >&2`);\n\n // Use pushd so user can popd to go back\n shellCommands.push(`pushd \"${project.path.path}\" > /dev/null`);\n\n // Add non-blocking remaining events (like IDE)\n for (const event of remainingEvents) {\n const eventHandler = EventRegistry.getEventByName(event);\n if (eventHandler) {\n const cmds = eventHandler.processing.generateShellCommand({\n project,\n isShellMode: true,\n shellCommands: [],\n });\n shellCommands.push(...cmds);\n }\n }\n\n // Skip blocking commands (npm, claude) - they require tmux for proper UX\n}\n\nasync function createTmuxSession(\n tmux: TmuxManager,\n project: Project,\n layout: LayoutConfig\n): Promise<string> {\n switch (layout.type) {\n case 'split-claude':\n return tmux.createSplitSession(project.name, project.path.path, layout.claudeArgs);\n case 'three-pane':\n return tmux.createThreePaneSession(\n project.name,\n project.path.path,\n layout.claudeArgs,\n layout.npmCommand!\n );\n case 'two-pane-npm':\n return tmux.createTwoPaneNpmSession(project.name, project.path.path, layout.npmCommand!);\n }\n}\n\nasync function handleSplitTerminal(\n project: Project,\n isShellMode: boolean,\n dryRun: boolean,\n shellCommands: string[],\n events: string[],\n ctx: OpenContext\n): Promise<void> {\n const layout: LayoutConfig = {\n type: 'split-claude',\n handledEvents: ['cwd', 'claude'],\n dryRunMessage: `Would create split tmux session '${project.name}' with Claude`,\n claudeArgs: getClaudeArgs(project),\n npmCommand: null,\n };\n await handleTmuxLayout(project, layout, { isShellMode, dryRun }, shellCommands, events, ctx);\n}\n\nasync function handleThreePaneLayout(\n project: Project,\n isShellMode: boolean,\n dryRun: boolean,\n shellCommands: string[],\n events: string[],\n ctx: OpenContext\n): Promise<void> {\n const layout: LayoutConfig = {\n type: 'three-pane',\n handledEvents: ['cwd', 'claude', 'npm'],\n dryRunMessage: `Would create three-pane tmux session '${project.name}' with Claude and NPM`,\n claudeArgs: getClaudeArgs(project),\n npmCommand: await getNpmCommand(project),\n };\n await handleTmuxLayout(project, layout, { isShellMode, dryRun }, shellCommands, events, ctx);\n}\n\nasync function handleTwoPaneNpmLayout(\n project: Project,\n isShellMode: boolean,\n dryRun: boolean,\n shellCommands: string[],\n events: string[],\n ctx: OpenContext\n): Promise<void> {\n const layout: LayoutConfig = {\n type: 'two-pane-npm',\n handledEvents: ['cwd', 'npm'],\n dryRunMessage: `Would create two-pane tmux session '${project.name}' with NPM`,\n claudeArgs: [],\n npmCommand: await getNpmCommand(project),\n };\n await handleTmuxLayout(project, layout, { isShellMode, dryRun }, shellCommands, events, ctx);\n}\n\nasync function processEvent(\n event: string,\n context: EventProcessingContext,\n ctx: OpenContext\n): Promise<void> {\n const { log } = ctx;\n\n log.debug(`Processing event ${event}`);\n\n const eventHandler = EventRegistry.getEventByName(event);\n if (!eventHandler) {\n log.debug(`No event handler found for: ${event}`);\n return;\n }\n\n try {\n await eventHandler.processing.processEvent(context);\n } catch (error) {\n log.error(`Failed to process event '${event}': ${(error as Error).message}`);\n log.debug(`Event error stack: ${(error as Error).stack}`);\n // Continue processing other events rather than stopping completely\n }\n}\n\nasync function showProjectHelp(projectName: string, ctx: OpenContext): Promise<void> {\n const { config } = ctx;\n const projects = config.getProjects();\n\n if (!(projectName in projects)) {\n console.error(`Project '${projectName}' not found`);\n return;\n }\n\n const projectConfig = projects[projectName];\n const configuredEvents = Object.keys(projectConfig.events || {});\n\n console.log(`\\nAvailable commands for '${projectName}':`);\n console.log('-'.repeat(50));\n\n for (const eventName of configuredEvents) {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = projectConfig.events[eventName as keyof typeof projectConfig.events];\n let configDesc = '';\n if (eventConfig !== true && eventConfig !== 'true') {\n if (typeof eventConfig === 'object') {\n configDesc = ` (${JSON.stringify(eventConfig)})`;\n } else {\n configDesc = ` (${eventConfig})`;\n }\n }\n console.log(` ${eventName.padEnd(8)} - ${eventHandler.metadata.description}${configDesc}`);\n }\n }\n\n console.log('\\nUsage examples:');\n console.log(` workon ${projectName} # Execute all commands`);\n console.log(` workon ${projectName}:cwd # Just change directory`);\n console.log(` workon ${projectName}:claude # Just Claude (auto-adds cwd)`);\n\n if (configuredEvents.length > 1) {\n const twoCommands = configuredEvents.slice(0, 2).join(',');\n console.log(` workon ${projectName}:${twoCommands.padEnd(12)} # Multiple commands`);\n }\n\n console.log(` workon ${projectName}:cwd --shell # Output shell commands\\n`);\n}\n","import { Command } from 'commander';\nimport { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport loog from 'loog';\nimport omelette from 'omelette';\nimport File from 'phylo';\nimport { Config } from '../lib/config.js';\nimport { EnvironmentRecognizer } from '../lib/environment.js';\nimport { EventRegistry } from '../events/registry.js';\nimport { createOpenCommand } from './open.js';\nimport { createConfigCommand } from './config/index.js';\nimport { createManageCommand } from './manage.js';\nimport { createAddCommand } from './add.js';\nimport { createWorktreesCommand } from './worktrees/index.js';\nimport { createWorktreeCommand } from './worktree.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction findPackageJson(): string {\n // Try multiple paths to find package.json\n const paths = [\n join(__dirname, '../package.json'),\n join(__dirname, '../../package.json'),\n join(process.cwd(), 'package.json'),\n ];\n\n for (const p of paths) {\n if (existsSync(p)) {\n return p;\n }\n }\n\n throw new Error('Could not find package.json');\n}\n\ninterface GlobalOptions {\n debug?: boolean;\n shell?: boolean;\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n // Load package.json for version\n const packageJsonPath = findPackageJson();\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\n // Initialize config and logger\n const config = new Config();\n const log = loog({\n prefixStyle: 'ascii',\n logLevel: 'info',\n });\n\n // Store package info in config\n config.set('pkg', packageJson);\n\n // Configure environment recognizer\n EnvironmentRecognizer.configure(config, log);\n\n // Setup shell completion\n const completion = setupCompletion(config);\n\n program\n .name('workon')\n .description('Work on something great!')\n .version(packageJson.version)\n .enablePositionalOptions()\n .argument('[project]', 'Project name to open (supports project:command syntax)')\n .option('-d, --debug', 'Enable debug logging')\n .option('--completion', 'Setup shell tab completion')\n .option('--shell', 'Output shell commands for evaluation')\n .option('--init', 'Generate shell integration function')\n .hook('preAction', async (thisCommand) => {\n const opts = thisCommand.opts<GlobalOptions>();\n if (opts.debug) {\n log.setLogLevel('debug');\n }\n // Initialize event registry once before any command runs\n await EventRegistry.initialize();\n })\n .action(\n async (\n project: string | undefined,\n options: GlobalOptions & { completion?: boolean; init?: boolean }\n ) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n if (options.completion) {\n log.debug('Setting up command-line completion');\n completion.setupShellInitFile();\n return;\n }\n\n if (options.init) {\n log.debug('Generating shell integration function');\n outputShellInit(program);\n return;\n }\n\n // If a project name was provided, delegate to the open command logic\n if (project) {\n // Import and call open logic directly instead of re-parsing\n const { runOpen } = await import('./open.js');\n await runOpen(project, { debug: options.debug, shell: options.shell }, { config, log });\n return;\n }\n\n // Default action: run interactive mode\n const environment = await EnvironmentRecognizer.recognize(File.cwd());\n program.setOptionValue('_environment', environment);\n program.setOptionValue('_config', config);\n program.setOptionValue('_log', log);\n\n // Import and run interactive command\n const { runInteractive } = await import('./interactive.js');\n await runInteractive({ config, log, environment });\n }\n );\n\n // Store shared state for subcommands\n program.setOptionValue('_config', config);\n program.setOptionValue('_log', log);\n\n // Add commands\n program.addCommand(createOpenCommand({ config, log }));\n program.addCommand(createAddCommand({ config, log }));\n program.addCommand(createConfigCommand({ config, log }));\n program.addCommand(createManageCommand({ config, log }));\n program.addCommand(createWorktreesCommand({ config, log }));\n program.addCommand(createWorktreeCommand({ config, log }));\n\n // Handle unknown commands as project names\n program.on('command:*', async (operands) => {\n const projectName = operands[0];\n\n // Check if it looks like a project name (not a flag)\n if (projectName && !projectName.startsWith('-')) {\n const openCmd = program.commands.find((c) => c.name() === 'open');\n if (openCmd) {\n // Re-parse with open command and project name\n const args = [\n 'open',\n ...operands,\n ...process.argv.slice(2).filter((a) => a.startsWith('-')),\n ];\n await program.parseAsync(['node', 'workon', ...args]);\n return;\n }\n }\n\n console.error(`Unknown command: ${operands.join(' ')}`);\n program.help();\n });\n\n program.showHelpAfterError(true);\n\n return program;\n}\n\nfunction setupCompletion(config: Config): ReturnType<typeof omelette> {\n const tree: Record<string, string[] | null> = {\n config: ['list', 'set', 'unset'],\n manage: null,\n };\n\n const projects = config.getProjects();\n if (projects) {\n Object.keys(projects).forEach((id) => {\n tree[id] = null;\n });\n }\n\n const completion = omelette('workon').tree(tree);\n completion.init();\n\n return completion;\n}\n\nfunction outputShellInit(program: Command): void {\n // Get list of available commands\n const cmdNames = program.commands.map((c) => c.name());\n\n // Get list of available options\n const switchFlags: string[] = [];\n program.options.forEach((opt) => {\n switchFlags.push('--' + opt.long?.replace(/^--/, ''));\n if (opt.short) {\n switchFlags.push(opt.short);\n }\n });\n\n // Built-in flags\n const builtinFlags = ['--help', '-h', '--version', '-V', 'help'];\n\n // Combine all non-shell commands and flags\n const nonShellCommands = [...new Set([...cmdNames, ...switchFlags, ...builtinFlags])];\n const casePattern = nonShellCommands.join('|');\n\n // Generate shell function\n const shellFunction = `\n# workon shell integration\nworkon() {\n # Commands and flags that should NOT use shell mode\n case \"$1\" in\n ${casePattern})\n command workon \"$@\"\n return $?\n ;;\n esac\n\n # If no arguments provided, run interactive mode directly\n if [[ $# -eq 0 ]]; then\n command workon \"$@\"\n return $?\n fi\n\n # Default behavior: use shell mode for project opening\n local output\n output=$(command workon --shell \"$@\" 2>&1)\n local exit_code=$?\n\n if [[ $exit_code -eq 0 && -n \"$output\" ]]; then\n # Execute shell commands if workon succeeded and output exists\n eval \"$output\"\n else\n # Show any error output\n [[ -n \"$output\" ]] && echo \"$output\" >&2\n return $exit_code\n fi\n}`;\n\n console.log(shellFunction);\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\nimport { createListCommand } from './list.js';\nimport { createSetCommand } from './set.js';\nimport { createUnsetCommand } from './unset.js';\n\ninterface ConfigContext {\n config: Config;\n log: Logger;\n}\n\nexport function createConfigCommand(ctx: ConfigContext): Command {\n const command = new Command('config').description('Manage configuration parameters');\n\n command.addCommand(createListCommand(ctx));\n command.addCommand(createSetCommand(ctx));\n command.addCommand(createUnsetCommand(ctx));\n\n // Default action shows list\n command.action(() => {\n command.commands.find((c) => c.name() === 'list')?.parse();\n });\n\n return command;\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\n\ninterface ConfigContext {\n config: Config;\n log: Logger;\n}\n\nfunction flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(result, flattenObject(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\nexport function createListCommand(ctx: ConfigContext): Command {\n const { config, log } = ctx;\n\n return new Command('list').description('List configuration parameters').action(() => {\n log.debug('Listing configuration');\n\n console.log(`Configuration file: ${config.path}\\n`);\n\n const store = config.store;\n const flattened = flattenObject(store as unknown as Record<string, unknown>);\n\n for (const [key, value] of Object.entries(flattened)) {\n const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);\n console.log(`${key}: ${displayValue}`);\n }\n });\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\n\ninterface ConfigContext {\n config: Config;\n log: Logger;\n}\n\nexport function createSetCommand(ctx: ConfigContext): Command {\n const { config, log } = ctx;\n\n return new Command('set')\n .description('Set a configuration parameter')\n .argument('<key>', 'The configuration parameter to set')\n .argument('<value>', 'The value to set')\n .action((key: string, value: string) => {\n log.debug(`Setting ${key} to ${value}`);\n\n // Try to parse as JSON if possible\n let parsedValue: unknown = value;\n try {\n // Handle booleans\n if (value === 'true') {\n parsedValue = true;\n } else if (value === 'false') {\n parsedValue = false;\n } else if (!isNaN(Number(value)) && value.trim() !== '') {\n // Handle numbers\n parsedValue = Number(value);\n } else {\n // Try JSON parse for objects/arrays\n parsedValue = JSON.parse(value);\n }\n } catch {\n // Keep as string if not valid JSON\n parsedValue = value;\n }\n\n config.set(key, parsedValue);\n console.log(\n `Set ${key} = ${typeof parsedValue === 'object' ? JSON.stringify(parsedValue) : parsedValue}`\n );\n });\n}\n","import { Command } from 'commander';\nimport type { Config } from '../../lib/config.js';\nimport type { Logger } from '../../types/index.js';\n\ninterface ConfigContext {\n config: Config;\n log: Logger;\n}\n\nexport function createUnsetCommand(ctx: ConfigContext): Command {\n const { config, log } = ctx;\n\n return new Command('unset')\n .description('Remove a configuration parameter')\n .argument('<key>', 'The configuration parameter to remove')\n .option('--silent', 'Suppress console output')\n .action((key: string, options: { silent?: boolean }) => {\n log.debug(`Removing ${key}`);\n\n if (config.has(key)) {\n config.delete(key);\n if (!options.silent) {\n console.log(`Removed ${key}`);\n }\n } else {\n if (!options.silent) {\n console.log(`Key ${key} not found`);\n }\n }\n });\n}\n","import { Command } from 'commander';\nimport { select, input, confirm, checkbox } from '@inquirer/prompts';\nimport File from 'phylo';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ProjectConfig, EventsConfig } from '../types/index.js';\nimport { EventRegistry } from '../events/registry.js';\nimport { IDE_CHOICES } from '../types/constants.js';\n\ninterface ManageContext {\n config: Config;\n log: Logger;\n}\n\nexport function createManageCommand(ctx: ManageContext): Command {\n const { log } = ctx;\n\n return new Command('manage')\n .description('Interactive project management')\n .option('-d, --debug', 'Enable debug logging')\n .action(async (options: { debug?: boolean }) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n await mainMenu(ctx);\n });\n}\n\nasync function mainMenu(ctx: ManageContext): Promise<void> {\n const { config } = ctx;\n const projects = config.getProjects();\n const hasProjects = Object.keys(projects).length > 0;\n\n const choices = [\n { name: 'Create new project', value: 'create' },\n ...(hasProjects\n ? [\n { name: 'Edit project', value: 'edit' },\n { name: 'Delete project', value: 'delete' },\n { name: 'List projects', value: 'list' },\n ]\n : []),\n { name: 'Exit', value: 'exit' },\n ];\n\n const action = await select({\n message: 'What would you like to do?',\n choices,\n });\n\n switch (action) {\n case 'create':\n await createProject(ctx);\n break;\n case 'edit':\n await editProject(ctx);\n break;\n case 'delete':\n await deleteProject(ctx);\n break;\n case 'list':\n await listProjects(ctx);\n break;\n case 'exit':\n return;\n }\n\n // Return to main menu\n await mainMenu(ctx);\n}\n\nasync function createProject(ctx: ManageContext): Promise<void> {\n const { config, log } = ctx;\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n // Project name\n const name = await input({\n message: 'Project name:',\n validate: (value) => {\n if (!value.trim()) return 'Name is required';\n if (!/^[\\w-]+$/.test(value))\n return 'Name can only contain letters, numbers, underscores, and hyphens';\n if (value in projects) return 'Project already exists';\n return true;\n },\n });\n\n // Project path\n const defaultPath = defaults?.base ? File.from(defaults.base).join(name).path : name;\n const pathInput = await input({\n message: 'Project path:',\n default: defaultPath,\n validate: (value) => {\n const path = File.from(value);\n try {\n const exists = path.exists();\n if (!exists) return `Path does not exist: ${value}`;\n const stat = path.stat();\n if (!stat.isDirectory()) return 'Path must be a directory';\n return true;\n } catch {\n return `Invalid path: ${value}`;\n }\n },\n });\n\n // Convert to relative path if possible\n let relativePath = pathInput;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base).absolutify();\n const pathFile = File.from(pathInput);\n try {\n const relPath = pathFile.relativize(baseDir.path);\n if (relPath && !relPath.path.startsWith('..')) {\n relativePath = relPath.path;\n }\n } catch {\n relativePath = pathInput;\n }\n }\n\n // IDE selection\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n });\n\n // Homepage (optional)\n const homepage = await input({\n message: 'Project homepage URL (optional):',\n default: '',\n });\n\n // Event selection\n const availableEvents = EventRegistry.getEventsForManageUI();\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: e.value === 'cwd' || e.value === 'ide',\n })),\n });\n\n // Configure each selected event\n const events: EventsConfig = {};\n for (const eventName of selectedEvents) {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n\n // Build project config\n const projectConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n if (homepage.trim()) {\n projectConfig.homepage = homepage.trim();\n }\n\n // Confirm\n console.log('\\nProject configuration:');\n console.log(JSON.stringify(projectConfig, null, 2));\n\n const confirmed = await confirm({\n message: 'Save this project?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(name, projectConfig);\n log.info(`Project '${name}' created successfully!`);\n log.info(`Use 'workon ${name}' to start working!`);\n } else {\n log.info('Project creation cancelled.');\n }\n}\n\nasync function editProject(ctx: ManageContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n const projectNames = Object.keys(projects);\n\n if (projectNames.length === 0) {\n log.info('No projects to edit.');\n return;\n }\n\n const name = await select({\n message: 'Select project to edit:',\n choices: projectNames.map((n) => ({ name: n, value: n })),\n });\n\n const project = projects[name];\n const defaults = config.getDefaults();\n\n // Path\n const pathInput = await input({\n message: 'Project path:',\n default: project.path,\n });\n\n let relativePath = pathInput;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base).absolutify();\n const pathFile = File.from(pathInput);\n try {\n if (pathFile.isAbsolute()) {\n const relPath = pathFile.relativize(baseDir.path);\n if (relPath && !relPath.path.startsWith('..')) {\n relativePath = relPath.path;\n }\n }\n } catch {\n relativePath = pathInput;\n }\n }\n\n // IDE\n const ide = await select({\n message: 'Select IDE:',\n choices: IDE_CHOICES,\n default: project.ide || 'vscode',\n });\n\n // Homepage\n const homepage = await input({\n message: 'Project homepage URL:',\n default: project.homepage || '',\n });\n\n // Keep existing events or reconfigure?\n const keepEvents = await confirm({\n message: 'Keep existing event configuration?',\n default: true,\n });\n\n let events = project.events;\n if (!keepEvents) {\n const availableEvents = EventRegistry.getEventsForManageUI();\n const currentEvents = Object.keys(project.events);\n\n const selectedEvents = await checkbox({\n message: 'Select events to enable:',\n choices: availableEvents.map((e) => ({\n name: `${e.name} - ${e.description}`,\n value: e.value,\n checked: currentEvents.includes(e.value),\n })),\n });\n\n events = {};\n for (const eventName of selectedEvents) {\n // Keep existing config if event was previously configured\n if (project.events[eventName]) {\n (events as Record<string, unknown>)[eventName] = project.events[eventName];\n } else {\n const eventHandler = EventRegistry.getEventByName(eventName);\n if (eventHandler) {\n const eventConfig = await eventHandler.configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig as EventsConfig[keyof EventsConfig];\n }\n }\n }\n }\n\n // Build updated config\n const updatedConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events,\n };\n\n if (homepage.trim()) {\n updatedConfig.homepage = homepage.trim();\n }\n\n // Confirm\n console.log('\\nUpdated configuration:');\n console.log(JSON.stringify(updatedConfig, null, 2));\n\n const confirmed = await confirm({\n message: 'Save changes?',\n default: true,\n });\n\n if (confirmed) {\n await config.setProjectSafe(name, updatedConfig);\n log.info(`Project '${name}' updated successfully!`);\n } else {\n log.info('Edit cancelled.');\n }\n}\n\nasync function deleteProject(ctx: ManageContext): Promise<void> {\n const { config, log } = ctx;\n const projects = config.getProjects();\n const projectNames = Object.keys(projects);\n\n if (projectNames.length === 0) {\n log.info('No projects to delete.');\n return;\n }\n\n const name = await select({\n message: 'Select project to delete:',\n choices: projectNames.map((n) => ({ name: n, value: n })),\n });\n\n const confirmed = await confirm({\n message: `Are you sure you want to delete '${name}'?`,\n default: false,\n });\n\n if (confirmed) {\n await config.deleteProjectSafe(name);\n log.info(`Project '${name}' deleted.`);\n } else {\n log.info('Delete cancelled.');\n }\n}\n\nasync function listProjects(ctx: ManageContext): Promise<void> {\n const { config } = ctx;\n const projects = config.getProjects();\n const defaults = config.getDefaults();\n\n console.log('\\nConfigured projects:\\n');\n\n for (const [name, project] of Object.entries(projects)) {\n const fullPath = defaults?.base\n ? File.from(defaults.base).join(project.path).path\n : project.path;\n\n console.log(` ${name}`);\n console.log(` Path: ${fullPath}`);\n console.log(` IDE: ${project.ide || 'not set'}`);\n console.log(` Events: ${Object.keys(project.events).join(', ') || 'none'}`);\n if (project.homepage) {\n console.log(` Homepage: ${project.homepage}`);\n }\n console.log();\n }\n}\n","import { Command } from 'commander';\nimport { existsSync, readFileSync } from 'fs';\nimport { basename, resolve } from 'path';\nimport File from 'phylo';\nimport { confirm } from '@inquirer/prompts';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ProjectConfig, IdeType } from '../types/index.js';\n\ninterface AddContext {\n config: Config;\n log: Logger;\n}\n\ninterface AddOptions {\n debug?: boolean;\n name?: string;\n ide?: IdeType;\n force?: boolean;\n}\n\ninterface ProjectDiscovery {\n name: string;\n isNode: boolean;\n isBun: boolean;\n hasClaude: boolean;\n detectedIde: IdeType | null;\n packageJson: Record<string, unknown> | null;\n}\n\nexport function createAddCommand(ctx: AddContext): Command {\n const { log } = ctx;\n\n return new Command('add')\n .description('Add a project from a directory path')\n .argument('[path]', 'Path to the project directory (defaults to current directory)', '.')\n .option('-d, --debug', 'Enable debug logging')\n .option('-n, --name <name>', 'Override the detected project name')\n .option(\n '-i, --ide <ide>',\n 'Specify the IDE to use (vscode, idea, atom, code, subl, vim, emacs)'\n )\n .option('-f, --force', 'Overwrite existing project with same name')\n .action(async (pathArg: string, options: AddOptions) => {\n if (options.debug) {\n log.setLogLevel('debug');\n }\n\n await addProject(pathArg, options, ctx);\n });\n}\n\nasync function addProject(pathArg: string, options: AddOptions, ctx: AddContext): Promise<void> {\n const { config, log } = ctx;\n const defaults = config.getDefaults();\n const projects = config.getProjects();\n\n // Resolve the path\n const targetPath = resolve(pathArg);\n log.debug(`Resolved path: ${targetPath}`);\n\n // Validate path exists and is a directory\n if (!existsSync(targetPath)) {\n log.error(`Path does not exist: ${targetPath}`);\n process.exit(1);\n }\n\n const pathFile = File.from(targetPath);\n try {\n const stat = pathFile.stat();\n if (!stat.isDirectory()) {\n log.error(`Path is not a directory: ${targetPath}`);\n process.exit(1);\n }\n } catch {\n log.error(`Cannot access path: ${targetPath}`);\n process.exit(1);\n }\n\n // Auto-discover project details\n const discovery = discoverProject(targetPath, log);\n log.debug(`Discovery result: ${JSON.stringify(discovery)}`);\n\n // Determine project name\n const projectName = options.name || discovery.name;\n log.debug(`Project name: ${projectName}`);\n\n // Validate project name\n if (!/^[\\w-]+$/.test(projectName)) {\n log.error(`Invalid project name: ${projectName}`);\n log.error('Name can only contain letters, numbers, underscores, and hyphens');\n process.exit(1);\n }\n\n // Check for existing project\n if (projectName in projects && !options.force) {\n const overwrite = await confirm({\n message: `Project '${projectName}' already exists. Overwrite?`,\n default: false,\n });\n\n if (!overwrite) {\n log.info('Cancelled.');\n return;\n }\n }\n\n // Determine IDE\n const ide: IdeType = options.ide || discovery.detectedIde || 'code';\n log.debug(`IDE: ${ide}`);\n\n // Calculate relative path if possible\n let relativePath = targetPath;\n if (defaults?.base) {\n const baseDir = File.from(defaults.base).absolutify();\n try {\n const relPath = pathFile.relativize(baseDir.path);\n if (relPath && !relPath.path.startsWith('..')) {\n relativePath = relPath.path;\n }\n } catch {\n // Keep absolute path\n }\n }\n log.debug(`Relative path: ${relativePath}`);\n\n // Build project config\n const projectConfig: ProjectConfig = {\n path: relativePath,\n ide,\n events: {\n cwd: true,\n ide: true,\n },\n };\n\n // Add npm event if it's a Node/Bun project with scripts\n if ((discovery.isNode || discovery.isBun) && discovery.packageJson) {\n const scripts = discovery.packageJson.scripts as Record<string, string> | undefined;\n if (scripts && (scripts.dev || scripts.start)) {\n projectConfig.events.npm = scripts.dev ? 'dev' : 'start';\n }\n }\n\n // Add claude event if CLAUDE.md is detected\n if (discovery.hasClaude) {\n projectConfig.events.claude = true;\n }\n\n // Save the project\n await config.setProjectSafe(projectName, projectConfig);\n\n // Output success\n log.info(`Added project '${projectName}'`);\n log.info(` Path: ${relativePath}`);\n log.info(` IDE: ${ide}`);\n log.info(` Events: ${Object.keys(projectConfig.events).join(', ')}`);\n log.info('');\n log.info(`Use 'workon ${projectName}' to start working!`);\n}\n\nfunction discoverProject(targetPath: string, log: Logger): ProjectDiscovery {\n const dirName = basename(targetPath);\n\n const discovery: ProjectDiscovery = {\n name: dirName,\n isNode: false,\n isBun: false,\n hasClaude: false,\n detectedIde: null,\n packageJson: null,\n };\n\n // Check for package.json (Node project)\n const packageJsonPath = resolve(targetPath, 'package.json');\n if (existsSync(packageJsonPath)) {\n discovery.isNode = true;\n log.debug('Detected Node project (package.json found)');\n\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n discovery.packageJson = JSON.parse(content);\n\n // Use package.json name if available and valid\n const pkgName = discovery.packageJson?.name as string | undefined;\n if (pkgName && /^[\\w-]+$/.test(pkgName)) {\n discovery.name = pkgName;\n log.debug(`Using name from package.json: ${pkgName}`);\n }\n } catch (error) {\n log.debug(`Failed to parse package.json: ${(error as Error).message}`);\n }\n }\n\n // Check for bun.lockb (Bun project)\n const bunLockPath = resolve(targetPath, 'bun.lockb');\n if (existsSync(bunLockPath)) {\n discovery.isBun = true;\n log.debug('Detected Bun project (bun.lockb found)');\n }\n\n // Detect IDE from config directories\n const vscodeDir = resolve(targetPath, '.vscode');\n const cursorDir = resolve(targetPath, '.cursor');\n const ideaDir = resolve(targetPath, '.idea');\n\n if (existsSync(cursorDir)) {\n discovery.detectedIde = 'cursor';\n log.debug('Detected Cursor (.cursor directory found)');\n } else if (existsSync(vscodeDir)) {\n discovery.detectedIde = 'code';\n log.debug('Detected VS Code (.vscode directory found)');\n } else if (existsSync(ideaDir)) {\n discovery.detectedIde = 'idea';\n log.debug('Detected IntelliJ IDEA (.idea directory found)');\n }\n\n // Detect Claude Code project\n const claudeMdPath = resolve(targetPath, 'CLAUDE.md');\n if (existsSync(claudeMdPath)) {\n discovery.hasClaude = true;\n log.debug('Detected Claude Code project (CLAUDE.md found)');\n }\n\n return discovery;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { select, confirm } from '@inquirer/prompts';\nimport { simpleGit } from 'simple-git';\nimport type { Config } from '../lib/config.js';\nimport type { Logger } from '../types/index.js';\nimport { WorktreeManager } from '../lib/worktree.js';\nimport { TmuxManager } from '../lib/tmux.js';\nimport { detectWorktreeContext, type WorktreeInfo } from './worktrees/utils.js';\n\ninterface WorktreeContext {\n config: Config;\n log: Logger;\n}\n\n/**\n * Create the singular 'worktree' command for operating on the current worktree\n */\nexport function createWorktreeCommand(ctx: WorktreeContext): Command {\n const { log } = ctx;\n\n const command = new Command('worktree').description(\n 'Operate on the current worktree (run from within a worktree)'\n );\n\n // Default action: show worktree status\n command.action(async () => {\n const worktreeInfo = await detectWorktreeContext();\n\n if (!worktreeInfo) {\n log.error('Not in a git repository.');\n process.exit(1);\n }\n\n if (!worktreeInfo.isWorktree) {\n log.error(\"You're in the main repository, not a worktree.\");\n log.info(`Use 'workon worktrees' to manage worktrees for this project.`);\n process.exit(1);\n }\n\n await showWorktreeStatus(worktreeInfo, log);\n });\n\n // Subcommand: status\n command\n .command('status')\n .description('Show status of the current worktree')\n .action(async () => {\n const worktreeInfo = await detectWorktreeContext();\n\n if (!worktreeInfo) {\n log.error('Not in a git repository.');\n process.exit(1);\n }\n\n if (!worktreeInfo.isWorktree) {\n log.error(\"You're in the main repository, not a worktree.\");\n process.exit(1);\n }\n\n await showWorktreeStatus(worktreeInfo, log);\n });\n\n // Subcommand: merge\n command\n .command('merge')\n .description('Merge this worktree branch into a target branch')\n .option('-i, --into <branch>', 'Target branch to merge into')\n .option('-s, --squash', 'Use squash merge')\n .option('-k, --keep', 'Keep the worktree after merging')\n .option('-y, --yes', 'Skip confirmation prompts')\n .action(async (options: { into?: string; squash?: boolean; keep?: boolean; yes?: boolean }) => {\n const worktreeInfo = await detectWorktreeContext();\n\n if (!worktreeInfo) {\n log.error('Not in a git repository.');\n process.exit(1);\n }\n\n if (!worktreeInfo.isWorktree) {\n log.error(\"You're in the main repository, not a worktree.\");\n log.info(`Use 'workon worktrees merge <name>' from the main repository.`);\n process.exit(1);\n }\n\n await mergeCurrentWorktree(worktreeInfo, options, ctx);\n });\n\n // Subcommand: remove\n command\n .command('remove')\n .description('Remove the current worktree')\n .option('-f, --force', 'Force removal even with uncommitted changes')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options: { force?: boolean; yes?: boolean }) => {\n const worktreeInfo = await detectWorktreeContext();\n\n if (!worktreeInfo) {\n log.error('Not in a git repository.');\n process.exit(1);\n }\n\n if (!worktreeInfo.isWorktree) {\n log.error(\"You're in the main repository, not a worktree.\");\n log.info(`Use 'workon worktrees remove <name>' from the main repository.`);\n process.exit(1);\n }\n\n await removeCurrentWorktree(worktreeInfo, options, ctx);\n });\n\n return command;\n}\n\nasync function showWorktreeStatus(worktreeInfo: WorktreeInfo, log: Logger): Promise<void> {\n if (!worktreeInfo.worktreePath) {\n log.error('Unable to determine worktree path.');\n return;\n }\n\n const git = simpleGit(worktreeInfo.worktreePath);\n\n // Get git status\n const status = await git.status();\n const hasChanges =\n status.modified.length > 0 ||\n status.not_added.length > 0 ||\n status.deleted.length > 0 ||\n status.staged.length > 0;\n\n console.log(chalk.bold('\\nCurrent Worktree:'));\n console.log('-'.repeat(50));\n console.log(` Name: ${chalk.cyan(worktreeInfo.worktreeName)}`);\n console.log(\n ` Branch: ${worktreeInfo.branch === '(detached)' ? chalk.yellow(worktreeInfo.branch) : chalk.green(worktreeInfo.branch)}`\n );\n console.log(` Path: ${chalk.gray(worktreeInfo.worktreePath)}`);\n console.log(` Main: ${chalk.gray(worktreeInfo.mainRepoPath)}`);\n console.log(\n ` Status: ${hasChanges ? chalk.yellow('uncommitted changes') : chalk.green('clean')}`\n );\n\n if (hasChanges) {\n console.log(`\\n${chalk.bold('Changes:')}`);\n if (status.staged.length > 0) {\n console.log(` Staged: ${status.staged.length} file(s)`);\n }\n if (status.modified.length > 0) {\n console.log(` Modified: ${status.modified.length} file(s)`);\n }\n if (status.not_added.length > 0) {\n console.log(` Untracked: ${status.not_added.length} file(s)`);\n }\n if (status.deleted.length > 0) {\n console.log(` Deleted: ${status.deleted.length} file(s)`);\n }\n }\n\n console.log(`\\n${chalk.bold('Commands:')}`);\n console.log(` workon worktree merge - Merge this branch and remove worktree`);\n console.log(` workon worktree remove - Remove this worktree`);\n console.log();\n}\n\nasync function mergeCurrentWorktree(\n worktreeInfo: WorktreeInfo,\n options: { into?: string; squash?: boolean; keep?: boolean; yes?: boolean },\n ctx: WorktreeContext\n): Promise<void> {\n const { log } = ctx;\n\n if (!worktreeInfo.worktreePath || !worktreeInfo.worktreeName) {\n log.error('Unable to determine worktree info.');\n process.exit(1);\n }\n\n if (worktreeInfo.branch === '(detached)') {\n log.error('Cannot merge a detached HEAD. Create a branch first.');\n log.info(`Use 'git checkout -b <branch-name>' to create a branch.`);\n process.exit(1);\n }\n\n const manager = new WorktreeManager(worktreeInfo.mainRepoPath);\n\n // Check for uncommitted changes\n const hasChanges = await manager.hasUncommittedChanges(worktreeInfo.worktreeName);\n if (hasChanges) {\n log.error('This worktree has uncommitted changes.');\n log.info('Please commit or stash your changes before merging.');\n process.exit(1);\n }\n\n // Select target branch\n let targetBranch = options.into;\n if (!targetBranch) {\n const branches = await manager.getBranches();\n const targetBranches = branches.filter((b) => b !== worktreeInfo.branch);\n\n if (targetBranches.length === 0) {\n log.error('No other branches available to merge into.');\n process.exit(1);\n }\n\n const commonTargets = ['main', 'master', 'develop', 'dev'];\n const defaultTarget =\n commonTargets.find((t) => targetBranches.includes(t)) || targetBranches[0];\n\n targetBranch = await select({\n message: `Merge '${worktreeInfo.branch}' into which branch?`,\n choices: targetBranches.map((b) => ({ name: b, value: b })),\n default: defaultTarget,\n });\n }\n\n // Verify target branch exists\n if (!(await manager.branchExists(targetBranch))) {\n log.error(`Target branch '${targetBranch}' does not exist.`);\n process.exit(1);\n }\n\n // Select merge strategy\n let squash = options.squash;\n if (squash === undefined && !options.yes) {\n squash = await confirm({\n message: 'Use squash merge? (combines all commits into one)',\n default: false,\n });\n }\n\n // Confirm the operation\n if (!options.yes) {\n console.log(`\\n${chalk.bold('Merge operation:')}`);\n console.log(` Source: ${chalk.green(worktreeInfo.branch)}`);\n console.log(` Target: ${chalk.cyan(targetBranch)}`);\n console.log(` Method: ${squash ? 'Squash merge' : 'Regular merge'}`);\n console.log(` Action: ${options.keep ? 'Keep worktree' : 'Remove worktree after merge'}`);\n console.log();\n\n const shouldProceed = await confirm({\n message: 'Proceed with merge?',\n default: true,\n });\n\n if (!shouldProceed) {\n log.info('Merge cancelled.');\n return;\n }\n }\n\n // Perform the merge\n const mergeSpinner = ora(`Merging '${worktreeInfo.branch}' into '${targetBranch}'...`).start();\n\n try {\n await manager.merge(worktreeInfo.worktreeName, {\n targetBranch,\n squash: squash || false,\n });\n mergeSpinner.succeed(`Successfully merged '${worktreeInfo.branch}' into '${targetBranch}'`);\n } catch (error) {\n mergeSpinner.fail(`Merge failed: ${(error as Error).message}`);\n log.info('You may need to resolve conflicts manually.');\n process.exit(1);\n }\n\n // Remove worktree if not keeping\n if (!options.keep) {\n log.warn('You need to exit this worktree directory before it can be removed.');\n\n const shouldContinue = await confirm({\n message: `Remove worktree '${worktreeInfo.worktreeName}'? (You'll need to cd out first)`,\n default: true,\n });\n\n if (shouldContinue) {\n // Kill any associated tmux session\n const tmux = new TmuxManager();\n const sessionName = tmux.getWorktreeSessionName(\n worktreeInfo.mainRepoPath.split('/').pop() || 'project',\n worktreeInfo.worktreeName\n );\n if (await tmux.sessionExists(sessionName)) {\n log.debug(`Killing tmux session: ${sessionName}`);\n await tmux.killSession(sessionName);\n }\n\n log.info(`\\nTo complete removal, run from the main project directory:`);\n console.log(chalk.cyan(` cd ${worktreeInfo.mainRepoPath}`));\n console.log(chalk.cyan(` workon worktrees remove ${worktreeInfo.worktreeName}`));\n }\n\n // Ask about deleting the branch\n if (!options.yes) {\n const shouldDeleteBranch = await confirm({\n message: `Delete the merged branch '${worktreeInfo.branch}'?`,\n default: false,\n });\n\n if (shouldDeleteBranch) {\n const deleteSpinner = ora(`Deleting branch '${worktreeInfo.branch}'...`).start();\n try {\n const git = simpleGit(worktreeInfo.mainRepoPath);\n await git.deleteLocalBranch(worktreeInfo.branch!, true);\n deleteSpinner.succeed(`Branch '${worktreeInfo.branch}' deleted`);\n } catch (error) {\n deleteSpinner.warn(`Failed to delete branch: ${(error as Error).message}`);\n }\n }\n }\n }\n\n console.log(chalk.green('\\nMerge completed!'));\n}\n\nasync function removeCurrentWorktree(\n worktreeInfo: WorktreeInfo,\n options: { force?: boolean; yes?: boolean },\n ctx: WorktreeContext\n): Promise<void> {\n const { log } = ctx;\n\n if (!worktreeInfo.worktreePath || !worktreeInfo.worktreeName) {\n log.error('Unable to determine worktree info.');\n process.exit(1);\n }\n\n const manager = new WorktreeManager(worktreeInfo.mainRepoPath);\n\n // Check for uncommitted changes\n const hasChanges = await manager.hasUncommittedChanges(worktreeInfo.worktreeName);\n if (hasChanges && !options.force) {\n log.warn('This worktree has uncommitted changes.');\n\n if (!options.yes) {\n const shouldForce = await confirm({\n message: 'Do you want to force removal and lose these changes?',\n default: false,\n });\n\n if (!shouldForce) {\n log.info('Removal cancelled.');\n return;\n }\n options.force = true;\n } else {\n log.error('Use --force to remove worktrees with uncommitted changes.');\n process.exit(1);\n }\n }\n\n // Confirm removal\n if (!options.yes) {\n console.log(`\\n${chalk.bold('Worktree to remove:')}`);\n console.log(` Name: ${chalk.cyan(worktreeInfo.worktreeName)}`);\n console.log(\n ` Branch: ${worktreeInfo.branch === '(detached)' ? chalk.yellow(worktreeInfo.branch) : chalk.green(worktreeInfo.branch)}`\n );\n console.log(` Path: ${chalk.gray(worktreeInfo.worktreePath)}`);\n console.log();\n\n const shouldRemove = await confirm({\n message: `Remove this worktree?`,\n default: true,\n });\n\n if (!shouldRemove) {\n log.info('Removal cancelled.');\n return;\n }\n }\n\n log.warn(\"You're currently inside this worktree. You need to exit before removal.\");\n log.info(`\\nTo remove this worktree:`);\n console.log(chalk.cyan(` cd ${worktreeInfo.mainRepoPath}`));\n console.log(\n chalk.cyan(\n ` workon worktrees remove ${worktreeInfo.worktreeName}${options.force ? ' --force' : ''}`\n )\n );\n}\n","#!/usr/bin/env node\n\n// Workaround for Node.js stdout buffering issues with interactive prompts\n// This ensures stdout is in the correct mode before any prompts are shown\nif (process.stdout.isTTY) {\n process.stdout.write('');\n}\n\nimport { createCli } from './commands/index.js';\n\nconst program = createCli();\n\nprogram.parseAsync().catch((error) => {\n // Handle user interrupts gracefully (Ctrl+C)\n if (error?.name === 'ExitPromptError' || error?.message?.includes('SIGINT')) {\n process.exit(130); // Standard exit code for SIGINT\n }\n // Re-throw other errors\n console.error(error);\n process.exit(1);\n});\n"],"mappings":"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","names":["resolve","path","File","resolve","spawn","spawn","spawn","spawn","input","spawn","input","confirm","input","spawn","execCallback","promisify","existsSync","simpleGit","input","exec","path","File","simpleGit","confirm","input","path","existsSync","Command","chalk","select","confirm","runWorktreeOpen","Command","chalk","ora","path","existsSync","confirm","Command","chalk","ora","path","select","confirm","simpleGit","Command","chalk","ora","path","confirm","simpleGit","Command","manageWorktreesInteractive","Command","chalk","File","path","execCallback","promisify","NpmEvent","wrapWithShellFallback","exec","select","input","checkbox","confirm","File","path","deepAssign","chalk","name","runWorktreeOpen","simpleGit","open_exports","createOpenCommand","Command","File","runInteractive","getClaudeArgs","getNpmCommand","NpmEvent","init_open","init_open","Command","readFileSync","existsSync","join","dirname","File","Command","Command","createListCommand","Command","Command","Command","createListCommand","Command","select","input","confirm","checkbox","File","path","Command","existsSync","basename","File","confirm","createAddCommand","Command","chalk","ora","select","confirm","simpleGit","dirname","join","existsSync","program","Command","readFileSync","runOpen","File","runInteractive","createOpenCommand","createAddCommand"]}
|