@qodalis/cli-files 2.4.1 → 2.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/public-api.js +1 -1
- package/public-api.js.map +1 -1
- package/public-api.mjs +1 -1
- package/public-api.mjs.map +1 -1
- package/umd/index.global.js +1 -1
package/public-api.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/plugins/files/src/lib/interfaces/i-file-system-service.ts","../../packages/plugins/files/src/lib/version.ts","../../packages/plugins/files/src/lib/utils/split-args.ts","../../packages/plugins/files/src/lib/processors/cli-ls-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-cd-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-pwd-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-mkdir-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-rmdir-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-touch-command-processor.ts","../../packages/plugins/files/src/lib/utils/lines.ts","../../packages/plugins/files/src/lib/processors/cli-cat-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-echo-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-rm-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-cp-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-mv-command-processor.ts","../../packages/plugins/files/src/lib/utils/readable-children.ts","../../packages/plugins/files/src/lib/processors/cli-tree-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-head-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-tail-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-wc-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-find-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-grep-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-tac-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-basename-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-dirname-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-sort-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-uniq-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-cut-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-paste-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-tr-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-stat-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-chmod-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-chown-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-du-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-ln-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-sed-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-awk-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-diff-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-tee-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-xargs-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-sh-command-processor.ts","../../packages/plugins/files/src/lib/services/indexed-db-file-system.service.ts","../../packages/plugins/files/src/lib/services/server-file-system.service.ts","../../packages/plugins/files/src/lib/services/virtual-fs-file-transfer.service.ts","../../packages/plugins/files/src/lib/services/files-access.ts","../../packages/plugins/files/src/lib/completion/file-path-completion-provider.ts","../../packages/plugins/files/src/lib/processors/cli-upload-command-processor.ts","../../packages/plugins/files/src/public-api.ts"],"names":["DefaultLibraryAuthor","writeWrapped","writeUsage","writeExamples","CliForegroundColor","found","token","script","idx","i","j","DEFAULT_HOME","createSeedFileSystem","ICliFileTransferService_TOKEN"],"mappings":"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","file":"public-api.mjs","sourcesContent":["import { CliAccessAction, ICliOwnership, createCliToken } from '@qodalis/cli-core';\nimport { IFileNode } from './i-file-node';\n\nexport const IFileSystemService_TOKEN =\n createCliToken<IFileSystemService>('cli-file-system-service');\n\n/**\n * Decides whether the current principal may act on a node. Set by the files\n * module from the generic authorization layer (`cliCanAccess`); when no policy\n * is set (no auth module loaded) every operation is allowed.\n */\nexport interface CliFileAccessPolicy {\n /** rwx check on a file or directory */\n canAccess(node: IFileNode, action: CliAccessAction): boolean;\n /** May the principal chmod/chown this node (owner, or `files:chown` / `files:admin`) */\n canChangeOwnership(node: IFileNode, newOwnership?: ICliOwnership): boolean;\n}\n\n/**\n * Abstraction for virtual filesystem operations.\n */\nexport interface IFileSystemService {\n // Navigation\n getCurrentDirectory(): string;\n setCurrentDirectory(path: string): void;\n resolvePath(path: string): string;\n\n // Home directory (used for ~ resolution)\n getHomePath(): string;\n setHomePath(path: string): void;\n\n // User context (used for ownership defaults and permission checks)\n setCurrentUser(uid: string, groups: string[]): void;\n\n // Read operations\n getNode(path: string): IFileNode | null;\n listDirectory(path: string): IFileNode[];\n readFile(path: string): string | null;\n exists(path: string): boolean;\n isDirectory(path: string): boolean;\n\n // Write operations\n createDirectory(path: string, recursive?: boolean): void;\n createFile(path: string, content?: string): void;\n writeFile(path: string, content: string, append?: boolean): void;\n remove(path: string, recursive?: boolean): void;\n copy(src: string, dest: string, recursive?: boolean): void;\n move(src: string, dest: string): void;\n\n // Permissions\n chmod(path: string, permissions: string): void;\n chown(path: string, ownership: ICliOwnership): void;\n\n // Access control (optional; implementations without it are unrestricted)\n setAccessPolicy?(policy?: CliFileAccessPolicy): void;\n /** False when the current principal may not reach `path` (needs `x` on every parent) */\n canTraverse?(path: string): boolean;\n /** Run `fn` without access checks (system tasks such as creating home directories) */\n runAsSystem?<T>(fn: () => T): T;\n /**\n * System task (no access checks): give every node owned by `fromUid`\n * (case-insensitive) to `toUid`, e.g. after a user was renamed or deleted.\n * Returns the number of nodes changed.\n */\n reassignOwner?(fromUid: string, toUid: string): number;\n\n // Persistence\n initialize(): Promise<void>;\n persist(): Promise<void>;\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.4.1';\nexport const API_VERSION = 2;\n ","import { splitShellWords } from '@qodalis/cli-core';\n\n/**\n * Split command arguments like a shell, removing the quotes:\n * `\"my file.txt\" -n 'a b' x\\ y` -> `my file.txt`, `-n`, `a b`, `x y`.\n * (Commands can also read `command.positionals`, split the same way.)\n */\nexport function splitArgs(raw: string): string[] {\n return splitShellWords(raw);\n}\n","import {\n CliForegroundColor,\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport {\n IFileSystemService,\n IFileSystemService_TOKEN,\n IFileNode,\n} from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\nexport class CliLsCommandProcessor implements ICliCommandProcessor {\n command = 'ls';\n description = 'List directory contents';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📋', module: 'file management' };\n\n parameters = [\n {\n name: 'all',\n aliases: ['a'],\n description: 'Show hidden files (starting with .)',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'long',\n aliases: ['l'],\n description: 'Use long listing format',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'human-readable',\n aliases: ['h'],\n description: 'With -l, print sizes like 1.5K and 2M',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n const showAll = command.args['all'] || command.args['a'];\n const longFormat = command.args['long'] || command.args['l'];\n this.humanReadable = !!(command.args['human-readable'] || command.args['h']);\n const targets = paths.length > 0 ? paths : [fs.getCurrentDirectory()];\n // Down a pipe or into `$(...)`: one name per line, as a shell's ls\n const piped: string[] = [];\n\n targets.forEach((targetPath, index) => {\n try {\n const node = fs.getNode(targetPath);\n const entries =\n node && node.type !== 'directory'\n ? [{ ...node, name: targetPath }]\n : fs.listDirectory(targetPath);\n const filtered = showAll\n ? entries\n : entries.filter((e) => !e.name.startsWith('.'));\n\n if (targets.length > 1) {\n if (index > 0) context.writer.writeln();\n context.writer.writeln(`${targetPath}:`);\n }\n\n if (filtered.length === 0) {\n return;\n }\n\n filtered.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n if (longFormat) {\n this.writeLongFormat(filtered, context);\n } else {\n this.writeShortFormat(filtered, context);\n piped.push(...filtered.map((e) => e.name));\n }\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n });\n\n if (!longFormat && piped.length > 0) {\n context.process.output(piped.join('\\n'));\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n context.writer.writeln();\n context.writer.writeln('Usage: ls [path...] [-a|--all] [-l|--long] [-h|--human-readable]');\n }\n\n private writeLongFormat(\n entries: IFileNode[],\n context: ICliExecutionContext,\n ): void {\n const { writer } = context;\n for (const entry of entries) {\n const typeChar = entry.type === 'directory' ? 'd' : '-';\n const perms =\n entry.permissions ||\n (entry.type === 'directory' ? 'rwxr-xr-x' : 'rw-r--r--');\n const owner = entry.ownership?.uid || '-';\n const group = entry.ownership?.gid || '-';\n const size =\n entry.type !== 'file'\n ? '-'\n : this.humanReadable\n ? this.formatSize(entry.size)\n : entry.size.toString();\n const date = new Date(entry.modifiedAt);\n const dateStr = date.toLocaleDateString('en-US', {\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n const name =\n entry.type === 'directory'\n ? writer.wrapInColor(entry.name, CliForegroundColor.Cyan)\n : entry.name;\n\n writer.writeln(\n `${typeChar}${perms} ${owner.padEnd(8)} ${group.padEnd(8)} ${size.padStart(6)} ${dateStr} ${name}`,\n );\n }\n }\n\n private humanReadable = false;\n\n private formatSize(bytes: number): string {\n const units = ['K', 'M', 'G', 'T'];\n let size = bytes;\n let unit = '';\n for (const next of units) {\n if (size < 1024) break;\n size /= 1024;\n unit = next;\n }\n return unit ? `${size < 10 ? size.toFixed(1) : Math.round(size)}${unit}` : String(bytes);\n }\n\n private writeShortFormat(\n entries: IFileNode[],\n context: ICliExecutionContext,\n ): void {\n const { writer } = context;\n const names = entries.map((e) =>\n e.type === 'directory'\n ? writer.wrapInColor(e.name, CliForegroundColor.Cyan)\n : e.name,\n );\n writer.writeln(names.join(' '));\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\nexport class CliCdCommandProcessor implements ICliCommandProcessor {\n command = 'cd';\n description = 'Change the current working directory';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📁', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cd.help.change_current_directory_without', 'Change the current directory. Without a path it goes to your home directory. Paths can be absolute (/...), relative to where you are, or start with ~ for home.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cd', t.t('cli.cd.help.go_home_directory', 'Go to your home directory')],\n ['cd <dir>', t.t('cli.cd.help.go_directory', 'Go into a directory')],\n ['cd ..', t.t('cli.cd.help.go_up_one_level', 'Go up one level')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cd ~/docs', t.t('cli.cd.help.go_docs_home', 'Go to docs in your home')],\n ['cd ../projects', t.t('cli.cd.help.go_sibling_directory', 'Go to a sibling directory')],\n ['cd /', t.t('cli.cd.help.go_root', 'Go to the root')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const target = splitArgs(command.value || '').join(' ') || '~';\n\n try {\n fs.setCurrentDirectory(target);\n await fs.persist();\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliPwdCommandProcessor implements ICliCommandProcessor {\n command = 'pwd';\n description = 'Print the current working directory';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n metadata = { icon: '📂', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.pwd.help.print_full_path_directory', 'Print the full path of the directory you are in. Relative paths in other commands start from here.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['pwd', t.t('cli.pwd.help.show_current_directory', 'Show the current directory')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['pwd', t.t('cli.pwd.help.example_home_user', 'For example /home/user')],\n ['cd ~/docs; pwd', t.t('cli.pwd.help.prints_home_user_docs', 'Prints /home/user/docs')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n context.writer.writeln(fs.getCurrentDirectory());\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { splitArgs } from '../utils/split-args';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliMkdirCommandProcessor implements ICliCommandProcessor {\n command = 'mkdir';\n description = 'Create directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📁', module: 'file management' };\n\n parameters = [\n {\n name: 'parents',\n aliases: ['p'],\n description: 'Create parent directories as needed',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.mkdir.help.create_new_directory_p', 'Create a new directory. With -p, any missing parent directories are created too.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['mkdir <dir...>', t.t('cli.mkdir.help.create_one_more_directories', 'Create one or more directories')],\n ['mkdir -p <path>', t.t('cli.mkdir.help.create_directory_missing_parents', 'Create a directory and its missing parents')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['mkdir projects', t.t('cli.mkdir.help.create_projects_current_directory', 'Create projects in the current directory')],\n ['mkdir -p ~/docs/2026/notes', t.t('cli.mkdir.help.create_whole_path_once', 'Create the whole path at once')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n const recursive = command.args['parents'] || command.args['p'];\n\n if (paths.length === 0) {\n context.writer.writeError('mkdir: missing operand');\n return;\n }\n\n let changed = false;\n for (const path of paths) {\n try {\n if (recursive && fs.isDirectory(path)) continue;\n fs.createDirectory(path, recursive);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { splitArgs } from '../utils/split-args';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliRmdirCommandProcessor implements ICliCommandProcessor {\n command = 'rmdir';\n description = 'Remove empty directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🗑', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.rmdir.help.remove_empty_directory_refuses', 'Remove an empty directory. It refuses to remove a directory that still contains files; use rm -r for that.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['rmdir <dir...>', t.t('cli.rmdir.help.remove_empty_directories', 'Remove empty directories')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['rmdir empty-folder', t.t('cli.rmdir.help.remove_directory_current_one', 'Remove a directory in the current one')],\n ['rmdir ~/docs/old', t.t('cli.rmdir.help.remove_full_path', 'Remove by full path')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n\n if (paths.length === 0) {\n context.writer.writeError('rmdir: missing operand');\n return;\n }\n\n let changed = false;\n for (const path of paths) {\n try {\n const node = fs.getNode(path);\n if (!node) {\n context.writer.writeError(\n `rmdir: ${path}: No such file or directory`,\n );\n continue;\n }\n if (node.type !== 'directory') {\n context.writer.writeError(`rmdir: ${path}: Not a directory`);\n continue;\n }\n if (node.children && node.children.length > 0) {\n context.writer.writeError(\n `rmdir: ${path}: Directory not empty`,\n );\n continue;\n }\n // Checked empty above; the service removes directories only recursively\n fs.remove(path, true);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { splitArgs } from '../utils/split-args';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliTouchCommandProcessor implements ICliCommandProcessor {\n command = 'touch';\n description = 'Create an empty file or update its timestamp';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📄', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.touch.help.create_empty_file_update', 'Create an empty file, or update the modified time of a file that already exists. The parent directory must already exist.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['touch <file...>', t.t('cli.touch.help.create_files_refresh_their', 'Create the files, or refresh their timestamps')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['touch notes.txt', t.t('cli.touch.help.create_empty_notes_txt', 'Create an empty notes.txt')],\n ['touch ~/docs/todo.md', t.t('cli.touch.help.create_file_docs', 'Create a file in ~/docs')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n\n if (paths.length === 0) {\n context.writer.writeError('touch: missing file operand');\n return;\n }\n\n let changed = false;\n for (const path of paths) {\n try {\n fs.createFile(path);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n}\n","/**\n * The lines of a text, without the empty item that a final newline leaves:\n * `a\\nb\\n` -> `a`, `b`. An empty text has no lines.\n */\nexport function splitLines(content: string): string[] {\n if (content === '') return [];\n const lines = content.split('\\n');\n if (lines[lines.length - 1] === '') lines.pop();\n return lines;\n}\n\n/** Piped command data as text. */\nexport function pipedText(data: unknown): string {\n return typeof data === 'string' ? data : JSON.stringify(data);\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\nimport { pipedText } from '../utils/lines';\n\nexport class CliCatCommandProcessor implements ICliCommandProcessor {\n command = 'cat';\n description = 'Display file contents';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📖', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cat.help.print_contents_one_more', 'Print the contents of one or more files, joined in order, or of piped input. Pipe the output into other commands to search, sort or count it.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cat <file...>', t.t('cli.cat.help.print_files_one_after', 'Print files one after another')],\n ['cat <file> | <command>', t.t('cli.cat.help.send_file_another_command', 'Send a file to another command')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cat notes.txt', t.t('cli.cat.help.show_whole_file', 'Show the whole file')],\n ['cat app.log | grep error', t.t('cli.cat.help.show_only_lines_error', 'Show only lines with error')],\n ['cat names.txt | sort', t.t('cli.cat.help.print_lines_sorted', 'Print the lines sorted')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n\n if (paths.length === 0) {\n if (command.data != null) {\n context.writer.writeln(pipedText(command.data));\n return;\n }\n context.writer.writeError('cat: missing file operand');\n return;\n }\n\n // Concatenate the files in order; a missing one is reported and skipped\n let output = '';\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`cat: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `cat: ${path}: No such file or directory`,\n );\n continue;\n }\n output += content;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (output !== '') {\n context.writer.writeln(output.replace(/\\n$/, ''));\n }\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n joinShellWords,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliEchoCommandProcessor implements ICliCommandProcessor {\n command = 'echo';\n description = 'Display text or redirect output to a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n extendsProcessor = true;\n originalProcessor?: ICliCommandProcessor;\n metadata = { icon: '💬', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.echo.help.print_text_terminal_add', 'Print text to the terminal. Add > file to save it to a file (replacing it) or >> file to add it to the end.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['echo <text>', t.t('cli.echo.help.print_text', 'Print text')],\n ['echo <text> > <file>', t.t('cli.echo.help.write_text_file', 'Write text to a file')],\n ['echo <text> >> <file>', t.t('cli.echo.help.append_text_file', 'Append text to a file')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['echo Hello world', t.t('cli.echo.help.print_greeting', 'Print a greeting')],\n ['echo first line > notes.txt', t.t('cli.echo.help.create_replace_notes_txt', 'Create or replace notes.txt')],\n ['echo another line >> notes.txt', t.t('cli.echo.help.add_line', 'Add a line to it')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n // Redirects (`echo a > f`) are handled by the engine before this\n // runs: a `>` that reaches here was escaped or came from a variable or\n // `$(...)`, and is printed, never used to write a file\n if (this.originalProcessor) {\n await this.originalProcessor.processCommand(command, context);\n return;\n }\n const text = joinShellWords(command.value || '');\n context.writer.writeln(text);\n context.process.output(text);\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { splitArgs } from '../utils/split-args';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliRmCommandProcessor implements ICliCommandProcessor {\n command = 'rm';\n description = 'Remove files or directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🗑', module: 'file management' };\n\n parameters = [\n {\n name: 'recursive',\n aliases: ['r', 'R'],\n description: 'Remove directories and their contents recursively',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'force',\n aliases: ['f'],\n description: 'Ignore nonexistent files, never prompt',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.rm.help.delete_file_directories_only', 'Delete a file. Directories are only removed with -r, which deletes everything inside them. Deleted files cannot be recovered.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['rm <file...>', t.t('cli.rm.help.delete_one_more_files', 'Delete one or more files')],\n ['rm -r <dir>', t.t('cli.rm.help.delete_directory_contents', 'Delete a directory and its contents')],\n ['rm -f <file>', t.t('cli.rm.help.delete_without_error_if', 'Delete without an error if it is missing')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['rm notes.bak', t.t('cli.rm.help.delete_one_file', 'Delete one file')],\n ['rm -r old-project', t.t('cli.rm.help.delete_whole_directory', 'Delete a whole directory')],\n ['rm -f maybe.txt', t.t('cli.rm.help.quiet_if_file_does', 'Quiet if the file does not exist')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n const recursive =\n command.args['recursive'] || command.args['r'] || command.args['R'];\n const force = command.args['force'] || command.args['f'];\n\n if (paths.length === 0) {\n if (!force) context.writer.writeError('rm: missing operand');\n return;\n }\n\n let changed = false;\n for (const path of paths) {\n try {\n if (!fs.exists(path)) {\n if (!force) {\n context.writer.writeError(\n `rm: ${path}: No such file or directory`,\n );\n }\n continue;\n }\n\n if (fs.isDirectory(path) && !recursive) {\n context.writer.writeError(`rm: ${path}: Is a directory`);\n continue;\n }\n\n fs.remove(path, recursive);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliCpCommandProcessor implements ICliCommandProcessor {\n command = 'cp';\n description = 'Copy files and directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📋', module: 'file management' };\n\n parameters = [\n {\n name: 'recursive',\n aliases: ['r', 'R'],\n description: 'Copy directories recursively',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'force',\n aliases: ['f'],\n description: 'Overwrite existing files (always done; accepted for -rf)',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cp.help.copy_file_new_path', 'Copy a file to a new path, or into an existing directory. Copying a directory needs -r, which copies everything inside it. A file already at the destination is replaced.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cp <source> <dest>', t.t('cli.cp.help.copy_file_new_name', 'Copy a file to a new name')],\n ['cp <source...> <dir>', t.t('cli.cp.help.copy_files_directory', 'Copy files into a directory')],\n ['cp -r <dir> <dest>', t.t('cli.cp.help.copy_directory_contents', 'Copy a directory and its contents')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cp notes.txt notes.bak', t.t('cli.cp.help.make_backup_copy', 'Make a backup copy')],\n ['cp report.txt ~/docs', t.t('cli.cp.help.copy_docs', 'Copy into ~/docs')],\n ['cp -r project project-copy', t.t('cli.cp.help.duplicate_whole_directory', 'Duplicate a whole directory')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const recursive =\n command.args['recursive'] || command.args['r'] || command.args['R'];\n\n const parts = this.parseArgs(command);\n\n if (parts.length < 2) {\n context.writer.writeError('cp: missing destination file operand');\n context.writer.writeln(\n 'Usage: cp [--recursive] <source> <destination>',\n );\n return;\n }\n\n // Several sources go into the last operand, which must be a directory\n const dest = parts[parts.length - 1];\n const sources = parts.slice(0, -1);\n if (sources.length > 1 && !fs.isDirectory(dest)) {\n context.writer.writeError(`cp: target '${dest}' is not a directory`);\n return;\n }\n\n let changed = false;\n for (const src of sources) {\n try {\n fs.copy(src, dest, recursive);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n // Flags never reach the value, so a quoted `-name` is a file\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliMvCommandProcessor implements ICliCommandProcessor {\n command = 'mv';\n description = 'Move or rename files and directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📦', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.mv.help.move_rename_file_directory', 'Move or rename a file or directory. If the destination is an existing directory, the source is moved into it; otherwise it is renamed. A file already at the destination is replaced.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['mv <source> <dest>', t.t('cli.mv.help.rename_file_directory', 'Rename a file or directory')],\n ['mv <source...> <dir>', t.t('cli.mv.help.move_them_directory', 'Move them into a directory')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['mv draft.txt final.txt', t.t('cli.mv.help.rename_file', 'Rename a file')],\n ['mv final.txt ~/docs', t.t('cli.mv.help.move_docs', 'Move it into ~/docs')],\n ['mv old-dir new-dir', t.t('cli.mv.help.rename_directory', 'Rename a directory')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const parts = this.parseArgs(command);\n\n if (parts.length < 2) {\n context.writer.writeError('mv: missing destination file operand');\n context.writer.writeln('Usage: mv <source> <destination>');\n return;\n }\n\n // Several sources go into the last operand, which must be a directory\n const dest = parts[parts.length - 1];\n const sources = parts.slice(0, -1);\n if (sources.length > 1 && !fs.isDirectory(dest)) {\n context.writer.writeError(`mv: target '${dest}' is not a directory`);\n return;\n }\n\n let changed = false;\n for (const src of sources) {\n try {\n fs.move(src, dest);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n // Flags never reach the value, so a quoted `-name` is a file\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { isCliAccessDeniedError } from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService } from '../interfaces/i-file-system-service';\n\n/**\n * Children of a directory the current principal may list (`r` + `x`).\n * Recursive commands (find, tree, du, grep -r) walk through this so they\n * never reveal what is inside directories the user cannot read.\n * Returns `null` when listing is denied.\n */\nexport function readableChildren(fs: IFileSystemService, path: string): IFileNode[] | null {\n try {\n return fs.listDirectory(path);\n } catch (e) {\n if (isCliAccessDeniedError(e)) return null;\n throw e;\n }\n}\n","import { readableChildren } from '../utils/readable-children';\nimport {\n CliForegroundColor,\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport {\n IFileSystemService,\n IFileSystemService_TOKEN,\n IFileNode,\n} from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\nexport class CliTreeCommandProcessor implements ICliCommandProcessor {\n command = 'tree';\n description = 'Display directory tree structure';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '🌳', module: 'file management' };\n\n parameters = [\n {\n name: 'depth',\n aliases: ['L'],\n description: 'Max display depth of the directory tree',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tree.help.draw_directory_everything_below', 'Draw a directory and everything below it as a tree, directories first, followed by a count of directories and files. Defaults to the current directory.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['tree [dir]', t.t('cli.tree.help.show_whole_tree', 'Show the whole tree')],\n ['tree -L <n> [dir]', t.t('cli.tree.help.only_levels_deep', 'Only <n> levels deep')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['tree', t.t('cli.tree.help.tree_current_directory', 'Tree of the current directory')],\n ['tree ~/docs', t.t('cli.tree.help.tree_docs', 'Tree of ~/docs')],\n ['tree -L 2', t.t('cli.tree.help.top_two_levels_only', 'Top two levels only')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const targetPath =\n splitArgs(command.value || '').join(' ') || fs.getCurrentDirectory();\n const maxDepth = command.args['depth']\n ? parseInt(command.args['depth'])\n : command.args['L']\n ? parseInt(command.args['L'])\n : Infinity;\n\n try {\n const node = fs.getNode(targetPath);\n if (!node) {\n context.writer.writeError(\n `tree: ${targetPath}: No such file or directory`,\n );\n return;\n }\n if (node.type !== 'directory') {\n context.writer.writeError(\n `tree: ${targetPath}: Not a directory`,\n );\n return;\n }\n\n const resolvedPath = fs.resolvePath(targetPath);\n context.writer.writeln(\n context.writer.wrapInColor(\n resolvedPath,\n CliForegroundColor.Cyan,\n ),\n );\n\n const counts = { dirs: 0, files: 0 };\n this.fs = fs;\n this.printTree(node, '', true, 0, maxDepth, context, counts, resolvedPath);\n\n context.writer.writeln();\n context.writer.writeln(\n `${counts.dirs} directories, ${counts.files} files`,\n );\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n\n /** File system of the running command (listing goes through access checks) */\n private fs?: IFileSystemService;\n\n private printTree(\n node: IFileNode,\n prefix: string,\n isRoot: boolean,\n depth: number,\n maxDepth: number,\n context: ICliExecutionContext,\n counts: { dirs: number; files: number },\n path = '/',\n ): void {\n if (depth >= maxDepth) {\n return;\n }\n const visible = this.fs ? readableChildren(this.fs, path) : node.children;\n if (!visible) {\n return;\n }\n\n const children = [...visible].sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const isLast = i === children.length - 1;\n const connector = isLast ? '└── ' : '├── ';\n const childPrefix = isLast ? ' ' : '│ ';\n\n const displayName =\n child.type === 'directory'\n ? context.writer.wrapInColor(\n child.name,\n CliForegroundColor.Cyan,\n )\n : child.name;\n\n context.writer.writeln(`${prefix}${connector}${displayName}`);\n\n if (child.type === 'directory') {\n counts.dirs++;\n this.printTree(\n child,\n prefix + childPrefix,\n false,\n depth + 1,\n maxDepth,\n context,\n counts,\n path === '/' ? `/${child.name}` : `${path}/${child.name}`,\n );\n } else {\n counts.files++;\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText, splitLines } from '../utils/lines';\n\nexport class CliHeadCommandProcessor implements ICliCommandProcessor {\n command = 'head';\n description = 'Display the first lines of a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '⬆️', module: 'file management' };\n\n parameters = [\n {\n name: 'lines',\n aliases: ['n'],\n description: 'Number of lines to display (default: 10)',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.head.help.print_first_lines_file', 'Print the first lines of a file, 10 by default. Works on piped input too. With several files, each one gets a ==> name <== header.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['head <file>', t.t('cli.head.help.first_10_lines', 'First 10 lines')],\n ['head -n <count> <file>', t.t('cli.head.help.first_lines', 'First <count> lines')],\n ['<command> | head', t.t('cli.head.help.first_lines_piped_input', 'First lines of piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['head notes.txt', t.t('cli.head.help.show_start_file', 'Show the start of a file')],\n ['head -n 3 a.txt b.txt', t.t('cli.head.help.first_3_lines_each', 'First 3 lines of each file')],\n ['cat app.log | head -n 20', t.t('cli.head.help.first_20_lines_log', 'First 20 lines of the log')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n // `-n 5`, `--lines 5`, or the short form `-5`\n const countArg =\n command.args['lines'] ??\n command.args['n'] ??\n Object.keys(command.args).find((k) => /^\\d+$/.test(k));\n const parsedCount = parseInt(String(countArg ?? '10'), 10);\n const count = isNaN(parsedCount) ? 10 : Math.abs(parsedCount);\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const lines = splitLines(pipedText(command.data));\n const selected = lines.slice(0, count);\n if (selected.length > 0) {\n context.writer.writeln(selected.join('\\n'));\n }\n return;\n }\n context.writer.writeError('head: missing file operand');\n return;\n }\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`head: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) continue;\n\n if (paths.length > 1) {\n if (i > 0) context.writer.writeln();\n context.writer.writeln(`==> ${path} <==`);\n }\n\n const lines = splitLines(content);\n const selected = lines.slice(0, count);\n if (selected.length > 0) {\n context.writer.writeln(selected.join('\\n'));\n }\n } catch (e: any) {\n context.writer.writeError(`head: ${e.message}`);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText, splitLines } from '../utils/lines';\n\nexport class CliTailCommandProcessor implements ICliCommandProcessor {\n command = 'tail';\n description = 'Display the last lines of a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '⬇️', module: 'file management' };\n\n parameters = [\n {\n name: 'lines',\n aliases: ['n'],\n description: 'Number of lines to display (default: 10)',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tail.help.print_last_lines_file', 'Print the last lines of a file, 10 by default. Works on piped input too. With several files, each one gets a ==> name <== header.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['tail <file>', t.t('cli.tail.help.last_10_lines', 'Last 10 lines')],\n ['tail -n <count> <file>', t.t('cli.tail.help.last_lines', 'Last <count> lines')],\n ['<command> | tail', t.t('cli.tail.help.last_lines_piped_input', 'Last lines of piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['tail app.log', t.t('cli.tail.help.show_end_log', 'Show the end of a log')],\n ['tail -n 5 notes.txt', t.t('cli.tail.help.last_5_lines', 'Last 5 lines')],\n ['cat app.log | tail -n 20', t.t('cli.tail.help.last_20_lines_log', 'Last 20 lines of the log')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n // `-n 5`, `--lines 5`, or the short form `-5`\n const countArg =\n command.args['lines'] ??\n command.args['n'] ??\n Object.keys(command.args).find((k) => /^\\d+$/.test(k));\n const parsedCount = parseInt(String(countArg ?? '10'), 10);\n const count = isNaN(parsedCount) ? 10 : Math.abs(parsedCount);\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const lines = splitLines(pipedText(command.data));\n const selected = count > 0 ? lines.slice(-count) : [];\n if (selected.length > 0) {\n context.writer.writeln(selected.join('\\n'));\n }\n return;\n }\n context.writer.writeError('tail: missing file operand');\n return;\n }\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`tail: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) continue;\n\n if (paths.length > 1) {\n if (i > 0) context.writer.writeln();\n context.writer.writeln(`==> ${path} <==`);\n }\n\n const lines = splitLines(content);\n const selected = count > 0 ? lines.slice(-count) : [];\n if (selected.length > 0) {\n context.writer.writeln(selected.join('\\n'));\n }\n } catch (e: any) {\n context.writer.writeError(`tail: ${e.message}`);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText } from '../utils/lines';\n\nexport class CliWcCommandProcessor implements ICliCommandProcessor {\n command = 'wc';\n description = 'Print line, word, and character counts';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '#️⃣', module: 'file management' };\n\n parameters = [\n {\n name: 'lines',\n aliases: ['l'],\n description: 'Print only the line count',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'words',\n aliases: ['w'],\n description: 'Print only the word count',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'chars',\n aliases: ['c'],\n description: 'Print only the character count',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.wc.help.count_lines_words_characters', 'Count lines, words and characters in files or piped input. With several files, a total line is printed at the end.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['wc <file...>', t.t('cli.wc.help.lines_words_characters', 'Lines, words and characters')],\n ['wc -l <file>', t.t('cli.wc.help.only_line_count', 'Only the line count')],\n ['<command> | wc', t.t('cli.wc.help.count_piped_input', 'Count piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['wc notes.txt', t.t('cli.wc.help.all_three_counts', 'All three counts')],\n ['wc -l a.txt b.txt', t.t('cli.wc.help.line_counts_total', 'Line counts with a total')],\n [\n 'cat app.log | grep error | wc -l',\n t.t('cli.wc.help.how_many_lines_mention', 'How many lines mention error'),\n ],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const showLines =\n command.args['lines'] || command.args['l'] || false;\n const showWords =\n command.args['words'] || command.args['w'] || false;\n const showChars =\n command.args['chars'] || command.args['c'] || false;\n const showAll = !showLines && !showWords && !showChars;\n\n const paths = this.parsePaths(command);\n if (paths.length === 0) {\n if (command.data != null) {\n // Piped text loses its final newline on the way: restore it\n let content = pipedText(command.data);\n if (content !== '' && !content.endsWith('\\n')) content += '\\n';\n const { lineCount, wordCount, charCount } = this.count(content);\n\n const parts: string[] = [];\n if (showAll || showLines) parts.push(String(lineCount).padStart(8));\n if (showAll || showWords) parts.push(String(wordCount).padStart(8));\n if (showAll || showChars) parts.push(String(charCount).padStart(8));\n\n context.writer.writeln(parts.join(''));\n return;\n }\n context.writer.writeError('wc: missing file operand');\n return;\n }\n\n let totalLines = 0;\n let totalWords = 0;\n let totalChars = 0;\n\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`wc: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path) ?? '';\n const { lineCount, wordCount, charCount } = this.count(content);\n\n totalLines += lineCount;\n totalWords += wordCount;\n totalChars += charCount;\n\n const parts: string[] = [];\n if (showAll || showLines) parts.push(String(lineCount).padStart(8));\n if (showAll || showWords) parts.push(String(wordCount).padStart(8));\n if (showAll || showChars) parts.push(String(charCount).padStart(8));\n parts.push(` ${path}`);\n\n context.writer.writeln(parts.join(''));\n } catch (e: any) {\n context.writer.writeError(`wc: ${e.message}`);\n }\n }\n\n if (paths.length > 1) {\n const parts: string[] = [];\n if (showAll || showLines) parts.push(String(totalLines).padStart(8));\n if (showAll || showWords) parts.push(String(totalWords).padStart(8));\n if (showAll || showChars) parts.push(String(totalChars).padStart(8));\n parts.push(' total');\n context.writer.writeln(parts.join(''));\n }\n }\n\n /** Counts like Unix wc: lines are newline characters. */\n private count(content: string): {\n lineCount: number;\n wordCount: number;\n charCount: number;\n } {\n return {\n lineCount: (content.match(/\\n/g) ?? []).length,\n wordCount: content.trim() === '' ? 0 : content.trim().split(/\\s+/).length,\n charCount: content.length,\n };\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport { readableChildren } from '../utils/readable-children';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport {\n IFileSystemService,\n IFileSystemService_TOKEN,\n IFileNode,\n} from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliFindCommandProcessor implements ICliCommandProcessor {\n command = 'find';\n description = 'Search for files and directories by name or type';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '🔍', module: 'file management' };\n\n parameters = [\n {\n name: 'name',\n description: 'Match filename pattern (glob: * and ? supported), case-sensitive',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'iname',\n description: 'Like --name, but case-insensitive',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'type',\n description: 'Filter by type: f (file) or d (directory)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'maxdepth',\n description: 'Maximum depth: 0 is only the start path, 1 its direct children',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.find.help.list_files_directories_under', 'List files and directories under a path (the current directory by default), searching all subdirectories. The start path itself is listed first. Filter by name with a glob pattern (* and ?; --name is case-sensitive, --iname is not) or by type.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['find [path]', t.t('cli.find.help.list_everything_under_path', 'List everything under a path')],\n ['find [path] --name <pattern>', t.t('cli.find.help.match_names_against_glob', 'Match names against a glob')],\n ['find [path] --iname <pattern>', t.t('cli.find.help.same_ignoring_case', 'Same, ignoring case')],\n ['find [path] --type f|d', t.t('cli.find.help.only_files_f_directories', 'Only files (f) or directories (d)')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['find ~/docs', t.t('cli.find.help.list_everything_docs', 'List everything in ~/docs')],\n ['find . --name \"*.txt\"', t.t('cli.find.help.find_all_txt_files', 'Find all .txt files')],\n ['find . --type d --maxdepth 1', t.t('cli.find.help.directories_near_top', 'Directories near the top')],\n ['find . --name \"*.tmp\" | xargs rm', t.t('cli.find.help.delete_all_tmp_files', 'Delete all .tmp files')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const searchPath = this.parseSearchPath(command) || fs.getCurrentDirectory();\n const typeFilter = command.args['type'] || null;\n const maxDepthArg = command.args['maxdepth'];\n const parsedDepth = parseInt(String(maxDepthArg ?? ''), 10);\n const maxDepth =\n maxDepthArg != null && maxDepthArg !== true && !isNaN(parsedDepth)\n ? parsedDepth\n : Infinity;\n\n try {\n const node = fs.getNode(searchPath);\n if (!node) {\n context.writer.writeError(\n `find: '${searchPath}': No such file or directory`,\n );\n return;\n }\n const resolvedBase = fs.resolvePath(searchPath);\n const nameRegex = this.nameRegex(command);\n\n const results: string[] = [];\n this.fs = fs;\n\n // The start path is at depth 0, as in GNU find\n const baseName = resolvedBase.split('/').filter(Boolean).pop() ?? '/';\n if (this.matches(baseName, node.type, nameRegex, typeFilter)) {\n results.push(resolvedBase);\n }\n if (node.type === 'directory' && maxDepth > 0) {\n this.walk(\n node,\n resolvedBase,\n 1,\n maxDepth,\n nameRegex,\n typeFilter,\n results,\n );\n }\n\n for (const r of results) {\n context.writer.writeln(r);\n }\n } catch (e: any) {\n context.writer.writeError(`find: ${e.message}`);\n }\n }\n\n /** `--name` matches case-sensitively, `--iname` ignoring case. */\n private nameRegex(command: CliProcessCommand): RegExp | null {\n const name = command.args['name'];\n if (name != null && name !== true) {\n return this.globToRegex(String(name), false);\n }\n const iname = command.args['iname'];\n if (iname != null && iname !== true) {\n return this.globToRegex(String(iname), true);\n }\n return null;\n }\n\n private matches(\n name: string,\n type: string,\n nameRegex: RegExp | null,\n typeFilter: string | null,\n ): boolean {\n if (nameRegex && !nameRegex.test(name)) return false;\n if (typeFilter === 'f' && type !== 'file') return false;\n if (typeFilter === 'd' && type !== 'directory') return false;\n return true;\n }\n\n private parseSearchPath(command: CliProcessCommand): string | null {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n return tokens.length > 0 ? tokens[0] : null;\n }\n\n private globToRegex(pattern: string, ignoreCase: boolean): RegExp {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexStr = escaped.replace(/\\*/g, '.*').replace(/\\?/g, '.');\n return new RegExp(`^${regexStr}$`, ignoreCase ? 'i' : '');\n }\n\n /** File system of the running command (listing goes through access checks) */\n private fs?: IFileSystemService;\n\n /** Lists the children of `node`, which are at `depth` (1 = direct children). */\n private walk(\n node: IFileNode,\n currentPath: string,\n depth: number,\n maxDepth: number,\n nameRegex: RegExp | null,\n typeFilter: string | null,\n results: string[],\n ): void {\n const children = this.fs ? readableChildren(this.fs, currentPath) : node.children;\n if (!children) return;\n\n for (const child of children) {\n const childPath =\n currentPath === '/'\n ? `/${child.name}`\n : `${currentPath}/${child.name}`;\n\n if (this.matches(child.name, child.type, nameRegex, typeFilter)) {\n results.push(childPath);\n }\n\n if (child.type === 'directory' && depth < maxDepth) {\n this.walk(\n child,\n childPath,\n depth + 1,\n maxDepth,\n nameRegex,\n typeFilter,\n results,\n );\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport { readableChildren } from '../utils/readable-children';\nimport {\n CliForegroundColor,\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport {\n IFileSystemService,\n IFileSystemService_TOKEN,\n IFileNode,\n} from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitLines } from '../utils/lines';\n\nexport class CliGrepCommandProcessor implements ICliCommandProcessor {\n command = 'grep';\n description = 'Search file contents for a pattern';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '🔎', module: 'file management' };\n\n parameters = [\n {\n name: 'ignore-case',\n aliases: ['i'],\n description: 'Case-insensitive matching',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'recursive',\n aliases: ['r', 'R'],\n description: 'Recursively search directories',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'line-number',\n aliases: ['n'],\n description: 'Show line numbers',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'count',\n aliases: ['c'],\n description: 'Show only a count of matching lines per file',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'quiet',\n aliases: ['q'],\n description: 'Print nothing; only the exit status tells whether a line matched',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'files-with-matches',\n aliases: ['l'],\n description: 'Show only filenames containing matches',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'invert-match',\n aliases: ['v'],\n description: 'Select non-matching lines',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'word-regexp',\n aliases: ['w'],\n description: 'Match only whole words',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'only-matching',\n aliases: ['o'],\n description: 'Print only the matched parts, one per line',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'extended-regexp',\n aliases: ['E'],\n description: 'Extended regular expressions (patterns always are)',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.grep.help.print_lines_match_pattern', 'Print the lines that match a pattern. The pattern is a regular expression, matches are highlighted, and the input can be files, directories (with -r) or piped text.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['grep <pattern> <file...>', t.t('cli.grep.help.search_one_more_files', 'Search one or more files')],\n ['grep -r <pattern> <dir>', t.t('cli.grep.help.search_every_file_under', 'Search every file under a directory')],\n ['<command> | grep <pattern>', t.t('cli.grep.help.filter_piped_input', 'Filter piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['grep -i error app.log', t.t('cli.grep.help.case_insensitive_search', 'Case-insensitive search')],\n ['grep -r -n TODO src', t.t('cli.grep.help.find_todos_line_numbers', 'Find TODOs with line numbers')],\n ['grep -v ^# config.txt', t.t('cli.grep.help.hide_comment_lines', 'Hide comment lines')],\n ['cat app.log | grep -c ERROR', t.t('cli.grep.help.count_matching_lines', 'Count matching lines')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const ignoreCase =\n command.args['ignore-case'] || command.args['i'] || false;\n const recursive =\n command.args['recursive'] ||\n command.args['r'] ||\n command.args['R'] ||\n false;\n const showLineNum =\n command.args['line-number'] || command.args['n'] || false;\n const countOnly =\n command.args['count'] || command.args['c'] || false;\n const filesOnly =\n command.args['files-with-matches'] || command.args['l'] || false;\n const invert =\n command.args['invert-match'] || command.args['v'] || false;\n\n const wordRegexp =\n command.args['word-regexp'] || command.args['w'] || false;\n const onlyMatching =\n command.args['only-matching'] || command.args['o'] || false;\n const quiet = command.args['quiet'] || command.args['q'] || false;\n\n const { pattern, paths } = this.parseArgs(command);\n if (!pattern) {\n context.writer.writeError(\n 'grep: missing pattern. Usage: grep [options] <pattern> <file>',\n );\n context.process.exit(2, { silent: true });\n return;\n }\n let regex: RegExp;\n try {\n const source = wordRegexp ? `(?<!\\\\w)(?:${pattern})(?!\\\\w)` : pattern;\n regex = new RegExp(source, ignoreCase ? 'gi' : 'g');\n } catch {\n context.writer.writeError(`grep: invalid pattern '${pattern}'`);\n context.process.exit(2, { silent: true });\n return;\n }\n if (paths.length === 0) {\n if (command.data != null) {\n const content = typeof command.data === 'string'\n ? command.data\n : JSON.stringify(command.data);\n const found = this.grepContent(content, null, regex, {\n ignoreCase, showLineNum, countOnly, filesOnly, invert, onlyMatching, quiet,\n }, context, false);\n this.exitStatus(context, found, false);\n return;\n }\n context.writer.writeError(\n 'grep: missing file operand. Usage: grep [options] <pattern> <file>',\n );\n context.process.exit(2, { silent: true });\n return;\n }\n\n const filePaths: string[] = [];\n let failed = false;\n for (const p of paths) {\n try {\n if (!fs.exists(p)) {\n context.writer.writeError(\n `grep: ${p}: No such file or directory`,\n );\n failed = true;\n continue;\n }\n if (fs.isDirectory(p)) {\n if (!recursive) {\n context.writer.writeError(\n `grep: ${p}: Is a directory`,\n );\n failed = true;\n continue;\n }\n this.collectFiles(fs, fs.resolvePath(p), fs.getNode(p)!, filePaths);\n } else {\n filePaths.push(fs.resolvePath(p));\n }\n } catch (e: any) {\n context.writer.writeError(`grep: ${e.message}`);\n failed = true;\n }\n }\n\n const multiFile = filePaths.length > 1;\n\n let found = 0;\n for (const filePath of filePaths) {\n try {\n const content = fs.readFile(filePath) ?? '';\n found += this.grepContent(content, filePath, regex, {\n ignoreCase, showLineNum, countOnly, filesOnly, invert, onlyMatching, quiet,\n }, context, multiFile);\n } catch (e: any) {\n context.writer.writeError(`grep: ${filePath}: ${e.message}`);\n failed = true;\n }\n }\n this.exitStatus(context, found, failed);\n }\n\n /**\n * As Unix grep: 0 when a line matched, 1 when none did, 2 after an\n * error (so `if grep -q ...` and `grep x f && ...` work).\n */\n private exitStatus(context: ICliExecutionContext, found: number, failed: boolean): void {\n if (found > 0) return;\n context.process.exit(failed ? 2 : 1, { silent: true });\n }\n\n private grepContent(\n content: string,\n filePath: string | null,\n regex: RegExp,\n options: {\n ignoreCase: boolean;\n showLineNum: boolean;\n countOnly: boolean;\n filesOnly: boolean;\n invert: boolean;\n onlyMatching: boolean;\n quiet?: boolean;\n },\n context: ICliExecutionContext,\n multiFile: boolean,\n ): number {\n const lines = splitLines(content);\n let matchCount = 0;\n const matchingLines: { num: number; text: string }[] = [];\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx];\n regex.lastIndex = 0;\n const hasMatch = regex.test(line);\n const isMatch = options.invert ? !hasMatch : hasMatch;\n\n if (isMatch) {\n matchCount++;\n matchingLines.push({ num: lineIdx + 1, text: line });\n }\n }\n\n if (options.quiet) return matchCount;\n\n if (options.filesOnly) {\n if (matchCount > 0 && filePath) {\n context.writer.writeln(filePath);\n }\n } else if (options.countOnly) {\n const prefix = multiFile && filePath ? `${filePath}:` : '';\n context.writer.writeln(`${prefix}${matchCount}`);\n } else {\n for (const m of matchingLines) {\n const parts: string[] = [];\n if (multiFile && filePath) {\n parts.push(context.writer.wrapInColor(filePath, CliForegroundColor.Magenta));\n parts.push(':');\n }\n if (options.showLineNum) {\n parts.push(context.writer.wrapInColor(String(m.num), CliForegroundColor.Green));\n parts.push(':');\n }\n if (options.onlyMatching && !options.invert) {\n regex.lastIndex = 0;\n const prefix = parts.join('');\n for (const match of m.text.match(regex) ?? []) {\n if (match !== '') {\n context.writer.writeln(\n prefix + context.writer.wrapInColor(match, CliForegroundColor.Red),\n );\n }\n }\n continue;\n }\n if (!options.invert) {\n regex.lastIndex = 0;\n const highlighted = m.text.replace(regex, (match) =>\n context.writer.wrapInColor(match, CliForegroundColor.Red),\n );\n parts.push(highlighted);\n } else {\n parts.push(m.text);\n }\n context.writer.writeln(parts.join(''));\n }\n }\n return matchCount;\n }\n\n private parseArgs(\n command: CliProcessCommand,\n ): { pattern: string | null; paths: string[] } {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n\n if (tokens.length === 0) {\n return { pattern: null, paths: [] };\n }\n if (tokens.length === 1) {\n return { pattern: tokens[0], paths: [] };\n }\n\n return {\n pattern: tokens[0],\n paths: tokens.slice(1),\n };\n }\n\n private collectFiles(\n fs: IFileSystemService,\n basePath: string,\n node: IFileNode,\n result: string[],\n ): void {\n const children = readableChildren(fs, basePath);\n if (!children) return;\n for (const child of children) {\n const childPath =\n basePath === '/'\n ? `/${child.name}`\n : `${basePath}/${child.name}`;\n if (child.type === 'file') {\n result.push(childPath);\n } else if (child.type === 'directory') {\n this.collectFiles(fs, childPath, child, result);\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliTacCommandProcessor implements ICliCommandProcessor {\n command = 'tac';\n description = 'Print file in reverse line order';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔄', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tac.help.print_file_lines_reverse', 'Print a file with its lines in reverse order, last line first. Works on piped input too.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['tac <file>', t.t('cli.tac.help.print_file_bottom_top', 'Print a file bottom to top')],\n ['<command> | tac', t.t('cli.tac.help.reverse_piped_input', 'Reverse piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['tac app.log', t.t('cli.tac.help.newest_log_lines_first', 'Newest log lines first')],\n ['cat list.txt | tac', t.t('cli.tac.help.reverse_list', 'Reverse a list')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n const lines = content.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n lines.reverse();\n context.writer.writeln(lines.join('\\n'));\n return;\n }\n context.writer.writeError('tac: missing file operand');\n return;\n }\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`tac: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) continue;\n\n if (paths.length > 1) {\n if (i > 0) context.writer.writeln();\n context.writer.writeln(`==> ${path} <==`);\n }\n\n const lines = content.split('\\n');\n // Filter trailing empty line from trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n lines.reverse();\n context.writer.writeln(lines.join('\\n'));\n } catch (e: any) {\n context.writer.writeError(`tac: ${e.message}`);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliBasenameCommandProcessor implements ICliCommandProcessor {\n command = 'basename';\n description = 'Strip directory from path';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📛', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.basename.help.print_last_part_path', 'Print the last part of a path, the file or directory name, without the directories in front. If a suffix is given, it is removed from the end too.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['basename <path>', t.t('cli.basename.help.name_without_directories', 'Name without the directories')],\n ['basename <path> <suffix>', t.t('cli.basename.help.also_remove_trailing_suffix', 'Also remove a trailing suffix')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['basename /home/user/notes.txt', t.t('cli.basename.help.prints_notes_txt', 'Prints notes.txt')],\n ['basename /home/user/notes.txt .txt', t.t('cli.basename.help.prints_notes', 'Prints notes')],\n ['basename /home/user/', t.t('cli.basename.help.prints_user', 'Prints user')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const tokens = this.parseTokens(command);\n\n if (tokens.length === 0) {\n context.writer.writeError('basename: missing operand');\n return;\n }\n\n const path = tokens[0];\n const suffix = tokens.length > 1 ? tokens[1] : undefined;\n\n // Handle root path\n if (path === '/') {\n context.writer.writeln('/');\n return;\n }\n\n // Remove trailing slashes\n const cleaned = path.replace(/\\/+$/, '') || '/';\n const parts = cleaned.split('/');\n let name = parts[parts.length - 1];\n\n // If after cleaning we got empty (shouldn't happen), fallback\n if (!name) {\n name = '/';\n }\n\n // Strip suffix if provided and name ends with it\n if (suffix && name.endsWith(suffix) && name !== suffix) {\n name = name.slice(0, -suffix.length);\n }\n\n context.writer.writeln(name);\n }\n\n private parseTokens(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliDirnameCommandProcessor implements ICliCommandProcessor {\n command = 'dirname';\n description = 'Strip last component from path';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📂', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.dirname.help.print_directory_part_path', 'Print the directory part of a path, everything before the last /. A bare name with no / gives . (the current directory).'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['dirname <path>', t.t('cli.dirname.help.path_without_last_part', 'Path without its last part')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['dirname /home/user/notes.txt', t.t('cli.dirname.help.prints_home_user', 'Prints /home/user')],\n ['dirname notes.txt', t.t('cli.dirname.help.prints', 'Prints .')],\n ['dirname /home', t.t('cli.dirname.help.prints_2', 'Prints /')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const tokens = this.parseTokens(command);\n\n if (tokens.length === 0) {\n context.writer.writeError('dirname: missing operand');\n return;\n }\n\n const path = tokens[0];\n\n // Handle root path\n if (path === '/') {\n context.writer.writeln('/');\n return;\n }\n\n // Remove trailing slashes\n const cleaned = path.replace(/\\/+$/, '') || '/';\n\n // No slash at all => bare filename => return '.'\n if (!cleaned.includes('/')) {\n context.writer.writeln('.');\n return;\n }\n\n const parts = cleaned.split('/');\n parts.pop(); // remove last component\n\n let dir = parts.join('/');\n // If dir is empty after removing last component (e.g. \"/home\" -> \"\")\n if (!dir) {\n dir = '/';\n }\n\n context.writer.writeln(dir);\n }\n\n private parseTokens(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText, splitLines } from '../utils/lines';\n\nexport class CliSortCommandProcessor implements ICliCommandProcessor {\n command = 'sort';\n description = 'Sort lines of text files';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '\\u{1F524}', module: 'file management' };\n\n parameters = [\n {\n name: 'reverse',\n aliases: ['r'],\n description: 'Reverse the result of comparisons',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'numeric-sort',\n aliases: ['n'],\n description: 'Compare according to string numerical value',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'unique',\n aliases: ['u'],\n description: 'Output only unique lines',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'key',\n aliases: ['k'],\n description: 'Sort by a specific field (1-indexed)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'field-separator',\n aliases: ['t'],\n description: 'Use a specific field delimiter',\n required: false,\n type: 'string' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.sort.help.sort_lines_file_piped', 'Sort the lines of a file or piped input, alphabetically by default. Sort numerically, in reverse, by a field, or drop duplicates. Several files are sorted together into one list.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['sort <file>', t.t('cli.sort.help.sort_lines_alphabetically', 'Sort lines alphabetically')],\n [\n 'sort -k <n> -t <sep> <file>',\n t.t('cli.sort.help.sort_field_split', 'Sort by field <n>, split on <sep>'),\n ],\n ['<command> | sort', t.t('cli.sort.help.sort_piped_input', 'Sort piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['sort names.txt', t.t('cli.sort.help.z', 'A to Z')],\n ['sort -n -r scores.txt', t.t('cli.sort.help.largest_number_first', 'Largest number first')],\n ['sort -t , -k 2 data.csv', t.t('cli.sort.help.sort_csv_second_column', 'Sort a CSV by its second column')],\n ['cat words.txt | sort -u', t.t('cli.sort.help.sorted_without_duplicates', 'Sorted, without duplicates')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const reverse = !!command.args['r'] || !!command.args['reverse'];\n const numeric = !!command.args['n'] || !!command.args['numeric-sort'];\n const unique = !!command.args['u'] || !!command.args['unique'];\n const keyField = command.args['k'] ?? command.args['key'];\n const delimiter = command.args['t'] ?? command.args['field-separator'];\n\n const paths = this.parsePaths(command);\n let lines: string[] = [];\n\n if (paths.length === 0) {\n if (command.data == null) {\n context.writer.writeError('sort: missing file operand');\n return;\n }\n lines = splitLines(pipedText(command.data));\n } else {\n // Several files are sorted together, as one input\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(\n `sort: ${path}: Is a directory`,\n );\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `sort: ${path}: No such file or directory`,\n );\n continue;\n }\n lines.push(...splitLines(content));\n } catch (e: any) {\n context.writer.writeError(`sort: ${e.message}`);\n }\n }\n }\n\n const keyIndex =\n keyField != null && keyField !== true\n ? parseInt(String(keyField), 10) - 1\n : undefined;\n const sepRegex =\n delimiter != null && delimiter !== true\n ? new RegExp(\n String(delimiter).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'),\n )\n : /\\s+/;\n const keyOf = (line: string): string =>\n keyIndex !== undefined && keyIndex >= 0\n ? line.split(sepRegex)[keyIndex] || ''\n : line;\n const compare = (a: string, b: string): number => {\n const va = keyOf(a);\n const vb = keyOf(b);\n if (numeric) {\n return (parseFloat(va) || 0) - (parseFloat(vb) || 0);\n }\n return va.localeCompare(vb);\n };\n\n lines.sort(compare);\n\n if (unique) {\n lines = lines.filter(\n (line, i, arr) => i === 0 || compare(line, arr[i - 1]) !== 0,\n );\n }\n\n if (reverse) {\n lines.reverse();\n }\n\n if (lines.length > 0) {\n context.writer.writeln(lines.join('\\n'));\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliUniqCommandProcessor implements ICliCommandProcessor {\n command = 'uniq';\n description = 'Filter adjacent duplicate lines from a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '\\u{1F501}', module: 'file management' };\n\n parameters = [\n {\n name: 'count',\n aliases: ['c'],\n description: 'Prefix lines by the number of occurrences',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'repeated',\n aliases: ['d'],\n description: 'Only print duplicate lines',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'ignore-case',\n aliases: ['i'],\n description: 'Ignore differences in case when comparing',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'unique',\n aliases: ['u'],\n description: 'Only print unique lines',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.uniq.help.collapse_repeated_lines_next', 'Collapse repeated lines that are next to each other into one. Only adjacent duplicates are merged, so sort the input first to catch them all.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['uniq <file>', t.t('cli.uniq.help.drop_adjacent_duplicate_lines', 'Drop adjacent duplicate lines')],\n ['<command> | uniq', t.t('cli.uniq.help.filter_piped_input', 'Filter piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['uniq log.txt', t.t('cli.uniq.help.collapse_repeated_lines', 'Collapse repeated lines')],\n ['sort words.txt | uniq -c', t.t('cli.uniq.help.count_how_often_each', 'Count how often each line appears')],\n ['sort words.txt | uniq -d', t.t('cli.uniq.help.show_only_duplicated_lines', 'Show only the duplicated lines')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const showCount = !!command.args['c'] || !!command.args['count'];\n const onlyDuplicates =\n !!command.args['d'] || !!command.args['repeated'];\n const ignoreCase =\n !!command.args['i'] || !!command.args['ignore-case'];\n const onlyUnique = !!command.args['u'] || !!command.args['unique'];\n\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n const lines = content.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n const groups: { line: string; count: number }[] = [];\n for (const line of lines) {\n const last = groups[groups.length - 1];\n const compare = ignoreCase\n ? (a: string, b: string) =>\n a.toLowerCase() === b.toLowerCase()\n : (a: string, b: string) => a === b;\n if (last && compare(last.line, line)) {\n last.count++;\n } else {\n groups.push({ line, count: 1 });\n }\n }\n\n let filtered = groups;\n if (onlyDuplicates) {\n filtered = filtered.filter((g) => g.count > 1);\n }\n if (onlyUnique) {\n filtered = filtered.filter((g) => g.count === 1);\n }\n\n const output = filtered.map((g) => {\n if (showCount) {\n return `${String(g.count).padStart(7)} ${g.line}`;\n }\n return g.line;\n });\n\n context.writer.writeln(output.join('\\n'));\n return;\n }\n context.writer.writeError('uniq: missing file operand');\n return;\n }\n\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(\n `uniq: ${path}: Is a directory`,\n );\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `uniq: ${path}: No such file or directory`,\n );\n continue;\n }\n\n const lines = content.split('\\n');\n // Remove trailing empty line from trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n // Group consecutive identical lines\n const groups: { line: string; count: number }[] = [];\n for (const line of lines) {\n const last = groups[groups.length - 1];\n const compare = ignoreCase\n ? (a: string, b: string) =>\n a.toLowerCase() === b.toLowerCase()\n : (a: string, b: string) => a === b;\n if (last && compare(last.line, line)) {\n last.count++;\n } else {\n groups.push({ line, count: 1 });\n }\n }\n\n // Filter based on flags\n let filtered = groups;\n if (onlyDuplicates) {\n filtered = filtered.filter((g) => g.count > 1);\n }\n if (onlyUnique) {\n filtered = filtered.filter((g) => g.count === 1);\n }\n\n // Format output\n const output = filtered.map((g) => {\n if (showCount) {\n return `${String(g.count).padStart(7)} ${g.line}`;\n }\n return g.line;\n });\n\n context.writer.writeln(output.join('\\n'));\n } catch (e: any) {\n context.writer.writeError(`uniq: ${e.message}`);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliCutCommandProcessor implements ICliCommandProcessor {\n command = 'cut';\n description = 'Extract columns or fields from each line of a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '\\u2702\\uFE0F', module: 'file management' };\n\n parameters = [\n {\n name: 'delimiter',\n aliases: ['d'],\n description: 'Use a specific field delimiter (default: tab)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'fields',\n aliases: ['f'],\n description: 'Select only these fields (e.g., 1,3 or 1-3)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'characters',\n aliases: ['c'],\n description:\n 'Select only these character positions (e.g., 1-5 or 3)',\n required: false,\n type: 'string' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cut.help.print_selected_parts_each', 'Print selected parts of each line: fields split by a delimiter (-f, tab by default) or character positions (-c). A list can be single numbers, ranges or both, such as 1,3 or 2-4 or 3-.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cut -d <sep> -f <list> <file>', t.t('cli.cut.help.select_fields', 'Select fields')],\n ['cut -c <list> <file>', t.t('cli.cut.help.select_character_positions', 'Select character positions')],\n ['<command> | cut -f <list>', t.t('cli.cut.help.cut_piped_input', 'Cut piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cut -d , -f 1,3 data.csv', t.t('cli.cut.help.first_third_csv_column', 'First and third CSV column')],\n ['cut -c 1-10 notes.txt', t.t('cli.cut.help.first_10_characters_each', 'First 10 characters of each line')],\n ['cat users.txt | cut -d : -f 1-2', t.t('cli.cut.help.first_two_fields_split', 'First two fields split on :')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const delimiter = command.args['d'] || command.args['delimiter'] || '\\t';\n const fieldsSpec = command.args['f'] ?? command.args['fields'];\n const charsSpec = command.args['c'] ?? command.args['characters'];\n\n if (\n (fieldsSpec === undefined || fieldsSpec === '') &&\n (charsSpec === undefined || charsSpec === '')\n ) {\n context.writer.writeError(\n 'cut: you must specify either -f (fields) or -c (characters)',\n );\n return;\n }\n\n // A plain number arrives parsed (`-f 2`), so normalize to text\n const spec = String(fieldsSpec ?? charsSpec);\n const indices = this.parseSpec(spec);\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n const lines = content.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n const output = lines.map((line) => {\n if (fieldsSpec) {\n const fields = line.split(delimiter);\n const resolved = this.resolveIndices(\n indices,\n fields.length,\n );\n return resolved\n .map((idx) => fields[idx] || '')\n .join(delimiter);\n } else {\n const chars = line.split('');\n const resolved = this.resolveIndices(\n indices,\n chars.length,\n );\n return resolved.map((idx) => chars[idx] || '').join('');\n }\n });\n\n context.writer.writeln(output.join('\\n'));\n return;\n }\n context.writer.writeError('cut: missing file operand');\n return;\n }\n\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(\n `cut: ${path}: Is a directory`,\n );\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `cut: ${path}: No such file or directory`,\n );\n continue;\n }\n\n const lines = content.split('\\n');\n // Remove trailing empty line from trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n const output = lines.map((line) => {\n if (fieldsSpec) {\n const fields = line.split(delimiter);\n const resolved = this.resolveIndices(\n indices,\n fields.length,\n );\n return resolved\n .map((idx) => fields[idx] || '')\n .join(delimiter);\n } else {\n // character mode\n const chars = line.split('');\n const resolved = this.resolveIndices(\n indices,\n chars.length,\n );\n return resolved.map((idx) => chars[idx] || '').join('');\n }\n });\n\n context.writer.writeln(output.join('\\n'));\n } catch (e: any) {\n context.writer.writeError(`cut: ${e.message}`);\n }\n }\n }\n\n private parseSpec(\n spec: string,\n ): Array<{ type: 'index'; value: number } | { type: 'range'; start: number | null; end: number | null }> {\n const parts = spec.split(',');\n const result: Array<\n | { type: 'index'; value: number }\n | { type: 'range'; start: number | null; end: number | null }\n > = [];\n\n for (const part of parts) {\n const trimmed = part.trim();\n if (trimmed.includes('-')) {\n const [startStr, endStr] = trimmed.split('-');\n const start = startStr ? parseInt(startStr, 10) : null;\n const end = endStr ? parseInt(endStr, 10) : null;\n result.push({ type: 'range', start, end });\n } else {\n result.push({ type: 'index', value: parseInt(trimmed, 10) });\n }\n }\n\n return result;\n }\n\n private resolveIndices(\n specs: Array<\n | { type: 'index'; value: number }\n | { type: 'range'; start: number | null; end: number | null }\n >,\n total: number,\n ): number[] {\n const indices: number[] = [];\n\n for (const spec of specs) {\n if (spec.type === 'index') {\n indices.push(spec.value - 1);\n } else {\n const start = spec.start ? spec.start - 1 : 0;\n const end = spec.end ? spec.end - 1 : total - 1;\n for (let i = start; i <= end; i++) {\n indices.push(i);\n }\n }\n }\n\n return indices;\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText, splitLines } from '../utils/lines';\n\nexport class CliPasteCommandProcessor implements ICliCommandProcessor {\n command = 'paste';\n description = 'Merge lines of files side by side';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '\\u{1F4CB}', module: 'file management' };\n\n parameters = [\n {\n name: 'delimiters',\n aliases: ['d'],\n description: 'Use a specific delimiter (default: tab)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'serial',\n aliases: ['s'],\n description:\n 'Paste one file at a time instead of in parallel',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.paste.help.join_files_side_side', 'Join files side by side: line 1 of each file goes on one output line, separated by a tab, then line 2, and so on. With -s, each file is joined onto a single line instead. Piped input is read as the file - (or as the only input when no file is named); -d takes a list of delimiters used in turn.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['paste <file1> <file2...>', t.t('cli.paste.help.merge_files_line_line', 'Merge files line by line')],\n ['paste -s <file>', t.t('cli.paste.help.join_all_lines_file', 'Join all lines of a file into one')],\n ['<command> | paste - <file>', t.t('cli.paste.help.merge_piped_input_file', 'Merge piped input with a file')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['paste names.txt ages.txt', t.t('cli.paste.help.two_columns_tab_separated', 'Two columns, tab separated')],\n ['paste -d , a.txt b.txt', t.t('cli.paste.help.merge_comma_separated', 'Merge as comma-separated')],\n ['paste -s -d , list.txt', t.t('cli.paste.help.turn_list_one_csv', 'Turn a list into one CSV line')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const delimiterArg =\n command.args['d'] ?? command.args['delimiters'] ?? '\\t';\n const delimiters = this.parseDelimiters(String(delimiterArg));\n const serial = !!command.args['s'] || !!command.args['serial'];\n\n const paths = this.parsePaths(command);\n const hasStdin = command.data != null;\n\n if (paths.length === 0) {\n if (!hasStdin) {\n context.writer.writeError('paste: missing file operand');\n return;\n }\n // Piped input alone is the single input file\n paths.push('-');\n }\n\n // Read all inputs ('-' is the piped input)\n const fileLines: string[][] = [];\n for (const path of paths) {\n if (path === '-' && hasStdin) {\n fileLines.push(splitLines(pipedText(command.data)));\n continue;\n }\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(\n `paste: ${path}: Is a directory`,\n );\n return;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `paste: ${path}: No such file or directory`,\n );\n return;\n }\n fileLines.push(splitLines(content));\n } catch (e: any) {\n context.writer.writeError(`paste: ${e.message}`);\n return;\n }\n }\n\n const join = (parts: string[]): string =>\n parts.reduce(\n (line, part, i) =>\n i === 0\n ? part\n : line + delimiters[(i - 1) % delimiters.length] + part,\n '',\n );\n\n if (serial) {\n // Serial mode: each file's lines joined on one output line\n const output = fileLines.map((lines) => join(lines));\n context.writer.writeln(output.join('\\n'));\n } else {\n // Parallel mode: zip lines from all files\n const maxLines = Math.max(\n ...fileLines.map((lines) => lines.length),\n );\n const output: string[] = [];\n for (let i = 0; i < maxLines; i++) {\n output.push(join(fileLines.map((lines) => lines[i] ?? '')));\n }\n context.writer.writeln(output.join('\\n'));\n }\n }\n\n /** `-d` list: each character in turn, with \\t, \\n, \\\\ and \\0 (empty) escapes. */\n private parseDelimiters(list: string): string[] {\n const result: string[] = [];\n for (let i = 0; i < list.length; i++) {\n if (list[i] === '\\\\' && i + 1 < list.length) {\n const next = list[++i];\n result.push(\n next === 't' ? '\\t' : next === 'n' ? '\\n' : next === '0' ? '' : next,\n );\n } else {\n result.push(list[i]);\n }\n }\n return result.length > 0 ? result : ['\\t'];\n }\n\n /**\n * The file operands. The engine drops a lone `-` from the value, so with\n * piped input they are read from the raw command line to keep it.\n */\n private parsePaths(command: CliProcessCommand): string[] {\n const fromValue = splitArgs(command.value || '').filter(Boolean);\n if (command.data == null || !command.rawCommand) return fromValue;\n\n const words = splitArgs(command.rawCommand).slice(1);\n if (!words.includes('-')) return fromValue;\n const result: string[] = [];\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n if (word === '-' || !word.startsWith('-')) {\n result.push(word);\n } else if (/^(-d|--delimiters)$/.test(word)) {\n i++; // its value\n }\n }\n return result;\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\n/**\n * Expand character set notation (ranges like a-z, character classes like [:upper:])\n * into an array of individual characters.\n */\nfunction expandSet(set: string): string[] {\n const chars: string[] = [];\n let i = 0;\n while (i < set.length) {\n // Escapes: \\n, \\t, \\r, \\\\ and any other escaped character as itself\n if (set[i] === '\\\\' && i + 1 < set.length) {\n const next = set[i + 1];\n chars.push(\n next === 'n' ? '\\n' : next === 't' ? '\\t' : next === 'r' ? '\\r' : next,\n );\n i += 2;\n continue;\n }\n // Character classes\n if (set[i] === '[' && set[i + 1] === ':') {\n const end = set.indexOf(':]', i + 2);\n if (end !== -1) {\n const className = set.substring(i + 2, end);\n chars.push(...getCharClass(className));\n i = end + 2;\n continue;\n }\n }\n // Ranges like a-z\n if (\n i + 2 < set.length &&\n set[i + 1] === '-' &&\n set[i + 2] !== '\\\\'\n ) {\n const start = set.charCodeAt(i);\n const finish = set.charCodeAt(i + 2);\n if (start <= finish) {\n for (let c = start; c <= finish; c++) {\n chars.push(String.fromCharCode(c));\n }\n } else {\n for (let c = start; c >= finish; c--) {\n chars.push(String.fromCharCode(c));\n }\n }\n i += 3;\n continue;\n }\n chars.push(set[i]);\n i++;\n }\n return chars;\n}\n\nfunction getCharClass(name: string): string[] {\n switch (name) {\n case 'upper':\n return expandSet('A-Z');\n case 'lower':\n return expandSet('a-z');\n case 'digit':\n return expandSet('0-9');\n case 'alpha':\n return [...expandSet('a-z'), ...expandSet('A-Z')];\n case 'alnum':\n return [...expandSet('a-z'), ...expandSet('A-Z'), ...expandSet('0-9')];\n case 'space':\n return [' ', '\\t', '\\n', '\\r', '\\x0b', '\\x0c'];\n default:\n return [];\n }\n}\n\n/**\n * Parse quoted or unquoted tokens from a raw command string.\n * Returns an array of parsed tokens (SET1, SET2).\n */\nfunction parseTokens(raw: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n while (i < raw.length) {\n // Skip whitespace\n if (/\\s/.test(raw[i])) {\n i++;\n continue;\n }\n // Quoted string\n if (raw[i] === \"'\" || raw[i] === '\"') {\n const quote = raw[i];\n i++;\n let token = '';\n while (i < raw.length && raw[i] !== quote) {\n token += raw[i];\n i++;\n }\n i++; // skip closing quote\n tokens.push(token);\n continue;\n }\n // Unquoted token\n let token = '';\n while (i < raw.length && !/\\s/.test(raw[i])) {\n token += raw[i];\n i++;\n }\n tokens.push(token);\n }\n return tokens;\n}\n\nexport class CliTrCommandProcessor implements ICliCommandProcessor {\n command = 'tr';\n description = 'Translate or delete characters in piped input';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔀', module: 'file management' };\n\n parameters = [\n {\n name: 'delete',\n aliases: ['d'],\n description: 'Delete characters in SET1',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'squeeze-repeats',\n aliases: ['s'],\n description: 'Squeeze repeated characters in last operand set',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tr.help.translate_characters_set1_matching', 'Translate characters from SET1 into the matching characters of SET2, delete them (-d) or squeeze repeats into one (-s). Sets can use ranges like a-z and classes like [:upper:], [:lower:], [:digit:], [:alpha:], [:alnum:] and [:space:]. Escapes \\\\n, \\\\t and \\\\\\\\ are understood. Like Unix tr, it reads only piped input and takes no file operands: to transform a file, pipe it in with cat.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['<command> | tr <set1> <set2>', t.t('cli.tr.help.replace_characters', 'Replace characters')],\n ['<command> | tr -d <set1>', t.t('cli.tr.help.delete_characters', 'Delete characters')],\n ['<command> | tr -s <set1> [set2]', t.t('cli.tr.help.squeeze_repeated_characters', 'Squeeze repeated characters')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cat notes.txt | tr a-z A-Z', t.t('cli.tr.help.convert_file_upper_case', 'Convert a file to upper case')],\n ['echo hello | tr a-z A-Z', t.t('cli.tr.help.upper_case_piped_text', 'Upper-case piped text')],\n ['cat notes.txt | tr -d 0-9', t.t('cli.tr.help.remove_all_digits', 'Remove all digits')],\n [\"cat notes.txt | tr -s ' '\", t.t('cli.tr.help.collapse_runs_spaces', 'Collapse runs of spaces')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const raw = command.value || '';\n const positional = parseTokens(raw);\n\n const deleteMode = !!command.args['d'] || !!command.args['delete'];\n const squeezeMode =\n !!command.args['s'] || !!command.args['squeeze-repeats'];\n\n if (positional.length === 0) {\n this.fail(context, 'tr: missing operand');\n return;\n }\n\n // How many operands are sets: -d takes one, -d -s and plain\n // translation two, -s one or two. Like Unix tr there are no file\n // operands: tr reads only piped input.\n let setCount: number;\n if (deleteMode) {\n setCount = squeezeMode ? 2 : 1;\n } else if (squeezeMode) {\n setCount = Math.min(positional.length, 2);\n } else {\n setCount = 2;\n }\n\n if (positional.length < setCount) {\n this.fail(context, 'tr: missing operand');\n return;\n }\n if (positional.length > setCount) {\n this.fail(context, `tr: extra operand '${positional[setCount]}'`);\n return;\n }\n\n if (command.data == null) {\n this.fail(\n context,\n \"tr: no input: tr reads only piped input and takes no file operands; use 'cat file | tr a-z A-Z'\",\n );\n return;\n }\n\n const set1Str: string = positional[0];\n const set2Str: string | undefined =\n setCount === 2 ? positional[1] : undefined;\n const content: string =\n typeof command.data === 'string'\n ? command.data\n : JSON.stringify(command.data);\n\n try {\n const set1 = expandSet(set1Str!);\n const set1Set = new Set(set1);\n const set2 = set2Str ? expandSet(set2Str) : [];\n\n let result = content;\n\n if (deleteMode && squeezeMode) {\n // Delete SET1 chars, then squeeze SET2 chars\n result = this.deleteChars(result, set1Set);\n const squeezeSet = new Set(set2);\n result = this.squeezeChars(result, squeezeSet);\n } else if (deleteMode) {\n result = this.deleteChars(result, set1Set);\n } else if (squeezeMode && set2.length > 0) {\n // Translate then squeeze\n result = this.translateChars(result, set1, set2);\n const squeezeSet = new Set(set2);\n result = this.squeezeChars(result, squeezeSet);\n } else if (squeezeMode) {\n result = this.squeezeChars(result, set1Set);\n } else {\n result = this.translateChars(result, set1, set2);\n }\n\n context.writer.writeln(result);\n } catch (e: any) {\n this.fail(context, `tr: ${e.message}`);\n }\n }\n\n private fail(context: ICliExecutionContext, message: string): void {\n context.writer.writeError(message);\n context.process.exit(1, { silent: true });\n }\n\n private deleteChars(content: string, deleteSet: Set<string>): string {\n let result = '';\n for (const ch of content) {\n if (!deleteSet.has(ch)) {\n result += ch;\n }\n }\n return result;\n }\n\n private squeezeChars(content: string, squeezeSet: Set<string>): string {\n let result = '';\n let prevChar = '';\n for (const ch of content) {\n if (squeezeSet.has(ch) && ch === prevChar) {\n continue;\n }\n result += ch;\n prevChar = ch;\n }\n return result;\n }\n\n private translateChars(\n content: string,\n set1: string[],\n set2: string[],\n ): string {\n if (set2.length === 0) return content;\n\n // Build translation map; if SET2 is shorter, last char repeats\n const map = new Map<string, string>();\n for (let i = 0; i < set1.length; i++) {\n const replacement =\n i < set2.length ? set2[i] : set2[set2.length - 1];\n map.set(set1[i], replacement);\n }\n\n let result = '';\n for (const ch of content) {\n result += map.has(ch) ? map.get(ch)! : ch;\n }\n return result;\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliStatCommandProcessor implements ICliCommandProcessor {\n command = 'stat';\n description = 'Display file/directory metadata';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📊', module: 'file management' };\n\n parameters = [];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.stat.help.show_details_about_files', 'Show details about files or directories: full path, size, type, permissions, owner, group, and when it was created and last modified.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['stat <path...>', t.t('cli.stat.help.show_details_each_path', 'Show details for each path')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['stat notes.txt', t.t('cli.stat.help.details_one_file', 'Details of one file')],\n ['stat ~/docs notes.txt', t.t('cli.stat.help.several_paths_once', 'Several paths at once')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n context.writer.writeError('stat: missing operand');\n return;\n }\n\n for (const path of paths) {\n const resolved = fs.resolvePath(path);\n if (fs.canTraverse && !fs.canTraverse(resolved)) {\n context.writer.writeError(`stat: cannot stat '${path}': Permission denied`);\n continue;\n }\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `stat: cannot stat '${path}': No such file or directory`,\n );\n continue;\n }\n\n context.writer.writeKeyValue({\n File: resolved,\n Size: `${node.size}`,\n Type: node.type,\n Permissions: node.permissions || 'rw-r--r--',\n Owner: node.ownership?.uid || '-',\n Group: node.ownership?.gid || '-',\n Created: new Date(node.createdAt).toLocaleString(),\n Modified: new Date(node.modifiedAt).toLocaleString(),\n });\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliChmodCommandProcessor implements ICliCommandProcessor {\n command = 'chmod';\n description = 'Change file permissions';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔒', module: 'file management' };\n\n parameters = [\n {\n name: 'R',\n description: 'Change files and directories recursively',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.chmod.help.change_who_can_read', 'Change who can read (r), write (w) and execute (x) a file. Use an octal mode such as 755 or a symbolic one: who (u user, g group, o others, a all), then + to add, - to remove or = to set, then the permissions.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['chmod <mode> <file...>', t.t('cli.chmod.help.set_permissions', 'Set permissions')],\n [\n 'chmod -R <mode> <dir>',\n t.t('cli.chmod.help.apply_directory_everything', 'Apply to a directory and everything in it'),\n ],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['chmod 644 notes.txt', t.t('cli.chmod.help.rw_r_r_owner', 'rw-r--r--: owner writes, others read')],\n ['chmod u+x script.sh', t.t('cli.chmod.help.let_owner_execute', 'Let the owner execute it')],\n ['chmod go-w shared.txt', t.t('cli.chmod.help.take_away_write_group', 'Take away write for group and others')],\n ['chmod -R 755 site', t.t('cli.chmod.help.set_whole_directory_tree', 'Set a whole directory tree')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const { recursive, mode, paths } = this.parseArgs(command);\n\n if (!mode || paths.length === 0) {\n context.writer.writeError(\n 'chmod: missing operand',\n );\n return;\n }\n\n for (const path of paths) {\n const resolved = fs.resolvePath(path);\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `chmod: cannot access '${path}': No such file or directory`,\n );\n continue;\n }\n\n const perms = this.resolvePermissions(mode, node.permissions || 'rw-r--r--');\n if (perms === null) {\n context.writer.writeError(\n `chmod: invalid mode: '${mode}'`,\n );\n return;\n }\n\n this.applyPermissions(fs, resolved, node, perms, recursive);\n }\n\n await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): {\n recursive: boolean;\n mode: string | null;\n paths: string[];\n } {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n const recursive = command.args['R'] || false;\n const mode = tokens.length > 0 ? tokens[0] : null;\n const paths = tokens.slice(1);\n return { recursive, mode, paths };\n }\n\n private resolvePermissions(\n mode: string,\n current: string,\n ): string | null {\n // Octal mode (e.g., 755, 644)\n if (/^[0-7]{3}$/.test(mode)) {\n return this.octalToPermString(mode);\n }\n\n // Symbolic mode (e.g., u+x, go-w, a+r)\n const match = mode.match(/^([ugoa]+)([+\\-=])([rwx]+)$/);\n if (!match) {\n return null;\n }\n\n const who = match[1];\n const op = match[2];\n const perms = match[3];\n const chars = current.split('');\n\n // Map who to indices: u=0-2, g=3-5, o=6-8\n const indices: number[] = [];\n const addIndices = (start: number) => {\n if (perms.includes('r')) indices.push(start);\n if (perms.includes('w')) indices.push(start + 1);\n if (perms.includes('x')) indices.push(start + 2);\n };\n\n if (who.includes('u') || who.includes('a')) addIndices(0);\n if (who.includes('g') || who.includes('a')) addIndices(3);\n if (who.includes('o') || who.includes('a')) addIndices(6);\n\n for (const idx of indices) {\n const permChar = idx % 3 === 0 ? 'r' : idx % 3 === 1 ? 'w' : 'x';\n if (op === '+') {\n chars[idx] = permChar;\n } else if (op === '-') {\n chars[idx] = '-';\n } else if (op === '=') {\n chars[idx] = permChar;\n }\n }\n\n // For '=' operation, clear bits not mentioned\n if (op === '=') {\n const clearIndices: number[] = [];\n const clearGroup = (start: number) => {\n if (!perms.includes('r')) clearIndices.push(start);\n if (!perms.includes('w')) clearIndices.push(start + 1);\n if (!perms.includes('x')) clearIndices.push(start + 2);\n };\n\n if (who.includes('u') || who.includes('a')) clearGroup(0);\n if (who.includes('g') || who.includes('a')) clearGroup(3);\n if (who.includes('o') || who.includes('a')) clearGroup(6);\n\n for (const idx of clearIndices) {\n chars[idx] = '-';\n }\n }\n\n return chars.join('');\n }\n\n private octalToPermString(octal: string): string {\n const digitToPerms = (d: number): string => {\n return (\n ((d & 4) ? 'r' : '-') +\n ((d & 2) ? 'w' : '-') +\n ((d & 1) ? 'x' : '-')\n );\n };\n return (\n digitToPerms(parseInt(octal[0], 10)) +\n digitToPerms(parseInt(octal[1], 10)) +\n digitToPerms(parseInt(octal[2], 10))\n );\n }\n\n private applyPermissions(\n fs: IFileSystemService,\n basePath: string,\n node: IFileNode,\n perms: string,\n recursive: boolean,\n ): void {\n fs.chmod(basePath, perms);\n if (recursive && node.type === 'directory' && node.children) {\n for (const child of node.children) {\n const childPath =\n basePath === '/'\n ? `/${child.name}`\n : `${basePath}/${child.name}`;\n this.applyPermissions(fs, childPath, child, perms, recursive);\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliChownCommandProcessor implements ICliCommandProcessor {\n command = 'chown';\n description = 'Change file owner and group';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔑', module: 'file management' };\n\n parameters = [\n {\n name: 'R',\n description: 'Change files and directories recursively',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.chown.help.change_owner_group_files', 'Change the owner and/or group of files. Give user, user:group, user: (owner only) or :group (group only).'),\n );\n context.writer.writeln();\n writeUsage(context, [\n [\n 'chown <user>[:<group>] <file...>',\n t.t('cli.chown.help.change_owner_group_if', 'Change owner, and group if given'),\n ],\n ['chown :<group> <file>', t.t('cli.chown.help.change_only_group', 'Change only the group')],\n [\n 'chown -R <user> <dir>',\n t.t('cli.chown.help.apply_directory_everything', 'Apply to a directory and everything in it'),\n ],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['chown alice notes.txt', t.t('cli.chown.help.make_alice_owner', 'Make alice the owner')],\n ['chown alice:staff report.txt', t.t('cli.chown.help.set_owner_group', 'Set owner and group')],\n ['chown -R bob ~/shared', t.t('cli.chown.help.give_bob_whole_directory', 'Give bob a whole directory')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const { recursive, ownerSpec, paths } = this.parseArgs(command);\n\n if (!ownerSpec || paths.length === 0) {\n context.writer.writeError(\n 'chown: missing operand. Usage: chown [user][:group] <file>',\n );\n return;\n }\n\n const { uid, gid } = this.parseOwnerSpec(ownerSpec);\n if (!uid && !gid) {\n context.writer.writeError(\n `chown: invalid owner: '${ownerSpec}'`,\n );\n return;\n }\n\n for (const path of paths) {\n const resolved = fs.resolvePath(path);\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `chown: cannot access '${path}': No such file or directory`,\n );\n continue;\n }\n\n this.applyOwnership(fs, resolved, node, uid, gid, recursive);\n }\n\n await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): {\n recursive: boolean;\n ownerSpec: string | null;\n paths: string[];\n } {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n const recursive = command.args['R'] || false;\n const ownerSpec = tokens.length > 0 ? tokens[0] : null;\n const paths = tokens.slice(1);\n return { recursive, ownerSpec, paths };\n }\n\n /** Parse \"user:group\", \"user:\", \":group\", or \"user\" */\n private parseOwnerSpec(spec: string): { uid: string | null; gid: string | null } {\n if (spec.includes(':')) {\n const [uid, gid] = spec.split(':', 2);\n return {\n uid: uid || null,\n gid: gid || null,\n };\n }\n return { uid: spec, gid: null };\n }\n\n private applyOwnership(\n fs: IFileSystemService,\n basePath: string,\n node: IFileNode,\n uid: string | null,\n gid: string | null,\n recursive: boolean,\n ): void {\n const current = node.ownership || { uid: 'root', gid: 'admin' };\n fs.chown(basePath, {\n uid: uid ?? current.uid,\n gid: gid ?? current.gid,\n });\n\n if (recursive && node.type === 'directory' && node.children) {\n for (const child of node.children) {\n const childPath =\n basePath === '/'\n ? `/${child.name}`\n : `${basePath}/${child.name}`;\n this.applyOwnership(fs, childPath, child, uid, gid, recursive);\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport { readableChildren } from '../utils/readable-children';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliDuCommandProcessor implements ICliCommandProcessor {\n command = 'du';\n description = 'Estimate file space usage';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📏', module: 'file management' };\n\n parameters = [\n {\n name: 'h',\n description: 'Human-readable sizes (e.g. 1K, 2M)',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 's',\n description: 'Display only a total for each argument',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'max-depth',\n aliases: ['d'],\n description: 'Print total for a directory only if it is N or fewer levels below the argument',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.du.help.show_how_much_space', 'Show how much space files and directories use, in bytes. For a directory, every subdirectory is listed with its total size; use -s for just the total or -d to limit how deep it goes.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['du [path...]', t.t('cli.du.help.sizes_path_default_current', 'Sizes of a path (default: the current directory) and its subdirectories')],\n ['du -s <path>', t.t('cli.du.help.only_total', 'Only the total')],\n ['du -d <n> <path>', t.t('cli.du.help.only_levels_deep', 'Only <n> levels deep')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['du ~/docs', t.t('cli.du.help.size_each_directory_docs', 'Size of each directory in ~/docs')],\n ['du -h -s ~', t.t('cli.du.help.total_home_k_m', 'Total of your home in K/M/G')],\n ['du -h -d 1 .', t.t('cli.du.help.size_each_top_level', 'Size of each top-level folder')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const { humanReadable, summaryOnly, maxDepth, paths } =\n this.parseArgs(command);\n\n if (paths.length === 0) {\n paths.push(fs.getCurrentDirectory());\n }\n\n for (const path of paths) {\n const resolved = fs.resolvePath(path);\n if (fs.canTraverse && !fs.canTraverse(resolved)) {\n context.writer.writeError(`du: cannot access '${path}': Permission denied`);\n continue;\n }\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `du: cannot access '${path}': No such file or directory`,\n );\n continue;\n }\n\n if (node.type === 'file') {\n context.writer.writeln(\n `${this.formatSize(node.size, humanReadable)}\\t${resolved}`,\n );\n } else {\n const entries: { size: number; path: string }[] = [];\n this.fs = fs;\n this.collectSizes(node, resolved, 0, maxDepth, summaryOnly, entries);\n\n for (const entry of entries) {\n context.writer.writeln(\n `${this.formatSize(entry.size, humanReadable)}\\t${entry.path}`,\n );\n }\n }\n }\n }\n\n private parseArgs(command: CliProcessCommand): {\n humanReadable: boolean;\n summaryOnly: boolean;\n maxDepth: number;\n paths: string[];\n } {\n const raw = command.value || '';\n const paths = splitArgs(raw).filter(Boolean);\n const humanReadable = !!command.args['h'];\n const summaryOnly = !!command.args['s'];\n const depthArg = command.args['max-depth'] ?? command.args['d'];\n const parsedDepth = parseInt(String(depthArg ?? ''), 10);\n const maxDepth =\n depthArg != null && depthArg !== true && !isNaN(parsedDepth)\n ? parsedDepth\n : Infinity;\n\n return { humanReadable, summaryOnly, maxDepth, paths };\n }\n\n /** File system of the running command (listing goes through access checks) */\n private fs?: IFileSystemService;\n\n private collectSizes(\n node: IFileNode,\n path: string,\n depth: number,\n maxDepth: number,\n summaryOnly: boolean,\n entries: { size: number; path: string }[],\n ): number {\n if (node.type === 'file') {\n return node.size;\n }\n\n let total = 0;\n const children = this.fs ? readableChildren(this.fs, path) : node.children;\n if (children) {\n for (const child of children) {\n const childPath = path === '/' ? `/${child.name}` : `${path}/${child.name}`;\n total += this.collectSizes(\n child,\n childPath,\n depth + 1,\n maxDepth,\n summaryOnly,\n entries,\n );\n }\n }\n\n if (summaryOnly) {\n if (depth === 0) {\n entries.push({ size: total, path });\n }\n } else if (depth <= maxDepth) {\n entries.push({ size: total, path });\n }\n\n return total;\n }\n\n private formatSize(bytes: number, humanReadable: boolean): string {\n if (!humanReadable) {\n return String(bytes);\n }\n\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}K`;\n if (bytes < 1024 * 1024 * 1024)\n return `${(bytes / (1024 * 1024)).toFixed(1)}M`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}G`;\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliLnCommandProcessor implements ICliCommandProcessor {\n command = 'ln';\n description = 'Create symbolic links';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔗', module: 'file management' };\n\n parameters = [\n {\n name: 's',\n description: 'Create a symbolic link',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'force',\n aliases: ['f'],\n description: 'Replace an existing file at the link path',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.ln.help.create_symbolic_link_new', 'Create a symbolic link: a new path that points to another file or directory. Only symbolic links (-s) are supported, and the target does not need to exist yet.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['ln -s <target> <link>', t.t('cli.ln.help.create_pointing', 'Create <link> pointing at <target>')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['ln -s ~/docs/notes.txt notes', t.t('cli.ln.help.shortcut_file', 'Shortcut to a file')],\n ['ln -s /var/log logs', t.t('cli.ln.help.shortcut_directory', 'Shortcut to a directory')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const { symbolic, target, linkName } = this.parseArgs(command);\n\n if (!symbolic) {\n context.writer.writeError(\n 'ln: hard links not supported in virtual filesystem',\n );\n return;\n }\n\n if (!target || !linkName) {\n context.writer.writeError('ln: missing operand');\n return;\n }\n\n const resolvedLink = fs.resolvePath(linkName);\n const resolvedTarget = fs.resolvePath(target);\n\n // Check if the link already exists (-f replaces a file, not a directory)\n const force = !!(command.args['force'] || command.args['f']);\n if (force && fs.exists(resolvedLink) && !fs.isDirectory(resolvedLink)) {\n fs.remove(resolvedLink);\n }\n if (fs.exists(resolvedLink)) {\n context.writer.writeError(\n `ln: failed to create symbolic link '${linkName}': File exists`,\n );\n return;\n }\n\n // Create the symlink as a file node with linkTarget set\n // We allow dangling symlinks so we don't check if target exists\n fs.createFile(resolvedLink, '');\n const node = fs.getNode(resolvedLink);\n if (node) {\n node.linkTarget = resolvedTarget;\n node.size = 0;\n }\n\n await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): {\n symbolic: boolean;\n target: string | null;\n linkName: string | null;\n } {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n const symbolic = command.args['s'] || false;\n\n return {\n symbolic,\n target: tokens[0] || null,\n linkName: tokens[1] || null,\n };\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitLines } from '../utils/lines';\n\ntype SedSingleAddress =\n | { type: 'line'; line: number }\n | { type: 'last' }\n | { type: 'regex'; regex: RegExp };\n\ninterface SedExpression {\n start: SedSingleAddress | null;\n /** End of a range address (`1,5`, `/a/,/b/`) */\n end: SedSingleAddress | null;\n negate: boolean;\n /** Inside a range: the start matched and the end not yet */\n active: boolean;\n command: 's' | 'd' | 'p' | 'q';\n // For substitution:\n pattern?: RegExp;\n replacement?: string;\n groupCount?: number;\n printFlag?: boolean;\n /** `s/a/b/2`: replace only the Nth match (with g, the Nth and later) */\n occurrence?: number;\n globalFlag?: boolean;\n}\n\nexport class CliSedCommandProcessor implements ICliCommandProcessor {\n command = 'sed';\n description = 'Stream editor for filtering and transforming text';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '✏️', module: 'file management' };\n\n parameters = [\n {\n name: 'in-place',\n aliases: ['i'],\n description: 'Edit file in place',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'quiet',\n aliases: ['n'],\n description: 'Suppress automatic printing of pattern space',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'expression',\n aliases: ['e'],\n description: 'Add the expression to the commands to be executed (repeatable)',\n required: false,\n type: 'array' as const,\n },\n {\n name: 'regexp-extended',\n aliases: ['E', 'r'],\n description: 'Use extended regular expressions: (, ), +, ?, | and { } without backslashes',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.sed.help.edit_text_line_line', 'Edit text line by line with a script: substitute (s/old/new/), delete (d), print (p) or quit (q), optionally limited to a line number, a range (1,5, 3,$ or /start/,/end/) or lines matching /regex/; ! after an address inverts it and ; separates commands. The replacement can use & (the match) and \\\\1 to \\\\9 (groups, written \\\\(...\\\\) or, with -E, (...)). Reads files or piped input and prints the result, or rewrites the files with -i.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n [\"sed '<script>' <file>\", t.t('cli.sed.help.print_edited_file', 'Print the edited file')],\n [\"sed -i '<script>' <file>\", t.t('cli.sed.help.save_edits_file', 'Save the edits into the file')],\n [\"sed -n '<script>p' <file>\", t.t('cli.sed.help.print_only_selected_lines', 'Print only selected lines')],\n [\"<command> | sed '<script>'\", t.t('cli.sed.help.edit_piped_input', 'Edit piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n [\"sed 's/cat/dog/g' pets.txt\", t.t('cli.sed.help.replace_every_cat_dog', 'Replace every cat with dog')],\n [\"sed -i 's/v1/v2/' config.txt\", t.t('cli.sed.help.edit_file_place', 'Edit the file in place')],\n [\"sed '/^#/d' config.txt\", t.t('cli.sed.help.drop_comment_lines', 'Drop comment lines')],\n [\"sed -n '1,5p' notes.txt\", t.t('cli.sed.help.print_lines_1_5', 'Print lines 1 to 5')],\n [\"sed -E 's/(\\\\w+) (\\\\w+)/\\\\2 \\\\1/' names.txt\", t.t('cli.sed.help.swap_two_words', 'Swap two words')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const { inPlace, suppress, extended, expressions, filePaths } =\n this.parseRawCommand(command);\n\n if (expressions.length === 0) {\n context.writer.writeError(\n 'sed: missing expression. Usage: sed [options] \\'expression\\' <file>',\n );\n return;\n }\n\n const parse = (): SedExpression[] | null => {\n try {\n return expressions.flatMap((e) => this.parseScript(e, extended));\n } catch (e: any) {\n context.writer.writeError(`sed: ${e.message}`);\n return null;\n }\n };\n\n if (filePaths.length === 0) {\n if (command.data == null) {\n context.writer.writeError(\n 'sed: missing file operand. Usage: sed [options] \\'expression\\' <file>',\n );\n return;\n }\n const script = parse();\n if (!script) return;\n const content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n this.writeLines(context, this.run(script, splitLines(content), suppress));\n return;\n }\n\n // Read every file first, so a missing one stops before any edit\n const contents: string[] = [];\n for (const filePath of filePaths) {\n const resolved = fs.resolvePath(filePath);\n if (!fs.exists(resolved)) {\n context.writer.writeError(\n `sed: ${filePath}: No such file or directory`,\n );\n return;\n }\n if (fs.isDirectory(resolved)) {\n context.writer.writeError(`sed: ${filePath}: Is a directory`);\n return;\n }\n try {\n contents.push(fs.readFile(resolved) ?? '');\n } catch (e: any) {\n context.writer.writeError(`sed: ${e.message}`);\n return;\n }\n }\n\n if (inPlace) {\n // Each file is edited on its own\n for (let i = 0; i < filePaths.length; i++) {\n const script = parse();\n if (!script) return;\n const output = this.run(script, splitLines(contents[i]), suppress);\n const keepNewline = contents[i].endsWith('\\n') && output.length > 0;\n try {\n fs.writeFile(\n fs.resolvePath(filePaths[i]),\n output.join('\\n') + (keepNewline ? '\\n' : ''),\n );\n } catch (e: any) {\n context.writer.writeError(`sed: ${e.message}`);\n return;\n }\n }\n await fs.persist();\n return;\n }\n\n // Several files are one stream: line numbers and $ span them all\n const script = parse();\n if (!script) return;\n const lines = contents.flatMap((c) => splitLines(c));\n this.writeLines(context, this.run(script, lines, suppress));\n }\n\n private writeLines(context: ICliExecutionContext, lines: string[]): void {\n for (const line of lines) {\n context.writer.writeln(line);\n }\n }\n\n /** Runs the script over the lines and returns the output lines. */\n private run(\n script: SedExpression[],\n lines: string[],\n suppress: boolean,\n ): string[] {\n const output: string[] = [];\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n let line = lines[lineIdx];\n let deleted = false;\n let quit = false;\n\n for (const expr of script) {\n if (!this.addressMatches(expr, lineIdx + 1, lines.length, line)) {\n continue;\n }\n\n if (expr.command === 's') {\n let replaced = false;\n let seen = 0;\n const pattern = expr.pattern!;\n pattern.lastIndex = 0;\n line = line.replace(pattern, (...args: any[]) => {\n seen++;\n const nth = expr.occurrence;\n if (nth && (expr.globalFlag ? seen < nth : seen !== nth)) {\n return args[0];\n }\n replaced = true;\n const groups = args.slice(0, expr.groupCount! + 1);\n return this.expandReplacement(expr.replacement!, groups);\n });\n if (replaced && expr.printFlag) output.push(line);\n } else if (expr.command === 'p') {\n output.push(line);\n } else if (expr.command === 'd') {\n deleted = true;\n break;\n } else if (expr.command === 'q') {\n quit = true;\n break;\n }\n }\n\n if (!deleted && !suppress) output.push(line);\n if (quit) break;\n }\n\n return output;\n }\n\n /** `&` is the match, `\\1`..`\\9` the groups, `\\n` a newline, `\\x` a literal x. */\n private expandReplacement(replacement: string, groups: string[]): string {\n let out = '';\n for (let i = 0; i < replacement.length; i++) {\n const ch = replacement[i];\n if (ch === '\\\\' && i + 1 < replacement.length) {\n const next = replacement[++i];\n if (next >= '0' && next <= '9') {\n out += groups[Number(next)] ?? '';\n } else if (next === 'n') {\n out += '\\n';\n } else if (next === 't') {\n out += '\\t';\n } else {\n out += next;\n }\n } else if (ch === '&') {\n out += groups[0];\n } else {\n out += ch;\n }\n }\n return out;\n }\n\n private parseRawCommand(command: CliProcessCommand): {\n inPlace: boolean;\n suppress: boolean;\n extended: boolean;\n expressions: string[];\n filePaths: string[];\n } {\n const raw = command.value || '';\n const tokens = this.tokenize(raw);\n\n const inPlace = !!command.args['in-place'] || !!command.args['i'];\n const suppress = !!command.args['quiet'] || !!command.args['n'];\n const extended =\n !!command.args['regexp-extended'] ||\n !!command.args['E'] ||\n !!command.args['r'];\n const expressions: string[] = [];\n\n // -e expressions (one or several)\n const eValue = command.args['expression'] ?? command.args['e'];\n for (const v of Array.isArray(eValue) ? eValue : [eValue]) {\n if (v != null && v !== true && v !== '') {\n expressions.push(String(v));\n }\n }\n\n // Without -e, the first operand is the script\n if (expressions.length === 0 && tokens.length > 0) {\n expressions.push(tokens.shift()!);\n }\n\n return { inPlace, suppress, extended, expressions, filePaths: tokens };\n }\n\n private tokenize(raw: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n while (i < raw.length) {\n // Skip whitespace\n if (raw[i] === ' ' || raw[i] === '\\t') {\n i++;\n continue;\n }\n\n // A word, with quoted parts (quotes removed)\n let token = '';\n while (i < raw.length && raw[i] !== ' ' && raw[i] !== '\\t') {\n if (raw[i] === \"'\" || raw[i] === '\"') {\n const quote = raw[i];\n i++;\n while (i < raw.length && raw[i] !== quote) {\n token += raw[i];\n i++;\n }\n if (i < raw.length) i++; // skip closing quote\n } else {\n token += raw[i];\n i++;\n }\n }\n tokens.push(token);\n }\n return tokens;\n }\n\n /** Commands of a script, separated by `;` or newlines. */\n private parseScript(script: string, extended: boolean): SedExpression[] {\n const result: SedExpression[] = [];\n let pos = 0;\n const skipSeparators = () => {\n while (pos < script.length && /[\\s;]/.test(script[pos])) pos++;\n };\n\n skipSeparators();\n while (pos < script.length) {\n const parsed = this.parseCommand(script, pos, extended);\n result.push(parsed.expression);\n pos = parsed.pos;\n while (pos < script.length && /[ \\t]/.test(script[pos])) pos++;\n if (pos < script.length && !/[;\\n]/.test(script[pos])) {\n throw new Error(`extra characters after command: '${script.slice(pos)}'`);\n }\n skipSeparators();\n }\n\n if (result.length === 0) {\n throw new Error(`invalid expression: '${script}'`);\n }\n return result;\n }\n\n private parseCommand(\n expr: string,\n pos: number,\n extended: boolean,\n ): { expression: SedExpression; pos: number } {\n // Optional address, or range of two\n let start: SedSingleAddress | null = null;\n let end: SedSingleAddress | null = null;\n const first = this.parseAddress(expr, pos, extended);\n if (first) {\n start = first.address;\n pos = first.pos;\n if (expr[pos] === ',') {\n const second = this.parseAddress(expr, pos + 1, extended);\n if (!second) {\n throw new Error(`unexpected ',' in '${expr}'`);\n }\n end = second.address;\n pos = second.pos;\n }\n }\n while (pos < expr.length && /[ \\t]/.test(expr[pos])) pos++;\n let negate = false;\n if (expr[pos] === '!') {\n negate = true;\n pos++;\n while (pos < expr.length && /[ \\t]/.test(expr[pos])) pos++;\n }\n\n if (pos >= expr.length) {\n throw new Error(`invalid expression: '${expr}'`);\n }\n\n const base = { start, end, negate, active: false };\n const cmd = expr[pos];\n\n if (cmd === 's') {\n return this.parseSubstitution(expr, pos, base, extended);\n }\n if (cmd === 'd' || cmd === 'p' || cmd === 'q') {\n return { expression: { ...base, command: cmd }, pos: pos + 1 };\n }\n throw new Error(`unknown command: '${cmd}'`);\n }\n\n private parseAddress(\n expr: string,\n pos: number,\n extended: boolean,\n ): { address: SedSingleAddress; pos: number } | null {\n if (pos >= expr.length) return null;\n\n // Line number\n if (expr[pos] >= '0' && expr[pos] <= '9') {\n let numStr = '';\n while (pos < expr.length && expr[pos] >= '0' && expr[pos] <= '9') {\n numStr += expr[pos];\n pos++;\n }\n return {\n address: { type: 'line', line: parseInt(numStr, 10) },\n pos,\n };\n }\n\n // Last line\n if (expr[pos] === '$') {\n return { address: { type: 'last' }, pos: pos + 1 };\n }\n\n // Regex address\n if (expr[pos] === '/') {\n const parsed = this.readDelimited(expr, pos + 1, '/');\n try {\n return {\n address: {\n type: 'regex',\n regex: new RegExp(this.toJsRegex(parsed.text, extended)),\n },\n pos: parsed.pos,\n };\n } catch {\n throw new Error(`invalid regex in address: '${parsed.text}'`);\n }\n }\n\n return null;\n }\n\n /**\n * Text up to the next unescaped delimiter, escapes kept (an escaped\n * delimiter becomes the plain character when it has no regex meaning).\n */\n private readDelimited(\n expr: string,\n pos: number,\n delimiter: string,\n ): { text: string; pos: number } {\n let text = '';\n while (pos < expr.length && expr[pos] !== delimiter) {\n if (expr[pos] === '\\\\' && pos + 1 < expr.length) {\n const next = expr[pos + 1];\n text += next === delimiter && /\\w|\\//.test(next) ? next : '\\\\' + next;\n pos += 2;\n } else {\n text += expr[pos];\n pos++;\n }\n }\n if (pos < expr.length) pos++; // skip the delimiter\n return { text, pos };\n }\n\n /**\n * Basic regular expressions use \\( \\) \\{ \\} \\+ \\? \\| for groups and\n * operators. When a pattern uses them (or never in -E mode), they are\n * turned into the JavaScript form and the bare characters made literal.\n */\n private toJsRegex(pattern: string, extended: boolean): string {\n if (extended || !/\\\\[(){}+?|]/.test(pattern)) return pattern;\n let out = '';\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === '\\\\' && i + 1 < pattern.length) {\n const next = pattern[++i];\n out += '(){}+?|'.includes(next) ? next : '\\\\' + next;\n } else if ('(){}+?|'.includes(ch)) {\n out += '\\\\' + ch;\n } else {\n out += ch;\n }\n }\n return out;\n }\n\n private parseSubstitution(\n expr: string,\n pos: number,\n base: Pick<SedExpression, 'start' | 'end' | 'negate' | 'active'>,\n extended: boolean,\n ): { expression: SedExpression; pos: number } {\n pos++; // skip 's'\n if (pos >= expr.length) {\n throw new Error(`invalid substitution expression: '${expr}'`);\n }\n\n const delimiter = expr[pos];\n const pattern = this.readDelimited(expr, pos + 1, delimiter);\n pos = pattern.pos;\n\n // Replacement: escapes kept for expandReplacement, except the delimiter\n let replacement = '';\n while (pos < expr.length && expr[pos] !== delimiter) {\n if (expr[pos] === '\\\\' && pos + 1 < expr.length) {\n replacement +=\n expr[pos + 1] === delimiter ? delimiter : '\\\\' + expr[pos + 1];\n pos += 2;\n } else {\n replacement += expr[pos];\n pos++;\n }\n }\n if (pos < expr.length) pos++; // skip delimiter\n\n // Flags, up to the end of the command\n let globalFlag = false;\n let caseInsensitive = false;\n let printFlag = false;\n let occurrence = '';\n while (pos < expr.length && !/[;\\n\\s}]/.test(expr[pos])) {\n const f = expr[pos];\n if (f === 'g') globalFlag = true;\n else if (f === 'i' || f === 'I') caseInsensitive = true;\n else if (f === 'p') printFlag = true;\n else if (f >= '0' && f <= '9') occurrence += f;\n else throw new Error(`unknown option to 's': '${f}'`);\n pos++;\n }\n const nth = occurrence ? parseInt(occurrence, 10) : undefined;\n if (nth === 0) {\n throw new Error(\"number option to 's' command may not be zero\");\n }\n\n let regexFlags = '';\n if (caseInsensitive) regexFlags += 'i';\n if (globalFlag || nth) regexFlags += 'g';\n\n let regex: RegExp;\n let groupCount: number;\n try {\n const source = this.toJsRegex(pattern.text, extended);\n regex = new RegExp(source, regexFlags);\n groupCount = (new RegExp(`${source}|`).exec('')?.length ?? 1) - 1;\n } catch {\n throw new Error(`invalid regex: '${pattern.text}'`);\n }\n\n return {\n expression: {\n ...base,\n command: 's',\n pattern: regex,\n replacement,\n groupCount,\n printFlag,\n occurrence: nth,\n globalFlag,\n },\n pos,\n };\n }\n\n private addressMatches(\n expr: SedExpression,\n lineNum: number,\n totalLines: number,\n lineText: string,\n ): boolean {\n let matches: boolean;\n if (!expr.start) {\n matches = true;\n } else if (!expr.end) {\n matches = this.singleMatches(expr.start, lineNum, totalLines, lineText);\n } else if (!expr.active) {\n matches = this.singleMatches(expr.start, lineNum, totalLines, lineText);\n if (matches) {\n // A line-number end at or before the start ends the range at once\n const end = expr.end;\n const endsHere =\n (end.type === 'line' && end.line <= lineNum) ||\n (end.type === 'last' && lineNum === totalLines);\n expr.active = !endsHere;\n }\n } else {\n matches = true;\n const end = expr.end;\n const endsHere =\n end.type === 'line'\n ? lineNum >= end.line\n : this.singleMatches(end, lineNum, totalLines, lineText);\n if (endsHere) expr.active = false;\n }\n return expr.negate ? !matches : matches;\n }\n\n private singleMatches(\n address: SedSingleAddress,\n lineNum: number,\n totalLines: number,\n lineText: string,\n ): boolean {\n switch (address.type) {\n case 'line':\n return lineNum === address.line;\n case 'last':\n return lineNum === totalLines;\n case 'regex':\n return address.regex.test(lineText);\n }\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\ninterface AwkRule {\n pattern: AwkPattern;\n action: string;\n}\n\ntype AwkPattern =\n | { type: 'all' }\n | { type: 'begin' }\n | { type: 'end' }\n | { type: 'regex'; regex: RegExp }\n | { type: 'comparison'; field: string; op: string; value: string };\n\nexport class CliAwkCommandProcessor implements ICliCommandProcessor {\n command = 'awk';\n description = 'Pattern scanning and text processing';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '🔧', module: 'file management' };\n\n parameters = [\n {\n name: 'F',\n aliases: [] as string[],\n description: 'Field separator (default: whitespace)',\n required: false,\n type: 'string' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.awk.help.process_text_records_fields', 'Process text as records and fields: each line is split into fields $1, $2, ... ($0 is the whole line), and each rule runs its { action } on matching lines. Supports BEGIN and END blocks, /regex/ and field comparison patterns, print, variables, NR and NF. Quote the program; a simple one also works unquoted (awk {print $1} file).'),\n );\n context.writer.writeln();\n writeUsage(context, [\n [\"awk '<program>' <file>\", t.t('cli.awk.help.run_program_over_file', 'Run a program over a file')],\n [\n \"awk -F <sep> '<program>' <file>\",\n t.t('cli.awk.help.split_fields_instead_spaces', 'Split fields on <sep> instead of spaces'),\n ],\n [\"<command> | awk '<program>'\", t.t('cli.awk.help.run_program_over_piped', 'Run a program over piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n [\"awk '{print $1}' data.txt\", t.t('cli.awk.help.print_first_column', 'Print the first column')],\n [\"awk -F , '{print $2}' data.csv\", t.t('cli.awk.help.second_column_csv', 'Second column of a CSV')],\n [\"awk '$3 > 100 {print $1}' sales.txt\", t.t('cli.awk.help.filter_rows_field', 'Filter rows by a field')],\n [\"awk '{s += $2} END {print s}' data.txt\", t.t('cli.awk.help.sum_second_column', 'Sum the second column')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const { program, filePaths, fieldSep } = this.parseArgs(command, fs);\n\n if (!program) {\n context.writer.writeError(\n \"awk: missing program. Usage: awk [-F sep] 'program' file\",\n );\n return;\n }\n\n let content = '';\n if (filePaths.length > 0) {\n // Several files are one stream of records\n for (const filePath of filePaths) {\n try {\n if (!fs.exists(filePath)) {\n context.writer.writeError(\n `awk: ${filePath}: No such file or directory`,\n );\n return;\n }\n const text = fs.readFile(filePath) ?? '';\n content += text === '' || text.endsWith('\\n') ? text : text + '\\n';\n } catch (e: any) {\n context.writer.writeError(`awk: ${e.message}`);\n return;\n }\n }\n } else if (command.data != null) {\n content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n }\n\n const rules = this.parseProgram(program);\n const lines = content\n ? content.replace(/\\n$/, '').split('\\n')\n : [];\n const fs_regex = fieldSep\n ? new RegExp(this.escapeRegex(fieldSep))\n : /\\s+/;\n\n const variables: Record<string, string | number> = {};\n const output: string[] = [];\n\n // Execute BEGIN rules\n for (const rule of rules) {\n if (rule.pattern.type === 'begin') {\n this.executeAction(\n rule.action,\n [],\n '',\n 0,\n 0,\n variables,\n output,\n );\n }\n }\n\n // Process each line\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const fields = line.split(fs_regex).filter((f) => f !== '');\n const nr = i + 1;\n const nf = fields.length;\n\n for (const rule of rules) {\n if (\n rule.pattern.type === 'begin' ||\n rule.pattern.type === 'end'\n ) {\n continue;\n }\n\n if (this.matchesPattern(rule.pattern, line, fields, nr)) {\n this.executeAction(\n rule.action,\n fields,\n line,\n nr,\n nf,\n variables,\n output,\n );\n }\n }\n }\n\n // Execute END rules\n for (const rule of rules) {\n if (rule.pattern.type === 'end') {\n this.executeAction(\n rule.action,\n [],\n '',\n lines.length,\n 0,\n variables,\n output,\n );\n }\n }\n\n for (const line of output) {\n context.writer.writeln(line);\n }\n }\n\n /**\n * The program is the first operand, usually quoted. Unquoted, it may span\n * several words (`awk {print $1} file`): it is then everything before the\n * trailing operands that are existing files, or the whole value with\n * piped input.\n */\n private parseArgs(\n command: CliProcessCommand,\n fs: IFileSystemService,\n ): { program: string | null; filePaths: string[]; fieldSep: string | null } {\n const raw = (command.value || '').trim();\n const fieldArg = command.args['F'];\n const fieldSep: string | null =\n fieldArg != null && fieldArg !== true ? String(fieldArg) : null;\n\n // Quoted program\n const quoted =\n raw.match(/^'((?:[^'\\\\]|\\\\.)*)'(?:\\s+|$)/) ??\n raw.match(/^\"((?:[^\"\\\\]|\\\\.)*)\"(?:\\s+|$)/);\n if (quoted) {\n return {\n program: quoted[1],\n filePaths: splitArgs(raw.slice(quoted[0].length)),\n fieldSep,\n };\n }\n\n const words = raw.split(/\\s+/).filter(Boolean);\n if (words.length === 0) {\n return { program: null, filePaths: [], fieldSep };\n }\n\n const isFile = (word: string): boolean => {\n try {\n const path = splitArgs(word).join(' ');\n return fs.exists(path) && !fs.isDirectory(path);\n } catch {\n return false;\n }\n };\n\n // Trailing words that are existing files\n let split = words.length;\n while (split > 1 && isFile(words[split - 1])) split--;\n\n if (split === words.length && command.data == null && words.length > 1) {\n // No file found and nothing piped: the last word is meant as the\n // file when the program before it is complete (balanced braces)\n const program = words.slice(0, -1).join(' ');\n const last = words[words.length - 1];\n if (this.bracesBalanced(program) && !/[{}]/.test(last)) {\n split = words.length - 1;\n }\n }\n\n return {\n program: words.slice(0, split).join(' '),\n filePaths: words.slice(split).map((w) => splitArgs(w).join(' ')),\n fieldSep,\n };\n }\n\n private bracesBalanced(text: string): boolean {\n let depth = 0;\n for (const ch of text) {\n if (ch === '{') depth++;\n else if (ch === '}' && --depth < 0) return false;\n }\n return depth === 0;\n }\n\n private parseProgram(program: string): AwkRule[] {\n const rules: AwkRule[] = [];\n let pos = 0;\n\n while (pos < program.length) {\n // Skip whitespace\n while (pos < program.length && /\\s/.test(program[pos])) pos++;\n if (pos >= program.length) break;\n\n let pattern: AwkPattern = { type: 'all' };\n let action = 'print $0';\n\n // Check for BEGIN\n if (program.slice(pos).startsWith('BEGIN')) {\n pattern = { type: 'begin' };\n pos += 5;\n while (pos < program.length && /\\s/.test(program[pos])) pos++;\n }\n // Check for END\n else if (program.slice(pos).startsWith('END')) {\n pattern = { type: 'end' };\n pos += 3;\n while (pos < program.length && /\\s/.test(program[pos])) pos++;\n }\n // Check for /regex/\n else if (program[pos] === '/') {\n const endSlash = program.indexOf('/', pos + 1);\n if (endSlash !== -1) {\n const regexStr = program.slice(pos + 1, endSlash);\n pattern = { type: 'regex', regex: new RegExp(regexStr) };\n pos = endSlash + 1;\n while (pos < program.length && /\\s/.test(program[pos]))\n pos++;\n }\n }\n // Check for field comparison ($N op value)\n else if (program[pos] === '$' && program[pos + 1] !== '0') {\n const compMatch = program\n .slice(pos)\n .match(\n /^\\$(\\w+)\\s*(>=|<=|!=|==|>|<)\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/,\n );\n if (compMatch) {\n pattern = {\n type: 'comparison',\n field: compMatch[1],\n op: compMatch[2],\n value:\n compMatch[3] ?? compMatch[4] ?? compMatch[5],\n };\n pos += compMatch[0].length;\n while (pos < program.length && /\\s/.test(program[pos]))\n pos++;\n }\n }\n\n // Extract action block\n if (pos < program.length && program[pos] === '{') {\n const actionEnd = this.findMatchingBrace(program, pos);\n action = program.slice(pos + 1, actionEnd).trim();\n pos = actionEnd + 1;\n } else if (pattern.type === 'all' && pos < program.length) {\n // No pattern matched and no brace — might be just an action block\n // or something unparseable, skip a char\n pos++;\n continue;\n }\n\n rules.push({ pattern, action });\n }\n\n return rules;\n }\n\n private findMatchingBrace(str: string, start: number): number {\n let depth = 0;\n let inSingleQuote = false;\n let inDoubleQuote = false;\n\n for (let i = start; i < str.length; i++) {\n const ch = str[i];\n if (inSingleQuote) {\n if (ch === \"'\") inSingleQuote = false;\n continue;\n }\n if (inDoubleQuote) {\n if (ch === '\"') inDoubleQuote = false;\n continue;\n }\n if (ch === \"'\") {\n inSingleQuote = true;\n } else if (ch === '\"') {\n inDoubleQuote = true;\n } else if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) return i;\n }\n }\n return str.length - 1;\n }\n\n private matchesPattern(\n pattern: AwkPattern,\n line: string,\n fields: string[],\n _nr: number,\n ): boolean {\n switch (pattern.type) {\n case 'all':\n return true;\n case 'regex':\n return pattern.regex.test(line);\n case 'comparison': {\n const fieldVal = this.getFieldValue(\n pattern.field,\n fields,\n line,\n );\n return this.compareValues(fieldVal, pattern.op, pattern.value);\n }\n default:\n return false;\n }\n }\n\n private getFieldValue(\n field: string,\n fields: string[],\n line: string,\n ): string {\n if (field === '0') return line;\n const idx = parseInt(field, 10);\n if (!isNaN(idx) && idx >= 1 && idx <= fields.length) {\n return fields[idx - 1];\n }\n return '';\n }\n\n private compareValues(a: string, op: string, b: string): boolean {\n const numA = Number(a);\n const numB = Number(b);\n const useNumeric = !isNaN(numA) && !isNaN(numB) && a !== '' && b !== '';\n\n switch (op) {\n case '==':\n return useNumeric ? numA === numB : a === b;\n case '!=':\n return useNumeric ? numA !== numB : a !== b;\n case '>':\n return useNumeric ? numA > numB : a > b;\n case '<':\n return useNumeric ? numA < numB : a < b;\n case '>=':\n return useNumeric ? numA >= numB : a >= b;\n case '<=':\n return useNumeric ? numA <= numB : a <= b;\n default:\n return false;\n }\n }\n\n private executeAction(\n action: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n output: string[],\n ): void {\n const statements = action.split(/\\s*;\\s*/);\n\n for (const stmt of statements) {\n const trimmed = stmt.trim();\n if (!trimmed) continue;\n\n if (trimmed.startsWith('print')) {\n this.executePrint(\n trimmed,\n fields,\n line,\n nr,\n nf,\n variables,\n output,\n );\n } else {\n // Assignment: variable op= expression or variable = expression\n this.executeAssignment(\n trimmed,\n fields,\n line,\n nr,\n nf,\n variables,\n );\n }\n }\n }\n\n private executePrint(\n stmt: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n output: string[],\n ): void {\n const argStr = stmt.slice(5).trim();\n\n if (!argStr) {\n output.push(line);\n return;\n }\n\n // Split by comma for OFS-separated output\n const commaParts = this.splitByComma(argStr);\n\n if (commaParts.length > 1) {\n // Comma-separated: each part printed with OFS (space)\n const values = commaParts.map((part) =>\n this.evaluateConcatExpr(\n part.trim(),\n fields,\n line,\n nr,\n nf,\n variables,\n ),\n );\n output.push(values.join(' '));\n } else {\n // Single expression (may contain concatenation)\n output.push(\n this.evaluateConcatExpr(\n argStr,\n fields,\n line,\n nr,\n nf,\n variables,\n ),\n );\n }\n }\n\n private splitByComma(expr: string): string[] {\n const parts: string[] = [];\n let current = '';\n let inQuote: string | null = null;\n\n for (let i = 0; i < expr.length; i++) {\n const ch = expr[i];\n if (inQuote) {\n current += ch;\n if (ch === inQuote) inQuote = null;\n } else if (ch === '\"' || ch === \"'\") {\n current += ch;\n inQuote = ch;\n } else if (ch === ',') {\n parts.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n if (current) parts.push(current);\n return parts;\n }\n\n private evaluateConcatExpr(\n expr: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n ): string {\n // Tokenize the expression into parts, then concatenate\n const tokens = this.tokenizeExpr(expr);\n return tokens\n .map((t) => this.resolveToken(t, fields, line, nr, nf, variables))\n .join('');\n }\n\n private tokenizeExpr(expr: string): string[] {\n const tokens: string[] = [];\n let pos = 0;\n\n while (pos < expr.length) {\n // Skip spaces (they act as concatenation separator)\n while (pos < expr.length && expr[pos] === ' ') pos++;\n if (pos >= expr.length) break;\n\n // Quoted string\n if (expr[pos] === '\"') {\n const end = expr.indexOf('\"', pos + 1);\n if (end !== -1) {\n tokens.push(expr.slice(pos, end + 1));\n pos = end + 1;\n } else {\n tokens.push(expr.slice(pos));\n break;\n }\n }\n // Field reference $N\n else if (expr[pos] === '$') {\n const match = expr.slice(pos).match(/^\\$(\\w+)/);\n if (match) {\n tokens.push(match[0]);\n pos += match[0].length;\n } else {\n tokens.push('$');\n pos++;\n }\n }\n // Identifier or number\n else {\n const match = expr.slice(pos).match(/^[\\w.]+/);\n if (match) {\n tokens.push(match[0]);\n pos += match[0].length;\n } else {\n // Other character (operator, etc.)\n tokens.push(expr[pos]);\n pos++;\n }\n }\n }\n\n return tokens;\n }\n\n private resolveToken(\n token: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n ): string {\n // Quoted string\n if (token.startsWith('\"') && token.endsWith('\"')) {\n return token.slice(1, -1);\n }\n\n // Field reference\n if (token.startsWith('$')) {\n const fieldRef = token.slice(1);\n if (fieldRef === '0') return line;\n if (fieldRef === 'NF') {\n const idx = nf;\n return idx >= 1 && idx <= fields.length\n ? fields[idx - 1]\n : '';\n }\n const idx = parseInt(fieldRef, 10);\n if (!isNaN(idx)) {\n return idx >= 1 && idx <= fields.length\n ? fields[idx - 1]\n : '';\n }\n return '';\n }\n\n // Built-in variables\n if (token === 'NR') return String(nr);\n if (token === 'NF') return String(nf);\n\n // User variable\n if (/^[a-zA-Z_]\\w*$/.test(token) && token in variables) {\n return String(variables[token]);\n }\n\n // Literal (number or unresolved)\n return token;\n }\n\n private executeAssignment(\n stmt: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n ): void {\n // Match: variable += expression\n const addAssign = stmt.match(/^([a-zA-Z_]\\w*)\\s*\\+=\\s*(.+)$/);\n if (addAssign) {\n const varName = addAssign[1];\n const exprVal = this.evaluateNumericExpr(\n addAssign[2].trim(),\n fields,\n line,\n nr,\n nf,\n variables,\n );\n if (!(varName in variables)) {\n variables[varName] = 0;\n }\n variables[varName] =\n (Number(variables[varName]) || 0) + exprVal;\n return;\n }\n\n // Match: variable -= expression\n const subAssign = stmt.match(/^([a-zA-Z_]\\w*)\\s*-=\\s*(.+)$/);\n if (subAssign) {\n const varName = subAssign[1];\n const exprVal = this.evaluateNumericExpr(\n subAssign[2].trim(),\n fields,\n line,\n nr,\n nf,\n variables,\n );\n if (!(varName in variables)) {\n variables[varName] = 0;\n }\n variables[varName] =\n (Number(variables[varName]) || 0) - exprVal;\n return;\n }\n\n // Match: variable = expression\n const assign = stmt.match(/^([a-zA-Z_]\\w*)\\s*=\\s*(.+)$/);\n if (assign) {\n const varName = assign[1];\n const exprStr = assign[2].trim();\n // Try numeric first\n const numVal = this.evaluateNumericExpr(\n exprStr,\n fields,\n line,\n nr,\n nf,\n variables,\n );\n variables[varName] = numVal;\n return;\n }\n\n // Variable increment: variable++\n const increment = stmt.match(/^([a-zA-Z_]\\w*)\\+\\+$/);\n if (increment) {\n const varName = increment[1];\n if (!(varName in variables)) variables[varName] = 0;\n variables[varName] = (Number(variables[varName]) || 0) + 1;\n return;\n }\n }\n\n private evaluateNumericExpr(\n expr: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n ): number {\n const resolved = this.resolveToken(\n expr.trim(),\n fields,\n line,\n nr,\n nf,\n variables,\n );\n return Number(resolved) || 0;\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n CliForegroundColor,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliDiffCommandProcessor implements ICliCommandProcessor {\n command = 'diff';\n description = 'Compare files line by line';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📝', module: 'file management' };\n\n parameters = [\n {\n name: 'unified',\n aliases: ['u'],\n description: 'Output in unified format',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'ignore-case',\n aliases: ['i'],\n description: 'Ignore case differences',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.diff.help.compare_two_files_line', 'Compare two files line by line and show what changed: lines starting with < (or -) are only in the first file, lines starting with > (or +) only in the second.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['diff <file1> <file2>', t.t('cli.diff.help.show_differences', 'Show the differences')],\n ['diff -u <file1> <file2>', t.t('cli.diff.help.unified_format_context', 'Unified format with context')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['diff old.txt new.txt', t.t('cli.diff.help.what_changed_between_versions', 'What changed between versions')],\n ['diff -u config.bak config.txt', t.t('cli.diff.help.review_edits_git_style', 'Review edits, git style')],\n ['diff -i a.txt b.txt', t.t('cli.diff.help.ignore_upper_lower_case', 'Ignore upper/lower case')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const unified = command.args['unified'] || command.args['u'] || false;\n const ignoreCase =\n command.args['ignore-case'] || command.args['i'] || false;\n const paths = this.parsePaths(command);\n\n if (paths.length < 2) {\n context.writer.writeError('diff: missing operand');\n return;\n }\n\n const file1 = paths[0];\n const file2 = paths[1];\n\n if (!fs.exists(file1)) {\n context.writer.writeError(\n `diff: ${file1}: No such file or directory`,\n );\n return;\n }\n if (!fs.exists(file2)) {\n context.writer.writeError(\n `diff: ${file2}: No such file or directory`,\n );\n return;\n }\n\n const content1 = fs.readFile(file1) || '';\n const content2 = fs.readFile(file2) || '';\n\n const lines1 = content1.split('\\n');\n const lines2 = content2.split('\\n');\n\n const lcs = this.computeLCS(lines1, lines2, ignoreCase);\n\n if (unified) {\n this.outputUnified(file1, file2, lines1, lines2, lcs, ignoreCase, context);\n } else {\n this.outputNormal(lines1, lines2, lcs, ignoreCase, context);\n }\n }\n\n private linesEqual(\n a: string,\n b: string,\n ignoreCase: boolean,\n ): boolean {\n if (ignoreCase) {\n return a.toLowerCase() === b.toLowerCase();\n }\n return a === b;\n }\n\n private computeLCS(\n lines1: string[],\n lines2: string[],\n ignoreCase: boolean,\n ): string[] {\n const m = lines1.length;\n const n = lines2.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n new Array(n + 1).fill(0),\n );\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (this.linesEqual(lines1[i - 1], lines2[j - 1], ignoreCase)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n // Backtrack to find LCS\n const result: string[] = [];\n let i = m;\n let j = n;\n while (i > 0 && j > 0) {\n if (this.linesEqual(lines1[i - 1], lines2[j - 1], ignoreCase)) {\n result.unshift(lines1[i - 1]);\n i--;\n j--;\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n i--;\n } else {\n j--;\n }\n }\n\n return result;\n }\n\n private outputNormal(\n lines1: string[],\n lines2: string[],\n lcs: string[],\n ignoreCase: boolean,\n context: ICliExecutionContext,\n ): void {\n let i1 = 0;\n let i2 = 0;\n let il = 0;\n\n while (i1 < lines1.length || i2 < lines2.length) {\n if (\n il < lcs.length &&\n i1 < lines1.length &&\n this.linesEqual(lines1[i1], lcs[il], ignoreCase)\n ) {\n if (i2 < lines2.length && this.linesEqual(lines2[i2], lcs[il], ignoreCase)) {\n i1++;\n i2++;\n il++;\n } else {\n const line = context.writer.wrapInColor(\n `> ${lines2[i2]}`,\n CliForegroundColor.Green,\n );\n context.writer.writeln(line);\n i2++;\n }\n } else if (i1 < lines1.length && (il >= lcs.length || !this.linesEqual(lines1[i1], lcs[il], ignoreCase))) {\n const line = context.writer.wrapInColor(\n `< ${lines1[i1]}`,\n CliForegroundColor.Red,\n );\n context.writer.writeln(line);\n i1++;\n } else if (i2 < lines2.length) {\n const line = context.writer.wrapInColor(\n `> ${lines2[i2]}`,\n CliForegroundColor.Green,\n );\n context.writer.writeln(line);\n i2++;\n } else {\n break;\n }\n }\n }\n\n private outputUnified(\n file1: string,\n file2: string,\n lines1: string[],\n lines2: string[],\n lcs: string[],\n ignoreCase: boolean,\n context: ICliExecutionContext,\n ): void {\n // Build diff entries\n const entries: Array<{ type: 'same' | 'remove' | 'add'; line: string }> = [];\n\n let i1 = 0;\n let i2 = 0;\n let il = 0;\n\n while (i1 < lines1.length || i2 < lines2.length) {\n if (\n il < lcs.length &&\n i1 < lines1.length &&\n this.linesEqual(lines1[i1], lcs[il], ignoreCase)\n ) {\n if (i2 < lines2.length && this.linesEqual(lines2[i2], lcs[il], ignoreCase)) {\n entries.push({ type: 'same', line: lines1[i1] });\n i1++;\n i2++;\n il++;\n } else {\n entries.push({ type: 'add', line: lines2[i2] });\n i2++;\n }\n } else if (i1 < lines1.length && (il >= lcs.length || !this.linesEqual(lines1[i1], lcs[il], ignoreCase))) {\n entries.push({ type: 'remove', line: lines1[i1] });\n i1++;\n } else if (i2 < lines2.length) {\n entries.push({ type: 'add', line: lines2[i2] });\n i2++;\n } else {\n break;\n }\n }\n\n // Check if there are any changes\n const hasChanges = entries.some((e) => e.type !== 'same');\n if (!hasChanges) return;\n\n // Output header\n context.writer.writeln(`--- ${file1}`);\n context.writer.writeln(`+++ ${file2}`);\n\n // Output hunk header\n context.writer.writeln(\n `@@ -1,${lines1.length} +1,${lines2.length} @@`,\n );\n\n // Output entries\n for (const entry of entries) {\n if (entry.type === 'same') {\n context.writer.writeln(` ${entry.line}`);\n } else if (entry.type === 'remove') {\n const line = context.writer.wrapInColor(\n `-${entry.line}`,\n CliForegroundColor.Red,\n );\n context.writer.writeln(line);\n } else {\n const line = context.writer.wrapInColor(\n `+${entry.line}`,\n CliForegroundColor.Green,\n );\n context.writer.writeln(line);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText } from '../utils/lines';\n\nexport class CliTeeCommandProcessor implements ICliCommandProcessor {\n command = 'tee';\n description = 'Copy piped input to files and to the output';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔀', module: 'file management' };\n\n parameters = [\n {\n name: 'append',\n aliases: ['a'],\n description: 'Append to the given files, do not overwrite',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tee.help.pass_piped_input_through', 'Pass piped input through unchanged and save a copy of it to every file named, overwriting them or appending with -a. Like Unix tee, it reads only piped input: to copy a file, pipe it in with cat.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['<command> | tee <file...>', t.t('cli.tee.help.show_piped_output_save', 'Show piped output and save it')],\n ['<command> | tee -a <file>', t.t('cli.tee.help.append_instead_overwriting', 'Append instead of overwriting')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cat notes.txt | tee copy.txt', t.t('cli.tee.help.show_save_copy', 'Show and save a copy')],\n ['echo done | tee -a log.txt', t.t('cli.tee.help.add_line_log', 'Add a line to a log')],\n [\n 'cat source.txt | tee a.txt b.txt',\n t.t('cli.tee.help.copy_source_txt_txt', 'Copy source.txt into a.txt and b.txt'),\n ],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const append = command.args['append'] || command.args['a'] || false;\n\n if (command.data == null) {\n // Unix tee copies standard input; it never reads a file operand\n context.writer.writeError(\n \"tee: no input: tee copies piped input to files and the output; use 'cat file | tee out.txt'\",\n );\n context.process.exit(1, { silent: true });\n return;\n }\n\n // As Unix tee: the input goes unchanged to the output and to every\n // file named (overwritten, or appended with -a)\n const content = pipedText(command.data);\n context.writer.writeln(content);\n\n // Files get the text as a line, like a `>` redirect\n const fileText =\n content === '' || content.endsWith('\\n') ? content : content + '\\n';\n let changed = false;\n for (const outFile of this.getAllPaths(command)) {\n try {\n fs.writeFile(outFile, fileText, append);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(`tee: ${e.message}`);\n }\n }\n if (changed) await fs.persist();\n }\n\n private getAllPaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n quoteShellWord,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText } from '../utils/lines';\n\nexport class CliXargsCommandProcessor implements ICliCommandProcessor {\n command = 'xargs';\n description = 'Build and execute commands from file input';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '⚡', module: 'file management' };\n\n parameters = [\n {\n name: 'replace',\n aliases: ['I'],\n description: 'Replace string in command template (e.g., -I {})',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'max-args',\n aliases: ['n'],\n description: 'Maximum number of arguments per command',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.xargs.help.run_command_arguments_taken', 'Run a command with arguments taken from input, separated by blanks or newlines. By default all of them are appended to one command; -n runs it in batches and -I runs it once per line, replacing a placeholder. xargs options go before the command; everything after it, flags included, belongs to the command. Input is piped text or, without a pipe, the last file named.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['<command> | xargs <cmd>', t.t('cli.xargs.help.append_input_lines', 'Append input lines to <cmd>')],\n ['<command> | xargs -I {} <cmd {}>', t.t('cli.xargs.help.run_once_per_line', 'Run <cmd> once per line')],\n ['xargs <cmd> <file>', t.t('cli.xargs.help.read_arguments_file', 'Read the arguments from a file')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['find . --name \"*.tmp\" | xargs rm', t.t('cli.xargs.help.delete_every_tmp_file', 'Delete every .tmp file')],\n [\n 'cat files.txt | xargs -I {} cp {} backup',\n t.t('cli.xargs.help.copy_each_listed_file', 'Copy each listed file'),\n ],\n ['cat dirs.txt | xargs -n 1 mkdir', t.t('cli.xargs.help.one_mkdir_per_line', 'One mkdir per line')],\n ['find . --name \"*.bak\" | xargs rm -r', t.t('cli.xargs.help.inner_command_keeps_flags', 'The inner command keeps its flags')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n // The engine takes every flag on the line for xargs, including the\n // inner command's (`xargs rm -r`), so the line is read again here:\n // xargs' own options come first, the rest is the inner command.\n let parsed: XargsLine;\n try {\n parsed = command.rawCommand\n ? parseXargsLine(command.rawCommand)\n : {\n replace: stringArg(command.args['replace'] ?? command.args['I']),\n maxArgs:\n parseInt(\n String(command.args['max-args'] ?? command.args['n'] ?? ''),\n 10,\n ) || undefined,\n words: splitWords(command.value ?? ''),\n };\n } catch (e: any) {\n context.writer.writeError(`xargs: ${e.message}`);\n return;\n }\n const replaceStr = parsed.replace;\n const maxArgs = parsed.maxArgs ?? 0;\n\n let commandTemplate: string;\n let argContent: string;\n\n if (command.data != null) {\n // Piped mode: the whole rest is the command (echo by default)\n commandTemplate = parsed.words.map((w) => w.raw).join(' ') || 'echo';\n argContent = pipedText(command.data);\n } else {\n // File mode: the last word is the input file\n if (parsed.words.length === 0) {\n context.writer.writeError('xargs: missing command');\n return;\n }\n if (parsed.words.length < 2) {\n context.writer.writeError('xargs: missing input file');\n return;\n }\n const inputFile = parsed.words[parsed.words.length - 1].value;\n commandTemplate = parsed.words\n .slice(0, -1)\n .map((w) => w.raw)\n .join(' ');\n if (!fs.exists(inputFile)) {\n context.writer.writeError(\n `xargs: ${inputFile}: No such file or directory`,\n );\n return;\n }\n argContent = fs.readFile(inputFile) || '';\n }\n\n const commands: string[] = [];\n\n if (replaceStr) {\n // Replace mode: one command per input line\n const lines = argContent\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n const placeholder = new RegExp(this.escapeRegex(replaceStr), 'g');\n for (const line of lines) {\n commands.push(\n commandTemplate.replace(placeholder, () => quoteArg(line)),\n );\n }\n } else {\n // Arguments are the blank-separated words of the input\n const args = splitArgs(argContent).map(quoteArg);\n if (args.length === 0) return;\n const size = maxArgs > 0 ? maxArgs : args.length;\n for (let i = 0; i < args.length; i += size) {\n commands.push(\n `${commandTemplate} ${args.slice(i, i + size).join(' ')}`,\n );\n }\n }\n\n // Try to execute via executor, or just output the commands\n const executor = context.executor;\n for (const cmd of commands) {\n if (executor && typeof executor.executeCommand === 'function') {\n try {\n await executor.executeCommand(cmd, context);\n } catch {\n context.writer.writeln(cmd);\n }\n } else {\n context.writer.writeln(cmd);\n }\n }\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n\ninterface XargsWord {\n /** As written, quotes included */\n raw: string;\n /** Without quotes */\n value: string;\n}\n\ninterface XargsLine {\n replace?: string;\n maxArgs?: number;\n /** The inner command (and, without piped input, the input file) */\n words: XargsWord[];\n}\n\n/** `xargs [-I str] [-n num] [--] command...` */\nfunction parseXargsLine(raw: string): XargsLine {\n const words = splitWords(raw).slice(1); // drop \"xargs\"\n const result: XargsLine = { words: [] };\n let i = 0;\n const valueOf = (option: string, inline: string): string => {\n if (inline !== '') return inline;\n if (i + 1 >= words.length) {\n throw new Error(`option requires an argument -- '${option}'`);\n }\n return words[++i].value;\n };\n\n for (; i < words.length; i++) {\n const word = words[i].raw;\n if (word === '--') {\n i++;\n break;\n }\n if (!word.startsWith('-') || word === '-') break;\n\n let match: RegExpMatchArray | null;\n if ((match = word.match(/^(?:-I|--replace(?:=|$))(.*)$/))) {\n result.replace = valueOf('I', unquote(match[1]));\n } else if (word === '-i') {\n result.replace = '{}';\n } else if ((match = word.match(/^(?:-n|--max-args(?:=|$))(.*)$/))) {\n const value = valueOf('n', unquote(match[1]));\n const count = parseInt(value, 10);\n if (isNaN(count) || count < 1) {\n throw new Error(`invalid number of arguments: '${value}'`);\n }\n result.maxArgs = count;\n } else {\n throw new Error(`invalid option -- '${word.replace(/^-+/, '')}'`);\n }\n }\n\n result.words = words.slice(i);\n return result;\n}\n\n/** Splits on blanks outside quotes, keeping each word as written. */\nfunction splitWords(raw: string): XargsWord[] {\n const words: XargsWord[] = [];\n const regex = /(?:\"(?:[^\"\\\\]|\\\\.)*\"|'[^']*'|[^\\s\"']|[\"'])+/g;\n for (const match of raw.matchAll(regex)) {\n words.push({ raw: match[0], value: splitArgs(match[0]).join(' ') });\n }\n return words;\n}\n\nfunction unquote(value: string): string {\n return splitArgs(value).join(' ');\n}\n\nfunction stringArg(value: unknown): string | undefined {\n return value == null || value === true || value === '' ? undefined : String(value);\n}\n\n/**\n * An input argument as one literal word of a command line, quoted when it\n * has any shell character, so `*`, `$VAR`, `$(...)`, braces and operators in\n * the input are data, never expanded or run.\n */\nfunction quoteArg(arg: string): string {\n return quoteShellWord(arg);\n}\n","import {\n CliProcessCommand,\n CliForegroundColor,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\n/**\n * Execute a script file containing CLI commands.\n *\n * Scripts run through the engine's shell runner (`@qodalis/cli`\n * `runScript`): commands, `;`, comments, `set -e`/`set +e`, `VAR=value`,\n * `if`/`elif`/`else`/`fi`, `for`/`while`/`until` loops, `break`/`continue`,\n * `exit`, and `test`/`[ ]` conditions.\n */\nexport class CliShCommandProcessor implements ICliCommandProcessor {\n command = 'sh';\n aliases = ['source', '.'];\n description = 'Execute a script file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📜', module: 'file management' };\n\n parameters = [\n {\n name: 'e',\n aliases: ['stop-on-error'],\n description: 'Stop execution on first error (default)',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n let words = splitArgs(command.value || '');\n\n // When invoked via alias (source, .), getRightOfWord fails to extract\n // the value because it looks for 'sh' in the command string. Fall back\n // to parsing the raw command (flags are not file names).\n if (words.length === 0 && command.rawCommand) {\n words = splitArgs(command.rawCommand)\n .slice(1)\n .filter((w) => !w.startsWith('-'));\n }\n const filePath = words[0] ?? '';\n\n if (!filePath) {\n context.writer.writeError('sh: missing file operand');\n context.process.exit(1, { silent: true });\n return;\n }\n\n const resolved = fs.resolvePath(filePath);\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `sh: ${filePath}: No such file or directory`,\n );\n context.process.exit(1, { silent: true });\n return;\n }\n\n if (node.type !== 'file') {\n context.writer.writeError(\n `sh: ${filePath}: Is a directory`,\n );\n context.process.exit(1, { silent: true });\n return;\n }\n\n const content = fs.readFile(resolved);\n if (content === null || content === undefined) {\n context.writer.writeError(\n `sh: ${filePath}: Cannot read file`,\n );\n context.process.exit(1, { silent: true });\n return;\n }\n\n await executeScript(content, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer, translator: t } = context;\n writer.writeln(t.t('cli.sh.description', this.description));\n writer.writeln();\n writer.writeln(t.t('cli.common.usage', 'Usage:'));\n writer.writeln(\n ` ${writer.wrapInColor('sh <script.sh>', CliForegroundColor.Cyan)}`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('source <script.sh>', CliForegroundColor.Cyan)}`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('. <script.sh>', CliForegroundColor.Cyan)}`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('./script.sh', CliForegroundColor.Cyan)} ${t.t('cli.sh.help.requires_execute', '(requires execute permission)')}`,\n );\n writer.writeln();\n writer.writeln(t.t('cli.sh.help.script_syntax', 'Script syntax:'));\n writer.writeln(` # ${t.t('cli.sh.help.comments', 'Lines starting with # are comments')}`);\n writer.writeln(` cmd1; cmd2 # ${t.t('cli.sh.help.several_commands', 'Several commands on one line')}`);\n writer.writeln(` VAR=value # ${t.t('cli.sh.help.assignment', 'Variable assignment')}`);\n writer.writeln(` echo $VAR # ${t.t('cli.sh.help.substitution', 'Variable substitution')}`);\n writer.writeln(` set -e # ${t.t('cli.sh.help.stop_on_error', 'Stop on error (default)')}`);\n writer.writeln(` set +e # ${t.t('cli.sh.help.continue_on_errors', 'Continue on errors')}`);\n writer.writeln(` exit [n] # ${t.t('cli.sh.help.exit', 'Stop the script with status n')}`);\n writer.writeln();\n writer.writeln(t.t('cli.sh.help.control_flow', 'Control flow:'));\n writer.writeln(' if cmd; then ...; elif cmd; then ...; else ...; fi');\n writer.writeln(' for NAME in a b *.txt; do ...; done');\n writer.writeln(` while cmd; do ...; done ${t.t('cli.sh.help.until', '(until cmd: the opposite)')}`);\n writer.writeln(` break / continue [n] # ${t.t('cli.sh.help.break_continue', 'Leave / skip in a loop')}`);\n writer.writeln(` ! cmd # ${t.t('cli.sh.help.negate', 'Negate the exit status')}`);\n writer.writeln(\n ` ${t.t('cli.sh.help.conditions', 'Conditions are commands:')} ${writer.wrapInColor('[ -f file ]', CliForegroundColor.Cyan)}, ${writer.wrapInColor('test \"$A\" = b', CliForegroundColor.Cyan)}, ${writer.wrapInColor('true', CliForegroundColor.Cyan)}, ${writer.wrapInColor('grep x file', CliForegroundColor.Cyan)}`,\n );\n writer.writeln(` ${t.t('cli.sh.help.conditions_status', '(status 0 = true; see help test). Loops stop after 10000 iterations')}`);\n writer.writeln(` ${t.t('cli.sh.help.conditions_loops', 'of while/until; Ctrl+C stops the script.')}`);\n writer.writeln();\n writer.writeln(t.t('cli.sh.help.example_script', 'Example script:'));\n writer.writeln(\n writer.wrapInColor(\n ' #!/bin/sh\\n' +\n ' # Setup script\\n' +\n ' NAME=world\\n' +\n ' echo Hello $NAME\\n' +\n ' mkdir -p /tmp/test\\n' +\n ' for f in a b c; do\\n' +\n ' echo $f > /tmp/test/$f.txt\\n' +\n ' done\\n' +\n ' if [ -f /tmp/test/a.txt ]; then\\n' +\n ' echo done > /tmp/test/status.txt\\n' +\n ' fi',\n CliForegroundColor.Green,\n ),\n );\n }\n}\n\n/** The script runner `@qodalis/cli` provides as a service. */\ninterface CliScriptRunner {\n run(\n content: string,\n context: ICliExecutionContext,\n options?: { name?: string },\n ): Promise<number>;\n}\n\nconst SCRIPT_RUNNER_TOKEN = 'cli-script-runner';\n\n/**\n * Execute script content with the engine's shell runner (control flow,\n * variables, `set -e`), the same one used for `./script.sh`.\n */\nexport async function executeScript(\n content: string,\n context: ICliExecutionContext,\n): Promise<void> {\n const runner = context.services.get<CliScriptRunner>(SCRIPT_RUNNER_TOKEN);\n if (!runner) {\n context.writer.writeError('sh: script runner not available (update @qodalis/cli)');\n context.process.exit(1, { silent: true });\n return;\n }\n await runner.run(content, context, { name: 'sh' });\n}\n","import { CliAccessAction, CliAccessDeniedError, ICliOwnership } from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { CliFileAccessPolicy, IFileSystemService } from '../interfaces/i-file-system-service';\n\nconst DB_NAME = 'qodalis-cli-filesystem';\nconst STORE_NAME = 'filesystem';\nconst ROOT_KEY = 'root';\nconst CWD_KEY = 'cwd';\nconst HOME_KEY = 'home';\nconst DEFAULT_HOME = '/';\n\n/** Owner of system directories and of legacy nodes created without an owner */\nexport const SYSTEM_OWNERSHIP: ICliOwnership = { uid: 'root', gid: 'admin' };\n/** Owner of files created while nobody is signed in */\nexport const ANONYMOUS_OWNERSHIP: ICliOwnership = { uid: 'nobody', gid: 'nogroup' };\n\nfunction createSeedFileSystem(): IFileNode {\n const now = Date.now();\n return {\n name: '',\n type: 'directory',\n children: [\n {\n name: 'home',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n },\n {\n name: 'tmp',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxrwxrwx',\n },\n {\n name: 'etc',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n },\n ],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n };\n}\n\nexport class IndexedDbFileSystemService implements IFileSystemService {\n private root: IFileNode = createSeedFileSystem();\n private cwd: string = DEFAULT_HOME;\n private homePath: string = DEFAULT_HOME;\n private currentUid: string | null = null;\n private currentGroups: string[] = [];\n private accessPolicy?: CliFileAccessPolicy;\n private systemDepth = 0;\n\n // --- Access control ---\n\n setAccessPolicy(policy?: CliFileAccessPolicy): void {\n this.accessPolicy = policy;\n }\n\n runAsSystem<T>(fn: () => T): T {\n this.systemDepth++;\n try {\n return fn();\n } finally {\n this.systemDepth--;\n }\n }\n\n reassignOwner(fromUid: string, toUid: string): number {\n const from = fromUid.toLowerCase();\n if (!from || !toUid) return 0;\n let changed = 0;\n const visit = (node: IFileNode) => {\n if (node.ownership && node.ownership.uid.toLowerCase() === from) {\n node.ownership = { ...node.ownership, uid: toUid };\n changed++;\n }\n node.children?.forEach(visit);\n };\n visit(this.root);\n return changed;\n }\n\n canTraverse(path: string): boolean {\n try {\n this.assertTraverse(this.resolvePath(path), 'stat', path);\n return true;\n } catch {\n return false;\n }\n }\n\n private get enforcing(): boolean {\n return !!this.accessPolicy && this.systemDepth === 0;\n }\n\n private deny(op: string, path: string, reason = 'Permission denied'): never {\n throw new CliAccessDeniedError(`${op}: ${path}: ${reason}`);\n }\n\n /** `x` on every existing directory on the way to `resolved` (excluding the target). */\n private assertTraverse(resolved: string, op: string, display: string): void {\n if (!this.enforcing) return;\n const parts = resolved.split('/').filter(Boolean);\n let current: IFileNode | undefined = this.root;\n for (let i = 0; i < parts.length; i++) {\n if (!current || current.type !== 'directory') return;\n if (!this.accessPolicy!.canAccess(current, 'execute')) this.deny(op, display);\n current = current.children?.find((c) => c.name === parts[i]);\n }\n }\n\n private assertAccess(node: IFileNode, action: CliAccessAction, op: string, display: string): void {\n if (this.enforcing && !this.accessPolicy!.canAccess(node, action)) this.deny(op, display);\n }\n\n /** Recursive delete: every directory inside must allow removing its entries (`w` + `x`, readable). */\n private assertRemovableTree(dir: IFileNode, dirPath: string, display: string): void {\n if (!this.enforcing) return;\n this.assertAccess(dir, 'read', 'rm', display);\n this.assertAccess(dir, 'execute', 'rm', display);\n if ((dir.children?.length ?? 0) > 0) this.assertAccess(dir, 'write', 'rm', display);\n for (const child of dir.children ?? []) {\n if (child.type === 'directory') this.assertRemovableTree(child, `${dirPath}/${child.name}`, display);\n }\n }\n\n /** Copying reads everything it copies: `r` on every file, `r` + `x` on every directory. */\n private assertReadableTree(node: IFileNode, display: string): void {\n if (!this.enforcing) return;\n this.assertAccess(node, 'read', 'cp', display);\n if (node.type !== 'directory') return;\n this.assertAccess(node, 'execute', 'cp', display);\n for (const child of node.children ?? []) {\n this.assertReadableTree(child, `${display.replace(/\\/+$/, '')}/${child.name}`);\n }\n }\n\n /** Creating/removing entries needs `w` and `x` on the containing directory. */\n private assertModifyDir(dir: IFileNode, dirPath: string, op: string, display: string): void {\n if (!this.enforcing) return;\n this.assertTraverse(dirPath, op, display);\n this.assertAccess(dir, 'execute', op, display);\n this.assertAccess(dir, 'write', op, display);\n }\n\n // --- User context ---\n\n setCurrentUser(uid: string, groups: string[]): void {\n this.currentUid = uid;\n this.currentGroups = groups;\n }\n\n private getDefaultOwnership(): ICliOwnership | undefined {\n if (!this.currentUid) {\n // With access control active, nothing is created ownerless\n return this.accessPolicy ? { ...ANONYMOUS_OWNERSHIP } : undefined;\n }\n return {\n uid: this.currentUid,\n gid: this.currentGroups[0] || 'users',\n };\n }\n\n // --- Navigation ---\n\n getCurrentDirectory(): string {\n return this.cwd;\n }\n\n setCurrentDirectory(path: string): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`cd: ${path}: No such file or directory`);\n }\n if (node.type !== 'directory') {\n throw new Error(`cd: ${path}: Not a directory`);\n }\n this.assertTraverse(resolved, 'cd', path);\n this.assertAccess(node, 'execute', 'cd', path);\n this.cwd = resolved;\n }\n\n getHomePath(): string {\n return this.homePath;\n }\n\n setHomePath(path: string): void {\n this.homePath = path;\n }\n\n resolvePath(path: string): string {\n if (path === '~' || path === '') {\n return this.homePath;\n }\n if (path.startsWith('~/')) {\n path = this.homePath + path.substring(1);\n }\n\n const parts = path.startsWith('/')\n ? path.split('/')\n : (this.cwd + '/' + path).split('/');\n\n const resolved: string[] = [];\n for (const part of parts) {\n if (part === '' || part === '.') {\n continue;\n } else if (part === '..') {\n resolved.pop();\n } else {\n resolved.push(part);\n }\n }\n\n return '/' + resolved.join('/');\n }\n\n // --- Read operations ---\n\n getNode(path: string): IFileNode | null {\n const resolved = path === '/' ? '/' : this.resolvePath(path);\n if (resolved === '/') {\n return this.root;\n }\n\n const parts = resolved.split('/').filter(Boolean);\n let current = this.root;\n\n for (const part of parts) {\n if (current.type !== 'directory' || !current.children) {\n return null;\n }\n const child = current.children.find((c) => c.name === part);\n if (!child) {\n return null;\n }\n current = child;\n }\n\n return current;\n }\n\n listDirectory(path: string): IFileNode[] {\n const node = this.getNode(path);\n if (!node) {\n throw new Error(`ls: ${path}: No such file or directory`);\n }\n if (node.type !== 'directory') {\n throw new Error(`ls: ${path}: Not a directory`);\n }\n this.assertTraverse(this.resolvePath(path), 'ls', path);\n this.assertAccess(node, 'read', 'ls', path);\n return node.children || [];\n }\n\n readFile(path: string): string | null {\n const node = this.getNode(path);\n if (!node) {\n throw new Error(`cat: ${path}: No such file or directory`);\n }\n if (node.type === 'directory') {\n throw new Error(`cat: ${path}: Is a directory`);\n }\n this.assertTraverse(this.resolvePath(path), 'cat', path);\n this.assertAccess(node, 'read', 'cat', path);\n return node.content ?? '';\n }\n\n exists(path: string): boolean {\n return this.getNode(path) !== null;\n }\n\n isDirectory(path: string): boolean {\n const node = this.getNode(path);\n return node !== null && node.type === 'directory';\n }\n\n // --- Write operations ---\n\n createDirectory(path: string, recursive = false): void {\n const resolved = this.resolvePath(path);\n const parts = resolved.split('/').filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(`mkdir: cannot create directory '/': File exists`);\n }\n\n if (recursive) {\n let current = this.root;\n for (const part of parts) {\n if (!current.children) {\n current.children = [];\n }\n let child = current.children.find((c) => c.name === part);\n if (!child) {\n if (this.enforcing) {\n this.assertAccess(current, 'execute', 'mkdir', path);\n this.assertAccess(current, 'write', 'mkdir', path);\n }\n const now = Date.now();\n child = {\n name: part,\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n ownership: this.getDefaultOwnership(),\n };\n current.children.push(child);\n current.modifiedAt = now;\n } else if (child.type !== 'directory') {\n throw new Error(`mkdir: ${part}: Not a directory`);\n } else {\n this.assertAccess(child, 'execute', 'mkdir', path);\n }\n current = child;\n }\n } else {\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const dirName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent) {\n throw new Error(\n `mkdir: ${parentPath}: No such file or directory`,\n );\n }\n if (parent.type !== 'directory') {\n throw new Error(`mkdir: ${parentPath}: Not a directory`);\n }\n if (parent.children?.find((c) => c.name === dirName)) {\n throw new Error(`mkdir: ${path}: File exists`);\n }\n this.assertModifyDir(parent, parentPath, 'mkdir', path);\n\n const now = Date.now();\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push({\n name: dirName,\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n ownership: this.getDefaultOwnership(),\n });\n parent.modifiedAt = now;\n }\n }\n\n createFile(path: string, content = ''): void {\n const resolved = this.resolvePath(path);\n const parts = resolved.split('/').filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(`touch: cannot create file at root`);\n }\n\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const fileName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent) {\n throw new Error(`touch: ${parentPath}: No such file or directory`);\n }\n if (parent.type !== 'directory') {\n throw new Error(`touch: ${parentPath}: Not a directory`);\n }\n\n const existing = parent.children?.find((c) => c.name === fileName);\n const now = Date.now();\n\n if (existing) {\n this.assertTraverse(resolved, 'touch', path);\n this.assertAccess(existing, 'write', 'touch', path);\n } else {\n this.assertModifyDir(parent, parentPath, 'touch', path);\n }\n\n if (existing) {\n existing.modifiedAt = now;\n } else {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push({\n name: fileName,\n type: 'file',\n content,\n createdAt: now,\n modifiedAt: now,\n size: new Blob([content]).size,\n permissions: 'rw-r--r--',\n ownership: this.getDefaultOwnership(),\n });\n parent.modifiedAt = now;\n }\n }\n\n writeFile(path: string, content: string, append = false): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n\n if (node) {\n if (node.type === 'directory') {\n throw new Error(`write: ${path}: Is a directory`);\n }\n this.assertTraverse(resolved, 'write', path);\n this.assertAccess(node, 'write', 'write', path);\n const now = Date.now();\n node.content = append ? (node.content ?? '') + content : content;\n node.size = new Blob([node.content]).size;\n node.modifiedAt = now;\n } else {\n this.createFile(resolved, content);\n }\n }\n\n remove(path: string, recursive = false): void {\n const resolved = this.resolvePath(path);\n if (resolved === '/') {\n throw new Error(`rm: cannot remove root directory`);\n }\n\n const parts = resolved.split('/').filter(Boolean);\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const name = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent || !parent.children) {\n throw new Error(`rm: ${path}: No such file or directory`);\n }\n\n const index = parent.children.findIndex((c) => c.name === name);\n if (index === -1) {\n throw new Error(`rm: ${path}: No such file or directory`);\n }\n\n const target = parent.children[index];\n if (target.type === 'directory' && !recursive) {\n throw new Error(`rm: ${path}: Is a directory`);\n }\n this.assertModifyDir(parent, parentPath, 'rm', path);\n if (target.type === 'directory') this.assertRemovableTree(target, resolved, path);\n\n parent.children.splice(index, 1);\n parent.modifiedAt = Date.now();\n }\n\n copy(src: string, dest: string, recursive = false): void {\n const srcResolved = this.resolvePath(src);\n const srcNode = this.getNode(srcResolved);\n\n if (!srcNode) {\n throw new Error(`cp: ${src}: No such file or directory`);\n }\n if (srcNode.type === 'directory' && !recursive) {\n throw new Error(\n `cp: -r not specified; omitting directory '${src}'`,\n );\n }\n this.assertTraverse(srcResolved, 'cp', src);\n this.assertReadableTree(srcNode, src);\n\n const destResolved = this.resolvePath(dest);\n const destNode = this.getNode(destResolved);\n\n if (destNode && destNode.type === 'directory') {\n this.assertModifyDir(destNode, destResolved, 'cp', dest);\n const clone = this.ownedByCurrentUser(this.cloneNode(srcNode));\n if (!destNode.children) {\n destNode.children = [];\n }\n const existingIdx = destNode.children.findIndex(\n (c) => c.name === clone.name,\n );\n if (existingIdx !== -1) {\n destNode.children.splice(existingIdx, 1);\n }\n destNode.children.push(clone);\n destNode.modifiedAt = Date.now();\n } else {\n const parts = destResolved.split('/').filter(Boolean);\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const newName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent || parent.type !== 'directory') {\n throw new Error(`cp: ${parentPath}: No such file or directory`);\n }\n this.assertModifyDir(parent, parentPath, 'cp', dest);\n\n const clone = this.ownedByCurrentUser(this.cloneNode(srcNode));\n clone.name = newName;\n if (!parent.children) {\n parent.children = [];\n }\n const existingIdx = parent.children.findIndex(\n (c) => c.name === newName,\n );\n if (existingIdx !== -1) {\n parent.children.splice(existingIdx, 1);\n }\n parent.children.push(clone);\n parent.modifiedAt = Date.now();\n }\n }\n\n move(src: string, dest: string): void {\n const srcResolved = this.resolvePath(src);\n if (srcResolved === '/') {\n throw new Error(`mv: cannot move root directory`);\n }\n\n const srcNode = this.getNode(srcResolved);\n if (!srcNode) {\n throw new Error(`mv: ${src}: No such file or directory`);\n }\n\n const destResolved = this.resolvePath(dest);\n const destNode = this.getNode(destResolved);\n\n // A directory cannot go inside itself (it would detach from the tree)\n if (\n srcNode.type === 'directory' &&\n (destResolved === srcResolved ||\n destResolved.startsWith(srcResolved + '/'))\n ) {\n throw new Error(\n `mv: cannot move '${src}' to a subdirectory of itself, '${dest}'`,\n );\n }\n\n const srcParts = srcResolved.split('/').filter(Boolean);\n const srcParentPath = '/' + srcParts.slice(0, -1).join('/');\n const srcParent = this.getNode(srcParentPath);\n\n if (!srcParent || !srcParent.children) {\n throw new Error(`mv: ${src}: No such file or directory`);\n }\n this.assertModifyDir(srcParent, srcParentPath, 'mv', src);\n\n // Into the directory it is already in, or onto itself: nothing to do\n if (\n destResolved === srcResolved ||\n (destNode && destNode.type === 'directory' && destNode === srcParent)\n ) {\n throw new Error(`mv: '${src}' and '${dest}' are the same file`);\n }\n\n if (destNode && destNode.type === 'directory') {\n this.assertModifyDir(destNode, destResolved, 'mv', dest);\n if (!destNode.children) {\n destNode.children = [];\n }\n const existingIdx = destNode.children.findIndex(\n (c) => c.name === srcNode.name,\n );\n if (existingIdx !== -1) {\n destNode.children.splice(existingIdx, 1);\n }\n // By identity: the index may have moved\n srcParent.children.splice(srcParent.children.indexOf(srcNode), 1);\n destNode.children.push(srcNode);\n destNode.modifiedAt = Date.now();\n } else {\n const destParts = destResolved.split('/').filter(Boolean);\n const destParentPath = '/' + destParts.slice(0, -1).join('/');\n const newName = destParts[destParts.length - 1];\n const destParent = this.getNode(destParentPath);\n\n if (!destParent || destParent.type !== 'directory') {\n throw new Error(\n `mv: ${destParentPath}: No such file or directory`,\n );\n }\n this.assertModifyDir(destParent, destParentPath, 'mv', dest);\n\n // By identity: the index may have moved\n srcParent.children.splice(srcParent.children.indexOf(srcNode), 1);\n srcNode.name = newName;\n if (!destParent.children) {\n destParent.children = [];\n }\n const existingIdx = destParent.children.findIndex(\n (c) => c.name === newName,\n );\n if (existingIdx !== -1) {\n destParent.children.splice(existingIdx, 1);\n }\n destParent.children.push(srcNode);\n destParent.modifiedAt = Date.now();\n }\n\n srcParent.modifiedAt = Date.now();\n }\n\n // --- Permissions ---\n\n chmod(path: string, permissions: string): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`chmod: ${path}: No such file or directory`);\n }\n if (this.enforcing && !this.accessPolicy!.canChangeOwnership(node)) {\n this.deny('chmod', path, 'Operation not permitted');\n }\n node.permissions = permissions;\n }\n\n chown(path: string, ownership: ICliOwnership): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`chown: ${path}: No such file or directory`);\n }\n if (this.enforcing && !this.accessPolicy!.canChangeOwnership(node, ownership)) {\n this.deny('chown', path, 'Operation not permitted');\n }\n node.ownership = ownership;\n }\n\n // --- Persistence ---\n\n async initialize(): Promise<void> {\n const db = await this.openDb();\n try {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n\n const rootData = await this.idbGet<IFileNode>(store, ROOT_KEY);\n const cwdData = await this.idbGet<string>(store, CWD_KEY);\n const homeData = await this.idbGet<string>(store, HOME_KEY);\n\n if (rootData) {\n this.root = rootData;\n }\n if (cwdData) {\n this.cwd = cwdData;\n }\n if (homeData) {\n this.homePath = homeData;\n }\n } finally {\n db.close();\n }\n }\n\n async persist(): Promise<void> {\n const db = await this.openDb();\n try {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n\n store.put(this.root, ROOT_KEY);\n // The saved directory is the signed-out one (and the only one without\n // a users module): a signed-in user always starts in their home, and\n // must not leave their directory behind for whoever comes next\n if (!this.currentUid) {\n store.put(this.cwd, CWD_KEY);\n store.put(this.homePath, HOME_KEY);\n }\n\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } finally {\n db.close();\n }\n }\n\n // --- Private helpers ---\n\n /** A copy belongs to whoever made it (like `cp` without `-p`) */\n private ownedByCurrentUser(node: IFileNode): IFileNode {\n const owner = this.getDefaultOwnership();\n if (owner) {\n const apply = (n: IFileNode) => {\n n.ownership = { ...owner };\n n.children?.forEach(apply);\n };\n apply(node);\n }\n return node;\n }\n\n private cloneNode(node: IFileNode): IFileNode {\n const now = Date.now();\n const clone: IFileNode = {\n name: node.name,\n type: node.type,\n createdAt: now,\n modifiedAt: now,\n size: node.size,\n permissions: node.permissions,\n ownership: node.ownership ? { ...node.ownership } : undefined,\n };\n\n if (node.type === 'file') {\n clone.content = node.content;\n } else {\n clone.children = (node.children || []).map((c) =>\n this.cloneNode(c),\n );\n }\n\n return clone;\n }\n\n private openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, 1);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n private idbGet<T>(store: IDBObjectStore, key: string): Promise<T | null> {\n return new Promise((resolve, reject) => {\n const request = store.get(key);\n request.onsuccess = () => resolve(request.result ?? null);\n request.onerror = () => reject(request.error);\n });\n }\n}\n","import { ICliOwnership, CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService } from '../interfaces/i-file-system-service';\n\nconst DEFAULT_HOME = '/home/user';\n\n/**\n * Configuration options for the ServerFileSystemService.\n */\nexport interface ServerFileSystemOptions {\n /** Base URL of the CLI server, e.g. 'http://localhost:8047' */\n baseUrl: string;\n /** Custom headers sent with every request (e.g. auth tokens) */\n headers?: CliHeadersProvider;\n}\n\n/**\n * Response shape from GET /api/qcli/fs/ls\n */\ninterface LsResponse {\n entries: Array<{\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n }>;\n}\n\n/**\n * Response shape from GET /api/qcli/fs/cat\n */\ninterface CatResponse {\n content: string;\n}\n\n/**\n * Response shape from GET /api/qcli/fs/stat\n */\ninterface StatResponse {\n name: string;\n type: 'file' | 'directory';\n size: number;\n created: string;\n modified: string;\n permissions?: string;\n}\n\n/**\n * Creates a minimal root seed filesystem for initial local state.\n */\nfunction createSeedFileSystem(): IFileNode {\n const now = Date.now();\n return {\n name: '',\n type: 'directory',\n children: [\n {\n name: 'home',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n },\n {\n name: 'tmp',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxrwxrwx',\n },\n {\n name: 'etc',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n },\n ],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n };\n}\n\n/**\n * IFileSystemService implementation that delegates operations to a CLI server's\n * `/api/qcli/fs/*` REST endpoints.\n *\n * Because the IFileSystemService interface is synchronous, this service maintains\n * an in-memory file tree that is returned immediately by read operations. Write\n * operations update the local tree first (for instant feedback) and then fire\n * asynchronous requests to the server for persistence. The `initialize()` method\n * fetches the initial directory listing from the server.\n */\nexport class ServerFileSystemService implements IFileSystemService {\n private root: IFileNode = createSeedFileSystem();\n private cwd: string = DEFAULT_HOME;\n private homePath: string = DEFAULT_HOME;\n private currentUid: string | null = null;\n private currentGroups: string[] = [];\n private readonly baseUrl: string;\n private readonly headersProvider: CliHeadersProvider | undefined;\n\n constructor(options: ServerFileSystemOptions) {\n // Strip trailing slash for consistent URL building\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.headersProvider = options.headers;\n }\n\n // --- User context ---\n\n setCurrentUser(uid: string, groups: string[]): void {\n this.currentUid = uid;\n this.currentGroups = groups;\n }\n\n private getDefaultOwnership(): ICliOwnership | undefined {\n if (!this.currentUid) return undefined;\n return {\n uid: this.currentUid,\n gid: this.currentGroups[0] || 'users',\n };\n }\n\n // --- Navigation ---\n\n getCurrentDirectory(): string {\n return this.cwd;\n }\n\n setCurrentDirectory(path: string): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`cd: ${path}: No such file or directory`);\n }\n if (node.type !== 'directory') {\n throw new Error(`cd: ${path}: Not a directory`);\n }\n this.cwd = resolved;\n }\n\n getHomePath(): string {\n return this.homePath;\n }\n\n setHomePath(path: string): void {\n this.homePath = path;\n }\n\n resolvePath(path: string): string {\n if (path === '~' || path === '') {\n return this.homePath;\n }\n if (path.startsWith('~/')) {\n path = this.homePath + path.substring(1);\n }\n\n const parts = path.startsWith('/')\n ? path.split('/')\n : (this.cwd + '/' + path).split('/');\n\n const resolved: string[] = [];\n for (const part of parts) {\n if (part === '' || part === '.') {\n continue;\n } else if (part === '..') {\n resolved.pop();\n } else {\n resolved.push(part);\n }\n }\n\n return '/' + resolved.join('/');\n }\n\n // --- Read operations (synchronous, from local cache) ---\n\n getNode(path: string): IFileNode | null {\n const resolved = path === '/' ? '/' : this.resolvePath(path);\n if (resolved === '/') {\n return this.root;\n }\n\n const parts = resolved.split('/').filter(Boolean);\n let current = this.root;\n\n for (const part of parts) {\n if (current.type !== 'directory' || !current.children) {\n return null;\n }\n const child = current.children.find((c) => c.name === part);\n if (!child) {\n return null;\n }\n current = child;\n }\n\n return current;\n }\n\n listDirectory(path: string): IFileNode[] {\n const node = this.getNode(path);\n if (!node) {\n throw new Error(`ls: ${path}: No such file or directory`);\n }\n if (node.type !== 'directory') {\n throw new Error(`ls: ${path}: Not a directory`);\n }\n return node.children || [];\n }\n\n readFile(path: string): string | null {\n const node = this.getNode(path);\n if (!node) {\n throw new Error(`cat: ${path}: No such file or directory`);\n }\n if (node.type === 'directory') {\n throw new Error(`cat: ${path}: Is a directory`);\n }\n return node.content ?? '';\n }\n\n exists(path: string): boolean {\n return this.getNode(path) !== null;\n }\n\n isDirectory(path: string): boolean {\n const node = this.getNode(path);\n return node !== null && node.type === 'directory';\n }\n\n // --- Write operations (update local cache + fire-and-forget server call) ---\n\n createDirectory(path: string, recursive = false): void {\n const resolved = this.resolvePath(path);\n const parts = resolved.split('/').filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(`mkdir: cannot create directory '/': File exists`);\n }\n\n if (recursive) {\n let current = this.root;\n for (const part of parts) {\n if (!current.children) {\n current.children = [];\n }\n let child = current.children.find((c) => c.name === part);\n if (!child) {\n const now = Date.now();\n child = {\n name: part,\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n ownership: this.getDefaultOwnership(),\n };\n current.children.push(child);\n current.modifiedAt = now;\n } else if (child.type !== 'directory') {\n throw new Error(`mkdir: ${part}: Not a directory`);\n }\n current = child;\n }\n } else {\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const dirName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent) {\n throw new Error(\n `mkdir: ${parentPath}: No such file or directory`,\n );\n }\n if (parent.type !== 'directory') {\n throw new Error(`mkdir: ${parentPath}: Not a directory`);\n }\n if (parent.children?.find((c) => c.name === dirName)) {\n throw new Error(`mkdir: ${path}: File exists`);\n }\n\n const now = Date.now();\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push({\n name: dirName,\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n ownership: this.getDefaultOwnership(),\n });\n parent.modifiedAt = now;\n }\n\n // Fire-and-forget server call\n this.serverMkdir(resolved).catch((err) =>\n console.error('[ServerFS] mkdir failed:', err),\n );\n }\n\n createFile(path: string, content = ''): void {\n const resolved = this.resolvePath(path);\n const parts = resolved.split('/').filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(`touch: cannot create file at root`);\n }\n\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const fileName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent) {\n throw new Error(`touch: ${parentPath}: No such file or directory`);\n }\n if (parent.type !== 'directory') {\n throw new Error(`touch: ${parentPath}: Not a directory`);\n }\n\n const existing = parent.children?.find((c) => c.name === fileName);\n const now = Date.now();\n\n if (existing) {\n existing.modifiedAt = now;\n } else {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push({\n name: fileName,\n type: 'file',\n content,\n createdAt: now,\n modifiedAt: now,\n size: new Blob([content]).size,\n permissions: 'rw-r--r--',\n ownership: this.getDefaultOwnership(),\n });\n parent.modifiedAt = now;\n }\n\n // Fire-and-forget server upload\n this.serverUpload(resolved, content).catch((err) =>\n console.error('[ServerFS] createFile upload failed:', err),\n );\n }\n\n writeFile(path: string, content: string, append = false): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n\n if (node) {\n if (node.type === 'directory') {\n throw new Error(`write: ${path}: Is a directory`);\n }\n const now = Date.now();\n node.content = append ? (node.content ?? '') + content : content;\n node.size = new Blob([node.content]).size;\n node.modifiedAt = now;\n } else {\n this.createFile(resolved, content);\n return; // createFile already handles server upload\n }\n\n // Fire-and-forget server upload with full content\n this.serverUpload(resolved, node.content!).catch((err) =>\n console.error('[ServerFS] writeFile upload failed:', err),\n );\n }\n\n remove(path: string, recursive = false): void {\n const resolved = this.resolvePath(path);\n if (resolved === '/') {\n throw new Error(`rm: cannot remove root directory`);\n }\n\n const parts = resolved.split('/').filter(Boolean);\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const name = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent || !parent.children) {\n throw new Error(`rm: ${path}: No such file or directory`);\n }\n\n const index = parent.children.findIndex((c) => c.name === name);\n if (index === -1) {\n throw new Error(`rm: ${path}: No such file or directory`);\n }\n\n const target = parent.children[index];\n if (target.type === 'directory' && !recursive) {\n throw new Error(`rm: ${path}: Is a directory`);\n }\n\n parent.children.splice(index, 1);\n parent.modifiedAt = Date.now();\n\n // Fire-and-forget server call\n this.serverRm(resolved).catch((err) =>\n console.error('[ServerFS] rm failed:', err),\n );\n }\n\n copy(src: string, dest: string, recursive = false): void {\n const srcResolved = this.resolvePath(src);\n const srcNode = this.getNode(srcResolved);\n\n if (!srcNode) {\n throw new Error(`cp: ${src}: No such file or directory`);\n }\n if (srcNode.type === 'directory' && !recursive) {\n throw new Error(\n `cp: -r not specified; omitting directory '${src}'`,\n );\n }\n\n const destResolved = this.resolvePath(dest);\n const destNode = this.getNode(destResolved);\n\n if (destNode && destNode.type === 'directory') {\n const clone = this.cloneNode(srcNode);\n if (!destNode.children) {\n destNode.children = [];\n }\n const existingIdx = destNode.children.findIndex(\n (c) => c.name === clone.name,\n );\n if (existingIdx !== -1) {\n destNode.children.splice(existingIdx, 1);\n }\n destNode.children.push(clone);\n destNode.modifiedAt = Date.now();\n } else {\n const parts = destResolved.split('/').filter(Boolean);\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const newName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent || parent.type !== 'directory') {\n throw new Error(`cp: ${parentPath}: No such file or directory`);\n }\n\n const clone = this.cloneNode(srcNode);\n clone.name = newName;\n if (!parent.children) {\n parent.children = [];\n }\n const existingIdx = parent.children.findIndex(\n (c) => c.name === newName,\n );\n if (existingIdx !== -1) {\n parent.children.splice(existingIdx, 1);\n }\n parent.children.push(clone);\n parent.modifiedAt = Date.now();\n }\n\n // Sync copied files to server (upload all file nodes in the clone)\n this.syncTreeToServer(destResolved).catch((err) =>\n console.error('[ServerFS] copy sync failed:', err),\n );\n }\n\n move(src: string, dest: string): void {\n const srcResolved = this.resolvePath(src);\n if (srcResolved === '/') {\n throw new Error(`mv: cannot move root directory`);\n }\n\n const srcNode = this.getNode(srcResolved);\n if (!srcNode) {\n throw new Error(`mv: ${src}: No such file or directory`);\n }\n\n const destResolved = this.resolvePath(dest);\n const destNode = this.getNode(destResolved);\n\n // A directory cannot go inside itself (it would detach from the tree)\n if (\n srcNode.type === 'directory' &&\n (destResolved === srcResolved ||\n destResolved.startsWith(srcResolved + '/'))\n ) {\n throw new Error(\n `mv: cannot move '${src}' to a subdirectory of itself, '${dest}'`,\n );\n }\n\n const srcParts = srcResolved.split('/').filter(Boolean);\n const srcParentPath = '/' + srcParts.slice(0, -1).join('/');\n const srcParent = this.getNode(srcParentPath);\n\n if (!srcParent || !srcParent.children) {\n throw new Error(`mv: ${src}: No such file or directory`);\n }\n\n // Into the directory it is already in, or onto itself: nothing to do\n if (\n destResolved === srcResolved ||\n (destNode && destNode.type === 'directory' && destNode === srcParent)\n ) {\n throw new Error(`mv: '${src}' and '${dest}' are the same file`);\n }\n\n if (destNode && destNode.type === 'directory') {\n if (!destNode.children) {\n destNode.children = [];\n }\n const existingIdx = destNode.children.findIndex(\n (c) => c.name === srcNode.name,\n );\n if (existingIdx !== -1) {\n destNode.children.splice(existingIdx, 1);\n }\n // By identity: the index may have moved\n srcParent.children.splice(srcParent.children.indexOf(srcNode), 1);\n destNode.children.push(srcNode);\n destNode.modifiedAt = Date.now();\n } else {\n const destParts = destResolved.split('/').filter(Boolean);\n const destParentPath = '/' + destParts.slice(0, -1).join('/');\n const newName = destParts[destParts.length - 1];\n const destParent = this.getNode(destParentPath);\n\n if (!destParent || destParent.type !== 'directory') {\n throw new Error(\n `mv: ${destParentPath}: No such file or directory`,\n );\n }\n\n // By identity: the index may have moved\n srcParent.children.splice(srcParent.children.indexOf(srcNode), 1);\n srcNode.name = newName;\n if (!destParent.children) {\n destParent.children = [];\n }\n const existingIdx = destParent.children.findIndex(\n (c) => c.name === newName,\n );\n if (existingIdx !== -1) {\n destParent.children.splice(existingIdx, 1);\n }\n destParent.children.push(srcNode);\n destParent.modifiedAt = Date.now();\n }\n\n srcParent.modifiedAt = Date.now();\n\n // Server-side: remove old, upload to new location\n this.serverRm(srcResolved)\n .then(() => this.syncTreeToServer(destResolved))\n .catch((err) =>\n console.error('[ServerFS] move sync failed:', err),\n );\n }\n\n // --- Permissions (local-only, server has no endpoints) ---\n\n chmod(path: string, permissions: string): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`chmod: ${path}: No such file or directory`);\n }\n node.permissions = permissions;\n }\n\n chown(path: string, ownership: ICliOwnership): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`chown: ${path}: No such file or directory`);\n }\n node.ownership = ownership;\n }\n\n // --- Persistence ---\n\n /**\n * Fetches the root directory listing from the server and populates the\n * local in-memory file tree. Recursively loads subdirectories.\n */\n async initialize(): Promise<void> {\n try {\n await this.loadDirectoryFromServer('/', this.root);\n } catch (err) {\n console.error(\n '[ServerFS] Failed to initialize from server, using seed filesystem:',\n err,\n );\n }\n }\n\n /**\n * No-op for server-backed storage — the server persists automatically.\n */\n async persist(): Promise<void> {\n // Server handles persistence; nothing to do locally.\n }\n\n // --- Private: server communication ---\n\n private async serverFetch<T>(\n endpoint: string,\n options?: RequestInit,\n ): Promise<T> {\n const url = `${this.baseUrl}/api/qcli/fs${endpoint}`;\n const mergedHeaders: Record<string, string> = {\n ...resolveHeaders(this.headersProvider),\n ...((options?.headers as Record<string, string>) ?? {}),\n };\n const response = await fetch(url, {\n ...options,\n headers: mergedHeaders,\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Server responded with ${response.status}: ${body}`,\n );\n }\n return response.json();\n }\n\n private async serverLs(path: string): Promise<LsResponse> {\n return this.serverFetch<LsResponse>(\n `/ls?path=${encodeURIComponent(path)}`,\n );\n }\n\n private async serverCat(path: string): Promise<CatResponse> {\n return this.serverFetch<CatResponse>(\n `/cat?path=${encodeURIComponent(path)}`,\n );\n }\n\n private async serverStat(path: string): Promise<StatResponse> {\n return this.serverFetch<StatResponse>(\n `/stat?path=${encodeURIComponent(path)}`,\n );\n }\n\n private async serverMkdir(path: string): Promise<void> {\n await this.serverFetch<{ path: string }>('/mkdir', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path }),\n });\n }\n\n private async serverUpload(path: string, content: string): Promise<void> {\n const formData = new FormData();\n formData.append('path', path);\n formData.append(\n 'file',\n new Blob([content], { type: 'application/octet-stream' }),\n path.split('/').pop() || 'file',\n );\n await this.serverFetch<{ path: string; size: number }>('/upload', {\n method: 'POST',\n body: formData,\n });\n }\n\n private async serverRm(path: string): Promise<void> {\n await this.serverFetch<{ deleted: string }>(\n `/rm?path=${encodeURIComponent(path)}`,\n { method: 'DELETE' },\n );\n }\n\n /**\n * Recursively loads directory contents from the server into a local node.\n */\n private async loadDirectoryFromServer(\n path: string,\n node: IFileNode,\n ): Promise<void> {\n const response = await this.serverLs(path);\n const now = Date.now();\n\n node.children = [];\n\n for (const entry of response.entries) {\n const childPath =\n path === '/' ? `/${entry.name}` : `${path}/${entry.name}`;\n\n if (entry.type === 'directory') {\n const dirNode: IFileNode = {\n name: entry.name,\n type: 'directory',\n children: [],\n createdAt: new Date(entry.modified).getTime() || now,\n modifiedAt: new Date(entry.modified).getTime() || now,\n size: entry.size,\n permissions: entry.permissions || 'rwxr-xr-x',\n };\n node.children.push(dirNode);\n\n // Recursively load subdirectory contents\n try {\n await this.loadDirectoryFromServer(childPath, dirNode);\n } catch {\n // If a subdirectory fails to load, keep it empty\n }\n } else {\n // For files, fetch content eagerly so readFile() works synchronously\n let content = '';\n try {\n const catResponse = await this.serverCat(childPath);\n content = catResponse.content;\n } catch {\n // If content fetch fails, store empty string\n }\n\n node.children.push({\n name: entry.name,\n type: 'file',\n content,\n createdAt: new Date(entry.modified).getTime() || now,\n modifiedAt: new Date(entry.modified).getTime() || now,\n size: entry.size,\n permissions: entry.permissions || 'rw-r--r--',\n });\n }\n }\n }\n\n /**\n * Uploads all file nodes under the given path to the server.\n * Used after copy/move to sync the local tree to the server.\n */\n private async syncTreeToServer(path: string): Promise<void> {\n const node = this.getNode(path);\n if (!node) return;\n\n if (node.type === 'file') {\n await this.serverUpload(path, node.content ?? '');\n } else if (node.type === 'directory') {\n await this.serverMkdir(path);\n if (node.children) {\n for (const child of node.children) {\n const childPath = path === '/'\n ? `/${child.name}`\n : `${path}/${child.name}`;\n await this.syncTreeToServer(childPath);\n }\n }\n }\n }\n\n // --- Private: tree helpers ---\n\n private cloneNode(node: IFileNode): IFileNode {\n const now = Date.now();\n const clone: IFileNode = {\n name: node.name,\n type: node.type,\n createdAt: now,\n modifiedAt: now,\n size: node.size,\n permissions: node.permissions,\n ownership: node.ownership ? { ...node.ownership } : undefined,\n };\n\n if (node.type === 'file') {\n clone.content = node.content;\n } else {\n clone.children = (node.children || []).map((c) =>\n this.cloneNode(c),\n );\n }\n\n return clone;\n }\n}\n","import {\n ICliFileTransferService,\n ICliFileEntry,\n BrowserFileTransferService,\n} from '@qodalis/cli-core';\nimport { IFileSystemService } from '../interfaces';\n\nexport class VirtualFsFileTransferService implements ICliFileTransferService {\n private readonly _browserService = new BrowserFileTransferService();\n\n constructor(private readonly _fs: IFileSystemService) {}\n\n async readFile(path: string): Promise<string | null> {\n const resolved = this._fs.resolvePath(path);\n return this._fs.readFile(resolved);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const resolved = this._fs.resolvePath(path);\n this._fs.writeFile(resolved, content);\n await this._fs.persist();\n }\n\n async listFiles(path: string): Promise<ICliFileEntry[]> {\n const resolved = this._fs.resolvePath(path);\n const nodes = this._fs.listDirectory(resolved);\n return nodes.map((node) => ({\n name: node.name,\n type: node.type === 'directory' ? ('directory' as const) : ('file' as const),\n size: node.size || 0,\n modified: node.modifiedAt\n ? new Date(node.modifiedAt).toISOString()\n : new Date().toISOString(),\n }));\n }\n\n async exists(path: string): Promise<boolean> {\n const resolved = this._fs.resolvePath(path);\n return this._fs.exists(resolved);\n }\n\n downloadToBrowser(filename: string, content: string | Blob): void {\n this._browserService.downloadToBrowser(filename, content);\n }\n\n async uploadFromBrowser(accept?: string): Promise<{ name: string; content: string } | null> {\n return this._browserService.uploadFromBrowser(accept);\n }\n}\n","import {\n cliCanAccess,\n ICliAuthorizationService,\n ICliAuthorizationService_TOKEN,\n ICliExecutionContext,\n ICliOwnership,\n ICliUserEvent,\n ICliUserEventService,\n ICliUserEventService_TOKEN,\n ICliUserSession,\n ICliUserSessionService,\n ICliUserSessionService_TOKEN,\n} from '@qodalis/cli-core';\nimport { Subscription } from 'rxjs';\nimport { CliFileAccessPolicy, IFileSystemService } from '../interfaces/i-file-system-service';\nimport { SYSTEM_OWNERSHIP } from './indexed-db-file-system.service';\n\n/** Permissions the files module understands. */\nexport const CliFilesPermissions = {\n /** Bypass all file permission checks */\n Admin: 'files:admin',\n /** chmod/chown files you do not own */\n Chown: 'files:chown',\n} as const;\n\n/** Mode for newly created home directories (owner full, group read/traverse) */\nexport const HOME_DIR_PERMISSIONS = 'rwxr-x---';\n\nfunction authorization(context: ICliExecutionContext): ICliAuthorizationService | undefined {\n try {\n return context.services.get<ICliAuthorizationService>(ICliAuthorizationService_TOKEN);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Access policy built on the generic authorization layer. Allows everything\n * when no authorization service is registered (no auth module loaded).\n */\nexport function createFileAccessPolicy(context: ICliExecutionContext): CliFileAccessPolicy {\n return {\n // Nodes without an owner (system seed, legacy data) belong to root:admin\n canAccess: (node, action) =>\n cliCanAccess(\n context,\n node.ownership ? node : { ...node, ownership: SYSTEM_OWNERSHIP },\n action,\n [CliFilesPermissions.Admin],\n ),\n canChangeOwnership: (node, newOwnership?: ICliOwnership) => {\n const auth = authorization(context);\n if (!auth) return true;\n if (auth.can(CliFilesPermissions.Admin) || auth.can(CliFilesPermissions.Chown)) return true;\n const principal = auth.getPrincipal();\n if (!principal) return false;\n // Unowned nodes belong to root: claiming them needs files:chown\n const owns = !!node.ownership && (node.ownership.uid === principal.name || node.ownership.uid === principal.id);\n // Owners may change mode and group, but not give files away\n const keepsOwner = !newOwnership || newOwnership.uid === node.ownership?.uid || newOwnership.uid === principal.name;\n return owns && keepsOwner;\n },\n };\n}\n\n/**\n * Follow the signed-in user (from any auth module that provides\n * {@link ICliUserSessionService}): ownership for new files, home directory\n * creation and `~`, and moving to the home directory when the user changes.\n */\nexport function followUserSession(context: ICliExecutionContext, fs: IFileSystemService): Subscription | undefined {\n let sessions: ICliUserSessionService | undefined;\n try {\n sessions = context.services.get<ICliUserSessionService>(ICliUserSessionService_TOKEN);\n } catch {\n sessions = undefined;\n }\n if (!sessions) return undefined;\n\n let previousUser: string | null = null;\n return sessions.getUserSession().subscribe((session: ICliUserSession | undefined) => {\n if (!session?.user) {\n fs.setCurrentUser('', []);\n // Signed out (or restored signed out): don't stay in someone's home\n if (previousUser !== null || !canEnter(fs, fs.getCurrentDirectory())) {\n try {\n fs.setCurrentDirectory('/');\n void fs.persist(); // the next boot's first prompt starts at /\n } catch {\n // keep the current directory\n }\n }\n previousUser = null;\n return;\n }\n const user = session.user;\n fs.setCurrentUser(user.name, user.groups ?? []);\n if (user.homeDir) {\n const home = user.homeDir;\n const system = <T>(fn: () => T): T => (fs.runAsSystem ? fs.runAsSystem(fn) : fn());\n if (!fs.exists(home)) {\n system(() => {\n fs.createDirectory(home, true);\n if (home !== '/') {\n fs.chown(home, { uid: user.name, gid: user.groups?.[0] ?? 'users' });\n fs.chmod(home, HOME_DIR_PERMISSIONS);\n }\n });\n void fs.persist();\n }\n fs.setHomePath(home);\n if (previousUser !== user.id) {\n try {\n fs.setCurrentDirectory(home);\n } catch {\n // not accessible: stay where we are\n }\n }\n }\n previousUser = user.id;\n });\n}\n\n/** Same check as `cd`: traverse the parents and execute the directory itself */\nfunction canEnter(fs: IFileSystemService, path: string): boolean {\n try {\n fs.setCurrentDirectory(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Keep file ownership (stored by login name) in step with the accounts of\n * any auth module that emits {@link ICliUserEventService} events: a rename\n * moves the user's files to the new name, a deletion gives them to `root`, so\n * a later account with the same name never inherits them. Runs as a system\n * task (no rwx checks for the acting user). No-op without such a module.\n */\nexport function followUserAccounts(context: ICliExecutionContext, fs: IFileSystemService): Subscription | undefined {\n let events: ICliUserEventService | undefined;\n try {\n events = context.services.get<ICliUserEventService>(ICliUserEventService_TOKEN);\n } catch {\n events = undefined;\n }\n if (!events || !fs.reassignOwner) return undefined;\n\n return events.events$.subscribe((event: ICliUserEvent) => {\n let changed = 0;\n if (event.type === 'user_updated' && event.previousName && event.previousName !== event.user?.name) {\n changed = fs.reassignOwner!(event.previousName, event.user.name);\n } else if (event.type === 'user_deleted' && event.user?.name) {\n changed = fs.reassignOwner!(event.user.name, SYSTEM_OWNERSHIP.uid);\n }\n if (changed > 0) void fs.persist().catch(() => undefined);\n });\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n} from '@qodalis/cli-core';\nimport { IFileSystemService } from '../interfaces/i-file-system-service';\n\n/** Commands that accept file/directory path arguments. */\nconst FILE_COMMANDS = new Set([\n 'ls',\n 'cd',\n 'cat',\n 'cp',\n 'mv',\n 'rm',\n 'touch',\n 'mkdir',\n 'rmdir',\n 'tree',\n 'echo',\n 'nano',\n 'edit',\n 'grep',\n 'find',\n 'head',\n 'tail',\n 'wc',\n 'sort',\n 'uniq',\n 'cut',\n 'paste',\n 'tac',\n 'diff',\n 'sed',\n 'awk',\n 'du',\n 'stat',\n 'chmod',\n 'chown',\n 'ln',\n 'tee',\n 'basename',\n 'dirname',\n 'sh',\n 'source',\n 'xargs',\n]);\n\n/**\n * Provides tab-completion for file and directory names from the virtual filesystem.\n * Priority 50 (checked before command/parameter providers for file-related commands).\n */\nexport class FilePathCompletionProvider implements ICliCompletionProvider {\n priority = 50;\n\n constructor(private readonly fs: IFileSystemService) {}\n\n getCompletions(context: ICliCompletionContext): string[] {\n const { tokens, tokenIndex, token } = context;\n\n // Only activate when the command is a file command and we're completing an argument\n if (tokenIndex === 0) {\n return []; // Let command completion handle the first token\n }\n\n const command = tokens[0];\n if (!FILE_COMMANDS.has(command)) {\n return [];\n }\n\n // Skip flag tokens\n if (token.startsWith('-')) {\n return [];\n }\n\n // A name with spaces is completed in quotes: `cat \"my no` -> `cat \"my notes.txt\"`\n const quote = token.startsWith('\"') || token.startsWith(\"'\") ? token[0] : '';\n const partial = quote ? token.slice(1).replace(new RegExp(`${quote}$`), '') : token;\n const paths = this.completePath(partial);\n if (!quote && !paths.some((p) => /\\s/.test(p))) {\n return paths;\n }\n const q = quote || '\"';\n // Directories stay open so the completion can go on inside them\n return paths.map((p) => (p.endsWith('/') ? `${q}${p}` : `${q}${p}${q}`));\n }\n\n private completePath(partial: string): string[] {\n // Split into directory part and name prefix\n let dirPath: string;\n let namePrefix: string;\n\n if (partial.includes('/')) {\n const lastSlash = partial.lastIndexOf('/');\n dirPath = partial.slice(0, lastSlash) || '/';\n namePrefix = partial.slice(lastSlash + 1);\n } else {\n dirPath = this.fs.getCurrentDirectory();\n namePrefix = partial;\n }\n\n // Resolve the directory\n let resolvedDir: string;\n try {\n resolvedDir = this.fs.resolvePath(dirPath);\n } catch {\n return [];\n }\n\n if (!this.fs.exists(resolvedDir) || !this.fs.isDirectory(resolvedDir)) {\n return [];\n }\n\n // List entries and filter by prefix\n const entries = this.fs.listDirectory(resolvedDir);\n const lowerPrefix = namePrefix.toLowerCase();\n\n const results: string[] = [];\n for (const entry of entries) {\n if (entry.name.toLowerCase().startsWith(lowerPrefix)) {\n // Build the completion string preserving the directory prefix\n let completion: string;\n if (partial.includes('/')) {\n const lastSlash = partial.lastIndexOf('/');\n completion = partial.slice(0, lastSlash + 1) + entry.name;\n } else {\n completion = entry.name;\n }\n\n // Append / for directories\n if (entry.type === 'directory') {\n completion += '/';\n }\n\n results.push(completion);\n }\n }\n\n return results.sort();\n }\n}\n","import {\n CliProcessCommand,\n CliForegroundColor,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliUploadCommandProcessor implements ICliCommandProcessor {\n command = 'upload';\n description = 'Upload a file from your local machine into the virtual filesystem';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📤', module: 'file management' };\n\n parameters = [\n {\n name: 'accept',\n description: 'File type filter (e.g. \".json,.txt\" or \"image/*\")',\n required: false,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const accept = command.args?.['accept'] as string | undefined;\n const destPath = command.value?.trim() || undefined;\n\n context.spinner?.show('Waiting for file selection...');\n context.notifier.info('Waiting for file selection');\n\n const picked = await fileService.uploadFromBrowser(accept);\n\n if (!picked) {\n context.spinner?.hide();\n context.writer.writeln('Upload cancelled.');\n return;\n }\n\n const cwd = fs.getCurrentDirectory();\n const filename = destPath || picked.name;\n const resolved = fs.resolvePath(\n filename.startsWith('/') ? filename : cwd + '/' + filename,\n );\n\n context.spinner?.show(`Saving \"${picked.name}\" (${picked.content.length} bytes)...`);\n context.notifier.info(`Saving ${picked.name}`);\n\n try {\n fs.writeFile(resolved, picked.content);\n await fs.persist();\n context.spinner?.hide();\n context.writer.writeSuccess(\n `Uploaded ${context.writer.wrapInColor(picked.name, CliForegroundColor.Cyan)} (${picked.content.length} bytes) → ${resolved}`,\n );\n } catch (e: any) {\n context.spinner?.hide();\n context.writer.writeError(e.message || 'Failed to write file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' upload Open file picker, save to current directory');\n context.writer.writeln(' upload myfile.txt Open file picker, save as myfile.txt');\n context.writer.writeln(' upload /home/user/data Open file picker, save to absolute path');\n context.writer.writeln(' upload --accept=\".json\" Filter file picker to .json files');\n }\n}\n","/*\n * Public API Surface of files\n */\n\nexport * from './lib/index';\n\nimport { ICliModule, ICliConfigurableModule, ICliCompletionProvider_TOKEN, ICliFileTransferService_TOKEN, ICliDragDropService, ICliDragDropService_TOKEN, ICliExecutionContext } from '@qodalis/cli-core';\nimport { Subscription } from 'rxjs';\nimport { API_VERSION } from './lib/version';\nimport { IFileSystemService_TOKEN } from './lib/interfaces';\nimport { IndexedDbFileSystemService, VirtualFsFileTransferService } from './lib/services';\nimport { IFileSystemService } from './lib/interfaces';\nimport { CliFilesPermissions, createFileAccessPolicy, followUserAccounts, followUserSession } from './lib/services/files-access';\nimport { FilePathCompletionProvider } from './lib/completion/file-path-completion-provider';\nimport { CliLsCommandProcessor } from './lib/processors/cli-ls-command-processor';\nimport { CliCdCommandProcessor } from './lib/processors/cli-cd-command-processor';\nimport { CliPwdCommandProcessor } from './lib/processors/cli-pwd-command-processor';\nimport { CliMkdirCommandProcessor } from './lib/processors/cli-mkdir-command-processor';\nimport { CliRmdirCommandProcessor } from './lib/processors/cli-rmdir-command-processor';\nimport { CliTouchCommandProcessor } from './lib/processors/cli-touch-command-processor';\nimport { CliCatCommandProcessor } from './lib/processors/cli-cat-command-processor';\nimport { CliEchoCommandProcessor } from './lib/processors/cli-echo-command-processor';\nimport { CliRmCommandProcessor } from './lib/processors/cli-rm-command-processor';\nimport { CliCpCommandProcessor } from './lib/processors/cli-cp-command-processor';\nimport { CliMvCommandProcessor } from './lib/processors/cli-mv-command-processor';\nimport { CliTreeCommandProcessor } from './lib/processors/cli-tree-command-processor';\nimport { CliHeadCommandProcessor } from './lib/processors/cli-head-command-processor';\nimport { CliTailCommandProcessor } from './lib/processors/cli-tail-command-processor';\nimport { CliWcCommandProcessor } from './lib/processors/cli-wc-command-processor';\nimport { CliFindCommandProcessor } from './lib/processors/cli-find-command-processor';\nimport { CliGrepCommandProcessor } from './lib/processors/cli-grep-command-processor';\nimport { CliTacCommandProcessor } from './lib/processors/cli-tac-command-processor';\nimport { CliBasenameCommandProcessor } from './lib/processors/cli-basename-command-processor';\nimport { CliDirnameCommandProcessor } from './lib/processors/cli-dirname-command-processor';\nimport { CliSortCommandProcessor } from './lib/processors/cli-sort-command-processor';\nimport { CliUniqCommandProcessor } from './lib/processors/cli-uniq-command-processor';\nimport { CliCutCommandProcessor } from './lib/processors/cli-cut-command-processor';\nimport { CliPasteCommandProcessor } from './lib/processors/cli-paste-command-processor';\nimport { CliTrCommandProcessor } from './lib/processors/cli-tr-command-processor';\nimport { CliStatCommandProcessor } from './lib/processors/cli-stat-command-processor';\nimport { CliChmodCommandProcessor } from './lib/processors/cli-chmod-command-processor';\nimport { CliChownCommandProcessor } from './lib/processors/cli-chown-command-processor';\nimport { CliDuCommandProcessor } from './lib/processors/cli-du-command-processor';\nimport { CliLnCommandProcessor } from './lib/processors/cli-ln-command-processor';\nimport { CliSedCommandProcessor } from './lib/processors/cli-sed-command-processor';\nimport { CliAwkCommandProcessor } from './lib/processors/cli-awk-command-processor';\nimport { CliDiffCommandProcessor } from './lib/processors/cli-diff-command-processor';\nimport { CliTeeCommandProcessor } from './lib/processors/cli-tee-command-processor';\nimport { CliXargsCommandProcessor } from './lib/processors/cli-xargs-command-processor';\nimport { CliShCommandProcessor } from './lib/processors/cli-sh-command-processor';\nimport { CliUploadCommandProcessor } from './lib/processors/cli-upload-command-processor';\n\n/**\n * Configuration options for the files module.\n */\nexport interface CliFilesModuleConfig {\n /**\n * Whether to show the current working directory in the CLI prompt.\n * @default true\n */\n showPathInPrompt?: boolean;\n}\n\ninterface ICliFilesModule extends ICliConfigurableModule<CliFilesModuleConfig> {\n /** Subscription for drag-and-drop file uploads, cleaned up in onDestroy */\n _dragDropSubscription?: Subscription;\n /** Subscription following the signed-in user, cleaned up in onDestroy */\n _sessionSubscription?: Subscription;\n /** Subscription following account renames/deletions, cleaned up in onDestroy */\n _accountsSubscription?: Subscription;\n}\n\nconst fsService = new IndexedDbFileSystemService();\n\nexport const filesModule: ICliFilesModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-files',\n processors: [\n new CliLsCommandProcessor(),\n new CliCdCommandProcessor(),\n new CliPwdCommandProcessor(),\n new CliMkdirCommandProcessor(),\n new CliRmdirCommandProcessor(),\n new CliTouchCommandProcessor(),\n new CliCatCommandProcessor(),\n new CliEchoCommandProcessor(),\n new CliRmCommandProcessor(),\n new CliCpCommandProcessor(),\n new CliMvCommandProcessor(),\n new CliTreeCommandProcessor(),\n new CliHeadCommandProcessor(),\n new CliTailCommandProcessor(),\n new CliWcCommandProcessor(),\n new CliFindCommandProcessor(),\n new CliGrepCommandProcessor(),\n new CliTacCommandProcessor(),\n new CliBasenameCommandProcessor(),\n new CliDirnameCommandProcessor(),\n new CliSortCommandProcessor(),\n new CliUniqCommandProcessor(),\n new CliCutCommandProcessor(),\n new CliPasteCommandProcessor(),\n new CliTrCommandProcessor(),\n new CliStatCommandProcessor(),\n new CliChmodCommandProcessor(),\n new CliChownCommandProcessor(),\n new CliDuCommandProcessor(),\n new CliLnCommandProcessor(),\n new CliSedCommandProcessor(),\n new CliAwkCommandProcessor(),\n new CliDiffCommandProcessor(),\n new CliTeeCommandProcessor(),\n new CliXargsCommandProcessor(),\n new CliShCommandProcessor(),\n new CliUploadCommandProcessor(),\n ],\n permissions: [\n { name: CliFilesPermissions.Admin, description: 'Bypass file permission checks' },\n { name: CliFilesPermissions.Chown, description: 'chmod/chown files owned by others' },\n ],\n services: [\n {\n provide: IFileSystemService_TOKEN,\n useValue: fsService,\n },\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: new FilePathCompletionProvider(fsService),\n multi: true,\n },\n {\n provide: ICliFileTransferService_TOKEN,\n useValue: new VirtualFsFileTransferService(fsService),\n },\n ],\n\n translations: {\n es: { 'cli.files.description': 'Sistema de archivos virtual en el navegador' },\n fr: { 'cli.files.description': 'Système de fichiers virtuel dans le navigateur' },\n de: { 'cli.files.description': 'Virtuelles Dateisystem im Browser' },\n pt: { 'cli.files.description': 'Sistema de arquivos virtual no navegador' },\n it: { 'cli.files.description': 'File system virtuale nel browser' },\n ja: { 'cli.files.description': 'ブラウザ内仮想ファイルシステム' },\n ko: { 'cli.files.description': '브라우저 내 가상 파일 시스템' },\n zh: { 'cli.files.description': '浏览器内虚拟文件系统' },\n ru: { 'cli.files.description': 'Виртуальная файловая система в браузере' },\n ro: { 'cli.files.description': 'Sistem de fișiere virtual în browser' },\n },\n\n configure(config: CliFilesModuleConfig): ICliModule {\n return { ...this, config };\n },\n\n async onInit(context) {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n await fs.initialize();\n\n const moduleConfig = (this.config || {}) as CliFilesModuleConfig;\n const showPath = moduleConfig.showPathInPrompt !== false;\n\n if (showPath) {\n context.promptPathProvider = () => fs.getCurrentDirectory();\n }\n\n let dragDrop: ICliDragDropService | undefined;\n try {\n dragDrop = context.services.getRequired<ICliDragDropService>(ICliDragDropService_TOKEN);\n } catch {\n // service not registered (e.g. test environment) — skip\n }\n\n if (dragDrop) {\n this._dragDropSubscription = dragDrop.onFileDrop.subscribe((files) => {\n files.forEach((file) => {\n const reader = new FileReader();\n reader.onload = async () => {\n const content = reader.result as string;\n const dest = fs.resolvePath(\n fs.getCurrentDirectory() + '/' + file.name,\n );\n await fs.writeFile(dest, content);\n await fs.persist();\n context.writer.writeSuccess(\n `Uploaded: ${file.name} (${file.size} bytes) → ${dest}`,\n );\n };\n reader.onerror = () => {\n context.writer.writeError(`Failed to read dropped file: ${file.name}`);\n };\n if (file.type && !file.type.startsWith('text/') && file.type !== 'application/json') {\n context.writer.writeWarning(`${file.name}: may be a binary file — uploading as text (content may be corrupted)`);\n }\n reader.readAsText(file);\n });\n });\n }\n },\n\n async onAfterBoot(context) {\n // Integrate with whatever auth module is loaded (e.g. @qodalis/cli-users):\n // rwx checks via the generic authorization layer, ownership and home dirs\n // from the user session. Without an auth module both are no-ops.\n const fs = context.services.getRequired<IFileSystemService>(IFileSystemService_TOKEN);\n fs.setAccessPolicy?.(createFileAccessPolicy(context));\n this._sessionSubscription?.unsubscribe();\n this._sessionSubscription = followUserSession(context, fs);\n // File ownership follows user renames and deletions\n this._accountsSubscription?.unsubscribe();\n this._accountsSubscription = followUserAccounts(context, fs);\n },\n\n async onDestroy(_context: ICliExecutionContext): Promise<void> {\n const sub: Subscription | undefined = this._dragDropSubscription;\n sub?.unsubscribe();\n this._dragDropSubscription = undefined;\n this._sessionSubscription?.unsubscribe();\n this._sessionSubscription = undefined;\n this._accountsSubscription?.unsubscribe();\n this._accountsSubscription = undefined;\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../packages/plugins/files/src/lib/interfaces/i-file-system-service.ts","../../packages/plugins/files/src/lib/version.ts","../../packages/plugins/files/src/lib/utils/split-args.ts","../../packages/plugins/files/src/lib/processors/cli-ls-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-cd-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-pwd-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-mkdir-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-rmdir-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-touch-command-processor.ts","../../packages/plugins/files/src/lib/utils/lines.ts","../../packages/plugins/files/src/lib/processors/cli-cat-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-echo-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-rm-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-cp-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-mv-command-processor.ts","../../packages/plugins/files/src/lib/utils/readable-children.ts","../../packages/plugins/files/src/lib/processors/cli-tree-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-head-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-tail-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-wc-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-find-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-grep-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-tac-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-basename-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-dirname-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-sort-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-uniq-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-cut-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-paste-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-tr-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-stat-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-chmod-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-chown-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-du-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-ln-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-sed-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-awk-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-diff-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-tee-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-xargs-command-processor.ts","../../packages/plugins/files/src/lib/processors/cli-sh-command-processor.ts","../../packages/plugins/files/src/lib/services/indexed-db-file-system.service.ts","../../packages/plugins/files/src/lib/services/server-file-system.service.ts","../../packages/plugins/files/src/lib/services/virtual-fs-file-transfer.service.ts","../../packages/plugins/files/src/lib/services/files-access.ts","../../packages/plugins/files/src/lib/completion/file-path-completion-provider.ts","../../packages/plugins/files/src/lib/processors/cli-upload-command-processor.ts","../../packages/plugins/files/src/public-api.ts"],"names":["DefaultLibraryAuthor","writeWrapped","writeUsage","writeExamples","CliForegroundColor","found","token","script","idx","i","j","DEFAULT_HOME","createSeedFileSystem","ICliFileTransferService_TOKEN"],"mappings":"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","file":"public-api.mjs","sourcesContent":["import { CliAccessAction, ICliOwnership, createCliToken } from '@qodalis/cli-core';\nimport { IFileNode } from './i-file-node';\n\nexport const IFileSystemService_TOKEN =\n createCliToken<IFileSystemService>('cli-file-system-service');\n\n/**\n * Decides whether the current principal may act on a node. Set by the files\n * module from the generic authorization layer (`cliCanAccess`); when no policy\n * is set (no auth module loaded) every operation is allowed.\n */\nexport interface CliFileAccessPolicy {\n /** rwx check on a file or directory */\n canAccess(node: IFileNode, action: CliAccessAction): boolean;\n /** May the principal chmod/chown this node (owner, or `files:chown` / `files:admin`) */\n canChangeOwnership(node: IFileNode, newOwnership?: ICliOwnership): boolean;\n}\n\n/**\n * Abstraction for virtual filesystem operations.\n */\nexport interface IFileSystemService {\n // Navigation\n getCurrentDirectory(): string;\n setCurrentDirectory(path: string): void;\n resolvePath(path: string): string;\n\n // Home directory (used for ~ resolution)\n getHomePath(): string;\n setHomePath(path: string): void;\n\n // User context (used for ownership defaults and permission checks)\n setCurrentUser(uid: string, groups: string[]): void;\n\n // Read operations\n getNode(path: string): IFileNode | null;\n listDirectory(path: string): IFileNode[];\n readFile(path: string): string | null;\n exists(path: string): boolean;\n isDirectory(path: string): boolean;\n\n // Write operations\n createDirectory(path: string, recursive?: boolean): void;\n createFile(path: string, content?: string): void;\n writeFile(path: string, content: string, append?: boolean): void;\n remove(path: string, recursive?: boolean): void;\n copy(src: string, dest: string, recursive?: boolean): void;\n move(src: string, dest: string): void;\n\n // Permissions\n chmod(path: string, permissions: string): void;\n chown(path: string, ownership: ICliOwnership): void;\n\n // Access control (optional; implementations without it are unrestricted)\n setAccessPolicy?(policy?: CliFileAccessPolicy): void;\n /** False when the current principal may not reach `path` (needs `x` on every parent) */\n canTraverse?(path: string): boolean;\n /** Run `fn` without access checks (system tasks such as creating home directories) */\n runAsSystem?<T>(fn: () => T): T;\n /**\n * System task (no access checks): give every node owned by `fromUid`\n * (case-insensitive) to `toUid`, e.g. after a user was renamed or deleted.\n * Returns the number of nodes changed.\n */\n reassignOwner?(fromUid: string, toUid: string): number;\n\n // Persistence\n initialize(): Promise<void>;\n persist(): Promise<void>;\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.4.2';\nexport const API_VERSION = 2;\n ","import { splitShellWords } from '@qodalis/cli-core';\n\n/**\n * Split command arguments like a shell, removing the quotes:\n * `\"my file.txt\" -n 'a b' x\\ y` -> `my file.txt`, `-n`, `a b`, `x y`.\n * (Commands can also read `command.positionals`, split the same way.)\n */\nexport function splitArgs(raw: string): string[] {\n return splitShellWords(raw);\n}\n","import {\n CliForegroundColor,\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport {\n IFileSystemService,\n IFileSystemService_TOKEN,\n IFileNode,\n} from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\nexport class CliLsCommandProcessor implements ICliCommandProcessor {\n command = 'ls';\n description = 'List directory contents';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📋', module: 'file management' };\n\n parameters = [\n {\n name: 'all',\n aliases: ['a'],\n description: 'Show hidden files (starting with .)',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'long',\n aliases: ['l'],\n description: 'Use long listing format',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'human-readable',\n aliases: ['h'],\n description: 'With -l, print sizes like 1.5K and 2M',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n const showAll = command.args['all'] || command.args['a'];\n const longFormat = command.args['long'] || command.args['l'];\n this.humanReadable = !!(command.args['human-readable'] || command.args['h']);\n const targets = paths.length > 0 ? paths : [fs.getCurrentDirectory()];\n // Down a pipe or into `$(...)`: one name per line, as a shell's ls\n const piped: string[] = [];\n\n targets.forEach((targetPath, index) => {\n try {\n const node = fs.getNode(targetPath);\n const entries =\n node && node.type !== 'directory'\n ? [{ ...node, name: targetPath }]\n : fs.listDirectory(targetPath);\n const filtered = showAll\n ? entries\n : entries.filter((e) => !e.name.startsWith('.'));\n\n if (targets.length > 1) {\n if (index > 0) context.writer.writeln();\n context.writer.writeln(`${targetPath}:`);\n }\n\n if (filtered.length === 0) {\n return;\n }\n\n filtered.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n if (longFormat) {\n this.writeLongFormat(filtered, context);\n } else {\n this.writeShortFormat(filtered, context);\n piped.push(...filtered.map((e) => e.name));\n }\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n });\n\n if (!longFormat && piped.length > 0) {\n context.process.output(piped.join('\\n'));\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n context.writer.writeln();\n context.writer.writeln('Usage: ls [path...] [-a|--all] [-l|--long] [-h|--human-readable]');\n }\n\n private writeLongFormat(\n entries: IFileNode[],\n context: ICliExecutionContext,\n ): void {\n const { writer } = context;\n for (const entry of entries) {\n const typeChar = entry.type === 'directory' ? 'd' : '-';\n const perms =\n entry.permissions ||\n (entry.type === 'directory' ? 'rwxr-xr-x' : 'rw-r--r--');\n const owner = entry.ownership?.uid || '-';\n const group = entry.ownership?.gid || '-';\n const size =\n entry.type !== 'file'\n ? '-'\n : this.humanReadable\n ? this.formatSize(entry.size)\n : entry.size.toString();\n const date = new Date(entry.modifiedAt);\n const dateStr = date.toLocaleDateString('en-US', {\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n const name =\n entry.type === 'directory'\n ? writer.wrapInColor(entry.name, CliForegroundColor.Cyan)\n : entry.name;\n\n writer.writeln(\n `${typeChar}${perms} ${owner.padEnd(8)} ${group.padEnd(8)} ${size.padStart(6)} ${dateStr} ${name}`,\n );\n }\n }\n\n private humanReadable = false;\n\n private formatSize(bytes: number): string {\n const units = ['K', 'M', 'G', 'T'];\n let size = bytes;\n let unit = '';\n for (const next of units) {\n if (size < 1024) break;\n size /= 1024;\n unit = next;\n }\n return unit ? `${size < 10 ? size.toFixed(1) : Math.round(size)}${unit}` : String(bytes);\n }\n\n private writeShortFormat(\n entries: IFileNode[],\n context: ICliExecutionContext,\n ): void {\n const { writer } = context;\n const names = entries.map((e) =>\n e.type === 'directory'\n ? writer.wrapInColor(e.name, CliForegroundColor.Cyan)\n : e.name,\n );\n writer.writeln(names.join(' '));\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\nexport class CliCdCommandProcessor implements ICliCommandProcessor {\n command = 'cd';\n description = 'Change the current working directory';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📁', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cd.help.change_current_directory_without', 'Change the current directory. Without a path it goes to your home directory. Paths can be absolute (/...), relative to where you are, or start with ~ for home.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cd', t.t('cli.cd.help.go_home_directory', 'Go to your home directory')],\n ['cd <dir>', t.t('cli.cd.help.go_directory', 'Go into a directory')],\n ['cd ..', t.t('cli.cd.help.go_up_one_level', 'Go up one level')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cd ~/docs', t.t('cli.cd.help.go_docs_home', 'Go to docs in your home')],\n ['cd ../projects', t.t('cli.cd.help.go_sibling_directory', 'Go to a sibling directory')],\n ['cd /', t.t('cli.cd.help.go_root', 'Go to the root')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const target = splitArgs(command.value || '').join(' ') || '~';\n\n try {\n fs.setCurrentDirectory(target);\n await fs.persist();\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliPwdCommandProcessor implements ICliCommandProcessor {\n command = 'pwd';\n description = 'Print the current working directory';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n metadata = { icon: '📂', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.pwd.help.print_full_path_directory', 'Print the full path of the directory you are in. Relative paths in other commands start from here.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['pwd', t.t('cli.pwd.help.show_current_directory', 'Show the current directory')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['pwd', t.t('cli.pwd.help.example_home_user', 'For example /home/user')],\n ['cd ~/docs; pwd', t.t('cli.pwd.help.prints_home_user_docs', 'Prints /home/user/docs')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n context.writer.writeln(fs.getCurrentDirectory());\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { splitArgs } from '../utils/split-args';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliMkdirCommandProcessor implements ICliCommandProcessor {\n command = 'mkdir';\n description = 'Create directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📁', module: 'file management' };\n\n parameters = [\n {\n name: 'parents',\n aliases: ['p'],\n description: 'Create parent directories as needed',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.mkdir.help.create_new_directory_p', 'Create a new directory. With -p, any missing parent directories are created too.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['mkdir <dir...>', t.t('cli.mkdir.help.create_one_more_directories', 'Create one or more directories')],\n ['mkdir -p <path>', t.t('cli.mkdir.help.create_directory_missing_parents', 'Create a directory and its missing parents')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['mkdir projects', t.t('cli.mkdir.help.create_projects_current_directory', 'Create projects in the current directory')],\n ['mkdir -p ~/docs/2026/notes', t.t('cli.mkdir.help.create_whole_path_once', 'Create the whole path at once')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n const recursive = command.args['parents'] || command.args['p'];\n\n if (paths.length === 0) {\n context.writer.writeError('mkdir: missing operand');\n return;\n }\n\n let changed = false;\n for (const path of paths) {\n try {\n if (recursive && fs.isDirectory(path)) continue;\n fs.createDirectory(path, recursive);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { splitArgs } from '../utils/split-args';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliRmdirCommandProcessor implements ICliCommandProcessor {\n command = 'rmdir';\n description = 'Remove empty directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🗑', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.rmdir.help.remove_empty_directory_refuses', 'Remove an empty directory. It refuses to remove a directory that still contains files; use rm -r for that.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['rmdir <dir...>', t.t('cli.rmdir.help.remove_empty_directories', 'Remove empty directories')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['rmdir empty-folder', t.t('cli.rmdir.help.remove_directory_current_one', 'Remove a directory in the current one')],\n ['rmdir ~/docs/old', t.t('cli.rmdir.help.remove_full_path', 'Remove by full path')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n\n if (paths.length === 0) {\n context.writer.writeError('rmdir: missing operand');\n return;\n }\n\n let changed = false;\n for (const path of paths) {\n try {\n const node = fs.getNode(path);\n if (!node) {\n context.writer.writeError(\n `rmdir: ${path}: No such file or directory`,\n );\n continue;\n }\n if (node.type !== 'directory') {\n context.writer.writeError(`rmdir: ${path}: Not a directory`);\n continue;\n }\n if (node.children && node.children.length > 0) {\n context.writer.writeError(\n `rmdir: ${path}: Directory not empty`,\n );\n continue;\n }\n // Checked empty above; the service removes directories only recursively\n fs.remove(path, true);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { splitArgs } from '../utils/split-args';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliTouchCommandProcessor implements ICliCommandProcessor {\n command = 'touch';\n description = 'Create an empty file or update its timestamp';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📄', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.touch.help.create_empty_file_update', 'Create an empty file, or update the modified time of a file that already exists. The parent directory must already exist.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['touch <file...>', t.t('cli.touch.help.create_files_refresh_their', 'Create the files, or refresh their timestamps')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['touch notes.txt', t.t('cli.touch.help.create_empty_notes_txt', 'Create an empty notes.txt')],\n ['touch ~/docs/todo.md', t.t('cli.touch.help.create_file_docs', 'Create a file in ~/docs')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n\n if (paths.length === 0) {\n context.writer.writeError('touch: missing file operand');\n return;\n }\n\n let changed = false;\n for (const path of paths) {\n try {\n fs.createFile(path);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n}\n","/**\n * The lines of a text, without the empty item that a final newline leaves:\n * `a\\nb\\n` -> `a`, `b`. An empty text has no lines.\n */\nexport function splitLines(content: string): string[] {\n if (content === '') return [];\n const lines = content.split('\\n');\n if (lines[lines.length - 1] === '') lines.pop();\n return lines;\n}\n\n/** Piped command data as text. */\nexport function pipedText(data: unknown): string {\n return typeof data === 'string' ? data : JSON.stringify(data);\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\nimport { pipedText } from '../utils/lines';\n\nexport class CliCatCommandProcessor implements ICliCommandProcessor {\n command = 'cat';\n description = 'Display file contents';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📖', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cat.help.print_contents_one_more', 'Print the contents of one or more files, joined in order, or of piped input. Pipe the output into other commands to search, sort or count it.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cat <file...>', t.t('cli.cat.help.print_files_one_after', 'Print files one after another')],\n ['cat <file> | <command>', t.t('cli.cat.help.send_file_another_command', 'Send a file to another command')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cat notes.txt', t.t('cli.cat.help.show_whole_file', 'Show the whole file')],\n ['cat app.log | grep error', t.t('cli.cat.help.show_only_lines_error', 'Show only lines with error')],\n ['cat names.txt | sort', t.t('cli.cat.help.print_lines_sorted', 'Print the lines sorted')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n\n if (paths.length === 0) {\n if (command.data != null) {\n context.writer.writeln(pipedText(command.data));\n return;\n }\n context.writer.writeError('cat: missing file operand');\n return;\n }\n\n // Concatenate the files in order; a missing one is reported and skipped\n let output = '';\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`cat: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `cat: ${path}: No such file or directory`,\n );\n continue;\n }\n output += content;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (output !== '') {\n context.writer.writeln(output.replace(/\\n$/, ''));\n }\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n joinShellWords,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliEchoCommandProcessor implements ICliCommandProcessor {\n command = 'echo';\n description = 'Display text or redirect output to a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n extendsProcessor = true;\n originalProcessor?: ICliCommandProcessor;\n metadata = { icon: '💬', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.echo.help.print_text_terminal_add', 'Print text to the terminal. Add > file to save it to a file (replacing it) or >> file to add it to the end.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['echo <text>', t.t('cli.echo.help.print_text', 'Print text')],\n ['echo <text> > <file>', t.t('cli.echo.help.write_text_file', 'Write text to a file')],\n ['echo <text> >> <file>', t.t('cli.echo.help.append_text_file', 'Append text to a file')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['echo Hello world', t.t('cli.echo.help.print_greeting', 'Print a greeting')],\n ['echo first line > notes.txt', t.t('cli.echo.help.create_replace_notes_txt', 'Create or replace notes.txt')],\n ['echo another line >> notes.txt', t.t('cli.echo.help.add_line', 'Add a line to it')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n // Redirects (`echo a > f`) are handled by the engine before this\n // runs: a `>` that reaches here was escaped or came from a variable or\n // `$(...)`, and is printed, never used to write a file\n if (this.originalProcessor) {\n await this.originalProcessor.processCommand(command, context);\n return;\n }\n const text = joinShellWords(command.value || '');\n context.writer.writeln(text);\n context.process.output(text);\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { splitArgs } from '../utils/split-args';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliRmCommandProcessor implements ICliCommandProcessor {\n command = 'rm';\n description = 'Remove files or directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🗑', module: 'file management' };\n\n parameters = [\n {\n name: 'recursive',\n aliases: ['r', 'R'],\n description: 'Remove directories and their contents recursively',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'force',\n aliases: ['f'],\n description: 'Ignore nonexistent files, never prompt',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.rm.help.delete_file_directories_only', 'Delete a file. Directories are only removed with -r, which deletes everything inside them. Deleted files cannot be recovered.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['rm <file...>', t.t('cli.rm.help.delete_one_more_files', 'Delete one or more files')],\n ['rm -r <dir>', t.t('cli.rm.help.delete_directory_contents', 'Delete a directory and its contents')],\n ['rm -f <file>', t.t('cli.rm.help.delete_without_error_if', 'Delete without an error if it is missing')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['rm notes.bak', t.t('cli.rm.help.delete_one_file', 'Delete one file')],\n ['rm -r old-project', t.t('cli.rm.help.delete_whole_directory', 'Delete a whole directory')],\n ['rm -f maybe.txt', t.t('cli.rm.help.quiet_if_file_does', 'Quiet if the file does not exist')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = splitArgs(command.value || '');\n const recursive =\n command.args['recursive'] || command.args['r'] || command.args['R'];\n const force = command.args['force'] || command.args['f'];\n\n if (paths.length === 0) {\n if (!force) context.writer.writeError('rm: missing operand');\n return;\n }\n\n let changed = false;\n for (const path of paths) {\n try {\n if (!fs.exists(path)) {\n if (!force) {\n context.writer.writeError(\n `rm: ${path}: No such file or directory`,\n );\n }\n continue;\n }\n\n if (fs.isDirectory(path) && !recursive) {\n context.writer.writeError(`rm: ${path}: Is a directory`);\n continue;\n }\n\n fs.remove(path, recursive);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliCpCommandProcessor implements ICliCommandProcessor {\n command = 'cp';\n description = 'Copy files and directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📋', module: 'file management' };\n\n parameters = [\n {\n name: 'recursive',\n aliases: ['r', 'R'],\n description: 'Copy directories recursively',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'force',\n aliases: ['f'],\n description: 'Overwrite existing files (always done; accepted for -rf)',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cp.help.copy_file_new_path', 'Copy a file to a new path, or into an existing directory. Copying a directory needs -r, which copies everything inside it. A file already at the destination is replaced.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cp <source> <dest>', t.t('cli.cp.help.copy_file_new_name', 'Copy a file to a new name')],\n ['cp <source...> <dir>', t.t('cli.cp.help.copy_files_directory', 'Copy files into a directory')],\n ['cp -r <dir> <dest>', t.t('cli.cp.help.copy_directory_contents', 'Copy a directory and its contents')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cp notes.txt notes.bak', t.t('cli.cp.help.make_backup_copy', 'Make a backup copy')],\n ['cp report.txt ~/docs', t.t('cli.cp.help.copy_docs', 'Copy into ~/docs')],\n ['cp -r project project-copy', t.t('cli.cp.help.duplicate_whole_directory', 'Duplicate a whole directory')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const recursive =\n command.args['recursive'] || command.args['r'] || command.args['R'];\n\n const parts = this.parseArgs(command);\n\n if (parts.length < 2) {\n context.writer.writeError('cp: missing destination file operand');\n context.writer.writeln(\n 'Usage: cp [--recursive] <source> <destination>',\n );\n return;\n }\n\n // Several sources go into the last operand, which must be a directory\n const dest = parts[parts.length - 1];\n const sources = parts.slice(0, -1);\n if (sources.length > 1 && !fs.isDirectory(dest)) {\n context.writer.writeError(`cp: target '${dest}' is not a directory`);\n return;\n }\n\n let changed = false;\n for (const src of sources) {\n try {\n fs.copy(src, dest, recursive);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n // Flags never reach the value, so a quoted `-name` is a file\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliMvCommandProcessor implements ICliCommandProcessor {\n command = 'mv';\n description = 'Move or rename files and directories';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📦', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.mv.help.move_rename_file_directory', 'Move or rename a file or directory. If the destination is an existing directory, the source is moved into it; otherwise it is renamed. A file already at the destination is replaced.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['mv <source> <dest>', t.t('cli.mv.help.rename_file_directory', 'Rename a file or directory')],\n ['mv <source...> <dir>', t.t('cli.mv.help.move_them_directory', 'Move them into a directory')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['mv draft.txt final.txt', t.t('cli.mv.help.rename_file', 'Rename a file')],\n ['mv final.txt ~/docs', t.t('cli.mv.help.move_docs', 'Move it into ~/docs')],\n ['mv old-dir new-dir', t.t('cli.mv.help.rename_directory', 'Rename a directory')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const parts = this.parseArgs(command);\n\n if (parts.length < 2) {\n context.writer.writeError('mv: missing destination file operand');\n context.writer.writeln('Usage: mv <source> <destination>');\n return;\n }\n\n // Several sources go into the last operand, which must be a directory\n const dest = parts[parts.length - 1];\n const sources = parts.slice(0, -1);\n if (sources.length > 1 && !fs.isDirectory(dest)) {\n context.writer.writeError(`mv: target '${dest}' is not a directory`);\n return;\n }\n\n let changed = false;\n for (const src of sources) {\n try {\n fs.move(src, dest);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n if (changed) await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n // Flags never reach the value, so a quoted `-name` is a file\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { isCliAccessDeniedError } from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService } from '../interfaces/i-file-system-service';\n\n/**\n * Children of a directory the current principal may list (`r` + `x`).\n * Recursive commands (find, tree, du, grep -r) walk through this so they\n * never reveal what is inside directories the user cannot read.\n * Returns `null` when listing is denied.\n */\nexport function readableChildren(fs: IFileSystemService, path: string): IFileNode[] | null {\n try {\n return fs.listDirectory(path);\n } catch (e) {\n if (isCliAccessDeniedError(e)) return null;\n throw e;\n }\n}\n","import { readableChildren } from '../utils/readable-children';\nimport {\n CliForegroundColor,\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport {\n IFileSystemService,\n IFileSystemService_TOKEN,\n IFileNode,\n} from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\nexport class CliTreeCommandProcessor implements ICliCommandProcessor {\n command = 'tree';\n description = 'Display directory tree structure';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '🌳', module: 'file management' };\n\n parameters = [\n {\n name: 'depth',\n aliases: ['L'],\n description: 'Max display depth of the directory tree',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tree.help.draw_directory_everything_below', 'Draw a directory and everything below it as a tree, directories first, followed by a count of directories and files. Defaults to the current directory.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['tree [dir]', t.t('cli.tree.help.show_whole_tree', 'Show the whole tree')],\n ['tree -L <n> [dir]', t.t('cli.tree.help.only_levels_deep', 'Only <n> levels deep')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['tree', t.t('cli.tree.help.tree_current_directory', 'Tree of the current directory')],\n ['tree ~/docs', t.t('cli.tree.help.tree_docs', 'Tree of ~/docs')],\n ['tree -L 2', t.t('cli.tree.help.top_two_levels_only', 'Top two levels only')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const targetPath =\n splitArgs(command.value || '').join(' ') || fs.getCurrentDirectory();\n const maxDepth = command.args['depth']\n ? parseInt(command.args['depth'])\n : command.args['L']\n ? parseInt(command.args['L'])\n : Infinity;\n\n try {\n const node = fs.getNode(targetPath);\n if (!node) {\n context.writer.writeError(\n `tree: ${targetPath}: No such file or directory`,\n );\n return;\n }\n if (node.type !== 'directory') {\n context.writer.writeError(\n `tree: ${targetPath}: Not a directory`,\n );\n return;\n }\n\n const resolvedPath = fs.resolvePath(targetPath);\n context.writer.writeln(\n context.writer.wrapInColor(\n resolvedPath,\n CliForegroundColor.Cyan,\n ),\n );\n\n const counts = { dirs: 0, files: 0 };\n this.fs = fs;\n this.printTree(node, '', true, 0, maxDepth, context, counts, resolvedPath);\n\n context.writer.writeln();\n context.writer.writeln(\n `${counts.dirs} directories, ${counts.files} files`,\n );\n } catch (e: any) {\n context.writer.writeError(e.message);\n }\n }\n\n /** File system of the running command (listing goes through access checks) */\n private fs?: IFileSystemService;\n\n private printTree(\n node: IFileNode,\n prefix: string,\n isRoot: boolean,\n depth: number,\n maxDepth: number,\n context: ICliExecutionContext,\n counts: { dirs: number; files: number },\n path = '/',\n ): void {\n if (depth >= maxDepth) {\n return;\n }\n const visible = this.fs ? readableChildren(this.fs, path) : node.children;\n if (!visible) {\n return;\n }\n\n const children = [...visible].sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const isLast = i === children.length - 1;\n const connector = isLast ? '└── ' : '├── ';\n const childPrefix = isLast ? ' ' : '│ ';\n\n const displayName =\n child.type === 'directory'\n ? context.writer.wrapInColor(\n child.name,\n CliForegroundColor.Cyan,\n )\n : child.name;\n\n context.writer.writeln(`${prefix}${connector}${displayName}`);\n\n if (child.type === 'directory') {\n counts.dirs++;\n this.printTree(\n child,\n prefix + childPrefix,\n false,\n depth + 1,\n maxDepth,\n context,\n counts,\n path === '/' ? `/${child.name}` : `${path}/${child.name}`,\n );\n } else {\n counts.files++;\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText, splitLines } from '../utils/lines';\n\nexport class CliHeadCommandProcessor implements ICliCommandProcessor {\n command = 'head';\n description = 'Display the first lines of a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '⬆️', module: 'file management' };\n\n parameters = [\n {\n name: 'lines',\n aliases: ['n'],\n description: 'Number of lines to display (default: 10)',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.head.help.print_first_lines_file', 'Print the first lines of a file, 10 by default. Works on piped input too. With several files, each one gets a ==> name <== header.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['head <file>', t.t('cli.head.help.first_10_lines', 'First 10 lines')],\n ['head -n <count> <file>', t.t('cli.head.help.first_lines', 'First <count> lines')],\n ['<command> | head', t.t('cli.head.help.first_lines_piped_input', 'First lines of piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['head notes.txt', t.t('cli.head.help.show_start_file', 'Show the start of a file')],\n ['head -n 3 a.txt b.txt', t.t('cli.head.help.first_3_lines_each', 'First 3 lines of each file')],\n ['cat app.log | head -n 20', t.t('cli.head.help.first_20_lines_log', 'First 20 lines of the log')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n // `-n 5`, `--lines 5`, or the short form `-5`\n const countArg =\n command.args['lines'] ??\n command.args['n'] ??\n Object.keys(command.args).find((k) => /^\\d+$/.test(k));\n const parsedCount = parseInt(String(countArg ?? '10'), 10);\n const count = isNaN(parsedCount) ? 10 : Math.abs(parsedCount);\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const lines = splitLines(pipedText(command.data));\n const selected = lines.slice(0, count);\n if (selected.length > 0) {\n context.writer.writeln(selected.join('\\n'));\n }\n return;\n }\n context.writer.writeError('head: missing file operand');\n return;\n }\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`head: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) continue;\n\n if (paths.length > 1) {\n if (i > 0) context.writer.writeln();\n context.writer.writeln(`==> ${path} <==`);\n }\n\n const lines = splitLines(content);\n const selected = lines.slice(0, count);\n if (selected.length > 0) {\n context.writer.writeln(selected.join('\\n'));\n }\n } catch (e: any) {\n context.writer.writeError(`head: ${e.message}`);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText, splitLines } from '../utils/lines';\n\nexport class CliTailCommandProcessor implements ICliCommandProcessor {\n command = 'tail';\n description = 'Display the last lines of a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '⬇️', module: 'file management' };\n\n parameters = [\n {\n name: 'lines',\n aliases: ['n'],\n description: 'Number of lines to display (default: 10)',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tail.help.print_last_lines_file', 'Print the last lines of a file, 10 by default. Works on piped input too. With several files, each one gets a ==> name <== header.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['tail <file>', t.t('cli.tail.help.last_10_lines', 'Last 10 lines')],\n ['tail -n <count> <file>', t.t('cli.tail.help.last_lines', 'Last <count> lines')],\n ['<command> | tail', t.t('cli.tail.help.last_lines_piped_input', 'Last lines of piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['tail app.log', t.t('cli.tail.help.show_end_log', 'Show the end of a log')],\n ['tail -n 5 notes.txt', t.t('cli.tail.help.last_5_lines', 'Last 5 lines')],\n ['cat app.log | tail -n 20', t.t('cli.tail.help.last_20_lines_log', 'Last 20 lines of the log')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n // `-n 5`, `--lines 5`, or the short form `-5`\n const countArg =\n command.args['lines'] ??\n command.args['n'] ??\n Object.keys(command.args).find((k) => /^\\d+$/.test(k));\n const parsedCount = parseInt(String(countArg ?? '10'), 10);\n const count = isNaN(parsedCount) ? 10 : Math.abs(parsedCount);\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const lines = splitLines(pipedText(command.data));\n const selected = count > 0 ? lines.slice(-count) : [];\n if (selected.length > 0) {\n context.writer.writeln(selected.join('\\n'));\n }\n return;\n }\n context.writer.writeError('tail: missing file operand');\n return;\n }\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`tail: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) continue;\n\n if (paths.length > 1) {\n if (i > 0) context.writer.writeln();\n context.writer.writeln(`==> ${path} <==`);\n }\n\n const lines = splitLines(content);\n const selected = count > 0 ? lines.slice(-count) : [];\n if (selected.length > 0) {\n context.writer.writeln(selected.join('\\n'));\n }\n } catch (e: any) {\n context.writer.writeError(`tail: ${e.message}`);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText } from '../utils/lines';\n\nexport class CliWcCommandProcessor implements ICliCommandProcessor {\n command = 'wc';\n description = 'Print line, word, and character counts';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '#️⃣', module: 'file management' };\n\n parameters = [\n {\n name: 'lines',\n aliases: ['l'],\n description: 'Print only the line count',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'words',\n aliases: ['w'],\n description: 'Print only the word count',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'chars',\n aliases: ['c'],\n description: 'Print only the character count',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.wc.help.count_lines_words_characters', 'Count lines, words and characters in files or piped input. With several files, a total line is printed at the end.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['wc <file...>', t.t('cli.wc.help.lines_words_characters', 'Lines, words and characters')],\n ['wc -l <file>', t.t('cli.wc.help.only_line_count', 'Only the line count')],\n ['<command> | wc', t.t('cli.wc.help.count_piped_input', 'Count piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['wc notes.txt', t.t('cli.wc.help.all_three_counts', 'All three counts')],\n ['wc -l a.txt b.txt', t.t('cli.wc.help.line_counts_total', 'Line counts with a total')],\n [\n 'cat app.log | grep error | wc -l',\n t.t('cli.wc.help.how_many_lines_mention', 'How many lines mention error'),\n ],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const showLines =\n command.args['lines'] || command.args['l'] || false;\n const showWords =\n command.args['words'] || command.args['w'] || false;\n const showChars =\n command.args['chars'] || command.args['c'] || false;\n const showAll = !showLines && !showWords && !showChars;\n\n const paths = this.parsePaths(command);\n if (paths.length === 0) {\n if (command.data != null) {\n // Piped text loses its final newline on the way: restore it\n let content = pipedText(command.data);\n if (content !== '' && !content.endsWith('\\n')) content += '\\n';\n const { lineCount, wordCount, charCount } = this.count(content);\n\n const parts: string[] = [];\n if (showAll || showLines) parts.push(String(lineCount).padStart(8));\n if (showAll || showWords) parts.push(String(wordCount).padStart(8));\n if (showAll || showChars) parts.push(String(charCount).padStart(8));\n\n context.writer.writeln(parts.join(''));\n return;\n }\n context.writer.writeError('wc: missing file operand');\n return;\n }\n\n let totalLines = 0;\n let totalWords = 0;\n let totalChars = 0;\n\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`wc: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path) ?? '';\n const { lineCount, wordCount, charCount } = this.count(content);\n\n totalLines += lineCount;\n totalWords += wordCount;\n totalChars += charCount;\n\n const parts: string[] = [];\n if (showAll || showLines) parts.push(String(lineCount).padStart(8));\n if (showAll || showWords) parts.push(String(wordCount).padStart(8));\n if (showAll || showChars) parts.push(String(charCount).padStart(8));\n parts.push(` ${path}`);\n\n context.writer.writeln(parts.join(''));\n } catch (e: any) {\n context.writer.writeError(`wc: ${e.message}`);\n }\n }\n\n if (paths.length > 1) {\n const parts: string[] = [];\n if (showAll || showLines) parts.push(String(totalLines).padStart(8));\n if (showAll || showWords) parts.push(String(totalWords).padStart(8));\n if (showAll || showChars) parts.push(String(totalChars).padStart(8));\n parts.push(' total');\n context.writer.writeln(parts.join(''));\n }\n }\n\n /** Counts like Unix wc: lines are newline characters. */\n private count(content: string): {\n lineCount: number;\n wordCount: number;\n charCount: number;\n } {\n return {\n lineCount: (content.match(/\\n/g) ?? []).length,\n wordCount: content.trim() === '' ? 0 : content.trim().split(/\\s+/).length,\n charCount: content.length,\n };\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport { readableChildren } from '../utils/readable-children';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport {\n IFileSystemService,\n IFileSystemService_TOKEN,\n IFileNode,\n} from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliFindCommandProcessor implements ICliCommandProcessor {\n command = 'find';\n description = 'Search for files and directories by name or type';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '🔍', module: 'file management' };\n\n parameters = [\n {\n name: 'name',\n description: 'Match filename pattern (glob: * and ? supported), case-sensitive',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'iname',\n description: 'Like --name, but case-insensitive',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'type',\n description: 'Filter by type: f (file) or d (directory)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'maxdepth',\n description: 'Maximum depth: 0 is only the start path, 1 its direct children',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.find.help.list_files_directories_under', 'List files and directories under a path (the current directory by default), searching all subdirectories. The start path itself is listed first. Filter by name with a glob pattern (* and ?; --name is case-sensitive, --iname is not) or by type.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['find [path]', t.t('cli.find.help.list_everything_under_path', 'List everything under a path')],\n ['find [path] --name <pattern>', t.t('cli.find.help.match_names_against_glob', 'Match names against a glob')],\n ['find [path] --iname <pattern>', t.t('cli.find.help.same_ignoring_case', 'Same, ignoring case')],\n ['find [path] --type f|d', t.t('cli.find.help.only_files_f_directories', 'Only files (f) or directories (d)')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['find ~/docs', t.t('cli.find.help.list_everything_docs', 'List everything in ~/docs')],\n ['find . --name \"*.txt\"', t.t('cli.find.help.find_all_txt_files', 'Find all .txt files')],\n ['find . --type d --maxdepth 1', t.t('cli.find.help.directories_near_top', 'Directories near the top')],\n ['find . --name \"*.tmp\" | xargs rm', t.t('cli.find.help.delete_all_tmp_files', 'Delete all .tmp files')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const searchPath = this.parseSearchPath(command) || fs.getCurrentDirectory();\n const typeFilter = command.args['type'] || null;\n const maxDepthArg = command.args['maxdepth'];\n const parsedDepth = parseInt(String(maxDepthArg ?? ''), 10);\n const maxDepth =\n maxDepthArg != null && maxDepthArg !== true && !isNaN(parsedDepth)\n ? parsedDepth\n : Infinity;\n\n try {\n const node = fs.getNode(searchPath);\n if (!node) {\n context.writer.writeError(\n `find: '${searchPath}': No such file or directory`,\n );\n return;\n }\n const resolvedBase = fs.resolvePath(searchPath);\n const nameRegex = this.nameRegex(command);\n\n const results: string[] = [];\n this.fs = fs;\n\n // The start path is at depth 0, as in GNU find\n const baseName = resolvedBase.split('/').filter(Boolean).pop() ?? '/';\n if (this.matches(baseName, node.type, nameRegex, typeFilter)) {\n results.push(resolvedBase);\n }\n if (node.type === 'directory' && maxDepth > 0) {\n this.walk(\n node,\n resolvedBase,\n 1,\n maxDepth,\n nameRegex,\n typeFilter,\n results,\n );\n }\n\n for (const r of results) {\n context.writer.writeln(r);\n }\n } catch (e: any) {\n context.writer.writeError(`find: ${e.message}`);\n }\n }\n\n /** `--name` matches case-sensitively, `--iname` ignoring case. */\n private nameRegex(command: CliProcessCommand): RegExp | null {\n const name = command.args['name'];\n if (name != null && name !== true) {\n return this.globToRegex(String(name), false);\n }\n const iname = command.args['iname'];\n if (iname != null && iname !== true) {\n return this.globToRegex(String(iname), true);\n }\n return null;\n }\n\n private matches(\n name: string,\n type: string,\n nameRegex: RegExp | null,\n typeFilter: string | null,\n ): boolean {\n if (nameRegex && !nameRegex.test(name)) return false;\n if (typeFilter === 'f' && type !== 'file') return false;\n if (typeFilter === 'd' && type !== 'directory') return false;\n return true;\n }\n\n private parseSearchPath(command: CliProcessCommand): string | null {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n return tokens.length > 0 ? tokens[0] : null;\n }\n\n private globToRegex(pattern: string, ignoreCase: boolean): RegExp {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexStr = escaped.replace(/\\*/g, '.*').replace(/\\?/g, '.');\n return new RegExp(`^${regexStr}$`, ignoreCase ? 'i' : '');\n }\n\n /** File system of the running command (listing goes through access checks) */\n private fs?: IFileSystemService;\n\n /** Lists the children of `node`, which are at `depth` (1 = direct children). */\n private walk(\n node: IFileNode,\n currentPath: string,\n depth: number,\n maxDepth: number,\n nameRegex: RegExp | null,\n typeFilter: string | null,\n results: string[],\n ): void {\n const children = this.fs ? readableChildren(this.fs, currentPath) : node.children;\n if (!children) return;\n\n for (const child of children) {\n const childPath =\n currentPath === '/'\n ? `/${child.name}`\n : `${currentPath}/${child.name}`;\n\n if (this.matches(child.name, child.type, nameRegex, typeFilter)) {\n results.push(childPath);\n }\n\n if (child.type === 'directory' && depth < maxDepth) {\n this.walk(\n child,\n childPath,\n depth + 1,\n maxDepth,\n nameRegex,\n typeFilter,\n results,\n );\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport { readableChildren } from '../utils/readable-children';\nimport {\n CliForegroundColor,\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport {\n IFileSystemService,\n IFileSystemService_TOKEN,\n IFileNode,\n} from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitLines } from '../utils/lines';\n\nexport class CliGrepCommandProcessor implements ICliCommandProcessor {\n command = 'grep';\n description = 'Search file contents for a pattern';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '🔎', module: 'file management' };\n\n parameters = [\n {\n name: 'ignore-case',\n aliases: ['i'],\n description: 'Case-insensitive matching',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'recursive',\n aliases: ['r', 'R'],\n description: 'Recursively search directories',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'line-number',\n aliases: ['n'],\n description: 'Show line numbers',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'count',\n aliases: ['c'],\n description: 'Show only a count of matching lines per file',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'quiet',\n aliases: ['q'],\n description: 'Print nothing; only the exit status tells whether a line matched',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'files-with-matches',\n aliases: ['l'],\n description: 'Show only filenames containing matches',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'invert-match',\n aliases: ['v'],\n description: 'Select non-matching lines',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'word-regexp',\n aliases: ['w'],\n description: 'Match only whole words',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'only-matching',\n aliases: ['o'],\n description: 'Print only the matched parts, one per line',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'extended-regexp',\n aliases: ['E'],\n description: 'Extended regular expressions (patterns always are)',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.grep.help.print_lines_match_pattern', 'Print the lines that match a pattern. The pattern is a regular expression, matches are highlighted, and the input can be files, directories (with -r) or piped text.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['grep <pattern> <file...>', t.t('cli.grep.help.search_one_more_files', 'Search one or more files')],\n ['grep -r <pattern> <dir>', t.t('cli.grep.help.search_every_file_under', 'Search every file under a directory')],\n ['<command> | grep <pattern>', t.t('cli.grep.help.filter_piped_input', 'Filter piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['grep -i error app.log', t.t('cli.grep.help.case_insensitive_search', 'Case-insensitive search')],\n ['grep -r -n TODO src', t.t('cli.grep.help.find_todos_line_numbers', 'Find TODOs with line numbers')],\n ['grep -v ^# config.txt', t.t('cli.grep.help.hide_comment_lines', 'Hide comment lines')],\n ['cat app.log | grep -c ERROR', t.t('cli.grep.help.count_matching_lines', 'Count matching lines')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const ignoreCase =\n command.args['ignore-case'] || command.args['i'] || false;\n const recursive =\n command.args['recursive'] ||\n command.args['r'] ||\n command.args['R'] ||\n false;\n const showLineNum =\n command.args['line-number'] || command.args['n'] || false;\n const countOnly =\n command.args['count'] || command.args['c'] || false;\n const filesOnly =\n command.args['files-with-matches'] || command.args['l'] || false;\n const invert =\n command.args['invert-match'] || command.args['v'] || false;\n\n const wordRegexp =\n command.args['word-regexp'] || command.args['w'] || false;\n const onlyMatching =\n command.args['only-matching'] || command.args['o'] || false;\n const quiet = command.args['quiet'] || command.args['q'] || false;\n\n const { pattern, paths } = this.parseArgs(command);\n if (!pattern) {\n context.writer.writeError(\n 'grep: missing pattern. Usage: grep [options] <pattern> <file>',\n );\n context.process.exit(2, { silent: true });\n return;\n }\n let regex: RegExp;\n try {\n const source = wordRegexp ? `(?<!\\\\w)(?:${pattern})(?!\\\\w)` : pattern;\n regex = new RegExp(source, ignoreCase ? 'gi' : 'g');\n } catch {\n context.writer.writeError(`grep: invalid pattern '${pattern}'`);\n context.process.exit(2, { silent: true });\n return;\n }\n if (paths.length === 0) {\n if (command.data != null) {\n const content = typeof command.data === 'string'\n ? command.data\n : JSON.stringify(command.data);\n const found = this.grepContent(content, null, regex, {\n ignoreCase, showLineNum, countOnly, filesOnly, invert, onlyMatching, quiet,\n }, context, false);\n this.exitStatus(context, found, false);\n return;\n }\n context.writer.writeError(\n 'grep: missing file operand. Usage: grep [options] <pattern> <file>',\n );\n context.process.exit(2, { silent: true });\n return;\n }\n\n const filePaths: string[] = [];\n let failed = false;\n for (const p of paths) {\n try {\n if (!fs.exists(p)) {\n context.writer.writeError(\n `grep: ${p}: No such file or directory`,\n );\n failed = true;\n continue;\n }\n if (fs.isDirectory(p)) {\n if (!recursive) {\n context.writer.writeError(\n `grep: ${p}: Is a directory`,\n );\n failed = true;\n continue;\n }\n this.collectFiles(fs, fs.resolvePath(p), fs.getNode(p)!, filePaths);\n } else {\n filePaths.push(fs.resolvePath(p));\n }\n } catch (e: any) {\n context.writer.writeError(`grep: ${e.message}`);\n failed = true;\n }\n }\n\n const multiFile = filePaths.length > 1;\n\n let found = 0;\n for (const filePath of filePaths) {\n try {\n const content = fs.readFile(filePath) ?? '';\n found += this.grepContent(content, filePath, regex, {\n ignoreCase, showLineNum, countOnly, filesOnly, invert, onlyMatching, quiet,\n }, context, multiFile);\n } catch (e: any) {\n context.writer.writeError(`grep: ${filePath}: ${e.message}`);\n failed = true;\n }\n }\n this.exitStatus(context, found, failed);\n }\n\n /**\n * As Unix grep: 0 when a line matched, 1 when none did, 2 after an\n * error (so `if grep -q ...` and `grep x f && ...` work).\n */\n private exitStatus(context: ICliExecutionContext, found: number, failed: boolean): void {\n if (found > 0) return;\n context.process.exit(failed ? 2 : 1, { silent: true });\n }\n\n private grepContent(\n content: string,\n filePath: string | null,\n regex: RegExp,\n options: {\n ignoreCase: boolean;\n showLineNum: boolean;\n countOnly: boolean;\n filesOnly: boolean;\n invert: boolean;\n onlyMatching: boolean;\n quiet?: boolean;\n },\n context: ICliExecutionContext,\n multiFile: boolean,\n ): number {\n const lines = splitLines(content);\n let matchCount = 0;\n const matchingLines: { num: number; text: string }[] = [];\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx];\n regex.lastIndex = 0;\n const hasMatch = regex.test(line);\n const isMatch = options.invert ? !hasMatch : hasMatch;\n\n if (isMatch) {\n matchCount++;\n matchingLines.push({ num: lineIdx + 1, text: line });\n }\n }\n\n if (options.quiet) return matchCount;\n\n if (options.filesOnly) {\n if (matchCount > 0 && filePath) {\n context.writer.writeln(filePath);\n }\n } else if (options.countOnly) {\n const prefix = multiFile && filePath ? `${filePath}:` : '';\n context.writer.writeln(`${prefix}${matchCount}`);\n } else {\n for (const m of matchingLines) {\n const parts: string[] = [];\n if (multiFile && filePath) {\n parts.push(context.writer.wrapInColor(filePath, CliForegroundColor.Magenta));\n parts.push(':');\n }\n if (options.showLineNum) {\n parts.push(context.writer.wrapInColor(String(m.num), CliForegroundColor.Green));\n parts.push(':');\n }\n if (options.onlyMatching && !options.invert) {\n regex.lastIndex = 0;\n const prefix = parts.join('');\n for (const match of m.text.match(regex) ?? []) {\n if (match !== '') {\n context.writer.writeln(\n prefix + context.writer.wrapInColor(match, CliForegroundColor.Red),\n );\n }\n }\n continue;\n }\n if (!options.invert) {\n regex.lastIndex = 0;\n const highlighted = m.text.replace(regex, (match) =>\n context.writer.wrapInColor(match, CliForegroundColor.Red),\n );\n parts.push(highlighted);\n } else {\n parts.push(m.text);\n }\n context.writer.writeln(parts.join(''));\n }\n }\n return matchCount;\n }\n\n private parseArgs(\n command: CliProcessCommand,\n ): { pattern: string | null; paths: string[] } {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n\n if (tokens.length === 0) {\n return { pattern: null, paths: [] };\n }\n if (tokens.length === 1) {\n return { pattern: tokens[0], paths: [] };\n }\n\n return {\n pattern: tokens[0],\n paths: tokens.slice(1),\n };\n }\n\n private collectFiles(\n fs: IFileSystemService,\n basePath: string,\n node: IFileNode,\n result: string[],\n ): void {\n const children = readableChildren(fs, basePath);\n if (!children) return;\n for (const child of children) {\n const childPath =\n basePath === '/'\n ? `/${child.name}`\n : `${basePath}/${child.name}`;\n if (child.type === 'file') {\n result.push(childPath);\n } else if (child.type === 'directory') {\n this.collectFiles(fs, childPath, child, result);\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliTacCommandProcessor implements ICliCommandProcessor {\n command = 'tac';\n description = 'Print file in reverse line order';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔄', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tac.help.print_file_lines_reverse', 'Print a file with its lines in reverse order, last line first. Works on piped input too.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['tac <file>', t.t('cli.tac.help.print_file_bottom_top', 'Print a file bottom to top')],\n ['<command> | tac', t.t('cli.tac.help.reverse_piped_input', 'Reverse piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['tac app.log', t.t('cli.tac.help.newest_log_lines_first', 'Newest log lines first')],\n ['cat list.txt | tac', t.t('cli.tac.help.reverse_list', 'Reverse a list')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n const lines = content.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n lines.reverse();\n context.writer.writeln(lines.join('\\n'));\n return;\n }\n context.writer.writeError('tac: missing file operand');\n return;\n }\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(`tac: ${path}: Is a directory`);\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) continue;\n\n if (paths.length > 1) {\n if (i > 0) context.writer.writeln();\n context.writer.writeln(`==> ${path} <==`);\n }\n\n const lines = content.split('\\n');\n // Filter trailing empty line from trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n lines.reverse();\n context.writer.writeln(lines.join('\\n'));\n } catch (e: any) {\n context.writer.writeError(`tac: ${e.message}`);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliBasenameCommandProcessor implements ICliCommandProcessor {\n command = 'basename';\n description = 'Strip directory from path';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📛', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.basename.help.print_last_part_path', 'Print the last part of a path, the file or directory name, without the directories in front. If a suffix is given, it is removed from the end too.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['basename <path>', t.t('cli.basename.help.name_without_directories', 'Name without the directories')],\n ['basename <path> <suffix>', t.t('cli.basename.help.also_remove_trailing_suffix', 'Also remove a trailing suffix')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['basename /home/user/notes.txt', t.t('cli.basename.help.prints_notes_txt', 'Prints notes.txt')],\n ['basename /home/user/notes.txt .txt', t.t('cli.basename.help.prints_notes', 'Prints notes')],\n ['basename /home/user/', t.t('cli.basename.help.prints_user', 'Prints user')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const tokens = this.parseTokens(command);\n\n if (tokens.length === 0) {\n context.writer.writeError('basename: missing operand');\n return;\n }\n\n const path = tokens[0];\n const suffix = tokens.length > 1 ? tokens[1] : undefined;\n\n // Handle root path\n if (path === '/') {\n context.writer.writeln('/');\n return;\n }\n\n // Remove trailing slashes\n const cleaned = path.replace(/\\/+$/, '') || '/';\n const parts = cleaned.split('/');\n let name = parts[parts.length - 1];\n\n // If after cleaning we got empty (shouldn't happen), fallback\n if (!name) {\n name = '/';\n }\n\n // Strip suffix if provided and name ends with it\n if (suffix && name.endsWith(suffix) && name !== suffix) {\n name = name.slice(0, -suffix.length);\n }\n\n context.writer.writeln(name);\n }\n\n private parseTokens(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliDirnameCommandProcessor implements ICliCommandProcessor {\n command = 'dirname';\n description = 'Strip last component from path';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📂', module: 'file management' };\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.dirname.help.print_directory_part_path', 'Print the directory part of a path, everything before the last /. A bare name with no / gives . (the current directory).'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['dirname <path>', t.t('cli.dirname.help.path_without_last_part', 'Path without its last part')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['dirname /home/user/notes.txt', t.t('cli.dirname.help.prints_home_user', 'Prints /home/user')],\n ['dirname notes.txt', t.t('cli.dirname.help.prints', 'Prints .')],\n ['dirname /home', t.t('cli.dirname.help.prints_2', 'Prints /')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const tokens = this.parseTokens(command);\n\n if (tokens.length === 0) {\n context.writer.writeError('dirname: missing operand');\n return;\n }\n\n const path = tokens[0];\n\n // Handle root path\n if (path === '/') {\n context.writer.writeln('/');\n return;\n }\n\n // Remove trailing slashes\n const cleaned = path.replace(/\\/+$/, '') || '/';\n\n // No slash at all => bare filename => return '.'\n if (!cleaned.includes('/')) {\n context.writer.writeln('.');\n return;\n }\n\n const parts = cleaned.split('/');\n parts.pop(); // remove last component\n\n let dir = parts.join('/');\n // If dir is empty after removing last component (e.g. \"/home\" -> \"\")\n if (!dir) {\n dir = '/';\n }\n\n context.writer.writeln(dir);\n }\n\n private parseTokens(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText, splitLines } from '../utils/lines';\n\nexport class CliSortCommandProcessor implements ICliCommandProcessor {\n command = 'sort';\n description = 'Sort lines of text files';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '\\u{1F524}', module: 'file management' };\n\n parameters = [\n {\n name: 'reverse',\n aliases: ['r'],\n description: 'Reverse the result of comparisons',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'numeric-sort',\n aliases: ['n'],\n description: 'Compare according to string numerical value',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'unique',\n aliases: ['u'],\n description: 'Output only unique lines',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'key',\n aliases: ['k'],\n description: 'Sort by a specific field (1-indexed)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'field-separator',\n aliases: ['t'],\n description: 'Use a specific field delimiter',\n required: false,\n type: 'string' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.sort.help.sort_lines_file_piped', 'Sort the lines of a file or piped input, alphabetically by default. Sort numerically, in reverse, by a field, or drop duplicates. Several files are sorted together into one list.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['sort <file>', t.t('cli.sort.help.sort_lines_alphabetically', 'Sort lines alphabetically')],\n [\n 'sort -k <n> -t <sep> <file>',\n t.t('cli.sort.help.sort_field_split', 'Sort by field <n>, split on <sep>'),\n ],\n ['<command> | sort', t.t('cli.sort.help.sort_piped_input', 'Sort piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['sort names.txt', t.t('cli.sort.help.z', 'A to Z')],\n ['sort -n -r scores.txt', t.t('cli.sort.help.largest_number_first', 'Largest number first')],\n ['sort -t , -k 2 data.csv', t.t('cli.sort.help.sort_csv_second_column', 'Sort a CSV by its second column')],\n ['cat words.txt | sort -u', t.t('cli.sort.help.sorted_without_duplicates', 'Sorted, without duplicates')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const reverse = !!command.args['r'] || !!command.args['reverse'];\n const numeric = !!command.args['n'] || !!command.args['numeric-sort'];\n const unique = !!command.args['u'] || !!command.args['unique'];\n const keyField = command.args['k'] ?? command.args['key'];\n const delimiter = command.args['t'] ?? command.args['field-separator'];\n\n const paths = this.parsePaths(command);\n let lines: string[] = [];\n\n if (paths.length === 0) {\n if (command.data == null) {\n context.writer.writeError('sort: missing file operand');\n return;\n }\n lines = splitLines(pipedText(command.data));\n } else {\n // Several files are sorted together, as one input\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(\n `sort: ${path}: Is a directory`,\n );\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `sort: ${path}: No such file or directory`,\n );\n continue;\n }\n lines.push(...splitLines(content));\n } catch (e: any) {\n context.writer.writeError(`sort: ${e.message}`);\n }\n }\n }\n\n const keyIndex =\n keyField != null && keyField !== true\n ? parseInt(String(keyField), 10) - 1\n : undefined;\n const sepRegex =\n delimiter != null && delimiter !== true\n ? new RegExp(\n String(delimiter).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'),\n )\n : /\\s+/;\n const keyOf = (line: string): string =>\n keyIndex !== undefined && keyIndex >= 0\n ? line.split(sepRegex)[keyIndex] || ''\n : line;\n const compare = (a: string, b: string): number => {\n const va = keyOf(a);\n const vb = keyOf(b);\n if (numeric) {\n return (parseFloat(va) || 0) - (parseFloat(vb) || 0);\n }\n return va.localeCompare(vb);\n };\n\n lines.sort(compare);\n\n if (unique) {\n lines = lines.filter(\n (line, i, arr) => i === 0 || compare(line, arr[i - 1]) !== 0,\n );\n }\n\n if (reverse) {\n lines.reverse();\n }\n\n if (lines.length > 0) {\n context.writer.writeln(lines.join('\\n'));\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliUniqCommandProcessor implements ICliCommandProcessor {\n command = 'uniq';\n description = 'Filter adjacent duplicate lines from a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '\\u{1F501}', module: 'file management' };\n\n parameters = [\n {\n name: 'count',\n aliases: ['c'],\n description: 'Prefix lines by the number of occurrences',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'repeated',\n aliases: ['d'],\n description: 'Only print duplicate lines',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'ignore-case',\n aliases: ['i'],\n description: 'Ignore differences in case when comparing',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'unique',\n aliases: ['u'],\n description: 'Only print unique lines',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.uniq.help.collapse_repeated_lines_next', 'Collapse repeated lines that are next to each other into one. Only adjacent duplicates are merged, so sort the input first to catch them all.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['uniq <file>', t.t('cli.uniq.help.drop_adjacent_duplicate_lines', 'Drop adjacent duplicate lines')],\n ['<command> | uniq', t.t('cli.uniq.help.filter_piped_input', 'Filter piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['uniq log.txt', t.t('cli.uniq.help.collapse_repeated_lines', 'Collapse repeated lines')],\n ['sort words.txt | uniq -c', t.t('cli.uniq.help.count_how_often_each', 'Count how often each line appears')],\n ['sort words.txt | uniq -d', t.t('cli.uniq.help.show_only_duplicated_lines', 'Show only the duplicated lines')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const showCount = !!command.args['c'] || !!command.args['count'];\n const onlyDuplicates =\n !!command.args['d'] || !!command.args['repeated'];\n const ignoreCase =\n !!command.args['i'] || !!command.args['ignore-case'];\n const onlyUnique = !!command.args['u'] || !!command.args['unique'];\n\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n const lines = content.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n const groups: { line: string; count: number }[] = [];\n for (const line of lines) {\n const last = groups[groups.length - 1];\n const compare = ignoreCase\n ? (a: string, b: string) =>\n a.toLowerCase() === b.toLowerCase()\n : (a: string, b: string) => a === b;\n if (last && compare(last.line, line)) {\n last.count++;\n } else {\n groups.push({ line, count: 1 });\n }\n }\n\n let filtered = groups;\n if (onlyDuplicates) {\n filtered = filtered.filter((g) => g.count > 1);\n }\n if (onlyUnique) {\n filtered = filtered.filter((g) => g.count === 1);\n }\n\n const output = filtered.map((g) => {\n if (showCount) {\n return `${String(g.count).padStart(7)} ${g.line}`;\n }\n return g.line;\n });\n\n context.writer.writeln(output.join('\\n'));\n return;\n }\n context.writer.writeError('uniq: missing file operand');\n return;\n }\n\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(\n `uniq: ${path}: Is a directory`,\n );\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `uniq: ${path}: No such file or directory`,\n );\n continue;\n }\n\n const lines = content.split('\\n');\n // Remove trailing empty line from trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n // Group consecutive identical lines\n const groups: { line: string; count: number }[] = [];\n for (const line of lines) {\n const last = groups[groups.length - 1];\n const compare = ignoreCase\n ? (a: string, b: string) =>\n a.toLowerCase() === b.toLowerCase()\n : (a: string, b: string) => a === b;\n if (last && compare(last.line, line)) {\n last.count++;\n } else {\n groups.push({ line, count: 1 });\n }\n }\n\n // Filter based on flags\n let filtered = groups;\n if (onlyDuplicates) {\n filtered = filtered.filter((g) => g.count > 1);\n }\n if (onlyUnique) {\n filtered = filtered.filter((g) => g.count === 1);\n }\n\n // Format output\n const output = filtered.map((g) => {\n if (showCount) {\n return `${String(g.count).padStart(7)} ${g.line}`;\n }\n return g.line;\n });\n\n context.writer.writeln(output.join('\\n'));\n } catch (e: any) {\n context.writer.writeError(`uniq: ${e.message}`);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliCutCommandProcessor implements ICliCommandProcessor {\n command = 'cut';\n description = 'Extract columns or fields from each line of a file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '\\u2702\\uFE0F', module: 'file management' };\n\n parameters = [\n {\n name: 'delimiter',\n aliases: ['d'],\n description: 'Use a specific field delimiter (default: tab)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'fields',\n aliases: ['f'],\n description: 'Select only these fields (e.g., 1,3 or 1-3)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'characters',\n aliases: ['c'],\n description:\n 'Select only these character positions (e.g., 1-5 or 3)',\n required: false,\n type: 'string' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cut.help.print_selected_parts_each', 'Print selected parts of each line: fields split by a delimiter (-f, tab by default) or character positions (-c). A list can be single numbers, ranges or both, such as 1,3 or 2-4 or 3-.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cut -d <sep> -f <list> <file>', t.t('cli.cut.help.select_fields', 'Select fields')],\n ['cut -c <list> <file>', t.t('cli.cut.help.select_character_positions', 'Select character positions')],\n ['<command> | cut -f <list>', t.t('cli.cut.help.cut_piped_input', 'Cut piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cut -d , -f 1,3 data.csv', t.t('cli.cut.help.first_third_csv_column', 'First and third CSV column')],\n ['cut -c 1-10 notes.txt', t.t('cli.cut.help.first_10_characters_each', 'First 10 characters of each line')],\n ['cat users.txt | cut -d : -f 1-2', t.t('cli.cut.help.first_two_fields_split', 'First two fields split on :')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const delimiter = command.args['d'] || command.args['delimiter'] || '\\t';\n const fieldsSpec = command.args['f'] ?? command.args['fields'];\n const charsSpec = command.args['c'] ?? command.args['characters'];\n\n if (\n (fieldsSpec === undefined || fieldsSpec === '') &&\n (charsSpec === undefined || charsSpec === '')\n ) {\n context.writer.writeError(\n 'cut: you must specify either -f (fields) or -c (characters)',\n );\n return;\n }\n\n // A plain number arrives parsed (`-f 2`), so normalize to text\n const spec = String(fieldsSpec ?? charsSpec);\n const indices = this.parseSpec(spec);\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n if (command.data != null) {\n const content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n const lines = content.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n const output = lines.map((line) => {\n if (fieldsSpec) {\n const fields = line.split(delimiter);\n const resolved = this.resolveIndices(\n indices,\n fields.length,\n );\n return resolved\n .map((idx) => fields[idx] || '')\n .join(delimiter);\n } else {\n const chars = line.split('');\n const resolved = this.resolveIndices(\n indices,\n chars.length,\n );\n return resolved.map((idx) => chars[idx] || '').join('');\n }\n });\n\n context.writer.writeln(output.join('\\n'));\n return;\n }\n context.writer.writeError('cut: missing file operand');\n return;\n }\n\n for (const path of paths) {\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(\n `cut: ${path}: Is a directory`,\n );\n continue;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `cut: ${path}: No such file or directory`,\n );\n continue;\n }\n\n const lines = content.split('\\n');\n // Remove trailing empty line from trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n const output = lines.map((line) => {\n if (fieldsSpec) {\n const fields = line.split(delimiter);\n const resolved = this.resolveIndices(\n indices,\n fields.length,\n );\n return resolved\n .map((idx) => fields[idx] || '')\n .join(delimiter);\n } else {\n // character mode\n const chars = line.split('');\n const resolved = this.resolveIndices(\n indices,\n chars.length,\n );\n return resolved.map((idx) => chars[idx] || '').join('');\n }\n });\n\n context.writer.writeln(output.join('\\n'));\n } catch (e: any) {\n context.writer.writeError(`cut: ${e.message}`);\n }\n }\n }\n\n private parseSpec(\n spec: string,\n ): Array<{ type: 'index'; value: number } | { type: 'range'; start: number | null; end: number | null }> {\n const parts = spec.split(',');\n const result: Array<\n | { type: 'index'; value: number }\n | { type: 'range'; start: number | null; end: number | null }\n > = [];\n\n for (const part of parts) {\n const trimmed = part.trim();\n if (trimmed.includes('-')) {\n const [startStr, endStr] = trimmed.split('-');\n const start = startStr ? parseInt(startStr, 10) : null;\n const end = endStr ? parseInt(endStr, 10) : null;\n result.push({ type: 'range', start, end });\n } else {\n result.push({ type: 'index', value: parseInt(trimmed, 10) });\n }\n }\n\n return result;\n }\n\n private resolveIndices(\n specs: Array<\n | { type: 'index'; value: number }\n | { type: 'range'; start: number | null; end: number | null }\n >,\n total: number,\n ): number[] {\n const indices: number[] = [];\n\n for (const spec of specs) {\n if (spec.type === 'index') {\n indices.push(spec.value - 1);\n } else {\n const start = spec.start ? spec.start - 1 : 0;\n const end = spec.end ? spec.end - 1 : total - 1;\n for (let i = start; i <= end; i++) {\n indices.push(i);\n }\n }\n }\n\n return indices;\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText, splitLines } from '../utils/lines';\n\nexport class CliPasteCommandProcessor implements ICliCommandProcessor {\n command = 'paste';\n description = 'Merge lines of files side by side';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '\\u{1F4CB}', module: 'file management' };\n\n parameters = [\n {\n name: 'delimiters',\n aliases: ['d'],\n description: 'Use a specific delimiter (default: tab)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'serial',\n aliases: ['s'],\n description:\n 'Paste one file at a time instead of in parallel',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.paste.help.join_files_side_side', 'Join files side by side: line 1 of each file goes on one output line, separated by a tab, then line 2, and so on. With -s, each file is joined onto a single line instead. Piped input is read as the file - (or as the only input when no file is named); -d takes a list of delimiters used in turn.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['paste <file1> <file2...>', t.t('cli.paste.help.merge_files_line_line', 'Merge files line by line')],\n ['paste -s <file>', t.t('cli.paste.help.join_all_lines_file', 'Join all lines of a file into one')],\n ['<command> | paste - <file>', t.t('cli.paste.help.merge_piped_input_file', 'Merge piped input with a file')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['paste names.txt ages.txt', t.t('cli.paste.help.two_columns_tab_separated', 'Two columns, tab separated')],\n ['paste -d , a.txt b.txt', t.t('cli.paste.help.merge_comma_separated', 'Merge as comma-separated')],\n ['paste -s -d , list.txt', t.t('cli.paste.help.turn_list_one_csv', 'Turn a list into one CSV line')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const delimiterArg =\n command.args['d'] ?? command.args['delimiters'] ?? '\\t';\n const delimiters = this.parseDelimiters(String(delimiterArg));\n const serial = !!command.args['s'] || !!command.args['serial'];\n\n const paths = this.parsePaths(command);\n const hasStdin = command.data != null;\n\n if (paths.length === 0) {\n if (!hasStdin) {\n context.writer.writeError('paste: missing file operand');\n return;\n }\n // Piped input alone is the single input file\n paths.push('-');\n }\n\n // Read all inputs ('-' is the piped input)\n const fileLines: string[][] = [];\n for (const path of paths) {\n if (path === '-' && hasStdin) {\n fileLines.push(splitLines(pipedText(command.data)));\n continue;\n }\n try {\n if (fs.isDirectory(path)) {\n context.writer.writeError(\n `paste: ${path}: Is a directory`,\n );\n return;\n }\n const content = fs.readFile(path);\n if (content === null) {\n context.writer.writeError(\n `paste: ${path}: No such file or directory`,\n );\n return;\n }\n fileLines.push(splitLines(content));\n } catch (e: any) {\n context.writer.writeError(`paste: ${e.message}`);\n return;\n }\n }\n\n const join = (parts: string[]): string =>\n parts.reduce(\n (line, part, i) =>\n i === 0\n ? part\n : line + delimiters[(i - 1) % delimiters.length] + part,\n '',\n );\n\n if (serial) {\n // Serial mode: each file's lines joined on one output line\n const output = fileLines.map((lines) => join(lines));\n context.writer.writeln(output.join('\\n'));\n } else {\n // Parallel mode: zip lines from all files\n const maxLines = Math.max(\n ...fileLines.map((lines) => lines.length),\n );\n const output: string[] = [];\n for (let i = 0; i < maxLines; i++) {\n output.push(join(fileLines.map((lines) => lines[i] ?? '')));\n }\n context.writer.writeln(output.join('\\n'));\n }\n }\n\n /** `-d` list: each character in turn, with \\t, \\n, \\\\ and \\0 (empty) escapes. */\n private parseDelimiters(list: string): string[] {\n const result: string[] = [];\n for (let i = 0; i < list.length; i++) {\n if (list[i] === '\\\\' && i + 1 < list.length) {\n const next = list[++i];\n result.push(\n next === 't' ? '\\t' : next === 'n' ? '\\n' : next === '0' ? '' : next,\n );\n } else {\n result.push(list[i]);\n }\n }\n return result.length > 0 ? result : ['\\t'];\n }\n\n /**\n * The file operands. The engine drops a lone `-` from the value, so with\n * piped input they are read from the raw command line to keep it.\n */\n private parsePaths(command: CliProcessCommand): string[] {\n const fromValue = splitArgs(command.value || '').filter(Boolean);\n if (command.data == null || !command.rawCommand) return fromValue;\n\n const words = splitArgs(command.rawCommand).slice(1);\n if (!words.includes('-')) return fromValue;\n const result: string[] = [];\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n if (word === '-' || !word.startsWith('-')) {\n result.push(word);\n } else if (/^(-d|--delimiters)$/.test(word)) {\n i++; // its value\n }\n }\n return result;\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\n/**\n * Expand character set notation (ranges like a-z, character classes like [:upper:])\n * into an array of individual characters.\n */\nfunction expandSet(set: string): string[] {\n const chars: string[] = [];\n let i = 0;\n while (i < set.length) {\n // Escapes: \\n, \\t, \\r, \\\\ and any other escaped character as itself\n if (set[i] === '\\\\' && i + 1 < set.length) {\n const next = set[i + 1];\n chars.push(\n next === 'n' ? '\\n' : next === 't' ? '\\t' : next === 'r' ? '\\r' : next,\n );\n i += 2;\n continue;\n }\n // Character classes\n if (set[i] === '[' && set[i + 1] === ':') {\n const end = set.indexOf(':]', i + 2);\n if (end !== -1) {\n const className = set.substring(i + 2, end);\n chars.push(...getCharClass(className));\n i = end + 2;\n continue;\n }\n }\n // Ranges like a-z\n if (\n i + 2 < set.length &&\n set[i + 1] === '-' &&\n set[i + 2] !== '\\\\'\n ) {\n const start = set.charCodeAt(i);\n const finish = set.charCodeAt(i + 2);\n if (start <= finish) {\n for (let c = start; c <= finish; c++) {\n chars.push(String.fromCharCode(c));\n }\n } else {\n for (let c = start; c >= finish; c--) {\n chars.push(String.fromCharCode(c));\n }\n }\n i += 3;\n continue;\n }\n chars.push(set[i]);\n i++;\n }\n return chars;\n}\n\nfunction getCharClass(name: string): string[] {\n switch (name) {\n case 'upper':\n return expandSet('A-Z');\n case 'lower':\n return expandSet('a-z');\n case 'digit':\n return expandSet('0-9');\n case 'alpha':\n return [...expandSet('a-z'), ...expandSet('A-Z')];\n case 'alnum':\n return [...expandSet('a-z'), ...expandSet('A-Z'), ...expandSet('0-9')];\n case 'space':\n return [' ', '\\t', '\\n', '\\r', '\\x0b', '\\x0c'];\n default:\n return [];\n }\n}\n\n/**\n * Parse quoted or unquoted tokens from a raw command string.\n * Returns an array of parsed tokens (SET1, SET2).\n */\nfunction parseTokens(raw: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n while (i < raw.length) {\n // Skip whitespace\n if (/\\s/.test(raw[i])) {\n i++;\n continue;\n }\n // Quoted string\n if (raw[i] === \"'\" || raw[i] === '\"') {\n const quote = raw[i];\n i++;\n let token = '';\n while (i < raw.length && raw[i] !== quote) {\n token += raw[i];\n i++;\n }\n i++; // skip closing quote\n tokens.push(token);\n continue;\n }\n // Unquoted token\n let token = '';\n while (i < raw.length && !/\\s/.test(raw[i])) {\n token += raw[i];\n i++;\n }\n tokens.push(token);\n }\n return tokens;\n}\n\nexport class CliTrCommandProcessor implements ICliCommandProcessor {\n command = 'tr';\n description = 'Translate or delete characters in piped input';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔀', module: 'file management' };\n\n parameters = [\n {\n name: 'delete',\n aliases: ['d'],\n description: 'Delete characters in SET1',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'squeeze-repeats',\n aliases: ['s'],\n description: 'Squeeze repeated characters in last operand set',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tr.help.translate_characters_set1_matching', 'Translate characters from SET1 into the matching characters of SET2, delete them (-d) or squeeze repeats into one (-s). Sets can use ranges like a-z and classes like [:upper:], [:lower:], [:digit:], [:alpha:], [:alnum:] and [:space:]. Escapes \\\\n, \\\\t and \\\\\\\\ are understood. Like Unix tr, it reads only piped input and takes no file operands: to transform a file, pipe it in with cat.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['<command> | tr <set1> <set2>', t.t('cli.tr.help.replace_characters', 'Replace characters')],\n ['<command> | tr -d <set1>', t.t('cli.tr.help.delete_characters', 'Delete characters')],\n ['<command> | tr -s <set1> [set2]', t.t('cli.tr.help.squeeze_repeated_characters', 'Squeeze repeated characters')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cat notes.txt | tr a-z A-Z', t.t('cli.tr.help.convert_file_upper_case', 'Convert a file to upper case')],\n ['echo hello | tr a-z A-Z', t.t('cli.tr.help.upper_case_piped_text', 'Upper-case piped text')],\n ['cat notes.txt | tr -d 0-9', t.t('cli.tr.help.remove_all_digits', 'Remove all digits')],\n [\"cat notes.txt | tr -s ' '\", t.t('cli.tr.help.collapse_runs_spaces', 'Collapse runs of spaces')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const raw = command.value || '';\n const positional = parseTokens(raw);\n\n const deleteMode = !!command.args['d'] || !!command.args['delete'];\n const squeezeMode =\n !!command.args['s'] || !!command.args['squeeze-repeats'];\n\n if (positional.length === 0) {\n this.fail(context, 'tr: missing operand');\n return;\n }\n\n // How many operands are sets: -d takes one, -d -s and plain\n // translation two, -s one or two. Like Unix tr there are no file\n // operands: tr reads only piped input.\n let setCount: number;\n if (deleteMode) {\n setCount = squeezeMode ? 2 : 1;\n } else if (squeezeMode) {\n setCount = Math.min(positional.length, 2);\n } else {\n setCount = 2;\n }\n\n if (positional.length < setCount) {\n this.fail(context, 'tr: missing operand');\n return;\n }\n if (positional.length > setCount) {\n this.fail(context, `tr: extra operand '${positional[setCount]}'`);\n return;\n }\n\n if (command.data == null) {\n this.fail(\n context,\n \"tr: no input: tr reads only piped input and takes no file operands; use 'cat file | tr a-z A-Z'\",\n );\n return;\n }\n\n const set1Str: string = positional[0];\n const set2Str: string | undefined =\n setCount === 2 ? positional[1] : undefined;\n const content: string =\n typeof command.data === 'string'\n ? command.data\n : JSON.stringify(command.data);\n\n try {\n const set1 = expandSet(set1Str!);\n const set1Set = new Set(set1);\n const set2 = set2Str ? expandSet(set2Str) : [];\n\n let result = content;\n\n if (deleteMode && squeezeMode) {\n // Delete SET1 chars, then squeeze SET2 chars\n result = this.deleteChars(result, set1Set);\n const squeezeSet = new Set(set2);\n result = this.squeezeChars(result, squeezeSet);\n } else if (deleteMode) {\n result = this.deleteChars(result, set1Set);\n } else if (squeezeMode && set2.length > 0) {\n // Translate then squeeze\n result = this.translateChars(result, set1, set2);\n const squeezeSet = new Set(set2);\n result = this.squeezeChars(result, squeezeSet);\n } else if (squeezeMode) {\n result = this.squeezeChars(result, set1Set);\n } else {\n result = this.translateChars(result, set1, set2);\n }\n\n context.writer.writeln(result);\n } catch (e: any) {\n this.fail(context, `tr: ${e.message}`);\n }\n }\n\n private fail(context: ICliExecutionContext, message: string): void {\n context.writer.writeError(message);\n context.process.exit(1, { silent: true });\n }\n\n private deleteChars(content: string, deleteSet: Set<string>): string {\n let result = '';\n for (const ch of content) {\n if (!deleteSet.has(ch)) {\n result += ch;\n }\n }\n return result;\n }\n\n private squeezeChars(content: string, squeezeSet: Set<string>): string {\n let result = '';\n let prevChar = '';\n for (const ch of content) {\n if (squeezeSet.has(ch) && ch === prevChar) {\n continue;\n }\n result += ch;\n prevChar = ch;\n }\n return result;\n }\n\n private translateChars(\n content: string,\n set1: string[],\n set2: string[],\n ): string {\n if (set2.length === 0) return content;\n\n // Build translation map; if SET2 is shorter, last char repeats\n const map = new Map<string, string>();\n for (let i = 0; i < set1.length; i++) {\n const replacement =\n i < set2.length ? set2[i] : set2[set2.length - 1];\n map.set(set1[i], replacement);\n }\n\n let result = '';\n for (const ch of content) {\n result += map.has(ch) ? map.get(ch)! : ch;\n }\n return result;\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliStatCommandProcessor implements ICliCommandProcessor {\n command = 'stat';\n description = 'Display file/directory metadata';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📊', module: 'file management' };\n\n parameters = [];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.stat.help.show_details_about_files', 'Show details about files or directories: full path, size, type, permissions, owner, group, and when it was created and last modified.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['stat <path...>', t.t('cli.stat.help.show_details_each_path', 'Show details for each path')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['stat notes.txt', t.t('cli.stat.help.details_one_file', 'Details of one file')],\n ['stat ~/docs notes.txt', t.t('cli.stat.help.several_paths_once', 'Several paths at once')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const paths = this.parsePaths(command);\n\n if (paths.length === 0) {\n context.writer.writeError('stat: missing operand');\n return;\n }\n\n for (const path of paths) {\n const resolved = fs.resolvePath(path);\n if (fs.canTraverse && !fs.canTraverse(resolved)) {\n context.writer.writeError(`stat: cannot stat '${path}': Permission denied`);\n continue;\n }\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `stat: cannot stat '${path}': No such file or directory`,\n );\n continue;\n }\n\n context.writer.writeKeyValue({\n File: resolved,\n Size: `${node.size}`,\n Type: node.type,\n Permissions: node.permissions || 'rw-r--r--',\n Owner: node.ownership?.uid || '-',\n Group: node.ownership?.gid || '-',\n Created: new Date(node.createdAt).toLocaleString(),\n Modified: new Date(node.modifiedAt).toLocaleString(),\n });\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliChmodCommandProcessor implements ICliCommandProcessor {\n command = 'chmod';\n description = 'Change file permissions';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔒', module: 'file management' };\n\n parameters = [\n {\n name: 'R',\n description: 'Change files and directories recursively',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.chmod.help.change_who_can_read', 'Change who can read (r), write (w) and execute (x) a file. Use an octal mode such as 755 or a symbolic one: who (u user, g group, o others, a all), then + to add, - to remove or = to set, then the permissions.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['chmod <mode> <file...>', t.t('cli.chmod.help.set_permissions', 'Set permissions')],\n [\n 'chmod -R <mode> <dir>',\n t.t('cli.chmod.help.apply_directory_everything', 'Apply to a directory and everything in it'),\n ],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['chmod 644 notes.txt', t.t('cli.chmod.help.rw_r_r_owner', 'rw-r--r--: owner writes, others read')],\n ['chmod u+x script.sh', t.t('cli.chmod.help.let_owner_execute', 'Let the owner execute it')],\n ['chmod go-w shared.txt', t.t('cli.chmod.help.take_away_write_group', 'Take away write for group and others')],\n ['chmod -R 755 site', t.t('cli.chmod.help.set_whole_directory_tree', 'Set a whole directory tree')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const { recursive, mode, paths } = this.parseArgs(command);\n\n if (!mode || paths.length === 0) {\n context.writer.writeError(\n 'chmod: missing operand',\n );\n return;\n }\n\n for (const path of paths) {\n const resolved = fs.resolvePath(path);\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `chmod: cannot access '${path}': No such file or directory`,\n );\n continue;\n }\n\n const perms = this.resolvePermissions(mode, node.permissions || 'rw-r--r--');\n if (perms === null) {\n context.writer.writeError(\n `chmod: invalid mode: '${mode}'`,\n );\n return;\n }\n\n this.applyPermissions(fs, resolved, node, perms, recursive);\n }\n\n await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): {\n recursive: boolean;\n mode: string | null;\n paths: string[];\n } {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n const recursive = command.args['R'] || false;\n const mode = tokens.length > 0 ? tokens[0] : null;\n const paths = tokens.slice(1);\n return { recursive, mode, paths };\n }\n\n private resolvePermissions(\n mode: string,\n current: string,\n ): string | null {\n // Octal mode (e.g., 755, 644)\n if (/^[0-7]{3}$/.test(mode)) {\n return this.octalToPermString(mode);\n }\n\n // Symbolic mode (e.g., u+x, go-w, a+r)\n const match = mode.match(/^([ugoa]+)([+\\-=])([rwx]+)$/);\n if (!match) {\n return null;\n }\n\n const who = match[1];\n const op = match[2];\n const perms = match[3];\n const chars = current.split('');\n\n // Map who to indices: u=0-2, g=3-5, o=6-8\n const indices: number[] = [];\n const addIndices = (start: number) => {\n if (perms.includes('r')) indices.push(start);\n if (perms.includes('w')) indices.push(start + 1);\n if (perms.includes('x')) indices.push(start + 2);\n };\n\n if (who.includes('u') || who.includes('a')) addIndices(0);\n if (who.includes('g') || who.includes('a')) addIndices(3);\n if (who.includes('o') || who.includes('a')) addIndices(6);\n\n for (const idx of indices) {\n const permChar = idx % 3 === 0 ? 'r' : idx % 3 === 1 ? 'w' : 'x';\n if (op === '+') {\n chars[idx] = permChar;\n } else if (op === '-') {\n chars[idx] = '-';\n } else if (op === '=') {\n chars[idx] = permChar;\n }\n }\n\n // For '=' operation, clear bits not mentioned\n if (op === '=') {\n const clearIndices: number[] = [];\n const clearGroup = (start: number) => {\n if (!perms.includes('r')) clearIndices.push(start);\n if (!perms.includes('w')) clearIndices.push(start + 1);\n if (!perms.includes('x')) clearIndices.push(start + 2);\n };\n\n if (who.includes('u') || who.includes('a')) clearGroup(0);\n if (who.includes('g') || who.includes('a')) clearGroup(3);\n if (who.includes('o') || who.includes('a')) clearGroup(6);\n\n for (const idx of clearIndices) {\n chars[idx] = '-';\n }\n }\n\n return chars.join('');\n }\n\n private octalToPermString(octal: string): string {\n const digitToPerms = (d: number): string => {\n return (\n ((d & 4) ? 'r' : '-') +\n ((d & 2) ? 'w' : '-') +\n ((d & 1) ? 'x' : '-')\n );\n };\n return (\n digitToPerms(parseInt(octal[0], 10)) +\n digitToPerms(parseInt(octal[1], 10)) +\n digitToPerms(parseInt(octal[2], 10))\n );\n }\n\n private applyPermissions(\n fs: IFileSystemService,\n basePath: string,\n node: IFileNode,\n perms: string,\n recursive: boolean,\n ): void {\n fs.chmod(basePath, perms);\n if (recursive && node.type === 'directory' && node.children) {\n for (const child of node.children) {\n const childPath =\n basePath === '/'\n ? `/${child.name}`\n : `${basePath}/${child.name}`;\n this.applyPermissions(fs, childPath, child, perms, recursive);\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliChownCommandProcessor implements ICliCommandProcessor {\n command = 'chown';\n description = 'Change file owner and group';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔑', module: 'file management' };\n\n parameters = [\n {\n name: 'R',\n description: 'Change files and directories recursively',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.chown.help.change_owner_group_files', 'Change the owner and/or group of files. Give user, user:group, user: (owner only) or :group (group only).'),\n );\n context.writer.writeln();\n writeUsage(context, [\n [\n 'chown <user>[:<group>] <file...>',\n t.t('cli.chown.help.change_owner_group_if', 'Change owner, and group if given'),\n ],\n ['chown :<group> <file>', t.t('cli.chown.help.change_only_group', 'Change only the group')],\n [\n 'chown -R <user> <dir>',\n t.t('cli.chown.help.apply_directory_everything', 'Apply to a directory and everything in it'),\n ],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['chown alice notes.txt', t.t('cli.chown.help.make_alice_owner', 'Make alice the owner')],\n ['chown alice:staff report.txt', t.t('cli.chown.help.set_owner_group', 'Set owner and group')],\n ['chown -R bob ~/shared', t.t('cli.chown.help.give_bob_whole_directory', 'Give bob a whole directory')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const { recursive, ownerSpec, paths } = this.parseArgs(command);\n\n if (!ownerSpec || paths.length === 0) {\n context.writer.writeError(\n 'chown: missing operand. Usage: chown [user][:group] <file>',\n );\n return;\n }\n\n const { uid, gid } = this.parseOwnerSpec(ownerSpec);\n if (!uid && !gid) {\n context.writer.writeError(\n `chown: invalid owner: '${ownerSpec}'`,\n );\n return;\n }\n\n for (const path of paths) {\n const resolved = fs.resolvePath(path);\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `chown: cannot access '${path}': No such file or directory`,\n );\n continue;\n }\n\n this.applyOwnership(fs, resolved, node, uid, gid, recursive);\n }\n\n await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): {\n recursive: boolean;\n ownerSpec: string | null;\n paths: string[];\n } {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n const recursive = command.args['R'] || false;\n const ownerSpec = tokens.length > 0 ? tokens[0] : null;\n const paths = tokens.slice(1);\n return { recursive, ownerSpec, paths };\n }\n\n /** Parse \"user:group\", \"user:\", \":group\", or \"user\" */\n private parseOwnerSpec(spec: string): { uid: string | null; gid: string | null } {\n if (spec.includes(':')) {\n const [uid, gid] = spec.split(':', 2);\n return {\n uid: uid || null,\n gid: gid || null,\n };\n }\n return { uid: spec, gid: null };\n }\n\n private applyOwnership(\n fs: IFileSystemService,\n basePath: string,\n node: IFileNode,\n uid: string | null,\n gid: string | null,\n recursive: boolean,\n ): void {\n const current = node.ownership || { uid: 'root', gid: 'admin' };\n fs.chown(basePath, {\n uid: uid ?? current.uid,\n gid: gid ?? current.gid,\n });\n\n if (recursive && node.type === 'directory' && node.children) {\n for (const child of node.children) {\n const childPath =\n basePath === '/'\n ? `/${child.name}`\n : `${basePath}/${child.name}`;\n this.applyOwnership(fs, childPath, child, uid, gid, recursive);\n }\n }\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport { readableChildren } from '../utils/readable-children';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliDuCommandProcessor implements ICliCommandProcessor {\n command = 'du';\n description = 'Estimate file space usage';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📏', module: 'file management' };\n\n parameters = [\n {\n name: 'h',\n description: 'Human-readable sizes (e.g. 1K, 2M)',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 's',\n description: 'Display only a total for each argument',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'max-depth',\n aliases: ['d'],\n description: 'Print total for a directory only if it is N or fewer levels below the argument',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.du.help.show_how_much_space', 'Show how much space files and directories use, in bytes. For a directory, every subdirectory is listed with its total size; use -s for just the total or -d to limit how deep it goes.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['du [path...]', t.t('cli.du.help.sizes_path_default_current', 'Sizes of a path (default: the current directory) and its subdirectories')],\n ['du -s <path>', t.t('cli.du.help.only_total', 'Only the total')],\n ['du -d <n> <path>', t.t('cli.du.help.only_levels_deep', 'Only <n> levels deep')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['du ~/docs', t.t('cli.du.help.size_each_directory_docs', 'Size of each directory in ~/docs')],\n ['du -h -s ~', t.t('cli.du.help.total_home_k_m', 'Total of your home in K/M/G')],\n ['du -h -d 1 .', t.t('cli.du.help.size_each_top_level', 'Size of each top-level folder')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const { humanReadable, summaryOnly, maxDepth, paths } =\n this.parseArgs(command);\n\n if (paths.length === 0) {\n paths.push(fs.getCurrentDirectory());\n }\n\n for (const path of paths) {\n const resolved = fs.resolvePath(path);\n if (fs.canTraverse && !fs.canTraverse(resolved)) {\n context.writer.writeError(`du: cannot access '${path}': Permission denied`);\n continue;\n }\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `du: cannot access '${path}': No such file or directory`,\n );\n continue;\n }\n\n if (node.type === 'file') {\n context.writer.writeln(\n `${this.formatSize(node.size, humanReadable)}\\t${resolved}`,\n );\n } else {\n const entries: { size: number; path: string }[] = [];\n this.fs = fs;\n this.collectSizes(node, resolved, 0, maxDepth, summaryOnly, entries);\n\n for (const entry of entries) {\n context.writer.writeln(\n `${this.formatSize(entry.size, humanReadable)}\\t${entry.path}`,\n );\n }\n }\n }\n }\n\n private parseArgs(command: CliProcessCommand): {\n humanReadable: boolean;\n summaryOnly: boolean;\n maxDepth: number;\n paths: string[];\n } {\n const raw = command.value || '';\n const paths = splitArgs(raw).filter(Boolean);\n const humanReadable = !!command.args['h'];\n const summaryOnly = !!command.args['s'];\n const depthArg = command.args['max-depth'] ?? command.args['d'];\n const parsedDepth = parseInt(String(depthArg ?? ''), 10);\n const maxDepth =\n depthArg != null && depthArg !== true && !isNaN(parsedDepth)\n ? parsedDepth\n : Infinity;\n\n return { humanReadable, summaryOnly, maxDepth, paths };\n }\n\n /** File system of the running command (listing goes through access checks) */\n private fs?: IFileSystemService;\n\n private collectSizes(\n node: IFileNode,\n path: string,\n depth: number,\n maxDepth: number,\n summaryOnly: boolean,\n entries: { size: number; path: string }[],\n ): number {\n if (node.type === 'file') {\n return node.size;\n }\n\n let total = 0;\n const children = this.fs ? readableChildren(this.fs, path) : node.children;\n if (children) {\n for (const child of children) {\n const childPath = path === '/' ? `/${child.name}` : `${path}/${child.name}`;\n total += this.collectSizes(\n child,\n childPath,\n depth + 1,\n maxDepth,\n summaryOnly,\n entries,\n );\n }\n }\n\n if (summaryOnly) {\n if (depth === 0) {\n entries.push({ size: total, path });\n }\n } else if (depth <= maxDepth) {\n entries.push({ size: total, path });\n }\n\n return total;\n }\n\n private formatSize(bytes: number, humanReadable: boolean): string {\n if (!humanReadable) {\n return String(bytes);\n }\n\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}K`;\n if (bytes < 1024 * 1024 * 1024)\n return `${(bytes / (1024 * 1024)).toFixed(1)}M`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}G`;\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliLnCommandProcessor implements ICliCommandProcessor {\n command = 'ln';\n description = 'Create symbolic links';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔗', module: 'file management' };\n\n parameters = [\n {\n name: 's',\n description: 'Create a symbolic link',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'force',\n aliases: ['f'],\n description: 'Replace an existing file at the link path',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.ln.help.create_symbolic_link_new', 'Create a symbolic link: a new path that points to another file or directory. Only symbolic links (-s) are supported, and the target does not need to exist yet.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['ln -s <target> <link>', t.t('cli.ln.help.create_pointing', 'Create <link> pointing at <target>')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['ln -s ~/docs/notes.txt notes', t.t('cli.ln.help.shortcut_file', 'Shortcut to a file')],\n ['ln -s /var/log logs', t.t('cli.ln.help.shortcut_directory', 'Shortcut to a directory')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const { symbolic, target, linkName } = this.parseArgs(command);\n\n if (!symbolic) {\n context.writer.writeError(\n 'ln: hard links not supported in virtual filesystem',\n );\n return;\n }\n\n if (!target || !linkName) {\n context.writer.writeError('ln: missing operand');\n return;\n }\n\n const resolvedLink = fs.resolvePath(linkName);\n const resolvedTarget = fs.resolvePath(target);\n\n // Check if the link already exists (-f replaces a file, not a directory)\n const force = !!(command.args['force'] || command.args['f']);\n if (force && fs.exists(resolvedLink) && !fs.isDirectory(resolvedLink)) {\n fs.remove(resolvedLink);\n }\n if (fs.exists(resolvedLink)) {\n context.writer.writeError(\n `ln: failed to create symbolic link '${linkName}': File exists`,\n );\n return;\n }\n\n // Create the symlink as a file node with linkTarget set\n // We allow dangling symlinks so we don't check if target exists\n fs.createFile(resolvedLink, '');\n const node = fs.getNode(resolvedLink);\n if (node) {\n node.linkTarget = resolvedTarget;\n node.size = 0;\n }\n\n await fs.persist();\n }\n\n private parseArgs(command: CliProcessCommand): {\n symbolic: boolean;\n target: string | null;\n linkName: string | null;\n } {\n const raw = command.value || '';\n const tokens = splitArgs(raw).filter(Boolean);\n const symbolic = command.args['s'] || false;\n\n return {\n symbolic,\n target: tokens[0] || null,\n linkName: tokens[1] || null,\n };\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitLines } from '../utils/lines';\n\ntype SedSingleAddress =\n | { type: 'line'; line: number }\n | { type: 'last' }\n | { type: 'regex'; regex: RegExp };\n\ninterface SedExpression {\n start: SedSingleAddress | null;\n /** End of a range address (`1,5`, `/a/,/b/`) */\n end: SedSingleAddress | null;\n negate: boolean;\n /** Inside a range: the start matched and the end not yet */\n active: boolean;\n command: 's' | 'd' | 'p' | 'q';\n // For substitution:\n pattern?: RegExp;\n replacement?: string;\n groupCount?: number;\n printFlag?: boolean;\n /** `s/a/b/2`: replace only the Nth match (with g, the Nth and later) */\n occurrence?: number;\n globalFlag?: boolean;\n}\n\nexport class CliSedCommandProcessor implements ICliCommandProcessor {\n command = 'sed';\n description = 'Stream editor for filtering and transforming text';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '✏️', module: 'file management' };\n\n parameters = [\n {\n name: 'in-place',\n aliases: ['i'],\n description: 'Edit file in place',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'quiet',\n aliases: ['n'],\n description: 'Suppress automatic printing of pattern space',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'expression',\n aliases: ['e'],\n description: 'Add the expression to the commands to be executed (repeatable)',\n required: false,\n type: 'array' as const,\n },\n {\n name: 'regexp-extended',\n aliases: ['E', 'r'],\n description: 'Use extended regular expressions: (, ), +, ?, | and { } without backslashes',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.sed.help.edit_text_line_line', 'Edit text line by line with a script: substitute (s/old/new/), delete (d), print (p) or quit (q), optionally limited to a line number, a range (1,5, 3,$ or /start/,/end/) or lines matching /regex/; ! after an address inverts it and ; separates commands. The replacement can use & (the match) and \\\\1 to \\\\9 (groups, written \\\\(...\\\\) or, with -E, (...)). Reads files or piped input and prints the result, or rewrites the files with -i.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n [\"sed '<script>' <file>\", t.t('cli.sed.help.print_edited_file', 'Print the edited file')],\n [\"sed -i '<script>' <file>\", t.t('cli.sed.help.save_edits_file', 'Save the edits into the file')],\n [\"sed -n '<script>p' <file>\", t.t('cli.sed.help.print_only_selected_lines', 'Print only selected lines')],\n [\"<command> | sed '<script>'\", t.t('cli.sed.help.edit_piped_input', 'Edit piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n [\"sed 's/cat/dog/g' pets.txt\", t.t('cli.sed.help.replace_every_cat_dog', 'Replace every cat with dog')],\n [\"sed -i 's/v1/v2/' config.txt\", t.t('cli.sed.help.edit_file_place', 'Edit the file in place')],\n [\"sed '/^#/d' config.txt\", t.t('cli.sed.help.drop_comment_lines', 'Drop comment lines')],\n [\"sed -n '1,5p' notes.txt\", t.t('cli.sed.help.print_lines_1_5', 'Print lines 1 to 5')],\n [\"sed -E 's/(\\\\w+) (\\\\w+)/\\\\2 \\\\1/' names.txt\", t.t('cli.sed.help.swap_two_words', 'Swap two words')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const { inPlace, suppress, extended, expressions, filePaths } =\n this.parseRawCommand(command);\n\n if (expressions.length === 0) {\n context.writer.writeError(\n 'sed: missing expression. Usage: sed [options] \\'expression\\' <file>',\n );\n return;\n }\n\n const parse = (): SedExpression[] | null => {\n try {\n return expressions.flatMap((e) => this.parseScript(e, extended));\n } catch (e: any) {\n context.writer.writeError(`sed: ${e.message}`);\n return null;\n }\n };\n\n if (filePaths.length === 0) {\n if (command.data == null) {\n context.writer.writeError(\n 'sed: missing file operand. Usage: sed [options] \\'expression\\' <file>',\n );\n return;\n }\n const script = parse();\n if (!script) return;\n const content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n this.writeLines(context, this.run(script, splitLines(content), suppress));\n return;\n }\n\n // Read every file first, so a missing one stops before any edit\n const contents: string[] = [];\n for (const filePath of filePaths) {\n const resolved = fs.resolvePath(filePath);\n if (!fs.exists(resolved)) {\n context.writer.writeError(\n `sed: ${filePath}: No such file or directory`,\n );\n return;\n }\n if (fs.isDirectory(resolved)) {\n context.writer.writeError(`sed: ${filePath}: Is a directory`);\n return;\n }\n try {\n contents.push(fs.readFile(resolved) ?? '');\n } catch (e: any) {\n context.writer.writeError(`sed: ${e.message}`);\n return;\n }\n }\n\n if (inPlace) {\n // Each file is edited on its own\n for (let i = 0; i < filePaths.length; i++) {\n const script = parse();\n if (!script) return;\n const output = this.run(script, splitLines(contents[i]), suppress);\n const keepNewline = contents[i].endsWith('\\n') && output.length > 0;\n try {\n fs.writeFile(\n fs.resolvePath(filePaths[i]),\n output.join('\\n') + (keepNewline ? '\\n' : ''),\n );\n } catch (e: any) {\n context.writer.writeError(`sed: ${e.message}`);\n return;\n }\n }\n await fs.persist();\n return;\n }\n\n // Several files are one stream: line numbers and $ span them all\n const script = parse();\n if (!script) return;\n const lines = contents.flatMap((c) => splitLines(c));\n this.writeLines(context, this.run(script, lines, suppress));\n }\n\n private writeLines(context: ICliExecutionContext, lines: string[]): void {\n for (const line of lines) {\n context.writer.writeln(line);\n }\n }\n\n /** Runs the script over the lines and returns the output lines. */\n private run(\n script: SedExpression[],\n lines: string[],\n suppress: boolean,\n ): string[] {\n const output: string[] = [];\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n let line = lines[lineIdx];\n let deleted = false;\n let quit = false;\n\n for (const expr of script) {\n if (!this.addressMatches(expr, lineIdx + 1, lines.length, line)) {\n continue;\n }\n\n if (expr.command === 's') {\n let replaced = false;\n let seen = 0;\n const pattern = expr.pattern!;\n pattern.lastIndex = 0;\n line = line.replace(pattern, (...args: any[]) => {\n seen++;\n const nth = expr.occurrence;\n if (nth && (expr.globalFlag ? seen < nth : seen !== nth)) {\n return args[0];\n }\n replaced = true;\n const groups = args.slice(0, expr.groupCount! + 1);\n return this.expandReplacement(expr.replacement!, groups);\n });\n if (replaced && expr.printFlag) output.push(line);\n } else if (expr.command === 'p') {\n output.push(line);\n } else if (expr.command === 'd') {\n deleted = true;\n break;\n } else if (expr.command === 'q') {\n quit = true;\n break;\n }\n }\n\n if (!deleted && !suppress) output.push(line);\n if (quit) break;\n }\n\n return output;\n }\n\n /** `&` is the match, `\\1`..`\\9` the groups, `\\n` a newline, `\\x` a literal x. */\n private expandReplacement(replacement: string, groups: string[]): string {\n let out = '';\n for (let i = 0; i < replacement.length; i++) {\n const ch = replacement[i];\n if (ch === '\\\\' && i + 1 < replacement.length) {\n const next = replacement[++i];\n if (next >= '0' && next <= '9') {\n out += groups[Number(next)] ?? '';\n } else if (next === 'n') {\n out += '\\n';\n } else if (next === 't') {\n out += '\\t';\n } else {\n out += next;\n }\n } else if (ch === '&') {\n out += groups[0];\n } else {\n out += ch;\n }\n }\n return out;\n }\n\n private parseRawCommand(command: CliProcessCommand): {\n inPlace: boolean;\n suppress: boolean;\n extended: boolean;\n expressions: string[];\n filePaths: string[];\n } {\n const raw = command.value || '';\n const tokens = this.tokenize(raw);\n\n const inPlace = !!command.args['in-place'] || !!command.args['i'];\n const suppress = !!command.args['quiet'] || !!command.args['n'];\n const extended =\n !!command.args['regexp-extended'] ||\n !!command.args['E'] ||\n !!command.args['r'];\n const expressions: string[] = [];\n\n // -e expressions (one or several)\n const eValue = command.args['expression'] ?? command.args['e'];\n for (const v of Array.isArray(eValue) ? eValue : [eValue]) {\n if (v != null && v !== true && v !== '') {\n expressions.push(String(v));\n }\n }\n\n // Without -e, the first operand is the script\n if (expressions.length === 0 && tokens.length > 0) {\n expressions.push(tokens.shift()!);\n }\n\n return { inPlace, suppress, extended, expressions, filePaths: tokens };\n }\n\n private tokenize(raw: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n while (i < raw.length) {\n // Skip whitespace\n if (raw[i] === ' ' || raw[i] === '\\t') {\n i++;\n continue;\n }\n\n // A word, with quoted parts (quotes removed)\n let token = '';\n while (i < raw.length && raw[i] !== ' ' && raw[i] !== '\\t') {\n if (raw[i] === \"'\" || raw[i] === '\"') {\n const quote = raw[i];\n i++;\n while (i < raw.length && raw[i] !== quote) {\n token += raw[i];\n i++;\n }\n if (i < raw.length) i++; // skip closing quote\n } else {\n token += raw[i];\n i++;\n }\n }\n tokens.push(token);\n }\n return tokens;\n }\n\n /** Commands of a script, separated by `;` or newlines. */\n private parseScript(script: string, extended: boolean): SedExpression[] {\n const result: SedExpression[] = [];\n let pos = 0;\n const skipSeparators = () => {\n while (pos < script.length && /[\\s;]/.test(script[pos])) pos++;\n };\n\n skipSeparators();\n while (pos < script.length) {\n const parsed = this.parseCommand(script, pos, extended);\n result.push(parsed.expression);\n pos = parsed.pos;\n while (pos < script.length && /[ \\t]/.test(script[pos])) pos++;\n if (pos < script.length && !/[;\\n]/.test(script[pos])) {\n throw new Error(`extra characters after command: '${script.slice(pos)}'`);\n }\n skipSeparators();\n }\n\n if (result.length === 0) {\n throw new Error(`invalid expression: '${script}'`);\n }\n return result;\n }\n\n private parseCommand(\n expr: string,\n pos: number,\n extended: boolean,\n ): { expression: SedExpression; pos: number } {\n // Optional address, or range of two\n let start: SedSingleAddress | null = null;\n let end: SedSingleAddress | null = null;\n const first = this.parseAddress(expr, pos, extended);\n if (first) {\n start = first.address;\n pos = first.pos;\n if (expr[pos] === ',') {\n const second = this.parseAddress(expr, pos + 1, extended);\n if (!second) {\n throw new Error(`unexpected ',' in '${expr}'`);\n }\n end = second.address;\n pos = second.pos;\n }\n }\n while (pos < expr.length && /[ \\t]/.test(expr[pos])) pos++;\n let negate = false;\n if (expr[pos] === '!') {\n negate = true;\n pos++;\n while (pos < expr.length && /[ \\t]/.test(expr[pos])) pos++;\n }\n\n if (pos >= expr.length) {\n throw new Error(`invalid expression: '${expr}'`);\n }\n\n const base = { start, end, negate, active: false };\n const cmd = expr[pos];\n\n if (cmd === 's') {\n return this.parseSubstitution(expr, pos, base, extended);\n }\n if (cmd === 'd' || cmd === 'p' || cmd === 'q') {\n return { expression: { ...base, command: cmd }, pos: pos + 1 };\n }\n throw new Error(`unknown command: '${cmd}'`);\n }\n\n private parseAddress(\n expr: string,\n pos: number,\n extended: boolean,\n ): { address: SedSingleAddress; pos: number } | null {\n if (pos >= expr.length) return null;\n\n // Line number\n if (expr[pos] >= '0' && expr[pos] <= '9') {\n let numStr = '';\n while (pos < expr.length && expr[pos] >= '0' && expr[pos] <= '9') {\n numStr += expr[pos];\n pos++;\n }\n return {\n address: { type: 'line', line: parseInt(numStr, 10) },\n pos,\n };\n }\n\n // Last line\n if (expr[pos] === '$') {\n return { address: { type: 'last' }, pos: pos + 1 };\n }\n\n // Regex address\n if (expr[pos] === '/') {\n const parsed = this.readDelimited(expr, pos + 1, '/');\n try {\n return {\n address: {\n type: 'regex',\n regex: new RegExp(this.toJsRegex(parsed.text, extended)),\n },\n pos: parsed.pos,\n };\n } catch {\n throw new Error(`invalid regex in address: '${parsed.text}'`);\n }\n }\n\n return null;\n }\n\n /**\n * Text up to the next unescaped delimiter, escapes kept (an escaped\n * delimiter becomes the plain character when it has no regex meaning).\n */\n private readDelimited(\n expr: string,\n pos: number,\n delimiter: string,\n ): { text: string; pos: number } {\n let text = '';\n while (pos < expr.length && expr[pos] !== delimiter) {\n if (expr[pos] === '\\\\' && pos + 1 < expr.length) {\n const next = expr[pos + 1];\n text += next === delimiter && /\\w|\\//.test(next) ? next : '\\\\' + next;\n pos += 2;\n } else {\n text += expr[pos];\n pos++;\n }\n }\n if (pos < expr.length) pos++; // skip the delimiter\n return { text, pos };\n }\n\n /**\n * Basic regular expressions use \\( \\) \\{ \\} \\+ \\? \\| for groups and\n * operators. When a pattern uses them (or never in -E mode), they are\n * turned into the JavaScript form and the bare characters made literal.\n */\n private toJsRegex(pattern: string, extended: boolean): string {\n if (extended || !/\\\\[(){}+?|]/.test(pattern)) return pattern;\n let out = '';\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === '\\\\' && i + 1 < pattern.length) {\n const next = pattern[++i];\n out += '(){}+?|'.includes(next) ? next : '\\\\' + next;\n } else if ('(){}+?|'.includes(ch)) {\n out += '\\\\' + ch;\n } else {\n out += ch;\n }\n }\n return out;\n }\n\n private parseSubstitution(\n expr: string,\n pos: number,\n base: Pick<SedExpression, 'start' | 'end' | 'negate' | 'active'>,\n extended: boolean,\n ): { expression: SedExpression; pos: number } {\n pos++; // skip 's'\n if (pos >= expr.length) {\n throw new Error(`invalid substitution expression: '${expr}'`);\n }\n\n const delimiter = expr[pos];\n const pattern = this.readDelimited(expr, pos + 1, delimiter);\n pos = pattern.pos;\n\n // Replacement: escapes kept for expandReplacement, except the delimiter\n let replacement = '';\n while (pos < expr.length && expr[pos] !== delimiter) {\n if (expr[pos] === '\\\\' && pos + 1 < expr.length) {\n replacement +=\n expr[pos + 1] === delimiter ? delimiter : '\\\\' + expr[pos + 1];\n pos += 2;\n } else {\n replacement += expr[pos];\n pos++;\n }\n }\n if (pos < expr.length) pos++; // skip delimiter\n\n // Flags, up to the end of the command\n let globalFlag = false;\n let caseInsensitive = false;\n let printFlag = false;\n let occurrence = '';\n while (pos < expr.length && !/[;\\n\\s}]/.test(expr[pos])) {\n const f = expr[pos];\n if (f === 'g') globalFlag = true;\n else if (f === 'i' || f === 'I') caseInsensitive = true;\n else if (f === 'p') printFlag = true;\n else if (f >= '0' && f <= '9') occurrence += f;\n else throw new Error(`unknown option to 's': '${f}'`);\n pos++;\n }\n const nth = occurrence ? parseInt(occurrence, 10) : undefined;\n if (nth === 0) {\n throw new Error(\"number option to 's' command may not be zero\");\n }\n\n let regexFlags = '';\n if (caseInsensitive) regexFlags += 'i';\n if (globalFlag || nth) regexFlags += 'g';\n\n let regex: RegExp;\n let groupCount: number;\n try {\n const source = this.toJsRegex(pattern.text, extended);\n regex = new RegExp(source, regexFlags);\n groupCount = (new RegExp(`${source}|`).exec('')?.length ?? 1) - 1;\n } catch {\n throw new Error(`invalid regex: '${pattern.text}'`);\n }\n\n return {\n expression: {\n ...base,\n command: 's',\n pattern: regex,\n replacement,\n groupCount,\n printFlag,\n occurrence: nth,\n globalFlag,\n },\n pos,\n };\n }\n\n private addressMatches(\n expr: SedExpression,\n lineNum: number,\n totalLines: number,\n lineText: string,\n ): boolean {\n let matches: boolean;\n if (!expr.start) {\n matches = true;\n } else if (!expr.end) {\n matches = this.singleMatches(expr.start, lineNum, totalLines, lineText);\n } else if (!expr.active) {\n matches = this.singleMatches(expr.start, lineNum, totalLines, lineText);\n if (matches) {\n // A line-number end at or before the start ends the range at once\n const end = expr.end;\n const endsHere =\n (end.type === 'line' && end.line <= lineNum) ||\n (end.type === 'last' && lineNum === totalLines);\n expr.active = !endsHere;\n }\n } else {\n matches = true;\n const end = expr.end;\n const endsHere =\n end.type === 'line'\n ? lineNum >= end.line\n : this.singleMatches(end, lineNum, totalLines, lineText);\n if (endsHere) expr.active = false;\n }\n return expr.negate ? !matches : matches;\n }\n\n private singleMatches(\n address: SedSingleAddress,\n lineNum: number,\n totalLines: number,\n lineText: string,\n ): boolean {\n switch (address.type) {\n case 'line':\n return lineNum === address.line;\n case 'last':\n return lineNum === totalLines;\n case 'regex':\n return address.regex.test(lineText);\n }\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\ninterface AwkRule {\n pattern: AwkPattern;\n action: string;\n}\n\ntype AwkPattern =\n | { type: 'all' }\n | { type: 'begin' }\n | { type: 'end' }\n | { type: 'regex'; regex: RegExp }\n | { type: 'comparison'; field: string; op: string; value: string };\n\nexport class CliAwkCommandProcessor implements ICliCommandProcessor {\n command = 'awk';\n description = 'Pattern scanning and text processing';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '🔧', module: 'file management' };\n\n parameters = [\n {\n name: 'F',\n aliases: [] as string[],\n description: 'Field separator (default: whitespace)',\n required: false,\n type: 'string' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.awk.help.process_text_records_fields', 'Process text as records and fields: each line is split into fields $1, $2, ... ($0 is the whole line), and each rule runs its { action } on matching lines. Supports BEGIN and END blocks, /regex/ and field comparison patterns, print, variables, NR and NF. Quote the program; a simple one also works unquoted (awk {print $1} file).'),\n );\n context.writer.writeln();\n writeUsage(context, [\n [\"awk '<program>' <file>\", t.t('cli.awk.help.run_program_over_file', 'Run a program over a file')],\n [\n \"awk -F <sep> '<program>' <file>\",\n t.t('cli.awk.help.split_fields_instead_spaces', 'Split fields on <sep> instead of spaces'),\n ],\n [\"<command> | awk '<program>'\", t.t('cli.awk.help.run_program_over_piped', 'Run a program over piped input')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n [\"awk '{print $1}' data.txt\", t.t('cli.awk.help.print_first_column', 'Print the first column')],\n [\"awk -F , '{print $2}' data.csv\", t.t('cli.awk.help.second_column_csv', 'Second column of a CSV')],\n [\"awk '$3 > 100 {print $1}' sales.txt\", t.t('cli.awk.help.filter_rows_field', 'Filter rows by a field')],\n [\"awk '{s += $2} END {print s}' data.txt\", t.t('cli.awk.help.sum_second_column', 'Sum the second column')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n const { program, filePaths, fieldSep } = this.parseArgs(command, fs);\n\n if (!program) {\n context.writer.writeError(\n \"awk: missing program. Usage: awk [-F sep] 'program' file\",\n );\n return;\n }\n\n let content = '';\n if (filePaths.length > 0) {\n // Several files are one stream of records\n for (const filePath of filePaths) {\n try {\n if (!fs.exists(filePath)) {\n context.writer.writeError(\n `awk: ${filePath}: No such file or directory`,\n );\n return;\n }\n const text = fs.readFile(filePath) ?? '';\n content += text === '' || text.endsWith('\\n') ? text : text + '\\n';\n } catch (e: any) {\n context.writer.writeError(`awk: ${e.message}`);\n return;\n }\n }\n } else if (command.data != null) {\n content = typeof command.data === 'string'\n ? command.data : JSON.stringify(command.data);\n }\n\n const rules = this.parseProgram(program);\n const lines = content\n ? content.replace(/\\n$/, '').split('\\n')\n : [];\n const fs_regex = fieldSep\n ? new RegExp(this.escapeRegex(fieldSep))\n : /\\s+/;\n\n const variables: Record<string, string | number> = {};\n const output: string[] = [];\n\n // Execute BEGIN rules\n for (const rule of rules) {\n if (rule.pattern.type === 'begin') {\n this.executeAction(\n rule.action,\n [],\n '',\n 0,\n 0,\n variables,\n output,\n );\n }\n }\n\n // Process each line\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const fields = line.split(fs_regex).filter((f) => f !== '');\n const nr = i + 1;\n const nf = fields.length;\n\n for (const rule of rules) {\n if (\n rule.pattern.type === 'begin' ||\n rule.pattern.type === 'end'\n ) {\n continue;\n }\n\n if (this.matchesPattern(rule.pattern, line, fields, nr)) {\n this.executeAction(\n rule.action,\n fields,\n line,\n nr,\n nf,\n variables,\n output,\n );\n }\n }\n }\n\n // Execute END rules\n for (const rule of rules) {\n if (rule.pattern.type === 'end') {\n this.executeAction(\n rule.action,\n [],\n '',\n lines.length,\n 0,\n variables,\n output,\n );\n }\n }\n\n for (const line of output) {\n context.writer.writeln(line);\n }\n }\n\n /**\n * The program is the first operand, usually quoted. Unquoted, it may span\n * several words (`awk {print $1} file`): it is then everything before the\n * trailing operands that are existing files, or the whole value with\n * piped input.\n */\n private parseArgs(\n command: CliProcessCommand,\n fs: IFileSystemService,\n ): { program: string | null; filePaths: string[]; fieldSep: string | null } {\n const raw = (command.value || '').trim();\n const fieldArg = command.args['F'];\n const fieldSep: string | null =\n fieldArg != null && fieldArg !== true ? String(fieldArg) : null;\n\n // Quoted program\n const quoted =\n raw.match(/^'((?:[^'\\\\]|\\\\.)*)'(?:\\s+|$)/) ??\n raw.match(/^\"((?:[^\"\\\\]|\\\\.)*)\"(?:\\s+|$)/);\n if (quoted) {\n return {\n program: quoted[1],\n filePaths: splitArgs(raw.slice(quoted[0].length)),\n fieldSep,\n };\n }\n\n const words = raw.split(/\\s+/).filter(Boolean);\n if (words.length === 0) {\n return { program: null, filePaths: [], fieldSep };\n }\n\n const isFile = (word: string): boolean => {\n try {\n const path = splitArgs(word).join(' ');\n return fs.exists(path) && !fs.isDirectory(path);\n } catch {\n return false;\n }\n };\n\n // Trailing words that are existing files\n let split = words.length;\n while (split > 1 && isFile(words[split - 1])) split--;\n\n if (split === words.length && command.data == null && words.length > 1) {\n // No file found and nothing piped: the last word is meant as the\n // file when the program before it is complete (balanced braces)\n const program = words.slice(0, -1).join(' ');\n const last = words[words.length - 1];\n if (this.bracesBalanced(program) && !/[{}]/.test(last)) {\n split = words.length - 1;\n }\n }\n\n return {\n program: words.slice(0, split).join(' '),\n filePaths: words.slice(split).map((w) => splitArgs(w).join(' ')),\n fieldSep,\n };\n }\n\n private bracesBalanced(text: string): boolean {\n let depth = 0;\n for (const ch of text) {\n if (ch === '{') depth++;\n else if (ch === '}' && --depth < 0) return false;\n }\n return depth === 0;\n }\n\n private parseProgram(program: string): AwkRule[] {\n const rules: AwkRule[] = [];\n let pos = 0;\n\n while (pos < program.length) {\n // Skip whitespace\n while (pos < program.length && /\\s/.test(program[pos])) pos++;\n if (pos >= program.length) break;\n\n let pattern: AwkPattern = { type: 'all' };\n let action = 'print $0';\n\n // Check for BEGIN\n if (program.slice(pos).startsWith('BEGIN')) {\n pattern = { type: 'begin' };\n pos += 5;\n while (pos < program.length && /\\s/.test(program[pos])) pos++;\n }\n // Check for END\n else if (program.slice(pos).startsWith('END')) {\n pattern = { type: 'end' };\n pos += 3;\n while (pos < program.length && /\\s/.test(program[pos])) pos++;\n }\n // Check for /regex/\n else if (program[pos] === '/') {\n const endSlash = program.indexOf('/', pos + 1);\n if (endSlash !== -1) {\n const regexStr = program.slice(pos + 1, endSlash);\n pattern = { type: 'regex', regex: new RegExp(regexStr) };\n pos = endSlash + 1;\n while (pos < program.length && /\\s/.test(program[pos]))\n pos++;\n }\n }\n // Check for field comparison ($N op value)\n else if (program[pos] === '$' && program[pos + 1] !== '0') {\n const compMatch = program\n .slice(pos)\n .match(\n /^\\$(\\w+)\\s*(>=|<=|!=|==|>|<)\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/,\n );\n if (compMatch) {\n pattern = {\n type: 'comparison',\n field: compMatch[1],\n op: compMatch[2],\n value:\n compMatch[3] ?? compMatch[4] ?? compMatch[5],\n };\n pos += compMatch[0].length;\n while (pos < program.length && /\\s/.test(program[pos]))\n pos++;\n }\n }\n\n // Extract action block\n if (pos < program.length && program[pos] === '{') {\n const actionEnd = this.findMatchingBrace(program, pos);\n action = program.slice(pos + 1, actionEnd).trim();\n pos = actionEnd + 1;\n } else if (pattern.type === 'all' && pos < program.length) {\n // No pattern matched and no brace — might be just an action block\n // or something unparseable, skip a char\n pos++;\n continue;\n }\n\n rules.push({ pattern, action });\n }\n\n return rules;\n }\n\n private findMatchingBrace(str: string, start: number): number {\n let depth = 0;\n let inSingleQuote = false;\n let inDoubleQuote = false;\n\n for (let i = start; i < str.length; i++) {\n const ch = str[i];\n if (inSingleQuote) {\n if (ch === \"'\") inSingleQuote = false;\n continue;\n }\n if (inDoubleQuote) {\n if (ch === '\"') inDoubleQuote = false;\n continue;\n }\n if (ch === \"'\") {\n inSingleQuote = true;\n } else if (ch === '\"') {\n inDoubleQuote = true;\n } else if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) return i;\n }\n }\n return str.length - 1;\n }\n\n private matchesPattern(\n pattern: AwkPattern,\n line: string,\n fields: string[],\n _nr: number,\n ): boolean {\n switch (pattern.type) {\n case 'all':\n return true;\n case 'regex':\n return pattern.regex.test(line);\n case 'comparison': {\n const fieldVal = this.getFieldValue(\n pattern.field,\n fields,\n line,\n );\n return this.compareValues(fieldVal, pattern.op, pattern.value);\n }\n default:\n return false;\n }\n }\n\n private getFieldValue(\n field: string,\n fields: string[],\n line: string,\n ): string {\n if (field === '0') return line;\n const idx = parseInt(field, 10);\n if (!isNaN(idx) && idx >= 1 && idx <= fields.length) {\n return fields[idx - 1];\n }\n return '';\n }\n\n private compareValues(a: string, op: string, b: string): boolean {\n const numA = Number(a);\n const numB = Number(b);\n const useNumeric = !isNaN(numA) && !isNaN(numB) && a !== '' && b !== '';\n\n switch (op) {\n case '==':\n return useNumeric ? numA === numB : a === b;\n case '!=':\n return useNumeric ? numA !== numB : a !== b;\n case '>':\n return useNumeric ? numA > numB : a > b;\n case '<':\n return useNumeric ? numA < numB : a < b;\n case '>=':\n return useNumeric ? numA >= numB : a >= b;\n case '<=':\n return useNumeric ? numA <= numB : a <= b;\n default:\n return false;\n }\n }\n\n private executeAction(\n action: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n output: string[],\n ): void {\n const statements = action.split(/\\s*;\\s*/);\n\n for (const stmt of statements) {\n const trimmed = stmt.trim();\n if (!trimmed) continue;\n\n if (trimmed.startsWith('print')) {\n this.executePrint(\n trimmed,\n fields,\n line,\n nr,\n nf,\n variables,\n output,\n );\n } else {\n // Assignment: variable op= expression or variable = expression\n this.executeAssignment(\n trimmed,\n fields,\n line,\n nr,\n nf,\n variables,\n );\n }\n }\n }\n\n private executePrint(\n stmt: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n output: string[],\n ): void {\n const argStr = stmt.slice(5).trim();\n\n if (!argStr) {\n output.push(line);\n return;\n }\n\n // Split by comma for OFS-separated output\n const commaParts = this.splitByComma(argStr);\n\n if (commaParts.length > 1) {\n // Comma-separated: each part printed with OFS (space)\n const values = commaParts.map((part) =>\n this.evaluateConcatExpr(\n part.trim(),\n fields,\n line,\n nr,\n nf,\n variables,\n ),\n );\n output.push(values.join(' '));\n } else {\n // Single expression (may contain concatenation)\n output.push(\n this.evaluateConcatExpr(\n argStr,\n fields,\n line,\n nr,\n nf,\n variables,\n ),\n );\n }\n }\n\n private splitByComma(expr: string): string[] {\n const parts: string[] = [];\n let current = '';\n let inQuote: string | null = null;\n\n for (let i = 0; i < expr.length; i++) {\n const ch = expr[i];\n if (inQuote) {\n current += ch;\n if (ch === inQuote) inQuote = null;\n } else if (ch === '\"' || ch === \"'\") {\n current += ch;\n inQuote = ch;\n } else if (ch === ',') {\n parts.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n if (current) parts.push(current);\n return parts;\n }\n\n private evaluateConcatExpr(\n expr: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n ): string {\n // Tokenize the expression into parts, then concatenate\n const tokens = this.tokenizeExpr(expr);\n return tokens\n .map((t) => this.resolveToken(t, fields, line, nr, nf, variables))\n .join('');\n }\n\n private tokenizeExpr(expr: string): string[] {\n const tokens: string[] = [];\n let pos = 0;\n\n while (pos < expr.length) {\n // Skip spaces (they act as concatenation separator)\n while (pos < expr.length && expr[pos] === ' ') pos++;\n if (pos >= expr.length) break;\n\n // Quoted string\n if (expr[pos] === '\"') {\n const end = expr.indexOf('\"', pos + 1);\n if (end !== -1) {\n tokens.push(expr.slice(pos, end + 1));\n pos = end + 1;\n } else {\n tokens.push(expr.slice(pos));\n break;\n }\n }\n // Field reference $N\n else if (expr[pos] === '$') {\n const match = expr.slice(pos).match(/^\\$(\\w+)/);\n if (match) {\n tokens.push(match[0]);\n pos += match[0].length;\n } else {\n tokens.push('$');\n pos++;\n }\n }\n // Identifier or number\n else {\n const match = expr.slice(pos).match(/^[\\w.]+/);\n if (match) {\n tokens.push(match[0]);\n pos += match[0].length;\n } else {\n // Other character (operator, etc.)\n tokens.push(expr[pos]);\n pos++;\n }\n }\n }\n\n return tokens;\n }\n\n private resolveToken(\n token: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n ): string {\n // Quoted string\n if (token.startsWith('\"') && token.endsWith('\"')) {\n return token.slice(1, -1);\n }\n\n // Field reference\n if (token.startsWith('$')) {\n const fieldRef = token.slice(1);\n if (fieldRef === '0') return line;\n if (fieldRef === 'NF') {\n const idx = nf;\n return idx >= 1 && idx <= fields.length\n ? fields[idx - 1]\n : '';\n }\n const idx = parseInt(fieldRef, 10);\n if (!isNaN(idx)) {\n return idx >= 1 && idx <= fields.length\n ? fields[idx - 1]\n : '';\n }\n return '';\n }\n\n // Built-in variables\n if (token === 'NR') return String(nr);\n if (token === 'NF') return String(nf);\n\n // User variable\n if (/^[a-zA-Z_]\\w*$/.test(token) && token in variables) {\n return String(variables[token]);\n }\n\n // Literal (number or unresolved)\n return token;\n }\n\n private executeAssignment(\n stmt: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n ): void {\n // Match: variable += expression\n const addAssign = stmt.match(/^([a-zA-Z_]\\w*)\\s*\\+=\\s*(.+)$/);\n if (addAssign) {\n const varName = addAssign[1];\n const exprVal = this.evaluateNumericExpr(\n addAssign[2].trim(),\n fields,\n line,\n nr,\n nf,\n variables,\n );\n if (!(varName in variables)) {\n variables[varName] = 0;\n }\n variables[varName] =\n (Number(variables[varName]) || 0) + exprVal;\n return;\n }\n\n // Match: variable -= expression\n const subAssign = stmt.match(/^([a-zA-Z_]\\w*)\\s*-=\\s*(.+)$/);\n if (subAssign) {\n const varName = subAssign[1];\n const exprVal = this.evaluateNumericExpr(\n subAssign[2].trim(),\n fields,\n line,\n nr,\n nf,\n variables,\n );\n if (!(varName in variables)) {\n variables[varName] = 0;\n }\n variables[varName] =\n (Number(variables[varName]) || 0) - exprVal;\n return;\n }\n\n // Match: variable = expression\n const assign = stmt.match(/^([a-zA-Z_]\\w*)\\s*=\\s*(.+)$/);\n if (assign) {\n const varName = assign[1];\n const exprStr = assign[2].trim();\n // Try numeric first\n const numVal = this.evaluateNumericExpr(\n exprStr,\n fields,\n line,\n nr,\n nf,\n variables,\n );\n variables[varName] = numVal;\n return;\n }\n\n // Variable increment: variable++\n const increment = stmt.match(/^([a-zA-Z_]\\w*)\\+\\+$/);\n if (increment) {\n const varName = increment[1];\n if (!(varName in variables)) variables[varName] = 0;\n variables[varName] = (Number(variables[varName]) || 0) + 1;\n return;\n }\n }\n\n private evaluateNumericExpr(\n expr: string,\n fields: string[],\n line: string,\n nr: number,\n nf: number,\n variables: Record<string, string | number>,\n ): number {\n const resolved = this.resolveToken(\n expr.trim(),\n fields,\n line,\n nr,\n nf,\n variables,\n );\n return Number(resolved) || 0;\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n CliForegroundColor,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliDiffCommandProcessor implements ICliCommandProcessor {\n command = 'diff';\n description = 'Compare files line by line';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '📝', module: 'file management' };\n\n parameters = [\n {\n name: 'unified',\n aliases: ['u'],\n description: 'Output in unified format',\n required: false,\n type: 'boolean' as const,\n },\n {\n name: 'ignore-case',\n aliases: ['i'],\n description: 'Ignore case differences',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.diff.help.compare_two_files_line', 'Compare two files line by line and show what changed: lines starting with < (or -) are only in the first file, lines starting with > (or +) only in the second.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['diff <file1> <file2>', t.t('cli.diff.help.show_differences', 'Show the differences')],\n ['diff -u <file1> <file2>', t.t('cli.diff.help.unified_format_context', 'Unified format with context')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['diff old.txt new.txt', t.t('cli.diff.help.what_changed_between_versions', 'What changed between versions')],\n ['diff -u config.bak config.txt', t.t('cli.diff.help.review_edits_git_style', 'Review edits, git style')],\n ['diff -i a.txt b.txt', t.t('cli.diff.help.ignore_upper_lower_case', 'Ignore upper/lower case')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const unified = command.args['unified'] || command.args['u'] || false;\n const ignoreCase =\n command.args['ignore-case'] || command.args['i'] || false;\n const paths = this.parsePaths(command);\n\n if (paths.length < 2) {\n context.writer.writeError('diff: missing operand');\n return;\n }\n\n const file1 = paths[0];\n const file2 = paths[1];\n\n if (!fs.exists(file1)) {\n context.writer.writeError(\n `diff: ${file1}: No such file or directory`,\n );\n return;\n }\n if (!fs.exists(file2)) {\n context.writer.writeError(\n `diff: ${file2}: No such file or directory`,\n );\n return;\n }\n\n const content1 = fs.readFile(file1) || '';\n const content2 = fs.readFile(file2) || '';\n\n const lines1 = content1.split('\\n');\n const lines2 = content2.split('\\n');\n\n const lcs = this.computeLCS(lines1, lines2, ignoreCase);\n\n if (unified) {\n this.outputUnified(file1, file2, lines1, lines2, lcs, ignoreCase, context);\n } else {\n this.outputNormal(lines1, lines2, lcs, ignoreCase, context);\n }\n }\n\n private linesEqual(\n a: string,\n b: string,\n ignoreCase: boolean,\n ): boolean {\n if (ignoreCase) {\n return a.toLowerCase() === b.toLowerCase();\n }\n return a === b;\n }\n\n private computeLCS(\n lines1: string[],\n lines2: string[],\n ignoreCase: boolean,\n ): string[] {\n const m = lines1.length;\n const n = lines2.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n new Array(n + 1).fill(0),\n );\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (this.linesEqual(lines1[i - 1], lines2[j - 1], ignoreCase)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n // Backtrack to find LCS\n const result: string[] = [];\n let i = m;\n let j = n;\n while (i > 0 && j > 0) {\n if (this.linesEqual(lines1[i - 1], lines2[j - 1], ignoreCase)) {\n result.unshift(lines1[i - 1]);\n i--;\n j--;\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n i--;\n } else {\n j--;\n }\n }\n\n return result;\n }\n\n private outputNormal(\n lines1: string[],\n lines2: string[],\n lcs: string[],\n ignoreCase: boolean,\n context: ICliExecutionContext,\n ): void {\n let i1 = 0;\n let i2 = 0;\n let il = 0;\n\n while (i1 < lines1.length || i2 < lines2.length) {\n if (\n il < lcs.length &&\n i1 < lines1.length &&\n this.linesEqual(lines1[i1], lcs[il], ignoreCase)\n ) {\n if (i2 < lines2.length && this.linesEqual(lines2[i2], lcs[il], ignoreCase)) {\n i1++;\n i2++;\n il++;\n } else {\n const line = context.writer.wrapInColor(\n `> ${lines2[i2]}`,\n CliForegroundColor.Green,\n );\n context.writer.writeln(line);\n i2++;\n }\n } else if (i1 < lines1.length && (il >= lcs.length || !this.linesEqual(lines1[i1], lcs[il], ignoreCase))) {\n const line = context.writer.wrapInColor(\n `< ${lines1[i1]}`,\n CliForegroundColor.Red,\n );\n context.writer.writeln(line);\n i1++;\n } else if (i2 < lines2.length) {\n const line = context.writer.wrapInColor(\n `> ${lines2[i2]}`,\n CliForegroundColor.Green,\n );\n context.writer.writeln(line);\n i2++;\n } else {\n break;\n }\n }\n }\n\n private outputUnified(\n file1: string,\n file2: string,\n lines1: string[],\n lines2: string[],\n lcs: string[],\n ignoreCase: boolean,\n context: ICliExecutionContext,\n ): void {\n // Build diff entries\n const entries: Array<{ type: 'same' | 'remove' | 'add'; line: string }> = [];\n\n let i1 = 0;\n let i2 = 0;\n let il = 0;\n\n while (i1 < lines1.length || i2 < lines2.length) {\n if (\n il < lcs.length &&\n i1 < lines1.length &&\n this.linesEqual(lines1[i1], lcs[il], ignoreCase)\n ) {\n if (i2 < lines2.length && this.linesEqual(lines2[i2], lcs[il], ignoreCase)) {\n entries.push({ type: 'same', line: lines1[i1] });\n i1++;\n i2++;\n il++;\n } else {\n entries.push({ type: 'add', line: lines2[i2] });\n i2++;\n }\n } else if (i1 < lines1.length && (il >= lcs.length || !this.linesEqual(lines1[i1], lcs[il], ignoreCase))) {\n entries.push({ type: 'remove', line: lines1[i1] });\n i1++;\n } else if (i2 < lines2.length) {\n entries.push({ type: 'add', line: lines2[i2] });\n i2++;\n } else {\n break;\n }\n }\n\n // Check if there are any changes\n const hasChanges = entries.some((e) => e.type !== 'same');\n if (!hasChanges) return;\n\n // Output header\n context.writer.writeln(`--- ${file1}`);\n context.writer.writeln(`+++ ${file2}`);\n\n // Output hunk header\n context.writer.writeln(\n `@@ -1,${lines1.length} +1,${lines2.length} @@`,\n );\n\n // Output entries\n for (const entry of entries) {\n if (entry.type === 'same') {\n context.writer.writeln(` ${entry.line}`);\n } else if (entry.type === 'remove') {\n const line = context.writer.wrapInColor(\n `-${entry.line}`,\n CliForegroundColor.Red,\n );\n context.writer.writeln(line);\n } else {\n const line = context.writer.wrapInColor(\n `+${entry.line}`,\n CliForegroundColor.Green,\n );\n context.writer.writeln(line);\n }\n }\n }\n\n private parsePaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText } from '../utils/lines';\n\nexport class CliTeeCommandProcessor implements ICliCommandProcessor {\n command = 'tee';\n description = 'Copy piped input to files and to the output';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '🔀', module: 'file management' };\n\n parameters = [\n {\n name: 'append',\n aliases: ['a'],\n description: 'Append to the given files, do not overwrite',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.tee.help.pass_piped_input_through', 'Pass piped input through unchanged and save a copy of it to every file named, overwriting them or appending with -a. Like Unix tee, it reads only piped input: to copy a file, pipe it in with cat.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['<command> | tee <file...>', t.t('cli.tee.help.show_piped_output_save', 'Show piped output and save it')],\n ['<command> | tee -a <file>', t.t('cli.tee.help.append_instead_overwriting', 'Append instead of overwriting')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['cat notes.txt | tee copy.txt', t.t('cli.tee.help.show_save_copy', 'Show and save a copy')],\n ['echo done | tee -a log.txt', t.t('cli.tee.help.add_line_log', 'Add a line to a log')],\n [\n 'cat source.txt | tee a.txt b.txt',\n t.t('cli.tee.help.copy_source_txt_txt', 'Copy source.txt into a.txt and b.txt'),\n ],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const append = command.args['append'] || command.args['a'] || false;\n\n if (command.data == null) {\n // Unix tee copies standard input; it never reads a file operand\n context.writer.writeError(\n \"tee: no input: tee copies piped input to files and the output; use 'cat file | tee out.txt'\",\n );\n context.process.exit(1, { silent: true });\n return;\n }\n\n // As Unix tee: the input goes unchanged to the output and to every\n // file named (overwritten, or appended with -a)\n const content = pipedText(command.data);\n context.writer.writeln(content);\n\n // Files get the text as a line, like a `>` redirect\n const fileText =\n content === '' || content.endsWith('\\n') ? content : content + '\\n';\n let changed = false;\n for (const outFile of this.getAllPaths(command)) {\n try {\n fs.writeFile(outFile, fileText, append);\n changed = true;\n } catch (e: any) {\n context.writer.writeError(`tee: ${e.message}`);\n }\n }\n if (changed) await fs.persist();\n }\n\n private getAllPaths(command: CliProcessCommand): string[] {\n const raw = command.value || '';\n return splitArgs(raw).filter(Boolean);\n }\n}\n","import { splitArgs } from '../utils/split-args';\nimport {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n writeExamples,\n writeUsage,\n writeWrapped,\n quoteShellWord,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { pipedText } from '../utils/lines';\n\nexport class CliXargsCommandProcessor implements ICliCommandProcessor {\n command = 'xargs';\n description = 'Build and execute commands from file input';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n valueRequired = true;\n metadata = { icon: '⚡', module: 'file management' };\n\n parameters = [\n {\n name: 'replace',\n aliases: ['I'],\n description: 'Replace string in command template (e.g., -I {})',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'max-args',\n aliases: ['n'],\n description: 'Maximum number of arguments per command',\n required: false,\n type: 'number' as const,\n },\n ];\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.xargs.help.run_command_arguments_taken', 'Run a command with arguments taken from input, separated by blanks or newlines. By default all of them are appended to one command; -n runs it in batches and -I runs it once per line, replacing a placeholder. xargs options go before the command; everything after it, flags included, belongs to the command. Input is piped text or, without a pipe, the last file named.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['<command> | xargs <cmd>', t.t('cli.xargs.help.append_input_lines', 'Append input lines to <cmd>')],\n ['<command> | xargs -I {} <cmd {}>', t.t('cli.xargs.help.run_once_per_line', 'Run <cmd> once per line')],\n ['xargs <cmd> <file>', t.t('cli.xargs.help.read_arguments_file', 'Read the arguments from a file')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['find . --name \"*.tmp\" | xargs rm', t.t('cli.xargs.help.delete_every_tmp_file', 'Delete every .tmp file')],\n [\n 'cat files.txt | xargs -I {} cp {} backup',\n t.t('cli.xargs.help.copy_each_listed_file', 'Copy each listed file'),\n ],\n ['cat dirs.txt | xargs -n 1 mkdir', t.t('cli.xargs.help.one_mkdir_per_line', 'One mkdir per line')],\n ['find . --name \"*.bak\" | xargs rm -r', t.t('cli.xargs.help.inner_command_keeps_flags', 'The inner command keeps its flags')],\n ]);\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n // The engine takes every flag on the line for xargs, including the\n // inner command's (`xargs rm -r`), so the line is read again here:\n // xargs' own options come first, the rest is the inner command.\n let parsed: XargsLine;\n try {\n parsed = command.rawCommand\n ? parseXargsLine(command.rawCommand)\n : {\n replace: stringArg(command.args['replace'] ?? command.args['I']),\n maxArgs:\n parseInt(\n String(command.args['max-args'] ?? command.args['n'] ?? ''),\n 10,\n ) || undefined,\n words: splitWords(command.value ?? ''),\n };\n } catch (e: any) {\n context.writer.writeError(`xargs: ${e.message}`);\n return;\n }\n const replaceStr = parsed.replace;\n const maxArgs = parsed.maxArgs ?? 0;\n\n let commandTemplate: string;\n let argContent: string;\n\n if (command.data != null) {\n // Piped mode: the whole rest is the command (echo by default)\n commandTemplate = parsed.words.map((w) => w.raw).join(' ') || 'echo';\n argContent = pipedText(command.data);\n } else {\n // File mode: the last word is the input file\n if (parsed.words.length === 0) {\n context.writer.writeError('xargs: missing command');\n return;\n }\n if (parsed.words.length < 2) {\n context.writer.writeError('xargs: missing input file');\n return;\n }\n const inputFile = parsed.words[parsed.words.length - 1].value;\n commandTemplate = parsed.words\n .slice(0, -1)\n .map((w) => w.raw)\n .join(' ');\n if (!fs.exists(inputFile)) {\n context.writer.writeError(\n `xargs: ${inputFile}: No such file or directory`,\n );\n return;\n }\n argContent = fs.readFile(inputFile) || '';\n }\n\n const commands: string[] = [];\n\n if (replaceStr) {\n // Replace mode: one command per input line\n const lines = argContent\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n const placeholder = new RegExp(this.escapeRegex(replaceStr), 'g');\n for (const line of lines) {\n commands.push(\n commandTemplate.replace(placeholder, () => quoteArg(line)),\n );\n }\n } else {\n // Arguments are the blank-separated words of the input\n const args = splitArgs(argContent).map(quoteArg);\n if (args.length === 0) return;\n const size = maxArgs > 0 ? maxArgs : args.length;\n for (let i = 0; i < args.length; i += size) {\n commands.push(\n `${commandTemplate} ${args.slice(i, i + size).join(' ')}`,\n );\n }\n }\n\n // Try to execute via executor, or just output the commands\n const executor = context.executor;\n for (const cmd of commands) {\n if (executor && typeof executor.executeCommand === 'function') {\n try {\n await executor.executeCommand(cmd, context);\n } catch {\n context.writer.writeln(cmd);\n }\n } else {\n context.writer.writeln(cmd);\n }\n }\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n\ninterface XargsWord {\n /** As written, quotes included */\n raw: string;\n /** Without quotes */\n value: string;\n}\n\ninterface XargsLine {\n replace?: string;\n maxArgs?: number;\n /** The inner command (and, without piped input, the input file) */\n words: XargsWord[];\n}\n\n/** `xargs [-I str] [-n num] [--] command...` */\nfunction parseXargsLine(raw: string): XargsLine {\n const words = splitWords(raw).slice(1); // drop \"xargs\"\n const result: XargsLine = { words: [] };\n let i = 0;\n const valueOf = (option: string, inline: string): string => {\n if (inline !== '') return inline;\n if (i + 1 >= words.length) {\n throw new Error(`option requires an argument -- '${option}'`);\n }\n return words[++i].value;\n };\n\n for (; i < words.length; i++) {\n const word = words[i].raw;\n if (word === '--') {\n i++;\n break;\n }\n if (!word.startsWith('-') || word === '-') break;\n\n let match: RegExpMatchArray | null;\n if ((match = word.match(/^(?:-I|--replace(?:=|$))(.*)$/))) {\n result.replace = valueOf('I', unquote(match[1]));\n } else if (word === '-i') {\n result.replace = '{}';\n } else if ((match = word.match(/^(?:-n|--max-args(?:=|$))(.*)$/))) {\n const value = valueOf('n', unquote(match[1]));\n const count = parseInt(value, 10);\n if (isNaN(count) || count < 1) {\n throw new Error(`invalid number of arguments: '${value}'`);\n }\n result.maxArgs = count;\n } else {\n throw new Error(`invalid option -- '${word.replace(/^-+/, '')}'`);\n }\n }\n\n result.words = words.slice(i);\n return result;\n}\n\n/** Splits on blanks outside quotes, keeping each word as written. */\nfunction splitWords(raw: string): XargsWord[] {\n const words: XargsWord[] = [];\n const regex = /(?:\"(?:[^\"\\\\]|\\\\.)*\"|'[^']*'|[^\\s\"']|[\"'])+/g;\n for (const match of raw.matchAll(regex)) {\n words.push({ raw: match[0], value: splitArgs(match[0]).join(' ') });\n }\n return words;\n}\n\nfunction unquote(value: string): string {\n return splitArgs(value).join(' ');\n}\n\nfunction stringArg(value: unknown): string | undefined {\n return value == null || value === true || value === '' ? undefined : String(value);\n}\n\n/**\n * An input argument as one literal word of a command line, quoted when it\n * has any shell character, so `*`, `$VAR`, `$(...)`, braces and operators in\n * the input are data, never expanded or run.\n */\nfunction quoteArg(arg: string): string {\n return quoteShellWord(arg);\n}\n","import {\n CliProcessCommand,\n CliForegroundColor,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\nimport { splitArgs } from '../utils/split-args';\n\n/**\n * Execute a script file containing CLI commands.\n *\n * Scripts run through the engine's shell runner (`@qodalis/cli`\n * `runScript`): commands, `;`, comments, `set -e`/`set +e`, `VAR=value`,\n * `if`/`elif`/`else`/`fi`, `for`/`while`/`until` loops, `break`/`continue`,\n * `exit`, and `test`/`[ ]` conditions.\n */\nexport class CliShCommandProcessor implements ICliCommandProcessor {\n command = 'sh';\n aliases = ['source', '.'];\n description = 'Execute a script file';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📜', module: 'file management' };\n\n parameters = [\n {\n name: 'e',\n aliases: ['stop-on-error'],\n description: 'Stop execution on first error (default)',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n\n let words = splitArgs(command.value || '');\n\n // When invoked via alias (source, .), getRightOfWord fails to extract\n // the value because it looks for 'sh' in the command string. Fall back\n // to parsing the raw command (flags are not file names).\n if (words.length === 0 && command.rawCommand) {\n words = splitArgs(command.rawCommand)\n .slice(1)\n .filter((w) => !w.startsWith('-'));\n }\n const filePath = words[0] ?? '';\n\n if (!filePath) {\n context.writer.writeError('sh: missing file operand');\n context.process.exit(1, { silent: true });\n return;\n }\n\n const resolved = fs.resolvePath(filePath);\n const node = fs.getNode(resolved);\n\n if (!node) {\n context.writer.writeError(\n `sh: ${filePath}: No such file or directory`,\n );\n context.process.exit(1, { silent: true });\n return;\n }\n\n if (node.type !== 'file') {\n context.writer.writeError(\n `sh: ${filePath}: Is a directory`,\n );\n context.process.exit(1, { silent: true });\n return;\n }\n\n const content = fs.readFile(resolved);\n if (content === null || content === undefined) {\n context.writer.writeError(\n `sh: ${filePath}: Cannot read file`,\n );\n context.process.exit(1, { silent: true });\n return;\n }\n\n await executeScript(content, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer, translator: t } = context;\n writer.writeln(t.t('cli.sh.description', this.description));\n writer.writeln();\n writer.writeln(t.t('cli.common.usage', 'Usage:'));\n writer.writeln(\n ` ${writer.wrapInColor('sh <script.sh>', CliForegroundColor.Cyan)}`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('source <script.sh>', CliForegroundColor.Cyan)}`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('. <script.sh>', CliForegroundColor.Cyan)}`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('./script.sh', CliForegroundColor.Cyan)} ${t.t('cli.sh.help.requires_execute', '(requires execute permission)')}`,\n );\n writer.writeln();\n writer.writeln(t.t('cli.sh.help.script_syntax', 'Script syntax:'));\n writer.writeln(` # ${t.t('cli.sh.help.comments', 'Lines starting with # are comments')}`);\n writer.writeln(` cmd1; cmd2 # ${t.t('cli.sh.help.several_commands', 'Several commands on one line')}`);\n writer.writeln(` VAR=value # ${t.t('cli.sh.help.assignment', 'Variable assignment')}`);\n writer.writeln(` echo $VAR # ${t.t('cli.sh.help.substitution', 'Variable substitution')}`);\n writer.writeln(` set -e # ${t.t('cli.sh.help.stop_on_error', 'Stop on error (default)')}`);\n writer.writeln(` set +e # ${t.t('cli.sh.help.continue_on_errors', 'Continue on errors')}`);\n writer.writeln(` exit [n] # ${t.t('cli.sh.help.exit', 'Stop the script with status n')}`);\n writer.writeln();\n writer.writeln(t.t('cli.sh.help.control_flow', 'Control flow:'));\n writer.writeln(' if cmd; then ...; elif cmd; then ...; else ...; fi');\n writer.writeln(' for NAME in a b *.txt; do ...; done');\n writer.writeln(` while cmd; do ...; done ${t.t('cli.sh.help.until', '(until cmd: the opposite)')}`);\n writer.writeln(` break / continue [n] # ${t.t('cli.sh.help.break_continue', 'Leave / skip in a loop')}`);\n writer.writeln(` ! cmd # ${t.t('cli.sh.help.negate', 'Negate the exit status')}`);\n writer.writeln(\n ` ${t.t('cli.sh.help.conditions', 'Conditions are commands:')} ${writer.wrapInColor('[ -f file ]', CliForegroundColor.Cyan)}, ${writer.wrapInColor('test \"$A\" = b', CliForegroundColor.Cyan)}, ${writer.wrapInColor('true', CliForegroundColor.Cyan)}, ${writer.wrapInColor('grep x file', CliForegroundColor.Cyan)}`,\n );\n writer.writeln(` ${t.t('cli.sh.help.conditions_status', '(status 0 = true; see help test). Loops stop after 10000 iterations')}`);\n writer.writeln(` ${t.t('cli.sh.help.conditions_loops', 'of while/until; Ctrl+C stops the script.')}`);\n writer.writeln();\n writer.writeln(t.t('cli.sh.help.example_script', 'Example script:'));\n writer.writeln(\n writer.wrapInColor(\n ' #!/bin/sh\\n' +\n ' # Setup script\\n' +\n ' NAME=world\\n' +\n ' echo Hello $NAME\\n' +\n ' mkdir -p /tmp/test\\n' +\n ' for f in a b c; do\\n' +\n ' echo $f > /tmp/test/$f.txt\\n' +\n ' done\\n' +\n ' if [ -f /tmp/test/a.txt ]; then\\n' +\n ' echo done > /tmp/test/status.txt\\n' +\n ' fi',\n CliForegroundColor.Green,\n ),\n );\n }\n}\n\n/** The script runner `@qodalis/cli` provides as a service. */\ninterface CliScriptRunner {\n run(\n content: string,\n context: ICliExecutionContext,\n options?: { name?: string },\n ): Promise<number>;\n}\n\nconst SCRIPT_RUNNER_TOKEN = 'cli-script-runner';\n\n/**\n * Execute script content with the engine's shell runner (control flow,\n * variables, `set -e`), the same one used for `./script.sh`.\n */\nexport async function executeScript(\n content: string,\n context: ICliExecutionContext,\n): Promise<void> {\n const runner = context.services.get<CliScriptRunner>(SCRIPT_RUNNER_TOKEN);\n if (!runner) {\n context.writer.writeError('sh: script runner not available (update @qodalis/cli)');\n context.process.exit(1, { silent: true });\n return;\n }\n await runner.run(content, context, { name: 'sh' });\n}\n","import { CliAccessAction, CliAccessDeniedError, ICliOwnership } from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { CliFileAccessPolicy, IFileSystemService } from '../interfaces/i-file-system-service';\n\nconst DB_NAME = 'qodalis-cli-filesystem';\nconst STORE_NAME = 'filesystem';\nconst ROOT_KEY = 'root';\nconst CWD_KEY = 'cwd';\nconst HOME_KEY = 'home';\nconst DEFAULT_HOME = '/';\n\n/** Owner of system directories and of legacy nodes created without an owner */\nexport const SYSTEM_OWNERSHIP: ICliOwnership = { uid: 'root', gid: 'admin' };\n/** Owner of files created while nobody is signed in */\nexport const ANONYMOUS_OWNERSHIP: ICliOwnership = { uid: 'nobody', gid: 'nogroup' };\n\nfunction createSeedFileSystem(): IFileNode {\n const now = Date.now();\n return {\n name: '',\n type: 'directory',\n children: [\n {\n name: 'home',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n },\n {\n name: 'tmp',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxrwxrwx',\n },\n {\n name: 'etc',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n },\n ],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n };\n}\n\nexport class IndexedDbFileSystemService implements IFileSystemService {\n private root: IFileNode = createSeedFileSystem();\n private cwd: string = DEFAULT_HOME;\n private homePath: string = DEFAULT_HOME;\n private currentUid: string | null = null;\n private currentGroups: string[] = [];\n private accessPolicy?: CliFileAccessPolicy;\n private systemDepth = 0;\n\n // --- Access control ---\n\n setAccessPolicy(policy?: CliFileAccessPolicy): void {\n this.accessPolicy = policy;\n }\n\n runAsSystem<T>(fn: () => T): T {\n this.systemDepth++;\n try {\n return fn();\n } finally {\n this.systemDepth--;\n }\n }\n\n reassignOwner(fromUid: string, toUid: string): number {\n const from = fromUid.toLowerCase();\n if (!from || !toUid) return 0;\n let changed = 0;\n const visit = (node: IFileNode) => {\n if (node.ownership && node.ownership.uid.toLowerCase() === from) {\n node.ownership = { ...node.ownership, uid: toUid };\n changed++;\n }\n node.children?.forEach(visit);\n };\n visit(this.root);\n return changed;\n }\n\n canTraverse(path: string): boolean {\n try {\n this.assertTraverse(this.resolvePath(path), 'stat', path);\n return true;\n } catch {\n return false;\n }\n }\n\n private get enforcing(): boolean {\n return !!this.accessPolicy && this.systemDepth === 0;\n }\n\n private deny(op: string, path: string, reason = 'Permission denied'): never {\n throw new CliAccessDeniedError(`${op}: ${path}: ${reason}`);\n }\n\n /** `x` on every existing directory on the way to `resolved` (excluding the target). */\n private assertTraverse(resolved: string, op: string, display: string): void {\n if (!this.enforcing) return;\n const parts = resolved.split('/').filter(Boolean);\n let current: IFileNode | undefined = this.root;\n for (let i = 0; i < parts.length; i++) {\n if (!current || current.type !== 'directory') return;\n if (!this.accessPolicy!.canAccess(current, 'execute')) this.deny(op, display);\n current = current.children?.find((c) => c.name === parts[i]);\n }\n }\n\n private assertAccess(node: IFileNode, action: CliAccessAction, op: string, display: string): void {\n if (this.enforcing && !this.accessPolicy!.canAccess(node, action)) this.deny(op, display);\n }\n\n /** Recursive delete: every directory inside must allow removing its entries (`w` + `x`, readable). */\n private assertRemovableTree(dir: IFileNode, dirPath: string, display: string): void {\n if (!this.enforcing) return;\n this.assertAccess(dir, 'read', 'rm', display);\n this.assertAccess(dir, 'execute', 'rm', display);\n if ((dir.children?.length ?? 0) > 0) this.assertAccess(dir, 'write', 'rm', display);\n for (const child of dir.children ?? []) {\n if (child.type === 'directory') this.assertRemovableTree(child, `${dirPath}/${child.name}`, display);\n }\n }\n\n /** Copying reads everything it copies: `r` on every file, `r` + `x` on every directory. */\n private assertReadableTree(node: IFileNode, display: string): void {\n if (!this.enforcing) return;\n this.assertAccess(node, 'read', 'cp', display);\n if (node.type !== 'directory') return;\n this.assertAccess(node, 'execute', 'cp', display);\n for (const child of node.children ?? []) {\n this.assertReadableTree(child, `${display.replace(/\\/+$/, '')}/${child.name}`);\n }\n }\n\n /** Creating/removing entries needs `w` and `x` on the containing directory. */\n private assertModifyDir(dir: IFileNode, dirPath: string, op: string, display: string): void {\n if (!this.enforcing) return;\n this.assertTraverse(dirPath, op, display);\n this.assertAccess(dir, 'execute', op, display);\n this.assertAccess(dir, 'write', op, display);\n }\n\n // --- User context ---\n\n setCurrentUser(uid: string, groups: string[]): void {\n this.currentUid = uid;\n this.currentGroups = groups;\n }\n\n private getDefaultOwnership(): ICliOwnership | undefined {\n if (!this.currentUid) {\n // With access control active, nothing is created ownerless\n return this.accessPolicy ? { ...ANONYMOUS_OWNERSHIP } : undefined;\n }\n return {\n uid: this.currentUid,\n gid: this.currentGroups[0] || 'users',\n };\n }\n\n // --- Navigation ---\n\n getCurrentDirectory(): string {\n return this.cwd;\n }\n\n setCurrentDirectory(path: string): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`cd: ${path}: No such file or directory`);\n }\n if (node.type !== 'directory') {\n throw new Error(`cd: ${path}: Not a directory`);\n }\n this.assertTraverse(resolved, 'cd', path);\n this.assertAccess(node, 'execute', 'cd', path);\n this.cwd = resolved;\n }\n\n getHomePath(): string {\n return this.homePath;\n }\n\n setHomePath(path: string): void {\n this.homePath = path;\n }\n\n resolvePath(path: string): string {\n if (path === '~' || path === '') {\n return this.homePath;\n }\n if (path.startsWith('~/')) {\n path = this.homePath + path.substring(1);\n }\n\n const parts = path.startsWith('/')\n ? path.split('/')\n : (this.cwd + '/' + path).split('/');\n\n const resolved: string[] = [];\n for (const part of parts) {\n if (part === '' || part === '.') {\n continue;\n } else if (part === '..') {\n resolved.pop();\n } else {\n resolved.push(part);\n }\n }\n\n return '/' + resolved.join('/');\n }\n\n // --- Read operations ---\n\n getNode(path: string): IFileNode | null {\n const resolved = path === '/' ? '/' : this.resolvePath(path);\n if (resolved === '/') {\n return this.root;\n }\n\n const parts = resolved.split('/').filter(Boolean);\n let current = this.root;\n\n for (const part of parts) {\n if (current.type !== 'directory' || !current.children) {\n return null;\n }\n const child = current.children.find((c) => c.name === part);\n if (!child) {\n return null;\n }\n current = child;\n }\n\n return current;\n }\n\n listDirectory(path: string): IFileNode[] {\n const node = this.getNode(path);\n if (!node) {\n throw new Error(`ls: ${path}: No such file or directory`);\n }\n if (node.type !== 'directory') {\n throw new Error(`ls: ${path}: Not a directory`);\n }\n this.assertTraverse(this.resolvePath(path), 'ls', path);\n this.assertAccess(node, 'read', 'ls', path);\n return node.children || [];\n }\n\n readFile(path: string): string | null {\n const node = this.getNode(path);\n if (!node) {\n throw new Error(`cat: ${path}: No such file or directory`);\n }\n if (node.type === 'directory') {\n throw new Error(`cat: ${path}: Is a directory`);\n }\n this.assertTraverse(this.resolvePath(path), 'cat', path);\n this.assertAccess(node, 'read', 'cat', path);\n return node.content ?? '';\n }\n\n exists(path: string): boolean {\n return this.getNode(path) !== null;\n }\n\n isDirectory(path: string): boolean {\n const node = this.getNode(path);\n return node !== null && node.type === 'directory';\n }\n\n // --- Write operations ---\n\n createDirectory(path: string, recursive = false): void {\n const resolved = this.resolvePath(path);\n const parts = resolved.split('/').filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(`mkdir: cannot create directory '/': File exists`);\n }\n\n if (recursive) {\n let current = this.root;\n for (const part of parts) {\n if (!current.children) {\n current.children = [];\n }\n let child = current.children.find((c) => c.name === part);\n if (!child) {\n if (this.enforcing) {\n this.assertAccess(current, 'execute', 'mkdir', path);\n this.assertAccess(current, 'write', 'mkdir', path);\n }\n const now = Date.now();\n child = {\n name: part,\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n ownership: this.getDefaultOwnership(),\n };\n current.children.push(child);\n current.modifiedAt = now;\n } else if (child.type !== 'directory') {\n throw new Error(`mkdir: ${part}: Not a directory`);\n } else {\n this.assertAccess(child, 'execute', 'mkdir', path);\n }\n current = child;\n }\n } else {\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const dirName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent) {\n throw new Error(\n `mkdir: ${parentPath}: No such file or directory`,\n );\n }\n if (parent.type !== 'directory') {\n throw new Error(`mkdir: ${parentPath}: Not a directory`);\n }\n if (parent.children?.find((c) => c.name === dirName)) {\n throw new Error(`mkdir: ${path}: File exists`);\n }\n this.assertModifyDir(parent, parentPath, 'mkdir', path);\n\n const now = Date.now();\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push({\n name: dirName,\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n ownership: this.getDefaultOwnership(),\n });\n parent.modifiedAt = now;\n }\n }\n\n createFile(path: string, content = ''): void {\n const resolved = this.resolvePath(path);\n const parts = resolved.split('/').filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(`touch: cannot create file at root`);\n }\n\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const fileName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent) {\n throw new Error(`touch: ${parentPath}: No such file or directory`);\n }\n if (parent.type !== 'directory') {\n throw new Error(`touch: ${parentPath}: Not a directory`);\n }\n\n const existing = parent.children?.find((c) => c.name === fileName);\n const now = Date.now();\n\n if (existing) {\n this.assertTraverse(resolved, 'touch', path);\n this.assertAccess(existing, 'write', 'touch', path);\n } else {\n this.assertModifyDir(parent, parentPath, 'touch', path);\n }\n\n if (existing) {\n existing.modifiedAt = now;\n } else {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push({\n name: fileName,\n type: 'file',\n content,\n createdAt: now,\n modifiedAt: now,\n size: new Blob([content]).size,\n permissions: 'rw-r--r--',\n ownership: this.getDefaultOwnership(),\n });\n parent.modifiedAt = now;\n }\n }\n\n writeFile(path: string, content: string, append = false): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n\n if (node) {\n if (node.type === 'directory') {\n throw new Error(`write: ${path}: Is a directory`);\n }\n this.assertTraverse(resolved, 'write', path);\n this.assertAccess(node, 'write', 'write', path);\n const now = Date.now();\n node.content = append ? (node.content ?? '') + content : content;\n node.size = new Blob([node.content]).size;\n node.modifiedAt = now;\n } else {\n this.createFile(resolved, content);\n }\n }\n\n remove(path: string, recursive = false): void {\n const resolved = this.resolvePath(path);\n if (resolved === '/') {\n throw new Error(`rm: cannot remove root directory`);\n }\n\n const parts = resolved.split('/').filter(Boolean);\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const name = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent || !parent.children) {\n throw new Error(`rm: ${path}: No such file or directory`);\n }\n\n const index = parent.children.findIndex((c) => c.name === name);\n if (index === -1) {\n throw new Error(`rm: ${path}: No such file or directory`);\n }\n\n const target = parent.children[index];\n if (target.type === 'directory' && !recursive) {\n throw new Error(`rm: ${path}: Is a directory`);\n }\n this.assertModifyDir(parent, parentPath, 'rm', path);\n if (target.type === 'directory') this.assertRemovableTree(target, resolved, path);\n\n parent.children.splice(index, 1);\n parent.modifiedAt = Date.now();\n }\n\n copy(src: string, dest: string, recursive = false): void {\n const srcResolved = this.resolvePath(src);\n const srcNode = this.getNode(srcResolved);\n\n if (!srcNode) {\n throw new Error(`cp: ${src}: No such file or directory`);\n }\n if (srcNode.type === 'directory' && !recursive) {\n throw new Error(\n `cp: -r not specified; omitting directory '${src}'`,\n );\n }\n this.assertTraverse(srcResolved, 'cp', src);\n this.assertReadableTree(srcNode, src);\n\n const destResolved = this.resolvePath(dest);\n const destNode = this.getNode(destResolved);\n\n if (destNode && destNode.type === 'directory') {\n this.assertModifyDir(destNode, destResolved, 'cp', dest);\n const clone = this.ownedByCurrentUser(this.cloneNode(srcNode));\n if (!destNode.children) {\n destNode.children = [];\n }\n const existingIdx = destNode.children.findIndex(\n (c) => c.name === clone.name,\n );\n if (existingIdx !== -1) {\n destNode.children.splice(existingIdx, 1);\n }\n destNode.children.push(clone);\n destNode.modifiedAt = Date.now();\n } else {\n const parts = destResolved.split('/').filter(Boolean);\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const newName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent || parent.type !== 'directory') {\n throw new Error(`cp: ${parentPath}: No such file or directory`);\n }\n this.assertModifyDir(parent, parentPath, 'cp', dest);\n\n const clone = this.ownedByCurrentUser(this.cloneNode(srcNode));\n clone.name = newName;\n if (!parent.children) {\n parent.children = [];\n }\n const existingIdx = parent.children.findIndex(\n (c) => c.name === newName,\n );\n if (existingIdx !== -1) {\n parent.children.splice(existingIdx, 1);\n }\n parent.children.push(clone);\n parent.modifiedAt = Date.now();\n }\n }\n\n move(src: string, dest: string): void {\n const srcResolved = this.resolvePath(src);\n if (srcResolved === '/') {\n throw new Error(`mv: cannot move root directory`);\n }\n\n const srcNode = this.getNode(srcResolved);\n if (!srcNode) {\n throw new Error(`mv: ${src}: No such file or directory`);\n }\n\n const destResolved = this.resolvePath(dest);\n const destNode = this.getNode(destResolved);\n\n // A directory cannot go inside itself (it would detach from the tree)\n if (\n srcNode.type === 'directory' &&\n (destResolved === srcResolved ||\n destResolved.startsWith(srcResolved + '/'))\n ) {\n throw new Error(\n `mv: cannot move '${src}' to a subdirectory of itself, '${dest}'`,\n );\n }\n\n const srcParts = srcResolved.split('/').filter(Boolean);\n const srcParentPath = '/' + srcParts.slice(0, -1).join('/');\n const srcParent = this.getNode(srcParentPath);\n\n if (!srcParent || !srcParent.children) {\n throw new Error(`mv: ${src}: No such file or directory`);\n }\n this.assertModifyDir(srcParent, srcParentPath, 'mv', src);\n\n // Into the directory it is already in, or onto itself: nothing to do\n if (\n destResolved === srcResolved ||\n (destNode && destNode.type === 'directory' && destNode === srcParent)\n ) {\n throw new Error(`mv: '${src}' and '${dest}' are the same file`);\n }\n\n if (destNode && destNode.type === 'directory') {\n this.assertModifyDir(destNode, destResolved, 'mv', dest);\n if (!destNode.children) {\n destNode.children = [];\n }\n const existingIdx = destNode.children.findIndex(\n (c) => c.name === srcNode.name,\n );\n if (existingIdx !== -1) {\n destNode.children.splice(existingIdx, 1);\n }\n // By identity: the index may have moved\n srcParent.children.splice(srcParent.children.indexOf(srcNode), 1);\n destNode.children.push(srcNode);\n destNode.modifiedAt = Date.now();\n } else {\n const destParts = destResolved.split('/').filter(Boolean);\n const destParentPath = '/' + destParts.slice(0, -1).join('/');\n const newName = destParts[destParts.length - 1];\n const destParent = this.getNode(destParentPath);\n\n if (!destParent || destParent.type !== 'directory') {\n throw new Error(\n `mv: ${destParentPath}: No such file or directory`,\n );\n }\n this.assertModifyDir(destParent, destParentPath, 'mv', dest);\n\n // By identity: the index may have moved\n srcParent.children.splice(srcParent.children.indexOf(srcNode), 1);\n srcNode.name = newName;\n if (!destParent.children) {\n destParent.children = [];\n }\n const existingIdx = destParent.children.findIndex(\n (c) => c.name === newName,\n );\n if (existingIdx !== -1) {\n destParent.children.splice(existingIdx, 1);\n }\n destParent.children.push(srcNode);\n destParent.modifiedAt = Date.now();\n }\n\n srcParent.modifiedAt = Date.now();\n }\n\n // --- Permissions ---\n\n chmod(path: string, permissions: string): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`chmod: ${path}: No such file or directory`);\n }\n if (this.enforcing && !this.accessPolicy!.canChangeOwnership(node)) {\n this.deny('chmod', path, 'Operation not permitted');\n }\n node.permissions = permissions;\n }\n\n chown(path: string, ownership: ICliOwnership): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`chown: ${path}: No such file or directory`);\n }\n if (this.enforcing && !this.accessPolicy!.canChangeOwnership(node, ownership)) {\n this.deny('chown', path, 'Operation not permitted');\n }\n node.ownership = ownership;\n }\n\n // --- Persistence ---\n\n async initialize(): Promise<void> {\n const db = await this.openDb();\n try {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n\n const rootData = await this.idbGet<IFileNode>(store, ROOT_KEY);\n const cwdData = await this.idbGet<string>(store, CWD_KEY);\n const homeData = await this.idbGet<string>(store, HOME_KEY);\n\n if (rootData) {\n this.root = rootData;\n }\n if (cwdData) {\n this.cwd = cwdData;\n }\n if (homeData) {\n this.homePath = homeData;\n }\n } finally {\n db.close();\n }\n }\n\n async persist(): Promise<void> {\n const db = await this.openDb();\n try {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n\n store.put(this.root, ROOT_KEY);\n // The saved directory is the signed-out one (and the only one without\n // a users module): a signed-in user always starts in their home, and\n // must not leave their directory behind for whoever comes next\n if (!this.currentUid) {\n store.put(this.cwd, CWD_KEY);\n store.put(this.homePath, HOME_KEY);\n }\n\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } finally {\n db.close();\n }\n }\n\n // --- Private helpers ---\n\n /** A copy belongs to whoever made it (like `cp` without `-p`) */\n private ownedByCurrentUser(node: IFileNode): IFileNode {\n const owner = this.getDefaultOwnership();\n if (owner) {\n const apply = (n: IFileNode) => {\n n.ownership = { ...owner };\n n.children?.forEach(apply);\n };\n apply(node);\n }\n return node;\n }\n\n private cloneNode(node: IFileNode): IFileNode {\n const now = Date.now();\n const clone: IFileNode = {\n name: node.name,\n type: node.type,\n createdAt: now,\n modifiedAt: now,\n size: node.size,\n permissions: node.permissions,\n ownership: node.ownership ? { ...node.ownership } : undefined,\n };\n\n if (node.type === 'file') {\n clone.content = node.content;\n } else {\n clone.children = (node.children || []).map((c) =>\n this.cloneNode(c),\n );\n }\n\n return clone;\n }\n\n private openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, 1);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n private idbGet<T>(store: IDBObjectStore, key: string): Promise<T | null> {\n return new Promise((resolve, reject) => {\n const request = store.get(key);\n request.onsuccess = () => resolve(request.result ?? null);\n request.onerror = () => reject(request.error);\n });\n }\n}\n","import { ICliOwnership, CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IFileNode } from '../interfaces/i-file-node';\nimport { IFileSystemService } from '../interfaces/i-file-system-service';\n\nconst DEFAULT_HOME = '/home/user';\n\n/**\n * Configuration options for the ServerFileSystemService.\n */\nexport interface ServerFileSystemOptions {\n /** Base URL of the CLI server, e.g. 'http://localhost:8047' */\n baseUrl: string;\n /** Custom headers sent with every request (e.g. auth tokens) */\n headers?: CliHeadersProvider;\n}\n\n/**\n * Response shape from GET /api/qcli/fs/ls\n */\ninterface LsResponse {\n entries: Array<{\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n }>;\n}\n\n/**\n * Response shape from GET /api/qcli/fs/cat\n */\ninterface CatResponse {\n content: string;\n}\n\n/**\n * Response shape from GET /api/qcli/fs/stat\n */\ninterface StatResponse {\n name: string;\n type: 'file' | 'directory';\n size: number;\n created: string;\n modified: string;\n permissions?: string;\n}\n\n/**\n * Creates a minimal root seed filesystem for initial local state.\n */\nfunction createSeedFileSystem(): IFileNode {\n const now = Date.now();\n return {\n name: '',\n type: 'directory',\n children: [\n {\n name: 'home',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n },\n {\n name: 'tmp',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxrwxrwx',\n },\n {\n name: 'etc',\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n },\n ],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n };\n}\n\n/**\n * IFileSystemService implementation that delegates operations to a CLI server's\n * `/api/qcli/fs/*` REST endpoints.\n *\n * Because the IFileSystemService interface is synchronous, this service maintains\n * an in-memory file tree that is returned immediately by read operations. Write\n * operations update the local tree first (for instant feedback) and then fire\n * asynchronous requests to the server for persistence. The `initialize()` method\n * fetches the initial directory listing from the server.\n */\nexport class ServerFileSystemService implements IFileSystemService {\n private root: IFileNode = createSeedFileSystem();\n private cwd: string = DEFAULT_HOME;\n private homePath: string = DEFAULT_HOME;\n private currentUid: string | null = null;\n private currentGroups: string[] = [];\n private readonly baseUrl: string;\n private readonly headersProvider: CliHeadersProvider | undefined;\n\n constructor(options: ServerFileSystemOptions) {\n // Strip trailing slash for consistent URL building\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.headersProvider = options.headers;\n }\n\n // --- User context ---\n\n setCurrentUser(uid: string, groups: string[]): void {\n this.currentUid = uid;\n this.currentGroups = groups;\n }\n\n private getDefaultOwnership(): ICliOwnership | undefined {\n if (!this.currentUid) return undefined;\n return {\n uid: this.currentUid,\n gid: this.currentGroups[0] || 'users',\n };\n }\n\n // --- Navigation ---\n\n getCurrentDirectory(): string {\n return this.cwd;\n }\n\n setCurrentDirectory(path: string): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`cd: ${path}: No such file or directory`);\n }\n if (node.type !== 'directory') {\n throw new Error(`cd: ${path}: Not a directory`);\n }\n this.cwd = resolved;\n }\n\n getHomePath(): string {\n return this.homePath;\n }\n\n setHomePath(path: string): void {\n this.homePath = path;\n }\n\n resolvePath(path: string): string {\n if (path === '~' || path === '') {\n return this.homePath;\n }\n if (path.startsWith('~/')) {\n path = this.homePath + path.substring(1);\n }\n\n const parts = path.startsWith('/')\n ? path.split('/')\n : (this.cwd + '/' + path).split('/');\n\n const resolved: string[] = [];\n for (const part of parts) {\n if (part === '' || part === '.') {\n continue;\n } else if (part === '..') {\n resolved.pop();\n } else {\n resolved.push(part);\n }\n }\n\n return '/' + resolved.join('/');\n }\n\n // --- Read operations (synchronous, from local cache) ---\n\n getNode(path: string): IFileNode | null {\n const resolved = path === '/' ? '/' : this.resolvePath(path);\n if (resolved === '/') {\n return this.root;\n }\n\n const parts = resolved.split('/').filter(Boolean);\n let current = this.root;\n\n for (const part of parts) {\n if (current.type !== 'directory' || !current.children) {\n return null;\n }\n const child = current.children.find((c) => c.name === part);\n if (!child) {\n return null;\n }\n current = child;\n }\n\n return current;\n }\n\n listDirectory(path: string): IFileNode[] {\n const node = this.getNode(path);\n if (!node) {\n throw new Error(`ls: ${path}: No such file or directory`);\n }\n if (node.type !== 'directory') {\n throw new Error(`ls: ${path}: Not a directory`);\n }\n return node.children || [];\n }\n\n readFile(path: string): string | null {\n const node = this.getNode(path);\n if (!node) {\n throw new Error(`cat: ${path}: No such file or directory`);\n }\n if (node.type === 'directory') {\n throw new Error(`cat: ${path}: Is a directory`);\n }\n return node.content ?? '';\n }\n\n exists(path: string): boolean {\n return this.getNode(path) !== null;\n }\n\n isDirectory(path: string): boolean {\n const node = this.getNode(path);\n return node !== null && node.type === 'directory';\n }\n\n // --- Write operations (update local cache + fire-and-forget server call) ---\n\n createDirectory(path: string, recursive = false): void {\n const resolved = this.resolvePath(path);\n const parts = resolved.split('/').filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(`mkdir: cannot create directory '/': File exists`);\n }\n\n if (recursive) {\n let current = this.root;\n for (const part of parts) {\n if (!current.children) {\n current.children = [];\n }\n let child = current.children.find((c) => c.name === part);\n if (!child) {\n const now = Date.now();\n child = {\n name: part,\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n ownership: this.getDefaultOwnership(),\n };\n current.children.push(child);\n current.modifiedAt = now;\n } else if (child.type !== 'directory') {\n throw new Error(`mkdir: ${part}: Not a directory`);\n }\n current = child;\n }\n } else {\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const dirName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent) {\n throw new Error(\n `mkdir: ${parentPath}: No such file or directory`,\n );\n }\n if (parent.type !== 'directory') {\n throw new Error(`mkdir: ${parentPath}: Not a directory`);\n }\n if (parent.children?.find((c) => c.name === dirName)) {\n throw new Error(`mkdir: ${path}: File exists`);\n }\n\n const now = Date.now();\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push({\n name: dirName,\n type: 'directory',\n children: [],\n createdAt: now,\n modifiedAt: now,\n size: 0,\n permissions: 'rwxr-xr-x',\n ownership: this.getDefaultOwnership(),\n });\n parent.modifiedAt = now;\n }\n\n // Fire-and-forget server call\n this.serverMkdir(resolved).catch((err) =>\n console.error('[ServerFS] mkdir failed:', err),\n );\n }\n\n createFile(path: string, content = ''): void {\n const resolved = this.resolvePath(path);\n const parts = resolved.split('/').filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(`touch: cannot create file at root`);\n }\n\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const fileName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent) {\n throw new Error(`touch: ${parentPath}: No such file or directory`);\n }\n if (parent.type !== 'directory') {\n throw new Error(`touch: ${parentPath}: Not a directory`);\n }\n\n const existing = parent.children?.find((c) => c.name === fileName);\n const now = Date.now();\n\n if (existing) {\n existing.modifiedAt = now;\n } else {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push({\n name: fileName,\n type: 'file',\n content,\n createdAt: now,\n modifiedAt: now,\n size: new Blob([content]).size,\n permissions: 'rw-r--r--',\n ownership: this.getDefaultOwnership(),\n });\n parent.modifiedAt = now;\n }\n\n // Fire-and-forget server upload\n this.serverUpload(resolved, content).catch((err) =>\n console.error('[ServerFS] createFile upload failed:', err),\n );\n }\n\n writeFile(path: string, content: string, append = false): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n\n if (node) {\n if (node.type === 'directory') {\n throw new Error(`write: ${path}: Is a directory`);\n }\n const now = Date.now();\n node.content = append ? (node.content ?? '') + content : content;\n node.size = new Blob([node.content]).size;\n node.modifiedAt = now;\n } else {\n this.createFile(resolved, content);\n return; // createFile already handles server upload\n }\n\n // Fire-and-forget server upload with full content\n this.serverUpload(resolved, node.content!).catch((err) =>\n console.error('[ServerFS] writeFile upload failed:', err),\n );\n }\n\n remove(path: string, recursive = false): void {\n const resolved = this.resolvePath(path);\n if (resolved === '/') {\n throw new Error(`rm: cannot remove root directory`);\n }\n\n const parts = resolved.split('/').filter(Boolean);\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const name = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent || !parent.children) {\n throw new Error(`rm: ${path}: No such file or directory`);\n }\n\n const index = parent.children.findIndex((c) => c.name === name);\n if (index === -1) {\n throw new Error(`rm: ${path}: No such file or directory`);\n }\n\n const target = parent.children[index];\n if (target.type === 'directory' && !recursive) {\n throw new Error(`rm: ${path}: Is a directory`);\n }\n\n parent.children.splice(index, 1);\n parent.modifiedAt = Date.now();\n\n // Fire-and-forget server call\n this.serverRm(resolved).catch((err) =>\n console.error('[ServerFS] rm failed:', err),\n );\n }\n\n copy(src: string, dest: string, recursive = false): void {\n const srcResolved = this.resolvePath(src);\n const srcNode = this.getNode(srcResolved);\n\n if (!srcNode) {\n throw new Error(`cp: ${src}: No such file or directory`);\n }\n if (srcNode.type === 'directory' && !recursive) {\n throw new Error(\n `cp: -r not specified; omitting directory '${src}'`,\n );\n }\n\n const destResolved = this.resolvePath(dest);\n const destNode = this.getNode(destResolved);\n\n if (destNode && destNode.type === 'directory') {\n const clone = this.cloneNode(srcNode);\n if (!destNode.children) {\n destNode.children = [];\n }\n const existingIdx = destNode.children.findIndex(\n (c) => c.name === clone.name,\n );\n if (existingIdx !== -1) {\n destNode.children.splice(existingIdx, 1);\n }\n destNode.children.push(clone);\n destNode.modifiedAt = Date.now();\n } else {\n const parts = destResolved.split('/').filter(Boolean);\n const parentPath = '/' + parts.slice(0, -1).join('/');\n const newName = parts[parts.length - 1];\n const parent = this.getNode(parentPath);\n\n if (!parent || parent.type !== 'directory') {\n throw new Error(`cp: ${parentPath}: No such file or directory`);\n }\n\n const clone = this.cloneNode(srcNode);\n clone.name = newName;\n if (!parent.children) {\n parent.children = [];\n }\n const existingIdx = parent.children.findIndex(\n (c) => c.name === newName,\n );\n if (existingIdx !== -1) {\n parent.children.splice(existingIdx, 1);\n }\n parent.children.push(clone);\n parent.modifiedAt = Date.now();\n }\n\n // Sync copied files to server (upload all file nodes in the clone)\n this.syncTreeToServer(destResolved).catch((err) =>\n console.error('[ServerFS] copy sync failed:', err),\n );\n }\n\n move(src: string, dest: string): void {\n const srcResolved = this.resolvePath(src);\n if (srcResolved === '/') {\n throw new Error(`mv: cannot move root directory`);\n }\n\n const srcNode = this.getNode(srcResolved);\n if (!srcNode) {\n throw new Error(`mv: ${src}: No such file or directory`);\n }\n\n const destResolved = this.resolvePath(dest);\n const destNode = this.getNode(destResolved);\n\n // A directory cannot go inside itself (it would detach from the tree)\n if (\n srcNode.type === 'directory' &&\n (destResolved === srcResolved ||\n destResolved.startsWith(srcResolved + '/'))\n ) {\n throw new Error(\n `mv: cannot move '${src}' to a subdirectory of itself, '${dest}'`,\n );\n }\n\n const srcParts = srcResolved.split('/').filter(Boolean);\n const srcParentPath = '/' + srcParts.slice(0, -1).join('/');\n const srcParent = this.getNode(srcParentPath);\n\n if (!srcParent || !srcParent.children) {\n throw new Error(`mv: ${src}: No such file or directory`);\n }\n\n // Into the directory it is already in, or onto itself: nothing to do\n if (\n destResolved === srcResolved ||\n (destNode && destNode.type === 'directory' && destNode === srcParent)\n ) {\n throw new Error(`mv: '${src}' and '${dest}' are the same file`);\n }\n\n if (destNode && destNode.type === 'directory') {\n if (!destNode.children) {\n destNode.children = [];\n }\n const existingIdx = destNode.children.findIndex(\n (c) => c.name === srcNode.name,\n );\n if (existingIdx !== -1) {\n destNode.children.splice(existingIdx, 1);\n }\n // By identity: the index may have moved\n srcParent.children.splice(srcParent.children.indexOf(srcNode), 1);\n destNode.children.push(srcNode);\n destNode.modifiedAt = Date.now();\n } else {\n const destParts = destResolved.split('/').filter(Boolean);\n const destParentPath = '/' + destParts.slice(0, -1).join('/');\n const newName = destParts[destParts.length - 1];\n const destParent = this.getNode(destParentPath);\n\n if (!destParent || destParent.type !== 'directory') {\n throw new Error(\n `mv: ${destParentPath}: No such file or directory`,\n );\n }\n\n // By identity: the index may have moved\n srcParent.children.splice(srcParent.children.indexOf(srcNode), 1);\n srcNode.name = newName;\n if (!destParent.children) {\n destParent.children = [];\n }\n const existingIdx = destParent.children.findIndex(\n (c) => c.name === newName,\n );\n if (existingIdx !== -1) {\n destParent.children.splice(existingIdx, 1);\n }\n destParent.children.push(srcNode);\n destParent.modifiedAt = Date.now();\n }\n\n srcParent.modifiedAt = Date.now();\n\n // Server-side: remove old, upload to new location\n this.serverRm(srcResolved)\n .then(() => this.syncTreeToServer(destResolved))\n .catch((err) =>\n console.error('[ServerFS] move sync failed:', err),\n );\n }\n\n // --- Permissions (local-only, server has no endpoints) ---\n\n chmod(path: string, permissions: string): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`chmod: ${path}: No such file or directory`);\n }\n node.permissions = permissions;\n }\n\n chown(path: string, ownership: ICliOwnership): void {\n const resolved = this.resolvePath(path);\n const node = this.getNode(resolved);\n if (!node) {\n throw new Error(`chown: ${path}: No such file or directory`);\n }\n node.ownership = ownership;\n }\n\n // --- Persistence ---\n\n /**\n * Fetches the root directory listing from the server and populates the\n * local in-memory file tree. Recursively loads subdirectories.\n */\n async initialize(): Promise<void> {\n try {\n await this.loadDirectoryFromServer('/', this.root);\n } catch (err) {\n console.error(\n '[ServerFS] Failed to initialize from server, using seed filesystem:',\n err,\n );\n }\n }\n\n /**\n * No-op for server-backed storage — the server persists automatically.\n */\n async persist(): Promise<void> {\n // Server handles persistence; nothing to do locally.\n }\n\n // --- Private: server communication ---\n\n private async serverFetch<T>(\n endpoint: string,\n options?: RequestInit,\n ): Promise<T> {\n const url = `${this.baseUrl}/api/qcli/fs${endpoint}`;\n const mergedHeaders: Record<string, string> = {\n ...resolveHeaders(this.headersProvider),\n ...((options?.headers as Record<string, string>) ?? {}),\n };\n const response = await fetch(url, {\n ...options,\n headers: mergedHeaders,\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Server responded with ${response.status}: ${body}`,\n );\n }\n return response.json();\n }\n\n private async serverLs(path: string): Promise<LsResponse> {\n return this.serverFetch<LsResponse>(\n `/ls?path=${encodeURIComponent(path)}`,\n );\n }\n\n private async serverCat(path: string): Promise<CatResponse> {\n return this.serverFetch<CatResponse>(\n `/cat?path=${encodeURIComponent(path)}`,\n );\n }\n\n private async serverStat(path: string): Promise<StatResponse> {\n return this.serverFetch<StatResponse>(\n `/stat?path=${encodeURIComponent(path)}`,\n );\n }\n\n private async serverMkdir(path: string): Promise<void> {\n await this.serverFetch<{ path: string }>('/mkdir', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path }),\n });\n }\n\n private async serverUpload(path: string, content: string): Promise<void> {\n const formData = new FormData();\n formData.append('path', path);\n formData.append(\n 'file',\n new Blob([content], { type: 'application/octet-stream' }),\n path.split('/').pop() || 'file',\n );\n await this.serverFetch<{ path: string; size: number }>('/upload', {\n method: 'POST',\n body: formData,\n });\n }\n\n private async serverRm(path: string): Promise<void> {\n await this.serverFetch<{ deleted: string }>(\n `/rm?path=${encodeURIComponent(path)}`,\n { method: 'DELETE' },\n );\n }\n\n /**\n * Recursively loads directory contents from the server into a local node.\n */\n private async loadDirectoryFromServer(\n path: string,\n node: IFileNode,\n ): Promise<void> {\n const response = await this.serverLs(path);\n const now = Date.now();\n\n node.children = [];\n\n for (const entry of response.entries) {\n const childPath =\n path === '/' ? `/${entry.name}` : `${path}/${entry.name}`;\n\n if (entry.type === 'directory') {\n const dirNode: IFileNode = {\n name: entry.name,\n type: 'directory',\n children: [],\n createdAt: new Date(entry.modified).getTime() || now,\n modifiedAt: new Date(entry.modified).getTime() || now,\n size: entry.size,\n permissions: entry.permissions || 'rwxr-xr-x',\n };\n node.children.push(dirNode);\n\n // Recursively load subdirectory contents\n try {\n await this.loadDirectoryFromServer(childPath, dirNode);\n } catch {\n // If a subdirectory fails to load, keep it empty\n }\n } else {\n // For files, fetch content eagerly so readFile() works synchronously\n let content = '';\n try {\n const catResponse = await this.serverCat(childPath);\n content = catResponse.content;\n } catch {\n // If content fetch fails, store empty string\n }\n\n node.children.push({\n name: entry.name,\n type: 'file',\n content,\n createdAt: new Date(entry.modified).getTime() || now,\n modifiedAt: new Date(entry.modified).getTime() || now,\n size: entry.size,\n permissions: entry.permissions || 'rw-r--r--',\n });\n }\n }\n }\n\n /**\n * Uploads all file nodes under the given path to the server.\n * Used after copy/move to sync the local tree to the server.\n */\n private async syncTreeToServer(path: string): Promise<void> {\n const node = this.getNode(path);\n if (!node) return;\n\n if (node.type === 'file') {\n await this.serverUpload(path, node.content ?? '');\n } else if (node.type === 'directory') {\n await this.serverMkdir(path);\n if (node.children) {\n for (const child of node.children) {\n const childPath = path === '/'\n ? `/${child.name}`\n : `${path}/${child.name}`;\n await this.syncTreeToServer(childPath);\n }\n }\n }\n }\n\n // --- Private: tree helpers ---\n\n private cloneNode(node: IFileNode): IFileNode {\n const now = Date.now();\n const clone: IFileNode = {\n name: node.name,\n type: node.type,\n createdAt: now,\n modifiedAt: now,\n size: node.size,\n permissions: node.permissions,\n ownership: node.ownership ? { ...node.ownership } : undefined,\n };\n\n if (node.type === 'file') {\n clone.content = node.content;\n } else {\n clone.children = (node.children || []).map((c) =>\n this.cloneNode(c),\n );\n }\n\n return clone;\n }\n}\n","import {\n ICliFileTransferService,\n ICliFileEntry,\n BrowserFileTransferService,\n} from '@qodalis/cli-core';\nimport { IFileSystemService } from '../interfaces';\n\nexport class VirtualFsFileTransferService implements ICliFileTransferService {\n private readonly _browserService = new BrowserFileTransferService();\n\n constructor(private readonly _fs: IFileSystemService) {}\n\n async readFile(path: string): Promise<string | null> {\n const resolved = this._fs.resolvePath(path);\n return this._fs.readFile(resolved);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const resolved = this._fs.resolvePath(path);\n this._fs.writeFile(resolved, content);\n await this._fs.persist();\n }\n\n async listFiles(path: string): Promise<ICliFileEntry[]> {\n const resolved = this._fs.resolvePath(path);\n const nodes = this._fs.listDirectory(resolved);\n return nodes.map((node) => ({\n name: node.name,\n type: node.type === 'directory' ? ('directory' as const) : ('file' as const),\n size: node.size || 0,\n modified: node.modifiedAt\n ? new Date(node.modifiedAt).toISOString()\n : new Date().toISOString(),\n }));\n }\n\n async exists(path: string): Promise<boolean> {\n const resolved = this._fs.resolvePath(path);\n return this._fs.exists(resolved);\n }\n\n downloadToBrowser(filename: string, content: string | Blob): void {\n this._browserService.downloadToBrowser(filename, content);\n }\n\n async uploadFromBrowser(accept?: string): Promise<{ name: string; content: string } | null> {\n return this._browserService.uploadFromBrowser(accept);\n }\n}\n","import {\n cliCanAccess,\n ICliAuthorizationService,\n ICliAuthorizationService_TOKEN,\n ICliExecutionContext,\n ICliOwnership,\n ICliUserEvent,\n ICliUserEventService,\n ICliUserEventService_TOKEN,\n ICliUserSession,\n ICliUserSessionService,\n ICliUserSessionService_TOKEN,\n} from '@qodalis/cli-core';\nimport { Subscription } from 'rxjs';\nimport { CliFileAccessPolicy, IFileSystemService } from '../interfaces/i-file-system-service';\nimport { SYSTEM_OWNERSHIP } from './indexed-db-file-system.service';\n\n/** Permissions the files module understands. */\nexport const CliFilesPermissions = {\n /** Bypass all file permission checks */\n Admin: 'files:admin',\n /** chmod/chown files you do not own */\n Chown: 'files:chown',\n} as const;\n\n/** Mode for newly created home directories (owner full, group read/traverse) */\nexport const HOME_DIR_PERMISSIONS = 'rwxr-x---';\n\nfunction authorization(context: ICliExecutionContext): ICliAuthorizationService | undefined {\n try {\n return context.services.get<ICliAuthorizationService>(ICliAuthorizationService_TOKEN);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Access policy built on the generic authorization layer. Allows everything\n * when no authorization service is registered (no auth module loaded).\n */\nexport function createFileAccessPolicy(context: ICliExecutionContext): CliFileAccessPolicy {\n return {\n // Nodes without an owner (system seed, legacy data) belong to root:admin\n canAccess: (node, action) =>\n cliCanAccess(\n context,\n node.ownership ? node : { ...node, ownership: SYSTEM_OWNERSHIP },\n action,\n [CliFilesPermissions.Admin],\n ),\n canChangeOwnership: (node, newOwnership?: ICliOwnership) => {\n const auth = authorization(context);\n if (!auth) return true;\n if (auth.can(CliFilesPermissions.Admin) || auth.can(CliFilesPermissions.Chown)) return true;\n const principal = auth.getPrincipal();\n if (!principal) return false;\n // Unowned nodes belong to root: claiming them needs files:chown\n const owns = !!node.ownership && (node.ownership.uid === principal.name || node.ownership.uid === principal.id);\n // Owners may change mode and group, but not give files away\n const keepsOwner = !newOwnership || newOwnership.uid === node.ownership?.uid || newOwnership.uid === principal.name;\n return owns && keepsOwner;\n },\n };\n}\n\n/**\n * Follow the signed-in user (from any auth module that provides\n * {@link ICliUserSessionService}): ownership for new files, home directory\n * creation and `~`, and moving to the home directory when the user changes.\n */\nexport function followUserSession(context: ICliExecutionContext, fs: IFileSystemService): Subscription | undefined {\n let sessions: ICliUserSessionService | undefined;\n try {\n sessions = context.services.get<ICliUserSessionService>(ICliUserSessionService_TOKEN);\n } catch {\n sessions = undefined;\n }\n if (!sessions) return undefined;\n\n let previousUser: string | null = null;\n return sessions.getUserSession().subscribe((session: ICliUserSession | undefined) => {\n if (!session?.user) {\n fs.setCurrentUser('', []);\n // Signed out (or restored signed out): don't stay in someone's home\n if (previousUser !== null || !canEnter(fs, fs.getCurrentDirectory())) {\n try {\n fs.setCurrentDirectory('/');\n void fs.persist(); // the next boot's first prompt starts at /\n } catch {\n // keep the current directory\n }\n }\n previousUser = null;\n return;\n }\n const user = session.user;\n fs.setCurrentUser(user.name, user.groups ?? []);\n if (user.homeDir) {\n const home = user.homeDir;\n const system = <T>(fn: () => T): T => (fs.runAsSystem ? fs.runAsSystem(fn) : fn());\n if (!fs.exists(home)) {\n system(() => {\n fs.createDirectory(home, true);\n if (home !== '/') {\n fs.chown(home, { uid: user.name, gid: user.groups?.[0] ?? 'users' });\n fs.chmod(home, HOME_DIR_PERMISSIONS);\n }\n });\n void fs.persist();\n }\n fs.setHomePath(home);\n if (previousUser !== user.id) {\n try {\n fs.setCurrentDirectory(home);\n } catch {\n // not accessible: stay where we are\n }\n }\n }\n previousUser = user.id;\n });\n}\n\n/** Same check as `cd`: traverse the parents and execute the directory itself */\nfunction canEnter(fs: IFileSystemService, path: string): boolean {\n try {\n fs.setCurrentDirectory(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Keep file ownership (stored by login name) in step with the accounts of\n * any auth module that emits {@link ICliUserEventService} events: a rename\n * moves the user's files to the new name, a deletion gives them to `root`, so\n * a later account with the same name never inherits them. Runs as a system\n * task (no rwx checks for the acting user). No-op without such a module.\n */\nexport function followUserAccounts(context: ICliExecutionContext, fs: IFileSystemService): Subscription | undefined {\n let events: ICliUserEventService | undefined;\n try {\n events = context.services.get<ICliUserEventService>(ICliUserEventService_TOKEN);\n } catch {\n events = undefined;\n }\n if (!events || !fs.reassignOwner) return undefined;\n\n return events.events$.subscribe((event: ICliUserEvent) => {\n let changed = 0;\n if (event.type === 'user_updated' && event.previousName && event.previousName !== event.user?.name) {\n changed = fs.reassignOwner!(event.previousName, event.user.name);\n } else if (event.type === 'user_deleted' && event.user?.name) {\n changed = fs.reassignOwner!(event.user.name, SYSTEM_OWNERSHIP.uid);\n }\n if (changed > 0) void fs.persist().catch(() => undefined);\n });\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n} from '@qodalis/cli-core';\nimport { IFileSystemService } from '../interfaces/i-file-system-service';\n\n/** Commands that accept file/directory path arguments. */\nconst FILE_COMMANDS = new Set([\n 'ls',\n 'cd',\n 'cat',\n 'cp',\n 'mv',\n 'rm',\n 'touch',\n 'mkdir',\n 'rmdir',\n 'tree',\n 'echo',\n 'nano',\n 'edit',\n 'grep',\n 'find',\n 'head',\n 'tail',\n 'wc',\n 'sort',\n 'uniq',\n 'cut',\n 'paste',\n 'tac',\n 'diff',\n 'sed',\n 'awk',\n 'du',\n 'stat',\n 'chmod',\n 'chown',\n 'ln',\n 'tee',\n 'basename',\n 'dirname',\n 'sh',\n 'source',\n 'xargs',\n]);\n\n/**\n * Provides tab-completion for file and directory names from the virtual filesystem.\n * Priority 50 (checked before command/parameter providers for file-related commands).\n */\nexport class FilePathCompletionProvider implements ICliCompletionProvider {\n priority = 50;\n\n constructor(private readonly fs: IFileSystemService) {}\n\n getCompletions(context: ICliCompletionContext): string[] {\n const { tokens, tokenIndex, token } = context;\n\n // Only activate when the command is a file command and we're completing an argument\n if (tokenIndex === 0) {\n return []; // Let command completion handle the first token\n }\n\n const command = tokens[0];\n if (!FILE_COMMANDS.has(command)) {\n return [];\n }\n\n // Skip flag tokens\n if (token.startsWith('-')) {\n return [];\n }\n\n // A name with spaces is completed in quotes: `cat \"my no` -> `cat \"my notes.txt\"`\n const quote = token.startsWith('\"') || token.startsWith(\"'\") ? token[0] : '';\n const partial = quote ? token.slice(1).replace(new RegExp(`${quote}$`), '') : token;\n const paths = this.completePath(partial);\n if (!quote && !paths.some((p) => /\\s/.test(p))) {\n return paths;\n }\n const q = quote || '\"';\n // Directories stay open so the completion can go on inside them\n return paths.map((p) => (p.endsWith('/') ? `${q}${p}` : `${q}${p}${q}`));\n }\n\n private completePath(partial: string): string[] {\n // Split into directory part and name prefix\n let dirPath: string;\n let namePrefix: string;\n\n if (partial.includes('/')) {\n const lastSlash = partial.lastIndexOf('/');\n dirPath = partial.slice(0, lastSlash) || '/';\n namePrefix = partial.slice(lastSlash + 1);\n } else {\n dirPath = this.fs.getCurrentDirectory();\n namePrefix = partial;\n }\n\n // Resolve the directory\n let resolvedDir: string;\n try {\n resolvedDir = this.fs.resolvePath(dirPath);\n } catch {\n return [];\n }\n\n if (!this.fs.exists(resolvedDir) || !this.fs.isDirectory(resolvedDir)) {\n return [];\n }\n\n // List entries and filter by prefix\n const entries = this.fs.listDirectory(resolvedDir);\n const lowerPrefix = namePrefix.toLowerCase();\n\n const results: string[] = [];\n for (const entry of entries) {\n if (entry.name.toLowerCase().startsWith(lowerPrefix)) {\n // Build the completion string preserving the directory prefix\n let completion: string;\n if (partial.includes('/')) {\n const lastSlash = partial.lastIndexOf('/');\n completion = partial.slice(0, lastSlash + 1) + entry.name;\n } else {\n completion = entry.name;\n }\n\n // Append / for directories\n if (entry.type === 'directory') {\n completion += '/';\n }\n\n results.push(completion);\n }\n }\n\n return results.sort();\n }\n}\n","import {\n CliProcessCommand,\n CliForegroundColor,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IFileSystemService, IFileSystemService_TOKEN } from '../interfaces';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliUploadCommandProcessor implements ICliCommandProcessor {\n command = 'upload';\n description = 'Upload a file from your local machine into the virtual filesystem';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n metadata = { icon: '📤', module: 'file management' };\n\n parameters = [\n {\n name: 'accept',\n description: 'File type filter (e.g. \".json,.txt\" or \"image/*\")',\n required: false,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const accept = command.args?.['accept'] as string | undefined;\n const destPath = command.value?.trim() || undefined;\n\n context.spinner?.show('Waiting for file selection...');\n context.notifier.info('Waiting for file selection');\n\n const picked = await fileService.uploadFromBrowser(accept);\n\n if (!picked) {\n context.spinner?.hide();\n context.writer.writeln('Upload cancelled.');\n return;\n }\n\n const cwd = fs.getCurrentDirectory();\n const filename = destPath || picked.name;\n const resolved = fs.resolvePath(\n filename.startsWith('/') ? filename : cwd + '/' + filename,\n );\n\n context.spinner?.show(`Saving \"${picked.name}\" (${picked.content.length} bytes)...`);\n context.notifier.info(`Saving ${picked.name}`);\n\n try {\n fs.writeFile(resolved, picked.content);\n await fs.persist();\n context.spinner?.hide();\n context.writer.writeSuccess(\n `Uploaded ${context.writer.wrapInColor(picked.name, CliForegroundColor.Cyan)} (${picked.content.length} bytes) → ${resolved}`,\n );\n } catch (e: any) {\n context.spinner?.hide();\n context.writer.writeError(e.message || 'Failed to write file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' upload Open file picker, save to current directory');\n context.writer.writeln(' upload myfile.txt Open file picker, save as myfile.txt');\n context.writer.writeln(' upload /home/user/data Open file picker, save to absolute path');\n context.writer.writeln(' upload --accept=\".json\" Filter file picker to .json files');\n }\n}\n","/*\n * Public API Surface of files\n */\n\nexport * from './lib/index';\n\nimport { ICliModule, ICliConfigurableModule, ICliCompletionProvider_TOKEN, ICliFileTransferService_TOKEN, ICliDragDropService, ICliDragDropService_TOKEN, ICliExecutionContext } from '@qodalis/cli-core';\nimport { Subscription } from 'rxjs';\nimport { API_VERSION } from './lib/version';\nimport { IFileSystemService_TOKEN } from './lib/interfaces';\nimport { IndexedDbFileSystemService, VirtualFsFileTransferService } from './lib/services';\nimport { IFileSystemService } from './lib/interfaces';\nimport { CliFilesPermissions, createFileAccessPolicy, followUserAccounts, followUserSession } from './lib/services/files-access';\nimport { FilePathCompletionProvider } from './lib/completion/file-path-completion-provider';\nimport { CliLsCommandProcessor } from './lib/processors/cli-ls-command-processor';\nimport { CliCdCommandProcessor } from './lib/processors/cli-cd-command-processor';\nimport { CliPwdCommandProcessor } from './lib/processors/cli-pwd-command-processor';\nimport { CliMkdirCommandProcessor } from './lib/processors/cli-mkdir-command-processor';\nimport { CliRmdirCommandProcessor } from './lib/processors/cli-rmdir-command-processor';\nimport { CliTouchCommandProcessor } from './lib/processors/cli-touch-command-processor';\nimport { CliCatCommandProcessor } from './lib/processors/cli-cat-command-processor';\nimport { CliEchoCommandProcessor } from './lib/processors/cli-echo-command-processor';\nimport { CliRmCommandProcessor } from './lib/processors/cli-rm-command-processor';\nimport { CliCpCommandProcessor } from './lib/processors/cli-cp-command-processor';\nimport { CliMvCommandProcessor } from './lib/processors/cli-mv-command-processor';\nimport { CliTreeCommandProcessor } from './lib/processors/cli-tree-command-processor';\nimport { CliHeadCommandProcessor } from './lib/processors/cli-head-command-processor';\nimport { CliTailCommandProcessor } from './lib/processors/cli-tail-command-processor';\nimport { CliWcCommandProcessor } from './lib/processors/cli-wc-command-processor';\nimport { CliFindCommandProcessor } from './lib/processors/cli-find-command-processor';\nimport { CliGrepCommandProcessor } from './lib/processors/cli-grep-command-processor';\nimport { CliTacCommandProcessor } from './lib/processors/cli-tac-command-processor';\nimport { CliBasenameCommandProcessor } from './lib/processors/cli-basename-command-processor';\nimport { CliDirnameCommandProcessor } from './lib/processors/cli-dirname-command-processor';\nimport { CliSortCommandProcessor } from './lib/processors/cli-sort-command-processor';\nimport { CliUniqCommandProcessor } from './lib/processors/cli-uniq-command-processor';\nimport { CliCutCommandProcessor } from './lib/processors/cli-cut-command-processor';\nimport { CliPasteCommandProcessor } from './lib/processors/cli-paste-command-processor';\nimport { CliTrCommandProcessor } from './lib/processors/cli-tr-command-processor';\nimport { CliStatCommandProcessor } from './lib/processors/cli-stat-command-processor';\nimport { CliChmodCommandProcessor } from './lib/processors/cli-chmod-command-processor';\nimport { CliChownCommandProcessor } from './lib/processors/cli-chown-command-processor';\nimport { CliDuCommandProcessor } from './lib/processors/cli-du-command-processor';\nimport { CliLnCommandProcessor } from './lib/processors/cli-ln-command-processor';\nimport { CliSedCommandProcessor } from './lib/processors/cli-sed-command-processor';\nimport { CliAwkCommandProcessor } from './lib/processors/cli-awk-command-processor';\nimport { CliDiffCommandProcessor } from './lib/processors/cli-diff-command-processor';\nimport { CliTeeCommandProcessor } from './lib/processors/cli-tee-command-processor';\nimport { CliXargsCommandProcessor } from './lib/processors/cli-xargs-command-processor';\nimport { CliShCommandProcessor } from './lib/processors/cli-sh-command-processor';\nimport { CliUploadCommandProcessor } from './lib/processors/cli-upload-command-processor';\n\n/**\n * Configuration options for the files module.\n */\nexport interface CliFilesModuleConfig {\n /**\n * Whether to show the current working directory in the CLI prompt.\n * @default true\n */\n showPathInPrompt?: boolean;\n}\n\ninterface ICliFilesModule extends ICliConfigurableModule<CliFilesModuleConfig> {\n /** Subscription for drag-and-drop file uploads, cleaned up in onDestroy */\n _dragDropSubscription?: Subscription;\n /** Subscription following the signed-in user, cleaned up in onDestroy */\n _sessionSubscription?: Subscription;\n /** Subscription following account renames/deletions, cleaned up in onDestroy */\n _accountsSubscription?: Subscription;\n}\n\nconst fsService = new IndexedDbFileSystemService();\n\nexport const filesModule: ICliFilesModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-files',\n processors: [\n new CliLsCommandProcessor(),\n new CliCdCommandProcessor(),\n new CliPwdCommandProcessor(),\n new CliMkdirCommandProcessor(),\n new CliRmdirCommandProcessor(),\n new CliTouchCommandProcessor(),\n new CliCatCommandProcessor(),\n new CliEchoCommandProcessor(),\n new CliRmCommandProcessor(),\n new CliCpCommandProcessor(),\n new CliMvCommandProcessor(),\n new CliTreeCommandProcessor(),\n new CliHeadCommandProcessor(),\n new CliTailCommandProcessor(),\n new CliWcCommandProcessor(),\n new CliFindCommandProcessor(),\n new CliGrepCommandProcessor(),\n new CliTacCommandProcessor(),\n new CliBasenameCommandProcessor(),\n new CliDirnameCommandProcessor(),\n new CliSortCommandProcessor(),\n new CliUniqCommandProcessor(),\n new CliCutCommandProcessor(),\n new CliPasteCommandProcessor(),\n new CliTrCommandProcessor(),\n new CliStatCommandProcessor(),\n new CliChmodCommandProcessor(),\n new CliChownCommandProcessor(),\n new CliDuCommandProcessor(),\n new CliLnCommandProcessor(),\n new CliSedCommandProcessor(),\n new CliAwkCommandProcessor(),\n new CliDiffCommandProcessor(),\n new CliTeeCommandProcessor(),\n new CliXargsCommandProcessor(),\n new CliShCommandProcessor(),\n new CliUploadCommandProcessor(),\n ],\n permissions: [\n { name: CliFilesPermissions.Admin, description: 'Bypass file permission checks' },\n { name: CliFilesPermissions.Chown, description: 'chmod/chown files owned by others' },\n ],\n services: [\n {\n provide: IFileSystemService_TOKEN,\n useValue: fsService,\n },\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: new FilePathCompletionProvider(fsService),\n multi: true,\n },\n {\n provide: ICliFileTransferService_TOKEN,\n useValue: new VirtualFsFileTransferService(fsService),\n },\n ],\n\n translations: {\n es: { 'cli.files.description': 'Sistema de archivos virtual en el navegador' },\n fr: { 'cli.files.description': 'Système de fichiers virtuel dans le navigateur' },\n de: { 'cli.files.description': 'Virtuelles Dateisystem im Browser' },\n pt: { 'cli.files.description': 'Sistema de arquivos virtual no navegador' },\n it: { 'cli.files.description': 'File system virtuale nel browser' },\n ja: { 'cli.files.description': 'ブラウザ内仮想ファイルシステム' },\n ko: { 'cli.files.description': '브라우저 내 가상 파일 시스템' },\n zh: { 'cli.files.description': '浏览器内虚拟文件系统' },\n ru: { 'cli.files.description': 'Виртуальная файловая система в браузере' },\n ro: { 'cli.files.description': 'Sistem de fișiere virtual în browser' },\n },\n\n configure(config: CliFilesModuleConfig): ICliModule {\n return { ...this, config };\n },\n\n async onInit(context) {\n const fs = context.services.getRequired<IFileSystemService>(\n IFileSystemService_TOKEN,\n );\n await fs.initialize();\n\n const moduleConfig = (this.config || {}) as CliFilesModuleConfig;\n const showPath = moduleConfig.showPathInPrompt !== false;\n\n if (showPath) {\n context.promptPathProvider = () => fs.getCurrentDirectory();\n }\n\n let dragDrop: ICliDragDropService | undefined;\n try {\n dragDrop = context.services.getRequired<ICliDragDropService>(ICliDragDropService_TOKEN);\n } catch {\n // service not registered (e.g. test environment) — skip\n }\n\n if (dragDrop) {\n this._dragDropSubscription = dragDrop.onFileDrop.subscribe((files) => {\n files.forEach((file) => {\n const reader = new FileReader();\n reader.onload = async () => {\n const content = reader.result as string;\n const dest = fs.resolvePath(\n fs.getCurrentDirectory() + '/' + file.name,\n );\n await fs.writeFile(dest, content);\n await fs.persist();\n context.writer.writeSuccess(\n `Uploaded: ${file.name} (${file.size} bytes) → ${dest}`,\n );\n };\n reader.onerror = () => {\n context.writer.writeError(`Failed to read dropped file: ${file.name}`);\n };\n if (file.type && !file.type.startsWith('text/') && file.type !== 'application/json') {\n context.writer.writeWarning(`${file.name}: may be a binary file — uploading as text (content may be corrupted)`);\n }\n reader.readAsText(file);\n });\n });\n }\n },\n\n async onAfterBoot(context) {\n // Integrate with whatever auth module is loaded (e.g. @qodalis/cli-users):\n // rwx checks via the generic authorization layer, ownership and home dirs\n // from the user session. Without an auth module both are no-ops.\n const fs = context.services.getRequired<IFileSystemService>(IFileSystemService_TOKEN);\n fs.setAccessPolicy?.(createFileAccessPolicy(context));\n this._sessionSubscription?.unsubscribe();\n this._sessionSubscription = followUserSession(context, fs);\n // File ownership follows user renames and deletions\n this._accountsSubscription?.unsubscribe();\n this._accountsSubscription = followUserAccounts(context, fs);\n },\n\n async onDestroy(_context: ICliExecutionContext): Promise<void> {\n const sub: Subscription | undefined = this._dragDropSubscription;\n sub?.unsubscribe();\n this._dragDropSubscription = undefined;\n this._sessionSubscription?.unsubscribe();\n this._sessionSubscription = undefined;\n this._accountsSubscription?.unsubscribe();\n this._accountsSubscription = undefined;\n },\n};\n"]}
|