workon 3.2.2 → 3.2.3
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 +172 -46
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +132 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -1
- package/dist/index.d.ts +35 -1
- package/dist/index.js +132 -14
- 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/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/cli.ts"],"sourcesContent":["import Conf from 'conf';\nimport type { AppConfig, ProjectConfig, ProjectDefaults } from '../types/index.js';\n\nconst TRANSIENT_PROPS = ['pkg', 'work'] as const;\n\nexport class Config {\n private _transient: Record<string, unknown> = {};\n private _store: Conf<AppConfig>;\n\n constructor() {\n this._store = new Conf<AppConfig>({\n projectName: 'workon',\n });\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 if (value === undefined) {\n // Setting entire object\n this._store.set(key as keyof AppConfig, value as never);\n } else {\n this._store.set(key as keyof AppConfig, value as never);\n }\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 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 setProject(name: string, config: ProjectConfig): void {\n const projects = this.getProjects();\n projects[name] = config;\n this.set('projects', projects);\n }\n\n deleteProject(name: string): void {\n const projects = this.getProjects();\n delete projects[name];\n this.set('projects', projects);\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 this.config = new Config();\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';\n }\n\n const flags = config.flags || [];\n return flags.length > 0 ? `claude ${flags.join(' ')}` : 'claude';\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\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 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 escapedClaudeCmd = escapeForSingleQuotes(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}' '${escapedClaudeCmd}'`\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 escapedClaudeCmd = escapeForSingleQuotes(claudeCommand);\n const escapedNpmCmd = escapeForSingleQuotes(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}' '${escapedClaudeCmd}'`\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}' '${escapedNpmCmd}'`\n );\n\n // Set remain-on-exit to keep pane open if command fails\n await exec(`tmux set-option -t '${escapedSession}:0.2' remain-on-exit on`);\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 escapedNpmCmd = escapeForSingleQuotes(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}' '${escapedNpmCmd}'`\n );\n\n // Set remain-on-exit to keep pane open if command fails\n await exec(`tmux set-option -t '${escapedSession}:0.1' remain-on-exit on`);\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 escapedClaudeCmd = escapeForSingleQuotes(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}' '${escapedClaudeCmd}'`,\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 escapedClaudeCmd = escapeForSingleQuotes(claudeCommand);\n const escapedNpmCmd = escapeForSingleQuotes(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}' '${escapedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${escapedNpmCmd}'`,\n `tmux set-option -t '${escapedSession}:0.2' remain-on-exit on`,\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 escapedNpmCmd = escapeForSingleQuotes(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}' '${escapedNpmCmd}'`,\n `tmux set-option -t '${escapedSession}:0.1' remain-on-exit on`,\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 { select, input, checkbox, confirm } from '@inquirer/prompts';\nimport File from 'phylo';\nimport deepAssign from 'deep-assign';\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';\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}\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: '---', 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 projects[name] = projectConfig;\n config.set('projects', projects);\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 projects[branchName] = branchConfig;\n config.set('projects', projects);\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 config.setProject(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 config.setProject(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 config.deleteProject(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 config.deleteProject(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 config.setProject(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 config.deleteProject(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","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.debug(`Project '${projectName}' not found, starting interactive mode`);\n const { runInteractive } = await import('./interactive.js');\n await runInteractive({ config, log, environment, suggestedName: projectName });\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 return typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\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';\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\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 config.setProject(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 config.setProject(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 config.deleteProject(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 config.setProject(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","#!/usr/bin/env node\nimport { createCli } from './commands/index.js';\n\nconst program = createCli();\nprogram.parse();\n"],"mappings":"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","names":["File","resolve","spawn","spawn","spawn","spawn","input","spawn","input","confirm","input","spawn","input","confirm","File","deepAssign","name","File","runInteractive","NpmEvent","Command","readFileSync","existsSync","File","Command","Command","Command","Command","Command","Command","select","input","confirm","checkbox","File","Command","File","confirm","existsSync","program","Command","readFileSync","runOpen","File","runInteractive"]}
|
|
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/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/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\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 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 escapedClaudeCmd = escapeForSingleQuotes(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}' '${escapedClaudeCmd}'`\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 escapedClaudeCmd = escapeForSingleQuotes(claudeCommand);\n const escapedNpmCmd = escapeForSingleQuotes(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}' '${escapedClaudeCmd}'`\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}' '${escapedNpmCmd}'`\n );\n\n // Set remain-on-exit to keep pane open if command fails\n await exec(`tmux set-option -t '${escapedSession}:0.2' remain-on-exit on`);\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 escapedNpmCmd = escapeForSingleQuotes(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}' '${escapedNpmCmd}'`\n );\n\n // Set remain-on-exit to keep pane open if command fails\n await exec(`tmux set-option -t '${escapedSession}:0.1' remain-on-exit on`);\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 escapedClaudeCmd = escapeForSingleQuotes(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}' '${escapedClaudeCmd}'`,\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 escapedClaudeCmd = escapeForSingleQuotes(claudeCommand);\n const escapedNpmCmd = escapeForSingleQuotes(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}' '${escapedClaudeCmd}'`,\n `tmux split-window -h -t '${escapedSession}' -c '${escapedPath}'`,\n `tmux split-window -v -t '${escapedSession}:0.1' -c '${escapedPath}' '${escapedNpmCmd}'`,\n `tmux set-option -t '${escapedSession}:0.2' remain-on-exit on`,\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 escapedNpmCmd = escapeForSingleQuotes(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}' '${escapedNpmCmd}'`,\n `tmux set-option -t '${escapedSession}:0.1' remain-on-exit on`,\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 { select, input, checkbox, confirm } from '@inquirer/prompts';\nimport File from 'phylo';\nimport deepAssign from 'deep-assign';\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';\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}\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: '---', 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","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';\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\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","#!/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","File","resolve","spawn","spawn","spawn","spawn","input","spawn","input","confirm","input","spawn","input","confirm","File","deepAssign","name","File","runInteractive","NpmEvent","Command","readFileSync","existsSync","dirname","File","Command","Command","Command","Command","Command","Command","select","input","confirm","checkbox","File","Command","existsSync","File","confirm","dirname","existsSync","program","Command","readFileSync","runOpen","File","runInteractive"]}
|