devsurface 0.7.1 → 0.8.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/doctor.ts","../../src/core/doctor/index.ts","../../src/core/documentation.ts","../../src/core/scanner/index.ts","../../src/core/config/load.ts","../../src/core/security/url.ts","../../src/core/config/defaults.ts","../../src/core/docker/compose.ts","../../src/core/process/executable.ts","../../src/core/scanner/docker.ts","../../src/core/scanner/env.ts","../../src/core/scanner/framework.ts","../../src/core/scanner/git.ts","../../src/core/scanner/language.ts","../../src/core/scanner/packageManager.ts","../../src/core/scanner/packageJson.ts","../../src/core/scanner/ports.ts","../../src/core/scanner/presets.ts","../../src/core/scanner/scripts.ts","../../src/core/security/text.ts","../../src/cli/commands/init.ts","../../src/cli/commands/onboard.ts","../../src/core/onboarding/index.ts","../../src/cli/commands/run.ts","../../src/core/process/runner.ts","../../src/core/security/dangerousCommand.ts","../../src/cli/commands/scan.ts","../../src/cli/commands/start.ts","../../node_modules/open/index.js","../../node_modules/wsl-utils/index.js","../../node_modules/is-wsl/index.js","../../node_modules/is-inside-container/index.js","../../node_modules/is-docker/index.js","../../node_modules/define-lazy-prop/index.js","../../node_modules/default-browser/index.js","../../node_modules/default-browser-id/index.js","../../node_modules/run-applescript/index.js","../../node_modules/bundle-name/index.js","../../node_modules/default-browser/windows.js","../../src/server/index.ts","../../src/core/process/manager.ts","../../src/core/hub/registry.ts","../../src/core/hub/workspaceRoots.ts","../../src/core/hub/runtime.ts","../../src/server/routes/api.ts","../../src/version.ts","../../src/server/localAccess.ts","../../src/server/listenConfig.ts","../../src/server/accessControl.ts","../../src/server/mutationToken.ts","../../src/server/terminal.ts","../../src/server/routes/ws.ts","../../src/cli/hub/client.ts","../../src/cli/commands/serve.ts","../../src/cli/commands/workspace.ts","../../src/cli/updateCheck.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { doctorCommand } from './commands/doctor.js';\nimport { initCommand } from './commands/init.js';\nimport { onboardCommand } from './commands/onboard.js';\nimport { runCommand } from './commands/run.js';\nimport { scanCommand } from './commands/scan.js';\nimport { startCommand } from './commands/start.js';\nimport { serveCommand } from './commands/serve.js';\nimport {\n workspaceAddCommand,\n workspaceListCommand,\n workspaceRemoveCommand\n} from './commands/workspace.js';\nimport { printUpdateNotice } from './updateCheck.js';\nimport { DEV_SURFACE_VERSION } from '../version.js';\n\nconst program = new Command();\n\nfunction toPort(value: string): number {\n const port = Number(value);\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error('Port must be an integer between 1 and 65535.');\n }\n\n return port;\n}\n\nfunction handle(command: Promise<void>): void {\n command\n .then(async () => {\n await printUpdateNotice(DEV_SURFACE_VERSION);\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n}\n\nprogram\n .name('devsurface')\n .description('Turn any Node.js repository into a local developer control panel.')\n .version(DEV_SURFACE_VERSION)\n .option('-p, --port <port>', 'dashboard port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n startCommand({\n cwd: process.cwd(),\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nprogram\n .command('serve')\n .description('Start the DevSurface hub server (multi-workspace mode).')\n .option('-p, --port <port>', 'hub port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n serveCommand({\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nconst workspace = program.command('workspace').description('Manage registered workspaces.');\n\nworkspace\n .command('add [path]')\n .description('Register a project directory with the hub.')\n .action((dirPath?: string) => {\n handle(workspaceAddCommand(dirPath));\n });\n\nworkspace\n .command('list')\n .description('List all registered workspaces.')\n .action(() => {\n handle(workspaceListCommand());\n });\n\nworkspace\n .command('remove <id>')\n .description('Remove a workspace from the hub registry.')\n .action((id: string) => {\n handle(workspaceRemoveCommand(id));\n });\n\nprogram\n .command('scan')\n .description('Print detected project info.')\n .action(() => {\n handle(scanCommand(process.cwd()));\n });\n\nprogram\n .command('doctor')\n .description('Print setup health warnings.')\n .action(() => {\n handle(doctorCommand(process.cwd()));\n });\n\nprogram\n .command('onboard')\n .description('Print a guided setup checklist with readiness score.')\n .action(() => {\n handle(onboardCommand(process.cwd()));\n });\n\nprogram\n .command('init')\n .description('Create a starter devsurface.config.json.')\n .action(() => {\n handle(initCommand(process.cwd()));\n });\n\nprogram\n .command('run')\n .argument('<script>', 'package.json script to run')\n .description('Run a package script and stream logs.')\n .action((script: string) => {\n handle(runCommand(script, process.cwd()));\n });\n\nawait program.parseAsync(process.argv);\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction colorSeverity(severity: 'error' | 'warning' | 'info'): string {\n if (severity === 'error') {\n return pc.red('error');\n }\n\n if (severity === 'warning') {\n return pc.yellow('warning');\n }\n\n return pc.cyan('info');\n}\n\nexport async function doctorCommand(cwd = process.cwd()): Promise<void> {\n const warnings = await runDoctor(cwd);\n\n if (warnings.length === 0) {\n console.log(pc.green('No health warnings found.'));\n return;\n }\n\n for (const item of warnings) {\n console.log(`${colorSeverity(item.severity)} ${pc.bold(safeTerminalText(item.title))}`);\n console.log(` ${safeTerminalText(item.message)}`);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { extractScriptReferences } from '../documentation.js';\nimport type { DoctorWarning, ScanResult } from '../types.js';\nimport { scanProject } from '../scanner/index.js';\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readIfPresent(filePath: string | null): Promise<string | null> {\n if (filePath === null) {\n return null;\n }\n\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction warning(\n id: string,\n severity: DoctorWarning['severity'],\n title: string,\n message: string,\n target?: string\n): DoctorWarning {\n return { id, severity, title, message, target };\n}\n\nexport async function runDoctor(root = process.cwd(), scan?: ScanResult): Promise<DoctorWarning[]> {\n const result = scan ?? (await scanProject(root));\n const warnings: DoctorWarning[] = [];\n\n for (const configWarning of result.config?.warnings ?? []) {\n warnings.push(\n warning('config-warning', 'warning', 'Config warning', configWarning, result.config?.path)\n );\n }\n\n const isNodeProject = result.language.detected.includes('node');\n const hasKnownProjectLanguage = result.language.detected.length > 0;\n\n if (result.packageJson === null && !hasKnownProjectLanguage) {\n warnings.push(\n warning(\n 'missing-package-json',\n 'error',\n 'No package.json',\n 'This directory is not a Node.js project.'\n )\n );\n return warnings;\n }\n\n if (isNodeProject && !(await pathExists(path.join(root, 'node_modules', '.bin')))) {\n warnings.push(\n warning(\n 'missing-node-modules',\n 'warning',\n 'Dependencies are not installed',\n 'node_modules/.bin is missing. Run the project install command before starting scripts.'\n )\n );\n }\n\n if (result.env?.hasExample && !result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env',\n 'error',\n '.env is missing',\n '.env.example exists, but the local .env file is missing.',\n result.env.examplePath ?? undefined\n )\n );\n }\n\n if (result.env && result.env.missingKeys.length > 0 && result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env-keys',\n 'warning',\n 'Environment keys are missing',\n `Missing keys: ${result.env.missingKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n if (result.env && result.env.emptyKeys.length > 0) {\n warnings.push(\n warning(\n 'empty-env-keys',\n 'info',\n 'Environment keys are empty',\n `Empty keys: ${result.env.emptyKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n const missingReadme = !result.readme.exists;\n if (missingReadme) {\n warnings.push(\n warning('missing-readme', 'warning', 'No README', 'No README.md or README file was found.')\n );\n } else {\n const readme = await readIfPresent(result.readme.path);\n if (readme !== null) {\n const references = extractScriptReferences(readme);\n const missingScripts = references.filter((script) => result.scripts[script] === undefined);\n if (missingScripts.length > 0) {\n warnings.push(\n warning(\n 'readme-script-mismatch',\n 'warning',\n 'README references missing scripts',\n `README mentions scripts not present in package.json: ${missingScripts.join(', ')}.`\n )\n );\n }\n }\n }\n\n for (const port of result.ports.filter((probe) => probe.inUse)) {\n warnings.push(\n warning(\n `port-${port.port}-in-use`,\n 'error',\n `Port ${port.port} is already in use`,\n `Something is already bound to 127.0.0.1:${port.port}.`\n )\n );\n }\n\n if (result.docker && result.docker.dockerRunning === false) {\n warnings.push(\n warning(\n 'docker-not-running',\n 'warning',\n 'Docker Compose found but Docker is not running',\n result.docker.message ?? 'A compose file exists, but Docker is not available.'\n )\n );\n }\n\n if (isNodeProject && result.scripts.test === undefined) {\n warnings.push(\n warning(\n 'missing-test-script',\n 'warning',\n 'No test script',\n 'package.json does not define a test script.'\n )\n );\n }\n\n if (isNodeProject && result.scripts.build === undefined) {\n warnings.push(\n warning(\n 'missing-build-script',\n 'warning',\n 'No build script',\n 'package.json does not define a build script.'\n )\n );\n }\n\n return warnings;\n}\n","export function extractScriptReferences(content: string): string[] {\n const references = new Set<string>();\n const commandRegexes = [\n /\\bnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bpnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bbun\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\byarn\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bnpm\\s+(test|start|build)\\b/g,\n /\\bpnpm\\s+(test|start|build)\\b/g,\n /\\byarn\\s+(test|start|build)\\b/g,\n /\\bbun\\s+(test|start|build)\\b/g\n ];\n\n for (const regex of commandRegexes) {\n for (const match of content.matchAll(regex)) {\n references.add(match[1]);\n }\n }\n\n return Array.from(references);\n}\n\nexport function documentsEnvironmentSetup(content: string): boolean {\n return /(?:\\.env(?:\\.example)?|environment\\s+variables?)/i.test(content);\n}\n\nexport function undocumentedPorts(content: string, ports: number[]): number[] {\n return ports.filter((port) => !new RegExp(`\\\\b${port}\\\\b`).test(content));\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FilePresence, ScanResult } from '../types.js';\nimport { loadConfig } from '../config/load.js';\nimport { detectDocker } from './docker.js';\nimport { detectEnv } from './env.js';\nimport { detectFramework } from './framework.js';\nimport { detectGit } from './git.js';\nimport { detectProjectLanguage } from './language.js';\nimport { detectPackageManager } from './packageManager.js';\nimport { readPackageJson } from './packageJson.js';\nimport { defaultPortsForFramework, detectPorts, inferPortsFromScripts } from './ports.js';\nimport { detectPresets, mergePresetCommands, mergePresetGroups } from './presets.js';\nimport { extractScripts } from './scripts.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function findFirstFile(root: string, candidates: string[]): Promise<FilePresence> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n\n for (const candidate of candidates) {\n const filePath = path.join(root, candidate);\n try {\n const [stat, realPath] = await Promise.all([fs.stat(filePath), fs.realpath(filePath)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realPath)) {\n return { path: realPath, exists: true };\n }\n } catch {\n // Keep looking through the candidate list.\n }\n }\n\n return { path: null, exists: false };\n}\n\nfunction configuredPorts(configPorts: number[] | undefined): number[] {\n return Array.isArray(configPorts) ? configPorts : [];\n}\n\nexport async function scanProject(root = process.cwd()): Promise<ScanResult> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const config = await loadConfig(resolvedRoot);\n const packageJson = await readPackageJson(resolvedRoot);\n const scripts = extractScripts(packageJson) ?? {};\n const framework = detectFramework(packageJson);\n const language = await detectProjectLanguage(resolvedRoot, packageJson);\n const presets = await detectPresets({\n root: resolvedRoot,\n packageJson,\n framework,\n language\n });\n const presetCommands = mergePresetCommands(presets);\n const presetGroups = mergePresetGroups(presets);\n const portsToProbe = [\n ...configuredPorts(config?.config.ports),\n ...inferPortsFromScripts(scripts),\n ...defaultPortsForFramework(framework),\n ...presets.flatMap((preset) => preset.ports)\n ];\n\n const [packageManager, env, docker, git, ports, readme, license] = await Promise.all([\n detectPackageManager(resolvedRoot),\n detectEnv(resolvedRoot, config?.config),\n detectDocker(resolvedRoot),\n detectGit(resolvedRoot),\n detectPorts(portsToProbe),\n findFirstFile(resolvedRoot, ['README.md', 'README']),\n findFirstFile(resolvedRoot, ['LICENSE', 'LICENSE.md', 'COPYING'])\n ]);\n\n return {\n root: resolvedRoot,\n projectName: config?.config.name ?? packageJson?.data.name ?? path.basename(resolvedRoot),\n packageJson,\n packageManager: packageManager ?? (packageJson ? 'npm' : null),\n language,\n scripts,\n env,\n docker,\n git,\n framework,\n presets,\n presetCommands,\n presetGroups,\n ports: ports ?? [],\n readme,\n license,\n config\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { isSafeHttpUrl } from '../security/url.js';\nimport type { ConfigLoadResult, DevSurfaceConfig, SetupGuideStep } from '../types.js';\nimport { CONFIG_FILE_NAME } from './defaults.js';\n\nexport const MAX_CONFIGURED_PORTS = 32;\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toStringRecord(\n value: unknown,\n warnings: string[],\n label: string\n): Record<string, string> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push(`${label} must be an object.`);\n return undefined;\n }\n\n const record: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'string') {\n record[key] = raw;\n } else {\n warnings.push(`${label}.${key} must be a string.`);\n }\n }\n\n return record;\n}\n\nfunction toGroups(value: unknown, warnings: string[]): Record<string, string[]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push('groups must be an object.');\n return undefined;\n }\n\n const groups: Record<string, string[]> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (Array.isArray(raw) && raw.every((entry) => typeof entry === 'string')) {\n groups[key] = raw;\n } else {\n warnings.push(`groups.${key} must be an array of command names.`);\n }\n }\n\n return groups;\n}\n\nexport const MAX_SETUP_GUIDE_STEPS = 24;\nconst MAX_SETUP_GUIDE_STEP_LENGTH = 200;\n\nfunction toSetupGuide(\n value: unknown,\n warnings: string[]\n): Array<string | SetupGuideStep> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('setupGuide must be an array of strings or step objects.');\n return undefined;\n }\n\n const steps: Array<string | SetupGuideStep> = [];\n for (const entry of value) {\n if (typeof entry === 'string') {\n const trimmed = entry.trim();\n if (trimmed.length > 0) {\n steps.push(trimmed.slice(0, MAX_SETUP_GUIDE_STEP_LENGTH));\n }\n } else if (isRecord(entry)) {\n if (typeof entry.title !== 'string' || entry.title.trim().length === 0) {\n warnings.push('setupGuide step objects must have a non-empty title string.');\n continue;\n }\n const step: SetupGuideStep = {\n title: entry.title.trim().slice(0, MAX_SETUP_GUIDE_STEP_LENGTH)\n };\n if (typeof entry.description === 'string' && entry.description.trim().length > 0) {\n step.description = entry.description.trim().slice(0, MAX_SETUP_GUIDE_STEP_LENGTH);\n }\n if (typeof entry.command === 'string' && entry.command.trim().length > 0) {\n step.command = entry.command.trim();\n }\n if (typeof entry.script === 'string' && entry.script.trim().length > 0) {\n step.script = entry.script.trim();\n }\n steps.push(step);\n } else {\n warnings.push('setupGuide entries must be strings or step objects.');\n }\n }\n\n if (steps.length > MAX_SETUP_GUIDE_STEPS) {\n warnings.push(`setupGuide may contain at most ${MAX_SETUP_GUIDE_STEPS} steps.`);\n }\n\n return steps.slice(0, MAX_SETUP_GUIDE_STEPS);\n}\n\nfunction toPorts(value: unknown, warnings: string[]): number[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('ports must be an array of numbers.');\n return undefined;\n }\n\n const ports = value.filter(\n (port): port is number => Number.isInteger(port) && port > 0 && port < 65536\n );\n if (ports.length !== value.length) {\n warnings.push('ports may only contain integers between 1 and 65535.');\n }\n\n if (ports.length > MAX_CONFIGURED_PORTS) {\n warnings.push(`ports may contain at most ${MAX_CONFIGURED_PORTS} entries.`);\n }\n\n return ports.slice(0, MAX_CONFIGURED_PORTS);\n}\n\nexport function validateConfig(raw: unknown): { config: DevSurfaceConfig; warnings: string[] } {\n const warnings: string[] = [];\n if (!isRecord(raw)) {\n return { config: {}, warnings: ['devsurface.config.json must contain a JSON object.'] };\n }\n\n const env = isRecord(raw.env)\n ? {\n example: typeof raw.env.example === 'string' ? raw.env.example : undefined,\n local: typeof raw.env.local === 'string' ? raw.env.local : undefined\n }\n : undefined;\n\n if (raw.env !== undefined && !isRecord(raw.env)) {\n warnings.push('env must be an object.');\n }\n\n const services = isRecord(raw.services)\n ? {\n docker: typeof raw.services.docker === 'boolean' ? raw.services.docker : undefined\n }\n : undefined;\n\n if (raw.services !== undefined && !isRecord(raw.services)) {\n warnings.push('services must be an object.');\n }\n\n let docs: string | undefined;\n if (typeof raw.docs === 'string' && raw.docs.length > 0) {\n if (isSafeHttpUrl(raw.docs)) {\n docs = raw.docs;\n } else {\n warnings.push('docs must be an http or https URL.');\n }\n }\n\n return {\n config: {\n name: typeof raw.name === 'string' ? raw.name : undefined,\n description: typeof raw.description === 'string' ? raw.description : undefined,\n commands: toStringRecord(raw.commands, warnings, 'commands'),\n groups: toGroups(raw.groups, warnings),\n ports: toPorts(raw.ports, warnings),\n env,\n services,\n setupGuide: toSetupGuide(raw.setupGuide ?? raw.setup_guide, warnings),\n docs\n },\n warnings\n };\n}\n\nexport async function loadConfig(root: string): Promise<ConfigLoadResult | null> {\n const configPath = path.join(root, CONFIG_FILE_NAME);\n\n try {\n const [realRoot, realConfigPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(configPath)\n ]);\n if (!isWithinRoot(realRoot, realConfigPath)) {\n return null;\n }\n const content = await fs.readFile(realConfigPath, 'utf8');\n const parsed = JSON.parse(content) as unknown;\n const { config, warnings } = validateConfig(parsed);\n return { path: realConfigPath, config, warnings };\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'ENOENT') {\n return null;\n }\n\n if (error instanceof SyntaxError) {\n return {\n path: configPath,\n config: {},\n warnings: [`${CONFIG_FILE_NAME} contains invalid JSON.`]\n };\n }\n\n return null;\n }\n}\n","export function isSafeHttpUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n","import type { DevSurfaceConfig } from '../types.js';\n\nexport const CONFIG_FILE_NAME = 'devsurface.config.json';\n\nexport const defaultConfig: DevSurfaceConfig = {\n name: 'My App',\n description: 'Local developer control panel',\n commands: {\n install: 'npm install',\n migrate: 'npm run db:migrate',\n seed: 'npm run db:seed',\n dev: 'npm run dev',\n build: 'npm run build',\n test: 'npm test',\n lint: 'npm run lint'\n },\n groups: {\n 'First-time setup': ['install', 'migrate', 'seed'],\n 'Daily development': ['dev'],\n 'Before committing': ['test', 'lint'],\n Build: ['build']\n },\n ports: [3000],\n env: {\n example: '.env.example',\n local: '.env'\n },\n services: {\n docker: true\n },\n setupGuide: [\n {\n title: 'Install dependencies',\n description: 'Run the package manager install to set up node_modules.',\n command: 'install'\n },\n 'Copy .env.example to .env',\n 'Fill in required environment values (DATABASE_URL, etc.)',\n {\n title: 'Run database migrations',\n description: 'Apply the database schema to your local database.',\n command: 'migrate'\n },\n {\n title: 'Start the development server',\n description: 'Run the local dev server and open the app in a browser.',\n command: 'dev'\n }\n ],\n docs: ''\n};\n","import { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport { parse as parseYaml } from 'yaml';\nimport { resolveExecutableOutsideRoot } from '../process/executable.js';\nimport type {\n DockerDaemonStatus,\n DockerInfo,\n DockerServiceInfo,\n DockerServiceStatus\n} from '../types.js';\n\nconst COMPOSE_FILES = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];\nconst COMMAND_OUTPUT_LIMIT = 200_000;\nconst ESC = String.fromCharCode(27);\nconst ANSI_CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\n\nexport interface DockerCommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error: 'not-found' | 'timeout' | 'spawn' | null;\n}\n\nexport interface DockerCommandOptions {\n timeoutMs?: number;\n outputLimit?: number;\n}\n\nexport type DockerCommandRunner = (\n root: string,\n args: string[],\n options?: DockerCommandOptions\n) => Promise<DockerCommandResult>;\n\nexport interface DockerActionResult {\n service: string;\n action: 'start' | 'stop';\n output: string;\n}\n\nexport interface DockerLogsResult {\n service: string;\n logs: string;\n}\n\nexport interface DockerController {\n inspect(): Promise<DockerInfo | null>;\n start(service: string): Promise<DockerActionResult>;\n stop(service: string): Promise<DockerActionResult>;\n logs(service: string): Promise<DockerLogsResult>;\n}\n\nexport type DockerOperationErrorCode =\n | 'compose-not-found'\n | 'service-not-found'\n | 'docker-not-installed'\n | 'docker-not-running'\n | 'command-failed';\n\nexport class DockerOperationError extends Error {\n constructor(\n public readonly code: DockerOperationErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'DockerOperationError';\n }\n}\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction dockerCommandCwd(root: string): string {\n const candidates = [os.homedir(), os.tmpdir(), path.parse(path.resolve(root)).root];\n return candidates.find((candidate) => !isWithinRoot(root, candidate)) ?? os.homedir();\n}\n\nfunction appendBounded(current: string, chunk: string, limit: number): string {\n const combined = current + chunk;\n return combined.length <= limit ? combined : combined.slice(-limit);\n}\n\nexport const runDockerCommand: DockerCommandRunner = async (root, args, options = {}) => {\n const dockerExecutable = await resolveExecutableOutsideRoot(root, 'docker');\n if (dockerExecutable === null) {\n return { code: null, stdout: '', stderr: '', error: 'not-found' };\n }\n\n const timeoutMs = options.timeoutMs ?? 5000;\n const outputLimit = options.outputLimit ?? COMMAND_OUTPUT_LIMIT;\n\n return await new Promise((resolve) => {\n const child = spawn(dockerExecutable, args, {\n cwd: dockerCommandCwd(root),\n windowsHide: true\n });\n let settled = false;\n let stdout = '';\n let stderr = '';\n\n const finish = (result: DockerCommandResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve(result);\n };\n\n const timeout = setTimeout(() => {\n child.kill();\n finish({ code: null, stdout, stderr, error: 'timeout' });\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout = appendBounded(stdout, chunk.toString(), outputLimit);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr = appendBounded(stderr, chunk.toString(), outputLimit);\n });\n child.on('error', () => {\n finish({ code: null, stdout, stderr, error: 'spawn' });\n });\n child.on('close', (code) => {\n finish({ code, stdout, stderr, error: null });\n });\n });\n};\n\nasync function findComposeFiles(root: string): Promise<string[]> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const matches: string[] = [];\n\n for (const file of COMPOSE_FILES) {\n const candidate = path.join(root, file);\n try {\n const [stat, realCandidate] = await Promise.all([fs.stat(candidate), fs.realpath(candidate)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realCandidate)) {\n matches.push(realCandidate);\n }\n } catch {\n // Continue through the supported Compose filenames.\n }\n }\n\n return matches;\n}\n\nasync function serviceNamesFromFiles(composeFiles: string[]): Promise<string[]> {\n const names = new Set<string>();\n\n for (const composeFile of composeFiles) {\n try {\n const parsed = parseYaml(await fs.readFile(composeFile, 'utf8')) as unknown;\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('services' in parsed) ||\n typeof parsed.services !== 'object' ||\n parsed.services === null ||\n Array.isArray(parsed.services)\n ) {\n continue;\n }\n\n for (const name of Object.keys(parsed.services)) {\n if (name.length > 0) {\n names.add(name);\n }\n }\n } catch {\n // Malformed files remain visible as Compose files, but expose no actions.\n }\n }\n\n return Array.from(names);\n}\n\nfunction composeArgs(root: string, composeFiles: string[], args: string[]): string[] {\n return [\n 'compose',\n ...composeFiles.flatMap((composeFile) => ['-f', composeFile]),\n '--project-directory',\n root,\n ...args\n ];\n}\n\nfunction cleanMessage(value: string): string {\n return value.replace(ANSI_CSI_SEQUENCE, '').trim().slice(-1000);\n}\n\nfunction resultMessage(result: DockerCommandResult): string {\n return cleanMessage(result.stderr || result.stdout);\n}\n\nfunction daemonStatus(\n result: DockerCommandResult,\n platform: NodeJS.Platform\n): {\n status: DockerDaemonStatus;\n running: boolean;\n message: string | null;\n} {\n if (result.error === 'not-found') {\n return {\n status: 'not-installed',\n running: false,\n message: 'Docker CLI was not found. Install Docker and refresh this page.'\n };\n }\n\n if (result.code === 0) {\n return { status: 'running', running: true, message: null };\n }\n\n if (platform === 'win32' || platform === 'darwin') {\n return {\n status: 'stopped',\n running: false,\n message:\n 'Docker is installed, but its engine is not responding. Start Docker Desktop and refresh.'\n };\n }\n\n const detail = resultMessage(result);\n return {\n status: result.error === 'timeout' ? 'unknown' : 'stopped',\n running: false,\n message: detail\n ? `Docker is installed, but its daemon is not responding: ${detail}`\n : 'Docker is installed, but its daemon is not responding. Start Docker and refresh.'\n };\n}\n\nfunction exitCodeFromRow(record: Record<string, unknown>): number | null {\n if (typeof record.ExitCode === 'number') {\n return record.ExitCode;\n }\n if (typeof record.ExitCode === 'string' && /^\\d+$/.test(record.ExitCode)) {\n return Number(record.ExitCode);\n }\n if (typeof record.Status === 'string') {\n const match = /\\bExited\\s+\\((\\d+)\\)/i.exec(record.Status);\n if (match?.[1]) {\n return Number(match[1]);\n }\n }\n return null;\n}\n\nfunction serviceStatusFromRow(record: Record<string, unknown>): DockerServiceStatus {\n const state = typeof record.State === 'string' ? record.State.toLowerCase() : '';\n const exitCode = exitCodeFromRow(record);\n\n if (state === 'running') {\n return 'running';\n }\n if (exitCode !== null && exitCode > 0) {\n return 'error';\n }\n if (state === 'created' || state === 'exited' || state === 'stopped') {\n return 'stopped';\n }\n if (state === 'dead' || state === 'restarting' || state === 'paused') {\n return 'error';\n }\n return 'unknown';\n}\n\nfunction addComposeStatusRow(statuses: Map<string, DockerServiceInfo>, row: unknown): void {\n if (typeof row !== 'object' || row === null) {\n return;\n }\n\n const record = row as Record<string, unknown>;\n if (typeof record.Service !== 'string') {\n return;\n }\n\n const detail =\n typeof record.Status === 'string' && record.Status.trim()\n ? record.Status.trim()\n : typeof record.State === 'string' && record.State.trim()\n ? record.State.trim()\n : null;\n\n statuses.set(record.Service, {\n name: record.Service,\n status: serviceStatusFromRow(record),\n statusDetail: detail,\n containerId: typeof record.ID === 'string' && record.ID.length > 0 ? record.ID : null\n });\n}\n\nfunction parseComposePs(output: string): Map<string, DockerServiceInfo> {\n const statuses = new Map<string, DockerServiceInfo>();\n const compactOutput = output.trim();\n if (!compactOutput) {\n return statuses;\n }\n\n try {\n const parsed = JSON.parse(compactOutput) as unknown;\n for (const row of Array.isArray(parsed) ? parsed : [parsed]) {\n addComposeStatusRow(statuses, row);\n }\n return statuses;\n } catch {\n // Older Compose builds can emit one JSON object per line.\n }\n\n for (const line of compactOutput.split(/\\r?\\n/)) {\n try {\n addComposeStatusRow(statuses, JSON.parse(line) as unknown);\n } catch {\n return new Map();\n }\n }\n\n return statuses;\n}\n\nfunction unknownServices(serviceNames: string[]): DockerServiceInfo[] {\n return serviceNames.map((name) => ({\n name,\n status: 'unknown',\n statusDetail: null,\n containerId: null\n }));\n}\n\nfunction commandFailureMessage(action: string, result: DockerCommandResult): string {\n const detail = resultMessage(result);\n return detail ? `Docker Compose ${action} failed: ${detail}` : `Docker Compose ${action} failed.`;\n}\n\nexport class DockerComposeController implements DockerController {\n private readonly runner: DockerCommandRunner;\n private readonly platform: NodeJS.Platform;\n\n constructor(\n private readonly root: string,\n options: {\n runner?: DockerCommandRunner;\n platform?: NodeJS.Platform;\n } = {}\n ) {\n this.runner = options.runner ?? runDockerCommand;\n this.platform = options.platform ?? process.platform;\n }\n\n private async definition(): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n } | null> {\n const composeFiles = await findComposeFiles(this.root);\n if (composeFiles.length === 0) {\n return null;\n }\n return {\n composeFiles,\n serviceNames: await serviceNamesFromFiles(composeFiles)\n };\n }\n\n private async requireService(service: string): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n }> {\n const definition = await this.definition();\n if (definition === null) {\n throw new DockerOperationError('compose-not-found', 'No Docker Compose file was found.');\n }\n if (!definition.serviceNames.includes(service)) {\n throw new DockerOperationError(\n 'service-not-found',\n `Docker Compose service \"${service}\" was not found.`\n );\n }\n return definition;\n }\n\n private async requireDaemon(): Promise<void> {\n const result = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(result, this.platform);\n if (daemon.status === 'not-installed') {\n throw new DockerOperationError('docker-not-installed', daemon.message ?? 'Docker not found.');\n }\n if (!daemon.running) {\n throw new DockerOperationError(\n 'docker-not-running',\n daemon.message ?? 'Docker is not running.'\n );\n }\n }\n\n async inspect(): Promise<DockerInfo | null> {\n const definition = await this.definition();\n if (definition === null) {\n return null;\n }\n\n const infoResult = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(infoResult, this.platform);\n if (!daemon.running) {\n return {\n composeFiles: definition.composeFiles,\n services: unknownServices(definition.serviceNames),\n dockerRunning: false,\n daemonStatus: daemon.status,\n message: daemon.message\n };\n }\n\n const ps = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, ['ps', '--all', '--format', 'json']),\n { timeoutMs: 8000 }\n );\n if (ps.code !== 0 || ps.error !== null) {\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map((name) => ({\n name,\n status: 'error',\n statusDetail: null,\n containerId: null\n })),\n dockerRunning: true,\n daemonStatus: 'running',\n message: commandFailureMessage('status check', ps)\n };\n }\n\n const statuses = parseComposePs(ps.stdout);\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map(\n (name) =>\n statuses.get(name) ?? {\n name,\n status: 'stopped',\n statusDetail: null,\n containerId: null\n }\n ),\n dockerRunning: true,\n daemonStatus: 'running',\n message: null\n };\n }\n\n private async action(service: string, action: 'start' | 'stop'): Promise<DockerActionResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const composeCommand =\n action === 'start' ? ['up', '-d', '--', service] : ['stop', '--', service];\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, composeCommand),\n { timeoutMs: 60_000 }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage(action, result));\n }\n return {\n service,\n action,\n output: cleanMessage(result.stdout || result.stderr)\n };\n }\n\n async start(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'start');\n }\n\n async stop(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'stop');\n }\n\n async logs(service: string): Promise<DockerLogsResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, [\n 'logs',\n '--no-color',\n '--tail',\n '200',\n '--',\n service\n ]),\n { timeoutMs: 15_000, outputLimit: COMMAND_OUTPUT_LIMIT }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage('logs', result));\n }\n return {\n service,\n logs: appendBounded('', `${result.stdout}${result.stderr}`, COMMAND_OUTPUT_LIMIT)\n };\n }\n}\n","import { constants } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction pathEntries(pathValue: string): string[] {\n return pathValue\n .split(path.delimiter)\n .map((entry) => entry.trim().replace(/^\"|\"$/g, ''))\n .filter((entry) => entry.length > 0);\n}\n\nfunction hasPathSeparator(command: string): boolean {\n return command.includes('/') || command.includes('\\\\');\n}\n\nfunction executableNames(command: string): string[] {\n if (process.platform !== 'win32' || path.extname(command)) {\n return [command];\n }\n\n const extensions = (process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD')\n .split(';')\n .map((extension) => extension.trim().toLowerCase())\n .filter(Boolean);\n return extensions.map((extension) => `${command}${extension}`);\n}\n\nasync function executableOutsideRoot(root: string, candidate: string): Promise<string | null> {\n if (isWithinRoot(root, candidate)) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n if (isWithinRoot(realRoot, realCandidate)) {\n return null;\n }\n\n await fs.access(realCandidate, constants.X_OK);\n return realCandidate;\n } catch {\n return null;\n }\n}\n\nexport async function resolveExecutableOutsideRoot(\n root: string,\n command: string\n): Promise<string | null> {\n if (path.isAbsolute(command) || hasPathSeparator(command)) {\n return await executableOutsideRoot(root, path.resolve(command));\n }\n\n for (const entry of pathEntries(process.env.PATH ?? '')) {\n const directory = path.resolve(entry);\n if (isWithinRoot(root, directory)) {\n continue;\n }\n\n for (const executableName of executableNames(command)) {\n const executable = await executableOutsideRoot(root, path.join(directory, executableName));\n if (executable !== null) {\n return executable;\n }\n }\n }\n\n return null;\n}\n","import { DockerComposeController } from '../docker/compose.js';\nimport type { DockerInfo } from '../types.js';\n\nexport async function detectDocker(root: string): Promise<DockerInfo | null> {\n return await new DockerComposeController(root).inspect();\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { DevSurfaceConfig, EnvInfo } from '../types.js';\n\ninterface ParsedEnv {\n keys: string[];\n emptyKeys: string[];\n}\n\nasync function readIfPresent(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction resolveInsideRoot(root: string, configuredPath: string): string | null {\n const resolvedRoot = path.resolve(root);\n const resolvedPath = path.resolve(resolvedRoot, configuredPath);\n const relative = path.relative(resolvedRoot, resolvedPath);\n const insideRoot = relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? resolvedPath : null;\n}\n\nasync function resolveExistingInsideRoot(\n root: string,\n configuredPath: string\n): Promise<string | null> {\n const candidate = resolveInsideRoot(root, configuredPath);\n if (candidate === null) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n const relative = path.relative(realRoot, realCandidate);\n const insideRoot =\n relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? candidate : null;\n } catch {\n return null;\n }\n}\n\nexport function parseEnvKeys(content: string): ParsedEnv {\n const keys: string[] = [];\n const emptyKeys: string[] = [];\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n const normalized = line.startsWith('export ') ? line.slice('export '.length).trim() : line;\n const separator = normalized.indexOf('=');\n if (separator <= 0) {\n continue;\n }\n\n const key = normalized.slice(0, separator).trim();\n const value = normalized.slice(separator + 1).trim();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n keys.push(key);\n if (value.length === 0 || value === '\"\"' || value === \"''\") {\n emptyKeys.push(key);\n }\n }\n }\n\n return { keys: Array.from(new Set(keys)), emptyKeys: Array.from(new Set(emptyKeys)) };\n}\n\nexport async function detectEnv(\n root: string,\n config?: DevSurfaceConfig | null\n): Promise<EnvInfo | null> {\n const exampleName = config?.env?.example ?? '.env.example';\n const localName = config?.env?.local ?? '.env';\n const [examplePath, localPath] = await Promise.all([\n resolveExistingInsideRoot(root, exampleName),\n resolveExistingInsideRoot(root, localName)\n ]);\n const [exampleContent, localContent] = await Promise.all([\n examplePath === null ? null : readIfPresent(examplePath),\n localPath === null ? null : readIfPresent(localPath)\n ]);\n\n if (exampleContent === null && localContent === null) {\n return null;\n }\n\n const example =\n exampleContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(exampleContent);\n const local = localContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(localContent);\n const localKeySet = new Set(local.keys);\n const localEmptySet = new Set(local.emptyKeys);\n const missingKeys = example.keys.filter((key) => !localKeySet.has(key));\n const emptyKeys = local.keys.filter((key) => localEmptySet.has(key));\n\n return {\n examplePath: exampleContent === null ? null : examplePath,\n localPath: localContent === null ? null : localPath,\n hasExample: exampleContent !== null,\n hasLocal: localContent !== null,\n exampleKeys: example.keys,\n localKeys: local.keys,\n missingKeys,\n emptyKeys,\n keys: example.keys.map((key) => ({\n key,\n present: localKeySet.has(key),\n empty: localEmptySet.has(key)\n }))\n };\n}\n","import type { FrameworkInfo, PackageJsonInfo } from '../types.js';\n\nconst frameworkPackages: Array<{ packageName: string; label: string }> = [\n { packageName: 'next', label: 'Next.js' },\n { packageName: 'vite', label: 'Vite' },\n { packageName: 'express', label: 'Express' },\n { packageName: 'fastify', label: 'Fastify' },\n { packageName: '@nestjs/core', label: 'NestJS' },\n { packageName: '@remix-run/react', label: 'Remix' },\n { packageName: 'prisma', label: 'Prisma' }\n];\n\nexport function detectFramework(packageJson: PackageJsonInfo | null): FrameworkInfo | null {\n if (packageJson === null) {\n return null;\n }\n\n const dependencies = {\n ...packageJson.data.dependencies,\n ...packageJson.data.devDependencies,\n ...packageJson.data.optionalDependencies,\n ...packageJson.data.peerDependencies\n };\n\n const detected = frameworkPackages\n .filter((framework) => dependencies[framework.packageName] !== undefined)\n .map((framework) => framework.label);\n\n if (detected.length === 0) {\n return {\n type: 'Node.js',\n detected: ['Node.js']\n };\n }\n\n return {\n type: ['Node.js', ...detected].join(' / '),\n detected\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { GitInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function resolveGitDirectory(root: string): Promise<string | null> {\n const gitPath = path.join(root, '.git');\n\n try {\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n return gitPath;\n }\n\n if (stat.isFile()) {\n const content = await fs.readFile(gitPath, 'utf8');\n const match = content.match(/^gitdir:\\s*(.+)\\s*$/m);\n if (match) {\n const gitDir = match[1].trim();\n const resolvedGitDir = path.isAbsolute(gitDir)\n ? path.resolve(gitDir)\n : path.resolve(root, gitDir);\n if (!isWithinRoot(root, resolvedGitDir)) {\n return null;\n }\n\n const [realRoot, realGitDir] = await Promise.all([\n fs.realpath(root),\n fs.realpath(resolvedGitDir)\n ]);\n return isWithinRoot(realRoot, realGitDir) ? resolvedGitDir : null;\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nexport async function detectGit(root: string): Promise<GitInfo | null> {\n const gitRoot = await resolveGitDirectory(root);\n if (gitRoot === null) {\n return null;\n }\n\n try {\n const head = await fs.readFile(path.join(gitRoot, 'HEAD'), 'utf8');\n const refMatch = head.match(/^ref:\\s+refs\\/heads\\/(.+)\\s*$/);\n return {\n root: gitRoot,\n branch: refMatch ? refMatch[1] : head.trim().slice(0, 12)\n };\n } catch {\n return {\n root: gitRoot,\n branch: null\n };\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo, ProjectLanguage, ProjectLanguageInfo } from '../types.js';\n\nconst languageFiles: Array<{ language: ProjectLanguage; candidates: string[] }> = [\n { language: 'python', candidates: ['requirements.txt', 'pyproject.toml', 'Pipfile'] },\n { language: 'go', candidates: ['go.mod'] },\n { language: 'java', candidates: ['pom.xml', 'build.gradle', 'build.gradle.kts'] }\n];\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function safeFile(root: string, candidate: string): Promise<string | null> {\n const filePath = path.join(root, candidate);\n try {\n const [realRoot, stat, realPath] = await Promise.all([\n fs.realpath(root),\n fs.stat(filePath),\n fs.realpath(filePath)\n ]);\n if (stat.isFile() && isWithinRoot(realRoot, realPath)) {\n return realPath;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport async function detectProjectLanguage(\n root: string,\n packageJson: PackageJsonInfo | null\n): Promise<ProjectLanguageInfo> {\n const detected: ProjectLanguage[] = [];\n const files: string[] = [];\n\n if (packageJson !== null) {\n detected.push('node');\n files.push(packageJson.path);\n }\n\n for (const definition of languageFiles) {\n let found = false;\n for (const candidate of definition.candidates) {\n const file = await safeFile(root, candidate);\n if (file !== null) {\n found = true;\n files.push(file);\n }\n }\n if (found) {\n detected.push(definition.language);\n }\n }\n\n return {\n primary: detected[0] ?? null,\n detected,\n files\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageManager } from '../types.js';\n\nconst lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'bun.lockb', manager: 'bun' },\n { file: 'bun.lock', manager: 'bun' },\n { file: 'package-lock.json', manager: 'npm' }\n];\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectPackageManager(root: string): Promise<PackageManager | null> {\n for (const lockFile of lockFiles) {\n if (await exists(path.join(root, lockFile.file))) {\n return lockFile.manager;\n }\n }\n\n return null;\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function readPackageJson(root: string): Promise<PackageJsonInfo | null> {\n const packageJsonPath = path.join(root, 'package.json');\n\n try {\n const [realRoot, realPackageJsonPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(packageJsonPath)\n ]);\n if (!isWithinRoot(realRoot, realPackageJsonPath)) {\n return null;\n }\n\n const content = await fs.readFile(realPackageJsonPath, 'utf8');\n const data = JSON.parse(content) as PackageJsonInfo['data'];\n return { path: realPackageJsonPath, data };\n } catch {\n return null;\n }\n}\n","import net from 'node:net';\nimport type { FrameworkInfo, PortProbe } from '../types.js';\n\nexport const DEFAULT_PORTS = [3000, 5173];\nexport const MAX_PORT_PROBES = 64;\nexport const PORT_PROBE_CONCURRENCY = 16;\n\nfunction uniquePorts(ports: number[]): number[] {\n return Array.from(\n new Set(ports.filter((port) => Number.isInteger(port) && port > 0 && port < 65536))\n );\n}\n\nexport function inferPortsFromScripts(scripts: Record<string, string>): number[] {\n const ports: number[] = [];\n\n for (const command of Object.values(scripts)) {\n const patterns = [\n /(?:--port|-p)\\s+(\\d{2,5})/g,\n /\\bPORT=(\\d{2,5})\\b/g,\n /localhost:(\\d{2,5})/g,\n /127\\.0\\.0\\.1:(\\d{2,5})/g\n ];\n\n for (const pattern of patterns) {\n for (const match of command.matchAll(pattern)) {\n ports.push(Number(match[1]));\n }\n }\n }\n\n return uniquePorts(ports);\n}\n\nexport function defaultPortsForFramework(framework: FrameworkInfo | null): number[] {\n if (framework === null) {\n return [];\n }\n\n const ports: number[] = [];\n if (framework.detected.includes('Next.js') || framework.detected.includes('Express')) {\n ports.push(3000);\n }\n\n if (framework.detected.includes('Vite')) {\n ports.push(5173);\n }\n\n if (framework.detected.includes('Prisma')) {\n ports.push(5555);\n }\n\n return uniquePorts(ports);\n}\n\nexport async function probePort(port: number): Promise<PortProbe> {\n return await new Promise((resolve) => {\n const server = net.createServer();\n\n server.once('error', () => {\n resolve({ port, inUse: true });\n });\n\n server.once('listening', () => {\n server.close(() => {\n resolve({ port, inUse: false });\n });\n });\n\n server.listen(port, '127.0.0.1');\n });\n}\n\nexport async function detectPorts(ports: number[]): Promise<PortProbe[] | null> {\n const normalized = uniquePorts(ports).slice(0, MAX_PORT_PROBES);\n if (normalized.length === 0) {\n return null;\n }\n\n const results: PortProbe[] = [];\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < normalized.length) {\n const port = normalized[nextIndex];\n nextIndex += 1;\n results.push(await probePort(port));\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(PORT_PROBE_CONCURRENCY, normalized.length) }, () => worker())\n );\n\n return results.sort(\n (left, right) => normalized.indexOf(left.port) - normalized.indexOf(right.port)\n );\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FrameworkInfo, PackageJsonInfo, PresetInfo, ProjectLanguageInfo } from '../types.js';\n\ntype PresetDraft = Omit<PresetInfo, 'commands' | 'groups' | 'ports'> & {\n commands?: Record<string, string>;\n groups?: Record<string, string[]>;\n ports?: number[];\n};\n\nfunction dependencyNames(packageJson: PackageJsonInfo | null): Set<string> {\n const data = packageJson?.data;\n return new Set(\n Object.keys({\n ...data?.dependencies,\n ...data?.devDependencies,\n ...data?.optionalDependencies,\n ...data?.peerDependencies\n })\n );\n}\n\nfunction hasAnyDependency(dependencies: Set<string>, names: string[]): boolean {\n return names.some((name) => dependencies.has(name));\n}\n\nasync function readIfPresent(root: string, candidate: string): Promise<string | null> {\n const filePath = path.join(root, candidate);\n try {\n const [realRoot, realPath] = await Promise.all([fs.realpath(root), fs.realpath(filePath)]);\n const relative = path.relative(realRoot, realPath);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n return null;\n }\n return await fs.readFile(realPath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction completePreset(draft: PresetDraft): PresetInfo {\n return {\n name: draft.name,\n label: draft.label,\n commands: draft.commands ?? {},\n groups: draft.groups ?? {},\n ports: draft.ports ?? []\n };\n}\n\nfunction nodePresets(\n framework: FrameworkInfo | null,\n packageJson: PackageJsonInfo | null\n): PresetInfo[] {\n const detected = new Set(framework?.detected ?? []);\n const dependencies = dependencyNames(packageJson);\n const presets: PresetDraft[] = [];\n\n if (detected.has('Next.js')) {\n presets.push({\n name: 'next',\n label: 'Next.js',\n commands: {\n 'next:dev': 'next dev',\n 'next:build': 'next build',\n 'next:start': 'next start'\n },\n groups: {\n 'Next.js': ['next:dev', 'next:build', 'next:start']\n },\n ports: [3000]\n });\n }\n\n if (detected.has('Vite')) {\n presets.push({\n name: 'vite',\n label: 'Vite',\n commands: {\n 'vite:dev': 'vite --host 127.0.0.1',\n 'vite:build': 'vite build',\n 'vite:preview': 'vite preview --host 127.0.0.1'\n },\n groups: {\n Vite: ['vite:dev', 'vite:build', 'vite:preview']\n },\n ports: [5173, 4173]\n });\n }\n\n if (detected.has('NestJS')) {\n presets.push({\n name: 'nestjs',\n label: 'NestJS',\n commands: {\n 'nest:start': 'nest start --watch',\n 'nest:build': 'nest build'\n },\n groups: {\n NestJS: ['nest:start', 'nest:build']\n },\n ports: [3000]\n });\n }\n\n if (detected.has('Remix')) {\n presets.push({\n name: 'remix',\n label: 'Remix',\n commands: {\n 'remix:dev': 'remix vite:dev',\n 'remix:build': 'remix vite:build'\n },\n groups: {\n Remix: ['remix:dev', 'remix:build']\n },\n ports: [5173]\n });\n }\n\n if (detected.has('Express') || detected.has('Fastify')) {\n presets.push({\n name: detected.has('Fastify') ? 'fastify' : 'express',\n label: detected.has('Fastify') ? 'Fastify' : 'Express',\n ports: [3000]\n });\n }\n\n if (detected.has('Prisma') || hasAnyDependency(dependencies, ['prisma', '@prisma/client'])) {\n presets.push({\n name: 'prisma',\n label: 'Prisma',\n commands: {\n 'prisma:migrate': 'prisma migrate dev',\n 'prisma:studio': 'prisma studio'\n },\n groups: {\n Database: ['prisma:migrate', 'prisma:studio']\n },\n ports: [5555]\n });\n }\n\n return presets.map(completePreset);\n}\n\nasync function pythonPresets(root: string, language: ProjectLanguageInfo): Promise<PresetInfo[]> {\n if (!language.detected.includes('python')) {\n return [];\n }\n\n const [requirements, pyproject, pipfile] = await Promise.all([\n readIfPresent(root, 'requirements.txt'),\n readIfPresent(root, 'pyproject.toml'),\n readIfPresent(root, 'Pipfile')\n ]);\n const manifest = [requirements, pyproject, pipfile].filter(Boolean).join('\\n').toLowerCase();\n const commands: Record<string, string> = {};\n const groups: Record<string, string[]> = {};\n const ports: number[] = [];\n\n if (requirements !== null) {\n commands['python:install'] = 'python -m pip install -r requirements.txt';\n groups.Setup = ['python:install'];\n }\n\n if (manifest.includes('uvicorn') || manifest.includes('fastapi')) {\n commands['python:dev'] = 'uvicorn main:app --reload --host 127.0.0.1';\n groups.Python = [...(groups.Python ?? []), 'python:dev'];\n ports.push(8000);\n }\n\n if (manifest.includes('flask')) {\n commands['flask:dev'] = 'flask --app app run --host 127.0.0.1';\n groups.Python = [...(groups.Python ?? []), 'flask:dev'];\n ports.push(5000);\n }\n\n if (manifest.includes('django') || (await readIfPresent(root, 'manage.py')) !== null) {\n commands['django:dev'] = 'python manage.py runserver 127.0.0.1:8000';\n commands['django:migrate'] = 'python manage.py migrate';\n groups.Python = [...(groups.Python ?? []), 'django:dev', 'django:migrate'];\n ports.push(8000);\n }\n\n return [\n completePreset({\n name: 'python',\n label: 'Python',\n commands,\n groups,\n ports\n })\n ];\n}\n\nfunction goPresets(language: ProjectLanguageInfo): PresetInfo[] {\n if (!language.detected.includes('go')) {\n return [];\n }\n\n return [\n completePreset({\n name: 'go',\n label: 'Go',\n commands: {\n 'go:run': 'go run .',\n 'go:build': 'go build ./...',\n 'go:test': 'go test ./...'\n },\n groups: {\n Go: ['go:run', 'go:build', 'go:test']\n }\n })\n ];\n}\n\nasync function javaPresets(language: ProjectLanguageInfo): Promise<PresetInfo[]> {\n if (!language.detected.includes('java')) {\n return [];\n }\n\n const hasMaven = language.files.some((file) => path.basename(file) === 'pom.xml');\n const hasGradle = language.files.some((file) => path.basename(file).startsWith('build.gradle'));\n const commands: Record<string, string> = {};\n const groups: Record<string, string[]> = {};\n\n if (hasMaven) {\n commands['maven:test'] = 'mvn test';\n commands['maven:package'] = 'mvn package';\n groups.Maven = ['maven:test', 'maven:package'];\n }\n\n if (hasGradle) {\n commands['gradle:test'] = 'gradle test';\n commands['gradle:build'] = 'gradle build';\n groups.Gradle = ['gradle:test', 'gradle:build'];\n }\n\n return [completePreset({ name: 'java', label: 'Java', commands, groups })];\n}\n\nexport async function detectPresets(options: {\n root: string;\n packageJson: PackageJsonInfo | null;\n framework: FrameworkInfo | null;\n language: ProjectLanguageInfo;\n}): Promise<PresetInfo[]> {\n return [\n ...nodePresets(options.framework, options.packageJson),\n ...(await pythonPresets(options.root, options.language)),\n ...goPresets(options.language),\n ...(await javaPresets(options.language))\n ].filter(\n (preset) =>\n Object.keys(preset.commands).length > 0 ||\n Object.keys(preset.groups).length > 0 ||\n preset.ports.length > 0\n );\n}\n\nexport function mergePresetCommands(presets: PresetInfo[]): Record<string, string> {\n return Object.assign({}, ...presets.map((preset) => preset.commands));\n}\n\nexport function mergePresetGroups(presets: PresetInfo[]): Record<string, string[]> {\n const groups: Record<string, string[]> = {};\n for (const preset of presets) {\n for (const [group, commands] of Object.entries(preset.groups)) {\n groups[group] = [...(groups[group] ?? []), ...commands];\n }\n }\n return groups;\n}\n","import type { PackageJsonInfo } from '../types.js';\n\nexport function extractScripts(packageJson: PackageJsonInfo | null): Record<string, string> | null {\n if (\n !packageJson?.data.scripts ||\n typeof packageJson.data.scripts !== 'object' ||\n Array.isArray(packageJson.data.scripts)\n ) {\n return null;\n }\n\n return Object.fromEntries(\n Object.entries(packageJson.data.scripts).filter((entry): entry is [string, string] => {\n const [, command] = entry;\n return typeof command === 'string';\n })\n );\n}\n","const ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n\nconst OSC_SEQUENCE = new RegExp(`${ESC}\\\\][\\\\s\\\\S]*?(?:${BEL}|${ESC}\\\\\\\\)`, 'g');\nconst CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\nconst ESCAPE_SEQUENCE = new RegExp(`${ESC}[@-Z\\\\\\\\-_]`, 'g');\n\nfunction stripControlCharacters(value: string): string {\n let result = '';\n for (const character of value) {\n const code = character.charCodeAt(0);\n if ((code > 31 && code < 127) || code > 159) {\n result += character;\n }\n }\n return result;\n}\n\nexport function safeDisplayText(value: unknown): string {\n return stripControlCharacters(\n String(value).replace(OSC_SEQUENCE, '').replace(CSI_SEQUENCE, '').replace(ESCAPE_SEQUENCE, '')\n );\n}\n\nexport function safeDisplayList(values: string[]): string {\n return values.length > 0 ? values.map((value) => safeDisplayText(value)).join(', ') : 'none';\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { CONFIG_FILE_NAME, defaultConfig } from '../../core/config/defaults.js';\n\nexport async function initCommand(cwd = process.cwd()): Promise<void> {\n const configPath = path.join(cwd, CONFIG_FILE_NAME);\n\n try {\n await fs.access(configPath);\n console.log(pc.yellow(`${CONFIG_FILE_NAME} already exists.`));\n return;\n } catch {\n await fs.writeFile(configPath, `${JSON.stringify(defaultConfig, null, 2)}\\n`, 'utf8');\n console.log(pc.green(`Created ${CONFIG_FILE_NAME}.`));\n }\n}\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { buildOnboardingPlan } from '../../core/onboarding/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport type { OnboardingStep } from '../../core/types.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction statusGlyph(status: OnboardingStep['status']): string {\n if (status === 'done') {\n return pc.green('[x]');\n }\n\n if (status === 'todo') {\n return pc.yellow('[ ]');\n }\n\n return pc.cyan('[~]');\n}\n\nexport async function onboardCommand(cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n const warnings = await runDoctor(cwd, scan);\n const plan = buildOnboardingPlan(scan, warnings);\n\n console.log(pc.bold(`Onboarding ${safeTerminalText(scan.projectName)}`));\n console.log(`${plan.readiness}% ready — ${safeTerminalText(plan.summary)}`);\n console.log('');\n\n if (plan.steps.length === 0) {\n console.log(pc.green('No onboarding steps detected.'));\n return;\n }\n\n for (const step of plan.steps) {\n console.log(`${statusGlyph(step.status)} ${pc.bold(safeTerminalText(step.title))}`);\n console.log(` ${safeTerminalText(step.description)}`);\n if (step.action && step.status !== 'done') {\n console.log(pc.dim(` → ${safeTerminalText(step.action.label)}`));\n }\n }\n}\n","import { isSafeHttpUrl } from '../security/url.js';\nimport type {\n DoctorWarning,\n OnboardingAction,\n OnboardingPlan,\n OnboardingStep,\n ScanResult,\n SetupGuideStep\n} from '../types.js';\n\nfunction hasWarning(warnings: DoctorWarning[], id: string): boolean {\n return warnings.some((warning) => warning.id === id);\n}\n\n/**\n * Pick the command that starts the project's dev server, preferring a real\n * package script, then a configured/preset command named \"dev\".\n */\nfunction pickStartAction(scan: ScanResult): OnboardingAction | null {\n if (scan.scripts.dev !== undefined) {\n return { kind: 'run-script', label: 'Start dev server', target: 'dev' };\n }\n if (scan.scripts.start !== undefined) {\n return { kind: 'run-script', label: 'Start app', target: 'start' };\n }\n\n const configuredCommands = {\n ...scan.presetCommands,\n ...scan.config?.config.commands\n };\n for (const name of ['dev', 'start', 'serve']) {\n if (configuredCommands[name] !== undefined) {\n return { kind: 'run-command', label: `Run ${name}`, target: name };\n }\n }\n\n return null;\n}\n\nfunction dockerStep(scan: ScanResult): OnboardingStep | null {\n const docker = scan.docker;\n if (docker === null) {\n return null;\n }\n\n const runningServices = docker.services.filter((service) => service.status === 'running');\n const allRunning =\n docker.services.length > 0 && runningServices.length === docker.services.length;\n\n if (docker.daemonStatus !== 'running') {\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description:\n docker.message ?? 'A Docker Compose file was found, but the Docker engine is not running.',\n status: 'manual',\n blocking: false,\n action: { kind: 'docker', label: 'Open Services' }\n };\n }\n\n if (docker.services.length === 0 || allRunning) {\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description:\n docker.services.length === 0\n ? 'Docker is running. No Compose services need to be started.'\n : 'All Docker Compose services are running.',\n status: 'done',\n blocking: false\n };\n }\n\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description: `${runningServices.length}/${docker.services.length} Compose services running. Start the rest in Services.`,\n status: 'todo',\n blocking: false,\n action: { kind: 'docker', label: 'Open Services' }\n };\n}\n\n/**\n * Build an ordered onboarding checklist from a scan result and its doctor\n * warnings. Each step is either already satisfied (`done`), resolvable with a\n * one-click action (`todo`), or needs the contributor to act outside DevSurface\n * (`manual`). Readiness reflects only the blocking steps so a project can reach\n * 100% once it is genuinely runnable.\n */\nexport function buildOnboardingPlan(scan: ScanResult, warnings: DoctorWarning[]): OnboardingPlan {\n const steps: OnboardingStep[] = [];\n const isNodeProject = scan.language.detected.includes('node');\n\n // 1. Install dependencies (Node projects only).\n if (isNodeProject && scan.packageJson !== null) {\n const needsInstall = hasWarning(warnings, 'missing-node-modules');\n steps.push({\n id: 'install-dependencies',\n title: 'Install dependencies',\n description: needsInstall\n ? 'node_modules is missing. Install dependencies before running scripts.'\n : 'Dependencies are installed.',\n status: needsInstall ? 'todo' : 'done',\n blocking: true,\n action: needsInstall ? { kind: 'install', label: 'Install' } : undefined\n });\n }\n\n // 2. Create the local .env file from the example.\n if (scan.env?.hasExample) {\n const missingLocal = !scan.env.hasLocal;\n steps.push({\n id: 'create-env',\n title: 'Create .env file',\n description: missingLocal\n ? '.env.example exists but the local .env file is missing.'\n : '.env is present.',\n status: missingLocal ? 'todo' : 'done',\n blocking: true,\n action: missingLocal ? { kind: 'env-copy', label: 'Copy .env' } : undefined\n });\n\n // 3. Fill required env values (only meaningful once .env exists).\n if (scan.env.hasLocal) {\n const unset = [...new Set([...scan.env.missingKeys, ...scan.env.emptyKeys])];\n steps.push({\n id: 'fill-env',\n title: 'Fill in environment values',\n description:\n unset.length > 0\n ? `Set values for: ${unset.join(', ')}. Values are intentionally hidden.`\n : 'All environment keys from the example are present.',\n status: unset.length > 0 ? 'manual' : 'done',\n blocking: true\n });\n }\n }\n\n // 4. Docker services.\n const docker = dockerStep(scan);\n if (docker !== null) {\n steps.push(docker);\n }\n\n // 5. Free conflicting ports (informational guidance).\n const portsInUse = scan.ports.filter((probe) => probe.inUse);\n if (portsInUse.length > 0) {\n steps.push({\n id: 'free-ports',\n title: 'Resolve port conflicts',\n description: `Already in use: ${portsInUse.map((probe) => probe.port).join(', ')}. Stop the conflicting process or change the port.`,\n status: 'manual',\n blocking: false\n });\n }\n\n // 6. Maintainer-authored setup guide steps (non-blocking guidance).\n const allCommands = { ...scan.presetCommands, ...(scan.config?.config.commands ?? {}) };\n for (const [index, entry] of (scan.config?.config.setupGuide ?? []).entries()) {\n if (typeof entry === 'string') {\n steps.push({\n id: `guide-${index}`,\n title: entry,\n description: 'From the project setup guide.',\n status: 'manual',\n blocking: false\n });\n } else {\n const step = entry as SetupGuideStep;\n let action: OnboardingAction | undefined;\n if (step.command !== undefined && step.command in allCommands) {\n action = { kind: 'run-command', label: 'Run', target: step.command };\n } else if (step.script !== undefined) {\n action = { kind: 'run-script', label: 'Run', target: step.script };\n }\n steps.push({\n id: `guide-${index}`,\n title: step.title,\n description: step.description ?? 'From the project setup guide.',\n status: action !== undefined ? 'todo' : 'manual',\n blocking: false,\n action\n });\n }\n }\n\n // 7. Project docs link.\n const docs = scan.config?.config.docs;\n if (typeof docs === 'string' && docs.length > 0 && isSafeHttpUrl(docs)) {\n steps.push({\n id: 'read-docs',\n title: 'Read the project docs',\n description: docs,\n status: 'manual',\n blocking: false,\n action: { kind: 'open-docs', label: 'Open docs', target: docs }\n });\n }\n\n // 8. Start the app (the goal — never blocking).\n const startAction = pickStartAction(scan);\n if (startAction !== null) {\n steps.push({\n id: 'start-app',\n title: 'Start the app',\n description: 'Run the development server once setup is complete.',\n status: 'todo',\n blocking: false,\n action: startAction\n });\n }\n\n const blocking = steps.filter((step) => step.blocking);\n const blockingDone = blocking.filter((step) => step.status === 'done');\n const readiness =\n blocking.length === 0 ? 100 : Math.round((blockingDone.length / blocking.length) * 100);\n const ready = readiness === 100;\n const remaining = blocking.length - blockingDone.length;\n const summary = ready\n ? 'Project is ready to run.'\n : `${remaining} setup step${remaining === 1 ? '' : 's'} remaining before the project is ready.`;\n\n return { steps, readiness, ready, summary };\n}\n","import pc from 'picocolors';\nimport {\n isDangerousCommand,\n runConfiguredCommandToTerminal,\n runPackageScriptToTerminal\n} from '../../core/process/runner.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nexport async function runCommand(script: string, cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n\n if (scan.scripts[script] !== undefined) {\n const exitCode = await runPackageScriptToTerminal({\n cwd,\n packageManager: scan.packageManager,\n script\n });\n process.exitCode = exitCode;\n return;\n }\n\n const configuredCommand = scan.config?.config.commands?.[script] ?? scan.presetCommands[script];\n if (configuredCommand !== undefined) {\n if (isDangerousCommand(configuredCommand)) {\n console.error(pc.red(`Refusing to run dangerous command \"${safeTerminalText(script)}\".`));\n process.exitCode = 1;\n return;\n }\n\n const exitCode = await runConfiguredCommandToTerminal({\n cwd,\n command: configuredCommand\n });\n process.exitCode = exitCode;\n return;\n }\n\n const available = [\n ...Object.keys(scan.scripts),\n ...Object.keys(scan.config?.config.commands ?? {}),\n ...Object.keys(scan.presetCommands)\n ];\n const hint = available.length > 0 ? ` Available commands: ${safeTerminalList(available)}.` : '';\n console.error(pc.red(`Command \"${safeTerminalText(script)}\" was not found.${hint}`));\n process.exitCode = 1;\n}\n","import spawn from 'cross-spawn';\nimport type { PackageManager } from '../types.js';\nimport { isDangerousCommand } from '../security/dangerousCommand.js';\nimport { resolveExecutableOutsideRoot } from './executable.js';\n\nexport { isDangerousCommand };\n\nexport interface PackageRunCommand {\n command: string;\n args: string[];\n displayCommand: string;\n}\n\nexport function getPackageRunCommand(\n packageManager: PackageManager | null,\n script: string\n): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n const args = ['run', script];\n return {\n command: manager,\n args,\n displayCommand: `${manager} ${args.join(' ')}`\n };\n}\n\nexport async function resolvePackageRunCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<PackageRunCommand | null> {\n const runCommand = getPackageRunCommand(options.packageManager, options.script);\n const executable = await resolveExecutableOutsideRoot(options.cwd, runCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...runCommand,\n command: executable\n };\n}\n\nexport function getPackageInstallCommand(packageManager: PackageManager | null): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n if (manager === 'npm') {\n return {\n command: manager,\n args: ['ci'],\n displayCommand: 'npm ci'\n };\n }\n\n if (manager === 'pnpm') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'pnpm install --frozen-lockfile'\n };\n }\n\n if (manager === 'yarn') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'yarn install --frozen-lockfile'\n };\n }\n\n return {\n command: manager,\n args: ['install'],\n displayCommand: 'bun install'\n };\n}\n\nexport async function resolvePackageInstallCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n}): Promise<PackageRunCommand | null> {\n const installCommand = getPackageInstallCommand(options.packageManager);\n const executable = await resolveExecutableOutsideRoot(options.cwd, installCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...installCommand,\n command: executable\n };\n}\n\nexport function splitCommandLine(command: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n } else if (character === '\\\\' && quote === '\"') {\n const next = command[index + 1];\n if (next === '\"' || next === '\\\\') {\n index += 1;\n current += next ?? '';\n } else {\n current += character;\n }\n } else {\n current += character;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (/\\s/.test(character)) {\n if (current.length > 0) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += character;\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function containsShellMetacharacters(command: string): boolean {\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '\\n' || character === '\\r') {\n return true;\n }\n\n if (';|&<>'.includes(character)) {\n return true;\n }\n\n if (character === '`') {\n return true;\n }\n\n if (character === '$' && (command[index + 1] === '(' || command[index + 1] === '{')) {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function resolveConfiguredCommand(\n cwd: string,\n command: string\n): Promise<PackageRunCommand | null> {\n const trimmed = command.trim();\n if (trimmed.length === 0 || containsShellMetacharacters(trimmed)) {\n return null;\n }\n\n const tokens = splitCommandLine(trimmed);\n if (tokens.length === 0) {\n return null;\n }\n\n const [executableName, ...args] = tokens;\n const executable = await resolveExecutableOutsideRoot(cwd, executableName);\n if (executable === null) {\n return null;\n }\n\n return {\n command: executable,\n args,\n displayCommand: trimmed\n };\n}\n\nexport async function runPackageScriptToTerminal(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<number> {\n const runCommand = await resolvePackageRunCommand(options);\n if (runCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(runCommand.command, runCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n\nexport async function runConfiguredCommandToTerminal(options: {\n cwd: string;\n command: string;\n}): Promise<number> {\n const resolvedCommand = await resolveConfiguredCommand(options.cwd, options.command);\n if (resolvedCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(resolvedCommand.command, resolvedCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n","const DANGEROUS_COMMAND =\n /\\b(rm\\s+-rf|docker\\s+volume\\s+rm|drop\\s+database|prisma\\s+migrate\\s+reset|git\\s+clean\\s+-fdx?)\\b/i;\n\nexport function isDangerousCommand(command: string): boolean {\n return DANGEROUS_COMMAND.test(command);\n}\n","import pc from 'picocolors';\nimport type { ScanResult } from '../../core/types.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nfunction formatList(values: string[]): string {\n return safeTerminalList(values);\n}\n\nexport function printScanResult(scan: ScanResult): void {\n console.log(pc.bold(`Project: ${safeTerminalText(scan.projectName)}`));\n console.log(`Language: ${formatList(scan.language.detected) || 'unknown'}`);\n console.log(`Type: ${safeTerminalText(scan.framework?.type ?? 'Unknown')}`);\n console.log(`Manager: ${safeTerminalText(scan.packageManager ?? 'unknown')}`);\n console.log(`Scripts: ${formatList(Object.keys(scan.scripts))}`);\n console.log(`Presets: ${formatList(scan.presets.map((preset) => preset.label)) || 'none'}`);\n console.log(`Git: ${safeTerminalText(scan.git?.branch ?? 'not detected')}`);\n console.log(`README: ${scan.readme.exists ? 'found' : 'missing'}`);\n console.log(`LICENSE: ${scan.license.exists ? 'found' : 'missing'}`);\n\n if (scan.env !== null) {\n console.log(`Env: ${scan.env.hasLocal ? '.env found' : '.env missing'}`);\n }\n\n if (scan.ports.length > 0) {\n const ports = scan.ports.map((port) => `${port.port}${port.inUse ? ' in use' : ' free'}`);\n console.log(`Ports: ${ports.join(', ')}`);\n }\n\n if (scan.docker !== null) {\n console.log(\n `Docker: compose found (${formatList(scan.docker.services.map((service) => service.name))})`\n );\n }\n}\n\nexport async function scanCommand(cwd = process.cwd()): Promise<void> {\n printScanResult(await scanProject(cwd));\n}\n","import pc from 'picocolors';\nimport open from 'open';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isHubRunning, registerWorkspaceRemotely, dashboardUrl } from '../hub/client.js';\nimport { printScanResult } from './scan.js';\n\nexport async function startCommand(options: {\n cwd?: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const port = options.port ?? 4567;\n\n console.log(pc.bold(`DevSurface v${DEV_SURFACE_VERSION}`));\n console.log('Scanning project...\\n');\n\n const scan = await scanProject(cwd);\n printScanResult(scan);\n\n const warnings = await runDoctor(cwd, scan);\n if (warnings.length > 0) {\n console.log('\\nWarnings:');\n for (const item of warnings) {\n const marker = item.severity === 'error' ? pc.red('!') : pc.yellow('!');\n console.log(` ${marker} ${item.title}`);\n }\n }\n\n if (await isHubRunning(port)) {\n console.log('\\nHub already running. Registering workspace...');\n const registered = await registerWorkspaceRemotely(cwd, port);\n if (registered) {\n const url = dashboardUrl(registered.id, port);\n console.log(`Workspace ${pc.cyan(registered.name)} attached.`);\n console.log(`Dashboard -> ${pc.cyan(url)}`);\n if (options.openBrowser !== false) {\n await open(url);\n }\n return;\n }\n console.log('Could not register with running hub. Starting a new instance...');\n }\n\n const server = await startHubServer({\n port,\n openBrowser: options.openBrowser,\n initialWorkspace: cwd\n });\n\n console.log(`\\nDashboard running at -> ${pc.cyan(server.url)}`);\n}\n","import process from 'node:process';\nimport {Buffer} from 'node:buffer';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport {isWsl, powerShellPath} from 'wsl-utils';\nimport defineLazyProperty from 'define-lazy-prop';\nimport defaultBrowser from 'default-browser';\nimport isInsideContainer from 'is-inside-container';\n\nconst execFile = promisify(childProcess.execFile);\n\n// Path to included `xdg-open`.\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst localXdgOpenPath = path.join(__dirname, 'xdg-open');\n\nconst {platform, arch} = process;\n\n/**\nGet the default browser name in Windows from WSL.\n\n@returns {Promise<string>} Browser name.\n*/\nasync function getWindowsDefaultBrowserFromWsl() {\n\tconst powershellPath = await powerShellPath();\n\tconst rawCommand = String.raw`(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice\").ProgId`;\n\tconst encodedCommand = Buffer.from(rawCommand, 'utf16le').toString('base64');\n\n\tconst {stdout} = await execFile(\n\t\tpowershellPath,\n\t\t[\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t\tencodedCommand,\n\t\t],\n\t\t{encoding: 'utf8'},\n\t);\n\n\tconst progId = stdout.trim();\n\n\t// Map ProgId to browser IDs\n\tconst browserMap = {\n\t\tChromeHTML: 'com.google.chrome',\n\t\tBraveHTML: 'com.brave.Browser',\n\t\tMSEdgeHTM: 'com.microsoft.edge',\n\t\tFirefoxURL: 'org.mozilla.firefox',\n\t};\n\n\treturn browserMap[progId] ? {id: browserMap[progId]} : {};\n}\n\nconst pTryEach = async (array, mapper) => {\n\tlet latestError;\n\n\tfor (const item of array) {\n\t\ttry {\n\t\t\treturn await mapper(item); // eslint-disable-line no-await-in-loop\n\t\t} catch (error) {\n\t\t\tlatestError = error;\n\t\t}\n\t}\n\n\tthrow latestError;\n};\n\n// eslint-disable-next-line complexity\nconst baseOpen = async options => {\n\toptions = {\n\t\twait: false,\n\t\tbackground: false,\n\t\tnewInstance: false,\n\t\tallowNonzeroExitCode: false,\n\t\t...options,\n\t};\n\n\tif (Array.isArray(options.app)) {\n\t\treturn pTryEach(options.app, singleApp => baseOpen({\n\t\t\t...options,\n\t\t\tapp: singleApp,\n\t\t}));\n\t}\n\n\tlet {name: app, arguments: appArguments = []} = options.app ?? {};\n\tappArguments = [...appArguments];\n\n\tif (Array.isArray(app)) {\n\t\treturn pTryEach(app, appName => baseOpen({\n\t\t\t...options,\n\t\t\tapp: {\n\t\t\t\tname: appName,\n\t\t\t\targuments: appArguments,\n\t\t\t},\n\t\t}));\n\t}\n\n\tif (app === 'browser' || app === 'browserPrivate') {\n\t\t// IDs from default-browser for macOS and windows are the same\n\t\tconst ids = {\n\t\t\t'com.google.chrome': 'chrome',\n\t\t\t'google-chrome.desktop': 'chrome',\n\t\t\t'com.brave.Browser': 'brave',\n\t\t\t'org.mozilla.firefox': 'firefox',\n\t\t\t'firefox.desktop': 'firefox',\n\t\t\t'com.microsoft.msedge': 'edge',\n\t\t\t'com.microsoft.edge': 'edge',\n\t\t\t'com.microsoft.edgemac': 'edge',\n\t\t\t'microsoft-edge.desktop': 'edge',\n\t\t};\n\n\t\t// Incognito flags for each browser in `apps`.\n\t\tconst flags = {\n\t\t\tchrome: '--incognito',\n\t\t\tbrave: '--incognito',\n\t\t\tfirefox: '--private-window',\n\t\t\tedge: '--inPrivate',\n\t\t};\n\n\t\tconst browser = isWsl ? await getWindowsDefaultBrowserFromWsl() : await defaultBrowser();\n\t\tif (browser.id in ids) {\n\t\t\tconst browserName = ids[browser.id];\n\n\t\t\tif (app === 'browserPrivate') {\n\t\t\t\tappArguments.push(flags[browserName]);\n\t\t\t}\n\n\t\t\treturn baseOpen({\n\t\t\t\t...options,\n\t\t\t\tapp: {\n\t\t\t\t\tname: apps[browserName],\n\t\t\t\t\targuments: appArguments,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tthrow new Error(`${browser.name} is not supported as a default browser`);\n\t}\n\n\tlet command;\n\tconst cliArguments = [];\n\tconst childProcessOptions = {};\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\n\t\tif (options.wait) {\n\t\t\tcliArguments.push('--wait-apps');\n\t\t}\n\n\t\tif (options.background) {\n\t\t\tcliArguments.push('--background');\n\t\t}\n\n\t\tif (options.newInstance) {\n\t\t\tcliArguments.push('--new');\n\t\t}\n\n\t\tif (app) {\n\t\t\tcliArguments.push('-a', app);\n\t\t}\n\t} else if (platform === 'win32' || (isWsl && !isInsideContainer() && !app)) {\n\t\tcommand = await powerShellPath();\n\n\t\tcliArguments.push(\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t);\n\n\t\tif (!isWsl) {\n\t\t\tchildProcessOptions.windowsVerbatimArguments = true;\n\t\t}\n\n\t\tconst encodedArguments = ['Start'];\n\n\t\tif (options.wait) {\n\t\t\tencodedArguments.push('-Wait');\n\t\t}\n\n\t\tif (app) {\n\t\t\t// Double quote with double quotes to ensure the inner quotes are passed through.\n\t\t\t// Inner quotes are delimited for PowerShell interpretation with backticks.\n\t\t\tencodedArguments.push(`\"\\`\"${app}\\`\"\"`);\n\t\t\tif (options.target) {\n\t\t\t\tappArguments.push(options.target);\n\t\t\t}\n\t\t} else if (options.target) {\n\t\t\tencodedArguments.push(`\"${options.target}\"`);\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tappArguments = appArguments.map(argument => `\"\\`\"${argument}\\`\"\"`);\n\t\t\tencodedArguments.push('-ArgumentList', appArguments.join(','));\n\t\t}\n\n\t\t// Using Base64-encoded command, accepted by PowerShell, to allow special characters.\n\t\toptions.target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64');\n\t} else {\n\t\tif (app) {\n\t\t\tcommand = app;\n\t\t} else {\n\t\t\t// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.\n\t\t\tconst isBundled = !__dirname || __dirname === '/';\n\n\t\t\t// Check if local `xdg-open` exists and is executable.\n\t\t\tlet exeLocalXdgOpen = false;\n\t\t\ttry {\n\t\t\t\tawait fs.access(localXdgOpenPath, fsConstants.X_OK);\n\t\t\t\texeLocalXdgOpen = true;\n\t\t\t} catch {}\n\n\t\t\tconst useSystemXdgOpen = process.versions.electron\n\t\t\t\t?? (platform === 'android' || isBundled || !exeLocalXdgOpen);\n\t\t\tcommand = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tcliArguments.push(...appArguments);\n\t\t}\n\n\t\tif (!options.wait) {\n\t\t\t// `xdg-open` will block the process unless stdio is ignored\n\t\t\t// and it's detached from the parent even if it's unref'd.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t\tchildProcessOptions.detached = true;\n\t\t}\n\t}\n\n\tif (platform === 'darwin' && appArguments.length > 0) {\n\t\tcliArguments.push('--args', ...appArguments);\n\t}\n\n\t// This has to come after `--args`.\n\tif (options.target) {\n\t\tcliArguments.push(options.target);\n\t}\n\n\tconst subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);\n\n\tif (options.wait) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\tif (!options.allowNonzeroExitCode && exitCode > 0) {\n\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(subprocess);\n\t\t\t});\n\t\t});\n\t}\n\n\tsubprocess.unref();\n\n\treturn subprocess;\n};\n\nconst open = (target, options) => {\n\tif (typeof target !== 'string') {\n\t\tthrow new TypeError('Expected a `target`');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\ttarget,\n\t});\n};\n\nexport const openApp = (name, options) => {\n\tif (typeof name !== 'string' && !Array.isArray(name)) {\n\t\tthrow new TypeError('Expected a valid `name`');\n\t}\n\n\tconst {arguments: appArguments = []} = options ?? {};\n\tif (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {\n\t\tthrow new TypeError('Expected `appArguments` as Array type');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\tapp: {\n\t\t\tname,\n\t\t\targuments: appArguments,\n\t\t},\n\t});\n};\n\nfunction detectArchBinary(binary) {\n\tif (typeof binary === 'string' || Array.isArray(binary)) {\n\t\treturn binary;\n\t}\n\n\tconst {[arch]: archBinary} = binary;\n\n\tif (!archBinary) {\n\t\tthrow new Error(`${arch} is not supported`);\n\t}\n\n\treturn archBinary;\n}\n\nfunction detectPlatformBinary({[platform]: platformBinary}, {wsl}) {\n\tif (wsl && isWsl) {\n\t\treturn detectArchBinary(wsl);\n\t}\n\n\tif (!platformBinary) {\n\t\tthrow new Error(`${platform} is not supported`);\n\t}\n\n\treturn detectArchBinary(platformBinary);\n}\n\nexport const apps = {};\n\ndefineLazyProperty(apps, 'chrome', () => detectPlatformBinary({\n\tdarwin: 'google chrome',\n\twin32: 'chrome',\n\tlinux: ['google-chrome', 'google-chrome-stable', 'chromium'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',\n\t\tx64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'brave', () => detectPlatformBinary({\n\tdarwin: 'brave browser',\n\twin32: 'brave',\n\tlinux: ['brave-browser', 'brave'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe',\n\t\tx64: ['/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe', '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'firefox', () => detectPlatformBinary({\n\tdarwin: 'firefox',\n\twin32: String.raw`C:\\Program Files\\Mozilla Firefox\\firefox.exe`,\n\tlinux: 'firefox',\n}, {\n\twsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe',\n}));\n\ndefineLazyProperty(apps, 'edge', () => detectPlatformBinary({\n\tdarwin: 'microsoft edge',\n\twin32: 'msedge',\n\tlinux: ['microsoft-edge', 'microsoft-edge-dev'],\n}, {\n\twsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',\n}));\n\ndefineLazyProperty(apps, 'browser', () => 'browser');\n\ndefineLazyProperty(apps, 'browserPrivate', () => 'browserPrivate');\n\nexport default open;\n","import process from 'node:process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport isWsl from 'is-wsl';\n\nexport const wslDrivesMountPoint = (() => {\n\t// Default value for \"root\" param\n\t// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config\n\tconst defaultMountPoint = '/mnt/';\n\n\tlet mountPoint;\n\n\treturn async function () {\n\t\tif (mountPoint) {\n\t\t\t// Return memoized mount point value\n\t\t\treturn mountPoint;\n\t\t}\n\n\t\tconst configFilePath = '/etc/wsl.conf';\n\n\t\tlet isConfigFileExists = false;\n\t\ttry {\n\t\t\tawait fs.access(configFilePath, fsConstants.F_OK);\n\t\t\tisConfigFileExists = true;\n\t\t} catch {}\n\n\t\tif (!isConfigFileExists) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tconst configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});\n\t\tconst configMountPoint = /(?<!#.*)root\\s*=\\s*(?<mountPoint>.*)/g.exec(configContent);\n\n\t\tif (!configMountPoint) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tmountPoint = configMountPoint.groups.mountPoint.trim();\n\t\tmountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;\n\n\t\treturn mountPoint;\n\t};\n})();\n\nexport const powerShellPathFromWsl = async () => {\n\tconst mountPoint = await wslDrivesMountPoint();\n\treturn `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;\n};\n\nexport const powerShellPath = async () => {\n\tif (isWsl) {\n\t\treturn powerShellPathFromWsl();\n\t}\n\n\treturn `${process.env.SYSTEMROOT || process.env.windir || String.raw`C:\\Windows`}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n};\n\nexport {default as isWsl} from 'is-wsl';\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport isInsideContainer from 'is-inside-container';\n\nconst isWsl = () => {\n\tif (process.platform !== 'linux') {\n\t\treturn false;\n\t}\n\n\tif (os.release().toLowerCase().includes('microsoft')) {\n\t\tif (isInsideContainer()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tif (fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')) {\n\t\t\treturn !isInsideContainer();\n\t\t}\n\t} catch {}\n\n\t// Fallback for custom kernels: check WSL-specific paths.\n\tif (\n\t\tfs.existsSync('/proc/sys/fs/binfmt_misc/WSLInterop')\n\t\t|| fs.existsSync('/run/WSL')\n\t) {\n\t\treturn !isInsideContainer();\n\t}\n\n\treturn false;\n};\n\nexport default process.env.__IS_WSL_TEST__ ? isWsl : isWsl();\n","import fs from 'node:fs';\nimport isDocker from 'is-docker';\n\nlet cachedResult;\n\n// Podman detection\nconst hasContainerEnv = () => {\n\ttry {\n\t\tfs.statSync('/run/.containerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default function isInsideContainer() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (cachedResult === undefined) {\n\t\tcachedResult = hasContainerEnv() || isDocker();\n\t}\n\n\treturn cachedResult;\n}\n","import fs from 'node:fs';\n\nlet isDockerCached;\n\nfunction hasDockerEnv() {\n\ttry {\n\t\tfs.statSync('/.dockerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasDockerCGroup() {\n\ttry {\n\t\treturn fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function isDocker() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (isDockerCached === undefined) {\n\t\tisDockerCached = hasDockerEnv() || hasDockerCGroup();\n\t}\n\n\treturn isDockerCached;\n}\n","export default function defineLazyProperty(object, propertyName, valueGetter) {\n\tconst define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});\n\n\tObject.defineProperty(object, propertyName, {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget() {\n\t\t\tconst result = valueGetter();\n\t\t\tdefine(result);\n\t\t\treturn result;\n\t\t},\n\t\tset(value) {\n\t\t\tdefine(value);\n\t\t}\n\t});\n\n\treturn object;\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\nimport defaultBrowserId from 'default-browser-id';\nimport bundleName from 'bundle-name';\nimport windows from './windows.js';\n\nexport {_windowsBrowserProgIdMap} from './windows.js';\n\nconst execFileAsync = promisify(execFile);\n\n// Inlined: https://github.com/sindresorhus/titleize/blob/main/index.js\nconst titleize = string => string.toLowerCase().replaceAll(/(?:^|\\s|-)\\S/g, x => x.toUpperCase());\n\nexport default async function defaultBrowser() {\n\tif (process.platform === 'darwin') {\n\t\tconst id = await defaultBrowserId();\n\t\tconst name = await bundleName(id);\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'linux') {\n\t\tconst {stdout} = await execFileAsync('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n\t\tconst id = stdout.trim();\n\t\tconst name = titleize(id.replace(/.desktop$/, '').replace('-', ' '));\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows();\n\t}\n\n\tthrow new Error('Only macOS, Linux, and Windows are supported');\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport default async function defaultBrowserId() {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst {stdout} = await execFileAsync('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure', 'LSHandlers']);\n\n\t// `(?!-)` is to prevent matching `LSHandlerRoleAll = \"-\";`.\n\tconst match = /LSHandlerRoleAll = \"(?!-)(?<id>[^\"]+?)\";\\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);\n\n\tconst browserId = match?.groups.id ?? 'com.apple.Safari';\n\n\t// Correct the case for Safari's bundle identifier\n\tif (browserId === 'com.apple.safari') {\n\t\treturn 'com.apple.Safari';\n\t}\n\n\treturn browserId;\n}\n","import process from 'node:process';\nimport {promisify} from 'node:util';\nimport {execFile, execFileSync} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runAppleScript(script, {humanReadableOutput = true, signal} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst execOptions = {};\n\tif (signal) {\n\t\texecOptions.signal = signal;\n\t}\n\n\tconst {stdout} = await execFileAsync('osascript', ['-e', script, outputArguments], execOptions);\n\treturn stdout.trim();\n}\n\nexport function runAppleScriptSync(script, {humanReadableOutput = true} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst stdout = execFileSync('osascript', ['-e', script, ...outputArguments], {\n\t\tencoding: 'utf8',\n\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\ttimeout: 500,\n\t});\n\n\treturn stdout.trim();\n}\n","import {runAppleScript} from 'run-applescript';\n\nexport default async function bundleName(bundleId) {\n\treturn runAppleScript(`tell application \"Finder\" to set app_path to application file id \"${bundleId}\" as string\\ntell application \"System Events\" to get value of property list item \"CFBundleName\" of property list file (app_path & \":Contents:Info.plist\")`);\n}\n","import {promisify} from 'node:util';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\n// TODO: Fix the casing of bundle identifiers in the next major version.\n\n// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake\n// ones that look real and match the macOS/Linux versions for cross-platform apps.\nconst windowsBrowserProgIds = {\n\tMSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct.\n\tMSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'},\n\tMSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'},\n\tAppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},\n\tChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},\n\tChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'},\n\tChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'},\n\tChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'},\n\tBraveHTML: {name: 'Brave', id: 'com.brave.Browser'},\n\tBraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},\n\tBraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'},\n\tBraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},\n\tFirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},\n\tOperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'},\n\tVivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'},\n\t'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},\n};\n\nexport const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));\n\nexport class UnknownBrowserError extends Error {}\n\nexport default async function defaultBrowser(_execFileAsync = execFileAsync) {\n\tconst {stdout} = await _execFileAsync('reg', [\n\t\t'QUERY',\n\t\t' HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n\t\t'/v',\n\t\t'ProgId',\n\t]);\n\n\tconst match = /ProgId\\s*REG_SZ\\s*(?<id>\\S+)/.exec(stdout);\n\tif (!match) {\n\t\tthrow new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);\n\t}\n\n\tconst {id} = match.groups;\n\n\t// Windows can append a hash suffix to ProgIds using a dot or hyphen\n\t// (e.g., `ChromeHTML.ABC123`, `FirefoxURL-6F193CCC56814779`).\n\t// Try exact match first, then try without the suffix.\n\tconst dotIndex = id.lastIndexOf('.');\n\tconst hyphenIndex = id.lastIndexOf('-');\n\tconst baseIdByDot = dotIndex === -1 ? undefined : id.slice(0, dotIndex);\n\tconst baseIdByHyphen = hyphenIndex === -1 ? undefined : id.slice(0, hyphenIndex);\n\n\treturn windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? {name: id, id};\n}\n","import { promises as fs } from 'node:fs';\nimport type { Server } from 'node:http';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createAdaptorServer } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { Hono } from 'hono';\nimport open from 'open';\nimport type { DockerController } from '../core/docker/compose.js';\nimport { ProcessManager } from '../core/process/manager.js';\nimport { Hub } from '../core/hub/runtime.js';\nimport { registerApiRoutes, registerHubApiRoutes } from './routes/api.js';\nimport { setupWebSocket, setupHubWebSocket } from './routes/ws.js';\nimport { createMutationToken } from './mutationToken.js';\nimport { initializeListenHost, DEFAULT_PORT } from './listenConfig.js';\n\nfunction warnIfContainerRootsUnset(host: string): void {\n if (host !== '0.0.0.0' && host !== '::') {\n return;\n }\n if (process.env.DEVSURFACE_WORKSPACE_ROOTS?.trim()) {\n return;\n }\n console.warn(\n 'Warning: DEVSURFACE_WORKSPACE_ROOTS is unset in container mode. ' +\n 'Any loopback or private-network client can register arbitrary directories as workspaces. ' +\n 'Set DEVSURFACE_WORKSPACE_ROOTS to restrict workspace registration.'\n );\n}\n\nexport { DEFAULT_HOST, DEFAULT_PORT, resolveHost } from './listenConfig.js';\n\nexport interface DevSurfaceServer {\n url: string;\n port: number;\n host: string;\n hub: Hub;\n close: () => Promise<void>;\n processManager: ProcessManager;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function findWebDistDir(): Promise<string | null> {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(moduleDir, '..', 'web', 'dist'),\n path.join(moduleDir, '..', '..', 'src', 'web', 'dist'),\n path.join(moduleDir, 'web', 'dist')\n ];\n\n for (const candidate of candidates) {\n if (await fileExists(path.join(candidate, 'index.html'))) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction toListenError(error: unknown, host: string, port: number): Error {\n const code = error instanceof Error ? (error as NodeJS.ErrnoException).code : undefined;\n\n if (code === 'EADDRINUSE') {\n return new Error(\n `Port ${port} is already in use on ${host}. Stop the other process or run DevSurface with --port ${port + 1}.`,\n { cause: error }\n );\n }\n\n if (code === 'EACCES') {\n return new Error(`DevSurface does not have permission to bind to ${host}:${port}.`, {\n cause: error\n });\n }\n\n return error instanceof Error ? error : new Error(String(error));\n}\n\nasync function listenOnHost(\n server: Server,\n wss: ReturnType<typeof setupWebSocket>,\n host: string,\n port: number\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n server.off('error', onError);\n server.off('listening', onListening);\n wss.off('error', onError);\n };\n\n const onError = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(toListenError(error, host, port));\n };\n\n const onListening = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve();\n };\n\n wss.once('error', onError);\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(port, host);\n });\n}\n\nasync function closeWebSocketServer(wss: ReturnType<typeof setupWebSocket>): Promise<void> {\n await new Promise<void>((resolve) => {\n wss.close(() => resolve());\n });\n}\n\nasync function closeHttpServer(server: Server): Promise<void> {\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\nasync function mountWebUi(app: Hono): Promise<void> {\n const webDistDir = await findWebDistDir();\n if (webDistDir !== null) {\n app.use('/assets/*', serveStatic({ root: webDistDir }));\n app.get('/favicon.svg', serveStatic({ root: webDistDir }));\n app.get('*', async (context) => {\n const html = await fs.readFile(path.join(webDistDir, 'index.html'), 'utf8');\n return context.html(html);\n });\n } else {\n app.get('*', (context) =>\n context.html(\n '<!doctype html><title>DevSurface</title><main><h1>DevSurface</h1><p>Run npm run build:web to build the dashboard.</p></main>',\n 503\n )\n );\n }\n}\n\n// Legacy single-project createApp (backward compat with existing tests)\nexport async function createApp(options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken?: string;\n}): Promise<Hono> {\n const app = new Hono();\n registerApiRoutes(app, {\n ...options,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\n// Hub-mode createApp\nexport async function createHubApp(options: { hub: Hub; mutationToken?: string }): Promise<Hono> {\n const app = new Hono();\n registerHubApiRoutes(app, {\n hub: options.hub,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\nexport async function startHubServer(options: {\n port?: number;\n openBrowser?: boolean;\n dataDir?: string;\n initialWorkspace?: string;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub({ dataDir: options.dataDir });\n hub.attachCleanupHandlers();\n warnIfContainerRootsUnset(host);\n\n if (options.initialWorkspace) {\n await hub.registry.add(options.initialWorkspace);\n }\n\n const mutationToken = createMutationToken();\n const app = await createHubApp({ hub, mutationToken });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupHubWebSocket(server, hub);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n const entries = await hub.registry.list();\n const deepLink = entries.length > 0 ? `${url}/?workspace=${entries[0].id}` : url;\n await open(deepLink);\n }\n\n const dummyProcessManager = new ProcessManager();\n\n return {\n url,\n port,\n host,\n hub,\n processManager: dummyProcessManager,\n close: async () => {\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n\n// Legacy single-project server (used by old tests)\nexport async function startDevSurfaceServer(options: {\n projectRoot: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub();\n hub.attachCleanupHandlers();\n\n await hub.registry.add(options.projectRoot);\n const processManager = new ProcessManager();\n processManager.attachCleanupHandlers();\n\n const app = await createApp({\n projectRoot: options.projectRoot,\n processManager\n });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupWebSocket(server, processManager);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n await open(url);\n }\n\n return {\n url,\n port,\n host,\n hub,\n processManager,\n close: async () => {\n processManager.killAll();\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n","import { EventEmitter } from 'node:events';\nimport type { ChildProcess } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../types.js';\n\nexport const LOG_MESSAGE_LIMIT = 16_384;\nconst LOG_ENTRY_LIMIT = 1000;\n\ninterface ProcessRecord extends ManagedProcessSnapshot {\n child: ChildProcess;\n}\n\nfunction killChildProcessTree(child: ChildProcess): void {\n if (child.pid === undefined) {\n child.kill();\n return;\n }\n\n if (process.platform === 'win32') {\n const result = spawn.sync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true\n });\n if (result.error) {\n child.kill();\n }\n return;\n }\n\n child.kill();\n}\n\nexport class ProcessManager extends EventEmitter {\n private readonly processes = new Map<string, ProcessRecord>();\n private readonly logs: ProcessLogEvent[] = [];\n private cleanupInstalled = false;\n\n start(options: {\n cwd: string;\n script: string;\n command: string;\n args: string[];\n displayCommand: string;\n }): ManagedProcessSnapshot {\n const child = spawn(options.command, options.args, {\n cwd: options.cwd,\n shell: false,\n windowsHide: true\n });\n\n const pid = String(child.pid ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`);\n const record: ProcessRecord = {\n child,\n pid,\n script: options.script,\n command: options.displayCommand,\n status: 'running',\n startedAt: new Date().toISOString(),\n endedAt: null,\n exitCode: null\n };\n\n this.processes.set(pid, record);\n this.emitSystem(record, `Started ${options.displayCommand}`);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stdout', chunk.toString());\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stderr', chunk.toString());\n });\n\n child.on('error', (error) => {\n record.status = 'failed';\n record.endedAt = new Date().toISOString();\n this.emitLog(record, 'system', error.message);\n this.emit('process', this.snapshot(record));\n });\n\n child.on('close', (code) => {\n if (record.status === 'stopped') {\n record.exitCode = code;\n } else {\n record.status = code === 0 ? 'exited' : 'failed';\n record.exitCode = code;\n }\n record.endedAt = new Date().toISOString();\n this.emitSystem(record, `Exited with code ${code ?? 'unknown'}`);\n this.emit('process', this.snapshot(record));\n });\n\n this.emit('process', this.snapshot(record));\n return this.snapshot(record);\n }\n\n stop(pid: string): boolean {\n const record = this.processes.get(pid);\n if (!record || record.status !== 'running') {\n return false;\n }\n\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n this.emitSystem(record, 'Stopped by DevSurface');\n this.emit('process', this.snapshot(record));\n return true;\n }\n\n list(): ManagedProcessSnapshot[] {\n return Array.from(this.processes.values()).map((record) => this.snapshot(record));\n }\n\n listLogs(): ProcessLogEvent[] {\n return [...this.logs];\n }\n\n killAll(): void {\n for (const record of this.processes.values()) {\n if (record.status === 'running') {\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n }\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n\n this.cleanupInstalled = true;\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n\n private emitLog(record: ProcessRecord, stream: ProcessLogEvent['stream'], message: string): void {\n const boundedMessage =\n message.length <= LOG_MESSAGE_LIMIT ? message : message.slice(-LOG_MESSAGE_LIMIT);\n const event: ProcessLogEvent = {\n pid: record.pid,\n script: record.script,\n stream,\n message: boundedMessage,\n timestamp: new Date().toISOString()\n };\n\n this.logs.push(event);\n if (this.logs.length > LOG_ENTRY_LIMIT) {\n this.logs.splice(0, this.logs.length - LOG_ENTRY_LIMIT);\n }\n\n this.emit('log', event);\n }\n\n private emitSystem(record: ProcessRecord, message: string): void {\n this.emitLog(record, 'system', message);\n }\n\n private snapshot(record: ProcessRecord): ManagedProcessSnapshot {\n return {\n pid: record.pid,\n script: record.script,\n command: record.command,\n status: record.status,\n startedAt: record.startedAt,\n endedAt: record.endedAt,\n exitCode: record.exitCode\n };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { assertWithinWorkspaceRoots } from './workspaceRoots.js';\n\nexport interface WorkspaceEntry {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n}\n\nfunction workspaceId(realPath: string): string {\n const base =\n path\n .basename(realPath)\n .replace(/[^a-zA-Z0-9_-]/g, '_')\n .slice(0, 32) || 'workspace';\n const hash = createHash('sha256').update(realPath).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\nfunction defaultDataDir(): string {\n return process.env.DEVSURFACE_DATA_DIR ?? path.join(os.homedir(), '.devsurface');\n}\n\nasync function readPackageName(dirPath: string): Promise<string | null> {\n try {\n const raw = JSON.parse(await fs.readFile(path.join(dirPath, 'package.json'), 'utf8'));\n return typeof raw?.name === 'string' && raw.name.length > 0 ? raw.name : null;\n } catch {\n return null;\n }\n}\n\nexport class WorkspaceRegistry {\n private readonly filePath: string;\n private seeded = false;\n\n constructor(dataDir?: string) {\n const dir = dataDir ?? defaultDataDir();\n this.filePath = path.join(dir, 'workspaces.json');\n }\n\n async list(): Promise<WorkspaceEntry[]> {\n await this.seedFromEnv();\n return await this.read();\n }\n\n async add(dirPath: string): Promise<WorkspaceEntry> {\n const realDir = await this.resolveDir(dirPath);\n await assertWithinWorkspaceRoots(realDir);\n const entries = await this.read();\n\n const existing = entries.find((entry) => entry.path === realDir);\n if (existing) {\n return existing;\n }\n\n const name = (await readPackageName(realDir)) ?? path.basename(realDir);\n const entry: WorkspaceEntry = {\n id: workspaceId(realDir),\n name,\n path: realDir,\n addedAt: new Date().toISOString()\n };\n entries.push(entry);\n await this.write(entries);\n return entry;\n }\n\n async remove(id: string): Promise<boolean> {\n const entries = await this.read();\n const filtered = entries.filter((entry) => entry.id !== id);\n if (filtered.length === entries.length) {\n return false;\n }\n await this.write(filtered);\n return true;\n }\n\n async findByPath(dirPath: string): Promise<WorkspaceEntry | null> {\n try {\n const realDir = await fs.realpath(path.resolve(dirPath));\n const entries = await this.read();\n return entries.find((entry) => entry.path === realDir) ?? null;\n } catch {\n return null;\n }\n }\n\n async resolve(id: string): Promise<WorkspaceEntry | null> {\n const entries = await this.read();\n const entry = entries.find((item) => item.id === id);\n if (!entry) {\n return null;\n }\n\n try {\n const realDir = await this.resolveDir(entry.path);\n await assertWithinWorkspaceRoots(realDir);\n if (realDir !== entry.path) {\n const updated: WorkspaceEntry = { ...entry, path: realDir };\n await this.write(entries.map((item) => (item.id === id ? updated : item)));\n return updated;\n }\n return entry;\n } catch {\n await this.remove(id);\n return null;\n }\n }\n\n private async resolveDir(dirPath: string): Promise<string> {\n const resolved = path.resolve(dirPath);\n const realDir = await fs.realpath(resolved);\n const stat = await fs.stat(realDir);\n if (!stat.isDirectory()) {\n throw new Error(`${dirPath} is not a directory.`);\n }\n return realDir;\n }\n\n private async read(): Promise<WorkspaceEntry[]> {\n try {\n const content = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async write(entries: WorkspaceEntry[]): Promise<void> {\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await fs.writeFile(this.filePath, JSON.stringify(entries, null, 2) + '\\n', {\n encoding: 'utf8',\n mode: 0o600\n });\n }\n\n private async seedFromEnv(): Promise<void> {\n if (this.seeded) {\n return;\n }\n this.seeded = true;\n\n const seedValue = process.env.DEVSURFACE_WORKSPACES;\n if (!seedValue) {\n return;\n }\n\n const paths = seedValue\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n for (const p of paths) {\n try {\n await this.add(p);\n } catch {\n // Skip invalid seed paths.\n }\n }\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function configuredWorkspaceRoots(): Promise<string[]> {\n const raw = process.env.DEVSURFACE_WORKSPACE_ROOTS;\n if (!raw) {\n return [];\n }\n\n const roots: string[] = [];\n for (const entry of raw.split(',')) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n try {\n roots.push(await fs.realpath(path.resolve(trimmed)));\n } catch {\n // Skip invalid roots.\n }\n }\n\n return roots;\n}\n\nexport async function assertWithinWorkspaceRoots(targetPath: string): Promise<void> {\n const roots = await configuredWorkspaceRoots();\n if (roots.length === 0) {\n return;\n }\n\n for (const root of roots) {\n if (isWithinRoot(root, targetPath)) {\n return;\n }\n }\n\n throw new Error('Path must be inside a configured workspace root.');\n}\n","import { ProcessManager } from '../process/manager.js';\nimport { DockerComposeController, type DockerController } from '../docker/compose.js';\nimport { WorkspaceRegistry, type WorkspaceEntry } from './registry.js';\n\nexport interface WorkspaceRuntime {\n readonly id: string;\n readonly root: string;\n readonly processManager: ProcessManager;\n readonly dockerController: DockerController;\n}\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n runningProcesses: number;\n}\n\nexport class Hub {\n readonly registry: WorkspaceRegistry;\n private readonly runtimes = new Map<string, WorkspaceRuntime>();\n private cleanupInstalled = false;\n\n constructor(options?: { dataDir?: string }) {\n this.registry = new WorkspaceRegistry(options?.dataDir);\n }\n\n get(id: string): WorkspaceRuntime | null {\n return this.runtimes.get(id) ?? null;\n }\n\n ensure(entry: WorkspaceEntry): WorkspaceRuntime {\n const existing = this.runtimes.get(entry.id);\n if (existing) {\n return existing;\n }\n\n const runtime: WorkspaceRuntime = {\n id: entry.id,\n root: entry.path,\n processManager: new ProcessManager(),\n dockerController: new DockerComposeController(entry.path)\n };\n this.runtimes.set(entry.id, runtime);\n return runtime;\n }\n\n async listSummaries(): Promise<WorkspaceSummary[]> {\n const entries = await this.registry.list();\n return entries.map((entry) => {\n const runtime = this.runtimes.get(entry.id);\n const running = runtime\n ? runtime.processManager.list().filter((p) => p.status === 'running').length\n : 0;\n return {\n id: entry.id,\n name: entry.name,\n path: entry.path,\n addedAt: entry.addedAt,\n runningProcesses: running\n };\n });\n }\n\n killAll(): void {\n for (const runtime of this.runtimes.values()) {\n runtime.processManager.killAll();\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n this.cleanupInstalled = true;\n\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n}\n","import { constants, existsSync } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport type { Hono } from 'hono';\nimport open from 'open';\nimport {\n DockerComposeController,\n DockerOperationError,\n type DockerController\n} from '../../core/docker/compose.js';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport {\n isDangerousCommand,\n resolveConfiguredCommand,\n resolvePackageInstallCommand,\n resolvePackageRunCommand\n} from '../../core/process/runner.js';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { buildOnboardingPlan } from '../../core/onboarding/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isAllowedLocalOrigin, isSameOrigin } from '../localAccess.js';\nimport { createApiAccessMiddleware } from '../accessControl.js';\nimport { hasValidMutationToken } from '../mutationToken.js';\nimport { isAllowedTerminalCommand } from '../terminal.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isAllowedMutationOrigin(requestUrl: string, origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n return isAllowedLocalOrigin(origin) && isSameOrigin(requestUrl, origin);\n}\n\nfunction registerMutationGuard(app: Hono, mutationToken: string): void {\n app.use('/api/*', createApiAccessMiddleware());\n app.use('/api/*', async (context, next) => {\n if (context.req.method === 'GET' || context.req.method === 'HEAD') {\n await next();\n return;\n }\n\n const origin = context.req.header('origin') ?? null;\n const secFetchSite = context.req.header('sec-fetch-site') ?? null;\n const intent = context.req.header('x-devsurface-intent') ?? null;\n const token = context.req.header('x-devsurface-token') ?? null;\n if (\n !hasMutationIntent(intent) ||\n !hasValidMutationToken(token, mutationToken) ||\n isCrossSiteFetch(secFetchSite) ||\n !isAllowedMutationOrigin(context.req.url, origin)\n ) {\n return context.json({ error: 'Cross-origin mutation rejected.' }, 403);\n }\n\n await next();\n });\n}\n\nfunction isCrossSiteFetch(secFetchSite: string | null): boolean {\n return secFetchSite === 'cross-site';\n}\n\nfunction hasMutationIntent(intent: string | null): boolean {\n return intent === 'dashboard';\n}\n\nasync function realPathWithinRoot(root: string, target: string): Promise<boolean> {\n if (!isWithinRoot(root, target)) {\n return false;\n }\n try {\n const [realRoot, realTarget] = await Promise.all([fs.realpath(root), fs.realpath(target)]);\n return isWithinRoot(realRoot, realTarget);\n } catch {\n return false;\n }\n}\n\nasync function writableDestinationWithinRoot(root: string, destination: string): Promise<boolean> {\n if (!isWithinRoot(root, destination)) {\n return false;\n }\n try {\n const [realRoot, realParent] = await Promise.all([\n fs.realpath(root),\n fs.realpath(path.dirname(destination))\n ]);\n return isWithinRoot(realRoot, realParent);\n } catch {\n return false;\n }\n}\n\nasync function copyFileExclusive(\n source: string,\n destination: string\n): Promise<'copied' | 'exists'> {\n const content = await fs.readFile(source);\n let handle: fs.FileHandle | null = null;\n try {\n handle = await fs.open(\n destination,\n constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY,\n 0o600\n );\n await handle.writeFile(content);\n return 'copied';\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'EEXIST') {\n return 'exists';\n }\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nfunction quotePowerShellString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction quotePosixString(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction resolveCommandPromptExecutable(): string {\n return process.env.ComSpec ?? 'cmd.exe';\n}\n\nfunction findExecutable(command: string): string | null {\n if (path.isAbsolute(command)) {\n return existsSync(command) ? command : null;\n }\n const pathValue = process.env.PATH ?? '';\n for (const directory of pathValue.split(path.delimiter)) {\n if (directory.length === 0) {\n continue;\n }\n const candidate = path.join(directory, command);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction launchDetached(command: string, args: string[], root: string): boolean {\n const child = spawn(command, args, {\n cwd: root,\n detached: true,\n stdio: 'ignore',\n windowsHide: process.platform === 'win32'\n });\n child.on('error', () => undefined);\n child.unref();\n return true;\n}\n\nfunction openTerminalAt(root: string): boolean {\n if (process.platform === 'win32') {\n return launchDetached(\n resolveCommandPromptExecutable(),\n [\n '/d',\n '/c',\n 'start',\n '\"\"',\n '/D',\n root,\n 'powershell.exe',\n '-NoExit',\n '-NoLogo',\n '-Command',\n `Set-Location -LiteralPath ${quotePowerShellString(root)}`\n ],\n root\n );\n }\n\n if (process.platform === 'darwin') {\n return launchDetached('open', ['-a', 'Terminal', root], root);\n }\n\n const configuredTerminal = process.env.TERMINAL?.trim();\n if (\n configuredTerminal !== undefined &&\n configuredTerminal.length > 0 &&\n isAllowedTerminalCommand(configuredTerminal) &&\n findExecutable(configuredTerminal) !== null\n ) {\n return launchDetached(configuredTerminal, [], root);\n }\n\n const linuxTerminals: Array<{ command: string; args: string[] }> = [\n { command: 'x-terminal-emulator', args: [] },\n { command: 'gnome-terminal', args: ['--working-directory', root] },\n { command: 'konsole', args: ['--workdir', root] },\n { command: 'xfce4-terminal', args: ['--working-directory', root] },\n {\n command: 'xterm',\n args: [\n '-e',\n 'sh',\n '-lc',\n `cd ${quotePosixString(root)} && exec ${quotePosixString(process.env.SHELL ?? 'sh')}`\n ]\n }\n ];\n\n const terminal = linuxTerminals.find((candidate) => findExecutable(candidate.command) !== null);\n if (terminal === undefined) {\n return false;\n }\n\n return launchDetached(terminal.command, terminal.args, root);\n}\n\nfunction handleDockerError(\n error: unknown,\n context: { json: (data: unknown, status: number) => Response }\n): Response {\n if (error instanceof DockerOperationError) {\n if (error.code === 'compose-not-found' || error.code === 'service-not-found') {\n return context.json({ error: error.message, code: error.code }, 404);\n }\n if (error.code === 'docker-not-installed' || error.code === 'docker-not-running') {\n return context.json({ error: error.message, code: error.code }, 503);\n }\n return context.json({ error: error.message, code: error.code }, 502);\n }\n throw error;\n}\n\nasync function onboardingForRoot(root: string) {\n const scan = await scanProject(root);\n const warnings = await runDoctor(root, scan);\n return buildOnboardingPlan(scan, warnings);\n}\n\nfunction registerWorkspaceRoutes(\n app: Hono,\n resolveWorkspace: (id: string) => Promise<{\n root: string;\n processManager: ProcessManager;\n dockerController: DockerController;\n } | null>\n): void {\n app.get('/api/workspaces/:id/project', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await scanProject(ws.root));\n });\n\n app.get('/api/workspaces/:id/health', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await runDoctor(ws.root));\n });\n\n app.get('/api/workspaces/:id/onboarding', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await onboardingForRoot(ws.root));\n });\n\n app.get('/api/workspaces/:id/processes', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.list());\n });\n\n app.get('/api/workspaces/:id/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.listLogs());\n });\n\n app.get('/api/workspaces/:id/docker/:service/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/start', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/stop', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/run/:script', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(ws.root);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: ws.root,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/workspaces/:id/install', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const command = await resolvePackageInstallCommand({\n cwd: ws.root,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/workspaces/:id/commands/:name', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(ws.root);\n const configuredCommand =\n scan.config?.config.commands?.[name] ?? scan.presetCommands[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(ws.root, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/workspaces/:id/open/folder', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n await open(ws.root);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/workspaces/:id/open/package', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const packagePath = path.join(ws.root, 'package.json');\n if (!(await realPathWithinRoot(ws.root, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/workspaces/:id/open/terminal', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const opened = openTerminalAt(ws.root);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/workspaces/:id/env/copy', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination = localPath ?? path.join(ws.root, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(ws.root, examplePath)) ||\n !(await writableDestinationWithinRoot(ws.root, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.delete('/api/workspaces/:id/run/:pid', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = ws.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n\nexport function registerHubApiRoutes(\n app: Hono,\n options: {\n hub: Hub;\n mutationToken: string;\n }\n): void {\n const { hub } = options;\n registerMutationGuard(app, options.mutationToken);\n\n async function resolveWorkspace(id: string) {\n const entry = await hub.registry.resolve(id);\n if (!entry) return null;\n const runtime = hub.ensure(entry);\n return {\n root: runtime.root,\n processManager: runtime.processManager,\n dockerController: runtime.dockerController\n };\n }\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/workspaces', async (context) => {\n return context.json(await hub.listSummaries());\n });\n\n app.post('/api/workspaces', async (context) => {\n const body = await context.req.json<{ path: string }>().catch(() => null);\n if (!body?.path) {\n return context.json({ error: 'path is required.' }, 400);\n }\n try {\n const entry = await hub.registry.add(body.path);\n return context.json(entry, 201);\n } catch (error) {\n return context.json({ error: error instanceof Error ? error.message : 'Invalid path.' }, 400);\n }\n });\n\n app.delete('/api/workspaces/:id', async (context) => {\n const id = context.req.param('id');\n const runtime = hub.get(id);\n if (runtime) {\n runtime.processManager.killAll();\n }\n const removed = await hub.registry.remove(id);\n return context.json({ removed }, removed ? 200 : 404);\n });\n\n registerWorkspaceRoutes(app, resolveWorkspace);\n\n // Backward-compatible single-project aliases: proxy to the first workspace\n app.get('/api/project', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await scanProject(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/health', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await runDoctor(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/onboarding', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await onboardingForRoot(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/processes', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.list());\n });\n\n app.get('/api/logs', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.listLogs());\n });\n}\n\n// Legacy single-project API for backward compatibility with tests\nexport function registerApiRoutes(\n app: Hono,\n options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken: string;\n }\n): void {\n const dockerController =\n options.dockerController ?? new DockerComposeController(options.projectRoot);\n registerMutationGuard(app, options.mutationToken);\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/project', async (context) => {\n return context.json(await scanProject(options.projectRoot));\n });\n\n app.get('/api/health', async (context) => {\n return context.json(await runDoctor(options.projectRoot));\n });\n\n app.get('/api/onboarding', async (context) => {\n return context.json(await onboardingForRoot(options.projectRoot));\n });\n\n app.get('/api/processes', (context) => {\n return context.json(options.processManager.list());\n });\n\n app.get('/api/logs', (context) => {\n return context.json(options.processManager.listLogs());\n });\n\n app.get('/api/docker/:service/logs', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/start', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/stop', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/run/:script', async (context) => {\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(options.projectRoot);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/install', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const command = await resolvePackageInstallCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/commands/:name', async (context) => {\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(options.projectRoot);\n const configuredCommand =\n scan.config?.config.commands?.[name] ?? scan.presetCommands[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(options.projectRoot, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/open/folder', async (context) => {\n await open(options.projectRoot);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/open/package', async (context) => {\n const packagePath = path.join(options.projectRoot, 'package.json');\n if (!(await realPathWithinRoot(options.projectRoot, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/open/terminal', (context) => {\n const opened = openTerminalAt(options.projectRoot);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/env/copy', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination =\n localPath ?? path.join(options.projectRoot, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(options.projectRoot, examplePath)) ||\n !(await writableDestinationWithinRoot(options.projectRoot, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.delete('/api/run/:pid', (context) => {\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = options.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n","export const DEV_SURFACE_VERSION = '0.7.1';\n","const LOCAL_HOSTNAMES = new Set(['127.0.0.1', 'localhost', '::1']);\n\nfunction hostnameFromHostHeader(host: string): string | null {\n const trimmed = host.trim().toLowerCase();\n if (trimmed.length === 0) {\n return null;\n }\n\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n return end > 0 ? trimmed.slice(1, end) : null;\n }\n\n return trimmed.split(':')[0] ?? null;\n}\n\nexport function isAllowedLocalHostHeader(host: string | null | undefined): boolean {\n if (typeof host !== 'string') {\n return false;\n }\n\n const hostname = hostnameFromHostHeader(host);\n return hostname !== null && LOCAL_HOSTNAMES.has(hostname);\n}\n\nexport function isAllowedLocalOrigin(origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n\n try {\n const url = new URL(origin);\n return (\n (url.protocol === 'http:' || url.protocol === 'https:') &&\n LOCAL_HOSTNAMES.has(url.hostname.toLowerCase())\n );\n } catch {\n return false;\n }\n}\n\nexport function isSameOrigin(requestUrl: string, origin: string): boolean {\n try {\n return new URL(requestUrl).origin === new URL(origin).origin;\n } catch {\n return false;\n }\n}\n","export const DEFAULT_HOST = '127.0.0.1';\nexport const DEFAULT_PORT = 4567;\n\nconst LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);\nconst CONTAINER_HOSTS = new Set(['0.0.0.0', '::']);\n\nexport function resolveHost(): string {\n const envHost = process.env.DEVSURFACE_HOST;\n if (!envHost) {\n return DEFAULT_HOST;\n }\n\n if (LOOPBACK_HOSTS.has(envHost)) {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost) && process.env.DEVSURFACE_CONTAINER === 'true') {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost)) {\n throw new Error(\n 'All-interface DevSurface binding is only allowed when DEVSURFACE_CONTAINER=true. DevSurface binds to 127.0.0.1 on bare metal.'\n );\n }\n\n throw new Error('DEVSURFACE_HOST must be a loopback host, or 0.0.0.0 inside a container.');\n}\n\nlet listenHost = DEFAULT_HOST;\n\nexport function setListenHost(host: string): void {\n listenHost = host;\n}\n\nexport function getListenHost(): string {\n return listenHost;\n}\n\nexport function resetListenHost(): void {\n listenHost = DEFAULT_HOST;\n}\n\nexport function normalizeRemoteAddress(raw: string | undefined): string | null {\n if (typeof raw !== 'string' || raw.length === 0) {\n return null;\n }\n\n if (raw.startsWith('::ffff:')) {\n return raw.slice('::ffff:'.length);\n }\n\n return raw;\n}\n\nexport function isLoopbackRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (address === '::1' || address === '127.0.0.1') {\n return true;\n }\n\n return address.startsWith('127.');\n}\n\nfunction parseIpv4(address: string): [number, number, number, number] | null {\n const parts = address.split('.');\n if (parts.length !== 4) {\n return null;\n }\n\n const octets = parts.map((part) => Number(part));\n if (octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255)) {\n return null;\n }\n\n return octets as [number, number, number, number];\n}\n\nexport function isPrivateRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (isLoopbackRemoteAddress(address)) {\n return true;\n }\n\n if (address.startsWith('fe80:')) {\n return true;\n }\n\n const ipv4 = parseIpv4(address);\n if (!ipv4) {\n return false;\n }\n\n const [a, b] = ipv4;\n if (a === 10) {\n return true;\n }\n if (a === 192 && b === 168) {\n return true;\n }\n if (a === 172 && b >= 16 && b <= 31) {\n return true;\n }\n\n return false;\n}\n\nexport function isAllowedRemoteAddress(raw: string | undefined, host: string): boolean {\n if (host === '0.0.0.0' || host === '::') {\n return isPrivateRemoteAddress(raw);\n }\n\n return isLoopbackRemoteAddress(raw);\n}\n\nexport function isAllowedClientConnection(\n raw: string | undefined,\n host: string = getListenHost()\n): boolean {\n if (raw === undefined) {\n return true;\n }\n\n return isAllowedRemoteAddress(raw, host);\n}\n\nexport function initializeListenHost(): string {\n const host = resolveHost();\n setListenHost(host);\n return host;\n}\n","import type { IncomingMessage } from 'node:http';\nimport type { Context, Next } from 'hono';\nimport { isAllowedLocalHostHeader } from './localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from './listenConfig.js';\n\nexport function remoteAddressFromRequest(request: IncomingMessage | undefined): string | undefined {\n return request?.socket?.remoteAddress;\n}\n\nexport function createRemoteAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n await next();\n };\n}\n\nexport function createApiAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const host = context.req.header('host') ?? new URL(context.req.url).host;\n if (!isAllowedLocalHostHeader(host)) {\n return context.json({ error: 'Non-local host rejected.' }, 403);\n }\n\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n\n await next();\n };\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport function createMutationToken(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function hasValidMutationToken(\n provided: string | null | undefined,\n expected: string\n): boolean {\n if (typeof provided !== 'string' || provided.length === 0) {\n return false;\n }\n\n if (provided.length !== expected.length) {\n return false;\n }\n\n return timingSafeEqual(Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8'));\n}\n","export function isAllowedTerminalCommand(command: string): boolean {\n return /^[A-Za-z0-9._+-]+$/.test(command);\n}\n","import type { Server } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../../core/types.js';\nimport { isAllowedLocalHostHeader, isAllowedLocalOrigin } from '../localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from '../listenConfig.js';\nimport { remoteAddressFromRequest } from '../accessControl.js';\n\nfunction isAllowedWebSocketRequest(request: IncomingMessage): boolean {\n const origin = request.headers.origin;\n const host = request.headers.host;\n const secFetchSite = request.headers['sec-fetch-site'];\n\n if (!isAllowedClientConnection(remoteAddressFromRequest(request), getListenHost())) {\n return false;\n }\n\n if (typeof host !== 'string' || !isAllowedLocalHostHeader(host)) {\n return false;\n }\n\n if (secFetchSite === 'cross-site') {\n return false;\n }\n\n if (typeof origin !== 'string') {\n return true;\n }\n\n if (!isAllowedLocalOrigin(origin)) {\n return false;\n }\n\n try {\n return new URL(origin).host.toLowerCase() === host.toLowerCase();\n } catch {\n return false;\n }\n}\n\nfunction workspaceIdFromUrl(url: string | undefined): string | null {\n if (!url) return null;\n try {\n const parsed = new URL(url, 'http://localhost');\n return parsed.searchParams.get('workspace');\n } catch {\n return null;\n }\n}\n\n// Legacy single-ProcessManager WebSocket (backward compat with tests)\nexport function setupWebSocket(server: Server, processManager: ProcessManager): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n function broadcast(payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(serialized);\n }\n }\n }\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcast({ type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcast({ type: 'process', process: processInfo });\n });\n\n wss.on('connection', (socket) => {\n socket.send(\n JSON.stringify({\n type: 'hello',\n processes: processManager.list(),\n logs: processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n\n// Hub-aware WebSocket: each connection is scoped to a workspace via ?workspace=<id>\nexport function setupHubWebSocket(server: Server, hub: Hub): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n const clientWorkspaces = new WeakMap<WebSocket, string>();\n const attachedManagers = new Set<string>();\n\n function attachManager(workspaceId: string, processManager: ProcessManager): void {\n if (attachedManagers.has(workspaceId)) {\n return;\n }\n attachedManagers.add(workspaceId);\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcastToWorkspace(workspaceId, { type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcastToWorkspace(workspaceId, { type: 'process', process: processInfo });\n });\n }\n\n function broadcastToWorkspace(workspaceId: string, payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN && clientWorkspaces.get(client) === workspaceId) {\n client.send(serialized);\n }\n }\n }\n\n wss.on('connection', async (socket, request) => {\n const workspaceId = workspaceIdFromUrl(request.url);\n if (!workspaceId) {\n socket.close(4000, 'Missing workspace query parameter.');\n return;\n }\n\n const entry = await hub.registry.resolve(workspaceId);\n if (!entry) {\n socket.close(4004, 'Workspace not found.');\n return;\n }\n\n const runtime = hub.ensure(entry);\n clientWorkspaces.set(socket, workspaceId);\n attachManager(workspaceId, runtime.processManager);\n\n socket.send(\n JSON.stringify({\n type: 'hello',\n workspace: workspaceId,\n processes: runtime.processManager.list(),\n logs: runtime.processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n","import { DEFAULT_HOST, DEFAULT_PORT } from '../../server/index.js';\n\nexport async function isHubRunning(port: number = DEFAULT_PORT): Promise<boolean> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/api/hub/status`, {\n signal: AbortSignal.timeout(2000)\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nexport async function registerWorkspaceRemotely(\n dirPath: string,\n port: number = DEFAULT_PORT\n): Promise<{ id: string; name: string } | null> {\n try {\n const sessionResponse = await fetch(`http://127.0.0.1:${port}/api/session`, {\n signal: AbortSignal.timeout(2000)\n });\n if (!sessionResponse.ok) return null;\n const session = (await sessionResponse.json()) as { token: string };\n\n const response = await fetch(`http://127.0.0.1:${port}/api/workspaces`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-DevSurface-Intent': 'dashboard',\n 'X-DevSurface-Token': session.token\n },\n body: JSON.stringify({ path: dirPath }),\n signal: AbortSignal.timeout(5000)\n });\n if (!response.ok) return null;\n return (await response.json()) as { id: string; name: string };\n } catch {\n return null;\n }\n}\n\nexport function dashboardUrl(\n workspaceId: string,\n port: number = DEFAULT_PORT,\n host: string = DEFAULT_HOST\n): string {\n const displayHost = host === '0.0.0.0' ? '127.0.0.1' : host;\n return `http://${displayHost}:${port}/?workspace=${workspaceId}`;\n}\n","import pc from 'picocolors';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\n\nexport async function serveCommand(options: {\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n console.log(pc.bold(`DevSurface Hub v${DEV_SURFACE_VERSION}`));\n console.log('Starting hub server...\\n');\n\n const server = await startHubServer({\n port: options.port,\n openBrowser: options.openBrowser\n });\n\n const summaries = await server.hub.listSummaries();\n if (summaries.length > 0) {\n console.log(`Registered workspaces: ${summaries.length}`);\n for (const ws of summaries) {\n console.log(` ${pc.cyan(ws.name)} -> ${ws.path}`);\n }\n } else {\n console.log(\n 'No workspaces registered yet. Use `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n }\n\n console.log(`\\nHub running at -> ${pc.cyan(server.url)}`);\n}\n","import path from 'node:path';\nimport pc from 'picocolors';\nimport { WorkspaceRegistry } from '../../core/hub/registry.js';\n\nexport async function workspaceAddCommand(dirPath?: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const target = path.resolve(dirPath ?? process.cwd());\n const entry = await registry.add(target);\n console.log(`Added workspace ${pc.cyan(entry.name)} (${entry.id}) -> ${entry.path}`);\n}\n\nexport async function workspaceListCommand(): Promise<void> {\n const registry = new WorkspaceRegistry();\n const entries = await registry.list();\n\n if (entries.length === 0) {\n console.log(\n 'No workspaces registered. Run `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n return;\n }\n\n console.log(`${entries.length} workspace${entries.length === 1 ? '' : 's'}:\\n`);\n for (const entry of entries) {\n console.log(` ${pc.cyan(entry.name)} (${entry.id})`);\n console.log(` ${entry.path}`);\n }\n}\n\nexport async function workspaceRemoveCommand(id: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const removed = await registry.remove(id);\n if (removed) {\n console.log(`Removed workspace ${pc.cyan(id)}.`);\n } else {\n console.error(`Workspace \"${id}\" not found.`);\n process.exitCode = 1;\n }\n}\n","const REGISTRY_LATEST_URL = 'https://registry.npmjs.org/devsurface/latest';\nconst UPDATE_CHECK_TIMEOUT_MS = 900;\n\nexport interface UpdateInfo {\n currentVersion: string;\n latestVersion: string;\n}\n\nfunction parseVersion(version: string): [number, number, number] | null {\n const match = version.match(/^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/);\n if (!match) {\n return null;\n }\n\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nexport function isNewerVersion(latestVersion: string, currentVersion: string): boolean {\n const latest = parseVersion(latestVersion);\n const current = parseVersion(currentVersion);\n if (latest === null || current === null) {\n return false;\n }\n\n for (let index = 0; index < latest.length; index += 1) {\n if (latest[index] > current[index]) {\n return true;\n }\n if (latest[index] < current[index]) {\n return false;\n }\n }\n\n return false;\n}\n\nexport function formatUpdateNotice(info: UpdateInfo): string {\n return `Update available: v${info.latestVersion}\\nRun: npx devsurface@latest`;\n}\n\nfunction shouldCheckForUpdates(): boolean {\n return process.env.DEVSURFACE_UPDATE_CHECK !== '0' && process.env.CI !== 'true';\n}\n\nexport async function checkForUpdate(\n currentVersion: string,\n fetchImpl: typeof fetch = fetch\n): Promise<UpdateInfo | null> {\n if (!shouldCheckForUpdates()) {\n return null;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), UPDATE_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetchImpl(REGISTRY_LATEST_URL, {\n headers: {\n accept: 'application/json'\n },\n signal: controller.signal\n });\n if (!response.ok) {\n return null;\n }\n\n const body = (await response.json()) as { version?: unknown };\n const latestVersion = typeof body.version === 'string' ? body.version : null;\n if (latestVersion === null || !isNewerVersion(latestVersion, currentVersion)) {\n return null;\n }\n\n return {\n currentVersion,\n latestVersion\n };\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function printUpdateNotice(currentVersion: string): Promise<void> {\n const update = await checkForUpdate(currentVersion);\n if (update !== null) {\n console.log(`\\n${formatUpdateNotice(update)}`);\n }\n}\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","fs","path","isWithinRoot","isWithinRoot","path","fs","platform","fs","path","fs","path","isWithinRoot","fs","path","isWithinRoot","fs","path","fs","path","isWithinRoot","fs","path","readIfPresent","isWithinRoot","path","fs","fs","readIfPresent","path","ESC","fs","path","pc","path","fs","pc","pc","warning","pc","pc","spawn","runCommand","spawn","pc","pc","pc","pc","process","Buffer","path","promisify","fs","fsConstants","process","fs","process","os","fs","fs","fs","fs","process","os","fs","fs","process","promisify","process","execFile","process","process","promisify","execFile","execFileAsync","promisify","execFile","execFileAsync","execFileAsync","promisify","execFile","defaultBrowser","process","execFile","promisify","path","process","Buffer","defaultBrowser","fs","fsConstants","fs","path","fileURLToPath","spawn","fs","os","path","fs","path","isWithinRoot","path","os","fs","entry","constants","fs","path","spawn","isWithinRoot","path","fs","handle","constants","spawn","workspaceId","fs","path","fileURLToPath","workspaceId","pc","pc","pc","path","pc","path","pc"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/doctor.ts","../../src/core/doctor/index.ts","../../src/core/documentation.ts","../../src/core/scanner/index.ts","../../src/core/config/load.ts","../../src/core/security/url.ts","../../src/core/config/defaults.ts","../../src/core/docker/compose.ts","../../src/core/process/executable.ts","../../src/core/scanner/docker.ts","../../src/core/scanner/env.ts","../../src/core/scanner/framework.ts","../../src/core/scanner/git.ts","../../src/core/scanner/language.ts","../../src/core/scanner/packageManager.ts","../../src/core/scanner/packageJson.ts","../../src/core/scanner/ports.ts","../../src/core/scanner/portOwner.ts","../../src/core/scanner/presets.ts","../../src/core/scanner/scripts.ts","../../src/core/security/text.ts","../../src/cli/commands/init.ts","../../src/cli/commands/onboard.ts","../../src/core/onboarding/index.ts","../../src/cli/commands/passport.ts","../../src/core/explain/index.ts","../../src/core/process/runner.ts","../../src/core/security/dangerousCommand.ts","../../src/core/passport/index.ts","../../src/version.ts","../../src/cli/commands/run.ts","../../src/cli/commands/scan.ts","../../src/cli/commands/start.ts","../../node_modules/open/index.js","../../node_modules/wsl-utils/index.js","../../node_modules/is-wsl/index.js","../../node_modules/is-inside-container/index.js","../../node_modules/is-docker/index.js","../../node_modules/define-lazy-prop/index.js","../../node_modules/default-browser/index.js","../../node_modules/default-browser-id/index.js","../../node_modules/run-applescript/index.js","../../node_modules/bundle-name/index.js","../../node_modules/default-browser/windows.js","../../src/server/index.ts","../../src/core/process/manager.ts","../../src/core/hub/registry.ts","../../src/core/hub/workspaceRoots.ts","../../src/core/hub/runtime.ts","../../src/server/routes/api.ts","../../src/core/env/write.ts","../../src/server/localAccess.ts","../../src/server/listenConfig.ts","../../src/server/accessControl.ts","../../src/server/mutationToken.ts","../../src/server/terminal.ts","../../src/server/routes/ws.ts","../../src/cli/hub/client.ts","../../src/cli/commands/serve.ts","../../src/cli/commands/workspace.ts","../../src/cli/updateCheck.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { doctorCommand } from './commands/doctor.js';\nimport { initCommand } from './commands/init.js';\nimport { onboardCommand } from './commands/onboard.js';\nimport { passportCommand } from './commands/passport.js';\nimport { runCommand } from './commands/run.js';\nimport { scanCommand } from './commands/scan.js';\nimport { startCommand } from './commands/start.js';\nimport { serveCommand } from './commands/serve.js';\nimport {\n workspaceAddCommand,\n workspaceListCommand,\n workspaceRemoveCommand\n} from './commands/workspace.js';\nimport { printUpdateNotice } from './updateCheck.js';\nimport { DEV_SURFACE_VERSION } from '../version.js';\n\nconst program = new Command();\n\nfunction toPort(value: string): number {\n const port = Number(value);\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error('Port must be an integer between 1 and 65535.');\n }\n\n return port;\n}\n\nfunction handle(command: Promise<void>): void {\n command\n .then(async () => {\n await printUpdateNotice(DEV_SURFACE_VERSION);\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n}\n\nprogram\n .name('devsurface')\n .description('Turn any Node.js repository into a local developer control panel.')\n .version(DEV_SURFACE_VERSION)\n // Without this, the root -p/--port option swallows \"-p\" typed after a\n // subcommand, so \"devsurface serve -p 4599\" silently bound the default port.\n .enablePositionalOptions()\n .option('-p, --port <port>', 'dashboard port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n startCommand({\n cwd: process.cwd(),\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nprogram\n .command('serve')\n .description('Start the DevSurface hub server (multi-workspace mode).')\n .option('-p, --port <port>', 'hub port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n serveCommand({\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nconst workspace = program.command('workspace').description('Manage registered workspaces.');\n\nworkspace\n .command('add [path]')\n .description('Register a project directory with the hub.')\n .action((dirPath?: string) => {\n handle(workspaceAddCommand(dirPath));\n });\n\nworkspace\n .command('list')\n .description('List all registered workspaces.')\n .action(() => {\n handle(workspaceListCommand());\n });\n\nworkspace\n .command('remove <id>')\n .description('Remove a workspace from the hub registry.')\n .action((id: string) => {\n handle(workspaceRemoveCommand(id));\n });\n\nprogram\n .command('scan')\n .description('Print detected project info.')\n .action(() => {\n handle(scanCommand(process.cwd()));\n });\n\nprogram\n .command('doctor')\n .description('Print setup health warnings.')\n .action(() => {\n handle(doctorCommand(process.cwd()));\n });\n\nprogram\n .command('onboard')\n .description('Print a guided setup checklist with readiness score.')\n .action(() => {\n handle(onboardCommand(process.cwd()));\n });\n\nprogram\n .command('passport')\n .description('Generate a shareable HTML onboarding report (Project Passport).')\n .option('-o, --out <file>', 'output file path', 'devsurface-passport.html')\n .action((options: { out: string }) => {\n handle(passportCommand(process.cwd(), options.out));\n });\n\nprogram\n .command('init')\n .description('Create a starter devsurface.config.json.')\n .action(() => {\n handle(initCommand(process.cwd()));\n });\n\nprogram\n .command('run')\n .argument('<script>', 'package.json script to run')\n .description('Run a package script and stream logs.')\n .action((script: string) => {\n handle(runCommand(script, process.cwd()));\n });\n\nawait program.parseAsync(process.argv);\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction colorSeverity(severity: 'error' | 'warning' | 'info'): string {\n if (severity === 'error') {\n return pc.red('error');\n }\n\n if (severity === 'warning') {\n return pc.yellow('warning');\n }\n\n return pc.cyan('info');\n}\n\nexport async function doctorCommand(cwd = process.cwd()): Promise<void> {\n const warnings = await runDoctor(cwd);\n\n if (warnings.length === 0) {\n console.log(pc.green('No health warnings found.'));\n return;\n }\n\n for (const item of warnings) {\n console.log(`${colorSeverity(item.severity)} ${pc.bold(safeTerminalText(item.title))}`);\n console.log(` ${safeTerminalText(item.message)}`);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { extractScriptReferences } from '../documentation.js';\nimport type { DoctorWarning, ScanResult } from '../types.js';\nimport { scanProject } from '../scanner/index.js';\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readIfPresent(filePath: string | null): Promise<string | null> {\n if (filePath === null) {\n return null;\n }\n\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction warning(\n id: string,\n severity: DoctorWarning['severity'],\n title: string,\n message: string,\n target?: string\n): DoctorWarning {\n return { id, severity, title, message, target };\n}\n\nexport async function runDoctor(root = process.cwd(), scan?: ScanResult): Promise<DoctorWarning[]> {\n const result = scan ?? (await scanProject(root));\n const warnings: DoctorWarning[] = [];\n\n for (const configWarning of result.config?.warnings ?? []) {\n warnings.push(\n warning('config-warning', 'warning', 'Config warning', configWarning, result.config?.path)\n );\n }\n\n const isNodeProject = result.language.detected.includes('node');\n const hasKnownProjectLanguage = result.language.detected.length > 0;\n\n if (result.packageJson === null && !hasKnownProjectLanguage) {\n warnings.push(\n warning(\n 'missing-package-json',\n 'error',\n 'No package.json',\n 'This directory is not a Node.js project.'\n )\n );\n return warnings;\n }\n\n if (isNodeProject && !(await pathExists(path.join(root, 'node_modules', '.bin')))) {\n warnings.push(\n warning(\n 'missing-node-modules',\n 'warning',\n 'Dependencies are not installed',\n 'node_modules/.bin is missing. Run the project install command before starting scripts.'\n )\n );\n }\n\n if (result.env?.hasExample && !result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env',\n 'error',\n '.env is missing',\n '.env.example exists, but the local .env file is missing.',\n result.env.examplePath ?? undefined\n )\n );\n }\n\n if (result.env && result.env.missingKeys.length > 0 && result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env-keys',\n 'warning',\n 'Environment keys are missing',\n `Missing keys: ${result.env.missingKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n if (result.env && result.env.emptyKeys.length > 0) {\n warnings.push(\n warning(\n 'empty-env-keys',\n 'info',\n 'Environment keys are empty',\n `Empty keys: ${result.env.emptyKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n const missingReadme = !result.readme.exists;\n if (missingReadme) {\n warnings.push(\n warning('missing-readme', 'warning', 'No README', 'No README.md or README file was found.')\n );\n } else {\n const readme = await readIfPresent(result.readme.path);\n if (readme !== null) {\n const references = extractScriptReferences(readme);\n const missingScripts = references.filter((script) => result.scripts[script] === undefined);\n if (missingScripts.length > 0) {\n warnings.push(\n warning(\n 'readme-script-mismatch',\n 'warning',\n 'README references missing scripts',\n `README mentions scripts not present in package.json: ${missingScripts.join(', ')}.`\n )\n );\n }\n }\n }\n\n for (const port of result.ports.filter((probe) => probe.inUse)) {\n warnings.push(\n warning(\n `port-${port.port}-in-use`,\n 'error',\n `Port ${port.port} is already in use`,\n `Something is already bound to 127.0.0.1:${port.port}.`\n )\n );\n }\n\n if (result.docker && result.docker.dockerRunning === false) {\n warnings.push(\n warning(\n 'docker-not-running',\n 'warning',\n 'Docker Compose found but Docker is not running',\n result.docker.message ?? 'A compose file exists, but Docker is not available.'\n )\n );\n }\n\n if (isNodeProject && result.scripts.test === undefined) {\n warnings.push(\n warning(\n 'missing-test-script',\n 'warning',\n 'No test script',\n 'package.json does not define a test script.'\n )\n );\n }\n\n if (isNodeProject && result.scripts.build === undefined) {\n warnings.push(\n warning(\n 'missing-build-script',\n 'warning',\n 'No build script',\n 'package.json does not define a build script.'\n )\n );\n }\n\n return warnings;\n}\n","export function extractScriptReferences(content: string): string[] {\n const references = new Set<string>();\n const commandRegexes = [\n /\\bnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bpnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bbun\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\byarn\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bnpm\\s+(test|start|build)\\b/g,\n /\\bpnpm\\s+(test|start|build)\\b/g,\n /\\byarn\\s+(test|start|build)\\b/g,\n /\\bbun\\s+(test|start|build)\\b/g\n ];\n\n for (const regex of commandRegexes) {\n for (const match of content.matchAll(regex)) {\n references.add(match[1]);\n }\n }\n\n return Array.from(references);\n}\n\nexport function documentsEnvironmentSetup(content: string): boolean {\n return /(?:\\.env(?:\\.example)?|environment\\s+variables?)/i.test(content);\n}\n\nexport function undocumentedPorts(content: string, ports: number[]): number[] {\n return ports.filter((port) => !new RegExp(`\\\\b${port}\\\\b`).test(content));\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FilePresence, ScanResult } from '../types.js';\nimport { loadConfig } from '../config/load.js';\nimport { detectDocker } from './docker.js';\nimport { detectEnv } from './env.js';\nimport { detectFramework } from './framework.js';\nimport { detectGit } from './git.js';\nimport { detectProjectLanguage } from './language.js';\nimport { detectPackageManager } from './packageManager.js';\nimport { readPackageJson } from './packageJson.js';\nimport { defaultPortsForFramework, detectPorts, inferPortsFromScripts } from './ports.js';\nimport { findPortOwners } from './portOwner.js';\nimport { detectPresets, mergePresetCommands, mergePresetGroups } from './presets.js';\nimport { extractScripts } from './scripts.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function findFirstFile(root: string, candidates: string[]): Promise<FilePresence> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n\n for (const candidate of candidates) {\n const filePath = path.join(root, candidate);\n try {\n const [stat, realPath] = await Promise.all([fs.stat(filePath), fs.realpath(filePath)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realPath)) {\n return { path: realPath, exists: true };\n }\n } catch {\n // Keep looking through the candidate list.\n }\n }\n\n return { path: null, exists: false };\n}\n\nfunction configuredPorts(configPorts: number[] | undefined): number[] {\n return Array.isArray(configPorts) ? configPorts : [];\n}\n\nexport async function scanProject(root = process.cwd()): Promise<ScanResult> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const config = await loadConfig(resolvedRoot);\n const packageJson = await readPackageJson(resolvedRoot);\n const scripts = extractScripts(packageJson) ?? {};\n const framework = detectFramework(packageJson);\n const language = await detectProjectLanguage(resolvedRoot, packageJson);\n const presets = await detectPresets({\n root: resolvedRoot,\n packageJson,\n framework,\n language\n });\n const presetCommands = mergePresetCommands(presets);\n const presetGroups = mergePresetGroups(presets);\n const portsToProbe = [\n ...configuredPorts(config?.config.ports),\n ...inferPortsFromScripts(scripts),\n ...defaultPortsForFramework(framework),\n ...presets.flatMap((preset) => preset.ports)\n ];\n\n const [packageManager, env, docker, git, ports, readme, license] = await Promise.all([\n detectPackageManager(resolvedRoot),\n detectEnv(resolvedRoot, config?.config),\n detectDocker(resolvedRoot),\n detectGit(resolvedRoot),\n detectPorts(portsToProbe),\n findFirstFile(resolvedRoot, ['README.md', 'README']),\n findFirstFile(resolvedRoot, ['LICENSE', 'LICENSE.md', 'COPYING'])\n ]);\n\n // Identify who is squatting on busy ports so conflicts are actionable.\n const busyPorts = (ports ?? []).filter((probe) => probe.inUse).map((probe) => probe.port);\n if (busyPorts.length > 0) {\n const owners = await findPortOwners(busyPorts);\n for (const probe of ports ?? []) {\n if (probe.inUse) {\n probe.owner = owners.get(probe.port) ?? null;\n }\n }\n }\n\n return {\n root: resolvedRoot,\n projectName: config?.config.name ?? packageJson?.data.name ?? path.basename(resolvedRoot),\n packageJson,\n packageManager: packageManager ?? (packageJson ? 'npm' : null),\n language,\n scripts,\n env,\n docker,\n git,\n framework,\n presets,\n presetCommands,\n presetGroups,\n ports: ports ?? [],\n readme,\n license,\n config\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { isSafeHttpUrl } from '../security/url.js';\nimport type { ConfigLoadResult, DevSurfaceConfig, SetupGuideStep } from '../types.js';\nimport { CONFIG_FILE_NAME } from './defaults.js';\n\nexport const MAX_CONFIGURED_PORTS = 32;\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toStringRecord(\n value: unknown,\n warnings: string[],\n label: string\n): Record<string, string> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push(`${label} must be an object.`);\n return undefined;\n }\n\n const record: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'string') {\n record[key] = raw;\n } else {\n warnings.push(`${label}.${key} must be a string.`);\n }\n }\n\n return record;\n}\n\nfunction toGroups(value: unknown, warnings: string[]): Record<string, string[]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push('groups must be an object.');\n return undefined;\n }\n\n const groups: Record<string, string[]> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (Array.isArray(raw) && raw.every((entry) => typeof entry === 'string')) {\n groups[key] = raw;\n } else {\n warnings.push(`groups.${key} must be an array of command names.`);\n }\n }\n\n return groups;\n}\n\nexport const MAX_SETUP_GUIDE_STEPS = 24;\nconst MAX_SETUP_GUIDE_STEP_LENGTH = 200;\n\nfunction toSetupGuide(\n value: unknown,\n warnings: string[]\n): Array<string | SetupGuideStep> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('setupGuide must be an array of strings or step objects.');\n return undefined;\n }\n\n const steps: Array<string | SetupGuideStep> = [];\n for (const entry of value) {\n if (typeof entry === 'string') {\n const trimmed = entry.trim();\n if (trimmed.length > 0) {\n steps.push(trimmed.slice(0, MAX_SETUP_GUIDE_STEP_LENGTH));\n }\n } else if (isRecord(entry)) {\n if (typeof entry.title !== 'string' || entry.title.trim().length === 0) {\n warnings.push('setupGuide step objects must have a non-empty title string.');\n continue;\n }\n const step: SetupGuideStep = {\n title: entry.title.trim().slice(0, MAX_SETUP_GUIDE_STEP_LENGTH)\n };\n if (typeof entry.description === 'string' && entry.description.trim().length > 0) {\n step.description = entry.description.trim().slice(0, MAX_SETUP_GUIDE_STEP_LENGTH);\n }\n if (typeof entry.command === 'string' && entry.command.trim().length > 0) {\n step.command = entry.command.trim();\n }\n if (typeof entry.script === 'string' && entry.script.trim().length > 0) {\n step.script = entry.script.trim();\n }\n steps.push(step);\n } else {\n warnings.push('setupGuide entries must be strings or step objects.');\n }\n }\n\n if (steps.length > MAX_SETUP_GUIDE_STEPS) {\n warnings.push(`setupGuide may contain at most ${MAX_SETUP_GUIDE_STEPS} steps.`);\n }\n\n return steps.slice(0, MAX_SETUP_GUIDE_STEPS);\n}\n\nfunction toPorts(value: unknown, warnings: string[]): number[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('ports must be an array of numbers.');\n return undefined;\n }\n\n const ports = value.filter(\n (port): port is number => Number.isInteger(port) && port > 0 && port < 65536\n );\n if (ports.length !== value.length) {\n warnings.push('ports may only contain integers between 1 and 65535.');\n }\n\n if (ports.length > MAX_CONFIGURED_PORTS) {\n warnings.push(`ports may contain at most ${MAX_CONFIGURED_PORTS} entries.`);\n }\n\n return ports.slice(0, MAX_CONFIGURED_PORTS);\n}\n\nexport function validateConfig(raw: unknown): { config: DevSurfaceConfig; warnings: string[] } {\n const warnings: string[] = [];\n if (!isRecord(raw)) {\n return { config: {}, warnings: ['devsurface.config.json must contain a JSON object.'] };\n }\n\n const env = isRecord(raw.env)\n ? {\n example: typeof raw.env.example === 'string' ? raw.env.example : undefined,\n local: typeof raw.env.local === 'string' ? raw.env.local : undefined\n }\n : undefined;\n\n if (raw.env !== undefined && !isRecord(raw.env)) {\n warnings.push('env must be an object.');\n }\n\n const services = isRecord(raw.services)\n ? {\n docker: typeof raw.services.docker === 'boolean' ? raw.services.docker : undefined\n }\n : undefined;\n\n if (raw.services !== undefined && !isRecord(raw.services)) {\n warnings.push('services must be an object.');\n }\n\n let docs: string | undefined;\n if (typeof raw.docs === 'string' && raw.docs.length > 0) {\n if (isSafeHttpUrl(raw.docs)) {\n docs = raw.docs;\n } else {\n warnings.push('docs must be an http or https URL.');\n }\n }\n\n return {\n config: {\n name: typeof raw.name === 'string' ? raw.name : undefined,\n description: typeof raw.description === 'string' ? raw.description : undefined,\n commands: toStringRecord(raw.commands, warnings, 'commands'),\n groups: toGroups(raw.groups, warnings),\n ports: toPorts(raw.ports, warnings),\n env,\n services,\n setupGuide: toSetupGuide(raw.setupGuide ?? raw.setup_guide, warnings),\n docs\n },\n warnings\n };\n}\n\nexport async function loadConfig(root: string): Promise<ConfigLoadResult | null> {\n const configPath = path.join(root, CONFIG_FILE_NAME);\n\n try {\n const [realRoot, realConfigPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(configPath)\n ]);\n if (!isWithinRoot(realRoot, realConfigPath)) {\n return null;\n }\n const content = await fs.readFile(realConfigPath, 'utf8');\n const parsed = JSON.parse(content) as unknown;\n const { config, warnings } = validateConfig(parsed);\n return { path: realConfigPath, config, warnings };\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'ENOENT') {\n return null;\n }\n\n if (error instanceof SyntaxError) {\n return {\n path: configPath,\n config: {},\n warnings: [`${CONFIG_FILE_NAME} contains invalid JSON.`]\n };\n }\n\n return null;\n }\n}\n","export function isSafeHttpUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n","import type { DevSurfaceConfig } from '../types.js';\n\nexport const CONFIG_FILE_NAME = 'devsurface.config.json';\n\nexport const defaultConfig: DevSurfaceConfig = {\n name: 'My App',\n description: 'Local developer control panel',\n commands: {\n install: 'npm install',\n migrate: 'npm run db:migrate',\n seed: 'npm run db:seed',\n dev: 'npm run dev',\n build: 'npm run build',\n test: 'npm test',\n lint: 'npm run lint'\n },\n groups: {\n 'First-time setup': ['install', 'migrate', 'seed'],\n 'Daily development': ['dev'],\n 'Before committing': ['test', 'lint'],\n Build: ['build']\n },\n ports: [3000],\n env: {\n example: '.env.example',\n local: '.env'\n },\n services: {\n docker: true\n },\n setupGuide: [\n {\n title: 'Install dependencies',\n description: 'Run the package manager install to set up node_modules.',\n command: 'install'\n },\n 'Copy .env.example to .env',\n 'Fill in required environment values (DATABASE_URL, etc.)',\n {\n title: 'Run database migrations',\n description: 'Apply the database schema to your local database.',\n command: 'migrate'\n },\n {\n title: 'Start the development server',\n description: 'Run the local dev server and open the app in a browser.',\n command: 'dev'\n }\n ],\n docs: ''\n};\n","import { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport { parse as parseYaml } from 'yaml';\nimport { resolveExecutableOutsideRoot } from '../process/executable.js';\nimport type {\n DockerDaemonStatus,\n DockerInfo,\n DockerServiceInfo,\n DockerServiceStatus\n} from '../types.js';\n\nconst COMPOSE_FILES = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];\nconst COMMAND_OUTPUT_LIMIT = 200_000;\nconst ESC = String.fromCharCode(27);\nconst ANSI_CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\n\nexport interface DockerCommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error: 'not-found' | 'timeout' | 'spawn' | null;\n}\n\nexport interface DockerCommandOptions {\n timeoutMs?: number;\n outputLimit?: number;\n}\n\nexport type DockerCommandRunner = (\n root: string,\n args: string[],\n options?: DockerCommandOptions\n) => Promise<DockerCommandResult>;\n\nexport interface DockerActionResult {\n service: string;\n action: 'start' | 'stop';\n output: string;\n}\n\nexport interface DockerLogsResult {\n service: string;\n logs: string;\n}\n\nexport interface DockerController {\n inspect(): Promise<DockerInfo | null>;\n start(service: string): Promise<DockerActionResult>;\n stop(service: string): Promise<DockerActionResult>;\n logs(service: string): Promise<DockerLogsResult>;\n}\n\nexport type DockerOperationErrorCode =\n | 'compose-not-found'\n | 'service-not-found'\n | 'docker-not-installed'\n | 'docker-not-running'\n | 'command-failed';\n\nexport class DockerOperationError extends Error {\n constructor(\n public readonly code: DockerOperationErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'DockerOperationError';\n }\n}\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction dockerCommandCwd(root: string): string {\n const candidates = [os.homedir(), os.tmpdir(), path.parse(path.resolve(root)).root];\n return candidates.find((candidate) => !isWithinRoot(root, candidate)) ?? os.homedir();\n}\n\nfunction appendBounded(current: string, chunk: string, limit: number): string {\n const combined = current + chunk;\n return combined.length <= limit ? combined : combined.slice(-limit);\n}\n\nexport const runDockerCommand: DockerCommandRunner = async (root, args, options = {}) => {\n const dockerExecutable = await resolveExecutableOutsideRoot(root, 'docker');\n if (dockerExecutable === null) {\n return { code: null, stdout: '', stderr: '', error: 'not-found' };\n }\n\n const timeoutMs = options.timeoutMs ?? 5000;\n const outputLimit = options.outputLimit ?? COMMAND_OUTPUT_LIMIT;\n\n return await new Promise((resolve) => {\n const child = spawn(dockerExecutable, args, {\n cwd: dockerCommandCwd(root),\n windowsHide: true\n });\n let settled = false;\n let stdout = '';\n let stderr = '';\n\n const finish = (result: DockerCommandResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve(result);\n };\n\n const timeout = setTimeout(() => {\n child.kill();\n finish({ code: null, stdout, stderr, error: 'timeout' });\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout = appendBounded(stdout, chunk.toString(), outputLimit);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr = appendBounded(stderr, chunk.toString(), outputLimit);\n });\n child.on('error', () => {\n finish({ code: null, stdout, stderr, error: 'spawn' });\n });\n child.on('close', (code) => {\n finish({ code, stdout, stderr, error: null });\n });\n });\n};\n\nasync function findComposeFiles(root: string): Promise<string[]> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const matches: string[] = [];\n\n for (const file of COMPOSE_FILES) {\n const candidate = path.join(root, file);\n try {\n const [stat, realCandidate] = await Promise.all([fs.stat(candidate), fs.realpath(candidate)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realCandidate)) {\n matches.push(realCandidate);\n }\n } catch {\n // Continue through the supported Compose filenames.\n }\n }\n\n return matches;\n}\n\nasync function serviceNamesFromFiles(composeFiles: string[]): Promise<string[]> {\n const names = new Set<string>();\n\n for (const composeFile of composeFiles) {\n try {\n const parsed = parseYaml(await fs.readFile(composeFile, 'utf8')) as unknown;\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('services' in parsed) ||\n typeof parsed.services !== 'object' ||\n parsed.services === null ||\n Array.isArray(parsed.services)\n ) {\n continue;\n }\n\n for (const name of Object.keys(parsed.services)) {\n if (name.length > 0) {\n names.add(name);\n }\n }\n } catch {\n // Malformed files remain visible as Compose files, but expose no actions.\n }\n }\n\n return Array.from(names);\n}\n\nfunction composeArgs(root: string, composeFiles: string[], args: string[]): string[] {\n return [\n 'compose',\n ...composeFiles.flatMap((composeFile) => ['-f', composeFile]),\n '--project-directory',\n root,\n ...args\n ];\n}\n\nfunction cleanMessage(value: string): string {\n return value.replace(ANSI_CSI_SEQUENCE, '').trim().slice(-1000);\n}\n\nfunction resultMessage(result: DockerCommandResult): string {\n return cleanMessage(result.stderr || result.stdout);\n}\n\nfunction daemonStatus(\n result: DockerCommandResult,\n platform: NodeJS.Platform\n): {\n status: DockerDaemonStatus;\n running: boolean;\n message: string | null;\n} {\n if (result.error === 'not-found') {\n return {\n status: 'not-installed',\n running: false,\n message: 'Docker CLI was not found. Install Docker and refresh this page.'\n };\n }\n\n if (result.code === 0) {\n return { status: 'running', running: true, message: null };\n }\n\n if (platform === 'win32' || platform === 'darwin') {\n return {\n status: 'stopped',\n running: false,\n message:\n 'Docker is installed, but its engine is not responding. Start Docker Desktop and refresh.'\n };\n }\n\n const detail = resultMessage(result);\n return {\n status: result.error === 'timeout' ? 'unknown' : 'stopped',\n running: false,\n message: detail\n ? `Docker is installed, but its daemon is not responding: ${detail}`\n : 'Docker is installed, but its daemon is not responding. Start Docker and refresh.'\n };\n}\n\nfunction exitCodeFromRow(record: Record<string, unknown>): number | null {\n if (typeof record.ExitCode === 'number') {\n return record.ExitCode;\n }\n if (typeof record.ExitCode === 'string' && /^\\d+$/.test(record.ExitCode)) {\n return Number(record.ExitCode);\n }\n if (typeof record.Status === 'string') {\n const match = /\\bExited\\s+\\((\\d+)\\)/i.exec(record.Status);\n if (match?.[1]) {\n return Number(match[1]);\n }\n }\n return null;\n}\n\nfunction serviceStatusFromRow(record: Record<string, unknown>): DockerServiceStatus {\n const state = typeof record.State === 'string' ? record.State.toLowerCase() : '';\n const exitCode = exitCodeFromRow(record);\n\n if (state === 'running') {\n return 'running';\n }\n if (exitCode !== null && exitCode > 0) {\n return 'error';\n }\n if (state === 'created' || state === 'exited' || state === 'stopped') {\n return 'stopped';\n }\n if (state === 'dead' || state === 'restarting' || state === 'paused') {\n return 'error';\n }\n return 'unknown';\n}\n\nfunction addComposeStatusRow(statuses: Map<string, DockerServiceInfo>, row: unknown): void {\n if (typeof row !== 'object' || row === null) {\n return;\n }\n\n const record = row as Record<string, unknown>;\n if (typeof record.Service !== 'string') {\n return;\n }\n\n const detail =\n typeof record.Status === 'string' && record.Status.trim()\n ? record.Status.trim()\n : typeof record.State === 'string' && record.State.trim()\n ? record.State.trim()\n : null;\n\n statuses.set(record.Service, {\n name: record.Service,\n status: serviceStatusFromRow(record),\n statusDetail: detail,\n containerId: typeof record.ID === 'string' && record.ID.length > 0 ? record.ID : null\n });\n}\n\nfunction parseComposePs(output: string): Map<string, DockerServiceInfo> {\n const statuses = new Map<string, DockerServiceInfo>();\n const compactOutput = output.trim();\n if (!compactOutput) {\n return statuses;\n }\n\n try {\n const parsed = JSON.parse(compactOutput) as unknown;\n for (const row of Array.isArray(parsed) ? parsed : [parsed]) {\n addComposeStatusRow(statuses, row);\n }\n return statuses;\n } catch {\n // Older Compose builds can emit one JSON object per line.\n }\n\n for (const line of compactOutput.split(/\\r?\\n/)) {\n try {\n addComposeStatusRow(statuses, JSON.parse(line) as unknown);\n } catch {\n return new Map();\n }\n }\n\n return statuses;\n}\n\nfunction unknownServices(serviceNames: string[]): DockerServiceInfo[] {\n return serviceNames.map((name) => ({\n name,\n status: 'unknown',\n statusDetail: null,\n containerId: null\n }));\n}\n\nfunction commandFailureMessage(action: string, result: DockerCommandResult): string {\n const detail = resultMessage(result);\n return detail ? `Docker Compose ${action} failed: ${detail}` : `Docker Compose ${action} failed.`;\n}\n\nexport class DockerComposeController implements DockerController {\n private readonly runner: DockerCommandRunner;\n private readonly platform: NodeJS.Platform;\n\n constructor(\n private readonly root: string,\n options: {\n runner?: DockerCommandRunner;\n platform?: NodeJS.Platform;\n } = {}\n ) {\n this.runner = options.runner ?? runDockerCommand;\n this.platform = options.platform ?? process.platform;\n }\n\n private async definition(): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n } | null> {\n const composeFiles = await findComposeFiles(this.root);\n if (composeFiles.length === 0) {\n return null;\n }\n return {\n composeFiles,\n serviceNames: await serviceNamesFromFiles(composeFiles)\n };\n }\n\n private async requireService(service: string): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n }> {\n const definition = await this.definition();\n if (definition === null) {\n throw new DockerOperationError('compose-not-found', 'No Docker Compose file was found.');\n }\n if (!definition.serviceNames.includes(service)) {\n throw new DockerOperationError(\n 'service-not-found',\n `Docker Compose service \"${service}\" was not found.`\n );\n }\n return definition;\n }\n\n private async requireDaemon(): Promise<void> {\n const result = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(result, this.platform);\n if (daemon.status === 'not-installed') {\n throw new DockerOperationError('docker-not-installed', daemon.message ?? 'Docker not found.');\n }\n if (!daemon.running) {\n throw new DockerOperationError(\n 'docker-not-running',\n daemon.message ?? 'Docker is not running.'\n );\n }\n }\n\n async inspect(): Promise<DockerInfo | null> {\n const definition = await this.definition();\n if (definition === null) {\n return null;\n }\n\n const infoResult = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(infoResult, this.platform);\n if (!daemon.running) {\n return {\n composeFiles: definition.composeFiles,\n services: unknownServices(definition.serviceNames),\n dockerRunning: false,\n daemonStatus: daemon.status,\n message: daemon.message\n };\n }\n\n const ps = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, ['ps', '--all', '--format', 'json']),\n { timeoutMs: 8000 }\n );\n if (ps.code !== 0 || ps.error !== null) {\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map((name) => ({\n name,\n status: 'error',\n statusDetail: null,\n containerId: null\n })),\n dockerRunning: true,\n daemonStatus: 'running',\n message: commandFailureMessage('status check', ps)\n };\n }\n\n const statuses = parseComposePs(ps.stdout);\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map(\n (name) =>\n statuses.get(name) ?? {\n name,\n status: 'stopped',\n statusDetail: null,\n containerId: null\n }\n ),\n dockerRunning: true,\n daemonStatus: 'running',\n message: null\n };\n }\n\n private async action(service: string, action: 'start' | 'stop'): Promise<DockerActionResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const composeCommand =\n action === 'start' ? ['up', '-d', '--', service] : ['stop', '--', service];\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, composeCommand),\n { timeoutMs: 60_000 }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage(action, result));\n }\n return {\n service,\n action,\n output: cleanMessage(result.stdout || result.stderr)\n };\n }\n\n async start(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'start');\n }\n\n async stop(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'stop');\n }\n\n async logs(service: string): Promise<DockerLogsResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, [\n 'logs',\n '--no-color',\n '--tail',\n '200',\n '--',\n service\n ]),\n { timeoutMs: 15_000, outputLimit: COMMAND_OUTPUT_LIMIT }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage('logs', result));\n }\n return {\n service,\n logs: appendBounded('', `${result.stdout}${result.stderr}`, COMMAND_OUTPUT_LIMIT)\n };\n }\n}\n","import { constants } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction pathEntries(pathValue: string): string[] {\n return pathValue\n .split(path.delimiter)\n .map((entry) => entry.trim().replace(/^\"|\"$/g, ''))\n .filter((entry) => entry.length > 0);\n}\n\nfunction hasPathSeparator(command: string): boolean {\n return command.includes('/') || command.includes('\\\\');\n}\n\nfunction executableNames(command: string): string[] {\n if (process.platform !== 'win32' || path.extname(command)) {\n return [command];\n }\n\n const extensions = (process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD')\n .split(';')\n .map((extension) => extension.trim().toLowerCase())\n .filter(Boolean);\n return extensions.map((extension) => `${command}${extension}`);\n}\n\nasync function executableOutsideRoot(root: string, candidate: string): Promise<string | null> {\n if (isWithinRoot(root, candidate)) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n if (isWithinRoot(realRoot, realCandidate)) {\n return null;\n }\n\n await fs.access(realCandidate, constants.X_OK);\n return realCandidate;\n } catch {\n return null;\n }\n}\n\nexport async function resolveExecutableOutsideRoot(\n root: string,\n command: string\n): Promise<string | null> {\n if (path.isAbsolute(command) || hasPathSeparator(command)) {\n return await executableOutsideRoot(root, path.resolve(command));\n }\n\n for (const entry of pathEntries(process.env.PATH ?? '')) {\n const directory = path.resolve(entry);\n if (isWithinRoot(root, directory)) {\n continue;\n }\n\n for (const executableName of executableNames(command)) {\n const executable = await executableOutsideRoot(root, path.join(directory, executableName));\n if (executable !== null) {\n return executable;\n }\n }\n }\n\n return null;\n}\n","import { DockerComposeController } from '../docker/compose.js';\nimport type { DockerInfo } from '../types.js';\n\nexport async function detectDocker(root: string): Promise<DockerInfo | null> {\n return await new DockerComposeController(root).inspect();\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { DevSurfaceConfig, EnvInfo } from '../types.js';\n\ninterface ParsedEnv {\n keys: string[];\n emptyKeys: string[];\n}\n\nasync function readIfPresent(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction resolveInsideRoot(root: string, configuredPath: string): string | null {\n const resolvedRoot = path.resolve(root);\n const resolvedPath = path.resolve(resolvedRoot, configuredPath);\n const relative = path.relative(resolvedRoot, resolvedPath);\n const insideRoot = relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? resolvedPath : null;\n}\n\nasync function resolveExistingInsideRoot(\n root: string,\n configuredPath: string\n): Promise<string | null> {\n const candidate = resolveInsideRoot(root, configuredPath);\n if (candidate === null) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n const relative = path.relative(realRoot, realCandidate);\n const insideRoot =\n relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? candidate : null;\n } catch {\n return null;\n }\n}\n\nexport function parseEnvKeys(content: string): ParsedEnv {\n const keys: string[] = [];\n const emptyKeys: string[] = [];\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n const normalized = line.startsWith('export ') ? line.slice('export '.length).trim() : line;\n const separator = normalized.indexOf('=');\n if (separator <= 0) {\n continue;\n }\n\n const key = normalized.slice(0, separator).trim();\n const value = normalized.slice(separator + 1).trim();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n keys.push(key);\n if (value.length === 0 || value === '\"\"' || value === \"''\") {\n emptyKeys.push(key);\n }\n }\n }\n\n return { keys: Array.from(new Set(keys)), emptyKeys: Array.from(new Set(emptyKeys)) };\n}\n\nexport async function detectEnv(\n root: string,\n config?: DevSurfaceConfig | null\n): Promise<EnvInfo | null> {\n const exampleName = config?.env?.example ?? '.env.example';\n const localName = config?.env?.local ?? '.env';\n const [examplePath, localPath] = await Promise.all([\n resolveExistingInsideRoot(root, exampleName),\n resolveExistingInsideRoot(root, localName)\n ]);\n const [exampleContent, localContent] = await Promise.all([\n examplePath === null ? null : readIfPresent(examplePath),\n localPath === null ? null : readIfPresent(localPath)\n ]);\n\n if (exampleContent === null && localContent === null) {\n return null;\n }\n\n const example =\n exampleContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(exampleContent);\n const local = localContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(localContent);\n const localKeySet = new Set(local.keys);\n const localEmptySet = new Set(local.emptyKeys);\n const missingKeys = example.keys.filter((key) => !localKeySet.has(key));\n const emptyKeys = local.keys.filter((key) => localEmptySet.has(key));\n\n return {\n examplePath: exampleContent === null ? null : examplePath,\n localPath: localContent === null ? null : localPath,\n hasExample: exampleContent !== null,\n hasLocal: localContent !== null,\n exampleKeys: example.keys,\n localKeys: local.keys,\n missingKeys,\n emptyKeys,\n keys: example.keys.map((key) => ({\n key,\n present: localKeySet.has(key),\n empty: localEmptySet.has(key)\n }))\n };\n}\n","import type { FrameworkInfo, PackageJsonInfo } from '../types.js';\n\nconst frameworkPackages: Array<{ packageName: string; label: string }> = [\n { packageName: 'next', label: 'Next.js' },\n { packageName: 'vite', label: 'Vite' },\n { packageName: 'express', label: 'Express' },\n { packageName: 'fastify', label: 'Fastify' },\n { packageName: '@nestjs/core', label: 'NestJS' },\n { packageName: '@remix-run/react', label: 'Remix' },\n { packageName: 'prisma', label: 'Prisma' }\n];\n\nexport function detectFramework(packageJson: PackageJsonInfo | null): FrameworkInfo | null {\n if (packageJson === null) {\n return null;\n }\n\n const dependencies = {\n ...packageJson.data.dependencies,\n ...packageJson.data.devDependencies,\n ...packageJson.data.optionalDependencies,\n ...packageJson.data.peerDependencies\n };\n\n const detected = frameworkPackages\n .filter((framework) => dependencies[framework.packageName] !== undefined)\n .map((framework) => framework.label);\n\n if (detected.length === 0) {\n return {\n type: 'Node.js',\n detected: ['Node.js']\n };\n }\n\n return {\n type: ['Node.js', ...detected].join(' / '),\n detected\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { GitInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function resolveGitDirectory(root: string): Promise<string | null> {\n const gitPath = path.join(root, '.git');\n\n try {\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n return gitPath;\n }\n\n if (stat.isFile()) {\n const content = await fs.readFile(gitPath, 'utf8');\n const match = content.match(/^gitdir:\\s*(.+)\\s*$/m);\n if (match) {\n const gitDir = match[1].trim();\n const resolvedGitDir = path.isAbsolute(gitDir)\n ? path.resolve(gitDir)\n : path.resolve(root, gitDir);\n if (!isWithinRoot(root, resolvedGitDir)) {\n return null;\n }\n\n const [realRoot, realGitDir] = await Promise.all([\n fs.realpath(root),\n fs.realpath(resolvedGitDir)\n ]);\n return isWithinRoot(realRoot, realGitDir) ? resolvedGitDir : null;\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nexport async function detectGit(root: string): Promise<GitInfo | null> {\n const gitRoot = await resolveGitDirectory(root);\n if (gitRoot === null) {\n return null;\n }\n\n try {\n const head = await fs.readFile(path.join(gitRoot, 'HEAD'), 'utf8');\n const refMatch = head.match(/^ref:\\s+refs\\/heads\\/(.+)\\s*$/);\n return {\n root: gitRoot,\n branch: refMatch ? refMatch[1] : head.trim().slice(0, 12)\n };\n } catch {\n return {\n root: gitRoot,\n branch: null\n };\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo, ProjectLanguage, ProjectLanguageInfo } from '../types.js';\n\nconst languageFiles: Array<{ language: ProjectLanguage; candidates: string[] }> = [\n { language: 'python', candidates: ['requirements.txt', 'pyproject.toml', 'Pipfile'] },\n { language: 'go', candidates: ['go.mod'] },\n { language: 'java', candidates: ['pom.xml', 'build.gradle', 'build.gradle.kts'] }\n];\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function safeFile(root: string, candidate: string): Promise<string | null> {\n const filePath = path.join(root, candidate);\n try {\n const [realRoot, stat, realPath] = await Promise.all([\n fs.realpath(root),\n fs.stat(filePath),\n fs.realpath(filePath)\n ]);\n if (stat.isFile() && isWithinRoot(realRoot, realPath)) {\n return realPath;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport async function detectProjectLanguage(\n root: string,\n packageJson: PackageJsonInfo | null\n): Promise<ProjectLanguageInfo> {\n const detected: ProjectLanguage[] = [];\n const files: string[] = [];\n\n if (packageJson !== null) {\n detected.push('node');\n files.push(packageJson.path);\n }\n\n for (const definition of languageFiles) {\n let found = false;\n for (const candidate of definition.candidates) {\n const file = await safeFile(root, candidate);\n if (file !== null) {\n found = true;\n files.push(file);\n }\n }\n if (found) {\n detected.push(definition.language);\n }\n }\n\n return {\n primary: detected[0] ?? null,\n detected,\n files\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageManager } from '../types.js';\n\nconst lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'bun.lockb', manager: 'bun' },\n { file: 'bun.lock', manager: 'bun' },\n { file: 'package-lock.json', manager: 'npm' }\n];\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectPackageManager(root: string): Promise<PackageManager | null> {\n for (const lockFile of lockFiles) {\n if (await exists(path.join(root, lockFile.file))) {\n return lockFile.manager;\n }\n }\n\n return null;\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function readPackageJson(root: string): Promise<PackageJsonInfo | null> {\n const packageJsonPath = path.join(root, 'package.json');\n\n try {\n const [realRoot, realPackageJsonPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(packageJsonPath)\n ]);\n if (!isWithinRoot(realRoot, realPackageJsonPath)) {\n return null;\n }\n\n const content = await fs.readFile(realPackageJsonPath, 'utf8');\n const data = JSON.parse(content) as PackageJsonInfo['data'];\n return { path: realPackageJsonPath, data };\n } catch {\n return null;\n }\n}\n","import net from 'node:net';\nimport type { FrameworkInfo, PortProbe } from '../types.js';\n\nexport const DEFAULT_PORTS = [3000, 5173];\nexport const MAX_PORT_PROBES = 64;\nexport const PORT_PROBE_CONCURRENCY = 16;\n\nfunction uniquePorts(ports: number[]): number[] {\n return Array.from(\n new Set(ports.filter((port) => Number.isInteger(port) && port > 0 && port < 65536))\n );\n}\n\nexport function inferPortsFromScripts(scripts: Record<string, string>): number[] {\n const ports: number[] = [];\n\n for (const command of Object.values(scripts)) {\n const patterns = [\n /(?:--port|-p)\\s+(\\d{2,5})/g,\n /\\bPORT=(\\d{2,5})\\b/g,\n /localhost:(\\d{2,5})/g,\n /127\\.0\\.0\\.1:(\\d{2,5})/g\n ];\n\n for (const pattern of patterns) {\n for (const match of command.matchAll(pattern)) {\n ports.push(Number(match[1]));\n }\n }\n }\n\n return uniquePorts(ports);\n}\n\nexport function defaultPortsForFramework(framework: FrameworkInfo | null): number[] {\n if (framework === null) {\n return [];\n }\n\n const ports: number[] = [];\n if (framework.detected.includes('Next.js') || framework.detected.includes('Express')) {\n ports.push(3000);\n }\n\n if (framework.detected.includes('Vite')) {\n ports.push(5173);\n }\n\n if (framework.detected.includes('Prisma')) {\n ports.push(5555);\n }\n\n return uniquePorts(ports);\n}\n\nexport async function probePort(port: number): Promise<PortProbe> {\n return await new Promise((resolve) => {\n const server = net.createServer();\n\n server.once('error', () => {\n resolve({ port, inUse: true });\n });\n\n server.once('listening', () => {\n server.close(() => {\n resolve({ port, inUse: false });\n });\n });\n\n server.listen(port, '127.0.0.1');\n });\n}\n\nexport async function detectPorts(ports: number[]): Promise<PortProbe[] | null> {\n const normalized = uniquePorts(ports).slice(0, MAX_PORT_PROBES);\n if (normalized.length === 0) {\n return null;\n }\n\n const results: PortProbe[] = [];\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < normalized.length) {\n const port = normalized[nextIndex];\n nextIndex += 1;\n results.push(await probePort(port));\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(PORT_PROBE_CONCURRENCY, normalized.length) }, () => worker())\n );\n\n return results.sort(\n (left, right) => normalized.indexOf(left.port) - normalized.indexOf(right.port)\n );\n}\n","/**\n * Identify which local process is listening on a busy port, so the dashboard\n * can say \"in use by node.exe (PID 1234)\" instead of just \"in use\".\n *\n * Windows uses `netstat -ano` plus `tasklist` for the process name; other\n * platforms use `lsof`. Lookups are best-effort: any failure, timeout, or\n * unparseable output simply yields no owner (scanner rule: never throw).\n */\n\nimport spawn from 'cross-spawn';\nimport type { PortOwner } from '../types.js';\n\nconst LOOKUP_TIMEOUT_MS = 3000;\n\n/** Run a command and capture stdout, resolving null on any failure. */\nfunction captureCommand(command: string, args: string[]): Promise<string | null> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (value: string | null): void => {\n if (!settled) {\n settled = true;\n resolve(value);\n }\n };\n\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'ignore'],\n windowsHide: true\n });\n const chunks: Buffer[] = [];\n const timer = setTimeout(() => {\n child.kill();\n finish(null);\n }, LOOKUP_TIMEOUT_MS);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n child.on('error', () => {\n clearTimeout(timer);\n finish(null);\n });\n child.on('close', (code) => {\n clearTimeout(timer);\n finish(code === 0 ? Buffer.concat(chunks).toString('utf8') : null);\n });\n });\n}\n\n/**\n * Parse `netstat -ano -p tcp` output into a port → PID map for listening\n * sockets. Exported for tests.\n */\nexport function parseNetstatListeners(output: string): Map<number, number> {\n const owners = new Map<number, number>();\n for (const line of output.split(/\\r?\\n/)) {\n const columns = line.trim().split(/\\s+/);\n // TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 1234\n if (columns.length < 5 || columns[0].toUpperCase() !== 'TCP') {\n continue;\n }\n if (columns[3].toUpperCase() !== 'LISTENING') {\n continue;\n }\n const portMatch = /[.:](\\d+)$/.exec(columns[1]);\n const pid = Number(columns[4]);\n if (portMatch === null || !Number.isInteger(pid) || pid <= 0) {\n continue;\n }\n const port = Number(portMatch[1]);\n if (!owners.has(port)) {\n owners.set(port, pid);\n }\n }\n return owners;\n}\n\n/** Parse `tasklist /FO CSV /NH` output into a process name. Exported for tests. */\nexport function parseTasklistName(output: string): string | null {\n const line = output.split(/\\r?\\n/).find((candidate) => candidate.trim().startsWith('\"'));\n if (line === undefined) {\n return null;\n }\n const match = /^\"([^\"]+)\"/.exec(line.trim());\n return match === null ? null : match[1];\n}\n\n/**\n * Parse `lsof -nP -iTCP:<port> -sTCP:LISTEN -FpcL` field output into an owner.\n * Exported for tests.\n */\nexport function parseLsofOwner(output: string): PortOwner | null {\n let pid: number | null = null;\n let name: string | null = null;\n for (const line of output.split(/\\r?\\n/)) {\n if (line.startsWith('p') && pid === null) {\n const value = Number(line.slice(1));\n if (Number.isInteger(value) && value > 0) {\n pid = value;\n }\n } else if (line.startsWith('c') && name === null) {\n name = line.slice(1) || null;\n }\n if (pid !== null && name !== null) {\n break;\n }\n }\n return pid === null ? null : { pid, name };\n}\n\nasync function findOwnersWindows(ports: number[]): Promise<Map<number, PortOwner>> {\n const owners = new Map<number, PortOwner>();\n const netstat = await captureCommand('netstat', ['-ano', '-p', 'tcp']);\n if (netstat === null) {\n return owners;\n }\n const listeners = parseNetstatListeners(netstat);\n\n const nameCache = new Map<number, string | null>();\n for (const port of ports) {\n const pid = listeners.get(port);\n if (pid === undefined) {\n continue;\n }\n if (!nameCache.has(pid)) {\n const tasklist = await captureCommand('tasklist', [\n '/FI',\n `PID eq ${pid}`,\n '/FO',\n 'CSV',\n '/NH'\n ]);\n nameCache.set(pid, tasklist === null ? null : parseTasklistName(tasklist));\n }\n owners.set(port, { pid, name: nameCache.get(pid) ?? null });\n }\n return owners;\n}\n\nasync function findOwnersUnix(ports: number[]): Promise<Map<number, PortOwner>> {\n const owners = new Map<number, PortOwner>();\n for (const port of ports) {\n const output = await captureCommand('lsof', ['-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-FpcL']);\n if (output === null) {\n continue;\n }\n const owner = parseLsofOwner(output);\n if (owner !== null) {\n owners.set(port, owner);\n }\n }\n return owners;\n}\n\n/**\n * Best-effort lookup of the processes listening on the given ports. Returns a\n * possibly-empty map; never throws.\n */\nexport async function findPortOwners(ports: number[]): Promise<Map<number, PortOwner>> {\n const unique = Array.from(new Set(ports)).slice(0, 16);\n if (unique.length === 0) {\n return new Map();\n }\n try {\n return process.platform === 'win32'\n ? await findOwnersWindows(unique)\n : await findOwnersUnix(unique);\n } catch {\n return new Map();\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FrameworkInfo, PackageJsonInfo, PresetInfo, ProjectLanguageInfo } from '../types.js';\n\ntype PresetDraft = Omit<PresetInfo, 'commands' | 'groups' | 'ports'> & {\n commands?: Record<string, string>;\n groups?: Record<string, string[]>;\n ports?: number[];\n};\n\nfunction dependencyNames(packageJson: PackageJsonInfo | null): Set<string> {\n const data = packageJson?.data;\n return new Set(\n Object.keys({\n ...data?.dependencies,\n ...data?.devDependencies,\n ...data?.optionalDependencies,\n ...data?.peerDependencies\n })\n );\n}\n\nfunction hasAnyDependency(dependencies: Set<string>, names: string[]): boolean {\n return names.some((name) => dependencies.has(name));\n}\n\nasync function readIfPresent(root: string, candidate: string): Promise<string | null> {\n const filePath = path.join(root, candidate);\n try {\n const [realRoot, realPath] = await Promise.all([fs.realpath(root), fs.realpath(filePath)]);\n const relative = path.relative(realRoot, realPath);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n return null;\n }\n return await fs.readFile(realPath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction completePreset(draft: PresetDraft): PresetInfo {\n return {\n name: draft.name,\n label: draft.label,\n commands: draft.commands ?? {},\n groups: draft.groups ?? {},\n ports: draft.ports ?? []\n };\n}\n\nfunction nodePresets(\n framework: FrameworkInfo | null,\n packageJson: PackageJsonInfo | null\n): PresetInfo[] {\n const detected = new Set(framework?.detected ?? []);\n const dependencies = dependencyNames(packageJson);\n const presets: PresetDraft[] = [];\n\n if (detected.has('Next.js')) {\n presets.push({\n name: 'next',\n label: 'Next.js',\n commands: {\n 'next:dev': 'next dev',\n 'next:build': 'next build',\n 'next:start': 'next start'\n },\n groups: {\n 'Next.js': ['next:dev', 'next:build', 'next:start']\n },\n ports: [3000]\n });\n }\n\n if (detected.has('Vite')) {\n presets.push({\n name: 'vite',\n label: 'Vite',\n commands: {\n 'vite:dev': 'vite --host 127.0.0.1',\n 'vite:build': 'vite build',\n 'vite:preview': 'vite preview --host 127.0.0.1'\n },\n groups: {\n Vite: ['vite:dev', 'vite:build', 'vite:preview']\n },\n ports: [5173, 4173]\n });\n }\n\n if (detected.has('NestJS')) {\n presets.push({\n name: 'nestjs',\n label: 'NestJS',\n commands: {\n 'nest:start': 'nest start --watch',\n 'nest:build': 'nest build'\n },\n groups: {\n NestJS: ['nest:start', 'nest:build']\n },\n ports: [3000]\n });\n }\n\n if (detected.has('Remix')) {\n presets.push({\n name: 'remix',\n label: 'Remix',\n commands: {\n 'remix:dev': 'remix vite:dev',\n 'remix:build': 'remix vite:build'\n },\n groups: {\n Remix: ['remix:dev', 'remix:build']\n },\n ports: [5173]\n });\n }\n\n if (detected.has('Express') || detected.has('Fastify')) {\n presets.push({\n name: detected.has('Fastify') ? 'fastify' : 'express',\n label: detected.has('Fastify') ? 'Fastify' : 'Express',\n ports: [3000]\n });\n }\n\n if (detected.has('Prisma') || hasAnyDependency(dependencies, ['prisma', '@prisma/client'])) {\n presets.push({\n name: 'prisma',\n label: 'Prisma',\n commands: {\n 'prisma:migrate': 'prisma migrate dev',\n 'prisma:studio': 'prisma studio'\n },\n groups: {\n Database: ['prisma:migrate', 'prisma:studio']\n },\n ports: [5555]\n });\n }\n\n return presets.map(completePreset);\n}\n\nasync function pythonPresets(root: string, language: ProjectLanguageInfo): Promise<PresetInfo[]> {\n if (!language.detected.includes('python')) {\n return [];\n }\n\n const [requirements, pyproject, pipfile] = await Promise.all([\n readIfPresent(root, 'requirements.txt'),\n readIfPresent(root, 'pyproject.toml'),\n readIfPresent(root, 'Pipfile')\n ]);\n const manifest = [requirements, pyproject, pipfile].filter(Boolean).join('\\n').toLowerCase();\n const commands: Record<string, string> = {};\n const groups: Record<string, string[]> = {};\n const ports: number[] = [];\n\n if (requirements !== null) {\n commands['python:install'] = 'python -m pip install -r requirements.txt';\n groups.Setup = ['python:install'];\n }\n\n if (manifest.includes('uvicorn') || manifest.includes('fastapi')) {\n commands['python:dev'] = 'uvicorn main:app --reload --host 127.0.0.1';\n groups.Python = [...(groups.Python ?? []), 'python:dev'];\n ports.push(8000);\n }\n\n if (manifest.includes('flask')) {\n commands['flask:dev'] = 'flask --app app run --host 127.0.0.1';\n groups.Python = [...(groups.Python ?? []), 'flask:dev'];\n ports.push(5000);\n }\n\n if (manifest.includes('django') || (await readIfPresent(root, 'manage.py')) !== null) {\n commands['django:dev'] = 'python manage.py runserver 127.0.0.1:8000';\n commands['django:migrate'] = 'python manage.py migrate';\n groups.Python = [...(groups.Python ?? []), 'django:dev', 'django:migrate'];\n ports.push(8000);\n }\n\n return [\n completePreset({\n name: 'python',\n label: 'Python',\n commands,\n groups,\n ports\n })\n ];\n}\n\nfunction goPresets(language: ProjectLanguageInfo): PresetInfo[] {\n if (!language.detected.includes('go')) {\n return [];\n }\n\n return [\n completePreset({\n name: 'go',\n label: 'Go',\n commands: {\n 'go:run': 'go run .',\n 'go:build': 'go build ./...',\n 'go:test': 'go test ./...'\n },\n groups: {\n Go: ['go:run', 'go:build', 'go:test']\n }\n })\n ];\n}\n\nasync function javaPresets(language: ProjectLanguageInfo): Promise<PresetInfo[]> {\n if (!language.detected.includes('java')) {\n return [];\n }\n\n const hasMaven = language.files.some((file) => path.basename(file) === 'pom.xml');\n const hasGradle = language.files.some((file) => path.basename(file).startsWith('build.gradle'));\n const commands: Record<string, string> = {};\n const groups: Record<string, string[]> = {};\n\n if (hasMaven) {\n commands['maven:test'] = 'mvn test';\n commands['maven:package'] = 'mvn package';\n groups.Maven = ['maven:test', 'maven:package'];\n }\n\n if (hasGradle) {\n commands['gradle:test'] = 'gradle test';\n commands['gradle:build'] = 'gradle build';\n groups.Gradle = ['gradle:test', 'gradle:build'];\n }\n\n return [completePreset({ name: 'java', label: 'Java', commands, groups })];\n}\n\nexport async function detectPresets(options: {\n root: string;\n packageJson: PackageJsonInfo | null;\n framework: FrameworkInfo | null;\n language: ProjectLanguageInfo;\n}): Promise<PresetInfo[]> {\n return [\n ...nodePresets(options.framework, options.packageJson),\n ...(await pythonPresets(options.root, options.language)),\n ...goPresets(options.language),\n ...(await javaPresets(options.language))\n ].filter(\n (preset) =>\n Object.keys(preset.commands).length > 0 ||\n Object.keys(preset.groups).length > 0 ||\n preset.ports.length > 0\n );\n}\n\nexport function mergePresetCommands(presets: PresetInfo[]): Record<string, string> {\n return Object.assign({}, ...presets.map((preset) => preset.commands));\n}\n\nexport function mergePresetGroups(presets: PresetInfo[]): Record<string, string[]> {\n const groups: Record<string, string[]> = {};\n for (const preset of presets) {\n for (const [group, commands] of Object.entries(preset.groups)) {\n groups[group] = [...(groups[group] ?? []), ...commands];\n }\n }\n return groups;\n}\n","import type { PackageJsonInfo } from '../types.js';\n\nexport function extractScripts(packageJson: PackageJsonInfo | null): Record<string, string> | null {\n if (\n !packageJson?.data.scripts ||\n typeof packageJson.data.scripts !== 'object' ||\n Array.isArray(packageJson.data.scripts)\n ) {\n return null;\n }\n\n return Object.fromEntries(\n Object.entries(packageJson.data.scripts).filter((entry): entry is [string, string] => {\n const [, command] = entry;\n return typeof command === 'string';\n })\n );\n}\n","const ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n\nconst OSC_SEQUENCE = new RegExp(`${ESC}\\\\][\\\\s\\\\S]*?(?:${BEL}|${ESC}\\\\\\\\)`, 'g');\nconst CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\nconst ESCAPE_SEQUENCE = new RegExp(`${ESC}[@-Z\\\\\\\\-_]`, 'g');\n\nfunction stripControlCharacters(value: string): string {\n let result = '';\n for (const character of value) {\n const code = character.charCodeAt(0);\n if ((code > 31 && code < 127) || code > 159) {\n result += character;\n }\n }\n return result;\n}\n\nexport function safeDisplayText(value: unknown): string {\n return stripControlCharacters(\n String(value).replace(OSC_SEQUENCE, '').replace(CSI_SEQUENCE, '').replace(ESCAPE_SEQUENCE, '')\n );\n}\n\nexport function safeDisplayList(values: string[]): string {\n return values.length > 0 ? values.map((value) => safeDisplayText(value)).join(', ') : 'none';\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { CONFIG_FILE_NAME, defaultConfig } from '../../core/config/defaults.js';\n\nexport async function initCommand(cwd = process.cwd()): Promise<void> {\n const configPath = path.join(cwd, CONFIG_FILE_NAME);\n\n try {\n await fs.access(configPath);\n console.log(pc.yellow(`${CONFIG_FILE_NAME} already exists.`));\n return;\n } catch {\n await fs.writeFile(configPath, `${JSON.stringify(defaultConfig, null, 2)}\\n`, 'utf8');\n console.log(pc.green(`Created ${CONFIG_FILE_NAME}.`));\n }\n}\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { buildOnboardingPlan } from '../../core/onboarding/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport type { OnboardingStep } from '../../core/types.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction statusGlyph(status: OnboardingStep['status']): string {\n if (status === 'done') {\n return pc.green('[x]');\n }\n\n if (status === 'todo') {\n return pc.yellow('[ ]');\n }\n\n return pc.cyan('[~]');\n}\n\nexport async function onboardCommand(cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n const warnings = await runDoctor(cwd, scan);\n const plan = buildOnboardingPlan(scan, warnings);\n\n console.log(pc.bold(`Onboarding ${safeTerminalText(scan.projectName)}`));\n console.log(`${plan.readiness}% ready — ${safeTerminalText(plan.summary)}`);\n console.log('');\n\n if (plan.steps.length === 0) {\n console.log(pc.green('No onboarding steps detected.'));\n return;\n }\n\n for (const step of plan.steps) {\n console.log(`${statusGlyph(step.status)} ${pc.bold(safeTerminalText(step.title))}`);\n console.log(` ${safeTerminalText(step.description)}`);\n if (step.action && step.status !== 'done') {\n console.log(pc.dim(` → ${safeTerminalText(step.action.label)}`));\n }\n }\n}\n","import { isSafeHttpUrl } from '../security/url.js';\nimport type {\n DoctorWarning,\n OnboardingAction,\n OnboardingPlan,\n OnboardingStep,\n ScanResult,\n SetupGuideStep\n} from '../types.js';\n\nfunction hasWarning(warnings: DoctorWarning[], id: string): boolean {\n return warnings.some((warning) => warning.id === id);\n}\n\n/**\n * Pick the command that starts the project's dev server, preferring a real\n * package script, then a configured/preset command named \"dev\".\n */\nfunction pickStartAction(scan: ScanResult): OnboardingAction | null {\n if (scan.scripts.dev !== undefined) {\n return { kind: 'run-script', label: 'Start dev server', target: 'dev' };\n }\n if (scan.scripts.start !== undefined) {\n return { kind: 'run-script', label: 'Start app', target: 'start' };\n }\n\n const configuredCommands = {\n ...scan.presetCommands,\n ...scan.config?.config.commands\n };\n for (const name of ['dev', 'start', 'serve']) {\n if (configuredCommands[name] !== undefined) {\n return { kind: 'run-command', label: `Run ${name}`, target: name };\n }\n }\n\n return null;\n}\n\nfunction dockerStep(scan: ScanResult): OnboardingStep | null {\n const docker = scan.docker;\n if (docker === null) {\n return null;\n }\n\n const runningServices = docker.services.filter((service) => service.status === 'running');\n const allRunning =\n docker.services.length > 0 && runningServices.length === docker.services.length;\n\n if (docker.daemonStatus !== 'running') {\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description:\n docker.message ?? 'A Docker Compose file was found, but the Docker engine is not running.',\n status: 'manual',\n blocking: false,\n action: { kind: 'docker', label: 'Open Services' }\n };\n }\n\n if (docker.services.length === 0 || allRunning) {\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description:\n docker.services.length === 0\n ? 'Docker is running. No Compose services need to be started.'\n : 'All Docker Compose services are running.',\n status: 'done',\n blocking: false\n };\n }\n\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description: `${runningServices.length}/${docker.services.length} Compose services running. Start the rest in Services.`,\n status: 'todo',\n blocking: false,\n action: { kind: 'docker', label: 'Open Services' }\n };\n}\n\n/**\n * Build an ordered onboarding checklist from a scan result and its doctor\n * warnings. Each step is either already satisfied (`done`), resolvable with a\n * one-click action (`todo`), or needs the contributor to act outside DevSurface\n * (`manual`). Readiness reflects only the blocking steps so a project can reach\n * 100% once it is genuinely runnable.\n */\nexport function buildOnboardingPlan(scan: ScanResult, warnings: DoctorWarning[]): OnboardingPlan {\n const steps: OnboardingStep[] = [];\n const isNodeProject = scan.language.detected.includes('node');\n\n // 1. Install dependencies (Node projects only).\n if (isNodeProject && scan.packageJson !== null) {\n const needsInstall = hasWarning(warnings, 'missing-node-modules');\n steps.push({\n id: 'install-dependencies',\n title: 'Install dependencies',\n description: needsInstall\n ? 'node_modules is missing. Install dependencies before running scripts.'\n : 'Dependencies are installed.',\n status: needsInstall ? 'todo' : 'done',\n blocking: true,\n action: needsInstall ? { kind: 'install', label: 'Install' } : undefined\n });\n }\n\n // 2. Create the local .env file from the example.\n if (scan.env?.hasExample) {\n const missingLocal = !scan.env.hasLocal;\n steps.push({\n id: 'create-env',\n title: 'Create .env file',\n description: missingLocal\n ? '.env.example exists but the local .env file is missing.'\n : '.env is present.',\n status: missingLocal ? 'todo' : 'done',\n blocking: true,\n action: missingLocal ? { kind: 'env-copy', label: 'Copy .env' } : undefined\n });\n\n // 3. Fill required env values (only meaningful once .env exists).\n if (scan.env.hasLocal) {\n const unset = [...new Set([...scan.env.missingKeys, ...scan.env.emptyKeys])];\n steps.push({\n id: 'fill-env',\n title: 'Fill in environment values',\n description:\n unset.length > 0\n ? `Set values for: ${unset.join(', ')}. Values are intentionally hidden.`\n : 'All environment keys from the example are present.',\n status: unset.length > 0 ? 'manual' : 'done',\n blocking: true\n });\n }\n }\n\n // 4. Docker services.\n const docker = dockerStep(scan);\n if (docker !== null) {\n steps.push(docker);\n }\n\n // 5. Free conflicting ports (informational guidance).\n const portsInUse = scan.ports.filter((probe) => probe.inUse);\n if (portsInUse.length > 0) {\n steps.push({\n id: 'free-ports',\n title: 'Resolve port conflicts',\n description: `Already in use: ${portsInUse.map((probe) => probe.port).join(', ')}. Stop the conflicting process or change the port.`,\n status: 'manual',\n blocking: false\n });\n }\n\n // 6. Maintainer-authored setup guide steps (non-blocking guidance).\n const allCommands = { ...scan.presetCommands, ...(scan.config?.config.commands ?? {}) };\n for (const [index, entry] of (scan.config?.config.setupGuide ?? []).entries()) {\n if (typeof entry === 'string') {\n steps.push({\n id: `guide-${index}`,\n title: entry,\n description: 'From the project setup guide.',\n status: 'manual',\n blocking: false\n });\n } else {\n const step = entry as SetupGuideStep;\n let action: OnboardingAction | undefined;\n if (step.command !== undefined && step.command in allCommands) {\n action = { kind: 'run-command', label: 'Run', target: step.command };\n } else if (step.script !== undefined) {\n action = { kind: 'run-script', label: 'Run', target: step.script };\n }\n steps.push({\n id: `guide-${index}`,\n title: step.title,\n description: step.description ?? 'From the project setup guide.',\n status: action !== undefined ? 'todo' : 'manual',\n blocking: false,\n action\n });\n }\n }\n\n // 7. Project docs link.\n const docs = scan.config?.config.docs;\n if (typeof docs === 'string' && docs.length > 0 && isSafeHttpUrl(docs)) {\n steps.push({\n id: 'read-docs',\n title: 'Read the project docs',\n description: docs,\n status: 'manual',\n blocking: false,\n action: { kind: 'open-docs', label: 'Open docs', target: docs }\n });\n }\n\n // 8. Start the app (the goal — never blocking).\n const startAction = pickStartAction(scan);\n if (startAction !== null) {\n steps.push({\n id: 'start-app',\n title: 'Start the app',\n description: 'Run the development server once setup is complete.',\n status: 'todo',\n blocking: false,\n action: startAction\n });\n }\n\n const blocking = steps.filter((step) => step.blocking);\n const blockingDone = blocking.filter((step) => step.status === 'done');\n const readiness =\n blocking.length === 0 ? 100 : Math.round((blockingDone.length / blocking.length) * 100);\n const ready = readiness === 100;\n const remaining = blocking.length - blockingDone.length;\n const summary = ready\n ? 'Project is ready to run.'\n : `${remaining} setup step${remaining === 1 ? '' : 's'} remaining before the project is ready.`;\n\n return { steps, readiness, ready, summary };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { buildOnboardingPlan } from '../../core/onboarding/index.js';\nimport { renderPassportHtml } from '../../core/passport/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { safeTerminalText } from '../terminal.js';\n\nexport async function passportCommand(cwd = process.cwd(), outFile?: string): Promise<void> {\n const scan = await scanProject(cwd);\n const warnings = await runDoctor(cwd, scan);\n const plan = buildOnboardingPlan(scan, warnings);\n const html = renderPassportHtml({ scan, warnings, plan, version: DEV_SURFACE_VERSION });\n\n const target = path.resolve(cwd, outFile ?? 'devsurface-passport.html');\n await fs.writeFile(target, html, 'utf8');\n\n console.log(pc.bold(`Passport created for ${safeTerminalText(scan.projectName)}`));\n console.log(`Saved to ${safeTerminalText(target)}`);\n console.log(\n pc.dim('Open it in any browser or share it — it works offline and contains no secrets.')\n );\n}\n","/**\n * Plain-English explanations of common package scripts and configured commands.\n *\n * Aimed at non-technical users who open a project, see a command like `vite` or\n * `tsc --noEmit`, and have no idea what it does or whether it is safe to click.\n * These are pure, deterministic heuristics — no network calls, no AI, no\n * telemetry. The goal is a single friendly sentence per command.\n */\n\ninterface NameIntent {\n /** Base script names (the part before any `:` or `/` namespacing). */\n keys: string[];\n explanation: string;\n}\n\ninterface ToolIntent {\n test: RegExp;\n explanation: string;\n}\n\n/**\n * Conventional script-name intents, checked first because the name expresses\n * what the maintainer *meant* (clearer to a newcomer than the raw tool).\n */\nconst NAME_INTENTS: NameIntent[] = [\n {\n keys: ['dev', 'develop', 'serve', 'watch', 'start:dev'],\n explanation:\n 'Starts the development server so you can preview the app in your browser while you work.'\n },\n { keys: ['start'], explanation: 'Starts the application.' },\n {\n keys: ['build', 'compile', 'bundle', 'dist'],\n explanation: 'Builds the app into optimized files ready for production.'\n },\n {\n keys: ['preview'],\n explanation: 'Runs the finished production build locally so you can preview it.'\n },\n {\n keys: ['test', 'tests', 'spec', 'unit'],\n explanation: 'Runs the automated tests to check the code still works.'\n },\n {\n keys: ['e2e', 'integration'],\n explanation: 'Runs end-to-end tests that drive the app like a real user.'\n },\n {\n keys: ['lint'],\n explanation: 'Checks the code for style problems and common mistakes.'\n },\n {\n keys: ['format', 'fmt', 'prettier'],\n explanation: 'Automatically reformats the code to a consistent style.'\n },\n {\n keys: ['typecheck', 'tsc', 'types'],\n explanation: 'Checks the code for type errors.'\n },\n {\n keys: ['migrate', 'migration', 'migrations'],\n explanation: 'Applies pending database changes (migrations).'\n },\n { keys: ['seed'], explanation: 'Fills the database with starter sample data.' },\n {\n keys: ['clean'],\n explanation: 'Deletes generated files and leftover build output.'\n },\n {\n keys: ['deploy', 'release', 'publish'],\n explanation: 'Publishes or deploys the project — double-check before running this one.'\n },\n {\n keys: ['install', 'setup', 'bootstrap'],\n explanation: 'Installs the tools and packages the project needs.'\n },\n {\n keys: ['storybook'],\n explanation: 'Starts Storybook to preview UI components on their own.'\n },\n { keys: ['docs'], explanation: 'Builds or serves the project documentation.' }\n];\n\n/**\n * Tool-based fallback, checked against the raw command when the script name is\n * not a known convention. More specific patterns come first.\n */\nconst TOOL_INTENTS: ToolIntent[] = [\n {\n test: /nodemon|ts-node-dev/,\n explanation: 'Runs the app and restarts it automatically whenever you change a file.'\n },\n {\n test: /vite\\s+build|webpack|rollup|esbuild|\\btsup\\b|\\bparcel\\b/,\n explanation: 'Builds the app into optimized files ready for production.'\n },\n {\n test: /next\\s+dev|vite|remix\\s+dev|astro\\s+dev/,\n explanation: 'Starts the development server so you can preview the app in your browser.'\n },\n {\n test: /playwright|cypress/,\n explanation: 'Runs end-to-end tests that drive the app like a real user.'\n },\n {\n test: /vitest|\\bjest\\b|mocha|\\bava\\b|pytest|\\bgo\\s+test\\b/,\n explanation: 'Runs the automated tests to check the code works.'\n },\n {\n test: /eslint|biome\\s+lint|ruff|flake8/,\n explanation: 'Checks the code for style problems and common mistakes.'\n },\n {\n test: /prettier|biome\\s+format|black\\b/,\n explanation: 'Reformats the code to a consistent style.'\n },\n { test: /tsc\\b/, explanation: 'Compiles and type-checks the TypeScript code.' },\n { test: /prisma/, explanation: 'Manages the database schema and data with Prisma.' },\n {\n test: /docker[-\\s]compose|\\bdocker\\b/,\n explanation: 'Starts or manages the project’s Docker containers.'\n },\n { test: /\\bgo\\s+run\\b/, explanation: 'Runs the Go program.' },\n { test: /\\bgo\\s+build\\b/, explanation: 'Builds the Go program into an executable.' },\n {\n test: /uvicorn|flask\\s+run|manage\\.py\\s+runserver/,\n explanation: 'Starts the development server so you can preview the app in your browser.'\n }\n];\n\n/**\n * Return a one-sentence, plain-English description of what running `name`\n * (whose underlying command is `command`) will do. Always returns a string.\n */\nexport function explainScript(name: string, command = ''): string {\n const baseName = name.toLowerCase().split(/[:/]/)[0];\n const intent = NAME_INTENTS.find((entry) => entry.keys.includes(baseName));\n if (intent !== undefined) {\n return intent.explanation;\n }\n\n const lowerCommand = command.toLowerCase();\n const tool = TOOL_INTENTS.find((entry) => entry.test.test(lowerCommand));\n if (tool !== undefined) {\n return tool.explanation;\n }\n\n return `Runs the project’s “${name}” command.`;\n}\n","import spawn from 'cross-spawn';\nimport type { PackageManager } from '../types.js';\nimport { isDangerousCommand } from '../security/dangerousCommand.js';\nimport { resolveExecutableOutsideRoot } from './executable.js';\n\nexport { isDangerousCommand };\n\nexport interface PackageRunCommand {\n command: string;\n args: string[];\n displayCommand: string;\n}\n\nexport function getPackageRunCommand(\n packageManager: PackageManager | null,\n script: string\n): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n const args = ['run', script];\n return {\n command: manager,\n args,\n displayCommand: `${manager} ${args.join(' ')}`\n };\n}\n\nexport async function resolvePackageRunCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<PackageRunCommand | null> {\n const runCommand = getPackageRunCommand(options.packageManager, options.script);\n const executable = await resolveExecutableOutsideRoot(options.cwd, runCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...runCommand,\n command: executable\n };\n}\n\nexport function getPackageInstallCommand(packageManager: PackageManager | null): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n if (manager === 'npm') {\n return {\n command: manager,\n args: ['ci'],\n displayCommand: 'npm ci'\n };\n }\n\n if (manager === 'pnpm') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'pnpm install --frozen-lockfile'\n };\n }\n\n if (manager === 'yarn') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'yarn install --frozen-lockfile'\n };\n }\n\n return {\n command: manager,\n args: ['install'],\n displayCommand: 'bun install'\n };\n}\n\nexport async function resolvePackageInstallCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n}): Promise<PackageRunCommand | null> {\n const installCommand = getPackageInstallCommand(options.packageManager);\n const executable = await resolveExecutableOutsideRoot(options.cwd, installCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...installCommand,\n command: executable\n };\n}\n\nexport function splitCommandLine(command: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n } else if (character === '\\\\' && quote === '\"') {\n const next = command[index + 1];\n if (next === '\"' || next === '\\\\') {\n index += 1;\n current += next ?? '';\n } else {\n current += character;\n }\n } else {\n current += character;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (/\\s/.test(character)) {\n if (current.length > 0) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += character;\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function containsShellMetacharacters(command: string): boolean {\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '\\n' || character === '\\r') {\n return true;\n }\n\n if (';|&<>'.includes(character)) {\n return true;\n }\n\n if (character === '`') {\n return true;\n }\n\n if (character === '$' && (command[index + 1] === '(' || command[index + 1] === '{')) {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function resolveConfiguredCommand(\n cwd: string,\n command: string\n): Promise<PackageRunCommand | null> {\n const trimmed = command.trim();\n if (trimmed.length === 0 || containsShellMetacharacters(trimmed)) {\n return null;\n }\n\n const tokens = splitCommandLine(trimmed);\n if (tokens.length === 0) {\n return null;\n }\n\n const [executableName, ...args] = tokens;\n const executable = await resolveExecutableOutsideRoot(cwd, executableName);\n if (executable === null) {\n return null;\n }\n\n return {\n command: executable,\n args,\n displayCommand: trimmed\n };\n}\n\nexport async function runPackageScriptToTerminal(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<number> {\n const runCommand = await resolvePackageRunCommand(options);\n if (runCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(runCommand.command, runCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n\nexport async function runConfiguredCommandToTerminal(options: {\n cwd: string;\n command: string;\n}): Promise<number> {\n const resolvedCommand = await resolveConfiguredCommand(options.cwd, options.command);\n if (resolvedCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(resolvedCommand.command, resolvedCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n","const DANGEROUS_COMMAND =\n /\\b(rm\\s+-rf|docker\\s+volume\\s+rm|drop\\s+database|prisma\\s+migrate\\s+reset|git\\s+clean\\s+-fdx?)\\b/i;\n\nexport function isDangerousCommand(command: string): boolean {\n return DANGEROUS_COMMAND.test(command);\n}\n","/**\n * Project Passport: a single, self-contained HTML page that explains a\n * repository to anyone — what it is, what it needs, and exactly how to run it.\n *\n * The passport is meant to be shared: emailed to a new contributor, dropped in\n * a chat for a non-technical teammate, or committed as living onboarding docs.\n * It renders offline in any browser with no external assets and no DevSurface\n * installed. The only JavaScript inside is a few lines for copy buttons.\n *\n * Everything is generated from local scan data. Environment key NAMES may be\n * listed; environment VALUES are never read, stored, or rendered.\n */\n\nimport { explainScript } from '../explain/index.js';\nimport { getPackageInstallCommand, getPackageRunCommand } from '../process/runner.js';\nimport type { DoctorWarning, OnboardingPlan, OnboardingStep, ScanResult } from '../types.js';\n\nexport interface PassportOptions {\n scan: ScanResult;\n warnings: DoctorWarning[];\n plan: OnboardingPlan;\n version: string;\n /** Injectable for deterministic tests. Defaults to now. */\n generatedAt?: Date;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;');\n}\n\nconst LANGUAGE_LABELS: Record<string, string> = {\n node: 'JavaScript / TypeScript',\n python: 'Python',\n go: 'Go',\n java: 'Java'\n};\n\n/**\n * Friendly one-line roles for well-known packages, so the tech stack section\n * can say what each major dependency is *for* instead of just naming it.\n */\nconst STACK_ROLES: Array<{ names: string[]; role: string }> = [\n { names: ['next'], role: 'Web framework' },\n { names: ['react', 'react-dom'], role: 'User interface library' },\n { names: ['vue'], role: 'User interface library' },\n { names: ['svelte'], role: 'User interface library' },\n { names: ['express'], role: 'Web server framework' },\n { names: ['fastify'], role: 'Web server framework' },\n { names: ['hono'], role: 'Web server framework' },\n { names: ['@nestjs/core'], role: 'Web server framework' },\n { names: ['@remix-run/react'], role: 'Web framework' },\n { names: ['prisma', '@prisma/client'], role: 'Database toolkit' },\n { names: ['mongoose'], role: 'MongoDB database layer' },\n { names: ['pg'], role: 'PostgreSQL database driver' },\n { names: ['redis', 'ioredis'], role: 'Redis cache client' },\n { names: ['typescript'], role: 'Typed JavaScript' },\n { names: ['vite'], role: 'Build tool and dev server' },\n { names: ['webpack'], role: 'Build tool' },\n { names: ['tailwindcss'], role: 'CSS styling framework' },\n { names: ['vitest', 'jest', 'mocha'], role: 'Test runner' },\n { names: ['playwright', '@playwright/test', 'cypress'], role: 'Browser testing' },\n { names: ['eslint'], role: 'Code quality checks' },\n { names: ['prettier'], role: 'Code formatting' },\n { names: ['commander', 'yargs'], role: 'Command-line framework' },\n { names: ['ws', 'socket.io'], role: 'Real-time connections' },\n { names: ['zod'], role: 'Data validation' },\n { names: ['axios'], role: 'HTTP requests' },\n { names: ['dotenv'], role: 'Loads .env settings' }\n];\n\n/** One friendly sentence saying what kind of project this is. */\nfunction describeProject(scan: ScanResult): string {\n const configured = scan.config?.config.description;\n if (typeof configured === 'string' && configured.trim().length > 0) {\n return configured.trim();\n }\n const packageDescription = scan.packageJson?.data.description;\n if (typeof packageDescription === 'string' && packageDescription.trim().length > 0) {\n return packageDescription.trim();\n }\n\n const parts: string[] = [];\n if (scan.framework !== null) {\n parts.push(`built with ${scan.framework.type}`);\n }\n const languages = scan.language.detected\n .map((language) => LANGUAGE_LABELS[language] ?? language)\n .join(', ');\n if (languages.length > 0) {\n parts.push(`written in ${languages}`);\n }\n if (scan.docker !== null && scan.docker.composeFiles.length > 0) {\n parts.push('with Docker services');\n }\n if (parts.length === 0) {\n return 'A software project.';\n }\n return `A software project ${parts.join(', ')}.`;\n}\n\n/** Pick the command that starts the app, mirroring the onboarding heuristic. */\nfunction startCommand(scan: ScanResult): string | null {\n if (scan.scripts.dev !== undefined) {\n return getPackageRunCommand(scan.packageManager, 'dev').displayCommand;\n }\n if (scan.scripts.start !== undefined) {\n return getPackageRunCommand(scan.packageManager, 'start').displayCommand;\n }\n const configured = { ...scan.presetCommands, ...(scan.config?.config.commands ?? {}) };\n for (const name of ['dev', 'start', 'serve']) {\n if (configured[name] !== undefined) {\n return configured[name];\n }\n }\n return null;\n}\n\n/**\n * The exact copy-paste command for a step, when one can be derived. Non-techies\n * should never have to guess what to type.\n */\nfunction commandForStep(step: OnboardingStep, scan: ScanResult): string | null {\n const action = step.action;\n if (action === undefined) {\n return null;\n }\n if (action.kind === 'install') {\n return getPackageInstallCommand(scan.packageManager).displayCommand;\n }\n if (action.kind === 'env-copy') {\n return 'cp .env.example .env';\n }\n if (action.kind === 'run-script' && action.target !== undefined) {\n return getPackageRunCommand(scan.packageManager, action.target).displayCommand;\n }\n if (action.kind === 'run-command' && action.target !== undefined) {\n const configured = { ...scan.presetCommands, ...(scan.config?.config.commands ?? {}) };\n return configured[action.target] ?? null;\n }\n if (action.kind === 'docker') {\n return 'docker compose up -d';\n }\n return null;\n}\n\nfunction statusBadge(status: OnboardingStep['status']): string {\n if (status === 'done') {\n return '<span class=\"badge badge-done\">Done</span>';\n }\n if (status === 'todo') {\n return '<span class=\"badge badge-todo\">To do</span>';\n }\n return '<span class=\"badge badge-manual\">Needs you</span>';\n}\n\nfunction severityBadge(severity: DoctorWarning['severity']): string {\n if (severity === 'error') {\n return '<span class=\"badge badge-error\">Error</span>';\n }\n if (severity === 'warning') {\n return '<span class=\"badge badge-todo\">Warning</span>';\n }\n return '<span class=\"badge badge-manual\">Info</span>';\n}\n\nfunction heroBadges(scan: ScanResult): string {\n const badges: string[] = [];\n if (scan.framework !== null) {\n badges.push(scan.framework.type);\n }\n for (const language of scan.language.detected) {\n badges.push(LANGUAGE_LABELS[language] ?? language);\n }\n if (scan.packageManager !== null) {\n badges.push(scan.packageManager);\n }\n if (scan.git?.branch != null) {\n badges.push(`branch: ${scan.git.branch}`);\n }\n return badges\n .map((badge) => `<span class=\"badge badge-hero\">${escapeHtml(badge)}</span>`)\n .join('\\n ');\n}\n\n/** A command row with a copy button. */\nfunction commandRow(command: string, note: string): string {\n const escaped = escapeHtml(command);\n return ` <div class=\"recipe-row\">\n <div class=\"recipe-note\">${escapeHtml(note)}</div>\n <div class=\"recipe-command\">\n <code>${escaped}</code>\n <button type=\"button\" class=\"copy\" data-copy=\"${escaped}\">Copy</button>\n </div>\n </div>`;\n}\n\n/**\n * The complete fresh-machine recipe. The passport is usually generated on a\n * machine where setup is already done but read on one where nothing is — so\n * this always shows the full recipe, independent of current step status.\n */\nfunction quickStartSection(scan: ScanResult): string {\n const rows: string[] = [];\n if (scan.language.detected.includes('node') && scan.packageJson !== null) {\n rows.push(\n commandRow(\n getPackageInstallCommand(scan.packageManager).displayCommand,\n 'Install the packages the project needs'\n )\n );\n }\n if (scan.env?.hasExample) {\n rows.push(\n commandRow('cp .env.example .env', 'Create your local settings file (Windows: use copy)')\n );\n }\n if (scan.docker !== null && scan.docker.composeFiles.length > 0) {\n rows.push(commandRow('docker compose up -d', 'Start the background services'));\n }\n const start = startCommand(scan);\n if (start !== null) {\n rows.push(commandRow(start, 'Start the app'));\n }\n if (rows.length === 0) {\n return '';\n }\n return ` <section id=\"quick-start\">\n <h2>Quick start</h2>\n <p class=\"muted\">On a fresh machine, run these in a terminal from the project folder, top to bottom.</p>\n${rows.join('\\n')}\n </section>`;\n}\n\n/** What has to be installed on the machine before the quick start works. */\nfunction requirementsSection(scan: ScanResult): string {\n const requirements: Array<{ name: string; detail: string }> = [];\n if (scan.language.detected.includes('node')) {\n const nodeRange = scan.packageJson?.data.engines?.node;\n requirements.push({\n name: 'Node.js',\n detail:\n typeof nodeRange === 'string' && nodeRange.trim().length > 0\n ? `version ${nodeRange.trim()}`\n : 'any recent LTS version'\n });\n if (scan.packageManager !== null && scan.packageManager !== 'npm') {\n requirements.push({\n name: scan.packageManager,\n detail: 'the package manager this project uses'\n });\n }\n }\n if (scan.language.detected.includes('python')) {\n requirements.push({ name: 'Python', detail: 'a recent Python 3 version' });\n }\n if (scan.language.detected.includes('go')) {\n requirements.push({ name: 'Go', detail: 'a recent Go toolchain' });\n }\n if (scan.language.detected.includes('java')) {\n requirements.push({ name: 'Java', detail: 'a JDK matching the build files' });\n }\n if (scan.docker !== null && scan.docker.composeFiles.length > 0) {\n requirements.push({\n name: 'Docker Desktop',\n detail: 'runs the background services — start it before the quick start'\n });\n }\n if (requirements.length === 0) {\n return '';\n }\n const items = requirements\n .map(\n (requirement) =>\n ` <li><strong>${escapeHtml(requirement.name)}</strong> — ${escapeHtml(requirement.detail)}</li>`\n )\n .join('\\n');\n return ` <section id=\"requirements\">\n <h2>What you need installed</h2>\n <ul class=\"plain-list\">\n${items}\n </ul>\n </section>`;\n}\n\nfunction stepsSection(plan: OnboardingPlan, scan: ScanResult): string {\n if (plan.steps.length === 0) {\n return '<p class=\"muted\">Nothing special to set up. Open the project and start exploring.</p>';\n }\n const items = plan.steps\n .map((step) => {\n const command = commandForStep(step, scan);\n const commandHtml =\n command !== null && step.status !== 'done'\n ? `\\n <div class=\"recipe-command\"><code>${escapeHtml(command)}</code><button type=\"button\" class=\"copy\" data-copy=\"${escapeHtml(command)}\">Copy</button></div>`\n : '';\n return ` <li class=\"step step-${step.status}\">\n <div class=\"step-heading\">${statusBadge(step.status)}<strong>${escapeHtml(step.title)}</strong></div>\n <p>${escapeHtml(step.description)}</p>${commandHtml}\n </li>`;\n })\n .join('\\n');\n return `<ol class=\"steps\">\\n${items}\\n </ol>`;\n}\n\n/** Well-known dependencies with friendly roles, plus a total count. */\nfunction stackSection(scan: ScanResult): string {\n const data = scan.packageJson?.data;\n if (data === undefined || data === null) {\n return '';\n }\n const all = { ...data.dependencies, ...data.devDependencies };\n const names = Object.keys(all);\n if (names.length === 0) {\n return '';\n }\n const seenRoles = new Set<string>();\n const highlights: Array<{ name: string; role: string }> = [];\n for (const entry of STACK_ROLES) {\n const found = entry.names.find((name) => all[name] !== undefined);\n if (found !== undefined && !seenRoles.has(entry.role)) {\n seenRoles.add(entry.role);\n highlights.push({ name: found, role: entry.role });\n }\n if (highlights.length >= 8) {\n break;\n }\n }\n if (highlights.length === 0) {\n return '';\n }\n const remaining = names.length - highlights.length;\n const cells = highlights\n .map(\n (highlight) => ` <div class=\"stack-cell\">\n <code>${escapeHtml(highlight.name)}</code>\n <span>${escapeHtml(highlight.role)}</span>\n </div>`\n )\n .join('\\n');\n const more =\n remaining > 0\n ? `\\n <p class=\"muted\">…plus ${remaining} more package${remaining === 1 ? '' : 's'} doing supporting work.</p>`\n : '';\n return ` <section id=\"stack\">\n <h2>The tech stack, translated</h2>\n <div class=\"stack-grid\">\n${cells}\n </div>${more}\n </section>`;\n}\n\nfunction scriptsSection(scan: ScanResult): string {\n const entries = Object.entries(scan.scripts);\n if (entries.length === 0) {\n return '<p class=\"muted\">No package scripts detected.</p>';\n }\n const rows = entries\n .map(\n ([name, command]) => ` <tr>\n <td><code>${escapeHtml(name)}</code></td>\n <td>${escapeHtml(explainScript(name, command))}</td>\n <td class=\"raw\"><code>${escapeHtml(command)}</code></td>\n </tr>`\n )\n .join('\\n');\n return `<table>\n <thead><tr><th>Command</th><th>What it does</th><th>Exactly what runs</th></tr></thead>\n <tbody>\n${rows}\n </tbody>\n </table>`;\n}\n\nfunction envSection(scan: ScanResult): string {\n const env = scan.env;\n if (env === null || (!env.hasExample && !env.hasLocal)) {\n return '<p class=\"muted\">This project does not use a .env settings file.</p>';\n }\n if (env.keys.length === 0 && env.exampleKeys.length === 0) {\n return '<p class=\"muted\">Environment files exist but declare no keys.</p>';\n }\n const keys =\n env.keys.length > 0\n ? env.keys.map((key) => ({\n key: key.key,\n state: key.present ? (key.empty ? 'empty' : 'set') : 'missing'\n }))\n : env.exampleKeys.map((key) => ({ key, state: 'missing' as const }));\n const rows = keys\n .map((entry) => {\n const badge =\n entry.state === 'set'\n ? '<span class=\"badge badge-done\">Set</span>'\n : entry.state === 'empty'\n ? '<span class=\"badge badge-todo\">Empty</span>'\n : '<span class=\"badge badge-error\">Missing</span>';\n return ` <tr><td><code>${escapeHtml(entry.key)}</code></td><td>${badge}</td></tr>`;\n })\n .join('\\n');\n return `<p class=\"muted\">Only key names are shown. Values never leave your machine.</p>\n <table>\n <thead><tr><th>Setting</th><th>Status</th></tr></thead>\n <tbody>\n${rows}\n </tbody>\n </table>`;\n}\n\nfunction portsSection(scan: ScanResult): string {\n if (scan.ports.length === 0) {\n return '<p class=\"muted\">No specific network ports detected.</p>';\n }\n const items = scan.ports\n .map((probe) => {\n const badge = probe.inUse\n ? '<span class=\"badge badge-todo\">Busy right now</span>'\n : '<span class=\"badge badge-done\">Free</span>';\n return ` <li><code>${probe.port}</code> ${badge}</li>`;\n })\n .join('\\n');\n return `<p class=\"muted\">The app expects these ports. “Busy” means another program is using it.</p>\n <ul class=\"plain-list\">\\n${items}\\n </ul>`;\n}\n\nfunction dockerSection(scan: ScanResult): string {\n const docker = scan.docker;\n if (docker === null || docker.composeFiles.length === 0) {\n return '';\n }\n const services =\n docker.services.length > 0\n ? `<ul class=\"plain-list\">\\n${docker.services\n .map((service) => ` <li><code>${escapeHtml(service.name)}</code></li>`)\n .join('\\n')}\\n </ul>`\n : '<p class=\"muted\">Service list is available when Docker is running.</p>';\n return ` <section id=\"services\">\n <h2>Background services (Docker)</h2>\n <p class=\"muted\">This project uses Docker to run helper services (like databases) in the background.</p>\n ${services}\n </section>`;\n}\n\nfunction healthSection(warnings: DoctorWarning[]): string {\n if (warnings.length === 0) {\n return '<p class=\"muted\">No setup problems detected. Looking good.</p>';\n }\n const items = warnings\n .map(\n (warning) => ` <li>\n <div class=\"step-heading\">${severityBadge(warning.severity)}<strong>${escapeHtml(warning.title)}</strong></div>\n <p>${escapeHtml(warning.message)}</p>\n </li>`\n )\n .join('\\n');\n return `<ul class=\"steps\">\\n${items}\\n </ul>`;\n}\n\n/** Condition-aware \"when it breaks\" advice in plain language. */\nfunction troubleshootingSection(scan: ScanResult): string {\n const tips: Array<{ symptom: string; fix: string }> = [];\n if (scan.language.detected.includes('node')) {\n const manager = scan.packageManager ?? 'npm';\n tips.push({\n symptom: `“command not found” when running ${manager}`,\n fix:\n manager === 'npm'\n ? 'Node.js is not installed (or not on your PATH). Install the LTS version from the official Node.js site, then reopen your terminal.'\n : `Install Node.js first, then install ${manager} (it is a separate tool). Reopen your terminal afterwards.`\n });\n }\n if (scan.ports.length > 0) {\n tips.push({\n symptom: 'The app says a port is already in use (EADDRINUSE)',\n fix: 'Another program is using that port — often an old copy of this same app. Close other dev servers or restart your computer, then try again.'\n });\n }\n if (scan.env?.hasExample) {\n tips.push({\n symptom: 'The app starts, then crashes or complains about missing configuration',\n fix: 'Open the .env file and fill in any empty values. The “Settings this project needs” list above shows which keys must be set.'\n });\n }\n if (scan.docker !== null && scan.docker.composeFiles.length > 0) {\n tips.push({\n symptom: 'Docker commands fail or hang',\n fix: 'Docker Desktop is probably not running. Start it, wait for the whale icon to settle, then run the command again.'\n });\n }\n tips.push({\n symptom: 'Something else is wrong',\n fix: 'Run “npx devsurface” in the project folder — it opens a live dashboard that checks your setup and pinpoints what is missing.'\n });\n const items = tips\n .map(\n (tip) => ` <li>\n <strong>${escapeHtml(tip.symptom)}</strong>\n <p>${escapeHtml(tip.fix)}</p>\n </li>`\n )\n .join('\\n');\n return ` <section id=\"troubleshooting\">\n <h2>If something goes wrong</h2>\n <ul class=\"steps\">\n${items}\n </ul>\n </section>`;\n}\n\n/** A tiny glossary so newcomers are never lost in the words. */\nfunction glossarySection(scan: ScanResult): string {\n const terms: Array<[string, string]> = [\n [\n 'Terminal',\n 'The text window where you type commands. On Windows use PowerShell; on Mac use Terminal.'\n ],\n ['Command', 'A line of text you type into the terminal and run by pressing Enter.'],\n [\n 'Dependency',\n 'A ready-made package of code this project reuses instead of writing from scratch.'\n ],\n ['Port', 'A numbered door on your computer that a running app listens on, like 3000 or 8080.'],\n [\n 'localhost',\n 'Your own computer. http://localhost:3000 means “the app running on my machine, door 3000”.'\n ]\n ];\n if (scan.env !== null && (scan.env.hasExample || scan.env.hasLocal)) {\n terms.splice(3, 0, [\n '.env file',\n 'A private settings file with keys and secret values. It stays on your machine and is never shared.'\n ]);\n }\n const cells = terms\n .map(\n ([term, definition]) => ` <div class=\"stack-cell\">\n <strong>${escapeHtml(term)}</strong>\n <span>${escapeHtml(definition)}</span>\n </div>`\n )\n .join('\\n');\n return ` <section id=\"glossary\">\n <h2>Words you will meet</h2>\n <div class=\"stack-grid glossary-grid\">\n${cells}\n </div>\n </section>`;\n}\n\n/**\n * Anthropic-blog-inspired light theme: warm oat canvas, ivory cards, dark warm\n * ink, serif display headings, and a book-cloth coral accent.\n */\nconst PASSPORT_CSS = `\n :root {\n color-scheme: light;\n --bg: #F0EEE6; --card: #FAF9F5; --ink: #141413; --muted: #73706A;\n --line: #E3DFD3; --accent: #CC785C; --accent-deep: #B15D41;\n --done: #3D7A4E; --warn: #96690F; --bad: #B4392A;\n }\n * { box-sizing: border-box; }\n body {\n margin: 0; padding: 40px 18px 24px; background: var(--bg); color: var(--ink);\n font: 16px/1.62 \"Styrene A\", \"Segoe UI\", system-ui, -apple-system, sans-serif;\n }\n main { max-width: 880px; margin: 0 auto; }\n h1, h2 {\n font-family: \"Tiempos Headline\", Georgia, \"Times New Roman\", serif;\n font-weight: 500; letter-spacing: -0.01em;\n }\n h1 { margin: 6px 0 10px; font-size: 40px; line-height: 1.15; }\n h2 { margin: 0 0 14px; font-size: 24px; }\n p { margin: 6px 0; }\n .muted { color: var(--muted); }\n .kicker {\n margin: 0; color: var(--accent-deep); font-size: 13px; font-weight: 700;\n letter-spacing: 0.14em; text-transform: uppercase;\n }\n .lede { font-size: 18.5px; max-width: 60ch; }\n nav.toc { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 22px; }\n nav.toc a {\n color: var(--ink); text-decoration: none; font-size: 13px; font-weight: 600;\n border: 1px solid var(--line); border-radius: 999px; padding: 6px 14px; background: var(--card);\n }\n nav.toc a:hover { border-color: var(--accent); color: var(--accent-deep); }\n header.hero, section {\n background: var(--card); border: 1px solid var(--line); border-radius: 14px;\n padding: 28px 32px; margin-bottom: 20px;\n }\n .badges { margin-top: 14px; display: flex; flex-wrap: wrap; gap: 8px; }\n .badge {\n display: inline-block; border-radius: 999px; padding: 2px 11px;\n font-size: 12.5px; font-weight: 600; border: 1px solid var(--line); background: var(--bg);\n }\n .badge-hero { color: var(--accent-deep); border-color: #E5C8BA; background: #F7EDE7; }\n .badge-done { color: var(--done); border-color: #C4D9C9; background: #EDF4EE; }\n .badge-todo { color: var(--warn); border-color: #E4D2A8; background: #F8F1DE; }\n .badge-manual { color: var(--accent-deep); border-color: #E5C8BA; background: #F7EDE7; }\n .badge-error { color: var(--bad); border-color: #E7C2BB; background: #F9ECE9; }\n .readiness { margin-top: 18px; }\n .readiness-track { height: 10px; border-radius: 999px; background: #E6E2D6; overflow: hidden; }\n .readiness-fill { height: 100%; border-radius: 999px; background: var(--accent); }\n ol.steps, ul.steps { margin: 0; padding: 0 0 0 2px; list-style: none; }\n .steps li { border-top: 1px solid var(--line); padding: 14px 2px; }\n .steps li:first-child { border-top: none; padding-top: 4px; }\n .step-heading { display: flex; align-items: center; gap: 10px; margin-bottom: 2px; }\n .recipe-row { border-top: 1px solid var(--line); padding: 12px 0; }\n .recipe-row:first-of-type { border-top: none; }\n .recipe-note { font-size: 14px; color: var(--muted); margin-bottom: 6px; }\n .recipe-command {\n display: flex; align-items: center; gap: 10px; padding: 10px 14px; margin-top: 8px;\n border-radius: 9px; background: #191817; color: #F5F1E8; overflow-x: auto;\n }\n .recipe-command code { flex: 1 1 auto; white-space: pre; }\n button.copy {\n flex: 0 0 auto; border: 1px solid #4A4742; border-radius: 6px; cursor: pointer;\n background: transparent; color: #D8D2C4; font-size: 12px; font-weight: 600; padding: 4px 10px;\n }\n button.copy:hover { border-color: var(--accent); color: #F5F1E8; }\n code { font: 13.5px/1.5 ui-monospace, Consolas, \"Cascadia Mono\", monospace; }\n table { width: 100%; border-collapse: collapse; }\n th, td { text-align: left; padding: 9px 10px; border-top: 1px solid var(--line); vertical-align: top; }\n thead th { border-top: none; font-size: 13px; color: var(--muted); font-weight: 600; }\n td.raw { overflow-wrap: anywhere; }\n ul.plain-list { margin: 8px 0 0; padding-left: 4px; list-style: none; }\n ul.plain-list li { padding: 5px 0; }\n .stack-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 12px; }\n .stack-cell {\n border: 1px solid var(--line); border-radius: 10px; background: var(--bg);\n padding: 12px 14px; display: flex; flex-direction: column; gap: 4px;\n }\n .stack-cell span { color: var(--muted); font-size: 13.5px; }\n .glossary-grid { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }\n footer { text-align: center; color: var(--muted); font-size: 13px; padding: 10px 0 26px; }\n @media print {\n body { background: #fff; padding: 0; }\n header.hero, section { border: none; padding: 12px 0; break-inside: avoid; }\n nav.toc, button.copy { display: none; }\n }\n`;\n\nconst COPY_SCRIPT = `\n document.addEventListener('click', function (event) {\n var button = event.target.closest('button.copy');\n if (!button || !navigator.clipboard) return;\n navigator.clipboard.writeText(button.getAttribute('data-copy') || '').then(function () {\n var original = button.textContent;\n button.textContent = 'Copied!';\n setTimeout(function () { button.textContent = original; }, 1600);\n });\n });\n`;\n\n/**\n * Render the passport as a complete standalone HTML document. Pure and\n * deterministic apart from the timestamp, which tests can inject.\n */\nexport function renderPassportHtml(options: PassportOptions): string {\n const { scan, warnings, plan, version } = options;\n const generatedAt = options.generatedAt ?? new Date();\n const name = escapeHtml(scan.projectName);\n const generatedOn = generatedAt.toISOString().slice(0, 10);\n const quickStart = quickStartSection(scan);\n const requirements = requirementsSection(scan);\n const stack = stackSection(scan);\n const docker = dockerSection(scan);\n const readinessLabel = plan.ready\n ? 'Ready to run'\n : `${plan.readiness}% ready — ${escapeHtml(plan.summary)}`;\n\n const tocEntries: Array<[string, string]> = [];\n if (quickStart !== '') tocEntries.push(['#quick-start', 'Quick start']);\n if (requirements !== '') tocEntries.push(['#requirements', 'What you need']);\n tocEntries.push(['#setup', 'Setup steps']);\n if (stack !== '') tocEntries.push(['#stack', 'Tech stack']);\n tocEntries.push(['#commands', 'Commands']);\n tocEntries.push(['#settings', 'Settings']);\n tocEntries.push(['#troubleshooting', 'Troubleshooting']);\n tocEntries.push(['#glossary', 'Glossary']);\n const toc = tocEntries.map(([href, label]) => ` <a href=\"${href}\">${label}</a>`).join('\\n');\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light\">\n<title>${name} — Project Passport</title>\n<style>${PASSPORT_CSS}</style>\n</head>\n<body>\n<main>\n <header class=\"hero\">\n <p class=\"kicker\">Project Passport</p>\n <h1>${name}</h1>\n <p class=\"lede\">${escapeHtml(describeProject(scan))}</p>\n <div class=\"badges\">\n ${heroBadges(scan)}\n </div>\n <div class=\"readiness\">\n <p class=\"muted\">${readinessLabel}</p>\n <div class=\"readiness-track\"><div class=\"readiness-fill\" style=\"width:${plan.readiness}%\"></div></div>\n </div>\n </header>\n\n <nav class=\"toc\">\n${toc}\n </nav>\n\n${quickStart}\n${requirements}\n <section id=\"setup\">\n <h2>Setup, step by step</h2>\n <p class=\"muted\">The detailed version of the quick start. Anything marked “Done” was already true when this passport was generated.</p>\n ${stepsSection(plan, scan)}\n </section>\n\n${stack}\n <section id=\"commands\">\n <h2>Every command, explained</h2>\n ${scriptsSection(scan)}\n </section>\n\n <section id=\"settings\">\n <h2>Settings this project needs</h2>\n ${envSection(scan)}\n </section>\n\n <section id=\"ports\">\n <h2>Network ports</h2>\n ${portsSection(scan)}\n </section>\n\n${docker}\n <section id=\"health\">\n <h2>Health check</h2>\n ${healthSection(warnings)}\n </section>\n\n${troubleshootingSection(scan)}\n${glossarySection(scan)}\n <footer>\n Generated by DevSurface v${escapeHtml(version)} on ${generatedOn} ·\n Everything was collected locally. No secrets, tokens, or .env values are included.\n </footer>\n</main>\n<script>${COPY_SCRIPT}</script>\n</body>\n</html>\n`;\n}\n","export const DEV_SURFACE_VERSION = '0.7.1';\n","import pc from 'picocolors';\nimport {\n isDangerousCommand,\n runConfiguredCommandToTerminal,\n runPackageScriptToTerminal\n} from '../../core/process/runner.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nexport async function runCommand(script: string, cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n\n if (scan.scripts[script] !== undefined) {\n const exitCode = await runPackageScriptToTerminal({\n cwd,\n packageManager: scan.packageManager,\n script\n });\n process.exitCode = exitCode;\n return;\n }\n\n const configuredCommand = scan.config?.config.commands?.[script] ?? scan.presetCommands[script];\n if (configuredCommand !== undefined) {\n if (isDangerousCommand(configuredCommand)) {\n console.error(pc.red(`Refusing to run dangerous command \"${safeTerminalText(script)}\".`));\n process.exitCode = 1;\n return;\n }\n\n const exitCode = await runConfiguredCommandToTerminal({\n cwd,\n command: configuredCommand\n });\n process.exitCode = exitCode;\n return;\n }\n\n const available = [\n ...Object.keys(scan.scripts),\n ...Object.keys(scan.config?.config.commands ?? {}),\n ...Object.keys(scan.presetCommands)\n ];\n const hint = available.length > 0 ? ` Available commands: ${safeTerminalList(available)}.` : '';\n console.error(pc.red(`Command \"${safeTerminalText(script)}\" was not found.${hint}`));\n process.exitCode = 1;\n}\n","import pc from 'picocolors';\nimport type { ScanResult } from '../../core/types.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nfunction formatList(values: string[]): string {\n return safeTerminalList(values);\n}\n\nexport function printScanResult(scan: ScanResult): void {\n console.log(pc.bold(`Project: ${safeTerminalText(scan.projectName)}`));\n console.log(`Language: ${formatList(scan.language.detected) || 'unknown'}`);\n console.log(`Type: ${safeTerminalText(scan.framework?.type ?? 'Unknown')}`);\n console.log(`Manager: ${safeTerminalText(scan.packageManager ?? 'unknown')}`);\n console.log(`Scripts: ${formatList(Object.keys(scan.scripts))}`);\n console.log(`Presets: ${formatList(scan.presets.map((preset) => preset.label)) || 'none'}`);\n console.log(`Git: ${safeTerminalText(scan.git?.branch ?? 'not detected')}`);\n console.log(`README: ${scan.readme.exists ? 'found' : 'missing'}`);\n console.log(`LICENSE: ${scan.license.exists ? 'found' : 'missing'}`);\n\n if (scan.env !== null) {\n console.log(`Env: ${scan.env.hasLocal ? '.env found' : '.env missing'}`);\n }\n\n if (scan.ports.length > 0) {\n const ports = scan.ports.map((port) => `${port.port}${port.inUse ? ' in use' : ' free'}`);\n console.log(`Ports: ${ports.join(', ')}`);\n }\n\n if (scan.docker !== null) {\n console.log(\n `Docker: compose found (${formatList(scan.docker.services.map((service) => service.name))})`\n );\n }\n}\n\nexport async function scanCommand(cwd = process.cwd()): Promise<void> {\n printScanResult(await scanProject(cwd));\n}\n","import pc from 'picocolors';\nimport open from 'open';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isHubRunning, registerWorkspaceRemotely, dashboardUrl } from '../hub/client.js';\nimport { printScanResult } from './scan.js';\n\nexport async function startCommand(options: {\n cwd?: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const port = options.port ?? 4567;\n\n console.log(pc.bold(`DevSurface v${DEV_SURFACE_VERSION}`));\n console.log('Scanning project...\\n');\n\n const scan = await scanProject(cwd);\n printScanResult(scan);\n\n const warnings = await runDoctor(cwd, scan);\n if (warnings.length > 0) {\n console.log('\\nWarnings:');\n for (const item of warnings) {\n const marker = item.severity === 'error' ? pc.red('!') : pc.yellow('!');\n console.log(` ${marker} ${item.title}`);\n }\n }\n\n if (await isHubRunning(port)) {\n console.log('\\nHub already running. Registering workspace...');\n const registered = await registerWorkspaceRemotely(cwd, port);\n if (registered) {\n const url = dashboardUrl(registered.id, port);\n console.log(`Workspace ${pc.cyan(registered.name)} attached.`);\n console.log(`Dashboard -> ${pc.cyan(url)}`);\n if (options.openBrowser !== false) {\n await open(url);\n }\n return;\n }\n console.log('Could not register with running hub. Starting a new instance...');\n }\n\n const server = await startHubServer({\n port,\n openBrowser: options.openBrowser,\n initialWorkspace: cwd\n });\n\n console.log(`\\nDashboard running at -> ${pc.cyan(server.url)}`);\n}\n","import process from 'node:process';\nimport {Buffer} from 'node:buffer';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport {isWsl, powerShellPath} from 'wsl-utils';\nimport defineLazyProperty from 'define-lazy-prop';\nimport defaultBrowser from 'default-browser';\nimport isInsideContainer from 'is-inside-container';\n\nconst execFile = promisify(childProcess.execFile);\n\n// Path to included `xdg-open`.\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst localXdgOpenPath = path.join(__dirname, 'xdg-open');\n\nconst {platform, arch} = process;\n\n/**\nGet the default browser name in Windows from WSL.\n\n@returns {Promise<string>} Browser name.\n*/\nasync function getWindowsDefaultBrowserFromWsl() {\n\tconst powershellPath = await powerShellPath();\n\tconst rawCommand = String.raw`(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice\").ProgId`;\n\tconst encodedCommand = Buffer.from(rawCommand, 'utf16le').toString('base64');\n\n\tconst {stdout} = await execFile(\n\t\tpowershellPath,\n\t\t[\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t\tencodedCommand,\n\t\t],\n\t\t{encoding: 'utf8'},\n\t);\n\n\tconst progId = stdout.trim();\n\n\t// Map ProgId to browser IDs\n\tconst browserMap = {\n\t\tChromeHTML: 'com.google.chrome',\n\t\tBraveHTML: 'com.brave.Browser',\n\t\tMSEdgeHTM: 'com.microsoft.edge',\n\t\tFirefoxURL: 'org.mozilla.firefox',\n\t};\n\n\treturn browserMap[progId] ? {id: browserMap[progId]} : {};\n}\n\nconst pTryEach = async (array, mapper) => {\n\tlet latestError;\n\n\tfor (const item of array) {\n\t\ttry {\n\t\t\treturn await mapper(item); // eslint-disable-line no-await-in-loop\n\t\t} catch (error) {\n\t\t\tlatestError = error;\n\t\t}\n\t}\n\n\tthrow latestError;\n};\n\n// eslint-disable-next-line complexity\nconst baseOpen = async options => {\n\toptions = {\n\t\twait: false,\n\t\tbackground: false,\n\t\tnewInstance: false,\n\t\tallowNonzeroExitCode: false,\n\t\t...options,\n\t};\n\n\tif (Array.isArray(options.app)) {\n\t\treturn pTryEach(options.app, singleApp => baseOpen({\n\t\t\t...options,\n\t\t\tapp: singleApp,\n\t\t}));\n\t}\n\n\tlet {name: app, arguments: appArguments = []} = options.app ?? {};\n\tappArguments = [...appArguments];\n\n\tif (Array.isArray(app)) {\n\t\treturn pTryEach(app, appName => baseOpen({\n\t\t\t...options,\n\t\t\tapp: {\n\t\t\t\tname: appName,\n\t\t\t\targuments: appArguments,\n\t\t\t},\n\t\t}));\n\t}\n\n\tif (app === 'browser' || app === 'browserPrivate') {\n\t\t// IDs from default-browser for macOS and windows are the same\n\t\tconst ids = {\n\t\t\t'com.google.chrome': 'chrome',\n\t\t\t'google-chrome.desktop': 'chrome',\n\t\t\t'com.brave.Browser': 'brave',\n\t\t\t'org.mozilla.firefox': 'firefox',\n\t\t\t'firefox.desktop': 'firefox',\n\t\t\t'com.microsoft.msedge': 'edge',\n\t\t\t'com.microsoft.edge': 'edge',\n\t\t\t'com.microsoft.edgemac': 'edge',\n\t\t\t'microsoft-edge.desktop': 'edge',\n\t\t};\n\n\t\t// Incognito flags for each browser in `apps`.\n\t\tconst flags = {\n\t\t\tchrome: '--incognito',\n\t\t\tbrave: '--incognito',\n\t\t\tfirefox: '--private-window',\n\t\t\tedge: '--inPrivate',\n\t\t};\n\n\t\tconst browser = isWsl ? await getWindowsDefaultBrowserFromWsl() : await defaultBrowser();\n\t\tif (browser.id in ids) {\n\t\t\tconst browserName = ids[browser.id];\n\n\t\t\tif (app === 'browserPrivate') {\n\t\t\t\tappArguments.push(flags[browserName]);\n\t\t\t}\n\n\t\t\treturn baseOpen({\n\t\t\t\t...options,\n\t\t\t\tapp: {\n\t\t\t\t\tname: apps[browserName],\n\t\t\t\t\targuments: appArguments,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tthrow new Error(`${browser.name} is not supported as a default browser`);\n\t}\n\n\tlet command;\n\tconst cliArguments = [];\n\tconst childProcessOptions = {};\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\n\t\tif (options.wait) {\n\t\t\tcliArguments.push('--wait-apps');\n\t\t}\n\n\t\tif (options.background) {\n\t\t\tcliArguments.push('--background');\n\t\t}\n\n\t\tif (options.newInstance) {\n\t\t\tcliArguments.push('--new');\n\t\t}\n\n\t\tif (app) {\n\t\t\tcliArguments.push('-a', app);\n\t\t}\n\t} else if (platform === 'win32' || (isWsl && !isInsideContainer() && !app)) {\n\t\tcommand = await powerShellPath();\n\n\t\tcliArguments.push(\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t);\n\n\t\tif (!isWsl) {\n\t\t\tchildProcessOptions.windowsVerbatimArguments = true;\n\t\t}\n\n\t\tconst encodedArguments = ['Start'];\n\n\t\tif (options.wait) {\n\t\t\tencodedArguments.push('-Wait');\n\t\t}\n\n\t\tif (app) {\n\t\t\t// Double quote with double quotes to ensure the inner quotes are passed through.\n\t\t\t// Inner quotes are delimited for PowerShell interpretation with backticks.\n\t\t\tencodedArguments.push(`\"\\`\"${app}\\`\"\"`);\n\t\t\tif (options.target) {\n\t\t\t\tappArguments.push(options.target);\n\t\t\t}\n\t\t} else if (options.target) {\n\t\t\tencodedArguments.push(`\"${options.target}\"`);\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tappArguments = appArguments.map(argument => `\"\\`\"${argument}\\`\"\"`);\n\t\t\tencodedArguments.push('-ArgumentList', appArguments.join(','));\n\t\t}\n\n\t\t// Using Base64-encoded command, accepted by PowerShell, to allow special characters.\n\t\toptions.target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64');\n\t} else {\n\t\tif (app) {\n\t\t\tcommand = app;\n\t\t} else {\n\t\t\t// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.\n\t\t\tconst isBundled = !__dirname || __dirname === '/';\n\n\t\t\t// Check if local `xdg-open` exists and is executable.\n\t\t\tlet exeLocalXdgOpen = false;\n\t\t\ttry {\n\t\t\t\tawait fs.access(localXdgOpenPath, fsConstants.X_OK);\n\t\t\t\texeLocalXdgOpen = true;\n\t\t\t} catch {}\n\n\t\t\tconst useSystemXdgOpen = process.versions.electron\n\t\t\t\t?? (platform === 'android' || isBundled || !exeLocalXdgOpen);\n\t\t\tcommand = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tcliArguments.push(...appArguments);\n\t\t}\n\n\t\tif (!options.wait) {\n\t\t\t// `xdg-open` will block the process unless stdio is ignored\n\t\t\t// and it's detached from the parent even if it's unref'd.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t\tchildProcessOptions.detached = true;\n\t\t}\n\t}\n\n\tif (platform === 'darwin' && appArguments.length > 0) {\n\t\tcliArguments.push('--args', ...appArguments);\n\t}\n\n\t// This has to come after `--args`.\n\tif (options.target) {\n\t\tcliArguments.push(options.target);\n\t}\n\n\tconst subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);\n\n\tif (options.wait) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\tif (!options.allowNonzeroExitCode && exitCode > 0) {\n\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(subprocess);\n\t\t\t});\n\t\t});\n\t}\n\n\tsubprocess.unref();\n\n\treturn subprocess;\n};\n\nconst open = (target, options) => {\n\tif (typeof target !== 'string') {\n\t\tthrow new TypeError('Expected a `target`');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\ttarget,\n\t});\n};\n\nexport const openApp = (name, options) => {\n\tif (typeof name !== 'string' && !Array.isArray(name)) {\n\t\tthrow new TypeError('Expected a valid `name`');\n\t}\n\n\tconst {arguments: appArguments = []} = options ?? {};\n\tif (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {\n\t\tthrow new TypeError('Expected `appArguments` as Array type');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\tapp: {\n\t\t\tname,\n\t\t\targuments: appArguments,\n\t\t},\n\t});\n};\n\nfunction detectArchBinary(binary) {\n\tif (typeof binary === 'string' || Array.isArray(binary)) {\n\t\treturn binary;\n\t}\n\n\tconst {[arch]: archBinary} = binary;\n\n\tif (!archBinary) {\n\t\tthrow new Error(`${arch} is not supported`);\n\t}\n\n\treturn archBinary;\n}\n\nfunction detectPlatformBinary({[platform]: platformBinary}, {wsl}) {\n\tif (wsl && isWsl) {\n\t\treturn detectArchBinary(wsl);\n\t}\n\n\tif (!platformBinary) {\n\t\tthrow new Error(`${platform} is not supported`);\n\t}\n\n\treturn detectArchBinary(platformBinary);\n}\n\nexport const apps = {};\n\ndefineLazyProperty(apps, 'chrome', () => detectPlatformBinary({\n\tdarwin: 'google chrome',\n\twin32: 'chrome',\n\tlinux: ['google-chrome', 'google-chrome-stable', 'chromium'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',\n\t\tx64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'brave', () => detectPlatformBinary({\n\tdarwin: 'brave browser',\n\twin32: 'brave',\n\tlinux: ['brave-browser', 'brave'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe',\n\t\tx64: ['/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe', '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'firefox', () => detectPlatformBinary({\n\tdarwin: 'firefox',\n\twin32: String.raw`C:\\Program Files\\Mozilla Firefox\\firefox.exe`,\n\tlinux: 'firefox',\n}, {\n\twsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe',\n}));\n\ndefineLazyProperty(apps, 'edge', () => detectPlatformBinary({\n\tdarwin: 'microsoft edge',\n\twin32: 'msedge',\n\tlinux: ['microsoft-edge', 'microsoft-edge-dev'],\n}, {\n\twsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',\n}));\n\ndefineLazyProperty(apps, 'browser', () => 'browser');\n\ndefineLazyProperty(apps, 'browserPrivate', () => 'browserPrivate');\n\nexport default open;\n","import process from 'node:process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport isWsl from 'is-wsl';\n\nexport const wslDrivesMountPoint = (() => {\n\t// Default value for \"root\" param\n\t// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config\n\tconst defaultMountPoint = '/mnt/';\n\n\tlet mountPoint;\n\n\treturn async function () {\n\t\tif (mountPoint) {\n\t\t\t// Return memoized mount point value\n\t\t\treturn mountPoint;\n\t\t}\n\n\t\tconst configFilePath = '/etc/wsl.conf';\n\n\t\tlet isConfigFileExists = false;\n\t\ttry {\n\t\t\tawait fs.access(configFilePath, fsConstants.F_OK);\n\t\t\tisConfigFileExists = true;\n\t\t} catch {}\n\n\t\tif (!isConfigFileExists) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tconst configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});\n\t\tconst configMountPoint = /(?<!#.*)root\\s*=\\s*(?<mountPoint>.*)/g.exec(configContent);\n\n\t\tif (!configMountPoint) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tmountPoint = configMountPoint.groups.mountPoint.trim();\n\t\tmountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;\n\n\t\treturn mountPoint;\n\t};\n})();\n\nexport const powerShellPathFromWsl = async () => {\n\tconst mountPoint = await wslDrivesMountPoint();\n\treturn `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;\n};\n\nexport const powerShellPath = async () => {\n\tif (isWsl) {\n\t\treturn powerShellPathFromWsl();\n\t}\n\n\treturn `${process.env.SYSTEMROOT || process.env.windir || String.raw`C:\\Windows`}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n};\n\nexport {default as isWsl} from 'is-wsl';\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport isInsideContainer from 'is-inside-container';\n\nconst isWsl = () => {\n\tif (process.platform !== 'linux') {\n\t\treturn false;\n\t}\n\n\tif (os.release().toLowerCase().includes('microsoft')) {\n\t\tif (isInsideContainer()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tif (fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')) {\n\t\t\treturn !isInsideContainer();\n\t\t}\n\t} catch {}\n\n\t// Fallback for custom kernels: check WSL-specific paths.\n\tif (\n\t\tfs.existsSync('/proc/sys/fs/binfmt_misc/WSLInterop')\n\t\t|| fs.existsSync('/run/WSL')\n\t) {\n\t\treturn !isInsideContainer();\n\t}\n\n\treturn false;\n};\n\nexport default process.env.__IS_WSL_TEST__ ? isWsl : isWsl();\n","import fs from 'node:fs';\nimport isDocker from 'is-docker';\n\nlet cachedResult;\n\n// Podman detection\nconst hasContainerEnv = () => {\n\ttry {\n\t\tfs.statSync('/run/.containerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default function isInsideContainer() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (cachedResult === undefined) {\n\t\tcachedResult = hasContainerEnv() || isDocker();\n\t}\n\n\treturn cachedResult;\n}\n","import fs from 'node:fs';\n\nlet isDockerCached;\n\nfunction hasDockerEnv() {\n\ttry {\n\t\tfs.statSync('/.dockerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasDockerCGroup() {\n\ttry {\n\t\treturn fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function isDocker() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (isDockerCached === undefined) {\n\t\tisDockerCached = hasDockerEnv() || hasDockerCGroup();\n\t}\n\n\treturn isDockerCached;\n}\n","export default function defineLazyProperty(object, propertyName, valueGetter) {\n\tconst define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});\n\n\tObject.defineProperty(object, propertyName, {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget() {\n\t\t\tconst result = valueGetter();\n\t\t\tdefine(result);\n\t\t\treturn result;\n\t\t},\n\t\tset(value) {\n\t\t\tdefine(value);\n\t\t}\n\t});\n\n\treturn object;\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\nimport defaultBrowserId from 'default-browser-id';\nimport bundleName from 'bundle-name';\nimport windows from './windows.js';\n\nexport {_windowsBrowserProgIdMap} from './windows.js';\n\nconst execFileAsync = promisify(execFile);\n\n// Inlined: https://github.com/sindresorhus/titleize/blob/main/index.js\nconst titleize = string => string.toLowerCase().replaceAll(/(?:^|\\s|-)\\S/g, x => x.toUpperCase());\n\nexport default async function defaultBrowser() {\n\tif (process.platform === 'darwin') {\n\t\tconst id = await defaultBrowserId();\n\t\tconst name = await bundleName(id);\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'linux') {\n\t\tconst {stdout} = await execFileAsync('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n\t\tconst id = stdout.trim();\n\t\tconst name = titleize(id.replace(/.desktop$/, '').replace('-', ' '));\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows();\n\t}\n\n\tthrow new Error('Only macOS, Linux, and Windows are supported');\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport default async function defaultBrowserId() {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst {stdout} = await execFileAsync('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure', 'LSHandlers']);\n\n\t// `(?!-)` is to prevent matching `LSHandlerRoleAll = \"-\";`.\n\tconst match = /LSHandlerRoleAll = \"(?!-)(?<id>[^\"]+?)\";\\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);\n\n\tconst browserId = match?.groups.id ?? 'com.apple.Safari';\n\n\t// Correct the case for Safari's bundle identifier\n\tif (browserId === 'com.apple.safari') {\n\t\treturn 'com.apple.Safari';\n\t}\n\n\treturn browserId;\n}\n","import process from 'node:process';\nimport {promisify} from 'node:util';\nimport {execFile, execFileSync} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runAppleScript(script, {humanReadableOutput = true, signal} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst execOptions = {};\n\tif (signal) {\n\t\texecOptions.signal = signal;\n\t}\n\n\tconst {stdout} = await execFileAsync('osascript', ['-e', script, outputArguments], execOptions);\n\treturn stdout.trim();\n}\n\nexport function runAppleScriptSync(script, {humanReadableOutput = true} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst stdout = execFileSync('osascript', ['-e', script, ...outputArguments], {\n\t\tencoding: 'utf8',\n\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\ttimeout: 500,\n\t});\n\n\treturn stdout.trim();\n}\n","import {runAppleScript} from 'run-applescript';\n\nexport default async function bundleName(bundleId) {\n\treturn runAppleScript(`tell application \"Finder\" to set app_path to application file id \"${bundleId}\" as string\\ntell application \"System Events\" to get value of property list item \"CFBundleName\" of property list file (app_path & \":Contents:Info.plist\")`);\n}\n","import {promisify} from 'node:util';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\n// TODO: Fix the casing of bundle identifiers in the next major version.\n\n// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake\n// ones that look real and match the macOS/Linux versions for cross-platform apps.\nconst windowsBrowserProgIds = {\n\tMSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct.\n\tMSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'},\n\tMSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'},\n\tAppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},\n\tChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},\n\tChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'},\n\tChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'},\n\tChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'},\n\tBraveHTML: {name: 'Brave', id: 'com.brave.Browser'},\n\tBraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},\n\tBraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'},\n\tBraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},\n\tFirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},\n\tOperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'},\n\tVivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'},\n\t'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},\n};\n\nexport const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));\n\nexport class UnknownBrowserError extends Error {}\n\nexport default async function defaultBrowser(_execFileAsync = execFileAsync) {\n\tconst {stdout} = await _execFileAsync('reg', [\n\t\t'QUERY',\n\t\t' HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n\t\t'/v',\n\t\t'ProgId',\n\t]);\n\n\tconst match = /ProgId\\s*REG_SZ\\s*(?<id>\\S+)/.exec(stdout);\n\tif (!match) {\n\t\tthrow new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);\n\t}\n\n\tconst {id} = match.groups;\n\n\t// Windows can append a hash suffix to ProgIds using a dot or hyphen\n\t// (e.g., `ChromeHTML.ABC123`, `FirefoxURL-6F193CCC56814779`).\n\t// Try exact match first, then try without the suffix.\n\tconst dotIndex = id.lastIndexOf('.');\n\tconst hyphenIndex = id.lastIndexOf('-');\n\tconst baseIdByDot = dotIndex === -1 ? undefined : id.slice(0, dotIndex);\n\tconst baseIdByHyphen = hyphenIndex === -1 ? undefined : id.slice(0, hyphenIndex);\n\n\treturn windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? {name: id, id};\n}\n","import { promises as fs } from 'node:fs';\nimport type { Server } from 'node:http';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createAdaptorServer } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { Hono } from 'hono';\nimport open from 'open';\nimport type { DockerController } from '../core/docker/compose.js';\nimport { ProcessManager } from '../core/process/manager.js';\nimport { Hub } from '../core/hub/runtime.js';\nimport { registerApiRoutes, registerHubApiRoutes } from './routes/api.js';\nimport { setupWebSocket, setupHubWebSocket } from './routes/ws.js';\nimport { createMutationToken } from './mutationToken.js';\nimport { initializeListenHost, DEFAULT_PORT } from './listenConfig.js';\n\nfunction warnIfContainerRootsUnset(host: string): void {\n if (host !== '0.0.0.0' && host !== '::') {\n return;\n }\n if (process.env.DEVSURFACE_WORKSPACE_ROOTS?.trim()) {\n return;\n }\n console.warn(\n 'Warning: DEVSURFACE_WORKSPACE_ROOTS is unset in container mode. ' +\n 'Any loopback or private-network client can register arbitrary directories as workspaces. ' +\n 'Set DEVSURFACE_WORKSPACE_ROOTS to restrict workspace registration.'\n );\n}\n\nexport { DEFAULT_HOST, DEFAULT_PORT, resolveHost } from './listenConfig.js';\n\nexport interface DevSurfaceServer {\n url: string;\n port: number;\n host: string;\n hub: Hub;\n close: () => Promise<void>;\n processManager: ProcessManager;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function findWebDistDir(): Promise<string | null> {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(moduleDir, '..', 'web', 'dist'),\n path.join(moduleDir, '..', '..', 'src', 'web', 'dist'),\n path.join(moduleDir, 'web', 'dist')\n ];\n\n for (const candidate of candidates) {\n if (await fileExists(path.join(candidate, 'index.html'))) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction toListenError(error: unknown, host: string, port: number): Error {\n const code = error instanceof Error ? (error as NodeJS.ErrnoException).code : undefined;\n\n if (code === 'EADDRINUSE') {\n return new Error(\n `Port ${port} is already in use on ${host}. Stop the other process or run DevSurface with --port ${port + 1}.`,\n { cause: error }\n );\n }\n\n if (code === 'EACCES') {\n return new Error(`DevSurface does not have permission to bind to ${host}:${port}.`, {\n cause: error\n });\n }\n\n return error instanceof Error ? error : new Error(String(error));\n}\n\nasync function listenOnHost(\n server: Server,\n wss: ReturnType<typeof setupWebSocket>,\n host: string,\n port: number\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n server.off('error', onError);\n server.off('listening', onListening);\n wss.off('error', onError);\n };\n\n const onError = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(toListenError(error, host, port));\n };\n\n const onListening = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve();\n };\n\n wss.once('error', onError);\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(port, host);\n });\n}\n\nasync function closeWebSocketServer(wss: ReturnType<typeof setupWebSocket>): Promise<void> {\n await new Promise<void>((resolve) => {\n wss.close(() => resolve());\n });\n}\n\nasync function closeHttpServer(server: Server): Promise<void> {\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\nasync function mountWebUi(app: Hono): Promise<void> {\n const webDistDir = await findWebDistDir();\n if (webDistDir !== null) {\n app.use('/assets/*', serveStatic({ root: webDistDir }));\n app.get('/favicon.svg', serveStatic({ root: webDistDir }));\n app.get('*', async (context) => {\n const html = await fs.readFile(path.join(webDistDir, 'index.html'), 'utf8');\n return context.html(html);\n });\n } else {\n app.get('*', (context) =>\n context.html(\n '<!doctype html><title>DevSurface</title><main><h1>DevSurface</h1><p>Run npm run build:web to build the dashboard.</p></main>',\n 503\n )\n );\n }\n}\n\n// Legacy single-project createApp (backward compat with existing tests)\nexport async function createApp(options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken?: string;\n}): Promise<Hono> {\n const app = new Hono();\n registerApiRoutes(app, {\n ...options,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\n// Hub-mode createApp\nexport async function createHubApp(options: { hub: Hub; mutationToken?: string }): Promise<Hono> {\n const app = new Hono();\n registerHubApiRoutes(app, {\n hub: options.hub,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\nexport async function startHubServer(options: {\n port?: number;\n openBrowser?: boolean;\n dataDir?: string;\n initialWorkspace?: string;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub({ dataDir: options.dataDir });\n hub.attachCleanupHandlers();\n warnIfContainerRootsUnset(host);\n\n if (options.initialWorkspace) {\n await hub.registry.add(options.initialWorkspace);\n }\n\n const mutationToken = createMutationToken();\n const app = await createHubApp({ hub, mutationToken });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupHubWebSocket(server, hub);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n const entries = await hub.registry.list();\n const deepLink = entries.length > 0 ? `${url}/?workspace=${entries[0].id}` : url;\n await open(deepLink);\n }\n\n const dummyProcessManager = new ProcessManager();\n\n return {\n url,\n port,\n host,\n hub,\n processManager: dummyProcessManager,\n close: async () => {\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n\n// Legacy single-project server (used by old tests)\nexport async function startDevSurfaceServer(options: {\n projectRoot: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub();\n hub.attachCleanupHandlers();\n\n await hub.registry.add(options.projectRoot);\n const processManager = new ProcessManager();\n processManager.attachCleanupHandlers();\n\n const app = await createApp({\n projectRoot: options.projectRoot,\n processManager\n });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupWebSocket(server, processManager);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n await open(url);\n }\n\n return {\n url,\n port,\n host,\n hub,\n processManager,\n close: async () => {\n processManager.killAll();\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n","import { EventEmitter } from 'node:events';\nimport type { ChildProcess } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../types.js';\n\nexport const LOG_MESSAGE_LIMIT = 16_384;\nconst LOG_ENTRY_LIMIT = 1000;\n\ninterface ProcessRecord extends ManagedProcessSnapshot {\n child: ChildProcess;\n}\n\nfunction killChildProcessTree(child: ChildProcess): void {\n if (child.pid === undefined) {\n child.kill();\n return;\n }\n\n if (process.platform === 'win32') {\n const result = spawn.sync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true\n });\n if (result.error) {\n child.kill();\n }\n return;\n }\n\n child.kill();\n}\n\nexport class ProcessManager extends EventEmitter {\n private readonly processes = new Map<string, ProcessRecord>();\n private readonly logs: ProcessLogEvent[] = [];\n private cleanupInstalled = false;\n\n start(options: {\n cwd: string;\n script: string;\n command: string;\n args: string[];\n displayCommand: string;\n }): ManagedProcessSnapshot {\n const child = spawn(options.command, options.args, {\n cwd: options.cwd,\n shell: false,\n windowsHide: true\n });\n\n const pid = String(child.pid ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`);\n const record: ProcessRecord = {\n child,\n pid,\n script: options.script,\n command: options.displayCommand,\n status: 'running',\n startedAt: new Date().toISOString(),\n endedAt: null,\n exitCode: null\n };\n\n this.processes.set(pid, record);\n this.emitSystem(record, `Started ${options.displayCommand}`);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stdout', chunk.toString());\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stderr', chunk.toString());\n });\n\n child.on('error', (error) => {\n record.status = 'failed';\n record.endedAt = new Date().toISOString();\n this.emitLog(record, 'system', error.message);\n this.emit('process', this.snapshot(record));\n });\n\n child.on('close', (code) => {\n if (record.status === 'stopped') {\n record.exitCode = code;\n } else {\n record.status = code === 0 ? 'exited' : 'failed';\n record.exitCode = code;\n }\n record.endedAt = new Date().toISOString();\n this.emitSystem(record, `Exited with code ${code ?? 'unknown'}`);\n this.emit('process', this.snapshot(record));\n });\n\n this.emit('process', this.snapshot(record));\n return this.snapshot(record);\n }\n\n stop(pid: string): boolean {\n const record = this.processes.get(pid);\n if (!record || record.status !== 'running') {\n return false;\n }\n\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n this.emitSystem(record, 'Stopped by DevSurface');\n this.emit('process', this.snapshot(record));\n return true;\n }\n\n list(): ManagedProcessSnapshot[] {\n return Array.from(this.processes.values()).map((record) => this.snapshot(record));\n }\n\n listLogs(): ProcessLogEvent[] {\n return [...this.logs];\n }\n\n killAll(): void {\n for (const record of this.processes.values()) {\n if (record.status === 'running') {\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n }\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n\n this.cleanupInstalled = true;\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n\n private emitLog(record: ProcessRecord, stream: ProcessLogEvent['stream'], message: string): void {\n const boundedMessage =\n message.length <= LOG_MESSAGE_LIMIT ? message : message.slice(-LOG_MESSAGE_LIMIT);\n const event: ProcessLogEvent = {\n pid: record.pid,\n script: record.script,\n stream,\n message: boundedMessage,\n timestamp: new Date().toISOString()\n };\n\n this.logs.push(event);\n if (this.logs.length > LOG_ENTRY_LIMIT) {\n this.logs.splice(0, this.logs.length - LOG_ENTRY_LIMIT);\n }\n\n this.emit('log', event);\n }\n\n private emitSystem(record: ProcessRecord, message: string): void {\n this.emitLog(record, 'system', message);\n }\n\n private snapshot(record: ProcessRecord): ManagedProcessSnapshot {\n return {\n pid: record.pid,\n script: record.script,\n command: record.command,\n status: record.status,\n startedAt: record.startedAt,\n endedAt: record.endedAt,\n exitCode: record.exitCode\n };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { assertWithinWorkspaceRoots } from './workspaceRoots.js';\n\nexport interface WorkspaceEntry {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n}\n\nfunction workspaceId(realPath: string): string {\n const base =\n path\n .basename(realPath)\n .replace(/[^a-zA-Z0-9_-]/g, '_')\n .slice(0, 32) || 'workspace';\n const hash = createHash('sha256').update(realPath).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\nfunction defaultDataDir(): string {\n return process.env.DEVSURFACE_DATA_DIR ?? path.join(os.homedir(), '.devsurface');\n}\n\nasync function readPackageName(dirPath: string): Promise<string | null> {\n try {\n const raw = JSON.parse(await fs.readFile(path.join(dirPath, 'package.json'), 'utf8'));\n return typeof raw?.name === 'string' && raw.name.length > 0 ? raw.name : null;\n } catch {\n return null;\n }\n}\n\nexport class WorkspaceRegistry {\n private readonly filePath: string;\n private seeded = false;\n\n constructor(dataDir?: string) {\n const dir = dataDir ?? defaultDataDir();\n this.filePath = path.join(dir, 'workspaces.json');\n }\n\n async list(): Promise<WorkspaceEntry[]> {\n await this.seedFromEnv();\n return await this.read();\n }\n\n async add(dirPath: string): Promise<WorkspaceEntry> {\n const realDir = await this.resolveDir(dirPath);\n await assertWithinWorkspaceRoots(realDir);\n const entries = await this.read();\n\n const existing = entries.find((entry) => entry.path === realDir);\n if (existing) {\n return existing;\n }\n\n const name = (await readPackageName(realDir)) ?? path.basename(realDir);\n const entry: WorkspaceEntry = {\n id: workspaceId(realDir),\n name,\n path: realDir,\n addedAt: new Date().toISOString()\n };\n entries.push(entry);\n await this.write(entries);\n return entry;\n }\n\n async remove(id: string): Promise<boolean> {\n const entries = await this.read();\n const filtered = entries.filter((entry) => entry.id !== id);\n if (filtered.length === entries.length) {\n return false;\n }\n await this.write(filtered);\n return true;\n }\n\n async findByPath(dirPath: string): Promise<WorkspaceEntry | null> {\n try {\n const realDir = await fs.realpath(path.resolve(dirPath));\n const entries = await this.read();\n return entries.find((entry) => entry.path === realDir) ?? null;\n } catch {\n return null;\n }\n }\n\n async resolve(id: string): Promise<WorkspaceEntry | null> {\n const entries = await this.read();\n const entry = entries.find((item) => item.id === id);\n if (!entry) {\n return null;\n }\n\n try {\n const realDir = await this.resolveDir(entry.path);\n await assertWithinWorkspaceRoots(realDir);\n if (realDir !== entry.path) {\n const updated: WorkspaceEntry = { ...entry, path: realDir };\n await this.write(entries.map((item) => (item.id === id ? updated : item)));\n return updated;\n }\n return entry;\n } catch {\n await this.remove(id);\n return null;\n }\n }\n\n private async resolveDir(dirPath: string): Promise<string> {\n const resolved = path.resolve(dirPath);\n const realDir = await fs.realpath(resolved);\n const stat = await fs.stat(realDir);\n if (!stat.isDirectory()) {\n throw new Error(`${dirPath} is not a directory.`);\n }\n return realDir;\n }\n\n private async read(): Promise<WorkspaceEntry[]> {\n try {\n const content = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async write(entries: WorkspaceEntry[]): Promise<void> {\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await fs.writeFile(this.filePath, JSON.stringify(entries, null, 2) + '\\n', {\n encoding: 'utf8',\n mode: 0o600\n });\n }\n\n private async seedFromEnv(): Promise<void> {\n if (this.seeded) {\n return;\n }\n this.seeded = true;\n\n const seedValue = process.env.DEVSURFACE_WORKSPACES;\n if (!seedValue) {\n return;\n }\n\n const paths = seedValue\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n for (const p of paths) {\n try {\n await this.add(p);\n } catch {\n // Skip invalid seed paths.\n }\n }\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function configuredWorkspaceRoots(): Promise<string[]> {\n const raw = process.env.DEVSURFACE_WORKSPACE_ROOTS;\n if (!raw) {\n return [];\n }\n\n const roots: string[] = [];\n for (const entry of raw.split(',')) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n try {\n roots.push(await fs.realpath(path.resolve(trimmed)));\n } catch {\n // Skip invalid roots.\n }\n }\n\n return roots;\n}\n\nexport async function assertWithinWorkspaceRoots(targetPath: string): Promise<void> {\n const roots = await configuredWorkspaceRoots();\n if (roots.length === 0) {\n return;\n }\n\n for (const root of roots) {\n if (isWithinRoot(root, targetPath)) {\n return;\n }\n }\n\n throw new Error('Path must be inside a configured workspace root.');\n}\n","import { ProcessManager } from '../process/manager.js';\nimport { DockerComposeController, type DockerController } from '../docker/compose.js';\nimport { WorkspaceRegistry, type WorkspaceEntry } from './registry.js';\n\nexport interface WorkspaceRuntime {\n readonly id: string;\n readonly root: string;\n readonly processManager: ProcessManager;\n readonly dockerController: DockerController;\n}\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n runningProcesses: number;\n}\n\nexport class Hub {\n readonly registry: WorkspaceRegistry;\n private readonly runtimes = new Map<string, WorkspaceRuntime>();\n private cleanupInstalled = false;\n\n constructor(options?: { dataDir?: string }) {\n this.registry = new WorkspaceRegistry(options?.dataDir);\n }\n\n get(id: string): WorkspaceRuntime | null {\n return this.runtimes.get(id) ?? null;\n }\n\n ensure(entry: WorkspaceEntry): WorkspaceRuntime {\n const existing = this.runtimes.get(entry.id);\n if (existing) {\n return existing;\n }\n\n const runtime: WorkspaceRuntime = {\n id: entry.id,\n root: entry.path,\n processManager: new ProcessManager(),\n dockerController: new DockerComposeController(entry.path)\n };\n this.runtimes.set(entry.id, runtime);\n return runtime;\n }\n\n async listSummaries(): Promise<WorkspaceSummary[]> {\n const entries = await this.registry.list();\n return entries.map((entry) => {\n const runtime = this.runtimes.get(entry.id);\n const running = runtime\n ? runtime.processManager.list().filter((p) => p.status === 'running').length\n : 0;\n return {\n id: entry.id,\n name: entry.name,\n path: entry.path,\n addedAt: entry.addedAt,\n runningProcesses: running\n };\n });\n }\n\n killAll(): void {\n for (const runtime of this.runtimes.values()) {\n runtime.processManager.killAll();\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n this.cleanupInstalled = true;\n\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n}\n","import { constants, existsSync } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport type { Hono } from 'hono';\nimport open from 'open';\nimport {\n DockerComposeController,\n DockerOperationError,\n type DockerController\n} from '../../core/docker/compose.js';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport {\n isDangerousCommand,\n resolveConfiguredCommand,\n resolvePackageInstallCommand,\n resolvePackageRunCommand\n} from '../../core/process/runner.js';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { setEnvValue } from '../../core/env/write.js';\nimport { buildOnboardingPlan } from '../../core/onboarding/index.js';\nimport { renderPassportHtml } from '../../core/passport/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isAllowedLocalOrigin, isSameOrigin } from '../localAccess.js';\nimport { createApiAccessMiddleware } from '../accessControl.js';\nimport { hasValidMutationToken } from '../mutationToken.js';\nimport { isAllowedTerminalCommand } from '../terminal.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isAllowedMutationOrigin(requestUrl: string, origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n return isAllowedLocalOrigin(origin) && isSameOrigin(requestUrl, origin);\n}\n\nfunction registerMutationGuard(app: Hono, mutationToken: string): void {\n app.use('/api/*', createApiAccessMiddleware());\n app.use('/api/*', async (context, next) => {\n if (context.req.method === 'GET' || context.req.method === 'HEAD') {\n await next();\n return;\n }\n\n const origin = context.req.header('origin') ?? null;\n const secFetchSite = context.req.header('sec-fetch-site') ?? null;\n const intent = context.req.header('x-devsurface-intent') ?? null;\n const token = context.req.header('x-devsurface-token') ?? null;\n if (\n !hasMutationIntent(intent) ||\n !hasValidMutationToken(token, mutationToken) ||\n isCrossSiteFetch(secFetchSite) ||\n !isAllowedMutationOrigin(context.req.url, origin)\n ) {\n return context.json({ error: 'Cross-origin mutation rejected.' }, 403);\n }\n\n await next();\n });\n}\n\nfunction isCrossSiteFetch(secFetchSite: string | null): boolean {\n return secFetchSite === 'cross-site';\n}\n\nfunction hasMutationIntent(intent: string | null): boolean {\n return intent === 'dashboard';\n}\n\nasync function realPathWithinRoot(root: string, target: string): Promise<boolean> {\n if (!isWithinRoot(root, target)) {\n return false;\n }\n try {\n const [realRoot, realTarget] = await Promise.all([fs.realpath(root), fs.realpath(target)]);\n return isWithinRoot(realRoot, realTarget);\n } catch {\n return false;\n }\n}\n\nasync function writableDestinationWithinRoot(root: string, destination: string): Promise<boolean> {\n if (!isWithinRoot(root, destination)) {\n return false;\n }\n try {\n const [realRoot, realParent] = await Promise.all([\n fs.realpath(root),\n fs.realpath(path.dirname(destination))\n ]);\n return isWithinRoot(realRoot, realParent);\n } catch {\n return false;\n }\n}\n\nasync function copyFileExclusive(\n source: string,\n destination: string\n): Promise<'copied' | 'exists'> {\n const content = await fs.readFile(source);\n let handle: fs.FileHandle | null = null;\n try {\n handle = await fs.open(\n destination,\n constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY,\n 0o600\n );\n await handle.writeFile(content);\n return 'copied';\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'EEXIST') {\n return 'exists';\n }\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nfunction quotePowerShellString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction quotePosixString(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction resolveCommandPromptExecutable(): string {\n return process.env.ComSpec ?? 'cmd.exe';\n}\n\nfunction findExecutable(command: string): string | null {\n if (path.isAbsolute(command)) {\n return existsSync(command) ? command : null;\n }\n const pathValue = process.env.PATH ?? '';\n for (const directory of pathValue.split(path.delimiter)) {\n if (directory.length === 0) {\n continue;\n }\n const candidate = path.join(directory, command);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction launchDetached(command: string, args: string[], root: string): boolean {\n const child = spawn(command, args, {\n cwd: root,\n detached: true,\n stdio: 'ignore',\n windowsHide: process.platform === 'win32'\n });\n child.on('error', () => undefined);\n child.unref();\n return true;\n}\n\nfunction openTerminalAt(root: string): boolean {\n if (process.platform === 'win32') {\n return launchDetached(\n resolveCommandPromptExecutable(),\n [\n '/d',\n '/c',\n 'start',\n '\"\"',\n '/D',\n root,\n 'powershell.exe',\n '-NoExit',\n '-NoLogo',\n '-Command',\n `Set-Location -LiteralPath ${quotePowerShellString(root)}`\n ],\n root\n );\n }\n\n if (process.platform === 'darwin') {\n return launchDetached('open', ['-a', 'Terminal', root], root);\n }\n\n const configuredTerminal = process.env.TERMINAL?.trim();\n if (\n configuredTerminal !== undefined &&\n configuredTerminal.length > 0 &&\n isAllowedTerminalCommand(configuredTerminal) &&\n findExecutable(configuredTerminal) !== null\n ) {\n return launchDetached(configuredTerminal, [], root);\n }\n\n const linuxTerminals: Array<{ command: string; args: string[] }> = [\n { command: 'x-terminal-emulator', args: [] },\n { command: 'gnome-terminal', args: ['--working-directory', root] },\n { command: 'konsole', args: ['--workdir', root] },\n { command: 'xfce4-terminal', args: ['--working-directory', root] },\n {\n command: 'xterm',\n args: [\n '-e',\n 'sh',\n '-lc',\n `cd ${quotePosixString(root)} && exec ${quotePosixString(process.env.SHELL ?? 'sh')}`\n ]\n }\n ];\n\n const terminal = linuxTerminals.find((candidate) => findExecutable(candidate.command) !== null);\n if (terminal === undefined) {\n return false;\n }\n\n return launchDetached(terminal.command, terminal.args, root);\n}\n\nfunction handleDockerError(\n error: unknown,\n context: { json: (data: unknown, status: number) => Response }\n): Response {\n if (error instanceof DockerOperationError) {\n if (error.code === 'compose-not-found' || error.code === 'service-not-found') {\n return context.json({ error: error.message, code: error.code }, 404);\n }\n if (error.code === 'docker-not-installed' || error.code === 'docker-not-running') {\n return context.json({ error: error.message, code: error.code }, 503);\n }\n return context.json({ error: error.message, code: error.code }, 502);\n }\n throw error;\n}\n\nasync function onboardingForRoot(root: string) {\n const scan = await scanProject(root);\n const warnings = await runDoctor(root, scan);\n return buildOnboardingPlan(scan, warnings);\n}\n\n/**\n * Render the shareable Project Passport for a workspace. Inline by default so\n * it previews in a browser tab; `?download=1` sets an attachment filename.\n */\nasync function passportResponse(\n root: string,\n context: {\n req: { query: (name: string) => string | undefined };\n html: (body: string) => Response | Promise<Response>;\n header: (name: string, value: string) => void;\n }\n): Promise<Response> {\n const scan = await scanProject(root);\n const warnings = await runDoctor(root, scan);\n const plan = buildOnboardingPlan(scan, warnings);\n const html = renderPassportHtml({ scan, warnings, plan, version: DEV_SURFACE_VERSION });\n if (context.req.query('download') === '1') {\n const safeName = scan.projectName.replace(/[^a-zA-Z0-9._-]+/g, '-').slice(0, 60) || 'project';\n context.header('Content-Disposition', `attachment; filename=\"${safeName}-passport.html\"`);\n }\n return await context.html(html);\n}\n\n/**\n * Set one .env value (write-only). The response never includes the value —\n * only the key name and whether it was added or updated.\n */\nasync function handleEnvSet(\n root: string,\n body: { key?: unknown; value?: unknown } | null\n): Promise<{ status: 200 | 400; payload: Record<string, string> }> {\n if (body === null || typeof body.key !== 'string' || typeof body.value !== 'string') {\n return { status: 400, payload: { error: 'key and value are required.' } };\n }\n const scan = await scanProject(root);\n const result = await setEnvValue({\n root,\n localPath: scan.env?.localPath ?? null,\n key: body.key,\n value: body.value\n });\n if (!result.ok) {\n return { status: 400, payload: { error: result.error } };\n }\n return { status: 200, payload: { status: result.action, key: body.key } };\n}\n\nfunction registerWorkspaceRoutes(\n app: Hono,\n resolveWorkspace: (id: string) => Promise<{\n root: string;\n processManager: ProcessManager;\n dockerController: DockerController;\n } | null>\n): void {\n app.get('/api/workspaces/:id/project', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await scanProject(ws.root));\n });\n\n app.get('/api/workspaces/:id/health', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await runDoctor(ws.root));\n });\n\n app.get('/api/workspaces/:id/onboarding', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await onboardingForRoot(ws.root));\n });\n\n app.get('/api/workspaces/:id/passport', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return passportResponse(ws.root, context);\n });\n\n app.get('/api/workspaces/:id/processes', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.list());\n });\n\n app.get('/api/workspaces/:id/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.listLogs());\n });\n\n app.get('/api/workspaces/:id/docker/:service/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/start', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/stop', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/run/:script', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(ws.root);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: ws.root,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/workspaces/:id/install', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const command = await resolvePackageInstallCommand({\n cwd: ws.root,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/workspaces/:id/commands/:name', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(ws.root);\n const configuredCommand =\n scan.config?.config.commands?.[name] ?? scan.presetCommands[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(ws.root, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/workspaces/:id/open/folder', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n await open(ws.root);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/workspaces/:id/open/package', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const packagePath = path.join(ws.root, 'package.json');\n if (!(await realPathWithinRoot(ws.root, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/workspaces/:id/open/terminal', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const opened = openTerminalAt(ws.root);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/workspaces/:id/env/copy', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination = localPath ?? path.join(ws.root, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(ws.root, examplePath)) ||\n !(await writableDestinationWithinRoot(ws.root, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.post('/api/workspaces/:id/env/set', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const body = await context.req.json<{ key?: unknown; value?: unknown }>().catch(() => null);\n const result = await handleEnvSet(ws.root, body);\n return context.json(result.payload, result.status);\n });\n\n app.delete('/api/workspaces/:id/run/:pid', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = ws.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n\nexport function registerHubApiRoutes(\n app: Hono,\n options: {\n hub: Hub;\n mutationToken: string;\n }\n): void {\n const { hub } = options;\n registerMutationGuard(app, options.mutationToken);\n\n async function resolveWorkspace(id: string) {\n const entry = await hub.registry.resolve(id);\n if (!entry) return null;\n const runtime = hub.ensure(entry);\n return {\n root: runtime.root,\n processManager: runtime.processManager,\n dockerController: runtime.dockerController\n };\n }\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/workspaces', async (context) => {\n return context.json(await hub.listSummaries());\n });\n\n app.post('/api/workspaces', async (context) => {\n const body = await context.req.json<{ path: string }>().catch(() => null);\n if (!body?.path) {\n return context.json({ error: 'path is required.' }, 400);\n }\n try {\n const entry = await hub.registry.add(body.path);\n return context.json(entry, 201);\n } catch (error) {\n return context.json({ error: error instanceof Error ? error.message : 'Invalid path.' }, 400);\n }\n });\n\n app.delete('/api/workspaces/:id', async (context) => {\n const id = context.req.param('id');\n const runtime = hub.get(id);\n if (runtime) {\n runtime.processManager.killAll();\n }\n const removed = await hub.registry.remove(id);\n return context.json({ removed }, removed ? 200 : 404);\n });\n\n registerWorkspaceRoutes(app, resolveWorkspace);\n\n // Backward-compatible single-project aliases: proxy to the first workspace\n app.get('/api/project', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await scanProject(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/health', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await runDoctor(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/onboarding', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await onboardingForRoot(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/passport', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return passportResponse(hub.ensure(entries[0]).root, context);\n });\n\n app.get('/api/processes', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.list());\n });\n\n app.get('/api/logs', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.listLogs());\n });\n}\n\n// Legacy single-project API for backward compatibility with tests\nexport function registerApiRoutes(\n app: Hono,\n options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken: string;\n }\n): void {\n const dockerController =\n options.dockerController ?? new DockerComposeController(options.projectRoot);\n registerMutationGuard(app, options.mutationToken);\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/project', async (context) => {\n return context.json(await scanProject(options.projectRoot));\n });\n\n app.get('/api/health', async (context) => {\n return context.json(await runDoctor(options.projectRoot));\n });\n\n app.get('/api/onboarding', async (context) => {\n return context.json(await onboardingForRoot(options.projectRoot));\n });\n\n app.get('/api/passport', async (context) => {\n return passportResponse(options.projectRoot, context);\n });\n\n app.get('/api/processes', (context) => {\n return context.json(options.processManager.list());\n });\n\n app.get('/api/logs', (context) => {\n return context.json(options.processManager.listLogs());\n });\n\n app.get('/api/docker/:service/logs', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/start', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/stop', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/run/:script', async (context) => {\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(options.projectRoot);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/install', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const command = await resolvePackageInstallCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/commands/:name', async (context) => {\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(options.projectRoot);\n const configuredCommand =\n scan.config?.config.commands?.[name] ?? scan.presetCommands[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(options.projectRoot, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/open/folder', async (context) => {\n await open(options.projectRoot);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/open/package', async (context) => {\n const packagePath = path.join(options.projectRoot, 'package.json');\n if (!(await realPathWithinRoot(options.projectRoot, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/open/terminal', (context) => {\n const opened = openTerminalAt(options.projectRoot);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/env/copy', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination =\n localPath ?? path.join(options.projectRoot, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(options.projectRoot, examplePath)) ||\n !(await writableDestinationWithinRoot(options.projectRoot, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.post('/api/env/set', async (context) => {\n const body = await context.req.json<{ key?: unknown; value?: unknown }>().catch(() => null);\n const result = await handleEnvSet(options.projectRoot, body);\n return context.json(result.payload, result.status);\n });\n\n app.delete('/api/run/:pid', (context) => {\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = options.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n","/**\n * Write-only .env editing: set the value of a single key from the dashboard\n * without ever reading values back out. The API response and UI only ever see\n * key names and presence — values go in, never come out.\n */\n\nimport { constants, promises as fs } from 'node:fs';\nimport path from 'node:path';\n\n/** Standard dotenv-style key: letters, digits, underscores, not digit-first. */\nexport function isValidEnvKey(key: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(key) && key.length <= 128;\n}\n\n/**\n * A value must stay on one line and contain no control characters, so it can\n * never break the file structure or smuggle in extra keys.\n */\nexport function isValidEnvValue(value: string): boolean {\n if (value.length > 4096) {\n return false;\n }\n for (const character of value) {\n const code = character.codePointAt(0) ?? 0;\n if (code < 0x20 || code === 0x7f) {\n return false;\n }\n }\n return true;\n}\n\n/** Quote the value only when it needs it (spaces, #, or quotes). */\nfunction formatEnvLine(key: string, value: string): string {\n if (value === '' || /[\\s#'\"\\\\]/.test(value)) {\n const escaped = value.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"');\n return `${key}=\"${escaped}\"`;\n }\n return `${key}=${value}`;\n}\n\n/**\n * Pure content transform: replace the key's line if it exists (first match,\n * comments untouched), otherwise append it. Exported for tests.\n */\nexport function applyEnvValue(\n content: string,\n key: string,\n value: string\n): { content: string; action: 'updated' | 'added' } {\n const lines = content.split(/\\r?\\n/);\n const prefix = new RegExp(`^\\\\s*(?:export\\\\s+)?${key}\\\\s*=`);\n const index = lines.findIndex((line) => prefix.test(line));\n if (index >= 0) {\n lines[index] = formatEnvLine(key, value);\n return { content: lines.join('\\n'), action: 'updated' };\n }\n\n const body = content.length === 0 || content.endsWith('\\n') ? content : `${content}\\n`;\n return { content: `${body}${formatEnvLine(key, value)}\\n`, action: 'added' };\n}\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport type SetEnvResult = { ok: true; action: 'updated' | 'added' } | { ok: false; error: string };\n\n/**\n * Set one key in the project's local .env file, creating the file when it does\n * not exist yet. The file is created with owner-only permissions.\n */\nexport async function setEnvValue(options: {\n root: string;\n /** Path of the local env file from the scanner, or null to use root/.env. */\n localPath: string | null;\n key: string;\n value: string;\n}): Promise<SetEnvResult> {\n const { root, key, value } = options;\n if (!isValidEnvKey(key)) {\n return { ok: false, error: 'Invalid key name.' };\n }\n if (!isValidEnvValue(value)) {\n return { ok: false, error: 'Value must be a single line under 4096 characters.' };\n }\n\n const target = options.localPath ?? path.join(root, '.env');\n if (!isWithinRoot(root, target)) {\n return { ok: false, error: 'The env file must live inside the project.' };\n }\n try {\n const realParent = await fs.realpath(path.dirname(target));\n const realRoot = await fs.realpath(root);\n if (!isWithinRoot(realRoot, realParent)) {\n return { ok: false, error: 'The env file must live inside the project.' };\n }\n\n let current = '';\n try {\n current = await fs.readFile(target, 'utf8');\n } catch {\n // Missing file is fine — it will be created below.\n }\n const next = applyEnvValue(current, key, value);\n const handle = await fs.open(\n target,\n constants.O_CREAT | constants.O_WRONLY | constants.O_TRUNC,\n 0o600\n );\n try {\n await handle.writeFile(next.content, 'utf8');\n } finally {\n await handle.close();\n }\n return { ok: true, action: next.action };\n } catch {\n return { ok: false, error: 'Could not write the env file.' };\n }\n}\n","const LOCAL_HOSTNAMES = new Set(['127.0.0.1', 'localhost', '::1']);\n\nfunction hostnameFromHostHeader(host: string): string | null {\n const trimmed = host.trim().toLowerCase();\n if (trimmed.length === 0) {\n return null;\n }\n\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n return end > 0 ? trimmed.slice(1, end) : null;\n }\n\n return trimmed.split(':')[0] ?? null;\n}\n\nexport function isAllowedLocalHostHeader(host: string | null | undefined): boolean {\n if (typeof host !== 'string') {\n return false;\n }\n\n const hostname = hostnameFromHostHeader(host);\n return hostname !== null && LOCAL_HOSTNAMES.has(hostname);\n}\n\nexport function isAllowedLocalOrigin(origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n\n try {\n const url = new URL(origin);\n return (\n (url.protocol === 'http:' || url.protocol === 'https:') &&\n LOCAL_HOSTNAMES.has(url.hostname.toLowerCase())\n );\n } catch {\n return false;\n }\n}\n\nexport function isSameOrigin(requestUrl: string, origin: string): boolean {\n try {\n return new URL(requestUrl).origin === new URL(origin).origin;\n } catch {\n return false;\n }\n}\n","export const DEFAULT_HOST = '127.0.0.1';\nexport const DEFAULT_PORT = 4567;\n\nconst LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);\nconst CONTAINER_HOSTS = new Set(['0.0.0.0', '::']);\n\nexport function resolveHost(): string {\n const envHost = process.env.DEVSURFACE_HOST;\n if (!envHost) {\n return DEFAULT_HOST;\n }\n\n if (LOOPBACK_HOSTS.has(envHost)) {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost) && process.env.DEVSURFACE_CONTAINER === 'true') {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost)) {\n throw new Error(\n 'All-interface DevSurface binding is only allowed when DEVSURFACE_CONTAINER=true. DevSurface binds to 127.0.0.1 on bare metal.'\n );\n }\n\n throw new Error('DEVSURFACE_HOST must be a loopback host, or 0.0.0.0 inside a container.');\n}\n\nlet listenHost = DEFAULT_HOST;\n\nexport function setListenHost(host: string): void {\n listenHost = host;\n}\n\nexport function getListenHost(): string {\n return listenHost;\n}\n\nexport function resetListenHost(): void {\n listenHost = DEFAULT_HOST;\n}\n\nexport function normalizeRemoteAddress(raw: string | undefined): string | null {\n if (typeof raw !== 'string' || raw.length === 0) {\n return null;\n }\n\n if (raw.startsWith('::ffff:')) {\n return raw.slice('::ffff:'.length);\n }\n\n return raw;\n}\n\nexport function isLoopbackRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (address === '::1' || address === '127.0.0.1') {\n return true;\n }\n\n return address.startsWith('127.');\n}\n\nfunction parseIpv4(address: string): [number, number, number, number] | null {\n const parts = address.split('.');\n if (parts.length !== 4) {\n return null;\n }\n\n const octets = parts.map((part) => Number(part));\n if (octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255)) {\n return null;\n }\n\n return octets as [number, number, number, number];\n}\n\nexport function isPrivateRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (isLoopbackRemoteAddress(address)) {\n return true;\n }\n\n if (address.startsWith('fe80:')) {\n return true;\n }\n\n const ipv4 = parseIpv4(address);\n if (!ipv4) {\n return false;\n }\n\n const [a, b] = ipv4;\n if (a === 10) {\n return true;\n }\n if (a === 192 && b === 168) {\n return true;\n }\n if (a === 172 && b >= 16 && b <= 31) {\n return true;\n }\n\n return false;\n}\n\nexport function isAllowedRemoteAddress(raw: string | undefined, host: string): boolean {\n if (host === '0.0.0.0' || host === '::') {\n return isPrivateRemoteAddress(raw);\n }\n\n return isLoopbackRemoteAddress(raw);\n}\n\nexport function isAllowedClientConnection(\n raw: string | undefined,\n host: string = getListenHost()\n): boolean {\n if (raw === undefined) {\n return true;\n }\n\n return isAllowedRemoteAddress(raw, host);\n}\n\nexport function initializeListenHost(): string {\n const host = resolveHost();\n setListenHost(host);\n return host;\n}\n","import type { IncomingMessage } from 'node:http';\nimport type { Context, Next } from 'hono';\nimport { isAllowedLocalHostHeader } from './localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from './listenConfig.js';\n\nexport function remoteAddressFromRequest(request: IncomingMessage | undefined): string | undefined {\n return request?.socket?.remoteAddress;\n}\n\nexport function createRemoteAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n await next();\n };\n}\n\nexport function createApiAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const host = context.req.header('host') ?? new URL(context.req.url).host;\n if (!isAllowedLocalHostHeader(host)) {\n return context.json({ error: 'Non-local host rejected.' }, 403);\n }\n\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n\n await next();\n };\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport function createMutationToken(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function hasValidMutationToken(\n provided: string | null | undefined,\n expected: string\n): boolean {\n if (typeof provided !== 'string' || provided.length === 0) {\n return false;\n }\n\n if (provided.length !== expected.length) {\n return false;\n }\n\n return timingSafeEqual(Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8'));\n}\n","export function isAllowedTerminalCommand(command: string): boolean {\n return /^[A-Za-z0-9._+-]+$/.test(command);\n}\n","import type { Server } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../../core/types.js';\nimport { isAllowedLocalHostHeader, isAllowedLocalOrigin } from '../localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from '../listenConfig.js';\nimport { remoteAddressFromRequest } from '../accessControl.js';\n\nfunction isAllowedWebSocketRequest(request: IncomingMessage): boolean {\n const origin = request.headers.origin;\n const host = request.headers.host;\n const secFetchSite = request.headers['sec-fetch-site'];\n\n if (!isAllowedClientConnection(remoteAddressFromRequest(request), getListenHost())) {\n return false;\n }\n\n if (typeof host !== 'string' || !isAllowedLocalHostHeader(host)) {\n return false;\n }\n\n if (secFetchSite === 'cross-site') {\n return false;\n }\n\n if (typeof origin !== 'string') {\n return true;\n }\n\n if (!isAllowedLocalOrigin(origin)) {\n return false;\n }\n\n try {\n return new URL(origin).host.toLowerCase() === host.toLowerCase();\n } catch {\n return false;\n }\n}\n\nfunction workspaceIdFromUrl(url: string | undefined): string | null {\n if (!url) return null;\n try {\n const parsed = new URL(url, 'http://localhost');\n return parsed.searchParams.get('workspace');\n } catch {\n return null;\n }\n}\n\n// Legacy single-ProcessManager WebSocket (backward compat with tests)\nexport function setupWebSocket(server: Server, processManager: ProcessManager): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n function broadcast(payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(serialized);\n }\n }\n }\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcast({ type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcast({ type: 'process', process: processInfo });\n });\n\n wss.on('connection', (socket) => {\n socket.send(\n JSON.stringify({\n type: 'hello',\n processes: processManager.list(),\n logs: processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n\n// Hub-aware WebSocket: each connection is scoped to a workspace via ?workspace=<id>\nexport function setupHubWebSocket(server: Server, hub: Hub): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n const clientWorkspaces = new WeakMap<WebSocket, string>();\n const attachedManagers = new Set<string>();\n\n function attachManager(workspaceId: string, processManager: ProcessManager): void {\n if (attachedManagers.has(workspaceId)) {\n return;\n }\n attachedManagers.add(workspaceId);\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcastToWorkspace(workspaceId, { type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcastToWorkspace(workspaceId, { type: 'process', process: processInfo });\n });\n }\n\n function broadcastToWorkspace(workspaceId: string, payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN && clientWorkspaces.get(client) === workspaceId) {\n client.send(serialized);\n }\n }\n }\n\n wss.on('connection', async (socket, request) => {\n const workspaceId = workspaceIdFromUrl(request.url);\n if (!workspaceId) {\n socket.close(4000, 'Missing workspace query parameter.');\n return;\n }\n\n const entry = await hub.registry.resolve(workspaceId);\n if (!entry) {\n socket.close(4004, 'Workspace not found.');\n return;\n }\n\n const runtime = hub.ensure(entry);\n clientWorkspaces.set(socket, workspaceId);\n attachManager(workspaceId, runtime.processManager);\n\n socket.send(\n JSON.stringify({\n type: 'hello',\n workspace: workspaceId,\n processes: runtime.processManager.list(),\n logs: runtime.processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n","import { DEFAULT_HOST, DEFAULT_PORT } from '../../server/index.js';\n\nexport async function isHubRunning(port: number = DEFAULT_PORT): Promise<boolean> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/api/hub/status`, {\n signal: AbortSignal.timeout(2000)\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nexport async function registerWorkspaceRemotely(\n dirPath: string,\n port: number = DEFAULT_PORT\n): Promise<{ id: string; name: string } | null> {\n try {\n const sessionResponse = await fetch(`http://127.0.0.1:${port}/api/session`, {\n signal: AbortSignal.timeout(2000)\n });\n if (!sessionResponse.ok) return null;\n const session = (await sessionResponse.json()) as { token: string };\n\n const response = await fetch(`http://127.0.0.1:${port}/api/workspaces`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-DevSurface-Intent': 'dashboard',\n 'X-DevSurface-Token': session.token\n },\n body: JSON.stringify({ path: dirPath }),\n signal: AbortSignal.timeout(5000)\n });\n if (!response.ok) return null;\n return (await response.json()) as { id: string; name: string };\n } catch {\n return null;\n }\n}\n\nexport function dashboardUrl(\n workspaceId: string,\n port: number = DEFAULT_PORT,\n host: string = DEFAULT_HOST\n): string {\n const displayHost = host === '0.0.0.0' ? '127.0.0.1' : host;\n return `http://${displayHost}:${port}/?workspace=${workspaceId}`;\n}\n","import pc from 'picocolors';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\n\nexport async function serveCommand(options: {\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n console.log(pc.bold(`DevSurface Hub v${DEV_SURFACE_VERSION}`));\n console.log('Starting hub server...\\n');\n\n const server = await startHubServer({\n port: options.port,\n openBrowser: options.openBrowser\n });\n\n const summaries = await server.hub.listSummaries();\n if (summaries.length > 0) {\n console.log(`Registered workspaces: ${summaries.length}`);\n for (const ws of summaries) {\n console.log(` ${pc.cyan(ws.name)} -> ${ws.path}`);\n }\n } else {\n console.log(\n 'No workspaces registered yet. Use `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n }\n\n console.log(`\\nHub running at -> ${pc.cyan(server.url)}`);\n}\n","import path from 'node:path';\nimport pc from 'picocolors';\nimport { WorkspaceRegistry } from '../../core/hub/registry.js';\n\nexport async function workspaceAddCommand(dirPath?: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const target = path.resolve(dirPath ?? process.cwd());\n const entry = await registry.add(target);\n console.log(`Added workspace ${pc.cyan(entry.name)} (${entry.id}) -> ${entry.path}`);\n}\n\nexport async function workspaceListCommand(): Promise<void> {\n const registry = new WorkspaceRegistry();\n const entries = await registry.list();\n\n if (entries.length === 0) {\n console.log(\n 'No workspaces registered. Run `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n return;\n }\n\n console.log(`${entries.length} workspace${entries.length === 1 ? '' : 's'}:\\n`);\n for (const entry of entries) {\n console.log(` ${pc.cyan(entry.name)} (${entry.id})`);\n console.log(` ${entry.path}`);\n }\n}\n\nexport async function workspaceRemoveCommand(id: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const removed = await registry.remove(id);\n if (removed) {\n console.log(`Removed workspace ${pc.cyan(id)}.`);\n } else {\n console.error(`Workspace \"${id}\" not found.`);\n process.exitCode = 1;\n }\n}\n","const REGISTRY_LATEST_URL = 'https://registry.npmjs.org/devsurface/latest';\nconst UPDATE_CHECK_TIMEOUT_MS = 900;\n\nexport interface UpdateInfo {\n currentVersion: string;\n latestVersion: string;\n}\n\nfunction parseVersion(version: string): [number, number, number] | null {\n const match = version.match(/^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/);\n if (!match) {\n return null;\n }\n\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nexport function isNewerVersion(latestVersion: string, currentVersion: string): boolean {\n const latest = parseVersion(latestVersion);\n const current = parseVersion(currentVersion);\n if (latest === null || current === null) {\n return false;\n }\n\n for (let index = 0; index < latest.length; index += 1) {\n if (latest[index] > current[index]) {\n return true;\n }\n if (latest[index] < current[index]) {\n return false;\n }\n }\n\n return false;\n}\n\nexport function formatUpdateNotice(info: UpdateInfo): string {\n return `Update available: v${info.latestVersion}\\nRun: npx devsurface@latest`;\n}\n\nfunction shouldCheckForUpdates(): boolean {\n return process.env.DEVSURFACE_UPDATE_CHECK !== '0' && process.env.CI !== 'true';\n}\n\nexport async function checkForUpdate(\n currentVersion: string,\n fetchImpl: typeof fetch = fetch\n): Promise<UpdateInfo | null> {\n if (!shouldCheckForUpdates()) {\n return null;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), UPDATE_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetchImpl(REGISTRY_LATEST_URL, {\n headers: {\n accept: 'application/json'\n },\n signal: controller.signal\n });\n if (!response.ok) {\n return null;\n }\n\n const body = (await response.json()) as { version?: unknown };\n const latestVersion = typeof body.version === 'string' ? body.version : null;\n if (latestVersion === null || !isNewerVersion(latestVersion, currentVersion)) {\n return null;\n }\n\n return {\n currentVersion,\n latestVersion\n };\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function printUpdateNotice(currentVersion: string): Promise<void> {\n const update = await checkForUpdate(currentVersion);\n if (update !== null) {\n console.log(`\\n${formatUpdateNotice(update)}`);\n }\n}\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","fs","path","isWithinRoot","isWithinRoot","path","fs","platform","fs","path","fs","path","isWithinRoot","fs","path","isWithinRoot","fs","path","fs","path","isWithinRoot","spawn","fs","path","readIfPresent","isWithinRoot","path","fs","fs","readIfPresent","path","ESC","fs","path","pc","path","fs","pc","pc","warning","pc","fs","path","pc","spawn","runCommand","spawn","warning","path","fs","pc","pc","pc","pc","pc","pc","process","Buffer","path","promisify","fs","fsConstants","process","fs","process","os","fs","fs","fs","fs","process","os","fs","fs","process","promisify","process","execFile","process","process","promisify","execFile","execFileAsync","promisify","execFile","execFileAsync","execFileAsync","promisify","execFile","defaultBrowser","process","execFile","promisify","path","process","Buffer","defaultBrowser","fs","fsConstants","fs","path","fileURLToPath","spawn","fs","os","path","fs","path","isWithinRoot","path","os","fs","entry","constants","fs","path","spawn","constants","fs","path","isWithinRoot","handle","isWithinRoot","path","fs","handle","constants","spawn","workspaceId","fs","path","fileURLToPath","workspaceId","startCommand","pc","pc","pc","path","pc","path","pc","startCommand"]}