@boba-cli/machine 0.1.0-alpha.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/style/index.ts","../../src/node/archive.ts","../../src/node/clipboard.ts","../../src/node/environment.ts","../../src/node/filesystem.ts","../../src/node/path.ts","../../src/node/signals.ts","../../src/bytes.ts","../../src/node/terminal.ts","../../src/node/index.ts"],"names":["r","g","b","stat","resolve","require","createRequire","process"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pure JavaScript ANSI styling utility for terminal text.\n * Works identically in Node.js and browser/xterm.js contexts.\n */\n\nimport type { ColorSupport, StyleFn } from '../types.js'\n\n// ANSI escape codes\nconst ESC = '\\x1b['\nconst RESET = `${ESC}0m`\n\n// Modifier codes\nconst CODES = {\n // Modifiers (open, close)\n bold: ['1', '22'],\n dim: ['2', '22'],\n italic: ['3', '23'],\n underline: ['4', '24'],\n inverse: ['7', '27'],\n hidden: ['8', '28'],\n strikethrough: ['9', '29'],\n\n // Basic foreground colors (30-37)\n black: ['30', '39'],\n red: ['31', '39'],\n green: ['32', '39'],\n yellow: ['33', '39'],\n blue: ['34', '39'],\n magenta: ['35', '39'],\n cyan: ['36', '39'],\n white: ['37', '39'],\n\n // Bright foreground colors (90-97)\n blackBright: ['90', '39'],\n redBright: ['91', '39'],\n greenBright: ['92', '39'],\n yellowBright: ['93', '39'],\n blueBright: ['94', '39'],\n magentaBright: ['95', '39'],\n cyanBright: ['96', '39'],\n whiteBright: ['97', '39'],\n\n // Basic background colors (40-47)\n bgBlack: ['40', '49'],\n bgRed: ['41', '49'],\n bgGreen: ['42', '49'],\n bgYellow: ['43', '49'],\n bgBlue: ['44', '49'],\n bgMagenta: ['45', '49'],\n bgCyan: ['46', '49'],\n bgWhite: ['47', '49'],\n\n // Bright background colors (100-107)\n bgBlackBright: ['100', '49'],\n bgRedBright: ['101', '49'],\n bgGreenBright: ['102', '49'],\n bgYellowBright: ['103', '49'],\n bgBlueBright: ['104', '49'],\n bgMagentaBright: ['105', '49'],\n bgCyanBright: ['106', '49'],\n bgWhiteBright: ['107', '49'],\n} as const\n\ntype CodeName = keyof typeof CODES\n\n/**\n * Apply ANSI codes to text.\n * @param text - Text to style\n * @param open - Opening ANSI code\n * @param close - Closing ANSI code\n * @returns Styled text\n */\nfunction applyStyle(text: string, open: string, close: string): string {\n const openSeq = `${ESC}${open}m`\n const closeSeq = `${ESC}${close}m`\n\n // Replace any existing close codes with close+open to properly nest styles\n // This handles cases like style.bold(style.bold('text')) where the inner\n // bold close would prematurely end the outer bold\n const replaced = text.replace(\n new RegExp(closeSeq.replace(/[[\\](){}|^$+*?.\\\\]/g, '\\\\$&'), 'g'),\n closeSeq + openSeq,\n )\n\n return openSeq + replaced + closeSeq\n}\n\n/**\n * Convert hex color to RGB.\n * @param hex - Hex color string (with or without #)\n * @returns RGB array [r, g, b]\n */\nfunction hexToRgb(hex: string): [number, number, number] {\n const clean = hex.replace(/^#/, '')\n const num = parseInt(clean, 16)\n\n if (clean.length === 3) {\n // Short form: #RGB -> #RRGGBB\n const r = ((num >> 8) & 0xf) * 17\n const g = ((num >> 4) & 0xf) * 17\n const b = (num & 0xf) * 17\n return [r, g, b]\n }\n\n // Long form: #RRGGBB\n const r = (num >> 16) & 0xff\n const g = (num >> 8) & 0xff\n const b = num & 0xff\n return [r, g, b]\n}\n\n/**\n * Create a chainable style function.\n * @param colorSupport - Color support level information\n * @returns Chainable style function\n * @public\n */\nexport function createStyle(colorSupport: ColorSupport): StyleFn {\n const enabled = colorSupport.level > 0\n\n /**\n * Build a style function that can be chained.\n * @param stack - Array of [open, close] code pairs to apply\n * @returns Style function\n */\n function build(stack: Array<[string, string]>): StyleFn {\n // The function itself - applies all stacked styles\n const fn = (text: string): string => {\n if (!enabled || stack.length === 0) {\n return text\n }\n\n // Apply styles from inside out\n let result = text\n for (let i = stack.length - 1; i >= 0; i--) {\n const [open, close] = stack[i]!\n result = applyStyle(result, open, close)\n }\n return result\n }\n\n // Add all code-based style properties\n const codeNames = Object.keys(CODES) as CodeName[]\n for (const name of codeNames) {\n const [open, close] = CODES[name]\n Object.defineProperty(fn, name, {\n get() {\n return build([...stack, [open, close]])\n },\n })\n }\n\n // Add gray as alias for blackBright\n Object.defineProperty(fn, 'gray', {\n get() {\n const [open, close] = CODES.blackBright\n return build([...stack, [open, close]])\n },\n })\n\n // Add grey as alias for blackBright\n Object.defineProperty(fn, 'grey', {\n get() {\n const [open, close] = CODES.blackBright\n return build([...stack, [open, close]])\n },\n })\n\n // Add extended color methods\n\n // hex(color: string): StyleFn\n Object.defineProperty(fn, 'hex', {\n value: (color: string): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n const [r, g, b] = hexToRgb(color)\n return build([...stack, [`38;2;${r};${g};${b}`, '39']])\n },\n writable: true,\n })\n\n // rgb(r: number, g: number, b: number): StyleFn\n Object.defineProperty(fn, 'rgb', {\n value: (r: number, g: number, b: number): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n return build([...stack, [`38;2;${r};${g};${b}`, '39']])\n },\n writable: true,\n })\n\n // bgHex(color: string): StyleFn\n Object.defineProperty(fn, 'bgHex', {\n value: (color: string): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n const [r, g, b] = hexToRgb(color)\n return build([...stack, [`48;2;${r};${g};${b}`, '49']])\n },\n writable: true,\n })\n\n // bgRgb(r: number, g: number, b: number): StyleFn\n Object.defineProperty(fn, 'bgRgb', {\n value: (r: number, g: number, b: number): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n return build([...stack, [`48;2;${r};${g};${b}`, '49']])\n },\n writable: true,\n })\n\n // ansi256(code: number): StyleFn\n Object.defineProperty(fn, 'ansi256', {\n value: (code: number): StyleFn => {\n if (!enabled || !colorSupport.has256) {\n return build(stack)\n }\n return build([...stack, [`38;5;${code}`, '39']])\n },\n writable: true,\n })\n\n // bgAnsi256(code: number): StyleFn\n Object.defineProperty(fn, 'bgAnsi256', {\n value: (code: number): StyleFn => {\n if (!enabled || !colorSupport.has256) {\n return build(stack)\n }\n return build([...stack, [`48;5;${code}`, '49']])\n },\n writable: true,\n })\n\n return fn as StyleFn\n }\n\n return build([])\n}\n\n/**\n * Create a style function that always applies colors (for xterm.js).\n * @returns Chainable style function with full color support\n * @public\n */\nexport function createAlwaysEnabledStyle(): StyleFn {\n return createStyle({ level: 3, hasBasic: true, has256: true, has16m: true })\n}\n","/**\n * Node.js archive adapter using archiver and unzipper.\n */\n\nimport type { ArchiveAdapter } from '../types.js'\n\n/**\n * Node.js implementation of ArchiveAdapter.\n * Uses archiver for compression and unzipper for extraction.\n * @public\n */\nexport class NodeArchiveAdapter implements ArchiveAdapter {\n private readonly hasArchiver: boolean\n private readonly hasUnzipper: boolean\n\n /**\n * Create a new Node.js archive adapter.\n * Checks for availability of archiver and unzipper packages.\n */\n constructor() {\n this.hasArchiver = this.checkPackageAvailability('archiver')\n this.hasUnzipper = this.checkPackageAvailability('unzipper')\n }\n\n /**\n * Check if a package is available.\n * @param packageName - Package to check\n * @returns True if package can be imported\n */\n private checkPackageAvailability(packageName: string): boolean {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n require.resolve(packageName)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Check if archive operations are available.\n * @returns True if both archiver and unzipper are available\n */\n isAvailable(): boolean {\n return this.hasArchiver && this.hasUnzipper\n }\n\n /**\n * Create a zip archive from a directory.\n * @param sourceDir - Source directory to archive\n * @param destPath - Destination path for the zip file\n * @throws Error if archiver is not available or archiving fails\n */\n async zip(sourceDir: string, destPath: string): Promise<void> {\n if (!this.hasArchiver) {\n throw new Error(\n 'Archive operations not available: archiver package not found. Install with: pnpm add archiver',\n )\n }\n\n // Dynamic import to avoid bundling dependencies that may not be installed\n const archiver = await import('archiver')\n const { createWriteStream } = await import('node:fs')\n const { stat } = await import('node:fs/promises')\n const path = await import('node:path')\n\n return new Promise((resolve, reject) => {\n const outputStream = createWriteStream(destPath)\n const archive = archiver.default('zip', { zlib: { level: 9 } })\n\n outputStream.on('close', () => {\n resolve()\n })\n\n archive.on('error', (err: Error) => {\n reject(err)\n })\n\n archive.pipe(outputStream)\n\n // Check if source is a directory or file\n stat(sourceDir)\n .then((stats) => {\n if (stats.isDirectory()) {\n archive.directory(sourceDir, false)\n } else {\n archive.file(sourceDir, { name: path.basename(sourceDir) })\n }\n\n void archive.finalize()\n })\n .catch((err) => {\n reject(err)\n })\n })\n }\n\n /**\n * Extract a zip archive to a directory.\n * @param archivePath - Path to the zip file\n * @param destDir - Destination directory for extraction\n * @throws Error if unzipper is not available or extraction fails\n */\n async unzip(archivePath: string, destDir: string): Promise<void> {\n if (!this.hasUnzipper) {\n throw new Error(\n 'Archive operations not available: unzipper package not found. Install with: pnpm add unzipper',\n )\n }\n\n // Dynamic import to avoid bundling dependencies that may not be installed\n const unzipper = await import('unzipper')\n const { createReadStream } = await import('node:fs')\n\n return new Promise((resolve, reject) => {\n createReadStream(archivePath)\n .pipe(unzipper.Extract({ path: destDir }))\n .on('close', () => {\n resolve()\n })\n .on('error', (err: Error) => {\n reject(err)\n })\n })\n }\n}\n","import { createRequire } from 'node:module'\nimport type { ClipboardAdapter } from '../types.js'\n\nconst require = createRequire(import.meta.url)\n\n/**\n * Clipboard interface matching the clipboardy module.\n */\ninterface ClipboardModule {\n read(): Promise<string>\n write(text: string): Promise<void>\n}\n\n/**\n * Node.js clipboard adapter using the clipboardy package.\n * clipboardy is an optional peer dependency.\n * @public\n */\nexport class NodeClipboardAdapter implements ClipboardAdapter {\n private clipboard: ClipboardModule | null = null\n private available: boolean | null = null\n\n /**\n * Create a new Node.js clipboard adapter.\n * Optionally pass a pre-loaded clipboardy module for dependency injection.\n * @param clipboardModule - Optional pre-loaded clipboard module\n */\n constructor(clipboardModule?: ClipboardModule) {\n if (clipboardModule) {\n this.clipboard = clipboardModule\n this.available = true\n }\n }\n\n private async loadClipboard(): Promise<ClipboardModule | null> {\n // Don't try to load if we've already determined it's unavailable\n if (this.available === false) {\n return null\n }\n\n if (this.clipboard !== null) {\n return this.clipboard\n }\n\n try {\n // Dynamic import of optional peer dependency\n const module = (await import('clipboardy')) as {\n default: ClipboardModule\n }\n this.clipboard = module.default\n // Note: We set available=true here, but it may be set to false later if runtime fails\n // (e.g., clipboardy installed but xsel binary missing)\n this.available = true\n return this.clipboard\n } catch {\n this.available = false\n return null\n }\n }\n\n async read(): Promise<string> {\n const clipboard = await this.loadClipboard()\n if (!clipboard) {\n throw new Error(\n 'Clipboard not available. Install clipboardy: npm install clipboardy',\n )\n }\n try {\n return await clipboard.read()\n } catch {\n // Mark as unavailable when clipboardy fails at runtime (e.g., missing xsel binary)\n // This ensures isAvailable() returns false on subsequent checks\n this.available = false\n this.clipboard = null\n throw new Error(\n 'Clipboard not available. Install clipboardy: npm install clipboardy',\n )\n }\n }\n\n async write(text: string): Promise<void> {\n const clipboard = await this.loadClipboard()\n if (!clipboard) {\n throw new Error(\n 'Clipboard not available. Install clipboardy: npm install clipboardy',\n )\n }\n try {\n await clipboard.write(text)\n } catch {\n // Mark as unavailable when clipboardy fails at runtime (e.g., missing xsel binary)\n // This ensures isAvailable() returns false on subsequent checks\n this.available = false\n this.clipboard = null\n throw new Error(\n 'Clipboard not available. Install clipboardy: npm install clipboardy',\n )\n }\n }\n\n isAvailable(): boolean {\n // If we already checked, return cached result\n if (this.available !== null) {\n return this.available\n }\n\n // Try synchronous check first\n try {\n require.resolve('clipboardy')\n return true\n } catch {\n return false\n }\n }\n}\n","import process from 'node:process'\nimport { createRequire } from 'node:module'\nimport type {\n ColorSupport,\n EnvironmentAdapter,\n TerminalBackground,\n} from '../types.js'\n\nconst require = createRequire(import.meta.url)\n\n/**\n * Supports-color module interface.\n */\ninterface SupportsColorModule {\n stdout?: { level?: number } | false\n}\n\n/**\n * Node.js environment adapter.\n * Uses process.env and supports-color for environment detection.\n * @public\n */\nexport class NodeEnvironmentAdapter implements EnvironmentAdapter {\n private supportsColorModule: SupportsColorModule | null = null\n private colorSupportCached: ColorSupport | null = null\n private backgroundCached: TerminalBackground | null = null\n\n /**\n * Create a new Node.js environment adapter.\n * Optionally pass a pre-loaded supports-color module for dependency injection.\n * @param supportsColor - Optional pre-loaded supports-color module\n */\n constructor(supportsColor?: SupportsColorModule) {\n if (supportsColor) {\n this.supportsColorModule = supportsColor\n }\n }\n\n get(name: string): string | undefined {\n return process.env[name]\n }\n\n getColorSupport(): ColorSupport {\n if (this.colorSupportCached) {\n return this.colorSupportCached\n }\n\n const support = this.detectColorSupport()\n this.colorSupportCached = support\n return support\n }\n\n private detectColorSupport(): ColorSupport {\n // Try to use supports-color if available\n const module = this.loadSupportsColor()\n if (module) {\n const stdout = module.stdout\n if (stdout && typeof stdout.level === 'number') {\n const level = stdout.level\n return {\n level,\n hasBasic: level >= 1,\n has256: level >= 2,\n has16m: level >= 3,\n }\n }\n }\n\n // Fallback to environment variable detection\n return this.detectColorSupportFromEnv()\n }\n\n private loadSupportsColor(): SupportsColorModule | null {\n if (this.supportsColorModule !== null) {\n return this.supportsColorModule\n }\n\n try {\n // Dynamic require of optional peer dependency\n const module = require('supports-color') as SupportsColorModule\n this.supportsColorModule = module\n return module\n } catch {\n return null\n }\n }\n\n private detectColorSupportFromEnv(): ColorSupport {\n // Check COLORTERM for true color support\n const colorTerm = process.env.COLORTERM?.toLowerCase()\n if (colorTerm === 'truecolor' || colorTerm === '24bit') {\n return { level: 3, hasBasic: true, has256: true, has16m: true }\n }\n\n // Check TERM for 256 color support\n const term = process.env.TERM?.toLowerCase() ?? ''\n if (term.includes('256color') || term.includes('256-color')) {\n return { level: 2, hasBasic: true, has256: true, has16m: false }\n }\n\n // Check for basic color terminals\n if (\n term.includes('color') ||\n term.includes('ansi') ||\n term.includes('xterm') ||\n term.includes('vt100') ||\n term.includes('screen') ||\n term.includes('linux')\n ) {\n return { level: 1, hasBasic: true, has256: false, has16m: false }\n }\n\n // Check CI environments\n if (process.env.CI) {\n return { level: 1, hasBasic: true, has256: false, has16m: false }\n }\n\n // Check if we have a TTY\n if (process.stdout?.isTTY) {\n return { level: 1, hasBasic: true, has256: false, has16m: false }\n }\n\n // No color support detected\n return { level: 0, hasBasic: false, has256: false, has16m: false }\n }\n\n getTerminalBackground(): TerminalBackground {\n if (this.backgroundCached) {\n return this.backgroundCached\n }\n\n const background = this.detectTerminalBackground()\n this.backgroundCached = background\n return background\n }\n\n private detectTerminalBackground(): TerminalBackground {\n // COLORFGBG is the most reliable indicator when present\n // Format: \"fg;bg\" where bg < 7 typically means dark, bg >= 7 means light\n const colorFgBg = process.env.COLORFGBG\n if (colorFgBg) {\n const parts = colorFgBg.split(';')\n const bg = parseInt(parts[parts.length - 1] ?? '', 10)\n if (!isNaN(bg)) {\n // Standard ANSI colors: 0-6 are dark, 7+ (white) is light\n // 256-color: 0-7 dark, 8-15 bright versions\n return bg < 7 || (bg >= 8 && bg < 16 && bg !== 15) ? 'dark' : 'light'\n }\n }\n\n // Some terminals set TERM_BACKGROUND directly\n const termBackground = process.env.TERM_BACKGROUND?.toLowerCase()\n if (termBackground === 'dark' || termBackground === 'light') {\n return termBackground\n }\n\n // macOS Terminal.app and iTerm2 default to dark themes commonly\n const termProgram = process.env.TERM_PROGRAM ?? ''\n if (/iTerm/i.test(termProgram)) {\n // iTerm2's default is dark, but users can change it\n return 'dark'\n }\n\n // VS Code integrated terminal\n if (process.env.TERM_PROGRAM === 'vscode') {\n // VS Code defaults to matching the editor theme\n // Most devs use dark themes\n return 'dark'\n }\n\n return 'unknown'\n }\n}\n","import { copyFile, mkdir, readdir, readFile, rename, rm, rmdir, stat, unlink, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport process from 'node:process'\nimport type { DirectoryEntry, FileStat, FileSystemAdapter } from '../types.js'\n\n/**\n * Node.js directory entry implementation.\n * Wraps fs.Dirent from Node.js.\n * @internal\n */\nclass NodeDirectoryEntry implements DirectoryEntry {\n readonly name: string\n private readonly _isDirectory: boolean\n private readonly _isFile: boolean\n private readonly _isSymbolicLink: boolean\n\n constructor(name: string, isDirectory: boolean, isFile: boolean, isSymbolicLink: boolean) {\n this.name = name\n this._isDirectory = isDirectory\n this._isFile = isFile\n this._isSymbolicLink = isSymbolicLink\n }\n\n isDirectory(): boolean {\n return this._isDirectory\n }\n\n isFile(): boolean {\n return this._isFile\n }\n\n isSymbolicLink(): boolean {\n return this._isSymbolicLink\n }\n}\n\n/**\n * Node.js filesystem adapter.\n * Wraps Node.js fs/promises API for platform-agnostic file operations.\n * @public\n */\nexport class NodeFileSystemAdapter implements FileSystemAdapter {\n async readdir(path: string, options?: { withFileTypes?: boolean }): Promise<DirectoryEntry[] | string[]> {\n if (options?.withFileTypes) {\n const entries = await readdir(path, { withFileTypes: true })\n return entries.map(\n (entry) =>\n new NodeDirectoryEntry(\n entry.name,\n entry.isDirectory(),\n entry.isFile(),\n entry.isSymbolicLink(),\n ),\n )\n }\n\n return readdir(path)\n }\n\n async stat(path: string): Promise<FileStat> {\n const stats = await stat(path)\n return {\n size: stats.size,\n mode: stats.mode,\n mtime: stats.mtime,\n isDirectory: stats.isDirectory(),\n isFile: stats.isFile(),\n isSymbolicLink: stats.isSymbolicLink(),\n }\n }\n\n async readFile(path: string, encoding?: string): Promise<string> {\n return readFile(path, { encoding: (encoding ?? 'utf-8') as BufferEncoding })\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n await writeFile(path, content, 'utf-8')\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n await mkdir(path, { recursive: options?.recursive })\n }\n\n async unlink(path: string): Promise<void> {\n await unlink(path)\n }\n\n async rmdir(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void> {\n if (options?.recursive || options?.force) {\n // Use rm for recursive deletion or force option\n await rm(path, { recursive: options.recursive ?? false, force: options.force ?? false })\n } else {\n // Use rmdir for non-recursive deletion (throws for non-empty directories)\n await rmdir(path)\n }\n }\n\n async rename(src: string, dst: string): Promise<void> {\n await rename(src, dst)\n }\n\n async copyFile(src: string, dst: string): Promise<void> {\n await copyFile(src, dst)\n }\n\n cwd(): string {\n return process.cwd()\n }\n\n homedir(): string {\n return homedir()\n }\n}\n","import * as nodePath from 'node:path'\nimport type { PathAdapter } from '../types.js'\n\n/**\n * Node.js path adapter.\n * Wraps Node.js path module for platform-agnostic path operations.\n * @public\n */\nexport class NodePathAdapter implements PathAdapter {\n readonly sep = nodePath.sep\n\n join(...segments: string[]): string {\n return nodePath.join(...segments)\n }\n\n dirname(path: string): string {\n return nodePath.dirname(path)\n }\n\n basename(path: string, ext?: string): string {\n return nodePath.basename(path, ext)\n }\n\n extname(path: string): string {\n return nodePath.extname(path)\n }\n\n resolve(...segments: string[]): string {\n return nodePath.resolve(...segments)\n }\n\n isAbsolute(path: string): boolean {\n return nodePath.isAbsolute(path)\n }\n\n normalize(path: string): string {\n return nodePath.normalize(path)\n }\n}\n","import process from 'node:process'\nimport type { Disposable, SignalAdapter, SignalHandler } from '../types.js'\n\n/**\n * Node.js signal adapter for handling SIGINT, SIGTERM, etc.\n * @public\n */\nexport class NodeSignalAdapter implements SignalAdapter {\n private readonly interruptHandlers: Set<SignalHandler> = new Set()\n private readonly terminateHandlers: Set<SignalHandler> = new Set()\n private disposed = false\n\n private readonly handleInterrupt = (): void => {\n for (const handler of this.interruptHandlers) {\n handler()\n }\n }\n\n private readonly handleTerminate = (): void => {\n for (const handler of this.terminateHandlers) {\n handler()\n }\n }\n\n onInterrupt(handler: SignalHandler): Disposable {\n if (this.interruptHandlers.size === 0) {\n process.on('SIGINT', this.handleInterrupt)\n }\n this.interruptHandlers.add(handler)\n\n return {\n dispose: () => {\n this.interruptHandlers.delete(handler)\n if (this.interruptHandlers.size === 0) {\n process.off('SIGINT', this.handleInterrupt)\n }\n },\n }\n }\n\n onTerminate(handler: SignalHandler): Disposable {\n if (this.terminateHandlers.size === 0) {\n process.on('SIGTERM', this.handleTerminate)\n }\n this.terminateHandlers.add(handler)\n\n return {\n dispose: () => {\n this.terminateHandlers.delete(handler)\n if (this.terminateHandlers.size === 0) {\n process.off('SIGTERM', this.handleTerminate)\n }\n },\n }\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n process.off('SIGINT', this.handleInterrupt)\n process.off('SIGTERM', this.handleTerminate)\n\n this.interruptHandlers.clear()\n this.terminateHandlers.clear()\n }\n}\n","/**\n * Platform-agnostic byte utilities using Uint8Array.\n * These replace Node.js Buffer operations for cross-platform compatibility.\n */\n\n/** Shared TextEncoder instance for string encoding. */\nconst encoder = new TextEncoder()\n\n/** Shared TextDecoder instance for string decoding. */\nconst decoder = new TextDecoder('utf-8')\n\n/**\n * Encode a string to UTF-8 bytes.\n * Equivalent to `Buffer.from(text, 'utf8')`.\n * @param text - String to encode\n * @returns UTF-8 encoded bytes\n * @public\n */\nexport function encodeString(text: string): Uint8Array {\n return encoder.encode(text)\n}\n\n/**\n * Decode UTF-8 bytes to a string.\n * Equivalent to `buffer.toString('utf8')`.\n * @param bytes - Bytes to decode\n * @returns Decoded string\n * @public\n */\nexport function decodeString(bytes: Uint8Array): string {\n return decoder.decode(bytes)\n}\n\n/**\n * Get the byte length of a string when encoded as UTF-8.\n * Equivalent to `Buffer.byteLength(text, 'utf8')`.\n * @param text - String to measure\n * @returns Byte length\n * @public\n */\nexport function byteLength(text: string): number {\n return encoder.encode(text).length\n}\n\n/**\n * Concatenate multiple Uint8Arrays into one.\n * Equivalent to `Buffer.concat(arrays)`.\n * @param arrays - Arrays to concatenate\n * @returns Combined array\n * @public\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const arr of arrays) {\n result.set(arr, offset)\n offset += arr.length\n }\n return result\n}\n\n/**\n * Create a new Uint8Array of the specified size, filled with zeros.\n * Equivalent to `Buffer.alloc(size)`.\n * @param size - Size of the array\n * @returns New zero-filled array\n * @public\n */\nexport function allocBytes(size: number): Uint8Array {\n return new Uint8Array(size)\n}\n\n/**\n * Create a Uint8Array from an array of byte values.\n * Equivalent to `Buffer.from([...])`.\n * @param values - Byte values (0-255)\n * @returns New Uint8Array\n * @public\n */\nexport function fromBytes(values: number[]): Uint8Array {\n return new Uint8Array(values)\n}\n\n/**\n * Compare two Uint8Arrays for equality.\n * Equivalent to `buffer1.equals(buffer2)`.\n * @param a - First array\n * @param b - Second array\n * @returns True if arrays are equal\n * @public\n */\nexport function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if a byte array starts with a specific prefix.\n * @param bytes - Array to check\n * @param prefix - Prefix to look for\n * @returns True if bytes starts with prefix\n * @public\n */\nexport function startsWith(bytes: Uint8Array, prefix: Uint8Array): boolean {\n if (bytes.length < prefix.length) {\n return false\n }\n for (let i = 0; i < prefix.length; i++) {\n if (bytes[i] !== prefix[i]) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if a byte array starts with a specific string (UTF-8 encoded).\n * @param bytes - Array to check\n * @param prefix - String prefix to look for\n * @returns True if bytes starts with the encoded prefix\n * @public\n */\nexport function startsWithString(bytes: Uint8Array, prefix: string): boolean {\n return startsWith(bytes, encodeString(prefix))\n}\n\n/**\n * Find the index of a substring within a byte array.\n * Returns -1 if not found.\n * @param bytes - Array to search\n * @param needle - String to find\n * @param fromIndex - Start index (default 0)\n * @returns Index of first occurrence or -1\n * @public\n */\nexport function indexOfString(\n bytes: Uint8Array,\n needle: string,\n fromIndex: number = 0,\n): number {\n const needleBytes = encodeString(needle)\n const endIndex = bytes.length - needleBytes.length\n\n outer: for (let i = fromIndex; i <= endIndex; i++) {\n for (let j = 0; j < needleBytes.length; j++) {\n if (bytes[i + j] !== needleBytes[j]) {\n continue outer\n }\n }\n return i\n }\n return -1\n}\n\n/**\n * Decode the first complete UTF-8 character from a byte array.\n * Returns the character and its byte length, or null if incomplete.\n * @param bytes - Byte array to decode\n * @param offset - Start offset (default 0)\n * @returns Tuple of [character, byteLength] or [null, 0] if incomplete\n * @public\n */\nexport function decodeFirstRune(\n bytes: Uint8Array,\n offset: number = 0,\n): [string | null, number] {\n if (offset >= bytes.length) {\n return [null, 0]\n }\n\n const firstByte = bytes[offset]\n if (firstByte === undefined) {\n return [null, 0]\n }\n\n // Determine the byte length of this UTF-8 character\n let byteLen: number\n if ((firstByte & 0x80) === 0) {\n // Single byte character (ASCII)\n byteLen = 1\n } else if ((firstByte & 0xe0) === 0xc0) {\n // Two byte character\n byteLen = 2\n } else if ((firstByte & 0xf0) === 0xe0) {\n // Three byte character\n byteLen = 3\n } else if ((firstByte & 0xf8) === 0xf0) {\n // Four byte character\n byteLen = 4\n } else {\n // Invalid UTF-8 start byte, treat as single byte\n byteLen = 1\n }\n\n // Check if we have enough bytes\n if (offset + byteLen > bytes.length) {\n return [null, 0]\n }\n\n // Decode the character\n const slice = bytes.subarray(offset, offset + byteLen)\n const decoded = decoder.decode(slice)\n\n if (decoded.length === 0) {\n return [null, 0]\n }\n\n // Use codePointAt to properly handle surrogate pairs (emoji, etc.)\n // This returns the full Unicode code point, not just the first surrogate\n const codePoint = decoded.codePointAt(0)\n if (codePoint === undefined) {\n return [null, 0]\n }\n\n // Convert the code point back to a string (handles surrogate pairs correctly)\n const firstChar = String.fromCodePoint(codePoint)\n\n return [firstChar, byteLen]\n}\n\n/**\n * Slice a portion of a byte array.\n * Equivalent to `buffer.subarray(start, end)`.\n * @param bytes - Source array\n * @param start - Start index\n * @param end - End index (optional, defaults to length)\n * @returns New Uint8Array view of the slice\n * @public\n */\nexport function sliceBytes(\n bytes: Uint8Array,\n start: number,\n end?: number,\n): Uint8Array {\n return bytes.subarray(start, end)\n}\n\n/**\n * Create a copy of a byte array.\n * @param bytes - Array to copy\n * @returns New Uint8Array with copied data\n * @public\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return new Uint8Array(bytes)\n}\n","import process from 'node:process'\nimport { encodeString } from '../bytes.js'\nimport type {\n Disposable,\n InputHandler,\n ResizeHandler,\n TerminalAdapter,\n TerminalSize,\n} from '../types.js'\n\n/**\n * Node.js terminal adapter using stdin/stdout.\n * @public\n */\nexport class NodeTerminalAdapter implements TerminalAdapter {\n private rawModeEnabled = false\n private readonly inputHandlers: Set<InputHandler> = new Set()\n private readonly resizeHandlers: Set<ResizeHandler> = new Set()\n private disposed = false\n\n constructor(\n private readonly input: NodeJS.ReadableStream = process.stdin,\n private readonly output: NodeJS.WritableStream = process.stdout,\n ) {}\n\n private readonly handleData = (data: Buffer | string): void => {\n const bytes =\n typeof data === 'string' ? encodeString(data) : new Uint8Array(data)\n for (const handler of this.inputHandlers) {\n handler(bytes)\n }\n }\n\n private readonly handleResize = (): void => {\n const size = this.getSize()\n for (const handler of this.resizeHandlers) {\n handler(size)\n }\n }\n\n onInput(handler: InputHandler): Disposable {\n if (this.inputHandlers.size === 0) {\n this.input.on('data', this.handleData)\n this.input.resume()\n }\n this.inputHandlers.add(handler)\n\n return {\n dispose: () => {\n this.inputHandlers.delete(handler)\n if (this.inputHandlers.size === 0) {\n this.input.off('data', this.handleData)\n }\n },\n }\n }\n\n onResize(handler: ResizeHandler): Disposable {\n if (this.resizeHandlers.size === 0 && this.isWritableStream(this.output)) {\n this.output.on('resize', this.handleResize)\n }\n this.resizeHandlers.add(handler)\n\n return {\n dispose: () => {\n this.resizeHandlers.delete(handler)\n if (\n this.resizeHandlers.size === 0 &&\n this.isWritableStream(this.output)\n ) {\n this.output.off('resize', this.handleResize)\n }\n },\n }\n }\n\n write(data: string): void {\n if (data.length === 0) {\n return\n }\n this.output.write(data)\n }\n\n getSize(): TerminalSize {\n const stream = this.output as { columns?: number; rows?: number }\n return {\n columns: stream.columns ?? 80,\n rows: stream.rows ?? 24,\n }\n }\n\n enableRawMode(): void {\n const stream = this.input as NodeJS.ReadStream\n if (this.isTTY() && typeof stream.setRawMode === 'function') {\n stream.setRawMode(true)\n stream.resume()\n this.rawModeEnabled = true\n }\n }\n\n disableRawMode(): void {\n const stream = this.input as NodeJS.ReadStream\n if (this.rawModeEnabled && typeof stream.setRawMode === 'function') {\n stream.setRawMode(false)\n stream.pause()\n this.rawModeEnabled = false\n }\n }\n\n isTTY(): boolean {\n const stream = this.input as NodeJS.ReadStream\n return typeof stream.isTTY === 'boolean' && stream.isTTY\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n this.disableRawMode()\n\n this.input.off('data', this.handleData)\n if (this.isWritableStream(this.output)) {\n this.output.off('resize', this.handleResize)\n }\n\n this.inputHandlers.clear()\n this.resizeHandlers.clear()\n }\n\n private isWritableStream(\n stream: NodeJS.WritableStream,\n ): stream is NodeJS.WriteStream {\n return (\n 'on' in stream && typeof (stream as NodeJS.WriteStream).on === 'function'\n )\n }\n}\n","/**\n * Node.js platform adapters for \\@boba-cli/machine.\n * @packageDocumentation\n */\n\nimport type {\n ArchiveAdapter,\n ClipboardAdapter,\n Disposable,\n EnvironmentAdapter,\n FileSystemAdapter,\n PathAdapter,\n PlatformAdapter,\n SignalAdapter,\n StyleAdapter,\n TerminalAdapter,\n} from '../types.js'\nimport { createStyle } from '../style/index.js'\nimport { NodeArchiveAdapter } from './archive.js'\nimport { NodeClipboardAdapter } from './clipboard.js'\nimport { NodeEnvironmentAdapter } from './environment.js'\nimport { NodeFileSystemAdapter } from './filesystem.js'\nimport { NodePathAdapter } from './path.js'\nimport { NodeSignalAdapter } from './signals.js'\nimport { NodeTerminalAdapter } from './terminal.js'\n\nexport { NodeArchiveAdapter } from './archive.js'\nexport { NodeClipboardAdapter } from './clipboard.js'\nexport { NodeEnvironmentAdapter } from './environment.js'\nexport { NodeFileSystemAdapter } from './filesystem.js'\nexport { NodePathAdapter } from './path.js'\nexport { NodeSignalAdapter } from './signals.js'\nexport { NodeTerminalAdapter } from './terminal.js'\n\n/**\n * Options for creating a Node.js platform adapter.\n * @public\n */\nexport interface NodePlatformOptions {\n /** Custom input stream (default: process.stdin). */\n input?: NodeJS.ReadableStream\n /** Custom output stream (default: process.stdout). */\n output?: NodeJS.WritableStream\n}\n\n/**\n * Complete Node.js platform adapter.\n * Combines terminal, signal, clipboard, environment, filesystem, path, archive, and style adapters.\n * @public\n */\nexport class NodePlatformAdapter implements PlatformAdapter {\n readonly terminal: TerminalAdapter\n readonly signals: SignalAdapter\n readonly clipboard: ClipboardAdapter\n readonly environment: EnvironmentAdapter\n readonly filesystem: FileSystemAdapter\n readonly path: PathAdapter\n readonly archive: ArchiveAdapter\n readonly style: StyleAdapter\n\n private disposed = false\n private readonly disposables: Disposable[] = []\n\n /**\n * Create a new Node.js platform adapter.\n * @param options - Configuration options\n */\n constructor(options: NodePlatformOptions = {}) {\n const terminalAdapter = new NodeTerminalAdapter(\n options.input,\n options.output,\n )\n const signalAdapter = new NodeSignalAdapter()\n const clipboardAdapter = new NodeClipboardAdapter()\n const environmentAdapter = new NodeEnvironmentAdapter()\n const filesystemAdapter = new NodeFileSystemAdapter()\n const pathAdapter = new NodePathAdapter()\n const archiveAdapter = new NodeArchiveAdapter()\n\n // Create style adapter using environment's color support\n const colorSupport = environmentAdapter.getColorSupport()\n const styleAdapter: StyleAdapter = {\n style: createStyle(colorSupport),\n enabled: colorSupport.level > 0,\n level: colorSupport.level,\n }\n\n this.terminal = terminalAdapter\n this.signals = signalAdapter\n this.clipboard = clipboardAdapter\n this.environment = environmentAdapter\n this.filesystem = filesystemAdapter\n this.path = pathAdapter\n this.archive = archiveAdapter\n this.style = styleAdapter\n\n this.disposables.push(terminalAdapter, signalAdapter)\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n for (const disposable of this.disposables) {\n disposable.dispose()\n }\n }\n}\n\n/**\n * Create a Node.js platform adapter with default settings.\n * @param options - Configuration options\n * @returns A new platform adapter\n * @public\n */\nexport function createNodePlatform(\n options: NodePlatformOptions = {},\n): PlatformAdapter {\n return new NodePlatformAdapter(options)\n}\n"]}
@@ -0,0 +1,443 @@
1
+ /**
2
+ * Color support levels for terminal output.
3
+ * @public
4
+ */
5
+ interface ColorSupport {
6
+ /** The maximum color level supported (0-3). */
7
+ readonly level: number;
8
+ /** Whether basic 16-color support is available. */
9
+ readonly hasBasic: boolean;
10
+ /** Whether 256-color support is available. */
11
+ readonly has256: boolean;
12
+ /** Whether 16 million (true color) support is available. */
13
+ readonly has16m: boolean;
14
+ }
15
+ /**
16
+ * Terminal background mode.
17
+ * @public
18
+ */
19
+ type TerminalBackground = 'dark' | 'light' | 'unknown';
20
+ /**
21
+ * Terminal dimensions.
22
+ * @public
23
+ */
24
+ interface TerminalSize {
25
+ /** Width in columns. */
26
+ readonly columns: number;
27
+ /** Height in rows. */
28
+ readonly rows: number;
29
+ }
30
+ /**
31
+ * Disposable resource that can be cleaned up.
32
+ * @public
33
+ */
34
+ interface Disposable {
35
+ /** Dispose of the resource. */
36
+ dispose(): void;
37
+ }
38
+ /**
39
+ * Handler for terminal input data.
40
+ * @public
41
+ */
42
+ type InputHandler = (data: Uint8Array) => void;
43
+ /**
44
+ * Handler for terminal resize events.
45
+ * @public
46
+ */
47
+ type ResizeHandler = (size: TerminalSize) => void;
48
+ /**
49
+ * Handler for signals (SIGINT, SIGTERM, etc.).
50
+ * @public
51
+ */
52
+ type SignalHandler = () => void;
53
+ /**
54
+ * Terminal adapter interface for platform-agnostic terminal operations.
55
+ * @public
56
+ */
57
+ interface TerminalAdapter extends Disposable {
58
+ /**
59
+ * Subscribe to input data.
60
+ * @param handler - Callback to receive input as Uint8Array
61
+ * @returns Disposable to unsubscribe
62
+ */
63
+ onInput(handler: InputHandler): Disposable;
64
+ /**
65
+ * Subscribe to resize events.
66
+ * @param handler - Callback to receive new terminal size
67
+ * @returns Disposable to unsubscribe
68
+ */
69
+ onResize(handler: ResizeHandler): Disposable;
70
+ /**
71
+ * Write data to the terminal output.
72
+ * @param data - String data to write
73
+ */
74
+ write(data: string): void;
75
+ /**
76
+ * Get the current terminal size.
77
+ * @returns Current terminal dimensions
78
+ */
79
+ getSize(): TerminalSize;
80
+ /**
81
+ * Enable raw mode (no line buffering, no echo).
82
+ */
83
+ enableRawMode(): void;
84
+ /**
85
+ * Disable raw mode.
86
+ */
87
+ disableRawMode(): void;
88
+ /**
89
+ * Check if the terminal is a TTY.
90
+ * @returns True if the terminal is a TTY
91
+ */
92
+ isTTY(): boolean;
93
+ }
94
+ /**
95
+ * Signal adapter interface for handling OS signals.
96
+ * @public
97
+ */
98
+ interface SignalAdapter extends Disposable {
99
+ /**
100
+ * Subscribe to interrupt signals (SIGINT in Node, beforeunload in browser).
101
+ * @param handler - Callback to invoke on interrupt
102
+ * @returns Disposable to unsubscribe
103
+ */
104
+ onInterrupt(handler: SignalHandler): Disposable;
105
+ /**
106
+ * Subscribe to termination signals (SIGTERM in Node).
107
+ * @param handler - Callback to invoke on termination
108
+ * @returns Disposable to unsubscribe
109
+ */
110
+ onTerminate(handler: SignalHandler): Disposable;
111
+ }
112
+ /**
113
+ * Clipboard adapter interface for platform-agnostic clipboard operations.
114
+ * @public
115
+ */
116
+ interface ClipboardAdapter {
117
+ /**
118
+ * Read text from the clipboard.
119
+ * @returns Promise resolving to clipboard text
120
+ */
121
+ read(): Promise<string>;
122
+ /**
123
+ * Write text to the clipboard.
124
+ * @param text - Text to write
125
+ * @returns Promise resolving when complete
126
+ */
127
+ write(text: string): Promise<void>;
128
+ /**
129
+ * Check if clipboard operations are available.
130
+ * @returns True if clipboard is available
131
+ */
132
+ isAvailable(): boolean;
133
+ }
134
+ /**
135
+ * Environment adapter interface for platform-agnostic environment access.
136
+ * @public
137
+ */
138
+ interface EnvironmentAdapter {
139
+ /**
140
+ * Get an environment variable value.
141
+ * @param name - Variable name
142
+ * @returns Variable value or undefined
143
+ */
144
+ get(name: string): string | undefined;
145
+ /**
146
+ * Get color support level.
147
+ * @returns Color support information
148
+ */
149
+ getColorSupport(): ColorSupport;
150
+ /**
151
+ * Detect terminal background mode.
152
+ * @returns Background mode (dark, light, or unknown)
153
+ */
154
+ getTerminalBackground(): TerminalBackground;
155
+ }
156
+ /**
157
+ * File stat information returned by filesystem operations.
158
+ * @public
159
+ */
160
+ interface FileStat {
161
+ /** File size in bytes. */
162
+ readonly size: number;
163
+ /** Unix file mode (permissions). */
164
+ readonly mode: number;
165
+ /** Last modification time. */
166
+ readonly mtime: Date;
167
+ /** Whether this is a directory. */
168
+ readonly isDirectory: boolean;
169
+ /** Whether this is a regular file. */
170
+ readonly isFile: boolean;
171
+ /** Whether this is a symbolic link. */
172
+ readonly isSymbolicLink: boolean;
173
+ }
174
+ /**
175
+ * Directory entry returned by readdir with withFileTypes option.
176
+ * @public
177
+ */
178
+ interface DirectoryEntry {
179
+ /** Name of the file or directory. */
180
+ readonly name: string;
181
+ /** Check if this entry is a directory. */
182
+ isDirectory(): boolean;
183
+ /** Check if this entry is a regular file. */
184
+ isFile(): boolean;
185
+ /** Check if this entry is a symbolic link. */
186
+ isSymbolicLink(): boolean;
187
+ }
188
+ /**
189
+ * FileSystem adapter interface for platform-agnostic file operations.
190
+ * @public
191
+ */
192
+ interface FileSystemAdapter {
193
+ /**
194
+ * Read directory contents.
195
+ * @param path - Directory path
196
+ * @param options - Options for reading directory
197
+ * @returns Array of directory entries or file names
198
+ */
199
+ readdir(path: string, options?: {
200
+ withFileTypes?: boolean;
201
+ }): Promise<DirectoryEntry[] | string[]>;
202
+ /**
203
+ * Get file/directory stats.
204
+ * @param path - File or directory path
205
+ * @returns File stat information
206
+ */
207
+ stat(path: string): Promise<FileStat>;
208
+ /**
209
+ * Read file contents as text.
210
+ * @param path - File path
211
+ * @param encoding - Text encoding (default: 'utf-8')
212
+ * @returns File contents as string
213
+ */
214
+ readFile(path: string, encoding?: string): Promise<string>;
215
+ /**
216
+ * Write text to a file.
217
+ * @param path - File path
218
+ * @param content - Text content to write
219
+ * @returns Promise resolving when complete
220
+ */
221
+ writeFile(path: string, content: string): Promise<void>;
222
+ /**
223
+ * Check if a file or directory exists.
224
+ * @param path - File or directory path
225
+ * @returns True if the path exists
226
+ */
227
+ exists(path: string): Promise<boolean>;
228
+ /**
229
+ * Create a directory.
230
+ * @param path - Directory path
231
+ * @param options - Options for directory creation
232
+ * @returns Promise resolving when complete
233
+ */
234
+ mkdir(path: string, options?: {
235
+ recursive?: boolean;
236
+ }): Promise<void>;
237
+ /**
238
+ * Delete a file.
239
+ * @param path - File path
240
+ * @returns Promise resolving when complete
241
+ */
242
+ unlink(path: string): Promise<void>;
243
+ /**
244
+ * Remove a directory.
245
+ * @param path - Directory path
246
+ * @param options - Options for directory removal
247
+ * @returns Promise resolving when complete
248
+ */
249
+ rmdir(path: string, options?: {
250
+ recursive?: boolean;
251
+ force?: boolean;
252
+ }): Promise<void>;
253
+ /**
254
+ * Rename or move a file or directory.
255
+ * @param src - Source path
256
+ * @param dst - Destination path
257
+ * @returns Promise resolving when complete
258
+ */
259
+ rename(src: string, dst: string): Promise<void>;
260
+ /**
261
+ * Copy a file.
262
+ * @param src - Source file path
263
+ * @param dst - Destination file path
264
+ * @returns Promise resolving when complete
265
+ */
266
+ copyFile(src: string, dst: string): Promise<void>;
267
+ /**
268
+ * Get current working directory.
269
+ * @returns Current working directory path
270
+ */
271
+ cwd(): string;
272
+ /**
273
+ * Get user's home directory.
274
+ * @returns Home directory path
275
+ */
276
+ homedir(): string;
277
+ }
278
+ /**
279
+ * Path adapter interface for platform-agnostic path operations.
280
+ * @public
281
+ */
282
+ interface PathAdapter {
283
+ /**
284
+ * Join path segments.
285
+ * @param segments - Path segments to join
286
+ * @returns Joined path
287
+ */
288
+ join(...segments: string[]): string;
289
+ /**
290
+ * Get directory name from path.
291
+ * @param path - File or directory path
292
+ * @returns Directory name
293
+ */
294
+ dirname(path: string): string;
295
+ /**
296
+ * Get base name from path.
297
+ * @param path - File or directory path
298
+ * @param ext - Optional extension to remove
299
+ * @returns Base name
300
+ */
301
+ basename(path: string, ext?: string): string;
302
+ /**
303
+ * Get file extension.
304
+ * @param path - File path
305
+ * @returns Extension (including dot)
306
+ */
307
+ extname(path: string): string;
308
+ /**
309
+ * Resolve path segments to absolute path.
310
+ * @param segments - Path segments to resolve
311
+ * @returns Absolute path
312
+ */
313
+ resolve(...segments: string[]): string;
314
+ /**
315
+ * Check if path is absolute.
316
+ * @param path - Path to check
317
+ * @returns True if path is absolute
318
+ */
319
+ isAbsolute(path: string): boolean;
320
+ /**
321
+ * Normalize a path.
322
+ * @param path - Path to normalize
323
+ * @returns Normalized path
324
+ */
325
+ normalize(path: string): string;
326
+ /**
327
+ * Platform-specific path separator.
328
+ */
329
+ readonly sep: string;
330
+ }
331
+ /**
332
+ * Archive adapter interface for zip/unzip operations.
333
+ * @public
334
+ */
335
+ interface ArchiveAdapter {
336
+ /**
337
+ * Create a zip archive from a directory.
338
+ * @param sourceDir - Source directory to archive
339
+ * @param destPath - Destination path for the zip file
340
+ */
341
+ zip(sourceDir: string, destPath: string): Promise<void>;
342
+ /**
343
+ * Extract a zip archive to a directory.
344
+ * @param archivePath - Path to the zip file
345
+ * @param destDir - Destination directory for extraction
346
+ */
347
+ unzip(archivePath: string, destDir: string): Promise<void>;
348
+ /**
349
+ * Check if archive operations are available.
350
+ * @returns True if archiving is supported on this platform
351
+ */
352
+ isAvailable(): boolean;
353
+ }
354
+ /**
355
+ * Chainable style function for terminal text styling.
356
+ * @public
357
+ */
358
+ interface StyleFn {
359
+ (text: string): string;
360
+ readonly bold: StyleFn;
361
+ readonly dim: StyleFn;
362
+ readonly italic: StyleFn;
363
+ readonly underline: StyleFn;
364
+ readonly strikethrough: StyleFn;
365
+ readonly inverse: StyleFn;
366
+ readonly hidden: StyleFn;
367
+ readonly black: StyleFn;
368
+ readonly red: StyleFn;
369
+ readonly green: StyleFn;
370
+ readonly yellow: StyleFn;
371
+ readonly blue: StyleFn;
372
+ readonly magenta: StyleFn;
373
+ readonly cyan: StyleFn;
374
+ readonly white: StyleFn;
375
+ readonly gray: StyleFn;
376
+ readonly grey: StyleFn;
377
+ readonly blackBright: StyleFn;
378
+ readonly redBright: StyleFn;
379
+ readonly greenBright: StyleFn;
380
+ readonly yellowBright: StyleFn;
381
+ readonly blueBright: StyleFn;
382
+ readonly magentaBright: StyleFn;
383
+ readonly cyanBright: StyleFn;
384
+ readonly whiteBright: StyleFn;
385
+ readonly bgBlack: StyleFn;
386
+ readonly bgRed: StyleFn;
387
+ readonly bgGreen: StyleFn;
388
+ readonly bgYellow: StyleFn;
389
+ readonly bgBlue: StyleFn;
390
+ readonly bgMagenta: StyleFn;
391
+ readonly bgCyan: StyleFn;
392
+ readonly bgWhite: StyleFn;
393
+ readonly bgBlackBright: StyleFn;
394
+ readonly bgRedBright: StyleFn;
395
+ readonly bgGreenBright: StyleFn;
396
+ readonly bgYellowBright: StyleFn;
397
+ readonly bgBlueBright: StyleFn;
398
+ readonly bgMagentaBright: StyleFn;
399
+ readonly bgCyanBright: StyleFn;
400
+ readonly bgWhiteBright: StyleFn;
401
+ hex(color: string): StyleFn;
402
+ rgb(r: number, g: number, b: number): StyleFn;
403
+ bgHex(color: string): StyleFn;
404
+ bgRgb(r: number, g: number, b: number): StyleFn;
405
+ ansi256(code: number): StyleFn;
406
+ bgAnsi256(code: number): StyleFn;
407
+ }
408
+ /**
409
+ * Style adapter for platform-agnostic terminal styling.
410
+ * @public
411
+ */
412
+ interface StyleAdapter {
413
+ /** The chainable style function. */
414
+ readonly style: StyleFn;
415
+ /** Whether styling is enabled. */
416
+ readonly enabled: boolean;
417
+ /** Color support level (0-3). */
418
+ readonly level: number;
419
+ }
420
+ /**
421
+ * Complete platform adapter combining all platform-specific functionality.
422
+ * @public
423
+ */
424
+ interface PlatformAdapter extends Disposable {
425
+ /** Terminal I/O adapter. */
426
+ readonly terminal: TerminalAdapter;
427
+ /** Signal handling adapter. */
428
+ readonly signals: SignalAdapter;
429
+ /** Clipboard operations adapter. */
430
+ readonly clipboard: ClipboardAdapter;
431
+ /** Environment access adapter. */
432
+ readonly environment: EnvironmentAdapter;
433
+ /** FileSystem operations adapter. */
434
+ readonly filesystem: FileSystemAdapter;
435
+ /** Path operations adapter. */
436
+ readonly path: PathAdapter;
437
+ /** Archive operations adapter. */
438
+ readonly archive: ArchiveAdapter;
439
+ /** Style adapter for terminal text styling. */
440
+ readonly style: StyleAdapter;
441
+ }
442
+
443
+ export type { ArchiveAdapter as A, ColorSupport as C, DirectoryEntry as D, EnvironmentAdapter as E, FileStat as F, InputHandler as I, PathAdapter as P, ResizeHandler as R, StyleFn as S, TerminalAdapter as T, ClipboardAdapter as a, Disposable as b, FileSystemAdapter as c, PlatformAdapter as d, SignalAdapter as e, SignalHandler as f, StyleAdapter as g, TerminalBackground as h, TerminalSize as i };