apcore-cli 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js","../src/errors.ts","../src/security/audit.ts","../src/security/config-encryptor.ts","../src/security/auth.ts","../src/security/sandbox.ts","../src/security/index.ts","../src/index.ts","../src/main.ts","../src/ref-resolver.ts","../src/schema-parser.ts","../src/approval.ts","../src/output.ts","../src/logger.ts","../src/init-cmd.ts","../src/display-helpers.ts","../src/config.ts","../src/shell.ts","../src/cli.ts","../src/discovery.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Error classes and exit code mapping for apcore-cli.\n *\n * Protocol spec: Error handling & exit codes\n */\n\n// ---------------------------------------------------------------------------\n// Error classes\n// ---------------------------------------------------------------------------\n\n/** Thrown when the user does not approve module execution within the timeout. */\nexport class ApprovalTimeoutError extends Error {\n constructor(message = \"Approval timed out\") {\n super(message);\n this.name = \"ApprovalTimeoutError\";\n }\n}\n\n/** Thrown when API key authentication fails or is missing. */\nexport class AuthenticationError extends Error {\n constructor(message = \"Authentication failed\") {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\n/** Thrown when encrypted config cannot be decrypted. */\nexport class ConfigDecryptionError extends Error {\n constructor(message = \"Config decryption failed\") {\n super(message);\n this.name = \"ConfigDecryptionError\";\n }\n}\n\n/** Thrown when module execution fails. */\nexport class ModuleExecutionError extends Error {\n constructor(message = \"Module execution failed\") {\n super(message);\n this.name = \"ModuleExecutionError\";\n }\n}\n\n/** Thrown when approval is denied by the user. */\nexport class ApprovalDeniedError extends Error {\n constructor(message = \"Approval denied\") {\n super(message);\n this.name = \"ApprovalDeniedError\";\n }\n}\n\n/** Thrown when schema validation fails. */\nexport class SchemaValidationError extends Error {\n constructor(message = \"Schema validation failed\") {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n\n/** Thrown when a module is not found. */\nexport class ModuleNotFoundError extends Error {\n constructor(message = \"Module not found\") {\n super(message);\n this.name = \"ModuleNotFoundError\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Exit code map\n// ---------------------------------------------------------------------------\n\nexport const EXIT_CODES = {\n SUCCESS: 0,\n MODULE_EXECUTE_ERROR: 1,\n MODULE_TIMEOUT: 1,\n INVALID_CLI_INPUT: 2,\n MODULE_NOT_FOUND: 44,\n MODULE_LOAD_ERROR: 44,\n MODULE_DISABLED: 44,\n SCHEMA_VALIDATION_ERROR: 45,\n APPROVAL_DENIED: 46,\n APPROVAL_TIMEOUT: 46,\n CONFIG_NOT_FOUND: 47,\n CONFIG_INVALID: 47,\n SCHEMA_CIRCULAR_REF: 48,\n ACL_DENIED: 77,\n // Config Bus errors (apcore >= 0.15.0)\n CONFIG_NAMESPACE_RESERVED: 78,\n CONFIG_NAMESPACE_DUPLICATE: 78,\n CONFIG_ENV_PREFIX_CONFLICT: 78,\n CONFIG_MOUNT_ERROR: 66,\n CONFIG_BIND_ERROR: 65,\n ERROR_FORMATTER_DUPLICATE: 70,\n KEYBOARD_INTERRUPT: 130,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Map a caught error to the appropriate process exit code.\n * Also checks for apcore error codes on the error object.\n */\nexport function exitCodeForError(error: unknown): ExitCode {\n if (error instanceof ApprovalTimeoutError) {\n return EXIT_CODES.APPROVAL_TIMEOUT;\n }\n if (error instanceof ApprovalDeniedError) {\n return EXIT_CODES.APPROVAL_DENIED;\n }\n if (error instanceof AuthenticationError) {\n return EXIT_CODES.ACL_DENIED;\n }\n if (error instanceof ConfigDecryptionError) {\n return EXIT_CODES.CONFIG_INVALID;\n }\n if (error instanceof SchemaValidationError) {\n return EXIT_CODES.SCHEMA_VALIDATION_ERROR;\n }\n if (error instanceof ModuleNotFoundError) {\n return EXIT_CODES.MODULE_NOT_FOUND;\n }\n if (error instanceof ModuleExecutionError) {\n return EXIT_CODES.MODULE_EXECUTE_ERROR;\n }\n\n // Check for apcore error codes on the error object\n if (error instanceof Error) {\n const code = (error as unknown as Record<string, unknown>).code as string | undefined;\n const codeMap: Record<string, ExitCode> = {\n MODULE_NOT_FOUND: EXIT_CODES.MODULE_NOT_FOUND,\n MODULE_LOAD_ERROR: EXIT_CODES.MODULE_LOAD_ERROR,\n MODULE_DISABLED: EXIT_CODES.MODULE_DISABLED,\n SCHEMA_VALIDATION_ERROR: EXIT_CODES.SCHEMA_VALIDATION_ERROR,\n SCHEMA_CIRCULAR_REF: EXIT_CODES.SCHEMA_CIRCULAR_REF,\n APPROVAL_DENIED: EXIT_CODES.APPROVAL_DENIED,\n APPROVAL_TIMEOUT: EXIT_CODES.APPROVAL_TIMEOUT,\n APPROVAL_PENDING: EXIT_CODES.APPROVAL_DENIED,\n CONFIG_NOT_FOUND: EXIT_CODES.CONFIG_NOT_FOUND,\n CONFIG_INVALID: EXIT_CODES.CONFIG_INVALID,\n MODULE_EXECUTE_ERROR: EXIT_CODES.MODULE_EXECUTE_ERROR,\n MODULE_TIMEOUT: EXIT_CODES.MODULE_TIMEOUT,\n ACL_DENIED: EXIT_CODES.ACL_DENIED,\n // Config Bus errors (apcore >= 0.15.0)\n CONFIG_NAMESPACE_RESERVED: EXIT_CODES.CONFIG_NAMESPACE_RESERVED,\n CONFIG_NAMESPACE_DUPLICATE: EXIT_CODES.CONFIG_NAMESPACE_DUPLICATE,\n CONFIG_ENV_PREFIX_CONFLICT: EXIT_CODES.CONFIG_ENV_PREFIX_CONFLICT,\n CONFIG_MOUNT_ERROR: EXIT_CODES.CONFIG_MOUNT_ERROR,\n CONFIG_BIND_ERROR: EXIT_CODES.CONFIG_BIND_ERROR,\n ERROR_FORMATTER_DUPLICATE: EXIT_CODES.ERROR_FORMATTER_DUPLICATE,\n };\n if (code && code in codeMap) {\n return codeMap[code];\n }\n }\n\n return EXIT_CODES.MODULE_EXECUTE_ERROR;\n}\n","/**\n * AuditLogger — JSONL audit trail.\n *\n * Protocol spec: Security — audit logging\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ExecutionStatus = \"success\" | \"error\";\n\ninterface AuditEntry {\n timestamp: string;\n user: string;\n module_id: string;\n input_hash: string;\n status: ExecutionStatus;\n exit_code: number;\n duration_ms: number;\n}\n\n// ---------------------------------------------------------------------------\n// AuditLogger\n// ---------------------------------------------------------------------------\n\n/**\n * Appends structured JSONL entries to an audit log file for every module\n * execution, supporting compliance and debugging.\n */\nlet _auditLogger: AuditLogger | null = null;\n\n/**\n * Set the module-level audit logger instance.\n */\nexport function setAuditLogger(auditLogger: AuditLogger | null): void {\n _auditLogger = auditLogger;\n}\n\n/**\n * Get the current module-level audit logger instance.\n */\nexport function getAuditLogger(): AuditLogger | null {\n return _auditLogger;\n}\n\nexport class AuditLogger {\n static readonly DEFAULT_PATH = path.join(\n os.homedir(),\n \".apcore-cli\",\n \"audit.jsonl\",\n );\n\n private readonly logPath: string;\n\n constructor(path?: string) {\n this.logPath = path ?? AuditLogger.DEFAULT_PATH;\n this.ensureDirectory();\n }\n\n private ensureDirectory(): void {\n try {\n fs.mkdirSync(path.dirname(this.logPath), { recursive: true });\n } catch {\n // Silently ignore — we'll handle write errors in logExecution\n }\n }\n\n logExecution(\n moduleId: string,\n inputData: Record<string, unknown>,\n status: ExecutionStatus,\n exitCode: number,\n durationMs: number,\n ): void {\n const entry: AuditEntry = {\n timestamp: new Date().toISOString(),\n user: this.getUser(),\n module_id: moduleId,\n input_hash: this.hashInput(inputData),\n status,\n exit_code: exitCode,\n duration_ms: durationMs,\n };\n try {\n fs.appendFileSync(this.logPath, JSON.stringify(entry) + \"\\n\");\n } catch (err) {\n console.warn(`Could not write audit log: ${err}`);\n }\n }\n\n private hashInput(inputData: Record<string, unknown>): string {\n const salt = crypto.randomBytes(16);\n const sortedKeys = Object.keys(inputData).sort();\n const payload = JSON.stringify(inputData, sortedKeys);\n return crypto\n .createHash(\"sha256\")\n .update(Buffer.concat([salt, Buffer.from(payload, \"utf-8\")]))\n .digest(\"hex\");\n }\n\n private getUser(): string {\n try {\n return os.userInfo().username;\n } catch {\n return process.env.USER ?? process.env.USERNAME ?? \"unknown\";\n }\n }\n}\n","/**\n * ConfigEncryptor — Keyring + AES-256-GCM fallback.\n *\n * Protocol spec: Security — config encryption\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as os from \"node:os\";\nimport { ConfigDecryptionError } from \"../errors.js\";\n\n// ---------------------------------------------------------------------------\n// Keytar dynamic import helper\n// ---------------------------------------------------------------------------\n\nlet keytarModule: any = null; // eslint-disable-line @typescript-eslint/no-explicit-any\nasync function getKeytar(): Promise<any> { // eslint-disable-line @typescript-eslint/no-explicit-any\n if (keytarModule) return keytarModule;\n try {\n // @ts-expect-error — keytar is an optional peer dependency\n keytarModule = await import(\"keytar\");\n return keytarModule;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// ConfigEncryptor\n// ---------------------------------------------------------------------------\n\n/**\n * Encrypts and decrypts configuration values. Prefers OS keyring for key\n * storage, falling back to AES-256-GCM with a derived key.\n */\nexport class ConfigEncryptor {\n static readonly SERVICE_NAME = \"apcore-cli\";\n\n /**\n * Encrypt and store a configuration value.\n */\n async store(key: string, value: string): Promise<string> {\n const keytar = await getKeytar();\n if (keytar) {\n try {\n await keytar.setPassword(ConfigEncryptor.SERVICE_NAME, key, value);\n return `keyring:${key}`;\n } catch {\n // Fall through to file-based encryption\n }\n }\n console.warn(\"OS keyring unavailable. Using file-based encryption.\");\n const ciphertext = this.aesEncrypt(value);\n return `enc:${Buffer.from(ciphertext).toString(\"base64\")}`;\n }\n\n /**\n * Retrieve and decrypt a configuration value.\n */\n async retrieve(configValue: string, key: string): Promise<string> {\n if (configValue.startsWith(\"keyring:\")) {\n const keytar = await getKeytar();\n if (!keytar) {\n throw new ConfigDecryptionError(\n `Keyring module not available to retrieve '${key}'.`,\n );\n }\n try {\n const refKey = configValue.slice(\"keyring:\".length);\n const result = await keytar.getPassword(\n ConfigEncryptor.SERVICE_NAME,\n refKey,\n );\n if (result === null || result === undefined) {\n throw new ConfigDecryptionError(\n `Keyring entry not found for '${refKey}'.`,\n );\n }\n return result;\n } catch (err) {\n if (err instanceof ConfigDecryptionError) throw err;\n throw new ConfigDecryptionError(\n `Failed to retrieve from keyring: ${err}`,\n );\n }\n }\n\n if (configValue.startsWith(\"enc:\")) {\n const ciphertext = Buffer.from(\n configValue.slice(\"enc:\".length),\n \"base64\",\n );\n try {\n return this.aesDecrypt(ciphertext);\n } catch {\n throw new ConfigDecryptionError(\n `Failed to decrypt configuration value '${key}'. Re-configure with 'apcore-cli config set ${key}'.`,\n );\n }\n }\n\n // Unrecognized prefix — return as-is\n return configValue;\n }\n\n // NOTE: Best-effort fallback when OS keyring is unavailable.\n // The key is derived from hostname + username (non-secret inputs).\n // For production security, ensure the OS keyring is accessible.\n private deriveKey(): Buffer {\n const hostname = os.hostname();\n const username =\n process.env.USER ?? process.env.USERNAME ?? \"unknown\";\n const salt = Buffer.from(\"apcore-cli-config-v1\");\n const material = `${hostname}:${username}`;\n return crypto.pbkdf2Sync(material, salt, 100_000, 32, \"sha256\");\n }\n\n private aesEncrypt(plaintext: string): Buffer {\n const key = this.deriveKey();\n const nonce = crypto.randomBytes(12);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", key, nonce);\n const ct = Buffer.concat([\n cipher.update(plaintext, \"utf-8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n // Wire format: nonce(12) + tag(16) + ciphertext\n return Buffer.concat([nonce, tag, ct]);\n }\n\n private aesDecrypt(data: Buffer): string {\n const key = this.deriveKey();\n const nonce = data.subarray(0, 12);\n const tag = data.subarray(12, 28);\n const ct = data.subarray(28);\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([decipher.update(ct), decipher.final()]);\n return plaintext.toString(\"utf-8\");\n }\n}\n","/**\n * AuthProvider — API key auth with keyring/encrypted storage.\n *\n * Protocol spec: Security — authentication\n */\n\nimport type { ConfigResolver } from \"../config.js\";\nimport { AuthenticationError } from \"../errors.js\";\nimport { ConfigEncryptor } from \"./config-encryptor.js\";\n\n// ---------------------------------------------------------------------------\n// AuthProvider\n// ---------------------------------------------------------------------------\n\n/**\n * Manages API key retrieval and request authentication.\n */\nexport class AuthProvider {\n private readonly config: ConfigResolver;\n private readonly encryptor: ConfigEncryptor;\n\n constructor(config: ConfigResolver, encryptor?: ConfigEncryptor) {\n this.config = config;\n this.encryptor = encryptor ?? new ConfigEncryptor();\n }\n\n /**\n * Retrieve the API key from the configured sources.\n * Handles keyring: and enc: prefixes via ConfigEncryptor.\n */\n async getApiKey(): Promise<string | null> {\n const result = this.config.resolve(\n \"auth.api_key\",\n \"--api-key\",\n \"APCORE_AUTH_API_KEY\",\n );\n if (result === null || result === undefined) {\n return null;\n }\n const strResult = String(result);\n if (strResult.startsWith(\"keyring:\") || strResult.startsWith(\"enc:\")) {\n return this.encryptor.retrieve(strResult, \"auth.api_key\");\n }\n return strResult;\n }\n\n /**\n * Add authentication headers to an outgoing request.\n */\n async authenticateRequest(\n headers: Record<string, string>,\n ): Promise<Record<string, string>> {\n const key = await this.getApiKey();\n if (!key) {\n throw new AuthenticationError(\n \"Remote registry requires authentication. \" +\n \"Set --api-key, APCORE_AUTH_API_KEY, or auth.api_key in config.\",\n );\n }\n return { ...headers, Authorization: `Bearer ${key}` };\n }\n\n /**\n * Handle an HTTP response status code for auth-related errors.\n */\n handleResponse(statusCode: number): void {\n if (statusCode === 401 || statusCode === 403) {\n throw new AuthenticationError(\n \"Authentication failed. Verify your API key.\",\n );\n }\n }\n}\n","/**\n * Sandbox — Subprocess isolation for module execution.\n *\n * Protocol spec: Security — sandboxed execution\n */\n\nimport * as child_process from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { Executor } from \"../cli.js\";\nimport { ModuleExecutionError } from \"../errors.js\";\n\n// ---------------------------------------------------------------------------\n// Sandbox\n// ---------------------------------------------------------------------------\n\n/**\n * Executes modules in an isolated subprocess to limit the blast radius\n * of untrusted or third-party modules.\n *\n * When disabled, delegates directly to the Executor.\n */\nexport class Sandbox {\n private readonly enabled: boolean;\n\n constructor(enabled = false) {\n this.enabled = enabled;\n }\n\n /**\n * Execute a module, optionally inside a sandboxed subprocess.\n */\n async execute(\n moduleId: string,\n inputData: Record<string, unknown>,\n executor: Executor,\n ): Promise<unknown> {\n if (!this.enabled) {\n return executor.execute(moduleId, inputData);\n }\n return this.sandboxedExecute(moduleId, inputData);\n }\n\n private sandboxedExecute(\n moduleId: string,\n inputData: Record<string, unknown>,\n ): unknown {\n // Build restricted environment\n const env: Record<string, string> = {};\n for (const key of [\"PATH\", \"NODE_PATH\", \"LANG\", \"LC_ALL\"]) {\n if (process.env[key]) {\n env[key] = process.env[key]!;\n }\n }\n for (const [key, value] of Object.entries(process.env)) {\n if (key.startsWith(\"APCORE_\") && value) {\n env[key] = value;\n }\n }\n\n const tmpDir = fs.mkdtempSync(\n path.join(os.tmpdir(), \"apcore_sandbox_\"),\n );\n\n try {\n env.HOME = tmpDir;\n env.TMPDIR = tmpDir;\n\n const script = [\n \"let d='';\",\n \"process.stdin.setEncoding('utf-8');\",\n \"process.stdin.on('data',c=>d+=c);\",\n \"process.stdin.on('end',()=>{\",\n \" const input=JSON.parse(d);\",\n ` process.stdout.write(JSON.stringify({error:\"Sandbox runner not yet implemented for module: ${moduleId}\"}));`,\n \"});\",\n ].join(\"\");\n\n const result = child_process.execFileSync(\n process.execPath,\n [\"-e\", script],\n {\n input: JSON.stringify(inputData),\n env,\n cwd: tmpDir,\n timeout: 300_000,\n maxBuffer: 10 * 1024 * 1024,\n },\n );\n\n return JSON.parse(result.toString(\"utf-8\"));\n } catch (err: unknown) {\n if (\n err instanceof Error &&\n \"killed\" in err &&\n (err as Record<string, unknown>).killed\n ) {\n throw new ModuleExecutionError(\n `Error: Module '${moduleId}' timed out in sandbox.`,\n );\n }\n const stderr =\n err instanceof Error && \"stderr\" in err\n ? String((err as Record<string, unknown>).stderr)\n : String(err);\n throw new ModuleExecutionError(\n `Error: Module '${moduleId}' execution failed: ${stderr}`,\n );\n } finally {\n try {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // Best effort cleanup\n }\n }\n }\n}\n","/**\n * Security module re-exports.\n *\n * Protocol spec: Security subsystem\n */\n\nexport { AuditLogger, setAuditLogger, getAuditLogger } from \"./audit.js\";\nexport { AuthProvider } from \"./auth.js\";\nexport { ConfigEncryptor } from \"./config-encryptor.js\";\nexport { Sandbox } from \"./sandbox.js\";\n","/**\n * apcore-cli — Public API exports.\n *\n * This module re-exports the public surface of the apcore CLI package.\n */\n\n// Core CLI\nexport { createCli, main, buildModuleCommand, validateModuleId, collectInput, reconvertEnumValues, applyToolkitIntegration, verboseHelp, setVerboseHelp, docsUrl, setDocsUrl } from \"./main.js\";\nexport type { OptionConfig } from \"./main.js\";\n\n// Lazy module loading\nexport { LazyModuleGroup, GroupedModuleGroup, LazyGroup, BUILTIN_COMMANDS } from \"./cli.js\";\nexport type { Registry, Executor, ModuleDescriptor } from \"./cli.js\";\n\n// Display helpers\nexport { getDisplay, getCliDisplayFields } from \"./display-helpers.js\";\n\n// Init command\nexport { registerInitCommand } from \"./init-cmd.js\";\n\n// Configuration\nexport { ConfigResolver, DEFAULTS, registerConfigNamespace } from \"./config.js\";\n\n// Discovery\nexport { registerDiscoveryCommands } from \"./discovery.js\";\n\n// Output formatting\nexport { formatExecResult, resolveFormat, truncate, formatModuleList, formatModuleDetail } from \"./output.js\";\n\n// Schema handling\nexport { resolveRefs } from \"./ref-resolver.js\";\nexport { schemaToCliOptions, mapType, extractHelp } from \"./schema-parser.js\";\n\n// Approval\nexport { checkApproval } from \"./approval.js\";\n\n// Shell integration\nexport { registerShellCommands, buildProgramManPage, configureManHelp } from \"./shell.js\";\n\n// Errors\nexport {\n ApprovalTimeoutError,\n ApprovalDeniedError,\n AuthenticationError,\n ConfigDecryptionError,\n ModuleExecutionError,\n ModuleNotFoundError,\n SchemaValidationError,\n EXIT_CODES,\n exitCodeForError,\n} from \"./errors.js\";\nexport type { ExitCode } from \"./errors.js\";\n\n// Logger\nexport { setLogLevel, getLogLevel, debug, info, warn, error } from \"./logger.js\";\n\n// Security\nexport { AuditLogger, setAuditLogger, getAuditLogger, AuthProvider, ConfigEncryptor, Sandbox } from \"./security/index.js\";\n","/**\n * CLI entry point — createCli / main equivalents.\n *\n * Protocol spec: CLI bootstrapping & command registration\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport * as path from \"node:path\";\nimport { Command, CommanderError, Option } from \"commander\";\nimport { EXIT_CODES, exitCodeForError } from \"./errors.js\";\nimport { resolveRefs } from \"./ref-resolver.js\";\nimport { schemaToCliOptions } from \"./schema-parser.js\";\nimport { checkApproval } from \"./approval.js\";\nimport { formatExecResult } from \"./output.js\";\nimport { setLogLevel } from \"./logger.js\";\nimport { registerInitCommand } from \"./init-cmd.js\";\nimport { getDisplay } from \"./display-helpers.js\";\nimport { registerConfigNamespace } from \"./config.js\";\nimport { configureManHelp } from \"./shell.js\";\nimport type { Executor, ModuleDescriptor } from \"./cli.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/** Whether --verbose was passed (controls help detail level). */\nexport let verboseHelp = false;\n\n/** Set the verbose help flag. When false, built-in options are hidden from help. */\nexport function setVerboseHelp(verbose: boolean): void {\n verboseHelp = verbose;\n}\n\n/** Base URL for online documentation. Null means no docs link shown. */\nexport let docsUrl: string | null = null;\n\n/**\n * Set the base URL for online documentation links shown in help and man pages.\n * Pass null to disable. Command-level help appends `/commands/{name}` automatically.\n *\n * @example setDocsUrl(\"https://docs.apcore.dev/cli\");\n */\nexport function setDocsUrl(url: string | null): void {\n docsUrl = url;\n}\n\n/** Check if --verbose is present in process.argv (pre-parse, before Commander). */\nfunction hasVerboseFlag(): boolean {\n return process.argv.includes(\"--verbose\");\n}\n\nlet VERSION = \"0.0.0\";\ntry {\n const pkg = JSON.parse(readFileSync(path.resolve(__dirname, \"../package.json\"), \"utf-8\"));\n VERSION = pkg.version;\n} catch {\n // Bundled environments (e.g., Bun compile) may not have package.json accessible\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Configuration for a single Commander option derived from a JSON Schema property. */\nexport interface OptionConfig {\n /** The property name from the schema. */\n name: string;\n /** Commander flags string (e.g. \"--my-flag <value>\" or \"--flag, --no-flag\"). */\n flags: string;\n /** Help text for the option. */\n description: string;\n /** Default value. */\n defaultValue?: unknown;\n /** Whether the field is required (for display only). */\n required: boolean;\n /** Enum choices (string values). */\n choices?: string[];\n /** Whether this is a boolean flag pair (--flag/--no-flag). */\n isBooleanFlag?: boolean;\n /** Maps string enum value → original type name (\"int\", \"float\", \"bool\"). */\n enumOriginalTypes?: Record<string, string>;\n /** Parser function for Commander (e.g. parseInt, parseFloat). */\n parseArg?: (value: string) => unknown;\n}\n\n// ---------------------------------------------------------------------------\n// createCli\n// ---------------------------------------------------------------------------\n\n/**\n * Build and return the top-level Commander program.\n *\n * @param extensionsDir Path to the extensions directory (default: ./extensions)\n * @param progName Program name shown in help (default: apcore-cli)\n */\nexport function createCli(\n extensionsDir?: string,\n progName?: string,\n verbose = false,\n): Command {\n verboseHelp = verbose;\n // Register Config Bus namespace (apcore >= 0.15.0)\n registerConfigNamespace();\n // Resolve program name\n const resolvedProgName = progName ?? path.basename(process.argv[1] ?? \"apcore-cli\") ?? \"apcore-cli\";\n\n // Resolve log level\n const cliLogLevel = process.env.APCORE_CLI_LOGGING_LEVEL ?? process.env.APCORE_LOGGING_LEVEL ?? \"WARNING\";\n setLogLevel(cliLogLevel);\n\n const program = new Command(resolvedProgName)\n .exitOverride()\n .version(VERSION, \"--version\", `Show ${resolvedProgName} version`)\n .description(\"apcore CLI — execute apcore modules from the command line\")\n .option(\"--extensions-dir <path>\", \"Path to extensions directory\")\n .option(\"--commands-dir <path>\", \"Path to convention-based commands directory\")\n .option(\"--binding <path>\", \"Path to binding.yaml for display overlay\")\n .option(\"--log-level <level>\", \"Logging level (DEBUG|INFO|WARNING|ERROR)\", \"WARNING\")\n .option(\"--verbose\", \"Show all options in help output (including built-in apcore options)\");\n\n // NOTE: Full registry/executor wiring requires apcore-js to be available.\n // For now, extensions-dir is accepted but not wired to a real registry.\n const resolvedExtDir = extensionsDir\n ?? process.env.APCORE_EXTENSIONS_ROOT\n ?? \"./extensions\";\n void resolvedExtDir; // Will be used when apcore-js registry is wired\n\n // Footer hints for discoverability\n program.addHelpText(\"after\", [\n \"\",\n \"Use --help --verbose to show all options (including built-in apcore options).\",\n \"Use --help --man to display a formatted man page.\",\n ].join(\"\\n\"));\n\n // Register init command for scaffolding\n registerInitCommand(program);\n\n // Register --help --man support\n configureManHelp(program, resolvedProgName, VERSION);\n\n // Hook to apply optional toolkit integration before command execution.\n // Commander actions are async, so we can set up toolkit state lazily.\n program.hook(\"preAction\", async (thisCommand) => {\n const opts = thisCommand.opts();\n const commandsDir = opts.commandsDir as string | undefined;\n const bindingPath = opts.binding as string | undefined;\n await applyToolkitIntegration(commandsDir, bindingPath);\n });\n\n return program;\n}\n\n// ---------------------------------------------------------------------------\n// applyToolkitIntegration\n// ---------------------------------------------------------------------------\n\n/**\n * Optionally apply apcore-toolkit features (DisplayResolver, RegistryWriter).\n *\n * Uses dynamic import so the dependency remains optional — if apcore-toolkit\n * is not installed, a warning is printed and the CLI continues without it.\n */\nexport async function applyToolkitIntegration(\n commandsDir?: string,\n bindingPath?: string,\n): Promise<void> {\n if (!commandsDir && !bindingPath) {\n return;\n }\n\n try {\n // Use a variable to prevent TypeScript from resolving the module at build time\n const toolkitModule = \"apcore-toolkit\";\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const toolkit = await import(/* @vite-ignore */ toolkitModule);\n\n // ConventionScanner is not yet available in the TypeScript toolkit\n if (commandsDir) {\n console.warn(\"Convention scanning not yet available in TypeScript toolkit\");\n }\n\n // DisplayResolver for binding overlay\n if (bindingPath) {\n const resolver = new toolkit.DisplayResolver();\n // NOTE: Full integration requires registered modules from apcore-js.\n // For now, the resolver is instantiated and ready for when modules\n // are available through the registry.\n void resolver;\n }\n } catch {\n // apcore-toolkit not installed — graceful fallback\n console.warn(\"apcore-toolkit not installed — toolkit features unavailable\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// main\n// ---------------------------------------------------------------------------\n\n/**\n * Parse argv and run the CLI. Handles top-level error catching and exit codes.\n */\nexport function main(progName?: string): void {\n verboseHelp = hasVerboseFlag();\n const program = createCli(undefined, progName, verboseHelp);\n\n try {\n program.parse(process.argv);\n } catch (error: unknown) {\n if (error instanceof CommanderError) {\n // Commander already printed the error message\n process.exit(error.exitCode);\n }\n const code = exitCodeForError(error);\n if (error instanceof Error) {\n process.stderr.write(`Error: ${error.message}\\n`);\n }\n process.exit(code);\n }\n}\n\n// ---------------------------------------------------------------------------\n// buildModuleCommand\n// ---------------------------------------------------------------------------\n\n/**\n * Build a Commander Command for a single apcore module.\n */\nexport function buildModuleCommand(\n moduleDef: ModuleDescriptor,\n executor: Executor,\n helpTextMaxLength = 1000,\n cmdName?: string,\n verbose = verboseHelp,\n): Command {\n const moduleId = moduleDef.id;\n let resolvedSchema: Record<string, unknown> = {};\n let schemaOptions: OptionConfig[] = [];\n\n // Resolve display overlay fields\n const display = getDisplay(moduleDef);\n const cliDisplay = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const effectiveCmdName: string = cmdName ?? (cliDisplay.alias as string | undefined) ?? moduleId;\n const cmdHelp: string = (cliDisplay.description as string | undefined) ?? moduleDef.description;\n\n // Resolve schema\n const inputSchema = moduleDef.inputSchema;\n if (inputSchema && typeof inputSchema === \"object\" && inputSchema.properties) {\n try {\n resolvedSchema = resolveRefs(inputSchema, 32, moduleId);\n } catch {\n resolvedSchema = inputSchema;\n }\n schemaOptions = schemaToCliOptions(resolvedSchema, helpTextMaxLength);\n }\n\n const cmd = new Command(effectiveCmdName).description(cmdHelp);\n\n // Built-in options (hidden unless --verbose)\n const inputOpt = new Option(\"--input <source>\", \"Read JSON input from a file path, or use '-' to read from stdin pipe\");\n const yesOpt = new Option(\"-y, --yes\", \"Skip interactive approval prompts (for scripts and CI)\").default(false);\n const largeInputOpt = new Option(\"--large-input\", \"Allow stdin input larger than 10MB (default limit protects against accidental pipes)\").default(false);\n const formatOpt = new Option(\"--format <format>\", \"Set output format: 'json' for machine-readable, 'table' for human-readable\");\n // --sandbox is always hidden (not yet implemented)\n const sandboxOpt = new Option(\"--sandbox\", \"Run module in an isolated subprocess with restricted filesystem and env access\").default(false).hideHelp();\n\n if (!verbose) {\n inputOpt.hideHelp();\n yesOpt.hideHelp();\n largeInputOpt.hideHelp();\n formatOpt.hideHelp();\n }\n\n cmd.addOption(inputOpt);\n cmd.addOption(yesOpt);\n cmd.addOption(largeInputOpt);\n cmd.addOption(formatOpt);\n cmd.addOption(sandboxOpt);\n\n // Help footer: verbose hint + optional docs link\n const footerParts: string[] = [];\n if (!verbose) {\n footerParts.push(\"Use --verbose to show all options (including built-in apcore options).\");\n }\n if (docsUrl) {\n footerParts.push(`Docs: ${docsUrl}/commands/${effectiveCmdName}`);\n }\n if (footerParts.length > 0) {\n cmd.addHelpText(\"after\", \"\\n\" + footerParts.join(\"\\n\") + \"\\n\");\n }\n\n // Schema-generated options\n for (const opt of schemaOptions) {\n if (opt.parseArg) {\n cmd.option(opt.flags, opt.description, opt.parseArg, opt.defaultValue);\n } else {\n cmd.option(opt.flags, opt.description, opt.defaultValue as string | boolean | undefined);\n }\n }\n\n // Action callback\n cmd.action(async (options: Record<string, unknown>) => {\n // Pop built-in options\n const stdinFlag = options.input as string | undefined;\n const autoApprove = options.yes as boolean;\n const largeInput = options.largeInput as boolean;\n const outputFormat = options.format as string | undefined;\n const sandboxEnabled = options.sandbox as boolean;\n\n // Remove built-in keys from options to get schema kwargs\n const schemaKwargs: Record<string, unknown> = {};\n const builtinKeys = new Set([\"input\", \"yes\", \"largeInput\", \"format\", \"sandbox\", \"verbose\"]);\n for (const [k, v] of Object.entries(options)) {\n if (!builtinKeys.has(k)) {\n schemaKwargs[k] = v;\n }\n }\n\n try {\n // Collect and merge input\n const merged = await collectInput(stdinFlag, schemaKwargs, largeInput);\n\n // Reconvert enum values\n const reconverted = reconvertEnumValues(merged, schemaOptions);\n\n // Check approval\n await checkApproval(moduleDef, autoApprove);\n\n // Execute with timing\n const { Sandbox } = await import(\"./security/index.js\");\n const sandbox = new Sandbox(sandboxEnabled);\n const startTime = performance.now();\n const result = await sandbox.execute(moduleId, reconverted, executor);\n const durationMs = Math.round(performance.now() - startTime);\n\n // Audit log (success)\n const { getAuditLogger } = await import(\"./security/audit.js\");\n const auditLogger = getAuditLogger();\n if (auditLogger) {\n auditLogger.logExecution(moduleId, reconverted, \"success\", 0, durationMs);\n }\n\n // Format output\n formatExecResult(result, outputFormat);\n } catch (err: unknown) {\n // Audit log (error)\n const { getAuditLogger } = await import(\"./security/audit.js\");\n const auditLogger = getAuditLogger();\n const code = exitCodeForError(err);\n if (auditLogger) {\n auditLogger.logExecution(moduleId, {}, \"error\", code, 0);\n }\n\n if (err instanceof Error) {\n process.stderr.write(`Error: ${err.message}\\n`);\n }\n process.exit(code);\n }\n });\n\n return cmd;\n}\n\n// ---------------------------------------------------------------------------\n// validateModuleId\n// ---------------------------------------------------------------------------\n\n/**\n * Validate that a module ID conforms to the expected format.\n * Pattern: [a-z][a-z0-9_]*(.[a-z][a-z0-9_])* — max 128 chars.\n */\nexport function validateModuleId(moduleId: string): void {\n if (moduleId.length > 128) {\n process.stderr.write(\n `Error: Invalid module ID format: '${moduleId}'. Maximum length is 128 characters.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n if (!/^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)*$/.test(moduleId)) {\n process.stderr.write(\n `Error: Invalid module ID format: '${moduleId}'.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n}\n\n// ---------------------------------------------------------------------------\n// collectInput\n// ---------------------------------------------------------------------------\n\n/**\n * Collect module input from stdin and/or CLI keyword arguments.\n */\nexport async function collectInput(\n stdinFlag?: string,\n cliKwargs: Record<string, unknown> = {},\n largeInput?: boolean,\n): Promise<Record<string, unknown>> {\n // Remove null/undefined values from CLI kwargs\n const cliKwargsNonNull: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(cliKwargs)) {\n if (v !== null && v !== undefined) {\n cliKwargsNonNull[k] = v;\n }\n }\n\n if (!stdinFlag) {\n return cliKwargsNonNull;\n }\n\n if (stdinFlag === \"-\") {\n const raw = await readStdin();\n const rawSize = Buffer.byteLength(raw, \"utf-8\");\n\n if (rawSize > 10_485_760 && !largeInput) {\n process.stderr.write(\n \"Error: STDIN input exceeds 10MB limit. Use --large-input to override.\\n\",\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n if (!raw) {\n return cliKwargsNonNull;\n }\n\n let stdinData: unknown;\n try {\n stdinData = JSON.parse(raw);\n } catch {\n process.stderr.write(\n \"Error: STDIN does not contain valid JSON.\\n\",\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n if (typeof stdinData !== \"object\" || stdinData === null || Array.isArray(stdinData)) {\n process.stderr.write(\n `Error: STDIN JSON must be an object, got ${Array.isArray(stdinData) ? \"array\" : typeof stdinData}.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n // CLI flags override STDIN for duplicate keys\n return { ...(stdinData as Record<string, unknown>), ...cliKwargsNonNull };\n }\n\n return cliKwargsNonNull;\n}\n\n/**\n * Read all data from stdin with proper cleanup.\n */\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n const onData = (chunk: Buffer) => chunks.push(chunk);\n const onEnd = () => {\n cleanup();\n resolve(Buffer.concat(chunks).toString(\"utf-8\"));\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const cleanup = () => {\n process.stdin.removeListener(\"data\", onData);\n process.stdin.removeListener(\"end\", onEnd);\n process.stdin.removeListener(\"error\", onError);\n };\n process.stdin.on(\"data\", onData);\n process.stdin.on(\"end\", onEnd);\n process.stdin.on(\"error\", onError);\n process.stdin.resume();\n });\n}\n\n// ---------------------------------------------------------------------------\n// reconvertEnumValues\n// ---------------------------------------------------------------------------\n\n/**\n * Re-convert CLI string values back to their schema-typed equivalents\n * based on the option configs.\n */\nexport function reconvertEnumValues(\n kwargs: Record<string, unknown>,\n options: OptionConfig[],\n): Record<string, unknown> {\n const result = { ...kwargs };\n for (const opt of options) {\n if (!opt.enumOriginalTypes) continue;\n const paramName = opt.name;\n if (!(paramName in result) || result[paramName] === null || result[paramName] === undefined) {\n continue;\n }\n const strVal = String(result[paramName]);\n const origType = opt.enumOriginalTypes[strVal];\n if (origType === \"int\") {\n result[paramName] = parseInt(strVal, 10);\n } else if (origType === \"float\") {\n result[paramName] = parseFloat(strVal);\n } else if (origType === \"bool\") {\n result[paramName] = strVal.toLowerCase() === \"true\";\n }\n }\n return result;\n}\n","/**\n * JSON Schema $ref resolver.\n *\n * Protocol spec: Schema resolution & $ref handling\n */\n\nimport { EXIT_CODES } from \"./errors.js\";\n\n// ---------------------------------------------------------------------------\n// resolveRefs\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve all $ref references in a JSON Schema.\n * Returns a fully inlined schema with $defs/definitions removed.\n */\nexport function resolveRefs(\n schema: Record<string, unknown>,\n maxDepth = 32,\n moduleId = \"\",\n): Record<string, unknown> {\n const cloned = structuredClone(schema);\n const defs = (cloned.$defs ?? cloned.definitions ?? {}) as Record<\n string,\n unknown\n >;\n const result = resolveNode(\n cloned,\n defs,\n new Set<string>(),\n 0,\n maxDepth,\n moduleId,\n ) as Record<string, unknown>;\n\n // Remove definition keys\n delete result.$defs;\n delete result.definitions;\n return result;\n}\n\nfunction resolveNode(\n node: unknown,\n defs: Record<string, unknown>,\n visited: Set<string>,\n depth: number,\n maxDepth: number,\n moduleId: string,\n): unknown {\n if (typeof node !== \"object\" || node === null || Array.isArray(node)) {\n return node;\n }\n\n const obj = node as Record<string, unknown>;\n\n // Handle $ref\n if (\"$ref\" in obj) {\n const refPath = obj.$ref as string;\n\n if (depth >= maxDepth) {\n process.stderr.write(\n `Error: $ref resolution depth exceeded maximum of ${maxDepth} for module '${moduleId}'.\\n`,\n );\n process.exit(EXIT_CODES.SCHEMA_CIRCULAR_REF);\n }\n\n if (visited.has(refPath)) {\n process.stderr.write(\n `Error: Circular $ref detected in schema for module '${moduleId}' at path '${refPath}'.\\n`,\n );\n process.exit(EXIT_CODES.SCHEMA_CIRCULAR_REF);\n }\n\n // Parse ref target: extract key from \"#/$defs/Address\" → \"Address\"\n const parts = refPath.split(\"/\");\n const key = parts[parts.length - 1];\n\n if (!(key in defs)) {\n process.stderr.write(\n `Error: Unresolvable $ref '${refPath}' in schema for module '${moduleId}'.\\n`,\n );\n process.exit(EXIT_CODES.SCHEMA_VALIDATION_ERROR);\n }\n\n const newVisited = new Set(visited);\n newVisited.add(refPath);\n return resolveNode(defs[key], defs, newVisited, depth + 1, maxDepth, moduleId);\n }\n\n // Handle allOf\n if (\"allOf\" in obj && Array.isArray(obj.allOf)) {\n const merged: Record<string, unknown> = {\n properties: {},\n required: [] as string[],\n };\n for (const subSchema of obj.allOf as unknown[]) {\n const resolved = resolveNode(\n subSchema,\n defs,\n visited,\n depth + 1,\n maxDepth,\n moduleId,\n ) as Record<string, unknown>;\n if (resolved.properties) {\n Object.assign(\n merged.properties as Record<string, unknown>,\n resolved.properties,\n );\n }\n if (Array.isArray(resolved.required)) {\n (merged.required as string[]).push(...resolved.required);\n }\n }\n // Deduplicate required\n merged.required = [...new Set(merged.required as string[])];\n // Copy non-composition keys\n for (const [k, v] of Object.entries(obj)) {\n if (k !== \"allOf\" && !(k in merged)) {\n merged[k] = v;\n }\n }\n return merged;\n }\n\n // Handle anyOf / oneOf\n for (const keyword of [\"anyOf\", \"oneOf\"]) {\n if (keyword in obj && Array.isArray(obj[keyword])) {\n const merged: Record<string, unknown> = {\n properties: {},\n required: [] as string[],\n };\n const allRequiredSets: Set<string>[] = [];\n for (const subSchema of obj[keyword] as unknown[]) {\n const resolved = resolveNode(\n subSchema,\n defs,\n visited,\n depth + 1,\n maxDepth,\n moduleId,\n ) as Record<string, unknown>;\n if (resolved.properties) {\n Object.assign(\n merged.properties as Record<string, unknown>,\n resolved.properties,\n );\n }\n if (Array.isArray(resolved.required)) {\n allRequiredSets.push(new Set(resolved.required as string[]));\n }\n }\n // Required = intersection of all branches\n if (allRequiredSets.length > 0) {\n let intersection = allRequiredSets[0];\n for (let i = 1; i < allRequiredSets.length; i++) {\n intersection = new Set(\n [...intersection].filter((x) => allRequiredSets[i].has(x)),\n );\n }\n merged.required = [...intersection];\n } else {\n merged.required = [];\n }\n // Copy non-composition keys\n for (const [k, v] of Object.entries(obj)) {\n if (k !== keyword && !(k in merged)) {\n merged[k] = v;\n }\n }\n return merged;\n }\n }\n\n // Recursively process nested properties\n if (\"properties\" in obj && typeof obj.properties === \"object\" && obj.properties !== null) {\n const props = obj.properties as Record<string, unknown>;\n for (const [propName, propSchema] of Object.entries(props)) {\n props[propName] = resolveNode(\n propSchema,\n defs,\n visited,\n depth + 1,\n maxDepth,\n moduleId,\n );\n }\n }\n\n return obj;\n}\n","/**\n * JSON Schema -> Commander options mapping.\n *\n * Protocol spec: Schema-driven argument parsing\n */\n\nimport type { OptionConfig } from \"./main.js\";\nimport { EXIT_CODES } from \"./errors.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Sentinel type marker for boolean flags. */\nconst BOOLEAN_FLAG = Symbol(\"BOOLEAN_FLAG\");\n\ntype TypeResult = \"string\" | \"int\" | \"float\" | typeof BOOLEAN_FLAG | \"file\";\n\n/**\n * Map JSON Schema type to a type identifier.\n */\nexport function mapType(propName: string, propSchema: Record<string, unknown>): TypeResult {\n const schemaType = propSchema.type as string | undefined;\n\n // Check file convention\n if (\n schemaType === \"string\" &&\n (propName.endsWith(\"_file\") || propSchema[\"x-cli-file\"] === true)\n ) {\n return \"file\";\n }\n\n const typeMap: Record<string, TypeResult> = {\n string: \"string\",\n integer: \"int\",\n number: \"float\",\n boolean: BOOLEAN_FLAG,\n object: \"string\",\n array: \"string\",\n };\n\n if (!schemaType) {\n return \"string\";\n }\n\n return typeMap[schemaType] ?? \"string\";\n}\n\n/**\n * Extract help text from schema property, preferring x-llm-description.\n */\nexport function extractHelp(propSchema: Record<string, unknown>, maxLength = 1000): string | undefined {\n let text = propSchema[\"x-llm-description\"] as string | undefined;\n if (!text) {\n text = propSchema.description as string | undefined;\n }\n if (!text) {\n return undefined;\n }\n if (maxLength > 0 && text.length > maxLength) {\n return text.slice(0, maxLength - 3) + \"...\";\n }\n return text;\n}\n\n// ---------------------------------------------------------------------------\n// schemaToCliOptions\n// ---------------------------------------------------------------------------\n\n/** Reserved CLI option names that cannot be used by schema properties. */\nconst RESERVED_NAMES = new Set([\"input\", \"yes\", \"large_input\", \"format\", \"sandbox\"]);\n\n/**\n * Convert a JSON Schema `properties` object into an array of\n * Commander option configurations.\n */\nexport function schemaToCliOptions(\n schema: Record<string, unknown>,\n maxHelpLength = 1000,\n): OptionConfig[] {\n const properties = (schema.properties ?? {}) as Record<\n string,\n Record<string, unknown>\n >;\n const requiredList = (schema.required ?? []) as string[];\n const options: OptionConfig[] = [];\n const flagNames: Record<string, string> = {};\n\n for (const [propName, propSchema] of Object.entries(properties)) {\n const flagName = \"--\" + propName.replace(/_/g, \"-\");\n\n // Collision detection\n if (flagName in flagNames) {\n process.stderr.write(\n `Error: Flag name collision: properties '${propName}' and '${flagNames[flagName]}' both map to '${flagName}'.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n flagNames[flagName] = propName;\n\n // Reserved name check\n if (RESERVED_NAMES.has(propName)) {\n process.stderr.write(\n `Error: Module schema property '${propName}' conflicts with a reserved CLI option name. Rename the property.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n const typeResult = mapType(propName, propSchema);\n const isRequired = requiredList.includes(propName);\n const helpBase = extractHelp(propSchema, maxHelpLength);\n const helpText = isRequired\n ? (helpBase ? helpBase + \" \" : \"\") + \"[required]\"\n : helpBase ?? \"\";\n const defaultValue = propSchema.default as unknown;\n\n if (typeResult === BOOLEAN_FLAG) {\n // Boolean flag pair: --flag/--no-flag\n const flagBase = propName.replace(/_/g, \"-\");\n const defaultVal = (propSchema.default as boolean) ?? false;\n options.push({\n name: propName,\n flags: `--${flagBase}, --no-${flagBase}`,\n description: helpText,\n defaultValue: defaultVal,\n required: false,\n isBooleanFlag: true,\n });\n } else if (\"enum\" in propSchema && Array.isArray(propSchema.enum)) {\n const enumValues = propSchema.enum as unknown[];\n if (enumValues.length === 0) {\n // Empty enum — fall back to plain string option\n options.push({\n name: propName,\n flags: `${flagName} <value>`,\n description: helpText,\n defaultValue,\n required: false,\n });\n } else {\n const stringValues = enumValues.map(String);\n const enumOriginalTypes: Record<string, string> = {};\n for (const v of enumValues) {\n if (typeof v === \"number\" && Number.isInteger(v)) {\n enumOriginalTypes[String(v)] = \"int\";\n } else if (typeof v === \"number\") {\n enumOriginalTypes[String(v)] = \"float\";\n } else if (typeof v === \"boolean\") {\n enumOriginalTypes[String(v)] = \"bool\";\n }\n }\n options.push({\n name: propName,\n flags: `${flagName} <value>`,\n description: helpText,\n defaultValue:\n defaultValue !== undefined ? String(defaultValue) : undefined,\n required: false,\n choices: stringValues,\n enumOriginalTypes:\n Object.keys(enumOriginalTypes).length > 0\n ? enumOriginalTypes\n : undefined,\n });\n }\n } else {\n // Standard option\n let parseArg: ((value: string) => unknown) | undefined;\n if (typeResult === \"int\") {\n parseArg = (v: string) => {\n const n = parseInt(v, 10);\n if (isNaN(n)) throw new Error(`Invalid integer: ${v}`);\n return n;\n };\n } else if (typeResult === \"float\") {\n parseArg = (v: string) => {\n const n = parseFloat(v);\n if (isNaN(n)) throw new Error(`Invalid number: ${v}`);\n return n;\n };\n }\n options.push({\n name: propName,\n flags: `${flagName} <value>`,\n description: helpText,\n defaultValue,\n required: false,\n parseArg,\n });\n }\n }\n\n return options;\n}\n","/**\n * Interactive approval prompts with timeout.\n *\n * Protocol spec: Approval workflow\n */\n\nimport * as readline from \"node:readline\";\nimport type { ModuleDescriptor } from \"./cli.js\";\nimport { ApprovalTimeoutError, EXIT_CODES } from \"./errors.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get an annotation value from either a dict or an object.\n */\nfunction getAnnotation(\n annotations: unknown,\n key: string,\n defaultValue: unknown = undefined,\n): unknown {\n if (!annotations || typeof annotations !== \"object\") return defaultValue;\n const ann = annotations as Record<string, unknown>;\n return key in ann ? ann[key] : defaultValue;\n}\n\n// ---------------------------------------------------------------------------\n// checkApproval\n// ---------------------------------------------------------------------------\n\n/**\n * Check if module requires approval and handle accordingly.\n * Returns normally if approved (or approval not required).\n * Calls process.exit(46) if denied/timed out/non-TTY.\n */\nexport async function checkApproval(\n moduleDef: ModuleDescriptor,\n autoApprove: boolean,\n): Promise<void> {\n const annotations = moduleDef.annotations;\n\n // Check if approval is required\n let requiresApproval: boolean;\n if (moduleDef.requiresApproval !== undefined) {\n requiresApproval = moduleDef.requiresApproval;\n } else if (annotations) {\n requiresApproval = getAnnotation(annotations, \"requires_approval\", false) === true;\n } else {\n return; // No annotations, no approval needed\n }\n\n if (!requiresApproval) {\n return;\n }\n\n const moduleId = moduleDef.id;\n\n // Bypass: autoApprove flag (highest priority)\n if (autoApprove) {\n return;\n }\n\n // Bypass: APCORE_CLI_AUTO_APPROVE env var\n const envVal = process.env.APCORE_CLI_AUTO_APPROVE ?? \"\";\n if (envVal === \"1\") {\n return;\n }\n if (envVal !== \"\" && envVal !== \"1\") {\n process.stderr.write(\n `Warning: APCORE_CLI_AUTO_APPROVE is set to '${envVal}', expected '1'. Ignoring.\\n`,\n );\n }\n\n // Non-TTY check\n if (!process.stdin.isTTY) {\n process.stderr.write(\n `Error: Module '${moduleId}' requires approval but no interactive ` +\n \"terminal is available. Use --yes or set APCORE_CLI_AUTO_APPROVE=1 \" +\n \"to bypass.\\n\",\n );\n process.exit(EXIT_CODES.APPROVAL_DENIED);\n }\n\n // TTY prompt\n await promptWithTimeout(moduleDef, 60);\n}\n\n/**\n * Display approval prompt with timeout.\n */\nasync function promptWithTimeout(\n moduleDef: ModuleDescriptor,\n timeout: number,\n): Promise<void> {\n // Clamp timeout\n timeout = Math.max(1, Math.min(timeout, 3600));\n\n const moduleId = moduleDef.id;\n const annotations = moduleDef.annotations;\n const message =\n (annotations\n ? (getAnnotation(annotations, \"approval_message\") as string | undefined)\n : undefined) ??\n `Module '${moduleId}' requires approval to execute.`;\n\n process.stderr.write(message + \"\\n\");\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n const answer = await Promise.race([\n new Promise<string>((resolve) => {\n rl.question(\"Proceed? [y/N] \", (ans) => resolve(ans));\n }),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(new ApprovalTimeoutError(\n `Approval prompt timed out after ${timeout} seconds.`,\n ));\n }, timeout * 1000);\n }),\n ]);\n\n // Clear the timeout — prompt resolved before timeout fired\n if (timer) clearTimeout(timer);\n\n const normalized = answer.trim().toLowerCase();\n if (normalized === \"y\" || normalized === \"yes\") {\n return;\n }\n\n process.stderr.write(\"Error: Approval denied.\\n\");\n process.exit(EXIT_CODES.APPROVAL_DENIED);\n } catch (err) {\n if (timer) clearTimeout(timer);\n if (err instanceof ApprovalTimeoutError) {\n process.stderr.write(\n `Error: Approval prompt timed out after ${timeout} seconds.\\n`,\n );\n process.exit(EXIT_CODES.APPROVAL_TIMEOUT);\n }\n throw err;\n } finally {\n rl.close();\n }\n}\n","/**\n * TTY-adaptive output formatting (table/json).\n *\n * Protocol spec: Output formatting\n */\n\nimport type { ModuleDescriptor } from \"./cli.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve output format with TTY-adaptive default.\n */\nexport function resolveFormat(explicitFormat?: string): string {\n if (explicitFormat !== undefined) {\n return explicitFormat;\n }\n return process.stdout.isTTY ? \"table\" : \"json\";\n}\n\n/**\n * Truncate text to maxLength, appending '...' if needed.\n */\nexport function truncate(text: string, maxLength = 80): string {\n if (text.length <= maxLength) {\n return text;\n }\n return text.slice(0, maxLength - 3) + \"...\";\n}\n\n/**\n * Render a simple plain-text table with column headers.\n */\nfunction formatTable(\n headers: string[],\n rows: string[][],\n): string {\n // Calculate column widths\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").length)),\n );\n\n const sep = colWidths.map((w) => \"-\".repeat(w)).join(\" \");\n const headerLine = headers\n .map((h, i) => h.padEnd(colWidths[i]))\n .join(\" \");\n const dataLines = rows.map((row) =>\n row.map((cell, i) => (cell ?? \"\").padEnd(colWidths[i])).join(\" \"),\n );\n\n return [headerLine, sep, ...dataLines].join(\"\\n\") + \"\\n\";\n}\n\n// ---------------------------------------------------------------------------\n// formatModuleList\n// ---------------------------------------------------------------------------\n\n/**\n * Format and print a list of modules.\n */\nexport function formatModuleList(\n modules: ModuleDescriptor[],\n format: string,\n filterTags?: string[],\n): void {\n if (format === \"table\") {\n if (modules.length === 0 && filterTags && filterTags.length > 0) {\n process.stdout.write(\n `No modules found matching tags: ${filterTags.join(\", \")}.\\n`,\n );\n return;\n }\n if (modules.length === 0) {\n process.stdout.write(\"No modules found.\\n\");\n return;\n }\n\n const headers = [\"ID\", \"Description\", \"Tags\"];\n const rows = modules.map((m) => [\n m.id,\n truncate(m.description, 80),\n (m.tags ?? []).join(\", \"),\n ]);\n process.stdout.write(formatTable(headers, rows));\n } else if (format === \"json\") {\n const result = modules.map((m) => ({\n id: m.id,\n description: m.description,\n tags: m.tags ?? [],\n }));\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// formatModuleDetail\n// ---------------------------------------------------------------------------\n\n/**\n * Convert annotations to a plain dict, filtering out falsy/default values.\n */\nfunction annotationsToDict(\n annotations: unknown,\n): Record<string, unknown> | null {\n if (!annotations) return null;\n if (typeof annotations !== \"object\" || Array.isArray(annotations)) return null;\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(annotations as Record<string, unknown>)) {\n if (v !== null && v !== undefined && v !== false && v !== 0 && !(Array.isArray(v) && v.length === 0)) {\n result[k] = v;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\n/**\n * Format and print full module metadata.\n */\nexport function formatModuleDetail(\n moduleDef: ModuleDescriptor,\n format: string,\n): void {\n if (format === \"table\") {\n process.stdout.write(`\\nModule: ${moduleDef.id}\\n`);\n process.stdout.write(`\\nDescription:\\n ${moduleDef.description}\\n`);\n\n if (moduleDef.inputSchema && Object.keys(moduleDef.inputSchema).length > 0) {\n process.stdout.write(\"\\nInput Schema:\\n\");\n process.stdout.write(JSON.stringify(moduleDef.inputSchema, null, 2) + \"\\n\");\n }\n\n if (moduleDef.outputSchema && Object.keys(moduleDef.outputSchema).length > 0) {\n process.stdout.write(\"\\nOutput Schema:\\n\");\n process.stdout.write(JSON.stringify(moduleDef.outputSchema, null, 2) + \"\\n\");\n }\n\n const annDict = annotationsToDict(\n moduleDef.annotations,\n );\n if (annDict) {\n process.stdout.write(\"\\nAnnotations:\\n\");\n for (const [k, v] of Object.entries(annDict)) {\n process.stdout.write(` ${k}: ${v}\\n`);\n }\n }\n\n // Extension metadata (x- prefixed)\n const metadata = moduleDef.metadata;\n if (metadata) {\n const xFields: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(metadata)) {\n if (k.startsWith(\"x-\") || k.startsWith(\"x_\")) {\n xFields[k] = v;\n }\n }\n if (Object.keys(xFields).length > 0) {\n process.stdout.write(\"\\nExtension Metadata:\\n\");\n for (const [k, v] of Object.entries(xFields)) {\n process.stdout.write(` ${k}: ${v}\\n`);\n }\n }\n }\n\n const tags = moduleDef.tags ?? [];\n if (tags.length > 0) {\n process.stdout.write(`\\nTags: ${tags.join(\", \")}\\n`);\n }\n } else if (format === \"json\") {\n const result: Record<string, unknown> = {\n id: moduleDef.id,\n description: moduleDef.description,\n };\n if (moduleDef.inputSchema) result.input_schema = moduleDef.inputSchema;\n if (moduleDef.outputSchema) result.output_schema = moduleDef.outputSchema;\n\n const annDict = annotationsToDict(\n moduleDef.annotations,\n );\n if (annDict) result.annotations = annDict;\n\n const tags = moduleDef.tags ?? [];\n if (tags.length > 0) result.tags = tags;\n\n // Extension metadata\n const metadata = moduleDef.metadata;\n if (metadata) {\n for (const [k, v] of Object.entries(metadata)) {\n if (k.startsWith(\"x-\") || k.startsWith(\"x_\")) {\n result[k] = v;\n }\n }\n }\n\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// formatExecResult\n// ---------------------------------------------------------------------------\n\n/**\n * Format and print module execution result.\n */\nexport function formatExecResult(\n result: unknown,\n format?: string,\n): void {\n if (result === null || result === undefined) {\n return;\n }\n const effective = resolveFormat(format);\n if (\n effective === \"table\" &&\n typeof result === \"object\" &&\n !Array.isArray(result)\n ) {\n // Key-value table\n const entries = Object.entries(result as Record<string, unknown>);\n const headers = [\"Key\", \"Value\"];\n const rows = entries.map(([k, v]) => [String(k), String(v)]);\n process.stdout.write(formatTable(headers, rows));\n } else if (typeof result === \"object\") {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else if (typeof result === \"string\") {\n process.stdout.write(result + \"\\n\");\n } else {\n process.stdout.write(String(result) + \"\\n\");\n }\n}\n","/**\n * Simple structured logger respecting logging.level config.\n */\n\nconst LEVELS = { DEBUG: 0, INFO: 1, WARNING: 2, ERROR: 3 } as const;\ntype LogLevel = keyof typeof LEVELS;\n\nlet currentLevel: LogLevel = \"WARNING\";\n\nexport function setLogLevel(level: string): void {\n const upper = level.toUpperCase();\n if (upper in LEVELS) {\n currentLevel = upper as LogLevel;\n }\n}\n\nexport function getLogLevel(): LogLevel {\n return currentLevel;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LEVELS[level] >= LEVELS[currentLevel];\n}\n\nexport function debug(message: string): void {\n if (shouldLog(\"DEBUG\")) process.stderr.write(`DEBUG: ${message}\\n`);\n}\n\nexport function info(message: string): void {\n if (shouldLog(\"INFO\")) process.stderr.write(`INFO: ${message}\\n`);\n}\n\nexport function warn(message: string): void {\n if (shouldLog(\"WARNING\")) process.stderr.write(`WARNING: ${message}\\n`);\n}\n\nexport function error(message: string): void {\n if (shouldLog(\"ERROR\")) process.stderr.write(`ERROR: ${message}\\n`);\n}\n","/**\n * Init command — scaffold new apcore modules (Phase 1).\n */\n\nimport { Command } from \"commander\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nconst DECORATOR_TEMPLATE = `\\\nimport { module } from \"apcore-js\";\nimport { Type } from \"@sinclair/typebox\";\n\nexport const {varName} = module({\n id: \"{moduleId}\",\n description: \"{description}\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({ status: Type.String() }),\n execute: (_inputs) => {\n // TODO: implement\n return { status: \"ok\" };\n },\n});\n`;\n\nconst CONVENTION_TEMPLATE = `\\\n/**\n * {description}\n */\n{cliGroupLine}\nexport function {funcName}(): Record<string, unknown> {\n // TODO: implement\n return { status: \"ok\" };\n}\n`;\n\nconst BINDING_TEMPLATE = `\\\nbindings:\n - module_id: \"{moduleId}\"\n target: \"{target}\"\n description: \"{description}\"\n auto_schema: true\n`;\n\n/**\n * Simple template rendering: replaces {key} with values from the context.\n */\nfunction renderTemplate(template: string, context: Record<string, string>): string {\n let result = template;\n for (const [key, value] of Object.entries(context)) {\n // Replace all occurrences of {key} with the value\n result = result.split(`{${key}}`).join(value);\n }\n return result;\n}\n\n/**\n * Register the init command group on the CLI program.\n */\nexport function registerInitCommand(cli: Command): void {\n const initGroup = cli.command(\"init\").description(\"Scaffold new apcore modules.\");\n\n initGroup\n .command(\"module <module-id>\")\n .description(\"Create a new module from a template.\\n\\nMODULE_ID is the module identifier (e.g., ops.deploy, user.create).\")\n .option(\n \"--style <style>\",\n \"Module style: decorator (@module), convention (plain function), or binding (YAML).\",\n \"convention\",\n )\n .option(\"--dir <path>\", \"Output directory. Default: extensions/ or commands/.\")\n .option(\"-d, --description <text>\", \"Module description.\", \"TODO: add description\")\n .action((moduleId: string, opts: { style: string; dir?: string; description: string }) => {\n // Parse module_id into parts\n const lastDot = moduleId.lastIndexOf(\".\");\n const prefix = lastDot >= 0 ? moduleId.substring(0, lastDot) : moduleId;\n const funcName = lastDot >= 0 ? moduleId.substring(lastDot + 1) : moduleId;\n\n const style = opts.style;\n const description = opts.description;\n\n // Validate --dir to prevent path traversal\n const dir = opts.dir ?? (style === \"decorator\" ? \"extensions\" : style === \"binding\" ? \"bindings\" : \"commands\");\n if (dir.split(path.sep).includes(\"..\") || dir.split(\"/\").includes(\"..\")) {\n process.stderr.write(`Error: Output directory must not contain '..' path components.\\n`);\n process.exit(2);\n }\n\n switch (style) {\n case \"decorator\":\n createDecoratorModule(moduleId, prefix, funcName, description, dir);\n break;\n case \"convention\":\n createConventionModule(moduleId, prefix, funcName, description, dir);\n break;\n case \"binding\":\n createBindingModule(moduleId, prefix, funcName, description, dir);\n break;\n default:\n process.stderr.write(`Error: Unknown style '${style}'\\n`);\n process.exit(2);\n }\n });\n}\n\nfunction createDecoratorModule(\n moduleId: string,\n _prefix: string,\n funcName: string,\n description: string,\n outputDir: string,\n): void {\n fs.mkdirSync(outputDir, { recursive: true });\n const filename = moduleId.replace(/\\./g, \"_\") + \".ts\";\n const filepath = path.join(outputDir, filename);\n\n const varName = funcName + \"Module\";\n const content = renderTemplate(DECORATOR_TEMPLATE, {\n moduleId,\n varName,\n funcName,\n description,\n });\n fs.writeFileSync(filepath, content);\n process.stdout.write(`Created ${filepath}\\n`);\n}\n\nfunction createConventionModule(\n moduleId: string,\n prefix: string,\n funcName: string,\n description: string,\n outputDir: string,\n): void {\n // If prefix has dots, create subdirectories\n const prefixParts = prefix.split(\".\");\n const dirPath = prefixParts.length > 1\n ? path.join(outputDir, ...prefixParts.slice(0, -1))\n : outputDir;\n fs.mkdirSync(dirPath, { recursive: true });\n\n let filename: string;\n if (prefixParts.length > 1) {\n filename = prefixParts[prefixParts.length - 1] + \".ts\";\n } else {\n filename = prefix + \".ts\";\n }\n // If the file would be the same as the function name, use prefix as filename\n if (prefix === funcName) {\n filename = prefix + \".ts\";\n }\n const filepath = path.join(dirPath, filename);\n\n const cliGroupLine = moduleId.includes(\".\")\n ? `export const CLI_GROUP = \"${prefixParts[0]}\";\\n`\n : \"\";\n\n const content = renderTemplate(CONVENTION_TEMPLATE, {\n funcName,\n description,\n cliGroupLine,\n });\n fs.writeFileSync(filepath, content);\n process.stdout.write(`Created ${filepath}\\n`);\n}\n\nfunction createBindingModule(\n moduleId: string,\n prefix: string,\n funcName: string,\n description: string,\n outputDir: string,\n): void {\n fs.mkdirSync(outputDir, { recursive: true });\n\n const yamlFile = path.join(outputDir, moduleId.replace(/\\./g, \"_\") + \".binding.yaml\");\n const target = `commands.${prefix}:${funcName}`;\n\n const yamlContent = renderTemplate(BINDING_TEMPLATE, {\n moduleId,\n target,\n description,\n });\n fs.writeFileSync(yamlFile, yamlContent);\n process.stdout.write(`Created ${yamlFile}\\n`);\n\n // Also create the target function file\n const baseSrc = \"commands\";\n fs.mkdirSync(baseSrc, { recursive: true });\n const srcFile = path.join(baseSrc, prefix.replace(/\\./g, \"_\") + \".ts\");\n if (!fs.existsSync(srcFile)) {\n const srcContent =\n `export function ${funcName}(): Record<string, unknown> {\\n` +\n ` /** ${description} */\\n` +\n \" // TODO: implement\\n\" +\n ' return { status: \"ok\" };\\n' +\n \"}\\n\";\n fs.writeFileSync(srcFile, srcContent);\n process.stdout.write(`Created ${srcFile}\\n`);\n }\n}\n","/**\n * Display overlay helpers — shared resolution logic for CLI surfaces.\n */\n\nimport type { ModuleDescriptor } from \"./cli.js\";\n\n/**\n * Extract resolved display overlay from a ModuleDescriptor's metadata.\n */\nexport function getDisplay(descriptor: ModuleDescriptor): Record<string, unknown> {\n const metadata = descriptor.metadata ?? {};\n const display = (metadata as Record<string, unknown>).display;\n if (display && typeof display === \"object\" && !Array.isArray(display)) {\n return display as Record<string, unknown>;\n }\n return {};\n}\n\n/**\n * Return [displayName, description, tags] resolved from the display overlay.\n *\n * Falls back to scanner-provided values when no overlay is present.\n */\nexport function getCliDisplayFields(descriptor: ModuleDescriptor): [string, string, string[]] {\n const display = getDisplay(descriptor);\n const cli = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const name = (cli.alias as string | undefined)\n ?? (display.alias as string | undefined)\n ?? descriptor.id;\n const desc = (cli.description as string | undefined) ?? descriptor.description;\n const tags = (display.tags as string[] | undefined) ?? descriptor.tags ?? [];\n return [name, desc, tags];\n}\n","/**\n * ConfigResolver — 4-tier config resolution (CLI flag > env > file > default).\n *\n * Protocol spec: Configuration resolution\n */\n\nimport * as fs from \"node:fs\";\nimport yaml from \"js-yaml\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Default configuration values. */\nexport const DEFAULTS: Record<string, unknown> = {\n \"extensions.root\": \"./extensions\",\n \"logging.level\": \"WARNING\",\n \"sandbox.enabled\": false,\n \"cli.stdin_buffer_limit\": 10_485_760,\n \"cli.auto_approve\": false,\n \"cli.help_text_max_length\": 1000,\n // Namespace-mode aliases (apcore >= 0.15.0 Config Bus)\n \"apcore-cli.stdin_buffer_limit\": 10_485_760,\n \"apcore-cli.auto_approve\": false,\n \"apcore-cli.help_text_max_length\": 1000,\n \"apcore-cli.logging_level\": \"WARNING\",\n};\n\n/** Namespace key ↔ legacy key mapping for backward compatibility. */\nconst NAMESPACE_TO_LEGACY: Record<string, string> = {\n \"apcore-cli.stdin_buffer_limit\": \"cli.stdin_buffer_limit\",\n \"apcore-cli.auto_approve\": \"cli.auto_approve\",\n \"apcore-cli.help_text_max_length\": \"cli.help_text_max_length\",\n \"apcore-cli.logging_level\": \"logging.level\",\n};\nconst LEGACY_TO_NAMESPACE: Record<string, string> = Object.fromEntries(\n Object.entries(NAMESPACE_TO_LEGACY).map(([k, v]) => [v, k]),\n);\n\n/**\n * Register the apcore-cli Config Bus namespace (apcore >= 0.15.0).\n * Safe to call even when apcore-js is unavailable or < 0.15.0.\n */\nexport function registerConfigNamespace(): void {\n try {\n // Dynamic import to avoid hard failure when apcore-js is not available\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { Config } = require(\"apcore-js\");\n if (typeof Config?.registerNamespace === \"function\") {\n Config.registerNamespace({\n name: \"apcore-cli\",\n envPrefix: \"APCORE_CLI\",\n defaults: {\n stdin_buffer_limit: 10_485_760,\n auto_approve: false,\n help_text_max_length: 1000,\n logging_level: \"WARNING\",\n },\n });\n }\n } catch {\n // apcore-js not installed or < 0.15.0 — graceful no-op\n }\n}\n\n// ---------------------------------------------------------------------------\n// ConfigResolver\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves configuration from four tiers (highest to lowest priority):\n * 1. CLI flags\n * 2. Environment variables\n * 3. Config file (YAML/JSON)\n * 4. Built-in defaults\n */\nexport class ConfigResolver {\n private readonly cliFlags: Record<string, unknown>;\n private readonly configPath: string;\n private fileCache: Record<string, unknown> | null = null;\n private fileCacheLoaded = false;\n\n constructor(cliFlags?: Record<string, unknown>, configPath?: string) {\n this.cliFlags = cliFlags ?? {};\n this.configPath = configPath ?? \"apcore.yaml\";\n }\n\n /**\n * Resolve a single configuration key across all four tiers.\n */\n resolve(key: string, cliFlag?: string, envVar?: string): unknown {\n // Tier 1: CLI flag\n const flagKey = cliFlag ?? key;\n if (flagKey in this.cliFlags) {\n const value = this.cliFlags[flagKey];\n if (value !== null && value !== undefined) {\n return value;\n }\n }\n\n // Tier 2: Environment variable\n if (envVar) {\n const envValue = process.env[envVar];\n if (envValue !== undefined && envValue !== \"\") {\n return envValue;\n }\n }\n\n // Tier 3: Config file (try both namespace and legacy keys)\n const fileValue = this.resolveFromFile(key);\n if (fileValue !== undefined) {\n return fileValue;\n }\n const altKey = NAMESPACE_TO_LEGACY[key] ?? LEGACY_TO_NAMESPACE[key];\n if (altKey) {\n const altFileValue = this.resolveFromFile(altKey);\n if (altFileValue !== undefined) {\n return altFileValue;\n }\n }\n\n // Tier 4: Defaults\n return DEFAULTS[key];\n }\n\n /**\n * Load a value from the config file using a dot-separated key path.\n */\n private resolveFromFile(key: string): unknown {\n if (!this.fileCacheLoaded) {\n this.fileCache = this.loadConfigFile();\n this.fileCacheLoaded = true;\n }\n if (this.fileCache === null) {\n return undefined;\n }\n return this.fileCache[key];\n }\n\n /**\n * Load and flatten a YAML config file.\n */\n private loadConfigFile(): Record<string, unknown> | null {\n let content: string;\n try {\n content = fs.readFileSync(this.configPath, \"utf-8\");\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && err.code === \"ENOENT\") {\n return null;\n }\n console.warn(\n `Configuration file '${this.configPath}' is malformed, using defaults.`,\n );\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = yaml.load(content);\n } catch {\n console.warn(\n `Configuration file '${this.configPath}' is malformed, using defaults.`,\n );\n return null;\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n console.warn(\n `Configuration file '${this.configPath}' is malformed, using defaults.`,\n );\n return null;\n }\n\n return this.flattenDict(parsed as Record<string, unknown>);\n }\n\n /**\n * Flatten nested dict to dot-notation keys.\n */\n private flattenDict(\n d: Record<string, unknown>,\n prefix = \"\",\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(d)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n ) {\n Object.assign(\n result,\n this.flattenDict(value as Record<string, unknown>, fullKey),\n );\n } else {\n result[fullKey] = value;\n }\n }\n return result;\n }\n}\n","/**\n * Shell completion + man page generation.\n *\n * Protocol spec: Shell integration\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command, Help, Option } from \"commander\";\nimport { EXIT_CODES } from \"./errors.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nlet SHELL_VERSION = \"0.0.0\";\ntry {\n const pkg = JSON.parse(readFileSync(path.resolve(__dirname, \"../package.json\"), \"utf-8\"));\n SHELL_VERSION = pkg.version;\n} catch {\n // Bundled environments (e.g., Bun compile) may not have package.json accessible\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a prog_name like 'my-tool' to a valid shell identifier '_my_tool'.\n */\nfunction makeFunctionName(progName: string): string {\n return \"_\" + progName.replace(/[^a-zA-Z0-9]/g, \"_\");\n}\n\n/**\n * Shell-safe quoting.\n */\nfunction shellQuote(s: string): string {\n return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\n// ---------------------------------------------------------------------------\n// Completion generators\n// ---------------------------------------------------------------------------\n\nfunction generateBashCompletion(progName: string): string {\n const fn = makeFunctionName(progName);\n const quoted = shellQuote(progName);\n const moduleListCmd =\n `${quoted} list --format json 2>/dev/null` +\n ` | node -e \"process.stdin.on('data',d=>{JSON.parse(d).forEach(m=>console.log(m.id))})\" 2>/dev/null`;\n const groupsAndTopCmd =\n `${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const ids=JSON.parse(m).map(x=>x.id);\\n` +\n `const g=new Set(),t=[];\\n` +\n `ids.forEach(i=>{if(i.includes('.'))g.add(i.split('.')[0]);else t.push(i)});\\n` +\n `console.log([...g].sort().concat(t.sort()).join(' '))\\n` +\n `\" 2>/dev/null`;\n const groupCmdsCmd =\n `${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const g=process.env._APCORE_GRP;\\n` +\n `JSON.parse(m).map(x=>x.id).filter(i=>i.includes('.')&&i.split('.')[0]===g).forEach(i=>console.log(i.split('.',2)[1]))\\n` +\n `\" 2>/dev/null`;\n\n return (\n `${fn}() {\\n` +\n ` local cur prev opts\\n` +\n ` COMPREPLY=()\\n` +\n ` cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\\n` +\n ` prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\\n` +\n `\\n` +\n ` if [[ \\${COMP_CWORD} -eq 1 ]]; then\\n` +\n ` opts=\"completion describe exec init list man\"\\n` +\n ` local groups_and_top=$(${groupsAndTopCmd})\\n` +\n ` COMPREPLY=( $(compgen -W \"\\${opts} \\${groups_and_top}\" -- \\${cur}) )\\n` +\n ` return 0\\n` +\n ` fi\\n` +\n `\\n` +\n ` if [[ \\${COMP_CWORD} -eq 2 ]]; then\\n` +\n ` if [[ \"\\${COMP_WORDS[1]}\" == \"exec\" ]]; then\\n` +\n ` local modules=$(${moduleListCmd})\\n` +\n ` COMPREPLY=( $(compgen -W \"\\${modules}\" -- \\${cur}) )\\n` +\n ` return 0\\n` +\n ` fi\\n` +\n ` export _APCORE_GRP=\"\\${COMP_WORDS[1]}\"\\n` +\n ` local group_cmds=$(${groupCmdsCmd})\\n` +\n ` COMPREPLY=( $(compgen -W \"\\${group_cmds}\" -- \\${cur}) )\\n` +\n ` return 0\\n` +\n ` fi\\n` +\n `}\\n` +\n `complete -F ${fn} ${quoted}\\n`\n );\n}\n\nfunction generateZshCompletion(progName: string): string {\n const fn = makeFunctionName(progName);\n const quoted = shellQuote(progName);\n const moduleListCmd =\n `${quoted} list --format json 2>/dev/null` +\n ` | node -e \"process.stdin.on('data',d=>{JSON.parse(d).forEach(m=>console.log(m.id))})\" 2>/dev/null`;\n const groupsAndTopCmd =\n `${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const ids=JSON.parse(m).map(x=>x.id);\\n` +\n `const g=new Set(),t=[];\\n` +\n `ids.forEach(i=>{if(i.includes('.'))g.add(i.split('.')[0]);else t.push(i)});\\n` +\n `console.log([...g].sort().concat(t.sort()).join(' '))\\n` +\n `\" 2>/dev/null`;\n const groupCmdsCmd =\n `${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const g=process.env._APCORE_GRP;\\n` +\n `JSON.parse(m).map(x=>x.id).filter(i=>i.includes('.')&&i.split('.')[0]===g).forEach(i=>console.log(i.split('.',2)[1]))\\n` +\n `\" 2>/dev/null`;\n\n return (\n `#compdef ${progName}\\n` +\n `\\n` +\n `${fn}() {\\n` +\n ` local -a commands\\n` +\n ` commands=(\\n` +\n ` 'list:List available modules'\\n` +\n ` 'describe:Show module metadata and schema'\\n` +\n ` 'completion:Generate shell completion script'\\n` +\n ` 'init:Scaffolding commands'\\n` +\n ` 'man:Generate man page'\\n` +\n ` )\\n` +\n `\\n` +\n ` _arguments -C \\\\\\n` +\n ` '1:command:->command' \\\\\\n` +\n ` '*::arg:->args'\\n` +\n `\\n` +\n ` case \"$state\" in\\n` +\n ` command)\\n` +\n ` _describe -t commands '${progName} commands' commands\\n` +\n ` local -a groups_and_top\\n` +\n ` groups_and_top=($(${groupsAndTopCmd}))\\n` +\n ` compadd -a groups_and_top\\n` +\n ` ;;\\n` +\n ` args)\\n` +\n ` case \"\\${words[1]}\" in\\n` +\n ` exec)\\n` +\n ` local modules\\n` +\n ` modules=($(${moduleListCmd}))\\n` +\n ` compadd -a modules\\n` +\n ` ;;\\n` +\n ` *)\\n` +\n ` export _APCORE_GRP=\"\\${words[1]}\"\\n` +\n ` local -a group_cmds\\n` +\n ` group_cmds=($(${groupCmdsCmd}))\\n` +\n ` compadd -a group_cmds\\n` +\n ` ;;\\n` +\n ` esac\\n` +\n ` ;;\\n` +\n ` esac\\n` +\n `}\\n` +\n `\\n` +\n `compdef ${fn} ${quoted}\\n`\n );\n}\n\nfunction generateFishCompletion(progName: string): string {\n const quoted = shellQuote(progName);\n const moduleListCmd =\n `${quoted} list --format json 2>/dev/null` +\n ` | node -e \\\\\"process.stdin.on('data',d=>{JSON.parse(d).forEach(m=>console.log(m.id))})\\\\\" 2>/dev/null`;\n const groupsAndTopCmd =\n `${quoted} list --format json 2>/dev/null | node -e \\\\\"` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');` +\n `const ids=JSON.parse(m).map(x=>x.id);` +\n `const g=new Set(),t=[];` +\n `ids.forEach(i=>{if(i.includes('.'))g.add(i.split('.')[0]);else t.push(i)});` +\n `console.log([...g].sort().concat(t.sort()).join('\\\\\\\\n'))\\\\\" 2>/dev/null`;\n\n return (\n `# Fish completions for ${progName}\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a list -d \"List available modules\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a describe -d \"Show module metadata and schema\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a completion -d \"Generate shell completion script\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a init -d \"Scaffolding commands\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a man -d \"Generate man page\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a \"(${groupsAndTopCmd})\" -d \"Module group\"\\n` +\n `\\n` +\n `complete -c ${quoted} -n \"__fish_seen_subcommand_from exec\"` +\n ` -a \"(${moduleListCmd})\"\\n` +\n `\\n` +\n `function __apcore_group_cmds\\n` +\n ` set -l grp (commandline -opc)[2]\\n` +\n ` set -x _APCORE_GRP $grp\\n` +\n ` ${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const g=process.env._APCORE_GRP;\\n` +\n `JSON.parse(m).map(x=>x.id).filter(i=>i.includes('.')&&i.split('.')[0]===g).forEach(i=>console.log(i.split('.',2)[1]))\\n` +\n `\" 2>/dev/null\\n` +\n `end\\n` +\n `\\n` +\n `# Group subcommand completion — matches when position 1 is not a builtin\\n` +\n `complete -c ${quoted} -n \"not __fish_use_subcommand; and not __fish_seen_subcommand_from list describe completion init man exec\"` +\n ` -a \"(__apcore_group_cmds)\"\\n`\n );\n}\n\n// ---------------------------------------------------------------------------\n// Man page generation\n// ---------------------------------------------------------------------------\n\nfunction buildSynopsis(\n command: Command | null,\n progName: string,\n commandName: string,\n): string {\n if (!command) {\n return `\\\\fB${progName} ${commandName}\\\\fR [OPTIONS]`;\n }\n\n const parts = [`\\\\fB${progName} ${commandName}\\\\fR`];\n for (const opt of command.options) {\n const flag = opt.long ?? opt.short ?? \"\";\n if (opt.isBoolean?.()) {\n parts.push(`[${flag}]`);\n } else if (opt.required) {\n const typeName = (opt.argChoices ? \"CHOICE\" : \"VALUE\").toUpperCase();\n parts.push(`${flag} \\\\fI${typeName}\\\\fR`);\n } else {\n const typeName = (opt.argChoices ? \"CHOICE\" : \"VALUE\").toUpperCase();\n parts.push(`[${flag} \\\\fI${typeName}\\\\fR]`);\n }\n }\n\n for (const arg of command.registeredArguments ?? []) {\n const meta = arg.name().toUpperCase();\n if (arg.required) {\n parts.push(`\\\\fI${meta}\\\\fR`);\n } else {\n parts.push(`[\\\\fI${meta}\\\\fR]`);\n }\n }\n\n return parts.join(\" \");\n}\n\nfunction generateManPage(\n commandName: string,\n command: Command | null,\n progName: string,\n version = SHELL_VERSION,\n): string {\n const today = new Date().toISOString().slice(0, 10);\n const title = `${progName}-${commandName}`.toUpperCase();\n const pkgLabel = `${progName} ${version}`;\n const manualLabel = `${progName} Manual`;\n\n const sections: string[] = [];\n sections.push(`.TH \"${title}\" \"1\" \"${today}\" \"${pkgLabel}\" \"${manualLabel}\"`);\n\n sections.push(\".SH NAME\");\n const desc = command?.description() ?? commandName;\n const nameDesc = desc.split(\"\\n\")[0].replace(/\\.$/, \"\");\n sections.push(`${progName}-${commandName} \\\\- ${nameDesc}`);\n\n sections.push(\".SH SYNOPSIS\");\n sections.push(buildSynopsis(command, progName, commandName));\n\n if (command?.description()) {\n sections.push(\".SH DESCRIPTION\");\n sections.push(\n command.description().replace(/\\\\/g, \"\\\\\\\\\").replace(/-/g, \"\\\\-\"),\n );\n }\n\n if (command && command.options.length > 0) {\n sections.push(\".SH OPTIONS\");\n for (const opt of command.options) {\n const flag = [opt.short, opt.long].filter(Boolean).join(\", \");\n sections.push(\".TP\");\n if (opt.isBoolean?.()) {\n sections.push(`\\\\fB${flag}\\\\fR`);\n } else {\n sections.push(`\\\\fB${flag}\\\\fR \\\\fIVALUE\\\\fR`);\n }\n if (opt.description) {\n sections.push(opt.description);\n }\n if (opt.defaultValue !== undefined && !opt.isBoolean?.()) {\n sections.push(`Default: ${opt.defaultValue}.`);\n }\n }\n }\n\n sections.push(\".SH ENVIRONMENT\");\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_EXTENSIONS_ROOT\\\\fR\");\n sections.push(\n \"Path to the apcore extensions directory. Overrides the default \\\\fI./extensions\\\\fR.\",\n );\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_CLI_AUTO_APPROVE\\\\fR\");\n sections.push(\n \"Set to \\\\fB1\\\\fR to bypass approval prompts for modules that require human-in-the-loop confirmation.\",\n );\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_CLI_LOGGING_LEVEL\\\\fR\");\n sections.push(\n \"CLI-specific logging verbosity. One of: DEBUG, INFO, WARNING, ERROR. \" +\n \"Takes priority over \\\\fBAPCORE_LOGGING_LEVEL\\\\fR. Default: WARNING.\",\n );\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_LOGGING_LEVEL\\\\fR\");\n sections.push(\n \"Global apcore logging verbosity. One of: DEBUG, INFO, WARNING, ERROR. \" +\n \"Used as fallback when \\\\fBAPCORE_CLI_LOGGING_LEVEL\\\\fR is not set. Default: WARNING.\",\n );\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_AUTH_API_KEY\\\\fR\");\n sections.push(\n \"API key for authenticating with the apcore registry.\",\n );\n\n sections.push(\".SH EXIT CODES\");\n const exitCodes: [string, string][] = [\n [\"0\", \"Success.\"],\n [\"1\", \"Module execution error.\"],\n [\"2\", \"Invalid CLI input or missing argument.\"],\n [\"44\", \"Module not found, disabled, or failed to load.\"],\n [\"45\", \"Input failed JSON Schema validation.\"],\n [\n \"46\",\n \"Approval denied, timed out, or no interactive terminal available.\",\n ],\n [\n \"47\",\n \"Configuration error (extensions directory not found or unreadable).\",\n ],\n [\"48\", \"Schema contains a circular \\\\fB$ref\\\\fR.\"],\n [\"77\", \"ACL denied — insufficient permissions for this module.\"],\n [\"130\", \"Execution cancelled by user (SIGINT / Ctrl\\\\-C).\"],\n ];\n for (const [code, meaning] of exitCodes) {\n sections.push(`.TP\\n\\\\fB${code}\\\\fR\\n${meaning}`);\n }\n\n sections.push(\".SH SEE ALSO\");\n sections.push(\n [\n `\\\\fB${progName}\\\\fR(1)`,\n `\\\\fB${progName}\\\\-list\\\\fR(1)`,\n `\\\\fB${progName}\\\\-describe\\\\fR(1)`,\n `\\\\fB${progName}\\\\-completion\\\\fR(1)`,\n ].join(\", \"),\n );\n\n return sections.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Program-wide man page generation\n// ---------------------------------------------------------------------------\n\n/** Escape a string for roff output. */\nfunction roffEscape(s: string): string {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/-/g, \"\\\\-\").replace(/'/g, \"\\\\(aq\");\n}\n\n/**\n * Build a complete roff man page for the entire program.\n * Covers all registered commands including downstream business commands.\n */\nexport function buildProgramManPage(\n program: Command,\n progName: string,\n version: string,\n description?: string,\n docsUrl?: string,\n): string {\n const help = new Help();\n const today = new Date().toISOString().slice(0, 10);\n const s: string[] = [];\n\n const resolvedDesc = description ?? program.description() ?? `${progName} CLI`;\n\n s.push(`.TH \"${progName.toUpperCase()}\" \"1\" \"${today}\" \"${progName} ${version}\" \"${progName} Manual\"`);\n\n s.push(\".SH NAME\");\n s.push(`${progName} \\\\- ${roffEscape(resolvedDesc)}`);\n\n s.push(\".SH SYNOPSIS\");\n s.push(`\\\\fB${progName}\\\\fR [\\\\fIglobal\\\\-options\\\\fR] \\\\fIcommand\\\\fR [\\\\fIcommand\\\\-options\\\\fR]`);\n\n if (resolvedDesc) {\n s.push(\".SH DESCRIPTION\");\n s.push(roffEscape(resolvedDesc));\n }\n\n // Global options\n const globalOpts = help.visibleOptions(program)\n .filter((o) => ![\"help\", \"version\", \"all\", \"man\"].includes(o.long?.replace(\"--\", \"\") ?? \"\"));\n if (globalOpts.length > 0) {\n s.push(\".SH GLOBAL OPTIONS\");\n for (const opt of globalOpts) {\n const flag = [opt.short, opt.long].filter(Boolean).join(\", \");\n s.push(\".TP\");\n s.push(`\\\\fB${roffEscape(flag)}\\\\fR`);\n if (opt.description) s.push(roffEscape(opt.description));\n }\n }\n\n // Commands\n const allCommands = help.visibleCommands(program);\n if (allCommands.length > 0) {\n s.push(\".SH COMMANDS\");\n for (const cmd of allCommands) {\n if (cmd.name() === \"help\") continue;\n\n const desc = help.subcommandDescription(cmd);\n s.push(\".TP\");\n s.push(`\\\\fB${progName} ${roffEscape(cmd.name())}\\\\fR`);\n if (desc) s.push(roffEscape(desc));\n\n // Command options\n const cmdHelp = new Help();\n const opts = cmdHelp.visibleOptions(cmd)\n .filter((o) => ![\"help\", \"version\"].includes(o.long?.replace(\"--\", \"\") ?? \"\"));\n for (const opt of opts) {\n const flag = [opt.short, opt.long].filter(Boolean).join(\", \");\n s.push(\".RS\");\n s.push(\".TP\");\n s.push(`\\\\fB${roffEscape(flag)}\\\\fR`);\n if (opt.description) s.push(roffEscape(opt.description));\n s.push(\".RE\");\n }\n\n // Nested subcommands (e.g., series init, asset add)\n const subCmds = cmdHelp.visibleCommands(cmd).filter((c) => c.name() !== \"help\");\n for (const sub of subCmds) {\n const subDesc = help.subcommandDescription(sub);\n s.push(\".TP\");\n s.push(`\\\\fB${progName} ${roffEscape(cmd.name())} ${roffEscape(sub.name())}\\\\fR`);\n if (subDesc) s.push(roffEscape(subDesc));\n const subOpts = cmdHelp.visibleOptions(sub)\n .filter((o) => ![\"help\", \"version\"].includes(o.long?.replace(\"--\", \"\") ?? \"\"));\n for (const opt of subOpts) {\n const flag = [opt.short, opt.long].filter(Boolean).join(\", \");\n s.push(\".RS\");\n s.push(\".TP\");\n s.push(`\\\\fB${roffEscape(flag)}\\\\fR`);\n if (opt.description) s.push(roffEscape(opt.description));\n s.push(\".RE\");\n }\n }\n }\n }\n\n // Environment\n s.push(\".SH ENVIRONMENT\");\n s.push(\".TP\");\n s.push(\"\\\\fBAPCORE_EXTENSIONS_ROOT\\\\fR\");\n s.push(\"Path to the apcore extensions directory.\");\n s.push(\".TP\");\n s.push(\"\\\\fBAPCORE_CLI_AUTO_APPROVE\\\\fR\");\n s.push(\"Set to \\\\fB1\\\\fR to bypass approval prompts.\");\n s.push(\".TP\");\n s.push(\"\\\\fBAPCORE_CLI_LOGGING_LEVEL\\\\fR\");\n s.push(\"CLI\\\\-specific logging verbosity (DEBUG|INFO|WARNING|ERROR).\");\n\n // Exit codes\n s.push(\".SH EXIT CODES\");\n const exitCodes: [string, string][] = [\n [\"0\", \"Success.\"],\n [\"1\", \"Module execution error.\"],\n [\"2\", \"Invalid CLI input or missing argument.\"],\n [\"44\", \"Module not found, disabled, or failed to load.\"],\n [\"45\", \"Input failed JSON Schema validation.\"],\n [\"46\", \"Approval denied or timed out.\"],\n [\"47\", \"Configuration error.\"],\n [\"77\", \"ACL denied.\"],\n [\"130\", \"Cancelled by user (SIGINT).\"],\n ];\n for (const [code, meaning] of exitCodes) {\n s.push(`.TP\\n\\\\fB${code}\\\\fR\\n${meaning}`);\n }\n\n s.push(\".SH SEE ALSO\");\n s.push(`\\\\fB${progName} \\\\-\\\\-help \\\\-\\\\-verbose\\\\fR for full option list.`);\n if (docsUrl) {\n s.push(`.PP\\nFull documentation at \\\\fI${roffEscape(docsUrl)}\\\\fR`);\n }\n\n return s.join(\"\\n\");\n}\n\n/**\n * Configure --help --man support on a Commander program.\n * When --man is passed with --help, outputs a complete roff man page\n * covering all registered commands (including downstream business commands).\n *\n * Usage in downstream projects:\n * configureManHelp(program, 'reach', '0.2.0', 'ReachForge: The Social Influence Engine', 'https://reachforge.dev/docs');\n */\nexport function configureManHelp(\n program: Command,\n progName: string,\n version: string,\n description?: string,\n docsUrl?: string,\n): void {\n // Add --man as a hidden option\n const manOpt = new Option(\"--man\", \"Output man page in roff format (use with --help)\").hideHelp();\n program.addOption(manOpt);\n\n // Intercept help to output roff when --man is set\n program.addHelpText(\"beforeAll\", () => {\n if (program.opts().man) {\n const roff = buildProgramManPage(program, progName, version, description, docsUrl) + \"\\n\";\n\n // If stdout is a TTY, render through a pager; otherwise output raw roff\n // (allows piping/redirection like `reach --help --man > reach.1`)\n if (process.stdout.isTTY) {\n // Try mandoc first (available on macOS/BSD), then groff, then fall back to raw output\n const pagers: Array<{ cmd: string; args: string[] }> = [\n { cmd: \"mandoc\", args: [\"-a\"] },\n { cmd: \"groff\", args: [\"-man\", \"-Tutf8\"] },\n ];\n let rendered = false;\n for (const { cmd, args } of pagers) {\n const result = spawnSync(cmd, args, {\n input: roff,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n encoding: \"utf-8\",\n });\n if (result.status === 0 && result.stdout) {\n const pager = process.env.PAGER || \"less\";\n const pagerResult = spawnSync(pager, [\"-R\"], {\n input: result.stdout,\n stdio: [\"pipe\", \"inherit\", \"inherit\"],\n });\n if (pagerResult.status !== null) {\n rendered = true;\n break;\n }\n }\n }\n if (!rendered) {\n process.stdout.write(roff);\n }\n } else {\n process.stdout.write(roff);\n }\n process.exit(0);\n }\n return \"\";\n });\n}\n\n// ---------------------------------------------------------------------------\n// registerShellCommands\n// ---------------------------------------------------------------------------\n\n/**\n * Register completion and man commands.\n */\nexport function registerShellCommands(\n cli: Command,\n progName = \"apcore-cli\",\n): void {\n const completionCmd = new Command(\"completion\")\n .description(\n \"Generate a shell completion script and print it to stdout.\",\n )\n .argument(\"<shell>\", \"Shell type: bash, zsh, or fish\")\n .action((shell: string) => {\n const validShells = [\"bash\", \"zsh\", \"fish\"];\n if (!validShells.includes(shell)) {\n process.stderr.write(\n `Error: Unknown shell '${shell}'. Expected: bash, zsh, or fish.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n const resolved = cli.name() || progName;\n const generators: Record<string, () => string> = {\n bash: () => generateBashCompletion(resolved),\n zsh: () => generateZshCompletion(resolved),\n fish: () => generateFishCompletion(resolved),\n };\n process.stdout.write(generators[shell]());\n });\n cli.addCommand(completionCmd);\n\n const manCmd = new Command(\"man\")\n .description(\"Generate a roff man page for COMMAND and print it to stdout.\")\n .argument(\"<command>\", \"Command to generate man page for\")\n .action((commandName: string) => {\n const knownBuiltins = new Set([\"completion\", \"describe\", \"exec\", \"init\", \"list\", \"man\"]);\n const cmd = cli.commands.find((c) => c.name() === commandName) ?? null;\n\n if (!cmd && !knownBuiltins.has(commandName)) {\n process.stderr.write(\n `Error: Unknown command '${commandName}'.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n const resolved = cli.name() || progName;\n const roff = generateManPage(commandName, cmd, resolved);\n process.stdout.write(roff);\n });\n cli.addCommand(manCmd);\n}\n","/**\n * LazyModuleGroup — Dynamic command loading from Registry.\n *\n * Equivalent to the Python LazyModuleGroup. Dynamically discovers apcore\n * modules from the Registry and exposes them as Commander subcommands.\n *\n * Protocol spec: CLI command structure & lazy loading\n */\n\nimport { Command } from \"commander\";\nimport { buildModuleCommand } from \"./main.js\";\nimport { getDisplay } from \"./display-helpers.js\";\nimport { warn } from \"./logger.js\";\n\n// TODO: Import Registry and Executor from apcore-js once available\n// import type { Registry, Executor, ModuleDescriptor } from \"apcore-js\";\n\n// ---------------------------------------------------------------------------\n// Placeholder types until apcore-js types are available\n// ---------------------------------------------------------------------------\n\n/** Placeholder for apcore-js Registry. */\nexport interface Registry {\n listModules(): ModuleDescriptor[];\n getModule(moduleId: string): ModuleDescriptor | null;\n}\n\n/** Placeholder for apcore-js Executor. */\nexport interface Executor {\n execute(moduleId: string, input: Record<string, unknown>): Promise<unknown>;\n}\n\n/** Placeholder for apcore-js ModuleDescriptor. */\nexport interface ModuleDescriptor {\n id: string;\n name: string;\n description: string;\n tags?: string[];\n inputSchema?: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n requiresApproval?: boolean;\n annotations?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n/** Built-in command names that cannot be overridden by modules. */\nexport const BUILTIN_COMMANDS = [\"completion\", \"describe\", \"exec\", \"init\", \"list\", \"man\"];\n\n// ---------------------------------------------------------------------------\n// LazyModuleGroup\n// ---------------------------------------------------------------------------\n\n/**\n * Dynamically loads apcore modules as Commander subcommands from Registry.\n */\nexport class LazyModuleGroup {\n protected readonly registry: Registry;\n readonly executor: Executor;\n protected readonly helpTextMaxLength: number;\n protected commandCache: Map<string, Command> = new Map();\n /** alias -> canonical module_id (populated lazily) */\n protected aliasMap: Map<string, string> = new Map();\n /** module_id -> descriptor cache (populated during alias map build) */\n protected descriptorCache: Map<string, ModuleDescriptor> = new Map();\n protected aliasMapBuilt = false;\n\n constructor(registry: Registry, executor: Executor, helpTextMaxLength = 1000) {\n this.registry = registry;\n this.executor = executor;\n this.helpTextMaxLength = helpTextMaxLength;\n }\n\n /**\n * Build alias->module_id map from display overlay metadata.\n */\n buildAliasMap(): void {\n if (this.aliasMapBuilt) {\n return;\n }\n try {\n for (const descriptor of this.registry.listModules()) {\n const moduleId = descriptor.id;\n this.descriptorCache.set(moduleId, descriptor);\n const display = getDisplay(descriptor);\n const cliDisplay = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const cliAlias = cliDisplay.alias as string | undefined;\n if (cliAlias && cliAlias !== moduleId) {\n this.aliasMap.set(cliAlias, moduleId);\n }\n }\n this.aliasMapBuilt = true;\n } catch {\n warn(\"Failed to build alias map from registry\");\n }\n }\n\n /**\n * List all available command names from the Registry.\n */\n listCommands(): string[] {\n this.buildAliasMap();\n // Reverse map: module_id -> cli alias (if any)\n const reverse = new Map<string, string>();\n for (const [alias, moduleId] of this.aliasMap) {\n reverse.set(moduleId, alias);\n }\n const moduleIds = this.registry.listModules().map((m) => m.id);\n const names = moduleIds.map((mid) => reverse.get(mid) ?? mid);\n return [...new Set(names)].sort();\n }\n\n /**\n * Get or lazily build a Commander Command for the given module.\n */\n getCommand(cmdName: string): Command | null {\n if (this.commandCache.has(cmdName)) {\n return this.commandCache.get(cmdName)!;\n }\n\n // Resolve alias -> canonical module_id\n this.buildAliasMap();\n const moduleId = this.aliasMap.get(cmdName) ?? cmdName;\n\n // Look up in descriptor cache or registry\n let moduleDef = this.descriptorCache.get(moduleId);\n if (!moduleDef) {\n moduleDef = this.registry.getModule(moduleId) ?? undefined;\n }\n if (!moduleDef) {\n return null;\n }\n\n const cmd = buildModuleCommand(moduleDef, this.executor, this.helpTextMaxLength, cmdName);\n this.commandCache.set(cmdName, cmd);\n return cmd;\n }\n}\n\n// ---------------------------------------------------------------------------\n// LazyGroup — A Commander Command group for a single namespace\n// ---------------------------------------------------------------------------\n\n/**\n * Command group for a single namespace — lazily builds subcommands.\n */\nexport class LazyGroup {\n private readonly members: Map<string, [string, ModuleDescriptor]>;\n private readonly _executor: Executor;\n private readonly _helpTextMaxLength: number;\n private readonly _cmdCache: Map<string, Command> = new Map();\n readonly command: Command;\n\n constructor(\n members: Map<string, [string, ModuleDescriptor]>,\n executor: Executor,\n name: string,\n helpTextMaxLength = 1000,\n ) {\n this.members = members;\n this._executor = executor;\n this._helpTextMaxLength = helpTextMaxLength;\n this.command = new Command(name).description(`${name} commands`);\n\n // Build and register all subcommands\n for (const [cmdName, [, descriptor]] of this.members) {\n const cmd = buildModuleCommand(\n descriptor,\n this._executor,\n this._helpTextMaxLength,\n cmdName,\n );\n this._cmdCache.set(cmdName, cmd);\n this.command.addCommand(cmd);\n }\n }\n\n listCommands(): string[] {\n return [...this.members.keys()].sort();\n }\n\n getCommand(cmdName: string): Command | null {\n if (this._cmdCache.has(cmdName)) {\n return this._cmdCache.get(cmdName)!;\n }\n const entry = this.members.get(cmdName);\n if (!entry) {\n return null;\n }\n const [, descriptor] = entry;\n const cmd = buildModuleCommand(\n descriptor,\n this._executor,\n this._helpTextMaxLength,\n cmdName,\n );\n this._cmdCache.set(cmdName, cmd);\n return cmd;\n }\n}\n\n// ---------------------------------------------------------------------------\n// GroupedModuleGroup\n// ---------------------------------------------------------------------------\n\n/**\n * Extended LazyModuleGroup that organises modules into named groups.\n *\n * Modules with dotted IDs (e.g., \"math.add\") are automatically grouped\n * by their namespace prefix. The display overlay can override grouping\n * via metadata.display.cli.group.\n */\nexport class GroupedModuleGroup extends LazyModuleGroup {\n /** groupName -> { cmdName -> [moduleId, descriptor] } */\n private groupMap: Map<string, Map<string, [string, ModuleDescriptor]>> = new Map();\n /** cmdName -> [moduleId, descriptor] for top-level (ungrouped) modules */\n private topLevelModules: Map<string, [string, ModuleDescriptor]> = new Map();\n /** Cached LazyGroup instances */\n private groupCache: Map<string, LazyGroup> = new Map();\n private groupMapBuilt = false;\n\n /**\n * Determine (groupName | null, commandName) for a module from its display overlay.\n */\n static resolveGroup(moduleId: string, descriptor: ModuleDescriptor): [string | null, string] {\n if (!moduleId) {\n warn(\"Empty module_id encountered in resolveGroup\");\n return [null, \"\"];\n }\n\n const display = getDisplay(descriptor);\n const cliDisplay = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const explicitGroup = cliDisplay.group;\n\n // Explicit non-empty string group\n if (typeof explicitGroup === \"string\" && explicitGroup !== \"\") {\n return [explicitGroup, (cliDisplay.alias as string | undefined) ?? moduleId];\n }\n // Explicit empty string = opt-out (top-level)\n if (explicitGroup === \"\") {\n return [null, (cliDisplay.alias as string | undefined) ?? moduleId];\n }\n\n // Auto-extraction from alias or module_id\n const cliName = (cliDisplay.alias as string | undefined) ?? moduleId;\n if (cliName.includes(\".\")) {\n const dotIdx = cliName.indexOf(\".\");\n const group = cliName.substring(0, dotIdx);\n const cmd = cliName.substring(dotIdx + 1);\n return [group, cmd];\n }\n return [null, cliName];\n }\n\n /**\n * Build the group map from registry modules.\n */\n buildGroupMap(): void {\n if (this.groupMapBuilt) {\n return;\n }\n try {\n this.buildAliasMap();\n for (const descriptor of this.registry.listModules()) {\n const moduleId = descriptor.id;\n const cached = this.descriptorCache.get(moduleId);\n if (!cached) {\n continue;\n }\n const [group, cmd] = GroupedModuleGroup.resolveGroup(moduleId, cached);\n if (group === null) {\n this.topLevelModules.set(cmd, [moduleId, cached]);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(group)) {\n warn(\n `Module '${moduleId}': group name '${group}' is not shell-safe — treating as top-level.`,\n );\n this.topLevelModules.set(cmd, [moduleId, cached]);\n } else {\n if (!this.groupMap.has(group)) {\n this.groupMap.set(group, new Map());\n }\n this.groupMap.get(group)!.set(cmd, [moduleId, cached]);\n }\n }\n // Warn on builtin collisions\n for (const groupName of this.groupMap.keys()) {\n if (BUILTIN_COMMANDS.includes(groupName)) {\n warn(\n `Group name '${groupName}' collides with a built-in command and will be ignored`,\n );\n }\n }\n this.groupMapBuilt = true;\n } catch {\n warn(\"Failed to build group map\");\n }\n }\n\n /**\n * List all available command names: builtins + group names + top-level module names.\n */\n override listCommands(): string[] {\n this.buildGroupMap();\n const groupNames = [...this.groupMap.keys()].filter(\n (g) => !BUILTIN_COMMANDS.includes(g),\n );\n const topNames = [...this.topLevelModules.keys()];\n return [...new Set([...BUILTIN_COMMANDS, ...groupNames, ...topNames])].sort();\n }\n\n /**\n * Get a command by name: check builtins -> group cache -> group map -> top-level modules.\n */\n override getCommand(cmdName: string): Command | null {\n this.buildGroupMap();\n\n // Check group cache\n if (this.groupCache.has(cmdName)) {\n return this.groupCache.get(cmdName)!.command;\n }\n\n // Check if it's a group\n if (this.groupMap.has(cmdName)) {\n const lazyGrp = new LazyGroup(\n this.groupMap.get(cmdName)!,\n this.executor,\n cmdName,\n this.helpTextMaxLength,\n );\n this.groupCache.set(cmdName, lazyGrp);\n return lazyGrp.command;\n }\n\n // Check top-level modules\n if (this.topLevelModules.has(cmdName)) {\n if (this.commandCache.has(cmdName)) {\n return this.commandCache.get(cmdName)!;\n }\n const [, descriptor] = this.topLevelModules.get(cmdName)!;\n const cmd = buildModuleCommand(\n descriptor,\n this.executor,\n this.helpTextMaxLength,\n cmdName,\n );\n this.commandCache.set(cmdName, cmd);\n return cmd;\n }\n\n return null;\n }\n\n /** Expose groupMap for testing. */\n getGroupMap(): Map<string, Map<string, [string, ModuleDescriptor]>> {\n return this.groupMap;\n }\n\n /** Expose topLevelModules for testing. */\n getTopLevelModules(): Map<string, [string, ModuleDescriptor]> {\n return this.topLevelModules;\n }\n\n /** Expose groupMapBuilt for testing. */\n isGroupMapBuilt(): boolean {\n return this.groupMapBuilt;\n }\n}\n","/**\n * Discovery commands — list and describe modules.\n *\n * Protocol spec: Module discovery & introspection\n */\n\nimport { Command } from \"commander\";\nimport type { ModuleDescriptor, Registry } from \"./cli.js\";\nimport { EXIT_CODES } from \"./errors.js\";\nimport { validateModuleId } from \"./main.js\";\nimport {\n formatModuleDetail,\n formatModuleList,\n resolveFormat,\n} from \"./output.js\";\n\nconst TAG_PATTERN = /^[a-z][a-z0-9_-]*$/;\n\nfunction validateTag(tag: string): void {\n if (!TAG_PATTERN.test(tag)) {\n process.stderr.write(\n `Error: Invalid tag format: '${tag}'. Tags must match [a-z][a-z0-9_-]*.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n}\n\n/**\n * Collect repeated --tag options into an array.\n */\nfunction collectTag(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Register list and describe commands on the CLI group.\n */\nexport function registerDiscoveryCommands(\n cli: Command,\n registry: Registry,\n): void {\n const listCmd = new Command(\"list\")\n .description(\"List available modules in the registry.\")\n .option(\"--tag <tag>\", \"Filter modules by tag (AND logic). Repeatable.\", collectTag, [])\n .option(\"--format <format>\", \"Output format.\", undefined)\n .action((opts: { tag: string[]; format?: string }) => {\n // Validate tags\n for (const t of opts.tag) {\n validateTag(t);\n }\n\n const modules: ModuleDescriptor[] = [];\n for (const m of registry.listModules()) {\n modules.push(m);\n }\n\n let filtered = modules;\n if (opts.tag.length > 0) {\n const filterTags = new Set(opts.tag);\n filtered = modules.filter((m) => {\n const mTags = m.tags ?? [];\n return [...filterTags].every((t) => mTags.includes(t));\n });\n }\n\n const fmt = resolveFormat(opts.format);\n formatModuleList(filtered, fmt, opts.tag.length > 0 ? opts.tag : undefined);\n });\n cli.addCommand(listCmd);\n\n const describeCmd = new Command(\"describe\")\n .description(\"Show metadata, schema, and annotations for a module.\")\n .argument(\"<module-id>\", \"Module ID to describe\")\n .option(\"--format <format>\", \"Output format.\", undefined)\n .action((moduleId: string, opts: { format?: string }) => {\n validateModuleId(moduleId);\n\n const moduleDef = registry.getModule(moduleId);\n if (!moduleDef) {\n process.stderr.write(\n `Error: Module '${moduleId}' not found.\\n`,\n );\n process.exit(EXIT_CODES.MODULE_NOT_FOUND);\n }\n\n const fmt = resolveFormat(opts.format);\n formatModuleDetail(moduleDef, fmt);\n });\n cli.addCommand(describeCmd);\n}\n"],"mappings":"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","names":["error","fs","path","crypto","os","hostname","fs","os","path","readFileSync","fileURLToPath","path","Command","Option","resolve","sep","path","fs","readFileSync","fileURLToPath","path","__dirname","docsUrl","__dirname","fileURLToPath","readFileSync","Command","error","Option","Sandbox","getAuditLogger","resolve","Command","Command","Command","Command"]}
1
+ {"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js","../src/errors.ts","../src/security/audit.ts","../src/security/config-encryptor.ts","../src/security/auth.ts","../src/security/sandbox.ts","../src/security/index.ts","../src/index.ts","../src/main.ts","../src/ref-resolver.ts","../src/schema-parser.ts","../src/approval.ts","../src/output.ts","../src/logger.ts","../src/init-cmd.ts","../src/display-helpers.ts","../src/config.ts","../src/shell.ts","../src/discovery.ts","../src/system-cmd.ts","../src/strategy.ts","../src/cli.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Error classes and exit code mapping for apcore-cli.\n *\n * Protocol spec: Error handling & exit codes\n */\n\n// ---------------------------------------------------------------------------\n// Error classes\n// ---------------------------------------------------------------------------\n\n/** Thrown when the user does not approve module execution within the timeout. */\nexport class ApprovalTimeoutError extends Error {\n constructor(message = \"Approval timed out\") {\n super(message);\n this.name = \"ApprovalTimeoutError\";\n }\n}\n\n/** Thrown when API key authentication fails or is missing. */\nexport class AuthenticationError extends Error {\n constructor(message = \"Authentication failed\") {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\n/** Thrown when encrypted config cannot be decrypted. */\nexport class ConfigDecryptionError extends Error {\n constructor(message = \"Config decryption failed\") {\n super(message);\n this.name = \"ConfigDecryptionError\";\n }\n}\n\n/** Thrown when module execution fails. */\nexport class ModuleExecutionError extends Error {\n constructor(message = \"Module execution failed\") {\n super(message);\n this.name = \"ModuleExecutionError\";\n }\n}\n\n/** Thrown when approval is denied by the user. */\nexport class ApprovalDeniedError extends Error {\n constructor(message = \"Approval denied\") {\n super(message);\n this.name = \"ApprovalDeniedError\";\n }\n}\n\n/** Thrown when schema validation fails. */\nexport class SchemaValidationError extends Error {\n constructor(message = \"Schema validation failed\") {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n\n/** Thrown when a module is not found. */\nexport class ModuleNotFoundError extends Error {\n constructor(message = \"Module not found\") {\n super(message);\n this.name = \"ModuleNotFoundError\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Exit code map\n// ---------------------------------------------------------------------------\n\nexport const EXIT_CODES = {\n SUCCESS: 0,\n MODULE_EXECUTE_ERROR: 1,\n MODULE_TIMEOUT: 1,\n INVALID_CLI_INPUT: 2,\n MODULE_NOT_FOUND: 44,\n MODULE_LOAD_ERROR: 44,\n MODULE_DISABLED: 44,\n SCHEMA_VALIDATION_ERROR: 45,\n APPROVAL_DENIED: 46,\n APPROVAL_TIMEOUT: 46,\n CONFIG_NOT_FOUND: 47,\n CONFIG_INVALID: 47,\n SCHEMA_CIRCULAR_REF: 48,\n ACL_DENIED: 77,\n // Config Bus errors (apcore >= 0.15.0)\n CONFIG_NAMESPACE_RESERVED: 78,\n CONFIG_NAMESPACE_DUPLICATE: 78,\n CONFIG_ENV_PREFIX_CONFLICT: 78,\n CONFIG_ENV_MAP_CONFLICT: 78,\n CONFIG_MOUNT_ERROR: 66,\n CONFIG_BIND_ERROR: 65,\n ERROR_FORMATTER_DUPLICATE: 70,\n KEYBOARD_INTERRUPT: 130,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Map a caught error to the appropriate process exit code.\n * Also checks for apcore error codes on the error object.\n */\nexport function exitCodeForError(error: unknown): ExitCode {\n if (error instanceof ApprovalTimeoutError) {\n return EXIT_CODES.APPROVAL_TIMEOUT;\n }\n if (error instanceof ApprovalDeniedError) {\n return EXIT_CODES.APPROVAL_DENIED;\n }\n if (error instanceof AuthenticationError) {\n return EXIT_CODES.ACL_DENIED;\n }\n if (error instanceof ConfigDecryptionError) {\n return EXIT_CODES.CONFIG_INVALID;\n }\n if (error instanceof SchemaValidationError) {\n return EXIT_CODES.SCHEMA_VALIDATION_ERROR;\n }\n if (error instanceof ModuleNotFoundError) {\n return EXIT_CODES.MODULE_NOT_FOUND;\n }\n if (error instanceof ModuleExecutionError) {\n return EXIT_CODES.MODULE_EXECUTE_ERROR;\n }\n\n // Check for apcore error codes on the error object\n if (error instanceof Error) {\n const code = (error as unknown as Record<string, unknown>).code as string | undefined;\n const codeMap: Record<string, ExitCode> = {\n MODULE_NOT_FOUND: EXIT_CODES.MODULE_NOT_FOUND,\n MODULE_LOAD_ERROR: EXIT_CODES.MODULE_LOAD_ERROR,\n MODULE_DISABLED: EXIT_CODES.MODULE_DISABLED,\n SCHEMA_VALIDATION_ERROR: EXIT_CODES.SCHEMA_VALIDATION_ERROR,\n SCHEMA_CIRCULAR_REF: EXIT_CODES.SCHEMA_CIRCULAR_REF,\n APPROVAL_DENIED: EXIT_CODES.APPROVAL_DENIED,\n APPROVAL_TIMEOUT: EXIT_CODES.APPROVAL_TIMEOUT,\n APPROVAL_PENDING: EXIT_CODES.APPROVAL_DENIED,\n CONFIG_NOT_FOUND: EXIT_CODES.CONFIG_NOT_FOUND,\n CONFIG_INVALID: EXIT_CODES.CONFIG_INVALID,\n MODULE_EXECUTE_ERROR: EXIT_CODES.MODULE_EXECUTE_ERROR,\n MODULE_TIMEOUT: EXIT_CODES.MODULE_TIMEOUT,\n ACL_DENIED: EXIT_CODES.ACL_DENIED,\n // Config Bus errors (apcore >= 0.15.0)\n CONFIG_NAMESPACE_RESERVED: EXIT_CODES.CONFIG_NAMESPACE_RESERVED,\n CONFIG_NAMESPACE_DUPLICATE: EXIT_CODES.CONFIG_NAMESPACE_DUPLICATE,\n CONFIG_ENV_PREFIX_CONFLICT: EXIT_CODES.CONFIG_ENV_PREFIX_CONFLICT,\n CONFIG_MOUNT_ERROR: EXIT_CODES.CONFIG_MOUNT_ERROR,\n CONFIG_BIND_ERROR: EXIT_CODES.CONFIG_BIND_ERROR,\n ERROR_FORMATTER_DUPLICATE: EXIT_CODES.ERROR_FORMATTER_DUPLICATE,\n };\n if (code && code in codeMap) {\n return codeMap[code];\n }\n }\n\n return EXIT_CODES.MODULE_EXECUTE_ERROR;\n}\n","/**\n * AuditLogger — JSONL audit trail.\n *\n * Protocol spec: Security — audit logging\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ExecutionStatus = \"success\" | \"error\";\n\ninterface AuditEntry {\n timestamp: string;\n user: string;\n module_id: string;\n input_hash: string;\n status: ExecutionStatus;\n exit_code: number;\n duration_ms: number;\n}\n\n// ---------------------------------------------------------------------------\n// AuditLogger\n// ---------------------------------------------------------------------------\n\n/**\n * Appends structured JSONL entries to an audit log file for every module\n * execution, supporting compliance and debugging.\n */\nlet _auditLogger: AuditLogger | null = null;\n\n/**\n * Set the module-level audit logger instance.\n */\nexport function setAuditLogger(auditLogger: AuditLogger | null): void {\n _auditLogger = auditLogger;\n}\n\n/**\n * Get the current module-level audit logger instance.\n */\nexport function getAuditLogger(): AuditLogger | null {\n return _auditLogger;\n}\n\nexport class AuditLogger {\n static readonly DEFAULT_PATH = path.join(\n os.homedir(),\n \".apcore-cli\",\n \"audit.jsonl\",\n );\n\n private readonly logPath: string;\n\n constructor(path?: string) {\n this.logPath = path ?? AuditLogger.DEFAULT_PATH;\n this.ensureDirectory();\n }\n\n private ensureDirectory(): void {\n try {\n fs.mkdirSync(path.dirname(this.logPath), { recursive: true });\n } catch {\n // Silently ignore — we'll handle write errors in logExecution\n }\n }\n\n logExecution(\n moduleId: string,\n inputData: Record<string, unknown>,\n status: ExecutionStatus,\n exitCode: number,\n durationMs: number,\n ): void {\n const entry: AuditEntry = {\n timestamp: new Date().toISOString(),\n user: this.getUser(),\n module_id: moduleId,\n input_hash: this.hashInput(inputData),\n status,\n exit_code: exitCode,\n duration_ms: durationMs,\n };\n try {\n fs.appendFileSync(this.logPath, JSON.stringify(entry) + \"\\n\");\n } catch (err) {\n console.warn(`Could not write audit log: ${err}`);\n }\n }\n\n private hashInput(inputData: Record<string, unknown>): string {\n const salt = crypto.randomBytes(16);\n const sortedKeys = Object.keys(inputData).sort();\n const payload = JSON.stringify(inputData, sortedKeys);\n return crypto\n .createHash(\"sha256\")\n .update(Buffer.concat([salt, Buffer.from(payload, \"utf-8\")]))\n .digest(\"hex\");\n }\n\n private getUser(): string {\n try {\n return os.userInfo().username;\n } catch {\n return process.env.USER ?? process.env.USERNAME ?? \"unknown\";\n }\n }\n}\n","/**\n * ConfigEncryptor — Keyring + AES-256-GCM fallback.\n *\n * Protocol spec: Security — config encryption\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as os from \"node:os\";\nimport { ConfigDecryptionError } from \"../errors.js\";\n\n// ---------------------------------------------------------------------------\n// Keytar dynamic import helper\n// ---------------------------------------------------------------------------\n\nlet keytarModule: any = null; // eslint-disable-line @typescript-eslint/no-explicit-any\nasync function getKeytar(): Promise<any> { // eslint-disable-line @typescript-eslint/no-explicit-any\n if (keytarModule) return keytarModule;\n try {\n // @ts-expect-error — keytar is an optional peer dependency\n keytarModule = await import(\"keytar\");\n return keytarModule;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// ConfigEncryptor\n// ---------------------------------------------------------------------------\n\n/**\n * Encrypts and decrypts configuration values. Prefers OS keyring for key\n * storage, falling back to AES-256-GCM with a derived key.\n */\nexport class ConfigEncryptor {\n static readonly SERVICE_NAME = \"apcore-cli\";\n\n /**\n * Encrypt and store a configuration value.\n */\n async store(key: string, value: string): Promise<string> {\n const keytar = await getKeytar();\n if (keytar) {\n try {\n await keytar.setPassword(ConfigEncryptor.SERVICE_NAME, key, value);\n return `keyring:${key}`;\n } catch {\n // Fall through to file-based encryption\n }\n }\n console.warn(\"OS keyring unavailable. Using file-based encryption.\");\n const ciphertext = this.aesEncrypt(value);\n return `enc:${Buffer.from(ciphertext).toString(\"base64\")}`;\n }\n\n /**\n * Retrieve and decrypt a configuration value.\n */\n async retrieve(configValue: string, key: string): Promise<string> {\n if (configValue.startsWith(\"keyring:\")) {\n const keytar = await getKeytar();\n if (!keytar) {\n throw new ConfigDecryptionError(\n `Keyring module not available to retrieve '${key}'.`,\n );\n }\n try {\n const refKey = configValue.slice(\"keyring:\".length);\n const result = await keytar.getPassword(\n ConfigEncryptor.SERVICE_NAME,\n refKey,\n );\n if (result === null || result === undefined) {\n throw new ConfigDecryptionError(\n `Keyring entry not found for '${refKey}'.`,\n );\n }\n return result;\n } catch (err) {\n if (err instanceof ConfigDecryptionError) throw err;\n throw new ConfigDecryptionError(\n `Failed to retrieve from keyring: ${err}`,\n );\n }\n }\n\n if (configValue.startsWith(\"enc:\")) {\n const ciphertext = Buffer.from(\n configValue.slice(\"enc:\".length),\n \"base64\",\n );\n try {\n return this.aesDecrypt(ciphertext);\n } catch {\n throw new ConfigDecryptionError(\n `Failed to decrypt configuration value '${key}'. Re-configure with 'apcore-cli config set ${key}'.`,\n );\n }\n }\n\n // Unrecognized prefix — return as-is\n return configValue;\n }\n\n // NOTE: Best-effort fallback when OS keyring is unavailable.\n // The key is derived from hostname + username (non-secret inputs).\n // For production security, ensure the OS keyring is accessible.\n private deriveKey(): Buffer {\n const hostname = os.hostname();\n const username =\n process.env.USER ?? process.env.USERNAME ?? \"unknown\";\n const salt = Buffer.from(\"apcore-cli-config-v1\");\n const material = `${hostname}:${username}`;\n return crypto.pbkdf2Sync(material, salt, 100_000, 32, \"sha256\");\n }\n\n private aesEncrypt(plaintext: string): Buffer {\n const key = this.deriveKey();\n const nonce = crypto.randomBytes(12);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", key, nonce);\n const ct = Buffer.concat([\n cipher.update(plaintext, \"utf-8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n // Wire format: nonce(12) + tag(16) + ciphertext\n return Buffer.concat([nonce, tag, ct]);\n }\n\n private aesDecrypt(data: Buffer): string {\n const key = this.deriveKey();\n const nonce = data.subarray(0, 12);\n const tag = data.subarray(12, 28);\n const ct = data.subarray(28);\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([decipher.update(ct), decipher.final()]);\n return plaintext.toString(\"utf-8\");\n }\n}\n","/**\n * AuthProvider — API key auth with keyring/encrypted storage.\n *\n * Protocol spec: Security — authentication\n */\n\nimport type { ConfigResolver } from \"../config.js\";\nimport { AuthenticationError } from \"../errors.js\";\nimport { ConfigEncryptor } from \"./config-encryptor.js\";\n\n// ---------------------------------------------------------------------------\n// AuthProvider\n// ---------------------------------------------------------------------------\n\n/**\n * Manages API key retrieval and request authentication.\n */\nexport class AuthProvider {\n private readonly config: ConfigResolver;\n private readonly encryptor: ConfigEncryptor;\n\n constructor(config: ConfigResolver, encryptor?: ConfigEncryptor) {\n this.config = config;\n this.encryptor = encryptor ?? new ConfigEncryptor();\n }\n\n /**\n * Retrieve the API key from the configured sources.\n * Handles keyring: and enc: prefixes via ConfigEncryptor.\n */\n async getApiKey(): Promise<string | null> {\n const result = this.config.resolve(\n \"auth.api_key\",\n \"--api-key\",\n \"APCORE_AUTH_API_KEY\",\n );\n if (result === null || result === undefined) {\n return null;\n }\n const strResult = String(result);\n if (strResult.startsWith(\"keyring:\") || strResult.startsWith(\"enc:\")) {\n return this.encryptor.retrieve(strResult, \"auth.api_key\");\n }\n return strResult;\n }\n\n /**\n * Add authentication headers to an outgoing request.\n */\n async authenticateRequest(\n headers: Record<string, string>,\n ): Promise<Record<string, string>> {\n const key = await this.getApiKey();\n if (!key) {\n throw new AuthenticationError(\n \"Remote registry requires authentication. \" +\n \"Set --api-key, APCORE_AUTH_API_KEY, or auth.api_key in config.\",\n );\n }\n return { ...headers, Authorization: `Bearer ${key}` };\n }\n\n /**\n * Handle an HTTP response status code for auth-related errors.\n */\n handleResponse(statusCode: number): void {\n if (statusCode === 401 || statusCode === 403) {\n throw new AuthenticationError(\n \"Authentication failed. Verify your API key.\",\n );\n }\n }\n}\n","/**\n * Sandbox — Subprocess isolation for module execution.\n *\n * Protocol spec: Security — sandboxed execution\n */\n\nimport * as child_process from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { Executor } from \"../cli.js\";\nimport { ModuleExecutionError } from \"../errors.js\";\n\n// ---------------------------------------------------------------------------\n// Sandbox\n// ---------------------------------------------------------------------------\n\n/**\n * Executes modules in an isolated subprocess to limit the blast radius\n * of untrusted or third-party modules.\n *\n * When disabled, delegates directly to the Executor.\n */\nexport class Sandbox {\n private readonly enabled: boolean;\n\n constructor(enabled = false) {\n this.enabled = enabled;\n }\n\n /**\n * Execute a module, optionally inside a sandboxed subprocess.\n */\n async execute(\n moduleId: string,\n inputData: Record<string, unknown>,\n executor: Executor,\n ): Promise<unknown> {\n if (!this.enabled) {\n return executor.execute(moduleId, inputData);\n }\n return this.sandboxedExecute(moduleId, inputData);\n }\n\n private sandboxedExecute(\n moduleId: string,\n inputData: Record<string, unknown>,\n ): unknown {\n // Build restricted environment\n const env: Record<string, string> = {};\n for (const key of [\"PATH\", \"NODE_PATH\", \"LANG\", \"LC_ALL\"]) {\n if (process.env[key]) {\n env[key] = process.env[key]!;\n }\n }\n for (const [key, value] of Object.entries(process.env)) {\n if (key.startsWith(\"APCORE_\") && value) {\n env[key] = value;\n }\n }\n\n const tmpDir = fs.mkdtempSync(\n path.join(os.tmpdir(), \"apcore_sandbox_\"),\n );\n\n try {\n env.HOME = tmpDir;\n env.TMPDIR = tmpDir;\n\n const script = [\n \"let d='';\",\n \"process.stdin.setEncoding('utf-8');\",\n \"process.stdin.on('data',c=>d+=c);\",\n \"process.stdin.on('end',()=>{\",\n \" const input=JSON.parse(d);\",\n ` process.stdout.write(JSON.stringify({error:\"Sandbox runner not yet implemented for module: ${moduleId}\"}));`,\n \"});\",\n ].join(\"\");\n\n const result = child_process.execFileSync(\n process.execPath,\n [\"-e\", script],\n {\n input: JSON.stringify(inputData),\n env,\n cwd: tmpDir,\n timeout: 300_000,\n maxBuffer: 10 * 1024 * 1024,\n },\n );\n\n return JSON.parse(result.toString(\"utf-8\"));\n } catch (err: unknown) {\n if (\n err instanceof Error &&\n \"killed\" in err &&\n (err as Record<string, unknown>).killed\n ) {\n throw new ModuleExecutionError(\n `Error: Module '${moduleId}' timed out in sandbox.`,\n );\n }\n const stderr =\n err instanceof Error && \"stderr\" in err\n ? String((err as Record<string, unknown>).stderr)\n : String(err);\n throw new ModuleExecutionError(\n `Error: Module '${moduleId}' execution failed: ${stderr}`,\n );\n } finally {\n try {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // Best effort cleanup\n }\n }\n }\n}\n","/**\n * Security module re-exports.\n *\n * Protocol spec: Security subsystem\n */\n\nexport { AuditLogger, setAuditLogger, getAuditLogger } from \"./audit.js\";\nexport { AuthProvider } from \"./auth.js\";\nexport { ConfigEncryptor } from \"./config-encryptor.js\";\nexport { Sandbox } from \"./sandbox.js\";\n","/**\n * apcore-cli — Public API exports.\n *\n * This module re-exports the public surface of the apcore CLI package.\n */\n\n// Core CLI\nexport { createCli, main, buildModuleCommand, validateModuleId, collectInput, reconvertEnumValues, applyToolkitIntegration, verboseHelp, setVerboseHelp, docsUrl, setDocsUrl, emitErrorJson, emitErrorTty } from \"./main.js\";\nexport type { OptionConfig, CreateCliOptions } from \"./main.js\";\n\n// Lazy module loading\nexport { LazyModuleGroup, GroupedModuleGroup, LazyGroup, BUILTIN_COMMANDS } from \"./cli.js\";\nexport type { Registry, Executor, ModuleDescriptor, PreflightResult, PreflightCheck, PipelineTrace, PipelineTraceStep } from \"./cli.js\";\n\n// Approval\nexport { CliApprovalHandler } from \"./approval.js\";\n\n// Display helpers\nexport { getDisplay, getCliDisplayFields } from \"./display-helpers.js\";\n\n// Init command\nexport { registerInitCommand } from \"./init-cmd.js\";\n\n// Configuration\nexport { ConfigResolver, DEFAULTS, registerConfigNamespace } from \"./config.js\";\n\n// Discovery\nexport { registerDiscoveryCommands, registerValidateCommand } from \"./discovery.js\";\n\n// Output formatting\nexport { formatExecResult, resolveFormat, truncate, formatModuleList, formatModuleDetail, formatPreflightResult, firstFailedExitCode } from \"./output.js\";\n\n// Schema handling\nexport { resolveRefs } from \"./ref-resolver.js\";\nexport { schemaToCliOptions, mapType, extractHelp } from \"./schema-parser.js\";\n\n// Approval\nexport { checkApproval } from \"./approval.js\";\n\n// Shell integration\nexport { registerShellCommands, buildProgramManPage, configureManHelp } from \"./shell.js\";\n\n// System commands (F2)\nexport { registerSystemCommands } from \"./system-cmd.js\";\n\n// Strategy / pipeline commands (F8)\nexport { registerPipelineCommand } from \"./strategy.js\";\n\n// Errors\nexport {\n ApprovalTimeoutError,\n ApprovalDeniedError,\n AuthenticationError,\n ConfigDecryptionError,\n ModuleExecutionError,\n ModuleNotFoundError,\n SchemaValidationError,\n EXIT_CODES,\n exitCodeForError,\n} from \"./errors.js\";\nexport type { ExitCode } from \"./errors.js\";\n\n// Logger\nexport { setLogLevel, getLogLevel, debug, info, warn, error } from \"./logger.js\";\n\n// Security\nexport { AuditLogger, setAuditLogger, getAuditLogger, AuthProvider, ConfigEncryptor, Sandbox } from \"./security/index.js\";\n","/**\n * CLI entry point — createCli / main equivalents.\n *\n * Protocol spec: CLI bootstrapping & command registration\n * Implements: F1 (dry-run), F3 (enhanced errors), F4 (trace),\n * F5 (approval handler), F6 (stream), F8 (strategy), F9 (output formats),\n * F11 (extra commands)\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport * as path from \"node:path\";\nimport { Command, CommanderError, Option } from \"commander\";\nimport { EXIT_CODES, exitCodeForError } from \"./errors.js\";\nimport { resolveRefs } from \"./ref-resolver.js\";\nimport { schemaToCliOptions } from \"./schema-parser.js\";\nimport { checkApproval } from \"./approval.js\";\nimport { formatExecResult, formatPreflightResult, firstFailedExitCode, resolveFormat } from \"./output.js\";\nimport { setLogLevel } from \"./logger.js\";\nimport { registerInitCommand } from \"./init-cmd.js\";\nimport { getDisplay } from \"./display-helpers.js\";\nimport { registerConfigNamespace } from \"./config.js\";\nimport { configureManHelp } from \"./shell.js\";\nimport { registerValidateCommand } from \"./discovery.js\";\nimport { registerSystemCommands } from \"./system-cmd.js\";\nimport { registerPipelineCommand } from \"./strategy.js\";\nimport { BUILTIN_COMMANDS } from \"./cli.js\";\nimport type { Executor, ModuleDescriptor, Registry } from \"./cli.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/** Whether --verbose was passed (controls help detail level). */\nexport let verboseHelp = false;\n\n/** Set the verbose help flag. When false, built-in options are hidden from help. */\nexport function setVerboseHelp(verbose: boolean): void {\n verboseHelp = verbose;\n}\n\n/** Base URL for online documentation. Null means no docs link shown. */\nexport let docsUrl: string | null = null;\n\n/**\n * Set the base URL for online documentation links shown in help and man pages.\n * Pass null to disable. Command-level help appends `/commands/{name}` automatically.\n *\n * @example setDocsUrl(\"https://docs.apcore.dev/cli\");\n */\nexport function setDocsUrl(url: string | null): void {\n docsUrl = url;\n}\n\n/** Check if --verbose is present in process.argv (pre-parse, before Commander). */\nfunction hasVerboseFlag(): boolean {\n return process.argv.includes(\"--verbose\");\n}\n\nlet VERSION = \"0.0.0\";\ntry {\n const pkg = JSON.parse(readFileSync(path.resolve(__dirname, \"../package.json\"), \"utf-8\"));\n VERSION = pkg.version;\n} catch {\n // Bundled environments (e.g., Bun compile) may not have package.json accessible\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Configuration for a single Commander option derived from a JSON Schema property. */\nexport interface OptionConfig {\n /** The property name from the schema. */\n name: string;\n /** Commander flags string (e.g. \"--my-flag <value>\" or \"--flag, --no-flag\"). */\n flags: string;\n /** Help text for the option. */\n description: string;\n /** Default value. */\n defaultValue?: unknown;\n /** Whether the field is required (for display only). */\n required: boolean;\n /** Enum choices (string values). */\n choices?: string[];\n /** Whether this is a boolean flag pair (--flag/--no-flag). */\n isBooleanFlag?: boolean;\n /** Maps string enum value → original type name (\"int\", \"float\", \"bool\"). */\n enumOriginalTypes?: Record<string, string>;\n /** Parser function for Commander (e.g. parseInt, parseFloat). */\n parseArg?: (value: string) => unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Error code mapping from apcore error codes to CLI exit codes\n// ---------------------------------------------------------------------------\n\nconst ERROR_CODE_MAP: Record<string, number> = {\n MODULE_NOT_FOUND: 44,\n MODULE_LOAD_ERROR: 44,\n MODULE_DISABLED: 44,\n SCHEMA_VALIDATION_ERROR: 45,\n SCHEMA_CIRCULAR_REF: 48,\n APPROVAL_DENIED: 46,\n APPROVAL_TIMEOUT: 46,\n APPROVAL_PENDING: 46,\n CONFIG_NOT_FOUND: 47,\n CONFIG_INVALID: 47,\n MODULE_EXECUTE_ERROR: 1,\n MODULE_TIMEOUT: 1,\n ACL_DENIED: 77,\n CONFIG_NAMESPACE_RESERVED: 78,\n CONFIG_NAMESPACE_DUPLICATE: 78,\n CONFIG_ENV_PREFIX_CONFLICT: 78,\n CONFIG_ENV_MAP_CONFLICT: 78,\n CONFIG_MOUNT_ERROR: 66,\n CONFIG_BIND_ERROR: 65,\n ERROR_FORMATTER_DUPLICATE: 70,\n};\n\n// ---------------------------------------------------------------------------\n// Enhanced error output (F3)\n// ---------------------------------------------------------------------------\n\n/**\n * Emit structured JSON error to stderr for AI agents.\n */\nexport function emitErrorJson(e: unknown, exitCode: number): void {\n const err = e instanceof Error ? e : new Error(String(e));\n const errRecord = err as unknown as Record<string, unknown>;\n const code = errRecord.code ?? \"UNKNOWN\";\n const payload: Record<string, unknown> = {\n error: true,\n code,\n message: err.message,\n exit_code: exitCode,\n };\n for (const field of [\"details\", \"suggestion\", \"ai_guidance\", \"retryable\", \"user_fixable\"]) {\n const val = errRecord[field];\n if (val !== undefined && val !== null) {\n payload[field] = val;\n }\n }\n process.stderr.write(JSON.stringify(payload) + \"\\n\");\n}\n\n/**\n * Emit human-readable error to stderr with guidance fields.\n */\nexport function emitErrorTty(e: unknown, exitCode: number): void {\n const err = e instanceof Error ? e : new Error(String(e));\n const errRecord = err as unknown as Record<string, unknown>;\n const code = errRecord.code;\n const header = code ? `Error [${code}]: ${err.message}` : `Error: ${err.message}`;\n process.stderr.write(header + \"\\n\");\n\n const details = errRecord.details;\n if (details && typeof details === \"object\" && !Array.isArray(details)) {\n process.stderr.write(\"\\n Details:\\n\");\n for (const [k, v] of Object.entries(details as Record<string, unknown>)) {\n process.stderr.write(` ${k}: ${v}\\n`);\n }\n }\n\n const suggestion = errRecord.suggestion;\n if (suggestion) {\n process.stderr.write(`\\n Suggestion: ${suggestion}\\n`);\n }\n\n const retryable = errRecord.retryable;\n if (retryable !== undefined && retryable !== null) {\n const label = retryable ? \"Yes\" : \"No (same input will fail again)\";\n process.stderr.write(` Retryable: ${label}\\n`);\n }\n\n process.stderr.write(`\\n Exit code: ${exitCode}\\n`);\n}\n\n// ---------------------------------------------------------------------------\n// createCli\n// ---------------------------------------------------------------------------\n\n/** Options for createCli. */\nexport interface CreateCliOptions {\n extensionsDir?: string;\n progName?: string;\n verbose?: boolean;\n /** Pre-populated Registry instance. Skips filesystem discovery when provided. */\n registry?: Registry;\n /** Pre-built Executor instance. Used alongside registry. */\n executor?: Executor;\n /** Extra commands to register after built-in commands (FE-11 F11). */\n extraCommands?: Command[];\n}\n\n/**\n * Build and return the top-level Commander program.\n *\n * @param extensionsDirOrOpts Path to extensions directory, or a CreateCliOptions object.\n * @param progName Program name shown in help (default: apcore-cli)\n * @param verbose Show verbose help output\n */\nexport function createCli(\n extensionsDirOrOpts?: string | CreateCliOptions,\n progName?: string,\n verbose = false,\n): Command {\n // Normalise overloaded first argument.\n let extensionsDir: string | undefined;\n let registry: Registry | undefined;\n let executor: Executor | undefined;\n let extraCommands: Command[] | undefined;\n if (typeof extensionsDirOrOpts === \"object\" && extensionsDirOrOpts !== null) {\n extensionsDir = extensionsDirOrOpts.extensionsDir;\n progName = extensionsDirOrOpts.progName ?? progName;\n verbose = extensionsDirOrOpts.verbose ?? verbose;\n registry = extensionsDirOrOpts.registry;\n executor = extensionsDirOrOpts.executor;\n extraCommands = extensionsDirOrOpts.extraCommands;\n } else {\n extensionsDir = extensionsDirOrOpts;\n }\n\n verboseHelp = verbose;\n // Register Config Bus namespace (apcore >= 0.15.0)\n registerConfigNamespace();\n // Resolve program name\n const resolvedProgName = progName ?? path.basename(process.argv[1] ?? \"apcore-cli\") ?? \"apcore-cli\";\n\n // Resolve log level\n const cliLogLevel = process.env.APCORE_CLI_LOGGING_LEVEL ?? process.env.APCORE_LOGGING_LEVEL ?? \"WARNING\";\n setLogLevel(cliLogLevel);\n\n const program = new Command(resolvedProgName)\n .exitOverride()\n .version(VERSION, \"--version\", `Show ${resolvedProgName} version`)\n .description(\"apcore CLI — execute apcore modules from the command line\")\n .option(\"--extensions-dir <path>\", \"Path to extensions directory\")\n .option(\"--commands-dir <path>\", \"Path to convention-based commands directory\")\n .option(\"--binding <path>\", \"Path to binding.yaml for display overlay\")\n .option(\"--log-level <level>\", \"Logging level (DEBUG|INFO|WARNING|ERROR)\", \"WARNING\")\n .option(\"--verbose\", \"Show all options in help output (including built-in apcore options)\");\n\n // Validate parameter combination: executor without registry is invalid.\n if (executor && !registry) {\n throw new Error(\"executor requires registry — pass both or neither\");\n }\n\n // Registry/executor wiring: use pre-populated instances if provided,\n // otherwise fall back to extensions-dir discovery (requires apcore-js).\n if (registry) {\n // Pre-populated registry provided — skip filesystem discovery.\n (program as unknown as Record<string, unknown>)._registry = registry;\n if (executor) {\n (program as unknown as Record<string, unknown>)._executor = executor;\n\n // Register validate command (F1)\n registerValidateCommand(program, registry, executor);\n\n // Register system commands (F2) — async but fire-and-forget during setup\n void registerSystemCommands(program, executor);\n\n // Register describe-pipeline command (F8)\n registerPipelineCommand(program, executor);\n }\n } else {\n const resolvedExtDir = extensionsDir\n ?? process.env.APCORE_EXTENSIONS_ROOT\n ?? \"./extensions\";\n void resolvedExtDir; // Will be used when apcore-js registry is wired\n }\n\n // Footer hints for discoverability\n program.addHelpText(\"after\", [\n \"\",\n \"Use --help --verbose to show all options (including built-in apcore options).\",\n \"Use --help --man to display a formatted man page.\",\n ].join(\"\\n\"));\n\n // Register init command for scaffolding\n registerInitCommand(program);\n\n // Register --help --man support\n configureManHelp(program, resolvedProgName, VERSION);\n\n // Register extra commands (F11) — validate no name collisions with builtins\n if (extraCommands && extraCommands.length > 0) {\n const existingNames = new Set([\n ...BUILTIN_COMMANDS,\n ...program.commands.map((c) => c.name()),\n ]);\n for (const cmd of extraCommands) {\n const cmdName = cmd.name();\n if (existingNames.has(cmdName)) {\n process.stderr.write(\n `Warning: Extra command '${cmdName}' collides with a built-in command and will be skipped.\\n`,\n );\n continue;\n }\n program.addCommand(cmd);\n existingNames.add(cmdName);\n }\n }\n\n // Hook to apply optional toolkit integration before command execution.\n // Commander actions are async, so we can set up toolkit state lazily.\n program.hook(\"preAction\", async (thisCommand) => {\n const opts = thisCommand.opts();\n const commandsDir = opts.commandsDir as string | undefined;\n const bindingPath = opts.binding as string | undefined;\n await applyToolkitIntegration(commandsDir, bindingPath);\n });\n\n return program;\n}\n\n// ---------------------------------------------------------------------------\n// applyToolkitIntegration\n// ---------------------------------------------------------------------------\n\n/**\n * Optionally apply apcore-toolkit features (DisplayResolver, RegistryWriter).\n *\n * Uses dynamic import so the dependency remains optional — if apcore-toolkit\n * is not installed, a warning is printed and the CLI continues without it.\n */\nexport async function applyToolkitIntegration(\n commandsDir?: string,\n bindingPath?: string,\n): Promise<void> {\n if (!commandsDir && !bindingPath) {\n return;\n }\n\n try {\n // Use a variable to prevent TypeScript from resolving the module at build time\n const toolkitModule = \"apcore-toolkit\";\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const toolkit = await import(/* @vite-ignore */ toolkitModule);\n\n // ConventionScanner is not yet available in the TypeScript toolkit\n if (commandsDir) {\n console.warn(\"Convention scanning not yet available in TypeScript toolkit\");\n }\n\n // DisplayResolver for binding overlay\n if (bindingPath) {\n const resolver = new toolkit.DisplayResolver();\n // NOTE: Full integration requires registered modules from apcore-js.\n // For now, the resolver is instantiated and ready for when modules\n // are available through the registry.\n void resolver;\n }\n } catch {\n // apcore-toolkit not installed — graceful fallback\n console.warn(\"apcore-toolkit not installed — toolkit features unavailable\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// main\n// ---------------------------------------------------------------------------\n\n/**\n * Parse argv and run the CLI. Handles top-level error catching and exit codes.\n */\nexport function main(progName?: string): void {\n verboseHelp = hasVerboseFlag();\n const program = createCli(undefined, progName, verboseHelp);\n\n try {\n program.parse(process.argv);\n } catch (error: unknown) {\n if (error instanceof CommanderError) {\n // Commander already printed the error message\n process.exit(error.exitCode);\n }\n const code = exitCodeForError(error);\n if (error instanceof Error) {\n process.stderr.write(`Error: ${error.message}\\n`);\n }\n process.exit(code);\n }\n}\n\n// ---------------------------------------------------------------------------\n// buildModuleCommand\n// ---------------------------------------------------------------------------\n\n/**\n * Build a Commander Command for a single apcore module.\n *\n * Includes all 11 FE-11 options: --dry-run, --trace, --stream, --strategy,\n * --approval-timeout, --approval-token, --fields, and enhanced --format choices.\n */\nexport function buildModuleCommand(\n moduleDef: ModuleDescriptor,\n executor: Executor,\n helpTextMaxLength = 1000,\n cmdName?: string,\n verbose = verboseHelp,\n): Command {\n const moduleId = moduleDef.id;\n let resolvedSchema: Record<string, unknown> = {};\n let schemaOptions: OptionConfig[] = [];\n\n // Resolve display overlay fields\n const display = getDisplay(moduleDef);\n const cliDisplay = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const effectiveCmdName: string = cmdName ?? (cliDisplay.alias as string | undefined) ?? moduleId;\n const cmdHelp: string = (cliDisplay.description as string | undefined) ?? moduleDef.description;\n\n // Resolve schema\n const inputSchema = moduleDef.inputSchema;\n if (inputSchema && typeof inputSchema === \"object\" && inputSchema.properties) {\n try {\n resolvedSchema = resolveRefs(inputSchema, 32, moduleId);\n } catch {\n resolvedSchema = inputSchema;\n }\n schemaOptions = schemaToCliOptions(resolvedSchema, helpTextMaxLength);\n }\n\n const cmd = new Command(effectiveCmdName).description(cmdHelp);\n\n // Built-in options (hidden unless --verbose)\n const inputOpt = new Option(\"--input <source>\", \"Read JSON input from a file path, or use '-' to read from stdin pipe\");\n const yesOpt = new Option(\"-y, --yes\", \"Skip interactive approval prompts (for scripts and CI)\").default(false);\n const largeInputOpt = new Option(\"--large-input\", \"Allow stdin input larger than 10MB (default limit protects against accidental pipes)\").default(false);\n const formatOpt = new Option(\"--format <format>\", \"Output format: json, table, csv, yaml, jsonl.\")\n .choices([\"json\", \"table\", \"csv\", \"yaml\", \"jsonl\"]);\n const fieldsOpt = new Option(\"--fields <fields>\", \"Comma-separated dot-paths to select from the result (e.g., 'status,data.count').\");\n // --sandbox is always hidden (not yet implemented)\n const sandboxOpt = new Option(\"--sandbox\", \"Run module in an isolated subprocess with restricted filesystem and env access\").default(false).hideHelp();\n // F1: --dry-run\n const dryRunOpt = new Option(\"--dry-run\", \"Run preflight checks without executing the module. Shows validation results.\").default(false);\n // F4: --trace\n const traceOpt = new Option(\"--trace\", \"Show execution pipeline trace with per-step timing after the result.\").default(false);\n // F6: --stream\n const streamOpt = new Option(\"--stream\", \"Stream module output as JSONL (one JSON object per line, flushed immediately).\").default(false);\n // F8: --strategy\n const strategyOpt = new Option(\"--strategy <name>\", \"Execution pipeline strategy: standard (default), internal, testing, performance.\")\n .choices([\"standard\", \"internal\", \"testing\", \"performance\", \"minimal\"]);\n // F5: --approval-timeout, --approval-token\n const approvalTimeoutOpt = new Option(\"--approval-timeout <seconds>\", \"Override approval prompt timeout in seconds (default: 60).\").argParser(parseInt);\n const approvalTokenOpt = new Option(\"--approval-token <token>\", \"Resume a pending approval with the given token (for async approval flows).\");\n\n if (!verbose) {\n inputOpt.hideHelp();\n yesOpt.hideHelp();\n largeInputOpt.hideHelp();\n formatOpt.hideHelp();\n fieldsOpt.hideHelp();\n dryRunOpt.hideHelp();\n traceOpt.hideHelp();\n streamOpt.hideHelp();\n strategyOpt.hideHelp();\n approvalTimeoutOpt.hideHelp();\n approvalTokenOpt.hideHelp();\n }\n\n cmd.addOption(inputOpt);\n cmd.addOption(yesOpt);\n cmd.addOption(largeInputOpt);\n cmd.addOption(formatOpt);\n cmd.addOption(fieldsOpt);\n cmd.addOption(sandboxOpt);\n cmd.addOption(dryRunOpt);\n cmd.addOption(traceOpt);\n cmd.addOption(streamOpt);\n cmd.addOption(strategyOpt);\n cmd.addOption(approvalTimeoutOpt);\n cmd.addOption(approvalTokenOpt);\n\n // Help footer: verbose hint + optional docs link\n const footerParts: string[] = [];\n if (!verbose) {\n footerParts.push(\"Use --verbose to show all options (including built-in apcore options).\");\n }\n if (docsUrl) {\n footerParts.push(`Docs: ${docsUrl}/commands/${effectiveCmdName}`);\n }\n if (footerParts.length > 0) {\n cmd.addHelpText(\"after\", \"\\n\" + footerParts.join(\"\\n\") + \"\\n\");\n }\n\n // Guard: schema property names must not collide with built-in option names.\n const reservedNames = new Set([\n \"input\", \"yes\", \"largeInput\", \"format\", \"fields\", \"sandbox\", \"verbose\",\n \"dryRun\", \"trace\", \"stream\", \"strategy\", \"approvalTimeout\", \"approvalToken\",\n ]);\n for (const opt of schemaOptions) {\n if (reservedNames.has(opt.name)) {\n process.stderr.write(\n `Error: Module '${moduleId}' schema property '${opt.name}' conflicts ` +\n `with a reserved CLI option name. Rename the property.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n }\n\n // Schema-generated options\n for (const opt of schemaOptions) {\n if (opt.parseArg) {\n cmd.option(opt.flags, opt.description, opt.parseArg, opt.defaultValue);\n } else {\n cmd.option(opt.flags, opt.description, opt.defaultValue as string | boolean | undefined);\n }\n }\n\n // Action callback\n cmd.action(async (options: Record<string, unknown>) => {\n // Pop built-in options\n const stdinFlag = options.input as string | undefined;\n const autoApprove = options.yes as boolean;\n const largeInput = options.largeInput as boolean;\n const outputFormat = options.format as string | undefined;\n const outputFields = options.fields as string | undefined;\n const sandboxEnabled = options.sandbox as boolean;\n const dryRun = options.dryRun as boolean;\n const traceFlag = options.trace as boolean;\n const streamFlag = options.stream as boolean;\n const strategyName = options.strategy as string | undefined;\n const approvalTimeout = (options.approvalTimeout as number | undefined) ?? 60;\n const approvalToken = options.approvalToken as string | undefined;\n\n // Remove built-in keys from options to get schema kwargs\n const schemaKwargs: Record<string, unknown> = {};\n const builtinKeys = new Set([\n \"input\", \"yes\", \"largeInput\", \"format\", \"fields\", \"sandbox\", \"verbose\",\n \"dryRun\", \"trace\", \"stream\", \"strategy\", \"approvalTimeout\", \"approvalToken\",\n ]);\n for (const [k, v] of Object.entries(options)) {\n if (!builtinKeys.has(k)) {\n schemaKwargs[k] = v;\n }\n }\n\n let merged: Record<string, unknown> = {};\n\n try {\n // 1. Collect and merge input\n merged = await collectInput(stdinFlag, schemaKwargs, largeInput);\n\n // 2. Reconvert enum values\n const reconverted = reconvertEnumValues(merged, schemaOptions);\n merged = reconverted;\n\n // -- Dry-run: preflight validation only, no execution (F1) --\n if (dryRun) {\n if (!executor.validate) {\n process.stderr.write(\"Error: Executor does not support validate.\\n\");\n process.exit(1);\n }\n const preflight = await executor.validate(moduleId, merged);\n formatPreflightResult(preflight, outputFormat);\n // --trace --dry-run: show pipeline preview\n if (traceFlag) {\n const pureSteps = new Set([\n \"context_creation\", \"call_chain_guard\", \"module_lookup\", \"acl_check\", \"input_validation\",\n ]);\n const allSteps = [\n \"context_creation\", \"call_chain_guard\", \"module_lookup\", \"acl_check\",\n \"approval_gate\", \"middleware_before\", \"input_validation\", \"execute\",\n \"output_validation\", \"middleware_after\", \"return_result\",\n ];\n process.stderr.write(\"\\nPipeline preview (dry-run):\\n\");\n for (const s of allSteps) {\n if (pureSteps.has(s)) {\n process.stderr.write(` \\u2713 ${s.padEnd(24)} (pure \\u2014 would execute)\\n`);\n } else {\n process.stderr.write(` \\u25cb ${s.padEnd(24)} (impure \\u2014 skipped in dry-run)\\n`);\n }\n }\n }\n process.exit(preflight.valid ? 0 : firstFailedExitCode(preflight));\n }\n\n // -- Inject approval token if provided (F5) --\n if (approvalToken) {\n merged._approval_token = approvalToken;\n }\n\n // 3. Check approval\n await checkApproval(moduleDef, autoApprove, approvalTimeout);\n\n // 4. Execute with timing\n const startTime = performance.now();\n\n // -- Streaming execution (F6) --\n if (streamFlag) {\n // Streaming always outputs JSONL; --format table is ignored (spec §3.6.2)\n if (resolveFormat(outputFormat) === \"table\") {\n process.stderr.write(\"Warning: Streaming mode always outputs JSONL; --format table is ignored.\\n\");\n }\n const annotations = moduleDef.annotations as Record<string, unknown> | undefined;\n const isStreaming = annotations?.streaming === true;\n if (!isStreaming) {\n process.stderr.write(\n `Warning: Module '${moduleId}' does not declare streaming support. Falling back to standard execution.\\n`,\n );\n }\n\n if (isStreaming && executor.stream) {\n let chunks = 0;\n for await (const chunk of executor.stream(moduleId, merged)) {\n chunks++;\n process.stdout.write(JSON.stringify(chunk) + \"\\n\");\n if (process.stderr.isTTY) {\n process.stderr.write(`\\rStreaming ${moduleId}... (${chunks} chunks)`);\n }\n }\n if (process.stderr.isTTY) {\n process.stderr.write(\"\\n\");\n }\n const durationMs = Math.round(performance.now() - startTime);\n\n // Audit log (success)\n const { getAuditLogger } = await import(\"./security/audit.js\");\n const auditLogger = getAuditLogger();\n if (auditLogger) {\n auditLogger.logExecution(moduleId, merged, \"success\", 0, durationMs);\n }\n return;\n }\n // else: fall through to normal execution\n }\n\n // -- Traced execution (F4) --\n if (traceFlag && executor.callWithTrace) {\n const [result, trace] = await executor.callWithTrace(\n moduleId,\n merged,\n strategyName ? { strategy: strategyName } : undefined,\n );\n const durationMs = Math.round(performance.now() - startTime);\n\n // Audit log (success)\n const { getAuditLogger } = await import(\"./security/audit.js\");\n const auditLogger = getAuditLogger();\n if (auditLogger) {\n auditLogger.logExecution(moduleId, merged, \"success\", 0, durationMs);\n }\n\n // Print result\n const resolved = resolveFormat(outputFormat);\n if (resolved === \"json\" || !process.stdout.isTTY) {\n // Merge _trace into JSON output\n const traceData = {\n strategy: trace.strategy_name,\n total_duration_ms: trace.total_duration_ms,\n success: trace.success,\n steps: trace.steps.map((s) => ({\n name: s.name,\n duration_ms: s.duration_ms,\n skipped: s.skipped,\n ...(s.skipped ? { skip_reason: s.skip_reason } : {}),\n })),\n };\n let output: Record<string, unknown>;\n if (typeof result === \"object\" && result !== null && !Array.isArray(result)) {\n output = { ...(result as Record<string, unknown>), _trace: traceData };\n } else {\n output = { result, _trace: traceData };\n }\n process.stdout.write(JSON.stringify(output, null, 2) + \"\\n\");\n } else {\n formatExecResult(result, outputFormat, outputFields);\n // Print trace to stderr\n const stepCount = trace.steps.length;\n process.stderr.write(\n `\\nPipeline Trace (strategy: ${trace.strategy_name}, ` +\n `${stepCount} steps, ${trace.total_duration_ms.toFixed(1)}ms)\\n`,\n );\n for (const s of trace.steps) {\n if (s.skipped) {\n const reason = s.skip_reason ?? \"n/a\";\n process.stderr.write(` \\u25cb ${s.name.padEnd(24)} ${\"\\u2014\".padStart(8)} skipped (${reason})\\n`);\n } else {\n process.stderr.write(` \\u2713 ${s.name.padEnd(24)} ${(s.duration_ms.toFixed(1) + \"ms\").padStart(8)}\\n`);\n }\n }\n }\n return;\n }\n\n // -- Standard execution (with optional strategy F8) --\n let result: unknown;\n if (strategyName && executor.callWithTrace) {\n // Strategy requires callWithTrace to pass strategy param\n const [res] = await executor.callWithTrace(\n moduleId,\n merged,\n { strategy: strategyName },\n );\n result = res;\n if (strategyName !== \"standard\" && process.stderr.isTTY) {\n process.stderr.write(`Warning: Using '${strategyName}' strategy.\\n`);\n }\n } else {\n const { Sandbox } = await import(\"./security/index.js\");\n const sandbox = new Sandbox(sandboxEnabled);\n result = await sandbox.execute(moduleId, merged, executor);\n }\n const durationMs = Math.round(performance.now() - startTime);\n\n // 5. Audit log (success)\n const { getAuditLogger } = await import(\"./security/audit.js\");\n const auditLogger = getAuditLogger();\n if (auditLogger) {\n auditLogger.logExecution(moduleId, merged, \"success\", 0, durationMs);\n }\n\n // 6. Format and print result\n formatExecResult(result, outputFormat, outputFields);\n } catch (err: unknown) {\n // Enhanced error output (F3)\n const errRecord = err as Record<string, unknown>;\n const errorCode = typeof errRecord?.code === \"string\" ? errRecord.code as string : undefined;\n const exitCode = errorCode && errorCode in ERROR_CODE_MAP\n ? ERROR_CODE_MAP[errorCode]\n : exitCodeForError(err);\n\n // Audit log (error)\n try {\n const { getAuditLogger } = await import(\"./security/audit.js\");\n const auditLogger = getAuditLogger();\n if (auditLogger) {\n auditLogger.logExecution(moduleId, merged, \"error\", exitCode, 0);\n }\n } catch {\n // Ignore audit failures during error handling\n }\n\n if (outputFormat === \"json\" || !process.stderr.isTTY) {\n emitErrorJson(err, exitCode);\n } else {\n emitErrorTty(err, exitCode);\n }\n process.exit(exitCode);\n }\n });\n\n return cmd;\n}\n\n// ---------------------------------------------------------------------------\n// validateModuleId\n// ---------------------------------------------------------------------------\n\n/**\n * Validate that a module ID conforms to the expected format.\n * Pattern: [a-z][a-z0-9_]*(.[a-z][a-z0-9_])* — max 128 chars.\n */\nexport function validateModuleId(moduleId: string): void {\n if (moduleId.length > 128) {\n process.stderr.write(\n `Error: Invalid module ID format: '${moduleId}'. Maximum length is 128 characters.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n if (!/^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)*$/.test(moduleId)) {\n process.stderr.write(\n `Error: Invalid module ID format: '${moduleId}'.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n}\n\n// ---------------------------------------------------------------------------\n// collectInput\n// ---------------------------------------------------------------------------\n\n/**\n * Collect module input from stdin and/or CLI keyword arguments.\n */\nexport async function collectInput(\n stdinFlag?: string,\n cliKwargs: Record<string, unknown> = {},\n largeInput?: boolean,\n): Promise<Record<string, unknown>> {\n // Remove null/undefined values from CLI kwargs\n const cliKwargsNonNull: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(cliKwargs)) {\n if (v !== null && v !== undefined) {\n cliKwargsNonNull[k] = v;\n }\n }\n\n if (!stdinFlag) {\n return cliKwargsNonNull;\n }\n\n if (stdinFlag === \"-\") {\n const raw = await readStdin();\n const rawSize = Buffer.byteLength(raw, \"utf-8\");\n\n if (rawSize > 10_485_760 && !largeInput) {\n process.stderr.write(\n \"Error: STDIN input exceeds 10MB limit. Use --large-input to override.\\n\",\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n if (!raw) {\n return cliKwargsNonNull;\n }\n\n let stdinData: unknown;\n try {\n stdinData = JSON.parse(raw);\n } catch {\n process.stderr.write(\n \"Error: STDIN does not contain valid JSON.\\n\",\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n if (typeof stdinData !== \"object\" || stdinData === null || Array.isArray(stdinData)) {\n process.stderr.write(\n `Error: STDIN JSON must be an object, got ${Array.isArray(stdinData) ? \"array\" : typeof stdinData}.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n // CLI flags override STDIN for duplicate keys\n return { ...(stdinData as Record<string, unknown>), ...cliKwargsNonNull };\n }\n\n return cliKwargsNonNull;\n}\n\n/**\n * Read all data from stdin with proper cleanup.\n */\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n const onData = (chunk: Buffer) => chunks.push(chunk);\n const onEnd = () => {\n cleanup();\n resolve(Buffer.concat(chunks).toString(\"utf-8\"));\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const cleanup = () => {\n process.stdin.removeListener(\"data\", onData);\n process.stdin.removeListener(\"end\", onEnd);\n process.stdin.removeListener(\"error\", onError);\n };\n process.stdin.on(\"data\", onData);\n process.stdin.on(\"end\", onEnd);\n process.stdin.on(\"error\", onError);\n process.stdin.resume();\n });\n}\n\n// ---------------------------------------------------------------------------\n// reconvertEnumValues\n// ---------------------------------------------------------------------------\n\n/**\n * Re-convert CLI string values back to their schema-typed equivalents\n * based on the option configs.\n */\nexport function reconvertEnumValues(\n kwargs: Record<string, unknown>,\n options: OptionConfig[],\n): Record<string, unknown> {\n const result = { ...kwargs };\n for (const opt of options) {\n if (!opt.enumOriginalTypes) continue;\n const paramName = opt.name;\n if (!(paramName in result) || result[paramName] === null || result[paramName] === undefined) {\n continue;\n }\n const strVal = String(result[paramName]);\n const origType = opt.enumOriginalTypes[strVal];\n if (origType === \"int\") {\n result[paramName] = parseInt(strVal, 10);\n } else if (origType === \"float\") {\n result[paramName] = parseFloat(strVal);\n } else if (origType === \"bool\") {\n result[paramName] = strVal.toLowerCase() === \"true\";\n }\n }\n return result;\n}\n","/**\n * JSON Schema $ref resolver.\n *\n * Protocol spec: Schema resolution & $ref handling\n */\n\nimport { EXIT_CODES } from \"./errors.js\";\n\n// ---------------------------------------------------------------------------\n// resolveRefs\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve all $ref references in a JSON Schema.\n * Returns a fully inlined schema with $defs/definitions removed.\n */\nexport function resolveRefs(\n schema: Record<string, unknown>,\n maxDepth = 32,\n moduleId = \"\",\n): Record<string, unknown> {\n const cloned = structuredClone(schema);\n const defs = (cloned.$defs ?? cloned.definitions ?? {}) as Record<\n string,\n unknown\n >;\n const result = resolveNode(\n cloned,\n defs,\n new Set<string>(),\n 0,\n maxDepth,\n moduleId,\n ) as Record<string, unknown>;\n\n // Remove definition keys\n delete result.$defs;\n delete result.definitions;\n return result;\n}\n\nfunction resolveNode(\n node: unknown,\n defs: Record<string, unknown>,\n visited: Set<string>,\n depth: number,\n maxDepth: number,\n moduleId: string,\n): unknown {\n if (typeof node !== \"object\" || node === null || Array.isArray(node)) {\n return node;\n }\n\n const obj = node as Record<string, unknown>;\n\n // Handle $ref\n if (\"$ref\" in obj) {\n const refPath = obj.$ref as string;\n\n if (depth >= maxDepth) {\n process.stderr.write(\n `Error: $ref resolution depth exceeded maximum of ${maxDepth} for module '${moduleId}'.\\n`,\n );\n process.exit(EXIT_CODES.SCHEMA_CIRCULAR_REF);\n }\n\n if (visited.has(refPath)) {\n process.stderr.write(\n `Error: Circular $ref detected in schema for module '${moduleId}' at path '${refPath}'.\\n`,\n );\n process.exit(EXIT_CODES.SCHEMA_CIRCULAR_REF);\n }\n\n // Parse ref target: extract key from \"#/$defs/Address\" → \"Address\"\n const parts = refPath.split(\"/\");\n const key = parts[parts.length - 1];\n\n if (!(key in defs)) {\n process.stderr.write(\n `Error: Unresolvable $ref '${refPath}' in schema for module '${moduleId}'.\\n`,\n );\n process.exit(EXIT_CODES.SCHEMA_VALIDATION_ERROR);\n }\n\n const newVisited = new Set(visited);\n newVisited.add(refPath);\n return resolveNode(defs[key], defs, newVisited, depth + 1, maxDepth, moduleId);\n }\n\n // Handle allOf\n if (\"allOf\" in obj && Array.isArray(obj.allOf)) {\n const merged: Record<string, unknown> = {\n properties: {},\n required: [] as string[],\n };\n for (const subSchema of obj.allOf as unknown[]) {\n const resolved = resolveNode(\n subSchema,\n defs,\n visited,\n depth + 1,\n maxDepth,\n moduleId,\n ) as Record<string, unknown>;\n if (resolved.properties) {\n Object.assign(\n merged.properties as Record<string, unknown>,\n resolved.properties,\n );\n }\n if (Array.isArray(resolved.required)) {\n (merged.required as string[]).push(...resolved.required);\n }\n }\n // Deduplicate required\n merged.required = [...new Set(merged.required as string[])];\n // Copy non-composition keys\n for (const [k, v] of Object.entries(obj)) {\n if (k !== \"allOf\" && !(k in merged)) {\n merged[k] = v;\n }\n }\n return merged;\n }\n\n // Handle anyOf / oneOf\n for (const keyword of [\"anyOf\", \"oneOf\"]) {\n if (keyword in obj && Array.isArray(obj[keyword])) {\n const merged: Record<string, unknown> = {\n properties: {},\n required: [] as string[],\n };\n const allRequiredSets: Set<string>[] = [];\n for (const subSchema of obj[keyword] as unknown[]) {\n const resolved = resolveNode(\n subSchema,\n defs,\n visited,\n depth + 1,\n maxDepth,\n moduleId,\n ) as Record<string, unknown>;\n if (resolved.properties) {\n Object.assign(\n merged.properties as Record<string, unknown>,\n resolved.properties,\n );\n }\n if (Array.isArray(resolved.required)) {\n allRequiredSets.push(new Set(resolved.required as string[]));\n }\n }\n // Required = intersection of all branches\n if (allRequiredSets.length > 0) {\n let intersection = allRequiredSets[0];\n for (let i = 1; i < allRequiredSets.length; i++) {\n intersection = new Set(\n [...intersection].filter((x) => allRequiredSets[i].has(x)),\n );\n }\n merged.required = [...intersection];\n } else {\n merged.required = [];\n }\n // Copy non-composition keys\n for (const [k, v] of Object.entries(obj)) {\n if (k !== keyword && !(k in merged)) {\n merged[k] = v;\n }\n }\n return merged;\n }\n }\n\n // Recursively process nested properties\n if (\"properties\" in obj && typeof obj.properties === \"object\" && obj.properties !== null) {\n const props = obj.properties as Record<string, unknown>;\n for (const [propName, propSchema] of Object.entries(props)) {\n props[propName] = resolveNode(\n propSchema,\n defs,\n visited,\n depth + 1,\n maxDepth,\n moduleId,\n );\n }\n }\n\n return obj;\n}\n","/**\n * JSON Schema -> Commander options mapping.\n *\n * Protocol spec: Schema-driven argument parsing\n */\n\nimport type { OptionConfig } from \"./main.js\";\nimport { EXIT_CODES } from \"./errors.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Sentinel type marker for boolean flags. */\nconst BOOLEAN_FLAG = Symbol(\"BOOLEAN_FLAG\");\n\ntype TypeResult = \"string\" | \"int\" | \"float\" | typeof BOOLEAN_FLAG | \"file\";\n\n/**\n * Map JSON Schema type to a type identifier.\n */\nexport function mapType(propName: string, propSchema: Record<string, unknown>): TypeResult {\n const schemaType = propSchema.type as string | undefined;\n\n // Check file convention\n if (\n schemaType === \"string\" &&\n (propName.endsWith(\"_file\") || propSchema[\"x-cli-file\"] === true)\n ) {\n return \"file\";\n }\n\n const typeMap: Record<string, TypeResult> = {\n string: \"string\",\n integer: \"int\",\n number: \"float\",\n boolean: BOOLEAN_FLAG,\n object: \"string\",\n array: \"string\",\n };\n\n if (!schemaType) {\n return \"string\";\n }\n\n return typeMap[schemaType] ?? \"string\";\n}\n\n/**\n * Extract help text from schema property, preferring x-llm-description.\n */\nexport function extractHelp(propSchema: Record<string, unknown>, maxLength = 1000): string | undefined {\n let text = propSchema[\"x-llm-description\"] as string | undefined;\n if (!text) {\n text = propSchema.description as string | undefined;\n }\n if (!text) {\n return undefined;\n }\n if (maxLength > 0 && text.length > maxLength) {\n return text.slice(0, maxLength - 3) + \"...\";\n }\n return text;\n}\n\n// ---------------------------------------------------------------------------\n// schemaToCliOptions\n// ---------------------------------------------------------------------------\n\n/** Reserved CLI option names that cannot be used by schema properties. */\nconst RESERVED_NAMES = new Set([\"input\", \"yes\", \"large_input\", \"format\", \"sandbox\"]);\n\n/**\n * Convert a JSON Schema `properties` object into an array of\n * Commander option configurations.\n */\nexport function schemaToCliOptions(\n schema: Record<string, unknown>,\n maxHelpLength = 1000,\n): OptionConfig[] {\n const properties = (schema.properties ?? {}) as Record<\n string,\n Record<string, unknown>\n >;\n const requiredList = (schema.required ?? []) as string[];\n const options: OptionConfig[] = [];\n const flagNames: Record<string, string> = {};\n\n for (const [propName, propSchema] of Object.entries(properties)) {\n const flagName = \"--\" + propName.replace(/_/g, \"-\");\n\n // Collision detection\n if (flagName in flagNames) {\n process.stderr.write(\n `Error: Flag name collision: properties '${propName}' and '${flagNames[flagName]}' both map to '${flagName}'.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n flagNames[flagName] = propName;\n\n // Reserved name check\n if (RESERVED_NAMES.has(propName)) {\n process.stderr.write(\n `Error: Module schema property '${propName}' conflicts with a reserved CLI option name. Rename the property.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n const typeResult = mapType(propName, propSchema);\n const isRequired = requiredList.includes(propName);\n const helpBase = extractHelp(propSchema, maxHelpLength);\n const helpText = isRequired\n ? (helpBase ? helpBase + \" \" : \"\") + \"[required]\"\n : helpBase ?? \"\";\n const defaultValue = propSchema.default as unknown;\n\n if (typeResult === BOOLEAN_FLAG) {\n // Boolean flag pair: --flag/--no-flag\n const flagBase = propName.replace(/_/g, \"-\");\n const defaultVal = (propSchema.default as boolean) ?? false;\n options.push({\n name: propName,\n flags: `--${flagBase}, --no-${flagBase}`,\n description: helpText,\n defaultValue: defaultVal,\n required: isRequired,\n isBooleanFlag: true,\n });\n } else if (\"enum\" in propSchema && Array.isArray(propSchema.enum)) {\n const enumValues = propSchema.enum as unknown[];\n if (enumValues.length === 0) {\n // Empty enum — fall back to plain string option\n options.push({\n name: propName,\n flags: `${flagName} <value>`,\n description: helpText,\n defaultValue,\n required: isRequired,\n });\n } else {\n const stringValues = enumValues.map(String);\n const enumOriginalTypes: Record<string, string> = {};\n for (const v of enumValues) {\n if (typeof v === \"number\" && Number.isInteger(v)) {\n enumOriginalTypes[String(v)] = \"int\";\n } else if (typeof v === \"number\") {\n enumOriginalTypes[String(v)] = \"float\";\n } else if (typeof v === \"boolean\") {\n enumOriginalTypes[String(v)] = \"bool\";\n }\n }\n options.push({\n name: propName,\n flags: `${flagName} <value>`,\n description: helpText,\n defaultValue:\n defaultValue !== undefined ? String(defaultValue) : undefined,\n required: isRequired,\n choices: stringValues,\n enumOriginalTypes:\n Object.keys(enumOriginalTypes).length > 0\n ? enumOriginalTypes\n : undefined,\n });\n }\n } else {\n // Standard option\n let parseArg: ((value: string) => unknown) | undefined;\n if (typeResult === \"int\") {\n parseArg = (v: string) => {\n const n = parseInt(v, 10);\n if (isNaN(n)) throw new Error(`Invalid integer: ${v}`);\n return n;\n };\n } else if (typeResult === \"float\") {\n parseArg = (v: string) => {\n const n = parseFloat(v);\n if (isNaN(n)) throw new Error(`Invalid number: ${v}`);\n return n;\n };\n }\n options.push({\n name: propName,\n flags: `${flagName} <value>`,\n description: helpText,\n defaultValue,\n required: isRequired,\n parseArg,\n });\n }\n }\n\n return options;\n}\n","/**\n * Interactive approval prompts with timeout.\n *\n * Protocol spec: Approval workflow\n */\n\nimport * as readline from \"node:readline\";\nimport type { ModuleDescriptor } from \"./cli.js\";\nimport { ApprovalTimeoutError, EXIT_CODES } from \"./errors.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get an annotation value from either a dict or an object.\n */\nfunction getAnnotation(\n annotations: unknown,\n key: string,\n defaultValue: unknown = undefined,\n): unknown {\n if (!annotations || typeof annotations !== \"object\") return defaultValue;\n const ann = annotations as Record<string, unknown>;\n return key in ann ? ann[key] : defaultValue;\n}\n\n// ---------------------------------------------------------------------------\n// CliApprovalHandler — implements apcore ApprovalHandler protocol (FE-11 §3.5)\n// ---------------------------------------------------------------------------\n\n/**\n * CLI ApprovalHandler that prompts in TTY, auto-denies in non-TTY.\n *\n * Implements the apcore ApprovalHandler protocol:\n * - `requestApproval(request) -> ApprovalResult`\n * - `checkApproval(approvalId) -> ApprovalResult`\n *\n * Pass to Executor via `executor.setApprovalHandler(handler)`.\n */\nexport class CliApprovalHandler {\n autoApprove: boolean;\n timeout: number;\n\n constructor(autoApprove = false, timeout = 60) {\n this.autoApprove = autoApprove;\n this.timeout = Math.max(1, Math.min(timeout, 3600));\n }\n\n async requestApproval(request: Record<string, unknown>): Promise<Record<string, unknown>> {\n const moduleId = (request.module_id as string) ?? \"unknown\";\n\n if (this.autoApprove) {\n return { status: \"approved\", approved_by: \"auto_approve\" };\n }\n\n const envVal = process.env.APCORE_CLI_AUTO_APPROVE ?? \"\";\n if (envVal === \"1\") {\n return { status: \"approved\", approved_by: \"env_auto_approve\" };\n }\n\n if (!process.stdin.isTTY) {\n return { status: \"rejected\", reason: \"Non-interactive session without --yes\" };\n }\n\n // TTY prompt\n const annotations = request.annotations as Record<string, unknown> | undefined;\n const extra = (annotations?.extra as Record<string, unknown>) ?? {};\n const message = (extra.approval_message as string) ?? `Module '${moduleId}' requires approval to execute.`;\n\n process.stderr.write(message + \"\\n\");\n try {\n await promptWithTimeout({ id: moduleId } as ModuleDescriptor, this.timeout);\n return { status: \"approved\", approved_by: \"tty_user\" };\n } catch {\n return { status: \"rejected\", reason: \"User rejected or timed out\" };\n }\n }\n\n async checkApproval(_approvalId: string): Promise<Record<string, unknown>> {\n return { status: \"rejected\", reason: \"CLI does not support async approval polling\" };\n }\n}\n\n// ---------------------------------------------------------------------------\n// checkApproval (legacy function wrapper)\n// ---------------------------------------------------------------------------\n\n/**\n * Check if module requires approval and handle accordingly.\n * Returns normally if approved (or approval not required).\n * Calls process.exit(46) if denied/timed out/non-TTY.\n */\nexport async function checkApproval(\n moduleDef: ModuleDescriptor,\n autoApprove: boolean,\n timeout: number = 60,\n): Promise<void> {\n const annotations = moduleDef.annotations;\n\n // Check if approval is required\n let requiresApproval: boolean;\n if (moduleDef.requiresApproval !== undefined) {\n requiresApproval = moduleDef.requiresApproval;\n } else if (annotations) {\n requiresApproval = getAnnotation(annotations, \"requires_approval\", false) === true;\n } else {\n return; // No annotations, no approval needed\n }\n\n if (!requiresApproval) {\n return;\n }\n\n const moduleId = moduleDef.id;\n\n // Bypass: autoApprove flag (highest priority)\n if (autoApprove) {\n return;\n }\n\n // Bypass: APCORE_CLI_AUTO_APPROVE env var\n const envVal = process.env.APCORE_CLI_AUTO_APPROVE ?? \"\";\n if (envVal === \"1\") {\n return;\n }\n if (envVal !== \"\" && envVal !== \"1\") {\n process.stderr.write(\n `Warning: APCORE_CLI_AUTO_APPROVE is set to '${envVal}', expected '1'. Ignoring.\\n`,\n );\n }\n\n // Non-TTY check\n if (!process.stdin.isTTY) {\n process.stderr.write(\n `Error: Module '${moduleId}' requires approval but no interactive ` +\n \"terminal is available. Use --yes or set APCORE_CLI_AUTO_APPROVE=1 \" +\n \"to bypass.\\n\",\n );\n process.exit(EXIT_CODES.APPROVAL_DENIED);\n }\n\n // TTY prompt\n await promptWithTimeout(moduleDef, timeout);\n}\n\n/**\n * Display approval prompt with timeout.\n */\nasync function promptWithTimeout(\n moduleDef: ModuleDescriptor,\n timeout: number,\n): Promise<void> {\n // Clamp timeout\n timeout = Math.max(1, Math.min(timeout, 3600));\n\n const moduleId = moduleDef.id;\n const annotations = moduleDef.annotations;\n const message =\n (annotations\n ? (getAnnotation(annotations, \"approval_message\") as string | undefined)\n : undefined) ??\n `Module '${moduleId}' requires approval to execute.`;\n\n process.stderr.write(message + \"\\n\");\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n const answer = await Promise.race([\n new Promise<string>((resolve) => {\n rl.question(\"Proceed? [y/N] \", (ans) => resolve(ans));\n }),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(new ApprovalTimeoutError(\n `Approval prompt timed out after ${timeout} seconds.`,\n ));\n }, timeout * 1000);\n }),\n ]);\n\n // Clear the timeout — prompt resolved before timeout fired\n if (timer) clearTimeout(timer);\n\n const normalized = answer.trim().toLowerCase();\n if (normalized === \"y\" || normalized === \"yes\") {\n return;\n }\n\n process.stderr.write(\"Error: Approval denied.\\n\");\n process.exit(EXIT_CODES.APPROVAL_DENIED);\n } catch (err) {\n if (timer) clearTimeout(timer);\n if (err instanceof ApprovalTimeoutError) {\n process.stderr.write(\n `Error: Approval prompt timed out after ${timeout} seconds.\\n`,\n );\n process.exit(EXIT_CODES.APPROVAL_TIMEOUT);\n }\n throw err;\n } finally {\n rl.close();\n }\n}\n","/**\n * TTY-adaptive output formatting (table/json/csv/yaml/jsonl).\n *\n * Protocol spec: Output formatting (FE-09 enhanced)\n */\n\nimport type { ModuleDescriptor, PreflightResult } from \"./cli.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve output format with TTY-adaptive default.\n */\nexport function resolveFormat(explicitFormat?: string): string {\n if (explicitFormat !== undefined) {\n return explicitFormat;\n }\n return process.stdout.isTTY ? \"table\" : \"json\";\n}\n\n/**\n * Truncate text to maxLength, appending '...' if needed.\n */\nexport function truncate(text: string, maxLength = 80): string {\n if (text.length <= maxLength) {\n return text;\n }\n return text.slice(0, maxLength - 3) + \"...\";\n}\n\n/**\n * Render a simple plain-text table with column headers.\n */\nfunction formatTable(\n headers: string[],\n rows: string[][],\n): string {\n // Calculate column widths\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").length)),\n );\n\n const sep = colWidths.map((w) => \"-\".repeat(w)).join(\" \");\n const headerLine = headers\n .map((h, i) => h.padEnd(colWidths[i]))\n .join(\" \");\n const dataLines = rows.map((row) =>\n row.map((cell, i) => (cell ?? \"\").padEnd(colWidths[i])).join(\" \"),\n );\n\n return [headerLine, sep, ...dataLines].join(\"\\n\") + \"\\n\";\n}\n\n// ---------------------------------------------------------------------------\n// formatModuleList\n// ---------------------------------------------------------------------------\n\n/**\n * Format and print a list of modules.\n */\nexport function formatModuleList(\n modules: ModuleDescriptor[],\n format: string,\n filterTags?: string[],\n showDeps = false,\n): void {\n if (format === \"table\") {\n if (modules.length === 0 && filterTags && filterTags.length > 0) {\n process.stdout.write(\n `No modules found matching tags: ${filterTags.join(\", \")}.\\n`,\n );\n return;\n }\n if (modules.length === 0) {\n process.stdout.write(\"No modules found.\\n\");\n return;\n }\n\n const headers = showDeps ? [\"ID\", \"Description\", \"Tags\", \"Deps\"] : [\"ID\", \"Description\", \"Tags\"];\n const rows = modules.map((m) => {\n const base = [m.id, truncate(m.description, 80), (m.tags ?? []).join(\", \")];\n if (showDeps) {\n const deps = (m as unknown as Record<string, unknown>).dependencies;\n base.push(String(Array.isArray(deps) ? deps.length : 0));\n }\n return base;\n });\n process.stdout.write(formatTable(headers, rows));\n } else if (format === \"json\") {\n const result = modules.map((m) => {\n const entry: Record<string, unknown> = {\n id: m.id,\n description: m.description,\n tags: m.tags ?? [],\n };\n if (showDeps) {\n const deps = (m as unknown as Record<string, unknown>).dependencies;\n entry.dependency_count = Array.isArray(deps) ? deps.length : 0;\n }\n return entry;\n });\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// formatModuleDetail\n// ---------------------------------------------------------------------------\n\n/**\n * Convert annotations to a plain dict, filtering out falsy/default values.\n */\nfunction annotationsToDict(\n annotations: unknown,\n): Record<string, unknown> | null {\n if (!annotations) return null;\n if (typeof annotations !== \"object\" || Array.isArray(annotations)) return null;\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(annotations as Record<string, unknown>)) {\n if (v !== null && v !== undefined && v !== false && v !== 0 && !(Array.isArray(v) && v.length === 0)) {\n result[k] = v;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\n/**\n * Format and print full module metadata.\n */\nexport function formatModuleDetail(\n moduleDef: ModuleDescriptor,\n format: string,\n): void {\n if (format === \"table\") {\n process.stdout.write(`\\nModule: ${moduleDef.id}\\n`);\n process.stdout.write(`\\nDescription:\\n ${moduleDef.description}\\n`);\n\n if (moduleDef.inputSchema && Object.keys(moduleDef.inputSchema).length > 0) {\n process.stdout.write(\"\\nInput Schema:\\n\");\n process.stdout.write(JSON.stringify(moduleDef.inputSchema, null, 2) + \"\\n\");\n }\n\n if (moduleDef.outputSchema && Object.keys(moduleDef.outputSchema).length > 0) {\n process.stdout.write(\"\\nOutput Schema:\\n\");\n process.stdout.write(JSON.stringify(moduleDef.outputSchema, null, 2) + \"\\n\");\n }\n\n const annDict = annotationsToDict(\n moduleDef.annotations,\n );\n if (annDict) {\n process.stdout.write(\"\\nAnnotations:\\n\");\n for (const [k, v] of Object.entries(annDict)) {\n process.stdout.write(` ${k}: ${v}\\n`);\n }\n }\n\n // Extension metadata (x- prefixed)\n const metadata = moduleDef.metadata;\n if (metadata) {\n const xFields: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(metadata)) {\n if (k.startsWith(\"x-\") || k.startsWith(\"x_\")) {\n xFields[k] = v;\n }\n }\n if (Object.keys(xFields).length > 0) {\n process.stdout.write(\"\\nExtension Metadata:\\n\");\n for (const [k, v] of Object.entries(xFields)) {\n process.stdout.write(` ${k}: ${v}\\n`);\n }\n }\n }\n\n const tags = moduleDef.tags ?? [];\n if (tags.length > 0) {\n process.stdout.write(`\\nTags: ${tags.join(\", \")}\\n`);\n }\n } else if (format === \"json\") {\n const result: Record<string, unknown> = {\n id: moduleDef.id,\n description: moduleDef.description,\n };\n if (moduleDef.inputSchema) result.input_schema = moduleDef.inputSchema;\n if (moduleDef.outputSchema) result.output_schema = moduleDef.outputSchema;\n\n const annDict = annotationsToDict(\n moduleDef.annotations,\n );\n if (annDict) result.annotations = annDict;\n\n const tags = moduleDef.tags ?? [];\n if (tags.length > 0) result.tags = tags;\n\n // Extension metadata\n const metadata = moduleDef.metadata;\n if (metadata) {\n for (const [k, v] of Object.entries(metadata)) {\n if (k.startsWith(\"x-\") || k.startsWith(\"x_\")) {\n result[k] = v;\n }\n }\n }\n\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// formatExecResult\n// ---------------------------------------------------------------------------\n\n/**\n * Select fields from a result using dot-path notation.\n * E.g., fields=\"status,data.count\" selects those paths.\n */\nfunction selectFields(result: Record<string, unknown>, fields: string): Record<string, unknown> {\n const selected: Record<string, unknown> = {};\n for (const f of fields.split(\",\")) {\n const key = f.trim();\n let val: unknown = result;\n for (const part of key.split(\".\")) {\n if (val && typeof val === \"object\" && !Array.isArray(val)) {\n val = (val as Record<string, unknown>)[part];\n } else {\n val = undefined;\n break;\n }\n }\n selected[key] = val;\n }\n return selected;\n}\n\n/**\n * Format and print module execution result.\n *\n * Supports formats: json, table, csv, yaml, jsonl.\n * The `fields` option allows dot-path field selection on dict results.\n */\nexport function formatExecResult(\n result: unknown,\n format?: string,\n fields?: string,\n): void {\n if (result === null || result === undefined) {\n return;\n }\n\n // Apply field selection if specified\n let effective_result = result;\n if (fields && typeof result === \"object\" && !Array.isArray(result) && result !== null) {\n effective_result = selectFields(result as Record<string, unknown>, fields);\n }\n\n const effective = resolveFormat(format);\n\n if (effective === \"csv\") {\n if (typeof effective_result === \"object\" && !Array.isArray(effective_result) && effective_result !== null) {\n const obj = effective_result as Record<string, unknown>;\n const keys = Object.keys(obj);\n const header = keys.map(escapeCsvField).join(\",\");\n const row = keys.map((k) => escapeCsvField(String(obj[k]))).join(\",\");\n process.stdout.write(header + \"\\n\" + row + \"\\n\");\n } else if (Array.isArray(effective_result) && effective_result.length > 0 && typeof effective_result[0] === \"object\") {\n const keys = Object.keys(effective_result[0] as Record<string, unknown>);\n const header = keys.map(escapeCsvField).join(\",\");\n const rows = effective_result.map((item) => {\n const obj = item as Record<string, unknown>;\n return keys.map((k) => escapeCsvField(String(obj[k]))).join(\",\");\n });\n process.stdout.write(header + \"\\n\" + rows.join(\"\\n\") + \"\\n\");\n } else {\n process.stdout.write(JSON.stringify(effective_result) + \"\\n\");\n }\n } else if (effective === \"yaml\") {\n // Simple YAML-like output (no dependency required)\n if (typeof effective_result === \"object\" && !Array.isArray(effective_result) && effective_result !== null) {\n const obj = effective_result as Record<string, unknown>;\n const lines = Object.entries(obj).map(([k, v]) => {\n if (v === null || v === undefined) return `${k}: null`;\n if (typeof v === \"object\") return `${k}: ${JSON.stringify(v)}`;\n return `${k}: ${v}`;\n });\n process.stdout.write(lines.join(\"\\n\") + \"\\n\");\n } else if (Array.isArray(effective_result)) {\n for (const item of effective_result) {\n if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>;\n const lines = Object.entries(obj).map(([k, v]) => ` ${k}: ${v}`);\n process.stdout.write(\"- \" + lines.join(\"\\n \") + \"\\n\");\n } else {\n process.stdout.write(`- ${item}\\n`);\n }\n }\n } else {\n process.stdout.write(String(effective_result) + \"\\n\");\n }\n } else if (effective === \"jsonl\") {\n if (Array.isArray(effective_result)) {\n for (const item of effective_result) {\n process.stdout.write(JSON.stringify(item) + \"\\n\");\n }\n } else {\n process.stdout.write(JSON.stringify(effective_result) + \"\\n\");\n }\n } else if (\n effective === \"table\" &&\n typeof effective_result === \"object\" &&\n !Array.isArray(effective_result)\n ) {\n // Key-value table\n const entries = Object.entries(effective_result as Record<string, unknown>);\n const headers = [\"Key\", \"Value\"];\n const rows = entries.map(([k, v]) => [String(k), String(v)]);\n process.stdout.write(formatTable(headers, rows));\n } else if (typeof effective_result === \"object\") {\n process.stdout.write(JSON.stringify(effective_result, null, 2) + \"\\n\");\n } else if (typeof effective_result === \"string\") {\n process.stdout.write(effective_result + \"\\n\");\n } else {\n process.stdout.write(String(effective_result) + \"\\n\");\n }\n}\n\n/**\n * Escape a CSV field value — wrap in quotes if it contains comma, quote, or newline.\n */\nfunction escapeCsvField(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return '\"' + value.replace(/\"/g, '\"\"') + '\"';\n }\n return value;\n}\n\n// ---------------------------------------------------------------------------\n// formatPreflightResult\n// ---------------------------------------------------------------------------\n\n/**\n * Format and print a PreflightResult to stdout.\n */\nexport function formatPreflightResult(result: PreflightResult, format?: string): void {\n const resolved = resolveFormat(format);\n if (resolved === \"json\" || !process.stdout.isTTY) {\n const payload: Record<string, unknown> = {\n valid: result.valid,\n requires_approval: result.requires_approval,\n checks: result.checks.map((c) => {\n const entry: Record<string, unknown> = { check: c.check, passed: c.passed };\n if (c.error !== undefined && c.error !== null) {\n entry.error = c.error;\n }\n if (c.warnings && c.warnings.length > 0) {\n entry.warnings = c.warnings;\n }\n return entry;\n }),\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n } else {\n // TTY table format\n for (const c of result.checks) {\n const hasWarnings = (c.warnings?.length ?? 0) > 0;\n let sym: string;\n if (c.passed && hasWarnings) {\n sym = \"\\u26a0\"; // ⚠ passed with warnings\n } else if (c.passed) {\n sym = \"\\u2713\"; // ✓ passed\n } else if (c.passed === false) {\n sym = \"\\u2717\"; // ✗ failed\n } else {\n sym = \"\\u25cb\"; // ○ skipped\n }\n let status = ` ${sym} ${c.check.padEnd(20)}`;\n if (c.error) {\n const detail = typeof c.error === \"object\" ? JSON.stringify(c.error) : String(c.error);\n status += ` ${detail}`;\n } else if (c.passed && !hasWarnings) {\n status += \" OK\";\n } else if (!c.passed) {\n status += \" Skipped\";\n }\n process.stdout.write(status + \"\\n\");\n for (const w of c.warnings ?? []) {\n process.stdout.write(` Warning: ${w}\\n`);\n }\n }\n const errors = result.checks.filter((c) => !c.passed).length;\n const warnings = result.checks.reduce((sum, c) => sum + (c.warnings?.length ?? 0), 0);\n const tag = result.valid ? \"PASS\" : \"FAIL\";\n process.stdout.write(`\\nResult: ${tag} (${errors} error(s), ${warnings} warning(s))\\n`);\n }\n}\n\n/**\n * Return the exit code for the first failed check in a PreflightResult.\n */\nexport function firstFailedExitCode(result: PreflightResult): number {\n const checkToExit: Record<string, number> = {\n module_id: 2,\n module_lookup: 44,\n call_chain: 1,\n acl: 77,\n schema: 45,\n approval: 46,\n module_preflight: 1,\n };\n for (const check of result.checks) {\n if (!check.passed) {\n return checkToExit[check.check] ?? 1;\n }\n }\n return 1;\n}\n","/**\n * Simple structured logger respecting logging.level config.\n */\n\nconst LEVELS = { DEBUG: 0, INFO: 1, WARNING: 2, ERROR: 3 } as const;\ntype LogLevel = keyof typeof LEVELS;\n\nlet currentLevel: LogLevel = \"WARNING\";\n\nexport function setLogLevel(level: string): void {\n const upper = level.toUpperCase();\n if (upper in LEVELS) {\n currentLevel = upper as LogLevel;\n }\n}\n\nexport function getLogLevel(): LogLevel {\n return currentLevel;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LEVELS[level] >= LEVELS[currentLevel];\n}\n\nexport function debug(message: string): void {\n if (shouldLog(\"DEBUG\")) process.stderr.write(`DEBUG: ${message}\\n`);\n}\n\nexport function info(message: string): void {\n if (shouldLog(\"INFO\")) process.stderr.write(`INFO: ${message}\\n`);\n}\n\nexport function warn(message: string): void {\n if (shouldLog(\"WARNING\")) process.stderr.write(`WARNING: ${message}\\n`);\n}\n\nexport function error(message: string): void {\n if (shouldLog(\"ERROR\")) process.stderr.write(`ERROR: ${message}\\n`);\n}\n","/**\n * Init command — scaffold new apcore modules (Phase 1).\n */\n\nimport { Command } from \"commander\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nconst DECORATOR_TEMPLATE = `\\\nimport { module } from \"apcore-js\";\nimport { Type } from \"@sinclair/typebox\";\n\nexport const {varName} = module({\n id: \"{moduleId}\",\n description: \"{description}\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({ status: Type.String() }),\n execute: (_inputs) => {\n // TODO: implement\n return { status: \"ok\" };\n },\n});\n`;\n\nconst CONVENTION_TEMPLATE = `\\\n/**\n * {description}\n */\n{cliGroupLine}\nexport function {funcName}(): Record<string, unknown> {\n // TODO: implement\n return { status: \"ok\" };\n}\n`;\n\nconst BINDING_TEMPLATE = `\\\nbindings:\n - module_id: \"{moduleId}\"\n target: \"{target}\"\n description: \"{description}\"\n auto_schema: true\n`;\n\n/**\n * Simple template rendering: replaces {key} with values from the context.\n */\nfunction renderTemplate(template: string, context: Record<string, string>): string {\n let result = template;\n for (const [key, value] of Object.entries(context)) {\n // Replace all occurrences of {key} with the value\n result = result.split(`{${key}}`).join(value);\n }\n return result;\n}\n\n/**\n * Register the init command group on the CLI program.\n */\nexport function registerInitCommand(cli: Command): void {\n const initGroup = cli.command(\"init\").description(\"Scaffold new apcore modules.\");\n\n initGroup\n .command(\"module <module-id>\")\n .description(\"Create a new module from a template.\\n\\nMODULE_ID is the module identifier (e.g., ops.deploy, user.create).\")\n .option(\n \"--style <style>\",\n \"Module style: decorator (@module), convention (plain function), or binding (YAML).\",\n \"convention\",\n )\n .option(\"--dir <path>\", \"Output directory. Default: extensions/ or commands/.\")\n .option(\"-d, --description <text>\", \"Module description.\", \"TODO: add description\")\n .action((moduleId: string, opts: { style: string; dir?: string; description: string }) => {\n // Parse module_id into parts\n const lastDot = moduleId.lastIndexOf(\".\");\n const prefix = lastDot >= 0 ? moduleId.substring(0, lastDot) : moduleId;\n const funcName = lastDot >= 0 ? moduleId.substring(lastDot + 1) : moduleId;\n\n const style = opts.style;\n const description = opts.description;\n\n // Validate --dir to prevent path traversal\n const dir = opts.dir ?? (style === \"decorator\" ? \"extensions\" : style === \"binding\" ? \"bindings\" : \"commands\");\n if (dir.split(path.sep).includes(\"..\") || dir.split(\"/\").includes(\"..\")) {\n process.stderr.write(`Error: Output directory must not contain '..' path components.\\n`);\n process.exit(2);\n }\n\n switch (style) {\n case \"decorator\":\n createDecoratorModule(moduleId, prefix, funcName, description, dir);\n break;\n case \"convention\":\n createConventionModule(moduleId, prefix, funcName, description, dir);\n break;\n case \"binding\":\n createBindingModule(moduleId, prefix, funcName, description, dir);\n break;\n default:\n process.stderr.write(`Error: Unknown style '${style}'\\n`);\n process.exit(2);\n }\n });\n}\n\nfunction createDecoratorModule(\n moduleId: string,\n _prefix: string,\n funcName: string,\n description: string,\n outputDir: string,\n): void {\n fs.mkdirSync(outputDir, { recursive: true });\n const filename = moduleId.replace(/\\./g, \"_\") + \".ts\";\n const filepath = path.join(outputDir, filename);\n\n const varName = funcName + \"Module\";\n const content = renderTemplate(DECORATOR_TEMPLATE, {\n moduleId,\n varName,\n funcName,\n description,\n });\n fs.writeFileSync(filepath, content);\n process.stdout.write(`Created ${filepath}\\n`);\n}\n\nfunction createConventionModule(\n moduleId: string,\n prefix: string,\n funcName: string,\n description: string,\n outputDir: string,\n): void {\n // If prefix has dots, create subdirectories\n const prefixParts = prefix.split(\".\");\n const dirPath = prefixParts.length > 1\n ? path.join(outputDir, ...prefixParts.slice(0, -1))\n : outputDir;\n fs.mkdirSync(dirPath, { recursive: true });\n\n let filename: string;\n if (prefixParts.length > 1) {\n filename = prefixParts[prefixParts.length - 1] + \".ts\";\n } else {\n filename = prefix + \".ts\";\n }\n // If the file would be the same as the function name, use prefix as filename\n if (prefix === funcName) {\n filename = prefix + \".ts\";\n }\n const filepath = path.join(dirPath, filename);\n\n const cliGroupLine = moduleId.includes(\".\")\n ? `export const CLI_GROUP = \"${prefixParts[0]}\";\\n`\n : \"\";\n\n const content = renderTemplate(CONVENTION_TEMPLATE, {\n funcName,\n description,\n cliGroupLine,\n });\n fs.writeFileSync(filepath, content);\n process.stdout.write(`Created ${filepath}\\n`);\n}\n\nfunction createBindingModule(\n moduleId: string,\n prefix: string,\n funcName: string,\n description: string,\n outputDir: string,\n): void {\n fs.mkdirSync(outputDir, { recursive: true });\n\n const yamlFile = path.join(outputDir, moduleId.replace(/\\./g, \"_\") + \".binding.yaml\");\n const target = `commands.${prefix}:${funcName}`;\n\n const yamlContent = renderTemplate(BINDING_TEMPLATE, {\n moduleId,\n target,\n description,\n });\n fs.writeFileSync(yamlFile, yamlContent);\n process.stdout.write(`Created ${yamlFile}\\n`);\n\n // Also create the target function file\n const baseSrc = \"commands\";\n fs.mkdirSync(baseSrc, { recursive: true });\n const srcFile = path.join(baseSrc, prefix.replace(/\\./g, \"_\") + \".ts\");\n if (!fs.existsSync(srcFile)) {\n const srcContent =\n `export function ${funcName}(): Record<string, unknown> {\\n` +\n ` /** ${description} */\\n` +\n \" // TODO: implement\\n\" +\n ' return { status: \"ok\" };\\n' +\n \"}\\n\";\n fs.writeFileSync(srcFile, srcContent);\n process.stdout.write(`Created ${srcFile}\\n`);\n }\n}\n","/**\n * Display overlay helpers — shared resolution logic for CLI surfaces.\n */\n\nimport type { ModuleDescriptor } from \"./cli.js\";\n\n/**\n * Extract resolved display overlay from a ModuleDescriptor's metadata.\n */\nexport function getDisplay(descriptor: ModuleDescriptor): Record<string, unknown> {\n const metadata = descriptor.metadata ?? {};\n const display = (metadata as Record<string, unknown>).display;\n if (display && typeof display === \"object\" && !Array.isArray(display)) {\n return display as Record<string, unknown>;\n }\n return {};\n}\n\n/**\n * Return [displayName, description, tags] resolved from the display overlay.\n *\n * Falls back to scanner-provided values when no overlay is present.\n */\nexport function getCliDisplayFields(descriptor: ModuleDescriptor): [string, string, string[]] {\n const display = getDisplay(descriptor);\n const cli = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const name = (cli.alias as string | undefined)\n ?? (display.alias as string | undefined)\n ?? descriptor.id;\n const desc = (cli.description as string | undefined) ?? descriptor.description;\n const tags = (display.tags as string[] | undefined) ?? descriptor.tags ?? [];\n return [name, desc, tags];\n}\n","/**\n * ConfigResolver — 4-tier config resolution (CLI flag > env > file > default).\n *\n * Protocol spec: Configuration resolution\n */\n\nimport * as fs from \"node:fs\";\nimport yaml from \"js-yaml\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Default configuration values. */\nexport const DEFAULTS: Record<string, unknown> = {\n \"extensions.root\": \"./extensions\",\n \"logging.level\": \"WARNING\",\n \"sandbox.enabled\": false,\n \"cli.stdin_buffer_limit\": 10_485_760,\n \"cli.auto_approve\": false,\n \"cli.help_text_max_length\": 1000,\n // Namespace-mode aliases (apcore >= 0.15.0 Config Bus)\n \"apcore-cli.stdin_buffer_limit\": 10_485_760,\n \"apcore-cli.auto_approve\": false,\n \"apcore-cli.help_text_max_length\": 1000,\n \"apcore-cli.logging_level\": \"WARNING\",\n // FE-11 config keys\n \"cli.approval_timeout\": 60,\n \"cli.strategy\": \"standard\",\n \"cli.group_depth\": 1,\n \"apcore-cli.approval_timeout\": 60,\n \"apcore-cli.strategy\": \"standard\",\n \"apcore-cli.group_depth\": 1,\n};\n\n/** Namespace key ↔ legacy key mapping for backward compatibility. */\nconst NAMESPACE_TO_LEGACY: Record<string, string> = {\n \"apcore-cli.stdin_buffer_limit\": \"cli.stdin_buffer_limit\",\n \"apcore-cli.auto_approve\": \"cli.auto_approve\",\n \"apcore-cli.help_text_max_length\": \"cli.help_text_max_length\",\n \"apcore-cli.logging_level\": \"logging.level\",\n};\nconst LEGACY_TO_NAMESPACE: Record<string, string> = Object.fromEntries(\n Object.entries(NAMESPACE_TO_LEGACY).map(([k, v]) => [v, k]),\n);\n\n/**\n * Register the apcore-cli Config Bus namespace (apcore >= 0.15.0).\n * Safe to call even when apcore-js is unavailable or < 0.15.0.\n */\nexport function registerConfigNamespace(): void {\n try {\n // Dynamic import to avoid hard failure when apcore-js is not available\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { Config } = require(\"apcore-js\");\n if (typeof Config?.registerNamespace === \"function\") {\n Config.registerNamespace({\n name: \"apcore-cli\",\n envPrefix: \"APCORE_CLI\",\n defaults: {\n stdin_buffer_limit: 10_485_760,\n auto_approve: false,\n help_text_max_length: 1000,\n logging_level: \"WARNING\",\n approval_timeout: 60,\n strategy: \"standard\",\n group_depth: 1,\n },\n });\n }\n } catch {\n // apcore-js not installed or < 0.15.0 — graceful no-op\n }\n}\n\n// ---------------------------------------------------------------------------\n// ConfigResolver\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves configuration from four tiers (highest to lowest priority):\n * 1. CLI flags\n * 2. Environment variables\n * 3. Config file (YAML/JSON)\n * 4. Built-in defaults\n */\nexport class ConfigResolver {\n private readonly cliFlags: Record<string, unknown>;\n private readonly configPath: string;\n private fileCache: Record<string, unknown> | null = null;\n private fileCacheLoaded = false;\n\n constructor(cliFlags?: Record<string, unknown>, configPath?: string) {\n this.cliFlags = cliFlags ?? {};\n this.configPath = configPath ?? \"apcore.yaml\";\n }\n\n /**\n * Resolve a single configuration key across all four tiers.\n */\n resolve(key: string, cliFlag?: string, envVar?: string): unknown {\n // Tier 1: CLI flag\n const flagKey = cliFlag ?? key;\n if (flagKey in this.cliFlags) {\n const value = this.cliFlags[flagKey];\n if (value !== null && value !== undefined) {\n return value;\n }\n }\n\n // Tier 2: Environment variable\n if (envVar) {\n const envValue = process.env[envVar];\n if (envValue !== undefined && envValue !== \"\") {\n return envValue;\n }\n }\n\n // Tier 3: Config file (try both namespace and legacy keys)\n const fileValue = this.resolveFromFile(key);\n if (fileValue !== undefined) {\n return fileValue;\n }\n const altKey = NAMESPACE_TO_LEGACY[key] ?? LEGACY_TO_NAMESPACE[key];\n if (altKey) {\n const altFileValue = this.resolveFromFile(altKey);\n if (altFileValue !== undefined) {\n return altFileValue;\n }\n }\n\n // Tier 4: Defaults\n return DEFAULTS[key];\n }\n\n /**\n * Load a value from the config file using a dot-separated key path.\n */\n private resolveFromFile(key: string): unknown {\n if (!this.fileCacheLoaded) {\n this.fileCache = this.loadConfigFile();\n this.fileCacheLoaded = true;\n }\n if (this.fileCache === null) {\n return undefined;\n }\n return this.fileCache[key];\n }\n\n /**\n * Load and flatten a YAML config file.\n */\n private loadConfigFile(): Record<string, unknown> | null {\n let content: string;\n try {\n content = fs.readFileSync(this.configPath, \"utf-8\");\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && err.code === \"ENOENT\") {\n return null;\n }\n console.warn(\n `Configuration file '${this.configPath}' is malformed, using defaults.`,\n );\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = yaml.load(content);\n } catch {\n console.warn(\n `Configuration file '${this.configPath}' is malformed, using defaults.`,\n );\n return null;\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n console.warn(\n `Configuration file '${this.configPath}' is malformed, using defaults.`,\n );\n return null;\n }\n\n return this.flattenDict(parsed as Record<string, unknown>);\n }\n\n /**\n * Flatten nested dict to dot-notation keys.\n */\n private flattenDict(\n d: Record<string, unknown>,\n prefix = \"\",\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(d)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n ) {\n Object.assign(\n result,\n this.flattenDict(value as Record<string, unknown>, fullKey),\n );\n } else {\n result[fullKey] = value;\n }\n }\n return result;\n }\n}\n","/**\n * Shell completion + man page generation.\n *\n * Protocol spec: Shell integration\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command, Help, Option } from \"commander\";\nimport { EXIT_CODES } from \"./errors.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nlet SHELL_VERSION = \"0.0.0\";\ntry {\n const pkg = JSON.parse(readFileSync(path.resolve(__dirname, \"../package.json\"), \"utf-8\"));\n SHELL_VERSION = pkg.version;\n} catch {\n // Bundled environments (e.g., Bun compile) may not have package.json accessible\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a prog_name like 'my-tool' to a valid shell identifier '_my_tool'.\n */\nfunction makeFunctionName(progName: string): string {\n return \"_\" + progName.replace(/[^a-zA-Z0-9]/g, \"_\");\n}\n\n/**\n * Shell-safe quoting.\n */\nfunction shellQuote(s: string): string {\n return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\n// ---------------------------------------------------------------------------\n// Completion generators\n// ---------------------------------------------------------------------------\n\nfunction generateBashCompletion(progName: string): string {\n const fn = makeFunctionName(progName);\n const quoted = shellQuote(progName);\n const moduleListCmd =\n `${quoted} list --format json 2>/dev/null` +\n ` | node -e \"process.stdin.on('data',d=>{JSON.parse(d).forEach(m=>console.log(m.id))})\" 2>/dev/null`;\n const groupsAndTopCmd =\n `${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const ids=JSON.parse(m).map(x=>x.id);\\n` +\n `const g=new Set(),t=[];\\n` +\n `ids.forEach(i=>{if(i.includes('.'))g.add(i.split('.')[0]);else t.push(i)});\\n` +\n `console.log([...g].sort().concat(t.sort()).join(' '))\\n` +\n `\" 2>/dev/null`;\n const groupCmdsCmd =\n `${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const g=process.env._APCORE_GRP;\\n` +\n `JSON.parse(m).map(x=>x.id).filter(i=>i.includes('.')&&i.split('.')[0]===g).forEach(i=>console.log(i.split('.',2)[1]))\\n` +\n `\" 2>/dev/null`;\n\n return (\n `${fn}() {\\n` +\n ` local cur prev opts\\n` +\n ` COMPREPLY=()\\n` +\n ` cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\\n` +\n ` prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\\n` +\n `\\n` +\n ` if [[ \\${COMP_CWORD} -eq 1 ]]; then\\n` +\n ` opts=\"completion describe exec init list man\"\\n` +\n ` local groups_and_top=$(${groupsAndTopCmd})\\n` +\n ` COMPREPLY=( $(compgen -W \"\\${opts} \\${groups_and_top}\" -- \\${cur}) )\\n` +\n ` return 0\\n` +\n ` fi\\n` +\n `\\n` +\n ` if [[ \\${COMP_CWORD} -eq 2 ]]; then\\n` +\n ` if [[ \"\\${COMP_WORDS[1]}\" == \"exec\" ]]; then\\n` +\n ` local modules=$(${moduleListCmd})\\n` +\n ` COMPREPLY=( $(compgen -W \"\\${modules}\" -- \\${cur}) )\\n` +\n ` return 0\\n` +\n ` fi\\n` +\n ` export _APCORE_GRP=\"\\${COMP_WORDS[1]}\"\\n` +\n ` local group_cmds=$(${groupCmdsCmd})\\n` +\n ` COMPREPLY=( $(compgen -W \"\\${group_cmds}\" -- \\${cur}) )\\n` +\n ` return 0\\n` +\n ` fi\\n` +\n `}\\n` +\n `complete -F ${fn} ${quoted}\\n`\n );\n}\n\nfunction generateZshCompletion(progName: string): string {\n const fn = makeFunctionName(progName);\n const quoted = shellQuote(progName);\n const moduleListCmd =\n `${quoted} list --format json 2>/dev/null` +\n ` | node -e \"process.stdin.on('data',d=>{JSON.parse(d).forEach(m=>console.log(m.id))})\" 2>/dev/null`;\n const groupsAndTopCmd =\n `${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const ids=JSON.parse(m).map(x=>x.id);\\n` +\n `const g=new Set(),t=[];\\n` +\n `ids.forEach(i=>{if(i.includes('.'))g.add(i.split('.')[0]);else t.push(i)});\\n` +\n `console.log([...g].sort().concat(t.sort()).join(' '))\\n` +\n `\" 2>/dev/null`;\n const groupCmdsCmd =\n `${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const g=process.env._APCORE_GRP;\\n` +\n `JSON.parse(m).map(x=>x.id).filter(i=>i.includes('.')&&i.split('.')[0]===g).forEach(i=>console.log(i.split('.',2)[1]))\\n` +\n `\" 2>/dev/null`;\n\n return (\n `#compdef ${progName}\\n` +\n `\\n` +\n `${fn}() {\\n` +\n ` local -a commands\\n` +\n ` commands=(\\n` +\n ` 'list:List available modules'\\n` +\n ` 'describe:Show module metadata and schema'\\n` +\n ` 'completion:Generate shell completion script'\\n` +\n ` 'init:Scaffolding commands'\\n` +\n ` 'man:Generate man page'\\n` +\n ` )\\n` +\n `\\n` +\n ` _arguments -C \\\\\\n` +\n ` '1:command:->command' \\\\\\n` +\n ` '*::arg:->args'\\n` +\n `\\n` +\n ` case \"$state\" in\\n` +\n ` command)\\n` +\n ` _describe -t commands '${progName} commands' commands\\n` +\n ` local -a groups_and_top\\n` +\n ` groups_and_top=($(${groupsAndTopCmd}))\\n` +\n ` compadd -a groups_and_top\\n` +\n ` ;;\\n` +\n ` args)\\n` +\n ` case \"\\${words[1]}\" in\\n` +\n ` exec)\\n` +\n ` local modules\\n` +\n ` modules=($(${moduleListCmd}))\\n` +\n ` compadd -a modules\\n` +\n ` ;;\\n` +\n ` *)\\n` +\n ` export _APCORE_GRP=\"\\${words[1]}\"\\n` +\n ` local -a group_cmds\\n` +\n ` group_cmds=($(${groupCmdsCmd}))\\n` +\n ` compadd -a group_cmds\\n` +\n ` ;;\\n` +\n ` esac\\n` +\n ` ;;\\n` +\n ` esac\\n` +\n `}\\n` +\n `\\n` +\n `compdef ${fn} ${quoted}\\n`\n );\n}\n\nfunction generateFishCompletion(progName: string): string {\n const quoted = shellQuote(progName);\n const moduleListCmd =\n `${quoted} list --format json 2>/dev/null` +\n ` | node -e \\\\\"process.stdin.on('data',d=>{JSON.parse(d).forEach(m=>console.log(m.id))})\\\\\" 2>/dev/null`;\n const groupsAndTopCmd =\n `${quoted} list --format json 2>/dev/null | node -e \\\\\"` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');` +\n `const ids=JSON.parse(m).map(x=>x.id);` +\n `const g=new Set(),t=[];` +\n `ids.forEach(i=>{if(i.includes('.'))g.add(i.split('.')[0]);else t.push(i)});` +\n `console.log([...g].sort().concat(t.sort()).join('\\\\\\\\n'))\\\\\" 2>/dev/null`;\n\n return (\n `# Fish completions for ${progName}\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a list -d \"List available modules\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a describe -d \"Show module metadata and schema\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a completion -d \"Generate shell completion script\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a init -d \"Scaffolding commands\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a man -d \"Generate man page\"\\n` +\n `complete -c ${quoted} -n \"__fish_use_subcommand\"` +\n ` -a \"(${groupsAndTopCmd})\" -d \"Module group\"\\n` +\n `\\n` +\n `complete -c ${quoted} -n \"__fish_seen_subcommand_from exec\"` +\n ` -a \"(${moduleListCmd})\"\\n` +\n `\\n` +\n `function __apcore_group_cmds\\n` +\n ` set -l grp (commandline -opc)[2]\\n` +\n ` set -x _APCORE_GRP $grp\\n` +\n ` ${quoted} list --format json 2>/dev/null | node -e \"\\n` +\n `const m=require('fs').readFileSync('/dev/stdin','utf8');\\n` +\n `const g=process.env._APCORE_GRP;\\n` +\n `JSON.parse(m).map(x=>x.id).filter(i=>i.includes('.')&&i.split('.')[0]===g).forEach(i=>console.log(i.split('.',2)[1]))\\n` +\n `\" 2>/dev/null\\n` +\n `end\\n` +\n `\\n` +\n `# Group subcommand completion — matches when position 1 is not a builtin\\n` +\n `complete -c ${quoted} -n \"not __fish_use_subcommand; and not __fish_seen_subcommand_from list describe completion init man exec\"` +\n ` -a \"(__apcore_group_cmds)\"\\n`\n );\n}\n\n// ---------------------------------------------------------------------------\n// Man page generation\n// ---------------------------------------------------------------------------\n\nfunction buildSynopsis(\n command: Command | null,\n progName: string,\n commandName: string,\n): string {\n if (!command) {\n return `\\\\fB${progName} ${commandName}\\\\fR [OPTIONS]`;\n }\n\n const parts = [`\\\\fB${progName} ${commandName}\\\\fR`];\n for (const opt of command.options) {\n const flag = opt.long ?? opt.short ?? \"\";\n if (opt.isBoolean?.()) {\n parts.push(`[${flag}]`);\n } else if (opt.required) {\n const typeName = (opt.argChoices ? \"CHOICE\" : \"VALUE\").toUpperCase();\n parts.push(`${flag} \\\\fI${typeName}\\\\fR`);\n } else {\n const typeName = (opt.argChoices ? \"CHOICE\" : \"VALUE\").toUpperCase();\n parts.push(`[${flag} \\\\fI${typeName}\\\\fR]`);\n }\n }\n\n for (const arg of command.registeredArguments ?? []) {\n const meta = arg.name().toUpperCase();\n if (arg.required) {\n parts.push(`\\\\fI${meta}\\\\fR`);\n } else {\n parts.push(`[\\\\fI${meta}\\\\fR]`);\n }\n }\n\n return parts.join(\" \");\n}\n\nfunction generateManPage(\n commandName: string,\n command: Command | null,\n progName: string,\n version = SHELL_VERSION,\n): string {\n const today = new Date().toISOString().slice(0, 10);\n const title = `${progName}-${commandName}`.toUpperCase();\n const pkgLabel = `${progName} ${version}`;\n const manualLabel = `${progName} Manual`;\n\n const sections: string[] = [];\n sections.push(`.TH \"${title}\" \"1\" \"${today}\" \"${pkgLabel}\" \"${manualLabel}\"`);\n\n sections.push(\".SH NAME\");\n const desc = command?.description() ?? commandName;\n const nameDesc = desc.split(\"\\n\")[0].replace(/\\.$/, \"\");\n sections.push(`${progName}-${commandName} \\\\- ${nameDesc}`);\n\n sections.push(\".SH SYNOPSIS\");\n sections.push(buildSynopsis(command, progName, commandName));\n\n if (command?.description()) {\n sections.push(\".SH DESCRIPTION\");\n sections.push(\n command.description().replace(/\\\\/g, \"\\\\\\\\\").replace(/-/g, \"\\\\-\"),\n );\n }\n\n if (command && command.options.length > 0) {\n sections.push(\".SH OPTIONS\");\n for (const opt of command.options) {\n const flag = [opt.short, opt.long].filter(Boolean).join(\", \");\n sections.push(\".TP\");\n if (opt.isBoolean?.()) {\n sections.push(`\\\\fB${flag}\\\\fR`);\n } else {\n sections.push(`\\\\fB${flag}\\\\fR \\\\fIVALUE\\\\fR`);\n }\n if (opt.description) {\n sections.push(opt.description);\n }\n if (opt.defaultValue !== undefined && !opt.isBoolean?.()) {\n sections.push(`Default: ${opt.defaultValue}.`);\n }\n }\n }\n\n sections.push(\".SH ENVIRONMENT\");\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_EXTENSIONS_ROOT\\\\fR\");\n sections.push(\n \"Path to the apcore extensions directory. Overrides the default \\\\fI./extensions\\\\fR.\",\n );\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_CLI_AUTO_APPROVE\\\\fR\");\n sections.push(\n \"Set to \\\\fB1\\\\fR to bypass approval prompts for modules that require human-in-the-loop confirmation.\",\n );\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_CLI_LOGGING_LEVEL\\\\fR\");\n sections.push(\n \"CLI-specific logging verbosity. One of: DEBUG, INFO, WARNING, ERROR. \" +\n \"Takes priority over \\\\fBAPCORE_LOGGING_LEVEL\\\\fR. Default: WARNING.\",\n );\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_LOGGING_LEVEL\\\\fR\");\n sections.push(\n \"Global apcore logging verbosity. One of: DEBUG, INFO, WARNING, ERROR. \" +\n \"Used as fallback when \\\\fBAPCORE_CLI_LOGGING_LEVEL\\\\fR is not set. Default: WARNING.\",\n );\n sections.push(\".TP\");\n sections.push(\"\\\\fBAPCORE_AUTH_API_KEY\\\\fR\");\n sections.push(\n \"API key for authenticating with the apcore registry.\",\n );\n\n sections.push(\".SH EXIT CODES\");\n const exitCodes: [string, string][] = [\n [\"0\", \"Success.\"],\n [\"1\", \"Module execution error.\"],\n [\"2\", \"Invalid CLI input or missing argument.\"],\n [\"44\", \"Module not found, disabled, or failed to load.\"],\n [\"45\", \"Input failed JSON Schema validation.\"],\n [\n \"46\",\n \"Approval denied, timed out, or no interactive terminal available.\",\n ],\n [\n \"47\",\n \"Configuration error (extensions directory not found or unreadable).\",\n ],\n [\"48\", \"Schema contains a circular \\\\fB$ref\\\\fR.\"],\n [\"77\", \"ACL denied — insufficient permissions for this module.\"],\n [\"130\", \"Execution cancelled by user (SIGINT / Ctrl\\\\-C).\"],\n ];\n for (const [code, meaning] of exitCodes) {\n sections.push(`.TP\\n\\\\fB${code}\\\\fR\\n${meaning}`);\n }\n\n sections.push(\".SH SEE ALSO\");\n sections.push(\n [\n `\\\\fB${progName}\\\\fR(1)`,\n `\\\\fB${progName}\\\\-list\\\\fR(1)`,\n `\\\\fB${progName}\\\\-describe\\\\fR(1)`,\n `\\\\fB${progName}\\\\-completion\\\\fR(1)`,\n ].join(\", \"),\n );\n\n return sections.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Program-wide man page generation\n// ---------------------------------------------------------------------------\n\n/** Escape a string for roff output. */\nfunction roffEscape(s: string): string {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/-/g, \"\\\\-\").replace(/'/g, \"\\\\(aq\");\n}\n\n/**\n * Build a complete roff man page for the entire program.\n * Covers all registered commands including downstream business commands.\n */\nexport function buildProgramManPage(\n program: Command,\n progName: string,\n version: string,\n description?: string,\n docsUrl?: string,\n): string {\n const help = new Help();\n const today = new Date().toISOString().slice(0, 10);\n const s: string[] = [];\n\n const resolvedDesc = description ?? program.description() ?? `${progName} CLI`;\n\n s.push(`.TH \"${progName.toUpperCase()}\" \"1\" \"${today}\" \"${progName} ${version}\" \"${progName} Manual\"`);\n\n s.push(\".SH NAME\");\n s.push(`${progName} \\\\- ${roffEscape(resolvedDesc)}`);\n\n s.push(\".SH SYNOPSIS\");\n s.push(`\\\\fB${progName}\\\\fR [\\\\fIglobal\\\\-options\\\\fR] \\\\fIcommand\\\\fR [\\\\fIcommand\\\\-options\\\\fR]`);\n\n if (resolvedDesc) {\n s.push(\".SH DESCRIPTION\");\n s.push(roffEscape(resolvedDesc));\n }\n\n // Global options\n const globalOpts = help.visibleOptions(program)\n .filter((o) => ![\"help\", \"version\", \"all\", \"man\"].includes(o.long?.replace(\"--\", \"\") ?? \"\"));\n if (globalOpts.length > 0) {\n s.push(\".SH GLOBAL OPTIONS\");\n for (const opt of globalOpts) {\n const flag = [opt.short, opt.long].filter(Boolean).join(\", \");\n s.push(\".TP\");\n s.push(`\\\\fB${roffEscape(flag)}\\\\fR`);\n if (opt.description) s.push(roffEscape(opt.description));\n }\n }\n\n // Commands\n const allCommands = help.visibleCommands(program);\n if (allCommands.length > 0) {\n s.push(\".SH COMMANDS\");\n for (const cmd of allCommands) {\n if (cmd.name() === \"help\") continue;\n\n const desc = help.subcommandDescription(cmd);\n s.push(\".TP\");\n s.push(`\\\\fB${progName} ${roffEscape(cmd.name())}\\\\fR`);\n if (desc) s.push(roffEscape(desc));\n\n // Command options\n const cmdHelp = new Help();\n const opts = cmdHelp.visibleOptions(cmd)\n .filter((o) => ![\"help\", \"version\"].includes(o.long?.replace(\"--\", \"\") ?? \"\"));\n for (const opt of opts) {\n const flag = [opt.short, opt.long].filter(Boolean).join(\", \");\n s.push(\".RS\");\n s.push(\".TP\");\n s.push(`\\\\fB${roffEscape(flag)}\\\\fR`);\n if (opt.description) s.push(roffEscape(opt.description));\n s.push(\".RE\");\n }\n\n // Nested subcommands (e.g., series init, asset add)\n const subCmds = cmdHelp.visibleCommands(cmd).filter((c) => c.name() !== \"help\");\n for (const sub of subCmds) {\n const subDesc = help.subcommandDescription(sub);\n s.push(\".TP\");\n s.push(`\\\\fB${progName} ${roffEscape(cmd.name())} ${roffEscape(sub.name())}\\\\fR`);\n if (subDesc) s.push(roffEscape(subDesc));\n const subOpts = cmdHelp.visibleOptions(sub)\n .filter((o) => ![\"help\", \"version\"].includes(o.long?.replace(\"--\", \"\") ?? \"\"));\n for (const opt of subOpts) {\n const flag = [opt.short, opt.long].filter(Boolean).join(\", \");\n s.push(\".RS\");\n s.push(\".TP\");\n s.push(`\\\\fB${roffEscape(flag)}\\\\fR`);\n if (opt.description) s.push(roffEscape(opt.description));\n s.push(\".RE\");\n }\n }\n }\n }\n\n // Environment\n s.push(\".SH ENVIRONMENT\");\n s.push(\".TP\");\n s.push(\"\\\\fBAPCORE_EXTENSIONS_ROOT\\\\fR\");\n s.push(\"Path to the apcore extensions directory.\");\n s.push(\".TP\");\n s.push(\"\\\\fBAPCORE_CLI_AUTO_APPROVE\\\\fR\");\n s.push(\"Set to \\\\fB1\\\\fR to bypass approval prompts.\");\n s.push(\".TP\");\n s.push(\"\\\\fBAPCORE_CLI_LOGGING_LEVEL\\\\fR\");\n s.push(\"CLI\\\\-specific logging verbosity (DEBUG|INFO|WARNING|ERROR).\");\n\n // Exit codes\n s.push(\".SH EXIT CODES\");\n const exitCodes: [string, string][] = [\n [\"0\", \"Success.\"],\n [\"1\", \"Module execution error.\"],\n [\"2\", \"Invalid CLI input or missing argument.\"],\n [\"44\", \"Module not found, disabled, or failed to load.\"],\n [\"45\", \"Input failed JSON Schema validation.\"],\n [\"46\", \"Approval denied or timed out.\"],\n [\"47\", \"Configuration error.\"],\n [\"77\", \"ACL denied.\"],\n [\"130\", \"Cancelled by user (SIGINT).\"],\n ];\n for (const [code, meaning] of exitCodes) {\n s.push(`.TP\\n\\\\fB${code}\\\\fR\\n${meaning}`);\n }\n\n s.push(\".SH SEE ALSO\");\n s.push(`\\\\fB${progName} \\\\-\\\\-help \\\\-\\\\-verbose\\\\fR for full option list.`);\n if (docsUrl) {\n s.push(`.PP\\nFull documentation at \\\\fI${roffEscape(docsUrl)}\\\\fR`);\n }\n\n return s.join(\"\\n\");\n}\n\n/**\n * Configure --help --man support on a Commander program.\n * When --man is passed with --help, outputs a complete roff man page\n * covering all registered commands (including downstream business commands).\n *\n * Usage in downstream projects:\n * configureManHelp(program, 'reach', '0.2.0', 'ReachForge: The Social Influence Engine', 'https://reachforge.dev/docs');\n */\nexport function configureManHelp(\n program: Command,\n progName: string,\n version: string,\n description?: string,\n docsUrl?: string,\n): void {\n // Add --man as a hidden option\n const manOpt = new Option(\"--man\", \"Output man page in roff format (use with --help)\").hideHelp();\n program.addOption(manOpt);\n\n // Intercept help to output roff when --man is set\n program.addHelpText(\"beforeAll\", () => {\n if (program.opts().man) {\n const roff = buildProgramManPage(program, progName, version, description, docsUrl) + \"\\n\";\n\n // If stdout is a TTY, render through a pager; otherwise output raw roff\n // (allows piping/redirection like `reach --help --man > reach.1`)\n if (process.stdout.isTTY) {\n // Try mandoc first (available on macOS/BSD), then groff, then fall back to raw output\n const pagers: Array<{ cmd: string; args: string[] }> = [\n { cmd: \"mandoc\", args: [\"-a\"] },\n { cmd: \"groff\", args: [\"-man\", \"-Tutf8\"] },\n ];\n let rendered = false;\n for (const { cmd, args } of pagers) {\n const result = spawnSync(cmd, args, {\n input: roff,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n encoding: \"utf-8\",\n });\n if (result.status === 0 && result.stdout) {\n const pager = process.env.PAGER || \"less\";\n const pagerResult = spawnSync(pager, [\"-R\"], {\n input: result.stdout,\n stdio: [\"pipe\", \"inherit\", \"inherit\"],\n });\n if (pagerResult.status !== null) {\n rendered = true;\n break;\n }\n }\n }\n if (!rendered) {\n process.stdout.write(roff);\n }\n } else {\n process.stdout.write(roff);\n }\n process.exit(0);\n }\n return \"\";\n });\n}\n\n// ---------------------------------------------------------------------------\n// registerShellCommands\n// ---------------------------------------------------------------------------\n\n/**\n * Register completion and man commands.\n */\nexport function registerShellCommands(\n cli: Command,\n progName = \"apcore-cli\",\n): void {\n const completionCmd = new Command(\"completion\")\n .description(\n \"Generate a shell completion script and print it to stdout.\",\n )\n .argument(\"<shell>\", \"Shell type: bash, zsh, or fish\")\n .action((shell: string) => {\n const validShells = [\"bash\", \"zsh\", \"fish\"];\n if (!validShells.includes(shell)) {\n process.stderr.write(\n `Error: Unknown shell '${shell}'. Expected: bash, zsh, or fish.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n const resolved = cli.name() || progName;\n const generators: Record<string, () => string> = {\n bash: () => generateBashCompletion(resolved),\n zsh: () => generateZshCompletion(resolved),\n fish: () => generateFishCompletion(resolved),\n };\n process.stdout.write(generators[shell]());\n });\n cli.addCommand(completionCmd);\n\n const manCmd = new Command(\"man\")\n .description(\"Generate a roff man page for COMMAND and print it to stdout.\")\n .argument(\"<command>\", \"Command to generate man page for\")\n .action((commandName: string) => {\n const knownBuiltins = new Set([\"completion\", \"describe\", \"exec\", \"init\", \"list\", \"man\"]);\n const cmd = cli.commands.find((c) => c.name() === commandName) ?? null;\n\n if (!cmd && !knownBuiltins.has(commandName)) {\n process.stderr.write(\n `Error: Unknown command '${commandName}'.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n const resolved = cli.name() || progName;\n const roff = generateManPage(commandName, cmd, resolved);\n process.stdout.write(roff);\n });\n cli.addCommand(manCmd);\n}\n","/**\n * Discovery commands — list, describe, validate (FE-04, FE-11).\n *\n * Protocol spec: Module discovery & introspection\n */\n\nimport { Command, Option } from \"commander\";\nimport type { Executor, ModuleDescriptor, Registry } from \"./cli.js\";\nimport { EXIT_CODES } from \"./errors.js\";\nimport { validateModuleId, collectInput } from \"./main.js\";\nimport {\n formatModuleDetail,\n formatModuleList,\n formatPreflightResult,\n firstFailedExitCode,\n resolveFormat,\n} from \"./output.js\";\n\nconst TAG_PATTERN = /^[a-z][a-z0-9_-]*$/;\n\nfunction validateTag(tag: string): void {\n if (!TAG_PATTERN.test(tag)) {\n process.stderr.write(\n `Error: Invalid tag format: '${tag}'. Tags must match [a-z][a-z0-9_-]*.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n}\n\n/**\n * Collect repeated --tag options into an array.\n */\nfunction collectTag(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Collect repeated --annotation options into an array.\n */\nfunction collectAnnotation(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Get an annotation value from a module descriptor.\n */\nfunction getAnnotationFlag(moduleDef: ModuleDescriptor, flag: string): boolean {\n const annotations = moduleDef.annotations;\n if (!annotations || typeof annotations !== \"object\") return false;\n const ann = annotations as Record<string, unknown>;\n // Map CLI flag names to annotation property names\n const map: Record<string, string> = {\n \"destructive\": \"destructive\",\n \"requires-approval\": \"requires_approval\",\n \"readonly\": \"readonly\",\n \"streaming\": \"streaming\",\n \"cacheable\": \"cacheable\",\n \"idempotent\": \"idempotent\",\n };\n const attr = map[flag] ?? flag;\n return ann[attr] === true;\n}\n\n/**\n * Register list and describe commands on the CLI group.\n */\nexport function registerDiscoveryCommands(\n cli: Command,\n registry: Registry,\n): void {\n const listCmd = new Command(\"list\")\n .description(\"List available modules in the registry.\")\n .option(\"--tag <tag>\", \"Filter modules by tag (AND logic). Repeatable.\", collectTag, [])\n .option(\"--flat\", \"Show flat list (no grouping).\", false)\n .option(\"--format <format>\", \"Output format.\", undefined)\n .option(\"-s, --search <query>\", \"Filter by substring match on ID and description.\")\n .addOption(\n new Option(\"--status <status>\", \"Filter by module status.\")\n .choices([\"enabled\", \"disabled\", \"all\"])\n .default(\"enabled\"),\n )\n .option(\"-a, --annotation <flag>\", \"Filter by annotation flag (AND logic). Repeatable.\", collectAnnotation, [])\n .addOption(\n new Option(\"--sort <field>\", \"Sort order.\")\n .choices([\"id\", \"calls\", \"errors\", \"latency\"])\n .default(\"id\"),\n )\n .option(\"--reverse\", \"Reverse sort order.\", false)\n .option(\"--deprecated\", \"Include deprecated modules.\", false)\n .option(\"--deps\", \"Show dependency count column.\", false)\n .action((opts: {\n tag: string[];\n flat: boolean;\n format?: string;\n search?: string;\n status: string;\n annotation: string[];\n sort: string;\n reverse: boolean;\n deprecated: boolean;\n deps: boolean;\n }) => {\n // Validate tags\n for (const t of opts.tag) {\n validateTag(t);\n }\n\n let modules: ModuleDescriptor[] = [];\n for (const m of registry.listModules()) {\n modules.push(m);\n }\n\n // Tag filter (AND logic)\n if (opts.tag.length > 0) {\n const filterTags = new Set(opts.tag);\n modules = modules.filter((m) => {\n const mTags = m.tags ?? [];\n return [...filterTags].every((t) => mTags.includes(t));\n });\n }\n\n // Search filter (case-insensitive substring on id + description)\n if (opts.search) {\n const query = opts.search.toLowerCase();\n modules = modules.filter(\n (m) =>\n (m.id ?? \"\").toLowerCase().includes(query) ||\n (m.description ?? \"\").toLowerCase().includes(query),\n );\n }\n\n // Status filter\n if (opts.status === \"enabled\") {\n modules = modules.filter((m) => {\n const enabled = (m as unknown as Record<string, unknown>).enabled;\n return enabled !== false;\n });\n } else if (opts.status === \"disabled\") {\n modules = modules.filter((m) => {\n const enabled = (m as unknown as Record<string, unknown>).enabled;\n return enabled === false;\n });\n }\n // \"all\": no filter\n\n // Deprecated filter (excluded by default)\n if (!opts.deprecated) {\n modules = modules.filter((m) => {\n const deprecated = (m as unknown as Record<string, unknown>).deprecated;\n return deprecated !== true;\n });\n }\n\n // Annotation filter (AND logic)\n if (opts.annotation.length > 0) {\n for (const annFlag of opts.annotation) {\n modules = modules.filter((m) => getAnnotationFlag(m, annFlag));\n }\n }\n\n // Sort — usage-based sorts require system.usage modules\n if (opts.sort === \"calls\" || opts.sort === \"errors\" || opts.sort === \"latency\") {\n process.stderr.write(\n `Warning: Usage data not available; sorting by id. Sort by ${opts.sort} requires system.usage modules.\\n`,\n );\n }\n modules.sort((a, b) => (a.id ?? \"\").localeCompare(b.id ?? \"\"));\n if (opts.reverse) {\n modules.reverse();\n }\n\n const fmt = resolveFormat(opts.format);\n const filterTagsArg = opts.tag.length > 0 ? opts.tag : undefined;\n formatModuleList(modules, fmt, filterTagsArg, opts.deps);\n });\n cli.addCommand(listCmd);\n\n const describeCmd = new Command(\"describe\")\n .description(\"Show metadata, schema, and annotations for a module.\")\n .argument(\"<module-id>\", \"Module ID to describe\")\n .option(\"--format <format>\", \"Output format.\", undefined)\n .action((moduleId: string, opts: { format?: string }) => {\n validateModuleId(moduleId);\n\n const moduleDef = registry.getModule(moduleId);\n if (!moduleDef) {\n process.stderr.write(\n `Error: Module '${moduleId}' not found.\\n`,\n );\n process.exit(EXIT_CODES.MODULE_NOT_FOUND);\n }\n\n const fmt = resolveFormat(opts.format);\n formatModuleDetail(moduleDef, fmt);\n });\n cli.addCommand(describeCmd);\n}\n\n/**\n * Register the standalone validate command.\n */\nexport function registerValidateCommand(\n cli: Command,\n registry: Registry,\n executor: Executor,\n): void {\n const validateCmd = new Command(\"validate\")\n .description(\"Run preflight checks without executing a module.\")\n .argument(\"<module-id>\", \"Module ID to validate\")\n .option(\"--input <source>\", \"JSON input file or '-' for stdin.\")\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string, opts: { input?: string; format?: string }) => {\n validateModuleId(moduleId);\n\n const moduleDef = registry.getModule(moduleId);\n if (!moduleDef) {\n process.stderr.write(`Error: Module '${moduleId}' not found.\\n`);\n process.exit(EXIT_CODES.MODULE_NOT_FOUND);\n }\n\n const merged = opts.input ? await collectInput(opts.input, {}, false) : {};\n\n if (!executor.validate) {\n process.stderr.write(\"Error: Executor does not support validate.\\n\");\n process.exit(1);\n }\n\n const preflight = await executor.validate(moduleId, merged);\n formatPreflightResult(preflight, opts.format);\n process.exit(preflight.valid ? 0 : firstFailedExitCode(preflight));\n });\n cli.addCommand(validateCmd);\n}\n","/**\n * System management commands — health, usage, enable, disable, reload, config (FE-11 F2).\n *\n * Each delegates to system.* modules via executor.\n * No-op if system modules are unavailable (graceful probe).\n */\n\nimport { Command } from \"commander\";\nimport type { Executor } from \"./cli.js\";\nimport { formatExecResult, resolveFormat } from \"./output.js\";\nimport { debug } from \"./logger.js\";\n\n/**\n * Call a system module via executor.call() and return the result.\n */\nasync function callSystemModule(\n executor: Executor,\n moduleId: string,\n inputs: Record<string, unknown>,\n): Promise<unknown> {\n if (executor.call) {\n return executor.call(moduleId, inputs);\n }\n return executor.execute(moduleId, inputs);\n}\n\n/**\n * Render health summary as TTY text.\n */\nfunction formatHealthSummaryTty(result: Record<string, unknown>): void {\n const summary = (result.summary ?? {}) as Record<string, unknown>;\n const modules = (result.modules ?? []) as Record<string, unknown>[];\n\n if (modules.length === 0) {\n process.stdout.write(\"No modules found.\\n\");\n return;\n }\n\n const total = summary.total_modules ?? modules.length;\n process.stdout.write(`Health Overview (${total} modules)\\n\\n`);\n process.stdout.write(` ${\"Module\".padEnd(28)} ${\"Status\".padEnd(12)} ${\"Error Rate\".padEnd(12)} Top Error\\n`);\n process.stdout.write(` ${\"-\".repeat(28)} ${\"-\".repeat(12)} ${\"-\".repeat(12)} ${\"-\".repeat(20)}\\n`);\n\n for (const m of modules) {\n const top = m.top_error as Record<string, unknown> | undefined;\n const topStr = top ? `${top.code} (${top.count ?? \"?\"})` : \"\\u2014\";\n const rate = `${((m.error_rate as number ?? 0) * 100).toFixed(1)}%`;\n process.stdout.write(\n ` ${String(m.module_id).padEnd(28)} ${String(m.status).padEnd(12)} ${rate.padEnd(12)} ${topStr}\\n`,\n );\n }\n\n const parts: string[] = [];\n for (const key of [\"healthy\", \"degraded\", \"error\"]) {\n const count = summary[key] as number | undefined;\n if (count) parts.push(`${count} ${key}`);\n }\n process.stdout.write(`\\nSummary: ${parts.join(\", \") || \"no data\"}\\n`);\n}\n\n/**\n * Render single-module health detail.\n */\nfunction formatHealthModuleTty(result: Record<string, unknown>): void {\n process.stdout.write(`Module: ${result.module_id ?? \"?\"}\\n`);\n process.stdout.write(`Status: ${result.status ?? \"unknown\"}\\n`);\n const total = result.total_calls as number ?? 0;\n const errors = result.error_count as number ?? 0;\n const rate = result.error_rate as number ?? 0;\n const avg = result.avg_latency_ms as number ?? 0;\n const p99 = result.p99_latency_ms as number ?? 0;\n process.stdout.write(`Calls: ${total.toLocaleString()} total | ${errors.toLocaleString()} errors | ${(rate * 100).toFixed(1)}% error rate\\n`);\n process.stdout.write(`Latency: ${avg.toFixed(0)}ms avg | ${p99.toFixed(0)}ms p99\\n`);\n\n const recent = (result.recent_errors ?? []) as Record<string, unknown>[];\n if (recent.length > 0) {\n process.stdout.write(`\\nRecent Errors (top ${recent.length}):\\n`);\n for (const e of recent) {\n const count = e.count ?? \"?\";\n const last = e.last_occurred ?? \"?\";\n process.stdout.write(` ${String(e.code ?? \"?\").padEnd(24)} x${count} (last: ${last})\\n`);\n }\n }\n}\n\n/**\n * Render usage summary as TTY text.\n */\nfunction formatUsageSummaryTty(result: Record<string, unknown>): void {\n const modules = (result.modules ?? []) as Record<string, unknown>[];\n const period = result.period ?? \"?\";\n\n if (modules.length === 0) {\n process.stdout.write(`No usage data for period ${period}.\\n`);\n return;\n }\n\n process.stdout.write(`Usage Summary (last ${period})\\n\\n`);\n process.stdout.write(` ${\"Module\".padEnd(24)} ${\"Calls\".padStart(8)} ${\"Errors\".padStart(8)} ${\"Avg Latency\".padStart(12)} ${\"Trend\".padStart(10)}\\n`);\n process.stdout.write(` ${\"-\".repeat(24)} ${\"-\".repeat(8)} ${\"-\".repeat(8)} ${\"-\".repeat(12)} ${\"-\".repeat(10)}\\n`);\n\n for (const m of modules) {\n const avg = `${((m.avg_latency_ms as number) ?? 0).toFixed(0)}ms`;\n process.stdout.write(\n ` ${String(m.module_id).padEnd(24)} ${String((m.call_count as number) ?? 0).padStart(8)} ` +\n `${String((m.error_count as number) ?? 0).padStart(8)} ${avg.padStart(12)} ${String(m.trend ?? \"\").padStart(10)}\\n`,\n );\n }\n\n const totalCalls = (result.total_calls as number) ?? modules.reduce((s, m) => s + ((m.call_count as number) ?? 0), 0);\n const totalErrors = (result.total_errors as number) ?? modules.reduce((s, m) => s + ((m.error_count as number) ?? 0), 0);\n process.stdout.write(`\\nTotal: ${totalCalls.toLocaleString()} calls | ${totalErrors.toLocaleString()} errors\\n`);\n}\n\n/**\n * Register system management commands. No-op if system modules are not available.\n */\nexport async function registerSystemCommands(\n cli: Command,\n executor: Executor,\n): Promise<void> {\n // Probe: check if system modules exist\n try {\n if (executor.validate) {\n await executor.validate(\"system.health.summary\", {});\n } else {\n await callSystemModule(executor, \"system.health.summary\", { include_healthy: true });\n }\n } catch {\n debug(\"System modules not available; skipping system command registration.\");\n return;\n }\n\n // health command\n const healthCmd = new Command(\"health\")\n .description(\"Show module health status. Optionally specify a module ID for details.\")\n .argument(\"[module-id]\", \"Module ID for detailed health\")\n .option(\"--threshold <number>\", \"Error rate threshold (default: 0.01).\", parseFloat, 0.01)\n .option(\"--all\", \"Include healthy modules.\", false)\n .option(\"--errors <count>\", \"Max recent errors (module detail only).\", parseInt, 10)\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string | undefined, opts: { threshold: number; all: boolean; errors: number; format?: string }) => {\n const fmt = resolveFormat(opts.format);\n try {\n if (moduleId) {\n const result = await callSystemModule(executor, \"system.health.module\", {\n module_id: moduleId,\n error_limit: opts.errors,\n }) as Record<string, unknown>;\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n formatHealthModuleTty(result);\n }\n } else {\n const result = await callSystemModule(executor, \"system.health.summary\", {\n error_rate_threshold: opts.threshold,\n include_healthy: opts.all,\n }) as Record<string, unknown>;\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n formatHealthSummaryTty(result);\n }\n }\n } catch (e) {\n process.stderr.write(`Error: ${e instanceof Error ? e.message : e}\\n`);\n process.exit(1);\n }\n });\n cli.addCommand(healthCmd);\n\n // usage command\n const usageCmd = new Command(\"usage\")\n .description(\"Show module usage statistics. Optionally specify a module ID for details.\")\n .argument(\"[module-id]\", \"Module ID for detailed usage\")\n .option(\"--period <period>\", \"Time window: 1h, 24h, 7d, 30d.\", \"24h\")\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string | undefined, opts: { period: string; format?: string }) => {\n const fmt = resolveFormat(opts.format);\n try {\n let result: unknown;\n if (moduleId) {\n result = await callSystemModule(executor, \"system.usage.module\", {\n module_id: moduleId,\n period: opts.period,\n });\n } else {\n result = await callSystemModule(executor, \"system.usage.summary\", {\n period: opts.period,\n });\n }\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else if (moduleId) {\n formatExecResult(result, fmt);\n } else {\n formatUsageSummaryTty(result as Record<string, unknown>);\n }\n } catch (e) {\n process.stderr.write(`Error: ${e instanceof Error ? e.message : e}\\n`);\n process.exit(1);\n }\n });\n cli.addCommand(usageCmd);\n\n // enable command\n const enableCmd = new Command(\"enable\")\n .description(\"Enable a disabled module at runtime.\")\n .argument(\"<module-id>\", \"Module ID to enable\")\n .requiredOption(\"--reason <reason>\", \"Reason for enabling (required for audit).\")\n .option(\"-y, --yes\", \"Skip approval prompt.\", false)\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string, opts: { reason: string; yes: boolean; format?: string }) => {\n if (!opts.yes) {\n process.stderr.write(\"Note: This command requires approval. Use --yes to bypass.\\n\");\n }\n const fmt = resolveFormat(opts.format);\n try {\n const result = await callSystemModule(executor, \"system.control.toggle_feature\", {\n module_id: moduleId,\n enabled: true,\n reason: opts.reason,\n }) as Record<string, unknown>;\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n process.stdout.write(`Module '${moduleId}' enabled.\\n Reason: ${opts.reason}\\n`);\n }\n } catch (e) {\n process.stderr.write(`Error: ${e instanceof Error ? e.message : e}\\n`);\n process.exit(1);\n }\n });\n cli.addCommand(enableCmd);\n\n // disable command\n const disableCmd = new Command(\"disable\")\n .description(\"Disable a module at runtime (calls are rejected until re-enabled).\")\n .argument(\"<module-id>\", \"Module ID to disable\")\n .requiredOption(\"--reason <reason>\", \"Reason for disabling (required for audit).\")\n .option(\"-y, --yes\", \"Skip approval prompt.\", false)\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string, opts: { reason: string; yes: boolean; format?: string }) => {\n if (!opts.yes) {\n process.stderr.write(\"Note: This command requires approval. Use --yes to bypass.\\n\");\n }\n const fmt = resolveFormat(opts.format);\n try {\n const result = await callSystemModule(executor, \"system.control.toggle_feature\", {\n module_id: moduleId,\n enabled: false,\n reason: opts.reason,\n }) as Record<string, unknown>;\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n process.stdout.write(`Module '${moduleId}' disabled.\\n Reason: ${opts.reason}\\n`);\n }\n } catch (e) {\n process.stderr.write(`Error: ${e instanceof Error ? e.message : e}\\n`);\n process.exit(1);\n }\n });\n cli.addCommand(disableCmd);\n\n // reload command\n const reloadCmd = new Command(\"reload\")\n .description(\"Hot-reload a module from disk.\")\n .argument(\"<module-id>\", \"Module ID to reload\")\n .requiredOption(\"--reason <reason>\", \"Reason for reload (required for audit).\")\n .option(\"-y, --yes\", \"Skip approval prompt.\", false)\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string, opts: { reason: string; yes: boolean; format?: string }) => {\n if (!opts.yes) {\n process.stderr.write(\"Note: This command requires approval. Use --yes to bypass.\\n\");\n }\n const fmt = resolveFormat(opts.format);\n try {\n const result = await callSystemModule(executor, \"system.control.reload_module\", {\n module_id: moduleId,\n reason: opts.reason,\n }) as Record<string, unknown>;\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n const prev = result.previous_version ?? \"?\";\n const newVer = result.new_version ?? \"?\";\n const dur = result.reload_duration_ms ?? \"?\";\n process.stdout.write(`Module '${moduleId}' reloaded.\\n`);\n process.stdout.write(` Version: ${prev} -> ${newVer}\\n`);\n process.stdout.write(` Duration: ${dur}ms\\n`);\n }\n } catch (e) {\n process.stderr.write(`Error: ${e instanceof Error ? e.message : e}\\n`);\n process.exit(1);\n }\n });\n cli.addCommand(reloadCmd);\n\n // config group (get/set)\n const configGroup = new Command(\"config\")\n .description(\"Read or update runtime configuration.\");\n\n const configGetCmd = new Command(\"get\")\n .description(\"Read a configuration value by dot-path key.\")\n .argument(\"<key>\", \"Configuration key (dot-path)\")\n .option(\"--format <format>\", \"Output format.\", \"table\")\n .action(async (key: string, opts: { format?: string }) => {\n const fmt = resolveFormat(opts.format);\n try {\n const result = await callSystemModule(executor, \"system.config.get\", { key });\n const value = (result as Record<string, unknown>)?.value ?? result;\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify({ key, value }, null, 2) + \"\\n\");\n } else {\n process.stdout.write(`${key} = ${JSON.stringify(value)}\\n`);\n }\n } catch (e) {\n process.stderr.write(`Error: ${e instanceof Error ? e.message : e}\\n`);\n process.exit(1);\n }\n });\n configGroup.addCommand(configGetCmd);\n\n const configSetCmd = new Command(\"set\")\n .description(\"Update a runtime configuration value (requires approval).\")\n .argument(\"<key>\", \"Configuration key (dot-path)\")\n .argument(\"<value>\", \"New value\")\n .requiredOption(\"--reason <reason>\", \"Reason for config change (required for audit).\")\n .option(\"--format <format>\", \"Output format.\")\n .action(async (key: string, value: string, opts: { reason: string; format?: string }) => {\n const fmt = resolveFormat(opts.format);\n // Attempt to parse value as JSON for typed values\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(value);\n } catch {\n parsedValue = value;\n }\n\n try {\n const result = await callSystemModule(executor, \"system.control.update_config\", {\n key,\n value: parsedValue,\n reason: opts.reason,\n }) as Record<string, unknown>;\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n const old = result.old_value ?? \"?\";\n const newVal = result.new_value ?? \"?\";\n process.stdout.write(`Config updated: ${key}\\n`);\n process.stdout.write(` ${JSON.stringify(old)} -> ${JSON.stringify(newVal)}\\n`);\n process.stdout.write(` Reason: ${opts.reason}\\n`);\n }\n } catch (e) {\n process.stderr.write(`Error: ${e instanceof Error ? e.message : e}\\n`);\n process.exit(1);\n }\n });\n configGroup.addCommand(configSetCmd);\n\n cli.addCommand(configGroup);\n}\n","/**\n * Pipeline strategy commands — describe-pipeline (FE-11 F8).\n */\n\nimport { Command, Option } from \"commander\";\nimport type { Executor } from \"./cli.js\";\nimport { resolveFormat } from \"./output.js\";\n\n/** Preset pipeline steps for each strategy. */\nconst PRESET_STEPS: Record<string, string[]> = {\n standard: [\n \"context_creation\",\n \"call_chain_guard\",\n \"module_lookup\",\n \"acl_check\",\n \"approval_gate\",\n \"middleware_before\",\n \"input_validation\",\n \"execute\",\n \"output_validation\",\n \"middleware_after\",\n \"return_result\",\n ],\n internal: [\n \"context_creation\",\n \"call_chain_guard\",\n \"module_lookup\",\n \"middleware_before\",\n \"input_validation\",\n \"execute\",\n \"output_validation\",\n \"middleware_after\",\n \"return_result\",\n ],\n testing: [\n \"context_creation\",\n \"module_lookup\",\n \"middleware_before\",\n \"input_validation\",\n \"execute\",\n \"output_validation\",\n \"middleware_after\",\n \"return_result\",\n ],\n performance: [\n \"context_creation\",\n \"call_chain_guard\",\n \"module_lookup\",\n \"acl_check\",\n \"approval_gate\",\n \"input_validation\",\n \"execute\",\n \"output_validation\",\n \"return_result\",\n ],\n minimal: [\n \"context_creation\",\n \"module_lookup\",\n \"execute\",\n \"return_result\",\n ],\n};\n\n/**\n * Register the describe-pipeline command.\n */\nexport function registerPipelineCommand(cli: Command, executor: Executor): void {\n const pipelineCmd = new Command(\"describe-pipeline\")\n .description(\"Show the execution pipeline steps for a strategy.\")\n .addOption(\n new Option(\"--strategy <name>\", \"Strategy to describe (default: standard).\")\n .choices([\"standard\", \"internal\", \"testing\", \"performance\", \"minimal\"])\n .default(\"standard\"),\n )\n .option(\"--format <format>\", \"Output format.\")\n .action((opts: { strategy: string; format?: string }) => {\n const fmt = resolveFormat(opts.format);\n\n // Try to get strategy info from executor\n let strategyObj: { steps: Array<{ name: string; pure?: boolean; removable?: boolean; timeout_ms?: number }> } | null = null;\n const ex = executor as unknown as Record<string, unknown>;\n if (typeof ex._resolve_strategy_name === \"function\" || typeof ex._resolveStrategyName === \"function\") {\n try {\n const fn = (ex._resolve_strategy_name ?? ex._resolveStrategyName) as (name: string) => unknown;\n strategyObj = fn(opts.strategy) as { steps: Array<{ name: string; pure?: boolean; removable?: boolean; timeout_ms?: number }> } | null;\n } catch {\n strategyObj = null;\n }\n }\n\n if (!strategyObj) {\n // Provide static info for known strategies with metadata columns.\n const steps = PRESET_STEPS[opts.strategy] ?? [];\n const pureSteps = new Set([\n \"context_creation\", \"call_chain_guard\", \"module_lookup\", \"acl_check\", \"input_validation\",\n ]);\n const nonRemovable = new Set([\n \"context_creation\", \"module_lookup\", \"execute\", \"return_result\",\n ]);\n\n if (fmt === \"json\" || !process.stdout.isTTY) {\n const payload = {\n strategy: opts.strategy,\n step_count: steps.length,\n steps: steps.map((s, i) => ({\n index: i + 1,\n name: s,\n pure: pureSteps.has(s),\n removable: !nonRemovable.has(s),\n })),\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n } else {\n process.stdout.write(`Pipeline: ${opts.strategy} (${steps.length} steps)\\n\\n`);\n process.stdout.write(` ${\"#\".padEnd(4)} ${\"Step\".padEnd(28)} ${\"Pure\".padEnd(6)} ${\"Removable\".padEnd(11)} Timeout\\n`);\n process.stdout.write(` ${\"-\".repeat(4)} ${\"-\".repeat(28)} ${\"-\".repeat(6)} ${\"-\".repeat(11)} ${\"-\".repeat(8)}\\n`);\n for (let i = 0; i < steps.length; i++) {\n const pure = pureSteps.has(steps[i]) ? \"yes\" : \"no\";\n const removable = nonRemovable.has(steps[i]) ? \"no\" : \"yes\";\n process.stdout.write(` ${String(i + 1).padEnd(4)} ${steps[i].padEnd(28)} ${pure.padEnd(6)} ${removable.padEnd(11)} \\u2014\\n`);\n }\n }\n return;\n }\n\n // Use actual strategy object for detailed info\n const stepsInfo = strategyObj.steps.map((step) => ({\n name: step.name,\n pure: step.pure ?? false,\n removable: step.removable ?? true,\n timeout_ms: step.timeout_ms ?? null,\n }));\n\n if (fmt === \"json\" || !process.stdout.isTTY) {\n const payload = {\n strategy: opts.strategy,\n step_count: stepsInfo.length,\n steps: stepsInfo.map((s, i) => ({ index: i + 1, ...s })),\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n } else {\n process.stdout.write(`Pipeline: ${opts.strategy} (${stepsInfo.length} steps)\\n\\n`);\n process.stdout.write(` ${\"#\".padEnd(4)} ${\"Step\".padEnd(28)} ${\"Pure\".padEnd(6)} ${\"Removable\".padEnd(11)} Timeout\\n`);\n process.stdout.write(` ${\"-\".repeat(4)} ${\"-\".repeat(28)} ${\"-\".repeat(6)} ${\"-\".repeat(11)} ${\"-\".repeat(8)}\\n`);\n for (let i = 0; i < stepsInfo.length; i++) {\n const s = stepsInfo[i];\n const pure = s.pure ? \"yes\" : \"no\";\n const removable = s.removable ? \"yes\" : \"no\";\n const timeout = s.timeout_ms !== null ? `${s.timeout_ms}ms` : \"\\u2014\";\n process.stdout.write(` ${String(i + 1).padEnd(4)} ${s.name.padEnd(28)} ${pure.padEnd(6)} ${removable.padEnd(11)} ${timeout}\\n`);\n }\n }\n });\n cli.addCommand(pipelineCmd);\n}\n","/**\n * LazyModuleGroup — Dynamic command loading from Registry.\n *\n * Equivalent to the Python LazyModuleGroup. Dynamically discovers apcore\n * modules from the Registry and exposes them as Commander subcommands.\n *\n * Protocol spec: CLI command structure & lazy loading\n */\n\nimport { Command } from \"commander\";\nimport { buildModuleCommand } from \"./main.js\";\nimport { getDisplay } from \"./display-helpers.js\";\nimport { warn } from \"./logger.js\";\n\n// TODO: Import Registry and Executor from apcore-js once available\n// import type { Registry, Executor, ModuleDescriptor } from \"apcore-js\";\n\n// ---------------------------------------------------------------------------\n// Placeholder types until apcore-js types are available\n// ---------------------------------------------------------------------------\n\n/** Placeholder for apcore-js Registry. */\nexport interface Registry {\n listModules(): ModuleDescriptor[];\n getModule(moduleId: string): ModuleDescriptor | null;\n}\n\n/** Placeholder for apcore-js Executor. */\nexport interface Executor {\n execute(moduleId: string, input: Record<string, unknown>): Promise<unknown>;\n /** Validate inputs without executing. Returns a PreflightResult. */\n validate?(moduleId: string, input: Record<string, unknown>): Promise<PreflightResult>;\n /** Execute with pipeline trace. Returns [result, PipelineTrace]. */\n callWithTrace?(moduleId: string, input: Record<string, unknown>, options?: { strategy?: string }): Promise<[unknown, PipelineTrace]>;\n /** Stream execution — async iterator of chunks. */\n stream?(moduleId: string, input: Record<string, unknown>): AsyncIterable<unknown>;\n /** Call a module (synchronous-style, used by system commands). */\n call?(moduleId: string, input: Record<string, unknown>): Promise<unknown>;\n}\n\n/** Result of a preflight validation check. */\nexport interface PreflightCheck {\n check: string;\n passed: boolean;\n error?: unknown;\n warnings?: string[];\n}\n\n/** Result of executor.validate(). */\nexport interface PreflightResult {\n valid: boolean;\n requires_approval: boolean;\n checks: PreflightCheck[];\n}\n\n/** A single step in a pipeline trace. */\nexport interface PipelineTraceStep {\n name: string;\n duration_ms: number;\n skipped: boolean;\n skip_reason?: string;\n}\n\n/** Pipeline execution trace returned by callWithTrace(). */\nexport interface PipelineTrace {\n strategy_name: string;\n total_duration_ms: number;\n success: boolean;\n steps: PipelineTraceStep[];\n}\n\n/** Placeholder for apcore-js ModuleDescriptor. */\nexport interface ModuleDescriptor {\n id: string;\n name: string;\n description: string;\n tags?: string[];\n inputSchema?: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n requiresApproval?: boolean;\n annotations?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n/** Built-in command names that cannot be overridden by modules. */\nexport const BUILTIN_COMMANDS = [\n \"completion\",\n \"config\",\n \"describe\",\n \"describe-pipeline\",\n \"disable\",\n \"enable\",\n \"exec\",\n \"health\",\n \"init\",\n \"list\",\n \"man\",\n \"reload\",\n \"usage\",\n \"validate\",\n];\n\n// ---------------------------------------------------------------------------\n// LazyModuleGroup\n// ---------------------------------------------------------------------------\n\n/**\n * Dynamically loads apcore modules as Commander subcommands from Registry.\n */\nexport class LazyModuleGroup {\n protected readonly registry: Registry;\n readonly executor: Executor;\n protected readonly helpTextMaxLength: number;\n protected commandCache: Map<string, Command> = new Map();\n /** alias -> canonical module_id (populated lazily) */\n protected aliasMap: Map<string, string> = new Map();\n /** module_id -> descriptor cache (populated during alias map build) */\n protected descriptorCache: Map<string, ModuleDescriptor> = new Map();\n protected aliasMapBuilt = false;\n\n constructor(registry: Registry, executor: Executor, helpTextMaxLength = 1000) {\n this.registry = registry;\n this.executor = executor;\n this.helpTextMaxLength = helpTextMaxLength;\n }\n\n /**\n * Build alias->module_id map from display overlay metadata.\n */\n buildAliasMap(): void {\n if (this.aliasMapBuilt) {\n return;\n }\n try {\n for (const descriptor of this.registry.listModules()) {\n const moduleId = descriptor.id;\n this.descriptorCache.set(moduleId, descriptor);\n const display = getDisplay(descriptor);\n const cliDisplay = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const cliAlias = cliDisplay.alias as string | undefined;\n if (cliAlias && cliAlias !== moduleId) {\n this.aliasMap.set(cliAlias, moduleId);\n }\n }\n this.aliasMapBuilt = true;\n } catch {\n warn(\"Failed to build alias map from registry\");\n }\n }\n\n /**\n * List all available command names from the Registry.\n */\n listCommands(): string[] {\n this.buildAliasMap();\n // Reverse map: module_id -> cli alias (if any)\n const reverse = new Map<string, string>();\n for (const [alias, moduleId] of this.aliasMap) {\n reverse.set(moduleId, alias);\n }\n const moduleIds = this.registry.listModules().map((m) => m.id);\n const names = moduleIds.map((mid) => reverse.get(mid) ?? mid);\n return [...new Set(names)].sort();\n }\n\n /**\n * Get or lazily build a Commander Command for the given module.\n */\n getCommand(cmdName: string): Command | null {\n if (this.commandCache.has(cmdName)) {\n return this.commandCache.get(cmdName)!;\n }\n\n // Resolve alias -> canonical module_id\n this.buildAliasMap();\n const moduleId = this.aliasMap.get(cmdName) ?? cmdName;\n\n // Look up in descriptor cache or registry\n let moduleDef = this.descriptorCache.get(moduleId);\n if (!moduleDef) {\n moduleDef = this.registry.getModule(moduleId) ?? undefined;\n }\n if (!moduleDef) {\n return null;\n }\n\n const cmd = buildModuleCommand(moduleDef, this.executor, this.helpTextMaxLength, cmdName);\n this.commandCache.set(cmdName, cmd);\n return cmd;\n }\n}\n\n// ---------------------------------------------------------------------------\n// LazyGroup — A Commander Command group for a single namespace\n// ---------------------------------------------------------------------------\n\n/**\n * Command group for a single namespace — lazily builds subcommands.\n */\nexport class LazyGroup {\n private readonly members: Map<string, [string, ModuleDescriptor]>;\n private readonly _executor: Executor;\n private readonly _helpTextMaxLength: number;\n private readonly _cmdCache: Map<string, Command> = new Map();\n readonly command: Command;\n\n constructor(\n members: Map<string, [string, ModuleDescriptor]>,\n executor: Executor,\n name: string,\n helpTextMaxLength = 1000,\n ) {\n this.members = members;\n this._executor = executor;\n this._helpTextMaxLength = helpTextMaxLength;\n this.command = new Command(name).description(`${name} commands`);\n\n // Build and register all subcommands\n for (const [cmdName, [, descriptor]] of this.members) {\n const cmd = buildModuleCommand(\n descriptor,\n this._executor,\n this._helpTextMaxLength,\n cmdName,\n );\n this._cmdCache.set(cmdName, cmd);\n this.command.addCommand(cmd);\n }\n }\n\n listCommands(): string[] {\n return [...this.members.keys()].sort();\n }\n\n getCommand(cmdName: string): Command | null {\n if (this._cmdCache.has(cmdName)) {\n return this._cmdCache.get(cmdName)!;\n }\n const entry = this.members.get(cmdName);\n if (!entry) {\n return null;\n }\n const [, descriptor] = entry;\n const cmd = buildModuleCommand(\n descriptor,\n this._executor,\n this._helpTextMaxLength,\n cmdName,\n );\n this._cmdCache.set(cmdName, cmd);\n return cmd;\n }\n}\n\n// ---------------------------------------------------------------------------\n// GroupedModuleGroup\n// ---------------------------------------------------------------------------\n\n/**\n * Extended LazyModuleGroup that organises modules into named groups.\n *\n * Modules with dotted IDs (e.g., \"math.add\") are automatically grouped\n * by their namespace prefix. The display overlay can override grouping\n * via metadata.display.cli.group.\n */\nexport class GroupedModuleGroup extends LazyModuleGroup {\n /** groupName -> { cmdName -> [moduleId, descriptor] } */\n private groupMap: Map<string, Map<string, [string, ModuleDescriptor]>> = new Map();\n /** cmdName -> [moduleId, descriptor] for top-level (ungrouped) modules */\n private topLevelModules: Map<string, [string, ModuleDescriptor]> = new Map();\n /** Cached LazyGroup instances */\n private groupCache: Map<string, LazyGroup> = new Map();\n private groupMapBuilt = false;\n\n /**\n * Determine (groupName | null, commandName) for a module from its display overlay.\n *\n * @param groupDepth Number of dotted segments to consume as the group prefix.\n * Defaults to 1 (e.g., \"math.add\" → group=\"math\", cmd=\"add\").\n * Set to 2 for multi-level grouping (e.g., \"math.trig.sin\" →\n * group=\"math.trig\", cmd=\"sin\").\n */\n static resolveGroup(moduleId: string, descriptor: ModuleDescriptor, groupDepth = 1): [string | null, string] {\n if (!moduleId) {\n warn(\"Empty module_id encountered in resolveGroup\");\n return [null, \"\"];\n }\n\n const display = getDisplay(descriptor);\n const cliDisplay = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const explicitGroup = cliDisplay.group;\n\n // Explicit non-empty string group\n if (typeof explicitGroup === \"string\" && explicitGroup !== \"\") {\n return [explicitGroup, (cliDisplay.alias as string | undefined) ?? moduleId];\n }\n // Explicit empty string = opt-out (top-level)\n if (explicitGroup === \"\") {\n return [null, (cliDisplay.alias as string | undefined) ?? moduleId];\n }\n\n // Auto-extraction from alias or module_id with configurable depth\n const cliName = (cliDisplay.alias as string | undefined) ?? moduleId;\n if (cliName.includes(\".\")) {\n const parts = cliName.split(\".\");\n const depth = Math.max(1, Math.min(groupDepth, parts.length - 1));\n const group = parts.slice(0, depth).join(\".\");\n const cmd = parts.slice(depth).join(\".\");\n return [group, cmd];\n }\n return [null, cliName];\n }\n\n /**\n * Build the group map from registry modules.\n */\n buildGroupMap(): void {\n if (this.groupMapBuilt) {\n return;\n }\n try {\n this.buildAliasMap();\n for (const descriptor of this.registry.listModules()) {\n const moduleId = descriptor.id;\n const cached = this.descriptorCache.get(moduleId);\n if (!cached) {\n continue;\n }\n const [group, cmd] = GroupedModuleGroup.resolveGroup(moduleId, cached);\n if (group === null) {\n this.topLevelModules.set(cmd, [moduleId, cached]);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(group)) {\n warn(\n `Module '${moduleId}': group name '${group}' is not shell-safe — treating as top-level.`,\n );\n this.topLevelModules.set(cmd, [moduleId, cached]);\n } else {\n if (!this.groupMap.has(group)) {\n this.groupMap.set(group, new Map());\n }\n this.groupMap.get(group)!.set(cmd, [moduleId, cached]);\n }\n }\n // Warn on builtin collisions\n for (const groupName of this.groupMap.keys()) {\n if (BUILTIN_COMMANDS.includes(groupName)) {\n warn(\n `Group name '${groupName}' collides with a built-in command and will be ignored`,\n );\n }\n }\n this.groupMapBuilt = true;\n } catch {\n warn(\"Failed to build group map\");\n }\n }\n\n /**\n * List all available command names: builtins + group names + top-level module names.\n */\n override listCommands(): string[] {\n this.buildGroupMap();\n const groupNames = [...this.groupMap.keys()].filter(\n (g) => !BUILTIN_COMMANDS.includes(g),\n );\n const topNames = [...this.topLevelModules.keys()];\n return [...new Set([...BUILTIN_COMMANDS, ...groupNames, ...topNames])].sort();\n }\n\n /**\n * Get a command by name: check builtins -> group cache -> group map -> top-level modules.\n */\n override getCommand(cmdName: string): Command | null {\n this.buildGroupMap();\n\n // Check group cache\n if (this.groupCache.has(cmdName)) {\n return this.groupCache.get(cmdName)!.command;\n }\n\n // Check if it's a group\n if (this.groupMap.has(cmdName)) {\n const lazyGrp = new LazyGroup(\n this.groupMap.get(cmdName)!,\n this.executor,\n cmdName,\n this.helpTextMaxLength,\n );\n this.groupCache.set(cmdName, lazyGrp);\n return lazyGrp.command;\n }\n\n // Check top-level modules\n if (this.topLevelModules.has(cmdName)) {\n if (this.commandCache.has(cmdName)) {\n return this.commandCache.get(cmdName)!;\n }\n const [, descriptor] = this.topLevelModules.get(cmdName)!;\n const cmd = buildModuleCommand(\n descriptor,\n this.executor,\n this.helpTextMaxLength,\n cmdName,\n );\n this.commandCache.set(cmdName, cmd);\n return cmd;\n }\n\n return null;\n }\n\n /** Expose groupMap for testing. */\n getGroupMap(): Map<string, Map<string, [string, ModuleDescriptor]>> {\n return this.groupMap;\n }\n\n /** Expose topLevelModules for testing. */\n getTopLevelModules(): Map<string, [string, ModuleDescriptor]> {\n return this.topLevelModules;\n }\n\n /** Expose groupMapBuilt for testing. */\n isGroupMapBuilt(): boolean {\n return this.groupMapBuilt;\n }\n}\n"],"mappings":"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","names":["error","fs","path","crypto","os","hostname","fs","os","path","readFileSync","fileURLToPath","path","Command","Option","resolve","sep","path","fs","readFileSync","fileURLToPath","path","__dirname","docsUrl","Command","Option","Command","Option","Command","Command","Command","Option","Command","Option","Command","Command","__dirname","fileURLToPath","readFileSync","Command","error","Option","durationMs","getAuditLogger","auditLogger","result","Sandbox","resolve"]}