workon 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -348,13 +348,13 @@ var init_interactive = __esm({
348
348
  });
349
349
 
350
350
  // src/commands/index.ts
351
- import { Command as Command7 } from "commander";
352
- import { readFileSync, existsSync } from "fs";
351
+ import { Command as Command8 } from "commander";
352
+ import { readFileSync as readFileSync2, existsSync as existsSync2 } from "fs";
353
353
  import { join, dirname } from "path";
354
354
  import { fileURLToPath } from "url";
355
355
  import loog from "loog";
356
356
  import omelette from "omelette";
357
- import File6 from "phylo";
357
+ import File7 from "phylo";
358
358
 
359
359
  // src/lib/config.ts
360
360
  import Conf from "conf";
@@ -2081,6 +2081,142 @@ async function listProjects(ctx) {
2081
2081
  }
2082
2082
  }
2083
2083
 
2084
+ // src/commands/add.ts
2085
+ import { Command as Command7 } from "commander";
2086
+ import { existsSync, readFileSync } from "fs";
2087
+ import { basename, resolve } from "path";
2088
+ import File6 from "phylo";
2089
+ import { confirm as confirm4 } from "@inquirer/prompts";
2090
+ function createAddCommand(ctx) {
2091
+ const { log } = ctx;
2092
+ return new Command7("add").description("Add a project from a directory path").argument("[path]", "Path to the project directory (defaults to current directory)", ".").option("-d, --debug", "Enable debug logging").option("-n, --name <name>", "Override the detected project name").option(
2093
+ "-i, --ide <ide>",
2094
+ "Specify the IDE to use (vscode, idea, atom, code, subl, vim, emacs)"
2095
+ ).option("-f, --force", "Overwrite existing project with same name").action(async (pathArg, options) => {
2096
+ if (options.debug) {
2097
+ log.setLogLevel("debug");
2098
+ }
2099
+ await addProject(pathArg, options, ctx);
2100
+ });
2101
+ }
2102
+ async function addProject(pathArg, options, ctx) {
2103
+ const { config, log } = ctx;
2104
+ const defaults = config.getDefaults();
2105
+ const projects = config.getProjects();
2106
+ const targetPath = resolve(pathArg);
2107
+ log.debug(`Resolved path: ${targetPath}`);
2108
+ if (!existsSync(targetPath)) {
2109
+ log.error(`Path does not exist: ${targetPath}`);
2110
+ process.exit(1);
2111
+ }
2112
+ const pathFile = File6.from(targetPath);
2113
+ try {
2114
+ const stat = pathFile.stat();
2115
+ if (!stat.isDirectory()) {
2116
+ log.error(`Path is not a directory: ${targetPath}`);
2117
+ process.exit(1);
2118
+ }
2119
+ } catch {
2120
+ log.error(`Cannot access path: ${targetPath}`);
2121
+ process.exit(1);
2122
+ }
2123
+ const discovery = discoverProject(targetPath, log);
2124
+ log.debug(`Discovery result: ${JSON.stringify(discovery)}`);
2125
+ const projectName = options.name || discovery.name;
2126
+ log.debug(`Project name: ${projectName}`);
2127
+ if (!/^[\w-]+$/.test(projectName)) {
2128
+ log.error(`Invalid project name: ${projectName}`);
2129
+ log.error("Name can only contain letters, numbers, underscores, and hyphens");
2130
+ process.exit(1);
2131
+ }
2132
+ if (projectName in projects && !options.force) {
2133
+ const overwrite = await confirm4({
2134
+ message: `Project '${projectName}' already exists. Overwrite?`,
2135
+ default: false
2136
+ });
2137
+ if (!overwrite) {
2138
+ log.info("Cancelled.");
2139
+ return;
2140
+ }
2141
+ }
2142
+ const ide = options.ide || discovery.detectedIde || "vscode";
2143
+ log.debug(`IDE: ${ide}`);
2144
+ let relativePath = targetPath;
2145
+ if (defaults?.base) {
2146
+ const baseDir = File6.from(defaults.base);
2147
+ try {
2148
+ const relPath = pathFile.relativize(baseDir.path);
2149
+ if (relPath && !relPath.path.startsWith("..")) {
2150
+ relativePath = relPath.path;
2151
+ }
2152
+ } catch {
2153
+ }
2154
+ }
2155
+ log.debug(`Relative path: ${relativePath}`);
2156
+ const projectConfig = {
2157
+ path: relativePath,
2158
+ ide,
2159
+ events: {
2160
+ cwd: true,
2161
+ ide: true
2162
+ }
2163
+ };
2164
+ if ((discovery.isNode || discovery.isBun) && discovery.packageJson) {
2165
+ const scripts = discovery.packageJson.scripts;
2166
+ if (scripts && (scripts.dev || scripts.start)) {
2167
+ projectConfig.events.npm = scripts.dev ? "dev" : "start";
2168
+ }
2169
+ }
2170
+ config.setProject(projectName, projectConfig);
2171
+ log.info(`Added project '${projectName}'`);
2172
+ log.info(` Path: ${relativePath}`);
2173
+ log.info(` IDE: ${ide}`);
2174
+ log.info(` Events: ${Object.keys(projectConfig.events).join(", ")}`);
2175
+ log.info("");
2176
+ log.info(`Use 'workon ${projectName}' to start working!`);
2177
+ }
2178
+ function discoverProject(targetPath, log) {
2179
+ const dirName = basename(targetPath);
2180
+ const discovery = {
2181
+ name: dirName,
2182
+ isNode: false,
2183
+ isBun: false,
2184
+ detectedIde: null,
2185
+ packageJson: null
2186
+ };
2187
+ const packageJsonPath = resolve(targetPath, "package.json");
2188
+ if (existsSync(packageJsonPath)) {
2189
+ discovery.isNode = true;
2190
+ log.debug("Detected Node project (package.json found)");
2191
+ try {
2192
+ const content = readFileSync(packageJsonPath, "utf-8");
2193
+ discovery.packageJson = JSON.parse(content);
2194
+ const pkgName = discovery.packageJson?.name;
2195
+ if (pkgName && /^[\w-]+$/.test(pkgName)) {
2196
+ discovery.name = pkgName;
2197
+ log.debug(`Using name from package.json: ${pkgName}`);
2198
+ }
2199
+ } catch (error) {
2200
+ log.debug(`Failed to parse package.json: ${error.message}`);
2201
+ }
2202
+ }
2203
+ const bunLockPath = resolve(targetPath, "bun.lockb");
2204
+ if (existsSync(bunLockPath)) {
2205
+ discovery.isBun = true;
2206
+ log.debug("Detected Bun project (bun.lockb found)");
2207
+ }
2208
+ const vscodeDir = resolve(targetPath, ".vscode");
2209
+ const ideaDir = resolve(targetPath, ".idea");
2210
+ if (existsSync(vscodeDir)) {
2211
+ discovery.detectedIde = "vscode";
2212
+ log.debug("Detected VS Code (.vscode directory found)");
2213
+ } else if (existsSync(ideaDir)) {
2214
+ discovery.detectedIde = "idea";
2215
+ log.debug("Detected IntelliJ IDEA (.idea directory found)");
2216
+ }
2217
+ return discovery;
2218
+ }
2219
+
2084
2220
  // src/commands/index.ts
2085
2221
  var __filename = fileURLToPath(import.meta.url);
2086
2222
  var __dirname = dirname(__filename);
@@ -2091,16 +2227,16 @@ function findPackageJson() {
2091
2227
  join(process.cwd(), "package.json")
2092
2228
  ];
2093
2229
  for (const p of paths) {
2094
- if (existsSync(p)) {
2230
+ if (existsSync2(p)) {
2095
2231
  return p;
2096
2232
  }
2097
2233
  }
2098
2234
  throw new Error("Could not find package.json");
2099
2235
  }
2100
2236
  function createCli() {
2101
- const program2 = new Command7();
2237
+ const program2 = new Command8();
2102
2238
  const packageJsonPath = findPackageJson();
2103
- const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
2239
+ const packageJson = JSON.parse(readFileSync2(packageJsonPath, "utf-8"));
2104
2240
  const config = new Config();
2105
2241
  const log = loog({
2106
2242
  prefixStyle: "ascii",
@@ -2128,7 +2264,7 @@ function createCli() {
2128
2264
  outputShellInit(program2);
2129
2265
  return;
2130
2266
  }
2131
- const environment = await EnvironmentRecognizer.recognize(File6.cwd());
2267
+ const environment = await EnvironmentRecognizer.recognize(File7.cwd());
2132
2268
  program2.setOptionValue("_environment", environment);
2133
2269
  program2.setOptionValue("_config", config);
2134
2270
  program2.setOptionValue("_log", log);
@@ -2138,6 +2274,7 @@ function createCli() {
2138
2274
  program2.setOptionValue("_config", config);
2139
2275
  program2.setOptionValue("_log", log);
2140
2276
  program2.addCommand(createOpenCommand({ config, log }));
2277
+ program2.addCommand(createAddCommand({ config, log }));
2141
2278
  program2.addCommand(createConfigCommand({ config, log }));
2142
2279
  program2.addCommand(createManageCommand({ config, log }));
2143
2280
  program2.on("command:*", async (operands) => {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/events/extensions/npm.ts","../src/commands/interactive.ts","../src/commands/index.ts","../src/lib/config.ts","../src/lib/environment.ts","../src/lib/project.ts","../src/commands/open.ts","../src/lib/tmux.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/registry.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/cli.ts"],"sourcesContent":["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 { select, input, checkbox } from '@inquirer/prompts';\nimport File from 'phylo';\nimport deepAssign from 'deep-assign';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ProjectConfig, EventsConfig, IdeType } from '../types/index.js';\nimport type { Environment, ProjectEnvironment as ProjectEnv } from '../lib/environment.js';\n\ninterface InteractiveContext {\n config: Config;\n log: Logger;\n environment: Environment;\n suggestedName?: string;\n}\n\nconst IDE_CHOICES = [\n { name: 'Visual Studio Code', value: 'vscode' as IdeType },\n { name: 'IntelliJ IDEA', value: 'idea' as IdeType },\n { name: 'Atom', value: 'atom' as IdeType },\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 log.info('Switch to an existing project');\n // TODO: Implement project switching\n break;\n\n case 'switch-branch':\n log.info('Switch to an existing branch');\n // TODO: Implement branch switching\n break;\n\n case 'manage-projects':\n log.info('Manage existing projects');\n // Redirect to manage command\n break;\n\n case 'manage-branches':\n log.info('Manage existing branches');\n // TODO: Implement branch management\n break;\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\n const branchConfig = deepAssign({}, baseProject, { branch }) as ProjectConfig;\n delete (branchConfig as any).name;\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","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 { createOpenCommand } from './open.js';\nimport { createConfigCommand } from './config/index.js';\nimport { createManageCommand } from './manage.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 .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', (thisCommand) => {\n const opts = thisCommand.opts<GlobalOptions>();\n if (opts.debug) {\n log.setLogLevel('debug');\n }\n })\n .action(async (options: GlobalOptions & { completion?: boolean; init?: boolean }) => {\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 // Default action: run interactive mode or show help\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 // 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(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 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 { 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 {\n // Git not available or not a git repo\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 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 { Command } from 'commander';\nimport File from 'phylo';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ClaudeConfig, NpmConfig } 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\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 // Initialize event registry\n await EventRegistry.initialize();\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\nasync function handleSplitTerminal(\n project: { name: string; path: { path: string }; events: Record<string, unknown> },\n isShellMode: boolean,\n 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 claudeConfig = project.events.claude as ClaudeConfig | boolean;\n const claudeArgs =\n typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\n\n let tmuxHandled = false;\n\n if (isShellMode) {\n if (await tmux.isTmuxAvailable()) {\n const commands = tmux.buildShellCommands(project.name, project.path.path, claudeArgs);\n shellCommands.push(...commands);\n tmuxHandled = true;\n } else {\n log.debug('Tmux not available, falling back to normal mode');\n shellCommands.push(`cd \"${project.path.path}\"`);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n shellCommands.push(claudeCommand);\n tmuxHandled = true;\n }\n } else if (!dryRun) {\n if (await tmux.isTmuxAvailable()) {\n try {\n const sessionName = await tmux.createSplitSession(\n project.name,\n project.path.path,\n claudeArgs\n );\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 // Dry run - skip tmux but mark as handled to avoid fallback execution\n log.info(`Would create split tmux session '${project.name}' with Claude`);\n tmuxHandled = true;\n }\n\n // If tmux didn't handle cwd/claude, process them normally\n if (!tmuxHandled && !dryRun) {\n for (const event of events.filter((e) => ['cwd', 'claude'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n\n // Process other events\n if (!dryRun) {\n for (const event of events.filter((e) => !['cwd', 'claude'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n}\n\nasync function handleThreePaneLayout(\n project: { name: string; path: { path: string }; events: Record<string, unknown> },\n isShellMode: boolean,\n 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 claudeConfig = project.events.claude as ClaudeConfig | boolean;\n const claudeArgs =\n typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\n const npmConfig = project.events.npm as NpmConfig | string | boolean;\n const { NpmEvent } = await import('../events/extensions/npm.js');\n const npmCommand = NpmEvent.getNpmCommand(npmConfig);\n\n let tmuxHandled = false;\n\n if (isShellMode) {\n if (await tmux.isTmuxAvailable()) {\n const commands = tmux.buildThreePaneShellCommands(\n project.name,\n project.path.path,\n claudeArgs,\n npmCommand\n );\n shellCommands.push(...commands);\n tmuxHandled = true;\n } else {\n log.debug('Tmux not available, falling back to normal mode');\n shellCommands.push(`cd \"${project.path.path}\"`);\n shellCommands.push(claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude');\n shellCommands.push(npmCommand);\n tmuxHandled = true;\n }\n } else if (!dryRun) {\n if (await tmux.isTmuxAvailable()) {\n try {\n const sessionName = await tmux.createThreePaneSession(\n project.name,\n project.path.path,\n claudeArgs,\n npmCommand\n );\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 // Dry run - skip tmux but mark as handled to avoid fallback execution\n log.info(`Would create three-pane tmux session '${project.name}' with Claude and NPM`);\n tmuxHandled = true;\n }\n\n // If tmux didn't handle cwd/claude/npm, process them normally\n if (!tmuxHandled && !dryRun) {\n for (const event of events.filter((e) => ['cwd', 'claude', 'npm'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n\n // Process other events\n if (!dryRun) {\n for (const event of events.filter((e) => !['cwd', 'claude', 'npm'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n}\n\nasync function handleTwoPaneNpmLayout(\n project: { name: string; path: { path: string }; events: Record<string, unknown> },\n isShellMode: boolean,\n 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 npmConfig = project.events.npm as NpmConfig | string | boolean;\n const { NpmEvent } = await import('../events/extensions/npm.js');\n const npmCommand = NpmEvent.getNpmCommand(npmConfig);\n\n let tmuxHandled = false;\n\n if (isShellMode) {\n if (await tmux.isTmuxAvailable()) {\n const commands = tmux.buildTwoPaneNpmShellCommands(\n project.name,\n project.path.path,\n npmCommand\n );\n shellCommands.push(...commands);\n tmuxHandled = true;\n } else {\n log.debug('Tmux not available, falling back to normal mode');\n shellCommands.push(`cd \"${project.path.path}\"`);\n shellCommands.push(npmCommand);\n tmuxHandled = true;\n }\n } else if (!dryRun) {\n if (await tmux.isTmuxAvailable()) {\n try {\n const sessionName = await tmux.createTwoPaneNpmSession(\n project.name,\n project.path.path,\n npmCommand\n );\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 // Dry run - skip tmux but mark as handled to avoid fallback execution\n log.info(`Would create two-pane tmux session '${project.name}' with NPM`);\n tmuxHandled = true;\n }\n\n // If tmux didn't handle cwd/npm, process them normally\n if (!tmuxHandled && !dryRun) {\n for (const event of events.filter((e) => ['cwd', 'npm'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n\n // Process other events\n if (!dryRun) {\n for (const event of events.filter((e) => !['cwd', 'npm'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n}\n\nasync function processEvent(\n event: string,\n context: { project: any; isShellMode: boolean; shellCommands: string[] },\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 && (eventHandler as any).processing) {\n await (eventHandler as any).processing.processEvent(context);\n } else {\n log.debug(`No event handler found for: ${event}`);\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 metadata = (eventHandler as any).metadata;\n const config = projectConfig.events[eventName as keyof typeof projectConfig.events];\n let configDesc = '';\n if (config !== true && config !== 'true') {\n if (typeof config === 'object') {\n configDesc = ` (${JSON.stringify(config)})`;\n } else {\n configDesc = ` (${config})`;\n }\n }\n console.log(` ${eventName.padEnd(8)} - ${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 { exec as execCallback, spawn } from 'child_process';\nimport { promisify } from 'util';\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 await exec(`tmux has-session -t \"${sessionName}\"`);\n return true;\n } catch {\n return false;\n }\n }\n\n getSessionName(projectName: string): string {\n return `${this.sessionPrefix}${projectName}`;\n }\n\n async killSession(sessionName: string): Promise<boolean> {\n try {\n await exec(`tmux kill-session -t \"${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\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\n // Create new tmux session with claude in the first pane\n await exec(`tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\" '${claudeCommand}'`);\n\n // Split window horizontally and run shell in second pane\n await exec(`tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\"`);\n\n // Set focus on claude pane (left pane)\n await exec(`tmux select-pane -t \"${sessionName}: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\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\n // Create new tmux session with claude in the first pane (left side)\n await exec(`tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\" '${claudeCommand}'`);\n\n // Split window vertically - creates right side (50/50 split)\n await exec(`tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\"`);\n\n // Split the right pane horizontally - creates top-right and bottom-right (50/50 split)\n await exec(`tmux split-window -v -t \"${sessionName}:0.1\" -c \"${projectPath}\" '${npmCommand}'`);\n\n // Set remain-on-exit to keep pane open if command fails\n await exec(`tmux set-option -t \"${sessionName}: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 \"${sessionName}:0.2\" -y 10`);\n\n // Set focus on claude pane (left pane)\n await exec(`tmux select-pane -t \"${sessionName}: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\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 \"${sessionName}\" -c \"${projectPath}\"`);\n\n // Split window vertically and run npm command in right pane\n await exec(`tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\" '${npmCommand}'`);\n\n // Set remain-on-exit to keep pane open if command fails\n await exec(`tmux set-option -t \"${sessionName}:0.1\" remain-on-exit on`);\n\n // Set focus on terminal pane (left pane)\n await exec(`tmux select-pane -t \"${sessionName}:0.0\"`);\n\n return sessionName;\n }\n\n async attachToSession(sessionName: string): Promise<void> {\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 \"${sessionName}\"`);\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 claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n\n return [\n `# Create tmux split session for ${projectName}`,\n `tmux has-session -t \"${sessionName}\" 2>/dev/null && tmux kill-session -t \"${sessionName}\"`,\n `tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\" '${claudeCommand}'`,\n `tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\"`,\n `tmux select-pane -t \"${sessionName}: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 claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n\n return [\n `# Create tmux three-pane session for ${projectName}`,\n `tmux has-session -t \"${sessionName}\" 2>/dev/null && tmux kill-session -t \"${sessionName}\"`,\n `tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\" '${claudeCommand}'`,\n `tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\"`,\n `tmux split-window -v -t \"${sessionName}:0.1\" -c \"${projectPath}\" '${npmCommand}'`,\n `tmux set-option -t \"${sessionName}:0.2\" remain-on-exit on`,\n `tmux resize-pane -t \"${sessionName}:0.2\" -y 10`,\n `tmux select-pane -t \"${sessionName}: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\n return [\n `# Create tmux two-pane session with npm for ${projectName}`,\n `tmux has-session -t \"${sessionName}\" 2>/dev/null && tmux kill-session -t \"${sessionName}\"`,\n `tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\"`,\n `tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\" '${npmCommand}'`,\n `tmux set-option -t \"${sessionName}:0.1\" remain-on-exit on`,\n `tmux select-pane -t \"${sessionName}:0.0\"`,\n this.getAttachCommand(sessionName),\n ];\n }\n\n private getAttachCommand(sessionName: string): string {\n if (process.env.TMUX) {\n return `tmux switch-client -t \"${sessionName}\"`;\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 \"${sessionName}\"`;\n }\n return `tmux attach-session -t \"${sessionName}\"`;\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 { 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 shellCommands.push(`cd \"${projectPath}\"`);\n } else {\n // Spawn a new shell in the project directory\n const shell = process.env.SHELL || '/bin/bash';\n spawn(shell, [], {\n cwd: projectPath,\n stdio: 'inherit',\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const projectPath = context.project.path.path;\n return [`cd \"${projectPath}\"`];\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 shellCommands.push(`${ide} \"${projectPath}\" &`);\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 return [`${ide} \"${projectPath}\" &`];\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 type { EventHandler, 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, EventHandler>();\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.isValidEvent(EventClass)) {\n const metadata = (EventClass as unknown as { metadata: EventMetadata }).metadata;\n this._events.set(metadata.name, EventClass as unknown as EventHandler);\n }\n }\n }\n\n /**\n * Validate if a class is a proper event\n */\n private isValidEvent(EventClass: unknown): boolean {\n try {\n if (typeof EventClass !== 'function') return false;\n\n const metadata = (EventClass as { metadata?: EventMetadata }).metadata;\n return (\n metadata !== undefined &&\n typeof metadata.name === 'string' &&\n typeof metadata.displayName === 'string' &&\n typeof (EventClass as { validation?: object }).validation === 'object' &&\n typeof (EventClass as { configuration?: object }).configuration === 'object' &&\n typeof (EventClass as { processing?: object }).processing === 'object'\n );\n } catch {\n return false;\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): EventHandler | 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 const metadata = (EventClass as { metadata: EventMetadata }).metadata;\n events.push({\n name: metadata.displayName,\n value: name,\n description: 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: EventHandler; priority: number }> {\n this.ensureInitialized();\n\n const tmuxEvents: Array<{ name: string; event: EventHandler; priority: number }> = [];\n for (const [name, EventClass] of this._events) {\n const tmux = (EventClass as { tmux?: { getLayoutPriority?: () => number } }).tmux;\n if (tmux) {\n tmuxEvents.push({\n name,\n event: EventClass,\n priority: tmux.getLayoutPriority ? tmux.getLayoutPriority() : 0,\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 const typedClass = EventClass as {\n metadata: EventMetadata;\n validation?: object;\n configuration?: object;\n processing?: object;\n tmux?: object;\n help?: object;\n };\n events.push({\n name,\n metadata: typedClass.metadata,\n hasValidation: !!typedClass.validation,\n hasConfiguration: !!typedClass.configuration,\n hasProcessing: !!typedClass.processing,\n hasTmux: !!typedClass.tmux,\n hasHelp: !!typedClass.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","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, IdeType } from '../types/index.js';\nimport { EventRegistry } from '../events/registry.js';\n\ninterface ManageContext {\n config: Config;\n log: Logger;\n}\n\nconst IDE_CHOICES = [\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];\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 EventRegistry.initialize();\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 as any).configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig;\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 as any).configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig;\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","#!/usr/bin/env node\nimport { createCli } from './commands/index.js';\n\nconst program = createCli();\nprogram.parse();\n"],"mappings":"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","names":["spawn","input","confirm","input","File","deepAssign","Command","File","File","File","File","spawn","spawn","spawn","spawn","spawn","input","runInteractive","File","NpmEvent","config","Command","Command","Command","Command","Command","Command","select","input","confirm","checkbox","File","IDE_CHOICES","Command","select","input","File","checkbox","confirm","program","Command","File","runInteractive"]}
1
+ {"version":3,"sources":["../src/events/extensions/npm.ts","../src/commands/interactive.ts","../src/commands/index.ts","../src/lib/config.ts","../src/lib/environment.ts","../src/lib/project.ts","../src/commands/open.ts","../src/lib/tmux.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/registry.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 { 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 { select, input, checkbox } from '@inquirer/prompts';\nimport File from 'phylo';\nimport deepAssign from 'deep-assign';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ProjectConfig, EventsConfig, IdeType } from '../types/index.js';\nimport type { Environment, ProjectEnvironment as ProjectEnv } from '../lib/environment.js';\n\ninterface InteractiveContext {\n config: Config;\n log: Logger;\n environment: Environment;\n suggestedName?: string;\n}\n\nconst IDE_CHOICES = [\n { name: 'Visual Studio Code', value: 'vscode' as IdeType },\n { name: 'IntelliJ IDEA', value: 'idea' as IdeType },\n { name: 'Atom', value: 'atom' as IdeType },\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 log.info('Switch to an existing project');\n // TODO: Implement project switching\n break;\n\n case 'switch-branch':\n log.info('Switch to an existing branch');\n // TODO: Implement branch switching\n break;\n\n case 'manage-projects':\n log.info('Manage existing projects');\n // Redirect to manage command\n break;\n\n case 'manage-branches':\n log.info('Manage existing branches');\n // TODO: Implement branch management\n break;\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\n const branchConfig = deepAssign({}, baseProject, { branch }) as ProjectConfig;\n delete (branchConfig as any).name;\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","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 { 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 .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', (thisCommand) => {\n const opts = thisCommand.opts<GlobalOptions>();\n if (opts.debug) {\n log.setLogLevel('debug');\n }\n })\n .action(async (options: GlobalOptions & { completion?: boolean; init?: boolean }) => {\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 // Default action: run interactive mode or show help\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 // 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 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 { 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 {\n // Git not available or not a git repo\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 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 { Command } from 'commander';\nimport File from 'phylo';\nimport type { Config } from '../lib/config.js';\nimport type { Logger, ClaudeConfig, NpmConfig } 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\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 // Initialize event registry\n await EventRegistry.initialize();\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\nasync function handleSplitTerminal(\n project: { name: string; path: { path: string }; events: Record<string, unknown> },\n isShellMode: boolean,\n 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 claudeConfig = project.events.claude as ClaudeConfig | boolean;\n const claudeArgs =\n typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\n\n let tmuxHandled = false;\n\n if (isShellMode) {\n if (await tmux.isTmuxAvailable()) {\n const commands = tmux.buildShellCommands(project.name, project.path.path, claudeArgs);\n shellCommands.push(...commands);\n tmuxHandled = true;\n } else {\n log.debug('Tmux not available, falling back to normal mode');\n shellCommands.push(`cd \"${project.path.path}\"`);\n const claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n shellCommands.push(claudeCommand);\n tmuxHandled = true;\n }\n } else if (!dryRun) {\n if (await tmux.isTmuxAvailable()) {\n try {\n const sessionName = await tmux.createSplitSession(\n project.name,\n project.path.path,\n claudeArgs\n );\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 // Dry run - skip tmux but mark as handled to avoid fallback execution\n log.info(`Would create split tmux session '${project.name}' with Claude`);\n tmuxHandled = true;\n }\n\n // If tmux didn't handle cwd/claude, process them normally\n if (!tmuxHandled && !dryRun) {\n for (const event of events.filter((e) => ['cwd', 'claude'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n\n // Process other events\n if (!dryRun) {\n for (const event of events.filter((e) => !['cwd', 'claude'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n}\n\nasync function handleThreePaneLayout(\n project: { name: string; path: { path: string }; events: Record<string, unknown> },\n isShellMode: boolean,\n 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 claudeConfig = project.events.claude as ClaudeConfig | boolean;\n const claudeArgs =\n typeof claudeConfig === 'object' && claudeConfig.flags ? claudeConfig.flags : [];\n const npmConfig = project.events.npm as NpmConfig | string | boolean;\n const { NpmEvent } = await import('../events/extensions/npm.js');\n const npmCommand = NpmEvent.getNpmCommand(npmConfig);\n\n let tmuxHandled = false;\n\n if (isShellMode) {\n if (await tmux.isTmuxAvailable()) {\n const commands = tmux.buildThreePaneShellCommands(\n project.name,\n project.path.path,\n claudeArgs,\n npmCommand\n );\n shellCommands.push(...commands);\n tmuxHandled = true;\n } else {\n log.debug('Tmux not available, falling back to normal mode');\n shellCommands.push(`cd \"${project.path.path}\"`);\n shellCommands.push(claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude');\n shellCommands.push(npmCommand);\n tmuxHandled = true;\n }\n } else if (!dryRun) {\n if (await tmux.isTmuxAvailable()) {\n try {\n const sessionName = await tmux.createThreePaneSession(\n project.name,\n project.path.path,\n claudeArgs,\n npmCommand\n );\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 // Dry run - skip tmux but mark as handled to avoid fallback execution\n log.info(`Would create three-pane tmux session '${project.name}' with Claude and NPM`);\n tmuxHandled = true;\n }\n\n // If tmux didn't handle cwd/claude/npm, process them normally\n if (!tmuxHandled && !dryRun) {\n for (const event of events.filter((e) => ['cwd', 'claude', 'npm'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n\n // Process other events\n if (!dryRun) {\n for (const event of events.filter((e) => !['cwd', 'claude', 'npm'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n}\n\nasync function handleTwoPaneNpmLayout(\n project: { name: string; path: { path: string }; events: Record<string, unknown> },\n isShellMode: boolean,\n 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 npmConfig = project.events.npm as NpmConfig | string | boolean;\n const { NpmEvent } = await import('../events/extensions/npm.js');\n const npmCommand = NpmEvent.getNpmCommand(npmConfig);\n\n let tmuxHandled = false;\n\n if (isShellMode) {\n if (await tmux.isTmuxAvailable()) {\n const commands = tmux.buildTwoPaneNpmShellCommands(\n project.name,\n project.path.path,\n npmCommand\n );\n shellCommands.push(...commands);\n tmuxHandled = true;\n } else {\n log.debug('Tmux not available, falling back to normal mode');\n shellCommands.push(`cd \"${project.path.path}\"`);\n shellCommands.push(npmCommand);\n tmuxHandled = true;\n }\n } else if (!dryRun) {\n if (await tmux.isTmuxAvailable()) {\n try {\n const sessionName = await tmux.createTwoPaneNpmSession(\n project.name,\n project.path.path,\n npmCommand\n );\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 // Dry run - skip tmux but mark as handled to avoid fallback execution\n log.info(`Would create two-pane tmux session '${project.name}' with NPM`);\n tmuxHandled = true;\n }\n\n // If tmux didn't handle cwd/npm, process them normally\n if (!tmuxHandled && !dryRun) {\n for (const event of events.filter((e) => ['cwd', 'npm'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n\n // Process other events\n if (!dryRun) {\n for (const event of events.filter((e) => !['cwd', 'npm'].includes(e))) {\n await processEvent(event, { project: project as any, isShellMode, shellCommands }, ctx);\n }\n }\n}\n\nasync function processEvent(\n event: string,\n context: { project: any; isShellMode: boolean; shellCommands: string[] },\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 && (eventHandler as any).processing) {\n await (eventHandler as any).processing.processEvent(context);\n } else {\n log.debug(`No event handler found for: ${event}`);\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 metadata = (eventHandler as any).metadata;\n const config = projectConfig.events[eventName as keyof typeof projectConfig.events];\n let configDesc = '';\n if (config !== true && config !== 'true') {\n if (typeof config === 'object') {\n configDesc = ` (${JSON.stringify(config)})`;\n } else {\n configDesc = ` (${config})`;\n }\n }\n console.log(` ${eventName.padEnd(8)} - ${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 { exec as execCallback, spawn } from 'child_process';\nimport { promisify } from 'util';\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 await exec(`tmux has-session -t \"${sessionName}\"`);\n return true;\n } catch {\n return false;\n }\n }\n\n getSessionName(projectName: string): string {\n return `${this.sessionPrefix}${projectName}`;\n }\n\n async killSession(sessionName: string): Promise<boolean> {\n try {\n await exec(`tmux kill-session -t \"${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\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\n // Create new tmux session with claude in the first pane\n await exec(`tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\" '${claudeCommand}'`);\n\n // Split window horizontally and run shell in second pane\n await exec(`tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\"`);\n\n // Set focus on claude pane (left pane)\n await exec(`tmux select-pane -t \"${sessionName}: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\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\n // Create new tmux session with claude in the first pane (left side)\n await exec(`tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\" '${claudeCommand}'`);\n\n // Split window vertically - creates right side (50/50 split)\n await exec(`tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\"`);\n\n // Split the right pane horizontally - creates top-right and bottom-right (50/50 split)\n await exec(`tmux split-window -v -t \"${sessionName}:0.1\" -c \"${projectPath}\" '${npmCommand}'`);\n\n // Set remain-on-exit to keep pane open if command fails\n await exec(`tmux set-option -t \"${sessionName}: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 \"${sessionName}:0.2\" -y 10`);\n\n // Set focus on claude pane (left pane)\n await exec(`tmux select-pane -t \"${sessionName}: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\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 \"${sessionName}\" -c \"${projectPath}\"`);\n\n // Split window vertically and run npm command in right pane\n await exec(`tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\" '${npmCommand}'`);\n\n // Set remain-on-exit to keep pane open if command fails\n await exec(`tmux set-option -t \"${sessionName}:0.1\" remain-on-exit on`);\n\n // Set focus on terminal pane (left pane)\n await exec(`tmux select-pane -t \"${sessionName}:0.0\"`);\n\n return sessionName;\n }\n\n async attachToSession(sessionName: string): Promise<void> {\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 \"${sessionName}\"`);\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 claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n\n return [\n `# Create tmux split session for ${projectName}`,\n `tmux has-session -t \"${sessionName}\" 2>/dev/null && tmux kill-session -t \"${sessionName}\"`,\n `tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\" '${claudeCommand}'`,\n `tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\"`,\n `tmux select-pane -t \"${sessionName}: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 claudeCommand = claudeArgs.length > 0 ? `claude ${claudeArgs.join(' ')}` : 'claude';\n\n return [\n `# Create tmux three-pane session for ${projectName}`,\n `tmux has-session -t \"${sessionName}\" 2>/dev/null && tmux kill-session -t \"${sessionName}\"`,\n `tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\" '${claudeCommand}'`,\n `tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\"`,\n `tmux split-window -v -t \"${sessionName}:0.1\" -c \"${projectPath}\" '${npmCommand}'`,\n `tmux set-option -t \"${sessionName}:0.2\" remain-on-exit on`,\n `tmux resize-pane -t \"${sessionName}:0.2\" -y 10`,\n `tmux select-pane -t \"${sessionName}: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\n return [\n `# Create tmux two-pane session with npm for ${projectName}`,\n `tmux has-session -t \"${sessionName}\" 2>/dev/null && tmux kill-session -t \"${sessionName}\"`,\n `tmux new-session -d -s \"${sessionName}\" -c \"${projectPath}\"`,\n `tmux split-window -h -t \"${sessionName}\" -c \"${projectPath}\" '${npmCommand}'`,\n `tmux set-option -t \"${sessionName}:0.1\" remain-on-exit on`,\n `tmux select-pane -t \"${sessionName}:0.0\"`,\n this.getAttachCommand(sessionName),\n ];\n }\n\n private getAttachCommand(sessionName: string): string {\n if (process.env.TMUX) {\n return `tmux switch-client -t \"${sessionName}\"`;\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 \"${sessionName}\"`;\n }\n return `tmux attach-session -t \"${sessionName}\"`;\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 { 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 shellCommands.push(`cd \"${projectPath}\"`);\n } else {\n // Spawn a new shell in the project directory\n const shell = process.env.SHELL || '/bin/bash';\n spawn(shell, [], {\n cwd: projectPath,\n stdio: 'inherit',\n });\n }\n },\n generateShellCommand(context: EventProcessingContext): string[] {\n const projectPath = context.project.path.path;\n return [`cd \"${projectPath}\"`];\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 shellCommands.push(`${ide} \"${projectPath}\" &`);\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 return [`${ide} \"${projectPath}\" &`];\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 type { EventHandler, 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, EventHandler>();\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.isValidEvent(EventClass)) {\n const metadata = (EventClass as unknown as { metadata: EventMetadata }).metadata;\n this._events.set(metadata.name, EventClass as unknown as EventHandler);\n }\n }\n }\n\n /**\n * Validate if a class is a proper event\n */\n private isValidEvent(EventClass: unknown): boolean {\n try {\n if (typeof EventClass !== 'function') return false;\n\n const metadata = (EventClass as { metadata?: EventMetadata }).metadata;\n return (\n metadata !== undefined &&\n typeof metadata.name === 'string' &&\n typeof metadata.displayName === 'string' &&\n typeof (EventClass as { validation?: object }).validation === 'object' &&\n typeof (EventClass as { configuration?: object }).configuration === 'object' &&\n typeof (EventClass as { processing?: object }).processing === 'object'\n );\n } catch {\n return false;\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): EventHandler | 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 const metadata = (EventClass as { metadata: EventMetadata }).metadata;\n events.push({\n name: metadata.displayName,\n value: name,\n description: 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: EventHandler; priority: number }> {\n this.ensureInitialized();\n\n const tmuxEvents: Array<{ name: string; event: EventHandler; priority: number }> = [];\n for (const [name, EventClass] of this._events) {\n const tmux = (EventClass as { tmux?: { getLayoutPriority?: () => number } }).tmux;\n if (tmux) {\n tmuxEvents.push({\n name,\n event: EventClass,\n priority: tmux.getLayoutPriority ? tmux.getLayoutPriority() : 0,\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 const typedClass = EventClass as {\n metadata: EventMetadata;\n validation?: object;\n configuration?: object;\n processing?: object;\n tmux?: object;\n help?: object;\n };\n events.push({\n name,\n metadata: typedClass.metadata,\n hasValidation: !!typedClass.validation,\n hasConfiguration: !!typedClass.configuration,\n hasProcessing: !!typedClass.processing,\n hasTmux: !!typedClass.tmux,\n hasHelp: !!typedClass.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","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, IdeType } from '../types/index.js';\nimport { EventRegistry } from '../events/registry.js';\n\ninterface ManageContext {\n config: Config;\n log: Logger;\n}\n\nconst IDE_CHOICES = [\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];\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 EventRegistry.initialize();\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 as any).configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig;\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 as any).configuration.configureInteractive();\n events[eventName as keyof EventsConfig] = eventConfig;\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 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 || 'vscode';\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 // 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 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 ideaDir = resolve(targetPath, '.idea');\n\n if (existsSync(vscodeDir)) {\n discovery.detectedIde = 'vscode';\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 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":["spawn","input","confirm","input","File","deepAssign","Command","readFileSync","existsSync","File","File","File","File","spawn","spawn","spawn","spawn","spawn","input","runInteractive","File","NpmEvent","config","Command","Command","Command","Command","Command","Command","select","input","confirm","checkbox","File","IDE_CHOICES","Command","select","input","File","checkbox","confirm","Command","File","confirm","existsSync","program","Command","readFileSync","File","runInteractive"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workon",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "Work on something great!",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",