apcore-cli 0.6.0 → 0.7.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/CHANGELOG.md +64 -0
- package/LICENSE +13 -17
- package/README.md +134 -22
- package/dist/bin/apcore-cli.js +3360 -516
- package/dist/bin/apcore-cli.js.map +1 -1
- package/dist/index.d.ts +390 -134
- package/dist/index.js +1893 -1027
- package/dist/index.js.map +1 -1
- package/package.json +16 -10
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/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"]}
|
|
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/logger.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/init-cmd.ts","../src/display-helpers.ts","../src/config.ts","../src/shell.ts","../src/discovery.ts","../src/system-cmd.ts","../src/strategy.ts","../src/builtin-group.ts","../src/exposure.ts","../src/canonical-help.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 DEPENDENCY_NOT_FOUND: 44,\n DEPENDENCY_VERSION_MISMATCH: 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 DEPENDENCY_NOT_FOUND: EXIT_CODES.DEPENDENCY_NOT_FOUND,\n DEPENDENCY_VERSION_MISMATCH: EXIT_CODES.DEPENDENCY_VERSION_MISMATCH,\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_ENV_MAP_CONFLICT: EXIT_CODES.CONFIG_ENV_MAP_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 * 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 * 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\";\nimport { warn as logWarn } from \"../logger.js\";\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\n/**\n * Produce a stable, key-order-independent JSON serialization at every nesting\n * level. Used by AuditLogger.hashInput to guarantee that logically-equal\n * inputs hash identically (modulo salt) regardless of source key ordering,\n * and that inputs differing only in nested fields produce distinct canonical\n * bytes.\n *\n * Exported for testability — do not rely on this as a general-purpose helper;\n * only AuditLogger's hash path is a supported caller.\n */\nexport function canonicalizeForHash(value: unknown): unknown {\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) return value.map(canonicalizeForHash);\n const src = value as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(src).sort()) {\n sorted[key] = canonicalizeForHash(src[key]);\n }\n return sorted;\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 private writeFailureWarned = false;\n\n constructor(path?: string) {\n this.logPath = path ?? AuditLogger.DEFAULT_PATH;\n this.ensureDirectory();\n }\n\n private ensureDirectory(): void {\n const dir = path.dirname(this.logPath);\n try {\n fs.mkdirSync(dir, { recursive: true });\n // Restrict to owner-only on Unix so audit log is not enumerable by\n // other local UIDs on shared systems (mirrors Rust's 0o700 hardening).\n try { fs.chmodSync(dir, 0o700); } catch { /* best-effort */ }\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 // Restrict to owner read/write (mirrors Rust's 0o600 hardening).\n try { fs.chmodSync(this.logPath, 0o600); } catch { /* best-effort */ }\n } catch (err) {\n if (!this.writeFailureWarned) {\n this.writeFailureWarned = true;\n logWarn(`Could not write audit log: ${err}`);\n }\n }\n }\n\n private hashInput(inputData: Record<string, unknown>): string {\n const salt = crypto.randomBytes(16);\n const payload = JSON.stringify(canonicalizeForHash(inputData));\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\";\nimport { warn as logWarn } from \"../logger.js\";\n\n// PBKDF2-HMAC-SHA256 iteration count — follows OWASP 2024+ minimum for SHA-256.\nconst PBKDF2_ITERATIONS = 600_000;\n\n// Static salt used only for backward-compatible reads of legacy enc: (v1) values.\nconst V1_STATIC_SALT = Buffer.from(\"apcore-cli-config-v1\");\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 * Test-only seam: inject a stand-in `keytar` module so unit tests can\n * exercise reachable-but-failing keyring paths (D10-003 regression\n * coverage). Pass `null` to clear and fall back to real-keytar discovery\n * on the next call. Production code MUST NOT call this.\n */\nexport function _setKeytarForTesting(mod: unknown): void { // eslint-disable-line @typescript-eslint/no-explicit-any\n keytarModule = mod;\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 key derived from\n * APCORE_CLI_CONFIG_PASSPHRASE when set, or from hostname+username\n * (obfuscation-only) as a last resort.\n *\n * Wire format v2: enc:v2:<base64(salt(16)+nonce(12)+tag(16)+ciphertext)>\n * Legacy format: enc:<base64(nonce(12)+tag(16)+ciphertext)> (read-only)\n */\nexport class ConfigEncryptor {\n static readonly SERVICE_NAME = \"apcore-cli\";\n // One-shot flag so the \"obfuscation only\" warning fires exactly once\n // per process instead of once per encrypt/decrypt call.\n private static weakFallbackWarned = false;\n\n /**\n * Encrypt and store a configuration value.\n *\n * Cross-SDK contract (D10-003, 2026-04-26): when the OS keyring is\n * detected as available but `setPassword` then throws (locked keyring,\n * transient backend failure, permission revoked, etc.), the error is\n * propagated wrapped in a `ConfigDecryptionError`. Previously TS\n * caught the exception and silently fell through to AES file encryption\n * — a quiet downgrade that surprised users who expected a hard failure.\n * Python lets the keyring exception propagate raw; Rust returns\n * `ConfigDecryptionError::KeyringError`. The fall-through to AES is\n * still reached when `getKeytar()` returns `null` (keyring\n * genuinely unavailable on this platform / install).\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 (err) {\n // Reachable but rejected the write — surface the error rather\n // than downgrading to file encryption. Use the existing\n // ConfigDecryptionError class so callers handling either store\n // or retrieve failures can keep a single catch.\n const detail = err instanceof Error ? err.message : String(err);\n throw new ConfigDecryptionError(\n `Failed to store '${key}' in OS keyring: ${detail}. ` +\n `Unset APCORE_CLI_CONFIG_PASSPHRASE-aware backends or unlock the keyring before retrying.`,\n );\n }\n }\n logWarn(\"OS keyring unavailable. Using file-based encryption.\");\n const ciphertext = this.aesEncrypt(value);\n return `enc:v2:${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:v2:\")) {\n const data = Buffer.from(configValue.slice(\"enc:v2:\".length), \"base64\");\n try {\n return this.aesDecrypt(data);\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 if (configValue.startsWith(\"enc:\")) {\n const data = Buffer.from(configValue.slice(\"enc:\".length), \"base64\");\n try {\n return this.aesDecryptV1(data);\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 // Derive an AES-256 key with a provided salt (v2 format).\n //\n // Order of preference:\n // 1. APCORE_CLI_CONFIG_PASSPHRASE env var — a real secret supplied by\n // the user; produces a key an attacker with filesystem read cannot\n // reconstruct without also knowing the passphrase.\n // 2. hostname + username — obfuscation-only derivation for backward\n // compatibility. Emits a loud stderr warning on first use so\n // operators know the stored value is NOT protected against a\n // filesystem-read attacker.\n private deriveKey(salt: Buffer): Buffer {\n const passphrase = process.env.APCORE_CLI_CONFIG_PASSPHRASE;\n if (passphrase && passphrase.length > 0) {\n return crypto.pbkdf2Sync(passphrase, salt, PBKDF2_ITERATIONS, 32, \"sha256\");\n }\n if (!ConfigEncryptor.weakFallbackWarned) {\n logWarn(\n \"APCORE_CLI_CONFIG_PASSPHRASE is not set. The `enc:v2:` fallback uses a key \" +\n \"derived from hostname+username (non-secret inputs) and is OBFUSCATION \" +\n \"ONLY — an attacker with filesystem read access can reconstruct the key. \" +\n \"Set APCORE_CLI_CONFIG_PASSPHRASE or ensure the OS keyring is available \" +\n \"for real encryption.\",\n );\n ConfigEncryptor.weakFallbackWarned = true;\n }\n const hostname = os.hostname();\n const username = process.env.USER ?? process.env.USERNAME ?? \"unknown\";\n const material = `${hostname}:${username}`;\n return crypto.pbkdf2Sync(material, salt, PBKDF2_ITERATIONS, 32, \"sha256\");\n }\n\n private aesEncrypt(plaintext: string): Buffer {\n const salt = crypto.randomBytes(16);\n const key = this.deriveKey(salt);\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 v2: salt(16) + nonce(12) + tag(16) + ciphertext\n return Buffer.concat([salt, nonce, tag, ct]);\n }\n\n private aesDecrypt(data: Buffer): string {\n const salt = data.subarray(0, 16);\n const nonce = data.subarray(16, 28);\n const tag = data.subarray(28, 44);\n const ct = data.subarray(44);\n const key = this.deriveKey(salt);\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(ct), decipher.final()]).toString(\"utf-8\");\n }\n\n /** Decrypt legacy v1-format values: nonce(12)+tag(16)+ct, static salt. */\n private aesDecryptV1(data: Buffer): string {\n const nonce = data.subarray(0, 12);\n const tag = data.subarray(12, 28);\n const ct = data.subarray(28);\n const hostname = os.hostname();\n const username = process.env.USER ?? process.env.USERNAME ?? \"unknown\";\n const passphrase = process.env.APCORE_CLI_CONFIG_PASSPHRASE;\n const materials: string[] = passphrase\n ? [passphrase, `${hostname}:${username}`]\n : [`${hostname}:${username}`];\n\n for (const material of materials) {\n for (const iterations of [600_000, 100_000]) {\n try {\n const key = crypto.pbkdf2Sync(material, V1_STATIC_SALT, iterations, 32, \"sha256\");\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(ct), decipher.final()]).toString(\"utf-8\");\n } catch {\n // try next combination\n }\n }\n }\n throw new Error(\"v1 decryption failed with all material+iteration combinations\");\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, ConfigDecryptionError } 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 try {\n return await this.encryptor.retrieve(strResult, \"auth.api_key\");\n } catch (err) {\n if (err instanceof ConfigDecryptionError) {\n throw new AuthenticationError(\n \"Failed to decrypt stored API key. \" +\n \"Re-configure with 'apcore-cli config set auth.api_key'.\",\n );\n }\n throw err;\n }\n }\n return strResult;\n }\n\n /**\n * Add authentication headers to an outgoing request.\n *\n * Cross-SDK contract (D10-002, 2026-04-26): the input `headers` object\n * is mutated **in place** and the same reference is returned. Callers\n * that share the headers reference (the documented pattern in\n * apcore-cli/docs/features/security.md §AuthProvider) can read\n * `headers.Authorization` after the call without re-binding the\n * return value. Python and Rust both mutate-and-return; TS previously\n * spread into a new object, which silently broke shared-reference\n * callers.\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 // Reject keys with CR/LF — a stray clipboard newline produces a confusing\n // HTTP error; failing early with a clear message is safer.\n if (/[\\r\\n]/.test(key)) {\n throw new AuthenticationError(\n \"Malformed API key: contains invalid characters (CR/LF). \" +\n \"Re-configure with 'apcore-cli config set auth.api_key'.\",\n );\n }\n headers.Authorization = `Bearer ${key.trim()}`;\n return headers;\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 (tech-design §8.6.4).\n *\n * Uses a re-exec model: spawns `node <this-binary> --internal-sandbox-runner\n * <module_id>` with a stripped environment and isolated HOME/TMPDIR.\n * The child reads JSON from stdin, runs the module via a fresh\n * Registry+Executor, and writes JSON to stdout.\n */\n\nimport type { Executor } from \"../cli.js\";\nimport { ModuleExecutionError } from \"../errors.js\";\n\n// Environment forwarding strategy: allow PATH, LANG, LC_ALL + all APCORE_*\n// except APCORE_AUTH_* (credentials must not cross the trust boundary).\nconst SANDBOX_ALLOW_KEYS = [\"PATH\", \"LANG\", \"LC_ALL\"];\nconst SANDBOX_ALLOW_PREFIX = \"APCORE_\";\nconst SANDBOX_DENY_PREFIX = \"APCORE_AUTH_\";\n// Explicit deny-list for known credential keys (defense-in-depth mirroring Rust).\nconst SANDBOX_DENY_KEYS: readonly string[] = [\"APCORE_AUTH_API_KEY\"];\n\nconst SANDBOX_OUTPUT_SIZE_LIMIT = 64 * 1024 * 1024; // 64 MiB\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 (the default), delegates directly to the Executor.\n * When enabled, spawns a restricted child process via re-exec with\n * `--internal-sandbox-runner <module_id>`.\n */\nexport class Sandbox {\n private readonly enabled: boolean;\n private readonly timeoutSeconds: number;\n\n constructor(enabled = false, timeoutSeconds = 300) {\n this.enabled = enabled;\n this.timeoutSeconds = timeoutSeconds;\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 async _sandboxedExecute(\n moduleId: string,\n inputData: Record<string, unknown>,\n ): Promise<unknown> {\n const { spawn } = await import(\"node:child_process\");\n const { tmpdir } = await import(\"node:os\");\n const { join } = await import(\"node:path\");\n const { mkdtempSync, rmSync } = await import(\"node:fs\");\n\n const tmpDir = mkdtempSync(join(tmpdir(), \"apcore_sandbox_\"));\n\n const env = buildSandboxEnv(tmpDir);\n const binaryPath = process.argv[1];\n const child = spawn(process.execPath, [binaryPath, \"--internal-sandbox-runner\", moduleId], {\n env,\n cwd: tmpDir,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let totalBytes = 0;\n let sizeExceeded = false;\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n totalBytes += chunk.length;\n if (totalBytes > SANDBOX_OUTPUT_SIZE_LIMIT) {\n sizeExceeded = true;\n child.kill(\"SIGKILL\");\n return;\n }\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n child.stdin.write(JSON.stringify(inputData));\n child.stdin.end();\n\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n reject(\n new ModuleExecutionError(\n `Sandbox module '${moduleId}' timed out after ${this.timeoutSeconds}s.`,\n ),\n );\n }, this.timeoutSeconds * 1000);\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n try { rmSync(tmpDir, { recursive: true, force: true }); } catch { /* best-effort */ }\n\n if (sizeExceeded) {\n reject(new ModuleExecutionError(`Sandbox module '${moduleId}' output exceeded 64MiB limit.`));\n return;\n }\n if (code !== 0) {\n reject(new ModuleExecutionError(\n `Sandbox module '${moduleId}' exited with code ${code}.${stderr ? ` stderr: ${stderr}` : \"\"}`,\n ));\n return;\n }\n try {\n resolve(JSON.parse(stdout));\n } catch {\n reject(new ModuleExecutionError(\n `Sandbox module '${moduleId}' returned non-JSON output: ${stdout.slice(0, 200)}`,\n ));\n }\n });\n\n child.on(\"error\", (err) => {\n clearTimeout(timer);\n reject(new ModuleExecutionError(`Failed to spawn sandbox process: ${err.message}`));\n });\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Sandbox runner (invoked as a child process via --internal-sandbox-runner)\n// ---------------------------------------------------------------------------\n\n/**\n * Entry point for the sandbox child process.\n * Called when `--internal-sandbox-runner <module_id>` appears in argv.\n * Reads JSON from stdin, runs the module, writes JSON to stdout.\n */\nexport async function runSandboxRunner(moduleId: string): Promise<void> {\n const extensionsRoot = process.env.APCORE_EXTENSIONS_ROOT ?? \"./extensions\";\n // Dynamic import avoids circular deps and keeps the sandbox runner\n // isolated from the host CLI initialization code.\n const apcore = await import(\"apcore-js\").catch(() => {\n process.stderr.write(\n \"sandbox runner: apcore-js is not available in the sandboxed environment.\\n\",\n );\n process.exit(1);\n });\n if (!apcore) return;\n\n let inputJson = \"\";\n for await (const chunk of process.stdin) {\n inputJson += chunk.toString();\n }\n\n let inputData: Record<string, unknown>;\n try {\n inputData = JSON.parse(inputJson);\n } catch {\n process.stderr.write(\"sandbox runner: failed to parse stdin as JSON.\\n\");\n process.exit(1);\n return;\n }\n\n const registry = new apcore.Registry({ extensionsDir: extensionsRoot });\n await registry.discover();\n const executor = new apcore.Executor({ registry });\n try {\n const result = await executor.call(moduleId, inputData);\n process.stdout.write(JSON.stringify(result));\n process.exit(0);\n } catch (err: unknown) {\n process.stderr.write(`sandbox runner error: ${err}\\n`);\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildSandboxEnv(tmpDir: string): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n for (const key of SANDBOX_ALLOW_KEYS) {\n if (process.env[key]) env[key] = process.env[key];\n }\n for (const [key, val] of Object.entries(process.env)) {\n if (\n key.startsWith(SANDBOX_ALLOW_PREFIX) &&\n !key.startsWith(SANDBOX_DENY_PREFIX) &&\n !(SANDBOX_DENY_KEYS as readonly string[]).includes(key)\n ) {\n env[key] = val;\n }\n }\n env.HOME = tmpDir;\n env.TMPDIR = tmpDir;\n return env;\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 user-facing public surface of the apcore CLI package.\n * Internal helpers are intentionally NOT re-exported here — import them directly\n * from their source modules (e.g. `import { mapType } from \"apcore-cli/schema-parser\"`).\n */\n\n// Core CLI entry points\n//\n// D9-002 (audit, 2026-04-26): the raw mutable `verboseHelp` and `docsUrl`\n// bindings were re-exported but had zero external readers across src/, tests/,\n// and examples/ — only the setter pair `setVerboseHelp` / `setDocsUrl` is used.\n// Raw `let` bindings are also unstable as a public surface (live binding\n// behaviour depends on the importer's bundler). Dropped from the re-export\n// list. Add `getVerboseHelp` / `getDocsUrl` getters in main.ts if read access\n// is later needed.\nexport { createCli, main, buildModuleCommand, validateModuleId, collectInput, reconvertEnumValues, applyToolkitIntegration, setVerboseHelp, setDocsUrl, emitErrorJson, emitErrorTty } from \"./main.js\";\nexport type { OptionConfig, CreateCliOptions, APCore } from \"./main.js\";\n\n// Command grouping (GroupedModuleGroup is the default click.Group; LazyModuleGroup\n// is the base class, available for downstream consumers that need to subclass it).\nexport { LazyModuleGroup, GroupedModuleGroup, LazyGroup } from \"./cli.js\";\nexport type { Registry, Executor, ModuleDescriptor, PreflightResult, PreflightCheck, PipelineTrace, PipelineTraceStep, StrategyInfo, StrategyStep } from \"./cli.js\";\n\n// Built-in apcli group (FE-13)\nexport { ApcliGroup, RESERVED_GROUP_NAMES } from \"./builtin-group.js\";\nexport type { ApcliConfig, ApcliMode } from \"./builtin-group.js\";\n\n// Approval handler (FE-11)\nexport { CliApprovalHandler, checkApproval } from \"./approval.js\";\n\n// Configuration\nexport { ConfigResolver, DEFAULTS, registerConfigNamespace } from \"./config.js\";\n\n// Exposure filtering (FE-12)\nexport { ExposureFilter } from \"./exposure.js\";\n\n// Discovery (per-subcommand registrars — FE-13 split)\nexport {\n registerListCommand,\n registerDescribeCommand,\n registerExecCommand,\n registerValidateCommand,\n} from \"./discovery.js\";\n\n// Output formatting (top-level formatter only — per-type helpers are internal)\nexport { formatExecResult } from \"./output.js\";\n\n// Schema handling\nexport { resolveRefs } from \"./ref-resolver.js\";\nexport { schemaToCliOptions } from \"./schema-parser.js\";\n\n// Shell integration (FE-13 split)\nexport { registerCompletionCommand, configureManHelp } from \"./shell.js\";\n\n// System commands (FE-11 F2, FE-13 split)\nexport {\n registerHealthCommand,\n registerUsageCommand,\n registerEnableCommand,\n registerDisableCommand,\n registerReloadCommand,\n registerConfigCommand,\n} from \"./system-cmd.js\";\n\n// Strategy / pipeline commands (FE-11 F8)\nexport { registerPipelineCommand } from \"./strategy.js\";\n\n// Init command (FE-10)\nexport { registerInitCommand } from \"./init-cmd.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 — control functions only (per-level helpers are internal to logger module)\nexport { setLogLevel, getLogLevel } 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, warn as logWarn } from \"./logger.js\";\nimport { registerInitCommand } from \"./init-cmd.js\";\nimport { getDisplay } from \"./display-helpers.js\";\nimport { ConfigResolver, registerConfigNamespace } from \"./config.js\";\nimport { CliApprovalHandler } from \"./approval.js\";\nimport { configureManHelp, registerCompletionCommand } from \"./shell.js\";\nimport {\n registerDescribeCommand,\n registerExecCommand,\n registerListCommand,\n registerValidateCommand,\n} from \"./discovery.js\";\nimport {\n registerConfigCommand,\n registerDisableCommand,\n registerEnableCommand,\n registerHealthCommand,\n registerReloadCommand,\n registerUsageCommand,\n} from \"./system-cmd.js\";\nimport { registerPipelineCommand } from \"./strategy.js\";\nimport { ApcliGroup, RESERVED_GROUP_NAMES } from \"./builtin-group.js\";\nimport type { ApcliConfig } from \"./builtin-group.js\";\nimport { ExposureFilter } from \"./exposure.js\";\nimport { AuditLogger, setAuditLogger } from \"./security/audit.js\";\nimport type { Executor, ModuleDescriptor, Registry } from \"./cli.js\";\nimport { canonicalFormatHelp } from \"./canonical-help.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\n/**\n * Resolve a positive-integer option: CLI flag > env var > default.\n * Invalid env values (non-integer, zero, negative) are ignored with a warning\n * so users aren't silently downgraded to the default.\n */\nexport function resolveIntOption(\n cliValue: number | undefined,\n envValue: string | undefined,\n defaultValue: number,\n): number {\n if (cliValue !== undefined && Number.isFinite(cliValue) && cliValue > 0) {\n return cliValue;\n }\n if (envValue !== undefined && envValue !== \"\") {\n const parsed = parseInt(envValue, 10);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n process.stderr.write(\n `Warning: invalid integer env value '${envValue}'; using default ${defaultValue}.\\n`,\n );\n }\n return defaultValue;\n}\n\n/**\n * Resolve a string option: CLI flag > env var > undefined.\n * Empty strings are treated as absent.\n */\nexport function resolveStringOption(\n cliValue: unknown,\n envValue: string | undefined,\n): string | undefined {\n if (typeof cliValue === \"string\" && cliValue !== \"\") {\n return cliValue;\n }\n if (envValue !== undefined && envValue !== \"\") {\n return envValue;\n }\n return undefined;\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// 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/**\n * APCore unified client facade (apcore-js >= 0.18.0).\n * Exposes registry and executor as top-level properties.\n */\nexport interface APCore {\n registry: Registry;\n executor: Executor;\n}\n\n/** Options for createCli. */\nexport interface CreateCliOptions {\n extensionsDir?: string;\n progName?: string;\n verbose?: boolean;\n /**\n * APCore unified client instance (apcore-js >= 0.18.0).\n * Mutually exclusive with registry/executor — providing app alongside\n * either of those will throw.\n */\n app?: APCore;\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 /** Exposure filter config or instance (FE-12). */\n expose?: Record<string, unknown> | import(\"./exposure.js\").ExposureFilter;\n /** Path to convention-based commands directory (apcore-toolkit ConventionScanner). */\n commandsDir?: string;\n /** Path to binding.yaml for display overlay (apcore-toolkit DisplayResolver). */\n bindingPath?: string;\n /**\n * Built-in apcli group configuration (FE-13).\n *\n * Accepts:\n * - `true` / `false` (shorthand for `{mode: \"all\"}` / `{mode: \"none\"}`)\n * - A config object (see {@link ApcliConfig})\n * - A pre-built {@link ApcliGroup} instance (Tier 1 override)\n *\n * When absent, Tier 3 (apcore.yaml `apcli:` block) is consulted, falling\n * back to auto-detect: standalone → visible, embedded → hidden.\n */\n apcli?: ApcliConfig | ApcliGroup;\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 let app: APCore | undefined;\n let expose: Record<string, unknown> | import(\"./exposure.js\").ExposureFilter | undefined;\n let apcliOption: ApcliConfig | ApcliGroup | undefined;\n if (typeof extensionsDirOrOpts === \"object\" && extensionsDirOrOpts !== null) {\n extensionsDir = extensionsDirOrOpts.extensionsDir;\n progName = extensionsDirOrOpts.progName ?? progName;\n verbose = extensionsDirOrOpts.verbose ?? verbose;\n app = extensionsDirOrOpts.app;\n registry = extensionsDirOrOpts.registry;\n executor = extensionsDirOrOpts.executor;\n extraCommands = extensionsDirOrOpts.extraCommands;\n expose = extensionsDirOrOpts.expose;\n apcliOption = extensionsDirOrOpts.apcli;\n } else {\n extensionsDir = extensionsDirOrOpts;\n }\n\n verboseHelp = verbose;\n // Register Config Bus namespace (apcore >= 0.15.0)\n registerConfigNamespace();\n\n // Initialize audit logger (parity with apcore-cli-python __main__.py).\n // Silently disabled if initialization fails (e.g., unwritable audit path).\n try {\n const auditLogger = new AuditLogger();\n setAuditLogger(auditLogger);\n } catch {\n // audit logging unavailable — non-fatal\n }\n\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 // Validate parameter combination: app is mutually exclusive with registry/executor.\n if (app && (registry || executor)) {\n process.stderr.write(\"Error: app is mutually exclusive with registry/executor\\n\");\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n // Extract registry/executor from APCore unified client when provided.\n if (app) {\n registry = app.registry;\n executor = app.executor;\n }\n\n // Validate parameter combination: executor without registry is invalid.\n if (executor && !registry) {\n process.stderr.write(\"Error: executor requires registry — pass both or neither\\n\");\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n // Wire CliApprovalHandler to the executor (FE-11 §3.5) so module calls that\n // set `requires_approval: true` route through the interactive CLI prompt\n // (or auto-approve when APCORE_CLI_AUTO_APPROVE=1). Parity with\n // ../apcore-cli-python/src/apcore_cli/factory.py:315-327 — previously the\n // TypeScript CliApprovalHandler class was exported but never plugged in,\n // so requires_approval modules were rejected by the built-in gate even\n // though the CLI had its own interactive handler ready to use.\n if (executor && typeof (executor as unknown as Record<string, unknown>).setApprovalHandler === \"function\") {\n try {\n const handler = new CliApprovalHandler(/*autoApprove*/ false);\n (executor as unknown as { setApprovalHandler: (h: unknown) => void }).setApprovalHandler(handler);\n } catch {\n // Non-fatal: handler wiring failed; built-in gate still applies.\n }\n }\n\n const registryInjected = registry !== undefined;\n\n const program = new Command(resolvedProgName)\n .exitOverride()\n .version(VERSION, \"-V, --version\", \"Print version\")\n .helpOption(\"-h, --help\", \"Print help\")\n .addHelpCommand(\"help [command]\", \"Print this message or the help of the given subcommand(s)\")\n .description(\"apcore CLI — execute apcore modules from the command line\")\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 program.configureHelp({ formatHelp: canonicalFormatHelp });\n\n // Discovery flags are standalone-only (FE-13 T-APCLI-27/28).\n if (!registryInjected) {\n program.option(\"--extensions-dir <path>\", \"Path to extensions directory\");\n program.option(\"--commands-dir <path>\", \"Path to convention-based commands directory\");\n program.option(\"--binding <path>\", \"Path to binding.yaml for display overlay\");\n }\n\n // Build ApcliGroup via 3-source dispatch (FE-13 §4.8):\n // 1) Pre-built ApcliGroup instance (pass-through)\n // 2) CliConfig boolean/object (Tier 1, fromCliConfig)\n // 3) Tier 3 yaml via ConfigResolver.resolveObject (fromYaml)\n let apcliCfg: ApcliGroup;\n if (apcliOption instanceof ApcliGroup) {\n apcliCfg = apcliOption;\n } else if (apcliOption !== undefined) {\n apcliCfg = ApcliGroup.fromCliConfig(apcliOption, { registryInjected });\n } else {\n let yamlVal: unknown = null;\n try {\n const resolver = new ConfigResolver();\n yamlVal = resolver.resolveObject(\"apcli\");\n } catch {\n yamlVal = null;\n }\n apcliCfg = ApcliGroup.fromYaml(yamlVal, { registryInjected });\n }\n\n // Construct the apcli sub-group. Hidden when visibility resolves to \"none\".\n // Use Commander v12's public CommandOptions.hidden rather than reaching into\n // the private _hidden field — this survives minor Commander bumps.\n const apcliGroup = program\n .command(\"apcli\", { hidden: !apcliCfg.isGroupVisible() })\n .description(\"apcore-cli built-in commands\");\n\n // Dispatch the 13-entry subcommand registrar table (FE-13 §4.9).\n if (registry) {\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 } 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 // Build exposure filter (FE-12) BEFORE the apcli dispatcher table so\n // registerListCommand can consult the filter for --exposure. fromConfig\n // throws on malformed shape (e.g. { mode: \"bogus\" }) — catch and exit with\n // INVALID_CLI_INPUT so the caller sees a friendly message and the documented\n // exit code, matching ApcliGroup._build's contract (review fix #1).\n let exposureFilter: ExposureFilter;\n try {\n if (expose instanceof ExposureFilter) {\n exposureFilter = expose;\n } else if (typeof expose === \"object\" && expose !== null) {\n exposureFilter = ExposureFilter.fromConfig({ expose });\n } else {\n exposureFilter = new ExposureFilter();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: invalid 'expose' option — ${msg}\\n`);\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n _registerApcliSubcommands(apcliGroup, apcliCfg, registry, executor, exposureFilter);\n\n // FE-13 §11.2: standalone-mode deprecation shims for the 13 former\n // root-level commands. No-op in embedded mode so branded CLIs never surface\n // apcore-cli deprecation warnings to their end users.\n _registerDeprecationShims(program, apcliGroup, registryInjected, resolvedProgName);\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 --help --man support (stays at root — spec §4.1).\n configureManHelp(program, resolvedProgName, VERSION);\n\n // Register extra commands (F11) — validate no name collisions with live\n // Commander tree (root + apcli group subcommands). FE-13 moved the old\n // per-command constant into a live-tree walk; collision detection now\n // reads the actual program shape. Reserved-name (`apcli`) and\n // live-collision cases are hard exit 2 (FE-13 §4.10 / §7 FR-13-09).\n if (extraCommands && extraCommands.length > 0) {\n for (const cmd of extraCommands) {\n const cmdName = cmd.name();\n if (RESERVED_GROUP_NAMES.has(cmdName)) {\n process.stderr.write(\n `Error: extraCommands name '${cmdName}' is reserved\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n const existing = program.commands.find((c) => c.name() === cmdName);\n if (existing) {\n // Deprecation shims are auto-registered in standalone mode and should\n // yield to user-supplied extraCommands with the same name — they're\n // transitional scaffolding, not a real collision. Non-shim collisions\n // are still hard-rejected.\n const isShim =\n (existing as unknown as { __isDeprecationShim?: boolean }).__isDeprecationShim === true;\n if (isShim) {\n logWarn(\n `extraCommands '${cmdName}' overrides the deprecation shim for the same name. ` +\n `The shim will be removed.`,\n );\n const cmds = program.commands as unknown as Command[];\n const idx = cmds.indexOf(existing);\n if (idx >= 0) cmds.splice(idx, 1);\n } else {\n process.stderr.write(\n `Error: extraCommands name '${cmdName}' collides with an existing command\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n }\n program.addCommand(cmd);\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// FE-13 apcli subcommand dispatcher (§4.9)\n// ---------------------------------------------------------------------------\n\n/**\n * Subcommand names that are registered regardless of the resolved visibility\n * mode's include/exclude filter. `exec` is the documented always-registered\n * escape hatch (spec §4.9) so that downstream callers can always invoke modules\n * by ID even when the apcli group is configured with a minimal surface.\n */\nconst _ALWAYS_REGISTERED: ReadonlySet<string> = new Set<string>([\"exec\"]);\n\ninterface _RegistrarEntry {\n name: string;\n requiresExecutor: boolean;\n register: (\n apcliGroup: Command,\n registry: Registry | undefined,\n executor: Executor | undefined,\n ) => void;\n}\n\n/**\n * Central dispatcher for the 13 canonical apcli subcommands. Called once per\n * createCli invocation after the apcli Commander group is built. Honors\n * {@link ApcliGroup.resolveVisibility} for include/exclude modes, and skips\n * entries whose `requiresExecutor: true` flag is not satisfied.\n */\nfunction _registerApcliSubcommands(\n apcliGroup: Command,\n apcliCfg: ApcliGroup,\n registry: Registry | undefined,\n executor: Executor | undefined,\n exposureFilter: ExposureFilter,\n): void {\n // Standalone-mode fallback registry. Previously returned an empty list +\n // null; that silently masked the \"no registry wired\" contract gap — users\n // saw empty `apcli list` output with no clue the CLI was unwired. The\n // erroring fallback below surfaces the gap with a clear message + exit code\n // whenever list/describe actions actually reach into registry methods.\n const emitUnwiredError = (): never => {\n process.stderr.write(\n \"Error: no apcore-js registry wired. In standalone mode, pass \" +\n \"--extensions-dir <path> to enable module discovery.\\n\",\n );\n process.exit(EXIT_CODES.CONFIG_INVALID);\n };\n const effectiveRegistry: Registry = registry ?? {\n listModules: () => emitUnwiredError(),\n getModule: () => emitUnwiredError(),\n };\n\n const TABLE: _RegistrarEntry[] = [\n { name: \"list\", requiresExecutor: false, register: (g) => registerListCommand(g, effectiveRegistry, exposureFilter) },\n { name: \"describe\", requiresExecutor: false, register: (g) => registerDescribeCommand(g, effectiveRegistry) },\n { name: \"exec\", requiresExecutor: true, register: (g, _r, ex) => registerExecCommand(g, effectiveRegistry, ex!) },\n { name: \"validate\", requiresExecutor: true, register: (g, _r, ex) => registerValidateCommand(g, effectiveRegistry, ex!) },\n { name: \"init\", requiresExecutor: false, register: (g) => registerInitCommand(g) },\n { name: \"health\", requiresExecutor: true, register: (g, _r, ex) => registerHealthCommand(g, ex!) },\n { name: \"usage\", requiresExecutor: true, register: (g, _r, ex) => registerUsageCommand(g, ex!) },\n { name: \"enable\", requiresExecutor: true, register: (g, _r, ex) => registerEnableCommand(g, ex!) },\n { name: \"disable\", requiresExecutor: true, register: (g, _r, ex) => registerDisableCommand(g, ex!) },\n { name: \"reload\", requiresExecutor: true, register: (g, _r, ex) => registerReloadCommand(g, ex!) },\n { name: \"config\", requiresExecutor: true, register: (g, _r, ex) => registerConfigCommand(g, ex!) },\n { name: \"completion\", requiresExecutor: false, register: (g) => registerCompletionCommand(g) },\n { name: \"describe-pipeline\", requiresExecutor: true, register: (g, _r, ex) => registerPipelineCommand(g, ex!) },\n ];\n\n const mode = apcliCfg.resolveVisibility();\n for (const entry of TABLE) {\n // Determine whether this entry would be registered BEFORE short-circuiting\n // on missing executor — otherwise _ALWAYS_REGISTERED never gets consulted\n // for executor-required entries (e.g. \"exec\"), which violates spec §4.9.\n let shouldRegister: boolean;\n if (mode === \"all\" || mode === \"none\") {\n // mode:\"none\" still registers all subcommands — the group itself is\n // hidden, but subcommands remain individually reachable (spec §4.6).\n shouldRegister = true;\n } else {\n shouldRegister =\n _ALWAYS_REGISTERED.has(entry.name) || apcliCfg.isSubcommandIncluded(entry.name);\n }\n if (!shouldRegister) continue;\n\n // Executor-required entry but no executor wired. Silent skip for ordinary\n // entries — loud WARN for _ALWAYS_REGISTERED entries since the spec §4.9\n // contract says they are always registered, and silently dropping them\n // would mask a legitimate wiring gap for the caller.\n if (entry.requiresExecutor && !executor) {\n if (_ALWAYS_REGISTERED.has(entry.name)) {\n logWarn(\n `apcli.${entry.name} is in _ALWAYS_REGISTERED but no executor is wired — ` +\n `subcommand unavailable. Pass executor to createCli() or avoid ${entry.name} invocations.`,\n );\n }\n continue;\n }\n\n entry.register(apcliGroup, registry, executor);\n }\n}\n\n// ---------------------------------------------------------------------------\n// FE-13 §11.2 deprecation shims (standalone-mode only)\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical list of root-level command names that were \"flat\" in pre-v0.7 and\n * moved under the `apcli` group in v0.7. A thin shim at the root forwards\n * invocations to the corresponding `apcli <name>` subcommand after printing a\n * deprecation warning. Removed in v0.8 per spec §11.3.\n */\nconst _DEPRECATED_ROOT_COMMANDS: readonly string[] = [\n \"list\",\n \"describe\",\n \"exec\",\n \"init\",\n \"validate\",\n \"health\",\n \"usage\",\n \"enable\",\n \"disable\",\n \"reload\",\n \"config\",\n \"completion\",\n \"describe-pipeline\",\n] as const;\n\n/**\n * Register thin root-level deprecation shims for the 13 former built-in\n * commands. Each shim writes the spec §11.2 warning to stderr then forwards\n * to the matching `apcli <name>` subcommand, preserving positional args +\n * options via a direct `parseAsync` on the apcli subcommand.\n *\n * No-op in embedded mode (`registryInjected === true`) so integrators' end\n * users never see apcore-cli deprecation warnings for commands they were\n * never meant to know about.\n */\nfunction _registerDeprecationShims(\n root: Command,\n apcliGroup: Command,\n registryInjected: boolean,\n cliName: string,\n): void {\n if (registryInjected) return;\n for (const name of _DEPRECATED_ROOT_COMMANDS) {\n const apcliSub = apcliGroup.commands.find((c) => c.name() === name);\n if (!apcliSub) continue; // subcommand not registered (e.g. executor-required without executor)\n if (root.commands.some((c) => c.name() === name)) continue; // collision guard\n\n const shim = root\n .command(name)\n .description(`[DEPRECATED] Use '${cliName} apcli ${name}' instead.`)\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .helpOption(false);\n // Tag the shim so extraCommands collision detection can tell a shim apart\n // from a user-registered command and drop the shim in favor of the user's\n // extraCommand (with a WARN) rather than hard-failing with \"collides\".\n (shim as unknown as Record<string, unknown>).__isDeprecationShim = true;\n shim.action(async function (this: Command) {\n process.stderr.write(\n `WARNING: '${name}' as a root-level command is deprecated. ` +\n `Use '${cliName} apcli ${name}' instead.\\n` +\n ` Will be removed in v0.8. ` +\n `See: https://aiperceivable.github.io/apcore-cli/features/builtin-group/#11-migration\\n`,\n );\n // Forward: reconstruct the tail from this shim's parsed args + the raw\n // passthrough args Commander stashes when allowUnknownOption is on.\n // This works for both real process.argv invocations and test-time\n // `parseAsync([...], { from: \"user\" })` calls.\n const tail = _collectShimForwardArgs(this);\n await apcliSub.parseAsync(tail, { from: \"user\" });\n });\n }\n}\n\n/**\n * Collect the argv tail to forward from a shim to its apcli counterpart.\n * Uses Commander's own `.args` (positional + unknown flags that were left\n * intact because the shim has `allowUnknownOption(true)`). Falls back to\n * slicing `process.argv` from the shim name onward when `.args` is empty —\n * this preserves nested sub-subcommand paths such as `config get foo` in\n * real invocations where the shell supplied full argv.\n */\nfunction _collectShimForwardArgs(shim: Command): string[] {\n const shimArgs = (shim.args ?? []).slice();\n if (shimArgs.length > 0) return shimArgs;\n const shimName = shim.name();\n const idx = process.argv.indexOf(shimName);\n if (idx < 0) return [];\n return process.argv.slice(idx + 1);\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 */\n/**\n * Module-level binding display overlay map: moduleId → resolved `display`\n * metadata (as produced by `DisplayResolver.resolve()`). Consulted by\n * `getDisplay()` when a `ModuleDescriptor`'s own `metadata.display` is absent.\n */\nconst bindingDisplayMap = new Map<string, Record<string, unknown>>();\n\n/**\n * Internal accessor for the binding display overlay map — used by\n * `display-helpers.ts#getDisplay` as a fallback when the descriptor itself\n * carries no resolved display metadata.\n */\nexport function lookupBindingDisplay(moduleId: string): Record<string, unknown> | undefined {\n return bindingDisplayMap.get(moduleId);\n}\n\n/**\n * Clear the binding display overlay map. Primarily for tests.\n */\nexport function clearBindingDisplayMap(): void {\n bindingDisplayMap.clear();\n}\n\nexport async function applyToolkitIntegration(\n commandsDir?: string,\n bindingPath?: string,\n): Promise<void> {\n if (!commandsDir && !bindingPath) {\n return;\n }\n\n let toolkit: Record<string, unknown>;\n try {\n // String indirection prevents bundlers from statically resolving the\n // optional peer dependency at build time.\n const toolkitModule = \"apcore-toolkit\";\n toolkit = await import(/* @vite-ignore */ toolkitModule) as Record<string, unknown>;\n } catch {\n logWarn(\"apcore-toolkit not installed — toolkit features unavailable\");\n return;\n }\n\n // ConventionScanner has no TypeScript equivalent (the Python adapter is\n // pydantic-specific and does not port cleanly). See the upstream\n // apcore-toolkit README for the tri-language parity note.\n if (commandsDir) {\n logWarn(\"Convention scanning not available in the TypeScript toolkit\");\n }\n\n if (bindingPath) {\n try {\n await loadBindingDisplayOverlay(toolkit, bindingPath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logWarn(`apcore-toolkit: failed to load binding '${bindingPath}': ${msg}`);\n }\n }\n}\n\n/**\n * Parse a `.binding.yaml` (or directory thereof) and populate the module-level\n * `bindingDisplayMap` with resolved display overlay entries. Uses the\n * apcore-toolkit `BindingLoader` + `DisplayResolver` pipeline so the overlay\n * produced here is identical to what apcore-toolkit's registry-writer would\n * emit at scan time.\n */\nasync function loadBindingDisplayOverlay(\n toolkit: Record<string, unknown>,\n bindingPath: string,\n): Promise<void> {\n const BindingLoaderCtor = toolkit.BindingLoader as\n | (new () => { load(path: string): unknown[] })\n | undefined;\n const DisplayResolverCtor = toolkit.DisplayResolver as\n | (new () => { resolve(mods: unknown[], opts?: { bindingPath?: string }): unknown[] })\n | undefined;\n\n if (!BindingLoaderCtor || !DisplayResolverCtor) {\n // apcore-toolkit < 0.5.0 (no BindingLoader) — silently skip the overlay.\n return;\n }\n\n const loader = new BindingLoaderCtor();\n const scanned = loader.load(bindingPath);\n const resolver = new DisplayResolverCtor();\n const resolved = resolver.resolve(scanned, { bindingPath });\n\n for (const mod of resolved) {\n if (!mod || typeof mod !== \"object\") continue;\n const entry = mod as { moduleId?: unknown; metadata?: unknown };\n const id = typeof entry.moduleId === \"string\" ? entry.moduleId : null;\n if (!id) continue;\n const meta = (entry.metadata as Record<string, unknown> | undefined) ?? {};\n const display = meta.display;\n if (display && typeof display === \"object\" && !Array.isArray(display)) {\n bindingDisplayMap.set(id, display as Record<string, unknown>);\n }\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 // 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 = resolveStringOption(options.strategy, process.env.APCORE_CLI_STRATEGY);\n const approvalTimeout = resolveIntOption(\n options.approvalTimeout as number | undefined,\n process.env.APCORE_CLI_APPROVAL_TIMEOUT,\n 60,\n );\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 const startTime = performance.now();\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(EXIT_CODES.MODULE_EXECUTE_ERROR);\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\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 // Print result\n const resolved = resolveFormat(outputFormat);\n if (resolved === \"json\" || !process.stdout.isTTY) {\n // Merge _trace into JSON output. JSON keys remain snake_case to\n // match the cross-language CLI output contract; runtime reads use\n // the camelCase shape returned by apcore-js PipelineTrace.\n const traceData = {\n strategy: trace.strategyName,\n total_duration_ms: trace.totalDurationMs,\n success: trace.success,\n steps: trace.steps.map((s) => ({\n name: s.name,\n duration_ms: s.durationMs,\n skipped: s.skipped,\n ...(s.skipped ? { skip_reason: s.skipReason ?? null } : {}),\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.strategyName}, ` +\n `${stepCount} steps, ${trace.totalDurationMs.toFixed(1)}ms)\\n`,\n );\n for (const s of trace.steps) {\n if (s.skipped) {\n const reason = s.skipReason ?? \"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.durationMs.toFixed(1) + \"ms\").padStart(8)}\\n`);\n }\n }\n }\n // Audit log AFTER format (canonical ordering: format \\u2192 audit on success)\n const { getAuditLogger: getAL2 } = await import(\"./security/audit.js\");\n const al2 = getAL2();\n if (al2) {\n al2.logExecution(moduleId, merged, \"success\", 0, durationMs);\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. Format and print result first (canonical order: format → audit)\n formatExecResult(result, outputFormat, outputFields);\n\n // 6. Audit log (success) — called AFTER format so formatter exceptions\n // suppress the success entry (matches Python canonical ordering).\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 } catch (err: unknown) {\n // Enhanced error output (F3)\n const exitCode = exitCodeForError(err);\n const durationMs = Math.round(performance.now() - startTime);\n\n // Audit log (error) with real elapsed duration_ms\n try {\n const { getAuditLogger } = await import(\"./security/audit.js\");\n const auditLogger = getAuditLogger();\n if (auditLogger) {\n auditLogger.logExecution(moduleId, merged, \"error\", exitCode, durationMs);\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 192 chars.\n *\n * Length limit tracks PROTOCOL_SPEC §2.7 EBNF constraint #1 — bumped from\n * 128 to 192 in spec 1.6.0-draft to accommodate Java/.NET deep-namespace\n * FQN-derived IDs. Filesystem-safe (192 + \".binding.yaml\".length = 205 < 255).\n */\nexport function validateModuleId(moduleId: string): void {\n if (moduleId.length > 192) {\n process.stderr.write(\n `Error: Invalid module ID format: '${moduleId}'. Maximum length is 192 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 let raw: string;\n let source: string;\n if (stdinFlag === \"-\") {\n raw = await readStdin();\n source = \"STDIN\";\n } else {\n // File-path source (help text: \"JSON input file or '-' for stdin\")\n source = `file '${stdinFlag}'`;\n try {\n raw = readFileSync(stdinFlag, \"utf-8\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: Could not read input ${source}: ${msg}\\n`);\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n }\n\n const rawSize = Buffer.byteLength(raw, \"utf-8\");\n if (rawSize > 10_485_760 && !largeInput) {\n process.stderr.write(\n `Error: ${source} 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 parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n process.stderr.write(`Error: ${source} does not contain valid JSON.\\n`);\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n process.stderr.write(\n `Error: ${source} JSON must be an object, got ${Array.isArray(parsed) ? \"array\" : typeof parsed}.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n // CLI flags override stdin/file for duplicate keys\n return { ...(parsed as Record<string, unknown>), ...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 // Seed parent node's own properties/required BEFORE merging branches,\n // so sibling fields are not silently dropped when a parent mixes\n // top-level `properties` with `allOf` branches.\n if (typeof obj.properties === \"object\" && obj.properties !== null) {\n Object.assign(merged.properties as Record<string, unknown>, obj.properties);\n }\n if (Array.isArray(obj.required)) {\n (merged.required as string[]).push(...(obj.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([\n \"input\", \"yes\", \"large_input\", \"format\", \"fields\", \"sandbox\",\n \"verbose\", \"dry_run\", \"trace\", \"stream\", \"strategy\",\n \"approval_timeout\", \"approval_token\",\n]);\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 // Reserved name check (must precede collision check to match Python/Rust)\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 // 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 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 // Cross-SDK parity (D11-005): Rust schema_parser.rs:272 also tracks\n // the auto-generated `--no-<flag>` name in the collision map so a\n // schema pairing a boolean ``force`` with a non-boolean ``no_force``\n // is rejected at parse time. Without this, the second property\n // silently shadows the negation flag.\n const noFlag = `--no-${flagBase}`;\n if (noFlag in flagNames) {\n process.stderr.write(\n `Error: Flag name collision: boolean property '${propName}' auto-generates '${noFlag}' which is already used by property '${flagNames[noFlag]}'.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n flagNames[noFlag] = propName;\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 { ApprovalDeniedError, ApprovalTimeoutError } 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 * Read APCORE_CLI_APPROVAL_TIMEOUT env var (positive integer seconds).\n * Returns undefined on absent/empty/invalid values.\n */\nfunction readTimeoutFromEnv(): number | undefined {\n const raw = process.env.APCORE_CLI_APPROVAL_TIMEOUT;\n if (raw === undefined || raw === \"\") return undefined;\n const parsed = parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\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?: number) {\n this.autoApprove = autoApprove;\n const resolved = timeout ?? readTimeoutFromEnv() ?? 60;\n this.timeout = Math.max(1, Math.min(resolved, 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 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 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 * Throws ApprovalDeniedError or ApprovalTimeoutError on denial/timeout so the\n * caller (buildModuleCommand action) can run audit flush and tear-down before\n * the process exits via the shared error path.\n */\nexport async function checkApproval(\n moduleDef: ModuleDescriptor,\n autoApprove: boolean,\n timeout?: number,\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 — throw so caller can audit-flush before exit\n if (!process.stdin.isTTY) {\n throw new ApprovalDeniedError(\n `Module '${moduleId}' requires approval but no interactive terminal is available. ` +\n \"Use --yes or set APCORE_CLI_AUTO_APPROVE=1 to bypass.\",\n );\n }\n\n // TTY prompt — throws on deny/timeout\n const effectiveTimeout = timeout ?? readTimeoutFromEnv() ?? 60;\n await promptWithTimeout(moduleDef, effectiveTimeout);\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 throw new ApprovalDeniedError(\"Approval denied\");\n } catch (err) {\n if (timer) clearTimeout(timer);\n // ApprovalTimeoutError and ApprovalDeniedError bubble up so the caller\n // (buildModuleCommand action) can run AuditLogger flush / tear-down\n // before the process-level error path exits via exitCodeForError.\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 yaml from \"js-yaml\";\nimport { EXIT_CODES } from \"./errors.js\";\nimport type { ModuleDescriptor, PreflightResult } from \"./cli.js\";\n\n/**\n * Stringify a CSV cell value: scalars via String(), nested objects/arrays via\n * JSON.stringify so composite data survives a round-trip instead of rendering\n * as '[object Object]'.\n */\nfunction csvCellString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\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 exposureFilter?: { isExposed(moduleId: string): boolean },\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 if (showDeps) headers.push(\"Deps\");\n if (exposureFilter) headers.push(\"Exposure\");\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 if (exposureFilter) {\n base.push(exposureFilter.isExposed(m.id ?? \"\") ? \"\\u2713\" : \"\\u2014\");\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 if (exposureFilter) {\n entry.exposed = exposureFilter.isExposed(m.id ?? \"\");\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(csvCellString(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(csvCellString(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 // Use js-yaml to produce spec-conformant output for values containing\n // special YAML characters (':', leading '-', '@', '#', CR/LF, etc.).\n process.stdout.write(yaml.dump(effective_result, { lineWidth: -1 }));\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\") || value.includes(\"\\r\")) {\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 // JSON output key stays snake_case for cross-language CLI contract;\n // runtime read uses camelCase to match apcore-js PreflightResult.\n requires_approval: result.requiresApproval,\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 // Map preflight-check names (apcore-js PROTOCOL_SPEC) to CLI exit codes.\n // Symbolic references so renumbering in errors.ts EXIT_CODES stays in sync.\n const checkToExit: Record<string, number> = {\n module_id: EXIT_CODES.INVALID_CLI_INPUT,\n module_lookup: EXIT_CODES.MODULE_NOT_FOUND,\n call_chain: EXIT_CODES.MODULE_EXECUTE_ERROR,\n acl: EXIT_CODES.ACL_DENIED,\n schema: EXIT_CODES.SCHEMA_VALIDATION_ERROR,\n approval: EXIT_CODES.APPROVAL_DENIED,\n module_preflight: EXIT_CODES.MODULE_EXECUTE_ERROR,\n };\n for (const check of result.checks) {\n if (!check.passed) {\n return checkToExit[check.check] ?? EXIT_CODES.MODULE_EXECUTE_ERROR;\n }\n }\n return EXIT_CODES.MODULE_EXECUTE_ERROR;\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\";\nimport { EXIT_CODES } from \"./errors.js\";\n\n/**\n * Wrap a filesystem operation and exit with MODULE_EXECUTE_ERROR on failure.\n * Unwrapped mkdirSync/writeFileSync would surface raw Node stack traces to the\n * user; this helper funnels them through the CLI's standard stderr/exit path.\n */\nfunction runFsOp<T>(op: string, targetPath: string, fn: () => T, partial?: string[]): T {\n try {\n return fn();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: failed to ${op} ${targetPath}: ${msg}\\n`);\n if (partial && partial.length > 0) {\n process.stderr.write(\n ` Partial scaffold left on disk — you may want to remove: ${partial.join(\", \")}\\n`,\n );\n }\n process.exit(EXIT_CODES.MODULE_EXECUTE_ERROR);\n }\n}\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 = `\\\nspec_version: \"1.0\"\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 runFsOp(\"create directory\", outputDir, () => 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 runFsOp(\"write file\", filepath, () => 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 runFsOp(\"create directory\", dirPath, () => 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 runFsOp(\"write file\", filepath, () => 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 const partial: string[] = [];\n runFsOp(\"create directory\", outputDir, () => 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 runFsOp(\"write file\", yamlFile, () => fs.writeFileSync(yamlFile, yamlContent));\n partial.push(yamlFile);\n process.stdout.write(`Created ${yamlFile}\\n`);\n\n // Also create the target function file\n const baseSrc = \"commands\";\n runFsOp(\"create directory\", baseSrc, () => fs.mkdirSync(baseSrc, { recursive: true }), partial);\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 runFsOp(\"write file\", srcFile, () => fs.writeFileSync(srcFile, srcContent), partial);\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\";\nimport { lookupBindingDisplay } from \"./main.js\";\n\n/**\n * Extract resolved display overlay from a ModuleDescriptor's metadata.\n *\n * Resolution order:\n * 1. `descriptor.metadata.display` — overlay already baked into the\n * descriptor (e.g. applied by apcore-toolkit's RegistryWriter at\n * discovery time).\n * 2. Binding display map — populated by\n * `applyToolkitIntegration(undefined, bindingPath)` from a\n * `.binding.yaml` supplied via `--binding`. Used as a fallback when\n * the descriptor was registered without overlay 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 const overlay = lookupBindingDisplay(descriptor.id);\n return overlay ?? {};\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 { createRequire } from \"node:module\";\nimport yaml from \"js-yaml\";\nimport { warn as logWarn } from \"./logger.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Default configuration values.\n *\n * Audit D9 (config cleanup, v0.6.x): the entries `sandbox.enabled`,\n * `cli.auto_approve`, `cli.stdin_buffer_limit`, and the eight `apcore-cli.*`\n * namespace aliases were removed because no production code path reads\n * them via `resolve()`. Sandbox is configured via the `--sandbox` CLI flag,\n * auto-approve via `--yes`, the stdin buffer is hard-coded, and namespace\n * aliases are registered separately by `apcore-js`'s Config Bus when\n * `registerConfigNamespace()` runs at `createCli` startup. The cross-key\n * file-lookup mechanism (`NAMESPACE_TO_LEGACY` / `LEGACY_TO_NAMESPACE`)\n * still works regardless — it does not depend on these DEFAULTS entries.\n */\nexport const DEFAULTS: Record<string, unknown> = {\n \"extensions.root\": \"./extensions\",\n \"logging.level\": \"WARNING\",\n \"cli.help_text_max_length\": 1000,\n // FE-11 config keys\n \"cli.approval_timeout\": 60,\n \"cli.strategy\": \"standard\",\n \"cli.group_depth\": 1,\n // Exposure filtering (FE-12)\n \"expose.mode\": \"all\",\n \"expose.include\": [],\n \"expose.exclude\": [],\n // Builtin group visibility (FE-13) — apcli.* keys are NOT in DEFAULTS.\n // The runtime reads them via resolveObject('apcli') (raw yaml walk) and\n // does not use the flat-key resolve() path. Python and Rust have no such\n // entries either. (D11-008 cleanup)\n};\n\n/**\n * Defaults published to the apcore-cli Config Bus namespace (apcore >= 0.15.0).\n *\n * Exported for testability. Mirrors the snake_case DEFAULTS entries, with\n * `apcli` expressed as a nested object (matches the natural yaml shape).\n */\nexport const NAMESPACE_DEFAULTS: Record<string, unknown> = {\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 // FE-13 — builtin group visibility configuration\n apcli: {\n mode: null,\n include: [] as string[],\n exclude: [] as string[],\n disable_env: false,\n },\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 // Use createRequire to load apcore-js from an ESM module without relying on\n // tsup's `shims` option (which injects a `require` into the bundled output\n // but not into vitest/tsx dev paths). Native `require()` at module scope is\n // a ReferenceError in strict ESM and would silently no-op via the catch.\n const nodeRequire = createRequire(import.meta.url);\n const { Config } = nodeRequire(\"apcore-js\");\n if (typeof Config?.registerNamespace === \"function\") {\n Config.registerNamespace({\n name: \"apcore-cli\",\n envPrefix: \"APCORE_CLI\",\n defaults: NAMESPACE_DEFAULTS,\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 * Raw parsed yaml root (pre-flatten). Populated alongside `fileCache`\n * on load. Used by `resolveObject()` to walk nested paths without\n * invoking `flattenDict` — see FE-13 spec §4.8 M1 note.\n * `null` when no config file is present or parsing fails.\n */\n private _rawConfig: Record<string, unknown> | null = null;\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 //\n // Cross-SDK parity (D11-007, 2026-04-26): only consult `cliFlags` when\n // the caller passed an explicit `cliFlag` argument. Previously this code\n // used `cliFlag ?? key` which silently fell back to looking up the\n // config key itself in the cliFlags map — a phantom Tier-1 lookup that\n // could shadow file/default values when callers populated cliFlags with\n // config-keyed entries. Python (config.py:66) and Rust (config.rs:119)\n // skip Tier-1 entirely when the flag arg is None / missing; TS now\n // matches.\n if (cliFlag !== undefined && cliFlag in this.cliFlags) {\n const value = this.cliFlags[cliFlag];\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 * Resolve a configuration key to its raw nested value (FE-13).\n *\n * Unlike `resolve()`, this method does NOT flatten the yaml tree — it\n * walks the dot-separated path directly against the parsed yaml root.\n * This lets callers retrieve non-leaf structures (booleans, arrays,\n * objects) such as the `apcli` visibility config, which is naturally\n * shaped as a nested object in apcore.yaml.\n *\n * Semantics:\n * - Returns `null` when no config file is loaded or when the path is\n * not present / descends into a non-object node (including arrays).\n * - Returns the raw value (boolean / array / object / scalar) when the\n * full path resolves to a leaf or intermediate node.\n *\n * Intentionally DOES NOT consult DEFAULTS, env vars, or CLI flags — it is\n * strictly a yaml-tree accessor. Scalar `resolve()` semantics are\n * unaffected.\n */\n resolveObject(key: string): unknown {\n // Ensure raw config is populated (lazy load parity with `resolve`).\n if (!this.fileCacheLoaded) {\n this.fileCache = this.loadConfigFile();\n this.fileCacheLoaded = true;\n }\n if (this._rawConfig == null) {\n return null;\n }\n const parts = key.split(\".\");\n let cur: unknown = this._rawConfig;\n for (const p of parts) {\n if (\n cur != null &&\n typeof cur === \"object\" &&\n !Array.isArray(cur) &&\n p in (cur as Record<string, unknown>)\n ) {\n cur = (cur as Record<string, unknown>)[p];\n } else {\n return null;\n }\n }\n return cur;\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 logWarn(\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 logWarn(\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 logWarn(\n `Configuration file '${this.configPath}' is malformed, using defaults.`,\n );\n return null;\n }\n\n // Record the pre-flatten root for resolveObject() (FE-13).\n this._rawConfig = parsed as Record<string, unknown>;\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 { spawnSync } from \"node:child_process\";\nimport { Command, Help, Option } from \"commander\";\nimport { EXIT_CODES } from \"./errors.js\";\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\n/**\n * Enumerate non-hidden registered subcommands on the apcli Commander group.\n *\n * Per spec §4.13 (T-APCLI-40 regression guard): completion generation reads\n * Commander's registered set verbatim and MUST NOT re-invoke\n * `ApcliGroup.isSubcommandIncluded`. Registration time is the gate.\n */\nfunction enumerateApcliSubcommands(apcliGroup: Command | undefined): string[] {\n if (!apcliGroup) return [];\n return apcliGroup.commands\n .filter((c) => !isCmdHidden(c))\n .map((c) => c.name());\n}\n\n/** Enumerate non-hidden root-level subcommands on the program. */\nfunction enumerateRootCommands(program: Command): string[] {\n return program.commands\n .filter((c) => !isCmdHidden(c))\n .map((c) => c.name());\n}\n\n/** Locate the apcli Commander subcommand if present. */\nfunction findApcliGroup(program: Command): Command | undefined {\n return program.commands.find((c) => c.name() === \"apcli\");\n}\n\n/** Detect Commander command hidden flag across versions. */\nfunction isCmdHidden(cmd: Command): boolean {\n const withHiddenFn = cmd as unknown as { hidden?: () => boolean };\n const withHiddenField = cmd as unknown as { _hidden?: boolean };\n if (typeof withHiddenFn.hidden === \"function\") return !!withHiddenFn.hidden();\n return !!withHiddenField._hidden;\n}\n\nexport function generateBashCompletion(\n progName: string,\n program?: Command,\n): string {\n const fn = makeFunctionName(progName);\n const quoted = shellQuote(progName);\n\n const apcliGroup = program ? findApcliGroup(program) : undefined;\n const apcliVisible = apcliGroup !== undefined && !isCmdHidden(apcliGroup);\n const rootCmds = program\n ? enumerateRootCommands(program).filter(\n (n) => n !== \"apcli\" || apcliVisible,\n )\n : [];\n const apcliCmds = apcliVisible ? enumerateApcliSubcommands(apcliGroup) : [];\n\n const rootOpts = rootCmds.join(\" \");\n const apcliOpts = apcliCmds.join(\" \");\n\n let body =\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=\"${rootOpts}\"\\n` +\n ` COMPREPLY=( $(compgen -W \"\\${opts}\" -- \\${cur}) )\\n` +\n ` return 0\\n` +\n ` fi\\n`;\n if (apcliVisible) {\n body +=\n `\\n` +\n ` if [[ \\${COMP_CWORD} -eq 2 ]]; then\\n` +\n ` if [[ \"\\${COMP_WORDS[1]}\" == \"apcli\" ]]; then\\n` +\n ` local apcli_cmds=\"${apcliOpts}\"\\n` +\n ` COMPREPLY=( $(compgen -W \"\\${apcli_cmds}\" -- \\${cur}) )\\n` +\n ` return 0\\n` +\n ` fi\\n` +\n ` fi\\n`;\n }\n body += `}\\n` + `complete -F ${fn} ${quoted}\\n`;\n return body;\n}\n\nexport function generateZshCompletion(\n progName: string,\n program?: Command,\n): string {\n const fn = makeFunctionName(progName);\n const quoted = shellQuote(progName);\n\n const apcliGroup = program ? findApcliGroup(program) : undefined;\n const apcliVisible = apcliGroup !== undefined && !isCmdHidden(apcliGroup);\n const rootCmds = program\n ? enumerateRootCommands(program).filter(\n (n) => n !== \"apcli\" || apcliVisible,\n )\n : [];\n const apcliCmds = apcliVisible ? enumerateApcliSubcommands(apcliGroup) : [];\n\n const rootEntries = rootCmds.map((n) => ` '${n}:${n}'`).join(\"\\n\");\n const apcliEntries = apcliCmds.map((n) => ` '${n}:${n}'`).join(\"\\n\");\n\n return (\n `#compdef ${progName}\\n` +\n `\\n` +\n `${fn}() {\\n` +\n ` local -a commands\\n` +\n ` commands=(\\n` +\n (rootEntries ? rootEntries + \"\\n\" : \"\") +\n ` )\\n` +\n ` local -a apcli_cmds\\n` +\n ` apcli_cmds=(\\n` +\n (apcliEntries ? apcliEntries + \"\\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 ` ;;\\n` +\n ` args)\\n` +\n ` case \"\\${words[1]}\" in\\n` +\n ` apcli)\\n` +\n ` _describe -t apcli_cmds '${progName} apcli commands' apcli_cmds\\n` +\n ` ;;\\n` +\n ` esac\\n` +\n ` ;;\\n` +\n ` esac\\n` +\n `}\\n` +\n `\\n` +\n `compdef ${fn} ${quoted}\\n`\n );\n}\n\nexport function generateFishCompletion(\n progName: string,\n program?: Command,\n): string {\n const quoted = shellQuote(progName);\n\n const apcliGroup = program ? findApcliGroup(program) : undefined;\n const apcliVisible = apcliGroup !== undefined && !isCmdHidden(apcliGroup);\n const rootCmds = program\n ? enumerateRootCommands(program).filter(\n (n) => n !== \"apcli\" || apcliVisible,\n )\n : [];\n const apcliCmds = apcliVisible ? enumerateApcliSubcommands(apcliGroup) : [];\n\n const lines: string[] = [];\n lines.push(`# Fish completions for ${progName}`);\n for (const name of rootCmds) {\n lines.push(\n `complete -c ${quoted} -n \"__fish_use_subcommand\" -a ${name} -d \"${name}\"`,\n );\n }\n if (apcliVisible && apcliCmds.length > 0) {\n lines.push(\"\");\n for (const name of apcliCmds) {\n lines.push(\n `complete -c ${quoted} -n \"__fish_seen_subcommand_from apcli\" -a ${name} -d \"${name}\"`,\n );\n }\n }\n return lines.join(\"\\n\") + \"\\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// Command registration\n// ---------------------------------------------------------------------------\n\n/**\n * Locate the root Commander program by walking the parent chain from `host`.\n * When `host` is the root itself, returns `host`.\n */\nfunction findRootProgram(host: Command): Command {\n let cur: Command = host;\n while (cur.parent) cur = cur.parent;\n return cur;\n}\n\n/**\n * Register the `completion` subcommand on `host` (typically the apcli group\n * per spec §4.1, or the root program during the transition period).\n *\n * The completion-script generator enumerates the actually-registered set of\n * subcommands from the root program's Commander tree at generation time\n * (spec §4.13).\n */\nexport function registerCompletionCommand(host: Command): void {\n const completionCmd = new Command(\"completion\")\n .description(\"Generate a shell completion script and print it to stdout.\")\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 root = findRootProgram(host);\n const resolved = root.name() || \"apcore-cli\";\n const generators: Record<string, () => string> = {\n bash: () => generateBashCompletion(resolved, root),\n zsh: () => generateZshCompletion(resolved, root),\n fish: () => generateFishCompletion(resolved, root),\n };\n process.stdout.write(generators[shell]());\n });\n host.addCommand(completionCmd);\n}\n\n// registerShellCommands was removed in FE-13 create-cli-integration.\n// Call registerCompletionCommand directly (typically from the apcli group\n// dispatcher) and configureManHelp at the root program to get --help --man.\n","/**\n * Discovery commands — list, describe, exec, validate (FE-04, FE-11, FE-13).\n *\n * Protocol spec: Module discovery & introspection\n *\n * FE-13 (builtin-group): these registrars attach per-subcommand to an\n * `apcli` Commander sub-group rather than to the root program.\n */\n\nimport { Command, Option } from \"commander\";\nimport { checkApproval } from \"./approval.js\";\nimport type { Executor, ModuleDescriptor, Registry } from \"./cli.js\";\nimport { EXIT_CODES, exitCodeForError } from \"./errors.js\";\nimport { validateModuleId, collectInput } from \"./main.js\";\nimport {\n formatExecResult,\n formatModuleDetail,\n formatModuleList,\n formatPreflightResult,\n firstFailedExitCode,\n resolveFormat,\n} from \"./output.js\";\nimport { getAuditLogger } from \"./security/audit.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 // Keep in sync with apcore ModuleAnnotations: the 6 pre-0.19.0 boolean\n // fields plus `paginated` (added in apcore 0.19.0). Parity with\n // ../apcore-cli-python/src/apcore_cli/discovery.py `_ann_map`.\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 \"paginated\": \"paginated\",\n };\n const attr = map[flag] ?? flag;\n return ann[attr] === true;\n}\n\n/**\n * Register the `list` subcommand on the given group (FE-13).\n */\nexport function registerListCommand(\n apcliGroup: Command,\n registry: Registry,\n exposureFilter?: import(\"./exposure.js\").ExposureFilter,\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 .addOption(\n new Option(\"--exposure <mode>\", \"Filter by exposure status.\")\n .choices([\"exposed\", \"hidden\", \"all\"])\n .default(\"exposed\"),\n )\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 exposure: string;\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 // Exposure filter (FE-12)\n let showExposureCol = false;\n if (exposureFilter && opts.exposure !== \"all\") {\n if (opts.exposure === \"exposed\") {\n modules = modules.filter((m) => exposureFilter.isExposed(m.id ?? \"\"));\n } else if (opts.exposure === \"hidden\") {\n modules = modules.filter((m) => !exposureFilter.isExposed(m.id ?? \"\"));\n }\n }\n if (opts.exposure === \"all\" && exposureFilter) {\n showExposureCol = true;\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, showExposureCol ? exposureFilter : undefined);\n });\n apcliGroup.addCommand(listCmd);\n}\n\n/**\n * Register the `describe` subcommand on the given group (FE-13).\n */\nexport function registerDescribeCommand(\n apcliGroup: Command,\n registry: Registry,\n): void {\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 apcliGroup.addCommand(describeCmd);\n}\n\n/**\n * Register the `exec` subcommand on the given group (FE-13).\n *\n * Generic dispatch: `apcli exec <module-id> [--format fmt] [--input json]`.\n * Unlike the per-module commands built by `buildModuleCommand`, this command\n * does not derive options from the module's input schema — inputs are passed\n * as a JSON object via `--input`. This mirrors the apcli-flavoured generic\n * dispatch contract in the builtin-group feature spec.\n */\nexport function registerExecCommand(\n apcliGroup: Command,\n registry: Registry,\n executor: Executor,\n): void {\n const execCmd = new Command(\"exec\")\n .description(\"Execute a module by ID with JSON input.\")\n .argument(\"<module-id>\", \"Module ID to execute\")\n .option(\"--format <format>\", \"Output format (json, table, csv, yaml, jsonl).\")\n .option(\"--fields <fields>\", \"Comma-separated dot-paths to select from the result.\")\n .option(\n \"--input <json>\",\n \"JSON object passed as input to the module. Use '-' to read JSON from stdin.\",\n )\n .option(\"-y, --yes\", \"Auto-approve if the module declares requires_approval.\", false)\n .option(\n \"--approval-timeout <seconds>\",\n \"Seconds to wait for interactive approval.\",\n parseInt,\n )\n .option(\"--sandbox\", \"Run module in an isolated subprocess with restricted env.\", false)\n .option(\"--strategy <name>\", \"Execution strategy (standard, parallel, sequential, etc.).\")\n .option(\"--trace\", \"Enable pipeline trace output.\", false)\n .option(\"--dry-run\", \"Validate inputs without executing the module.\", false)\n .option(\"--stream\", \"Stream output as JSONL instead of buffering.\", false)\n .action(async (\n moduleId: string,\n opts: {\n format?: string;\n fields?: string;\n input?: string;\n yes: boolean;\n approvalTimeout?: number;\n sandbox: boolean;\n strategy?: string;\n trace: boolean;\n dryRun: boolean;\n stream: boolean;\n },\n ) => {\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 // Parse --input. Distinguish between a stdin marker (\"-\") — delegated\n // to collectInput — and an inline JSON literal, which we parse directly\n // here since collectInput only treats \"-\" specially.\n let merged: Record<string, unknown> = {};\n if (opts.input === \"-\") {\n merged = await collectInput(\"-\", {}, false);\n } else if (opts.input !== undefined) {\n try {\n const parsed = JSON.parse(opts.input);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n process.stderr.write(\"Error: --input JSON must be an object.\\n\");\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n merged = parsed as Record<string, unknown>;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: --input is not valid JSON: ${msg}\\n`);\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n }\n\n const startTime = performance.now();\n try {\n await checkApproval(moduleDef, opts.yes, opts.approvalTimeout);\n\n // --dry-run: validate without executing\n if (opts.dryRun) {\n if (executor.validate) {\n const preflight = await executor.validate(moduleId, merged);\n formatPreflightResult(preflight, opts.format);\n } else {\n process.stdout.write(JSON.stringify({ valid: true }) + \"\\n\");\n }\n return;\n }\n\n let result: unknown;\n if (opts.strategy && executor.callWithTrace) {\n const [res] = await executor.callWithTrace(moduleId, merged, { strategy: opts.strategy });\n result = res;\n } else {\n const { Sandbox } = await import(\"./security/index.js\");\n const sandbox = new Sandbox(opts.sandbox);\n result = await sandbox.execute(moduleId, merged, executor);\n }\n const durationMs = Math.round(performance.now() - startTime);\n\n // Format output first (canonical ordering: format → audit on success)\n const fmt = resolveFormat(opts.format);\n formatExecResult(result, fmt, opts.fields);\n\n // Audit success AFTER format so a formatter exception suppresses the entry\n const auditLogger = getAuditLogger();\n if (auditLogger) {\n auditLogger.logExecution(moduleId, merged, \"success\", 0, durationMs);\n }\n } catch (err: unknown) {\n const exitCode = exitCodeForError(err);\n const durationMs = Math.round(performance.now() - startTime);\n try {\n const auditLogger = getAuditLogger();\n if (auditLogger) {\n auditLogger.logExecution(moduleId, merged, \"error\", exitCode, durationMs);\n }\n } catch {\n // Ignore audit failures during error handling\n }\n process.stderr.write(`Error: ${err instanceof Error ? err.message : err}\\n`);\n process.exit(exitCode);\n }\n });\n apcliGroup.addCommand(execCmd);\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(EXIT_CODES.MODULE_EXECUTE_ERROR);\n }\n\n // Mirror buildModuleCommand's dry-run path: no approval gate (preflight\n // does not execute), but audit-log exceptions so scripted callers\n // always produce a trail even on failed validation (main.ts:1151-1159).\n try {\n const preflight = await executor.validate(moduleId, merged);\n formatPreflightResult(preflight, opts.format);\n process.exit(preflight.valid ? 0 : firstFailedExitCode(preflight));\n } catch (err: unknown) {\n const exitCode = exitCodeForError(err);\n try {\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 process.stderr.write(`Error: ${err instanceof Error ? err.message : err}\\n`);\n process.exit(exitCode);\n }\n });\n cli.addCommand(validateCmd);\n}\n\n// registerDiscoveryCommands was removed in FE-13 create-cli-integration.\n// Call registerListCommand + registerDescribeCommand directly.\n","/**\n * System management commands — health, usage, enable, disable, reload, config (FE-11 F2).\n *\n * Each registrar delegates to the corresponding system.* module via the\n * executor. The six registrars are pure attach-only operations and are\n * dispatched by `createCli()`'s FE-13 apcli group integration.\n */\n\nimport { Command } from \"commander\";\nimport type { Executor } from \"./cli.js\";\nimport { exitCodeForError } from \"./errors.js\";\nimport { formatExecResult, resolveFormat } from \"./output.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Call a system module via executor.call() when available, falling back to\n * executor.execute() otherwise.\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 * Emit a result as JSON when in non-TTY or when the caller requested\n * JSON format, otherwise invoke the TTY render callback. The callback\n * closes over the caller's local state (moduleId, opts.reason, etc.) so\n * each registrar can render its own TTY shape without threading those\n * values through this helper.\n */\nfunction emitResult(\n jsonPayload: unknown,\n fmt: string,\n ttyRender: () => void,\n): void {\n if (fmt === \"json\" || !process.stdout.isTTY) {\n process.stdout.write(JSON.stringify(jsonPayload, null, 2) + \"\\n\");\n } else {\n ttyRender();\n }\n}\n\n// Exit code mapped from the error's class / apcore `.code` via exitCodeForError\n// so scripted callers can distinguish ACL_DENIED (77) from MODULE_NOT_FOUND (44)\n// from generic MODULE_EXECUTE_ERROR (1).\nfunction emitErrorAndExit(e: unknown): never {\n process.stderr.write(`Error: ${e instanceof Error ? e.message : e}\\n`);\n process.exit(exitCodeForError(e));\n}\n\n// ---------------------------------------------------------------------------\n// TTY formatters (pre-split shape, unchanged)\n// ---------------------------------------------------------------------------\n\n/** Render health summary as TTY text. */\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 ?? \"?\"})` : \"—\";\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/** Render single-module health detail. */\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/** Render usage summary as TTY text. */\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// Per-subcommand registrars (FE-13)\n// ---------------------------------------------------------------------------\n\n/**\n * Attach the `health` subcommand to the passed apcliGroup.\n */\nexport function registerHealthCommand(apcliGroup: Command, executor: Executor): void {\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 (\n moduleId: string | undefined,\n opts: { threshold: number; all: boolean; errors: number; format?: string },\n ) => {\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 emitResult(result, fmt, () => formatHealthModuleTty(result));\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 emitResult(result, fmt, () => formatHealthSummaryTty(result));\n }\n } catch (e) {\n emitErrorAndExit(e);\n }\n });\n apcliGroup.addCommand(healthCmd);\n}\n\n/**\n * Attach the `usage` subcommand to the passed apcliGroup.\n */\nexport function registerUsageCommand(apcliGroup: Command, executor: Executor): void {\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 emitResult(result, fmt, () => {\n if (moduleId) {\n formatExecResult(result, fmt);\n } else {\n formatUsageSummaryTty(result as Record<string, unknown>);\n }\n });\n } catch (e) {\n emitErrorAndExit(e);\n }\n });\n apcliGroup.addCommand(usageCmd);\n}\n\n/**\n * Attach the `enable` subcommand to the passed apcliGroup.\n */\nexport function registerEnableCommand(apcliGroup: Command, executor: Executor): void {\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\", \"Signal explicit intent (forwarded to server-side approval gate).\", false)\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string, opts: { reason: string; yes: boolean; format?: string }) => {\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 emitResult(result, fmt, () => {\n process.stdout.write(`Module '${moduleId}' enabled.\\n Reason: ${opts.reason}\\n`);\n });\n } catch (e) {\n emitErrorAndExit(e);\n }\n });\n apcliGroup.addCommand(enableCmd);\n}\n\n/**\n * Attach the `disable` subcommand to the passed apcliGroup.\n */\nexport function registerDisableCommand(apcliGroup: Command, executor: Executor): void {\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\", \"Signal explicit intent (forwarded to server-side approval gate).\", false)\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string, opts: { reason: string; yes: boolean; format?: string }) => {\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 emitResult(result, fmt, () => {\n process.stdout.write(`Module '${moduleId}' disabled.\\n Reason: ${opts.reason}\\n`);\n });\n } catch (e) {\n emitErrorAndExit(e);\n }\n });\n apcliGroup.addCommand(disableCmd);\n}\n\n/**\n * Attach the `reload` subcommand to the passed apcliGroup.\n */\nexport function registerReloadCommand(apcliGroup: Command, executor: Executor): void {\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\", \"Signal explicit intent (forwarded to server-side approval gate).\", false)\n .option(\"--format <format>\", \"Output format.\")\n .action(async (moduleId: string, opts: { reason: string; yes: boolean; format?: string }) => {\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 emitResult(result, fmt, () => {\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 emitErrorAndExit(e);\n }\n });\n apcliGroup.addCommand(reloadCmd);\n}\n\n/**\n * Attach the `config` subcommand (with `get` and `set` children) to the\n * passed apcliGroup.\n *\n * Signature note: config reads/writes go through `executor.call()` to\n * `system.config.get` / `system.control.update_config`, so this registrar\n * takes an {@link Executor} (not a Registry). The FE-13 dispatcher table\n * entry for `config` sets `requiresExecutor: true` accordingly.\n */\nexport function registerConfigCommand(apcliGroup: Command, executor: Executor): void {\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 emitResult({ key, value }, fmt, () => {\n process.stdout.write(`${key} = ${JSON.stringify(value)}\\n`);\n });\n } catch (e) {\n emitErrorAndExit(e);\n }\n });\n configGroup.addCommand(configGetCmd);\n\n const configSetCmd = new Command(\"set\")\n .description(\"Update a runtime configuration value (audit-logged; server-side approval gate applies).\")\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 emitResult(result, fmt, () => {\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 emitErrorAndExit(e);\n }\n });\n configGroup.addCommand(configSetCmd);\n\n apcliGroup.addCommand(configGroup);\n}\n\n// registerSystemCommands was removed in FE-13 create-cli-integration.\n// createCli() now dispatches the six per-subcommand registrars directly via\n// the `_registerApcliSubcommands` table in src/main.ts.\n","/**\n * Pipeline strategy commands — describe-pipeline (FE-11 F8).\n */\n\nimport { Command, Option } from \"commander\";\nimport type { Executor, StrategyInfo } from \"./cli.js\";\nimport { resolveFormat } from \"./output.js\";\n\n/**\n * Look up `StrategyInfo` for an arbitrary strategy name.\n *\n * apcore-js exposes two introspection entry points:\n * - `Executor.listStrategies()` (static): returns info for all globally\n * registered strategies.\n * - `executor.describePipeline()` (instance, no args): returns info for\n * the executor's *currently-set* strategy only.\n *\n * To describe a non-current strategy we need the static `listStrategies`.\n * We reach it via the runtime constructor of the executor instance so the\n * CLI does not have to directly import the apcore-js `Executor` class\n * (preserves the loose structural contract used elsewhere in this package).\n *\n * Returns `{ info, isCurrent }` so the caller does not need a second\n * `describePipeline()` invocation to ask the same \"is this the current\n * strategy?\" question — only the current strategy exposes step-level\n * metadata (`executor.currentStrategy.steps`).\n */\nfunction lookupStrategyInfo(\n executor: Executor,\n strategyName: string,\n): { info: StrategyInfo | null; isCurrent: boolean } {\n // 1. Is the requested strategy the executor's current one?\n if (typeof executor.describePipeline === \"function\") {\n try {\n const current = executor.describePipeline();\n if (current && current.name === strategyName) {\n return { info: current, isCurrent: true };\n }\n } catch {\n // Fall through to the static lookup.\n }\n }\n\n // 2. Walk the static registry via the constructor.\n const ctor = (executor as unknown as { constructor?: unknown }).constructor as\n | { listStrategies?: () => StrategyInfo[] }\n | undefined;\n if (ctor && typeof ctor.listStrategies === \"function\") {\n try {\n const all = ctor.listStrategies();\n const info = all.find((s) => s.name === strategyName) ?? null;\n return { info, isCurrent: false };\n } catch {\n return { info: null, isCurrent: false };\n }\n }\n return { info: null, isCurrent: false };\n}\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 // Look up info for the requested strategy (current strategy via\n // describePipeline(), arbitrary strategy via Executor.listStrategies()).\n const { info, isCurrent } = lookupStrategyInfo(executor, opts.strategy);\n\n if (info) {\n // Step metadata (pure/removable/timeoutMs) is only available for the\n // executor's *current* strategy via `currentStrategy.steps` — other\n // registered strategies expose only their `StrategyInfo` summary.\n const strategySteps = isCurrent ? (executor.currentStrategy?.steps ?? []) : [];\n const header = `Pipeline: ${info.name} (${info.stepCount} steps)`;\n\n if (fmt === \"json\" || !process.stdout.isTTY) {\n const payload = {\n strategy: info.name,\n step_count: info.stepCount,\n description: info.description,\n steps: info.stepNames.map((name, i) => {\n const stepMeta = strategySteps[i];\n return {\n index: i + 1,\n name,\n pure: stepMeta?.pure ?? false,\n removable: stepMeta?.removable ?? true,\n timeout_ms: stepMeta?.timeoutMs ?? null,\n };\n }),\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n } else {\n process.stdout.write(`${header}\\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 < info.stepNames.length; i++) {\n const stepMeta = strategySteps[i];\n const pure = stepMeta?.pure ? \"yes\" : \"no\";\n const removable = stepMeta?.removable !== false ? \"yes\" : \"no\";\n const timeout = stepMeta?.timeoutMs ? `${stepMeta.timeoutMs}ms` : \"\\u2014\";\n process.stdout.write(` ${String(i + 1).padEnd(4)} ${info.stepNames[i].padEnd(28)} ${pure.padEnd(6)} ${removable.padEnd(11)} ${timeout}\\n`);\n }\n }\n return;\n }\n\n // Fall back to static preset info for known strategies.\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 });\n cli.addCommand(pipelineCmd);\n}\n","/**\n * Built-in Command Group (FE-13).\n *\n * Encapsulates visibility resolution and subcommand filtering for the\n * reserved `apcli` group. Instantiated once by createCli() and attached\n * to the root command.\n *\n * Shape mirrors `src/exposure.ts` ExposureFilter: private constructor,\n * named static factories, and a small set of predicate methods.\n * See the feature spec §4.2–4.7 for authoritative semantics.\n */\n\nimport { EXIT_CODES } from \"./errors.js\";\nimport { warn } from \"./logger.js\";\n\n// ---------------------------------------------------------------------------\n// Types & constants\n// ---------------------------------------------------------------------------\n\n/**\n * Resolved visibility mode.\n *\n * `\"auto\"` is an internal sentinel — it is never returned from\n * {@link ApcliGroup.resolveVisibility} and is rejected when supplied via\n * user config (CliConfig or apcore.yaml).\n */\nexport type ApcliMode = \"auto\" | \"all\" | \"none\" | \"include\" | \"exclude\";\n\n/**\n * User-facing apcli config shape.\n *\n * Boolean shorthand maps to `{mode: \"all\"}` / `{mode: \"none\"}`.\n * Object form rejects `\"auto\"` per spec §4.2 (internal sentinel only).\n */\nexport type ApcliConfig =\n | boolean\n | {\n mode?: Exclude<ApcliMode, \"auto\">;\n include?: string[];\n exclude?: string[];\n disableEnv?: boolean;\n };\n\n/** Set of group names reserved by apcore-cli (checked in cli.ts). */\nexport const RESERVED_GROUP_NAMES: ReadonlySet<string> = new Set([\"apcli\"]);\n\nconst VALID_USER_MODES: ReadonlySet<string> = new Set([\n \"all\",\n \"none\",\n \"include\",\n \"exclude\",\n]);\n\n/**\n * Canonical set of apcli subcommand names.\n *\n * Declarative mirror of the registration TABLE in `src/main.ts`\n * (`_registerApcliSubcommands`). Used by `_normalizeList` to warn on\n * unknown entries in include/exclude lists (spec §7 error table / T-APCLI-25).\n *\n * Keep in sync with main.ts TABLE if subcommands are added or removed.\n */\nexport const APCLI_SUBCOMMAND_NAMES: ReadonlySet<string> = new Set([\n \"list\",\n \"describe\",\n \"exec\",\n \"validate\",\n \"init\",\n \"health\",\n \"usage\",\n \"enable\",\n \"disable\",\n \"reload\",\n \"config\",\n \"completion\",\n \"describe-pipeline\",\n]);\n\n// ---------------------------------------------------------------------------\n// ApcliGroup\n// ---------------------------------------------------------------------------\n\ninterface ApcliGroupInit {\n mode: ApcliMode;\n include: string[];\n exclude: string[];\n disableEnv: boolean;\n registryInjected: boolean;\n fromCliConfig: boolean;\n}\n\n/**\n * Visibility configuration for the built-in `apcli` command group.\n *\n * Instantiated via {@link ApcliGroup.fromCliConfig} (Tier 1) or\n * {@link ApcliGroup.fromYaml} (Tier 3). The constructor is private to\n * preserve the Tier-1-vs-Tier-3 flag distinction.\n */\nexport class ApcliGroup {\n private readonly _mode: ApcliMode;\n private readonly _include: string[];\n private readonly _exclude: string[];\n private readonly _disableEnv: boolean;\n private readonly _registryInjected: boolean;\n private readonly _fromCliConfig: boolean;\n\n private constructor(init: ApcliGroupInit) {\n this._mode = init.mode;\n this._include = init.include;\n this._exclude = init.exclude;\n this._disableEnv = init.disableEnv;\n this._registryInjected = init.registryInjected;\n this._fromCliConfig = init.fromCliConfig;\n }\n\n /**\n * Tier 1 constructor — config came from `createCli({ apcli })`.\n *\n * A non-auto mode from this tier wins over env var and yaml.\n */\n static fromCliConfig(\n config: ApcliConfig | undefined,\n opts: { registryInjected: boolean },\n ): ApcliGroup {\n return ApcliGroup._build(config, opts, /*fromCliConfig*/ true);\n }\n\n /**\n * Tier 3 constructor — config came from `apcore.yaml`.\n *\n * Env var (Tier 2) may override the yaml-supplied mode.\n */\n static fromYaml(\n config: unknown,\n opts: { registryInjected: boolean },\n ): ApcliGroup {\n return ApcliGroup._build(\n config as ApcliConfig | undefined,\n opts,\n /*fromCliConfig*/ false,\n );\n }\n\n /**\n * Non-panicking Tier 3 factory (A-001 parity with Rust's `try_from_yaml`).\n * Returns `[instance, null]` on success or `[null, errorMessage]` on invalid input.\n * Use this in programmatic contexts where throwing/exiting is unwanted.\n */\n static tryFromYaml(\n config: unknown,\n opts: { registryInjected: boolean },\n ): [ApcliGroup, null] | [null, string] {\n if (config !== null && config !== undefined && typeof config !== \"boolean\" && typeof config !== \"object\") {\n return [null, `apcore.yaml 'apcli:' must be a bool, object, or null; got ${typeof config}`];\n }\n if (config !== null && config !== undefined && typeof config === \"object\" && !Array.isArray(config)) {\n const mode = (config as Record<string, unknown>)[\"mode\"];\n if (mode !== undefined && mode !== null) {\n const validModes = [\"all\", \"none\", \"include\", \"exclude\"];\n if (typeof mode !== \"string\" || !validModes.includes(mode)) {\n return [null, `Invalid apcli mode: '${mode}'. Must be one of: all, none, include, exclude.`];\n }\n }\n }\n return [ApcliGroup.fromYaml(config, opts), null];\n }\n\n // -------------------------------------------------------------------------\n // Internal builder — shared by both factories\n // -------------------------------------------------------------------------\n\n private static _build(\n config: ApcliConfig | undefined,\n opts: { registryInjected: boolean },\n fromCliConfig: boolean,\n ): ApcliGroup {\n // Boolean shorthand → normalized object form.\n if (config === true) {\n return new ApcliGroup({\n mode: \"all\",\n include: [],\n exclude: [],\n disableEnv: false,\n registryInjected: opts.registryInjected,\n fromCliConfig,\n });\n }\n if (config === false) {\n return new ApcliGroup({\n mode: \"none\",\n include: [],\n exclude: [],\n disableEnv: false,\n registryInjected: opts.registryInjected,\n fromCliConfig,\n });\n }\n\n // Missing / nullish → auto-detect (mode left as internal sentinel).\n if (config === undefined || config === null) {\n return new ApcliGroup({\n mode: \"auto\",\n include: [],\n exclude: [],\n disableEnv: false,\n registryInjected: opts.registryInjected,\n fromCliConfig,\n });\n }\n\n if (typeof config !== \"object\" || Array.isArray(config)) {\n // Unexpected shape — refuse to silently coerce.\n process.stderr.write(\n `Error: apcli config must be a boolean or object; got ${Array.isArray(config) ? \"array\" : typeof config}.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n }\n\n const cfg = config as Record<string, unknown>;\n\n // Mode validation. `\"auto\"` and unknown values are rejected.\n let mode: ApcliMode;\n if (cfg.mode === undefined || cfg.mode === null) {\n // Object form without mode (e.g. `{disableEnv: true}`) → mode auto.\n mode = \"auto\";\n } else if (typeof cfg.mode !== \"string\") {\n process.stderr.write(\n `Error: apcli.mode must be a string; got ${typeof cfg.mode}. ` +\n `Expected one of all|none|include|exclude.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n } else if (!VALID_USER_MODES.has(cfg.mode)) {\n process.stderr.write(\n `Error: apcli.mode '${cfg.mode}' is invalid. ` +\n `Expected one of all|none|include|exclude.\\n`,\n );\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\n } else {\n mode = cfg.mode as ApcliMode;\n }\n\n // include / exclude lists — warn on non-array, keep entries as-is.\n const include = ApcliGroup._normalizeList(cfg.include, \"include\");\n const exclude = ApcliGroup._normalizeList(cfg.exclude, \"exclude\");\n\n // disableEnv — accept both camelCase (JS object literal) and snake_case\n // (yaml-per-spec §4.2 / §10.3). Must be boolean; warn + treat as false\n // otherwise.\n const rawDisableEnv =\n cfg.disableEnv !== undefined\n ? cfg.disableEnv\n : (cfg as Record<string, unknown>)[\"disable_env\"];\n let disableEnv = false;\n if (rawDisableEnv !== undefined) {\n if (typeof rawDisableEnv === \"boolean\") {\n disableEnv = rawDisableEnv;\n } else {\n warn(\n `apcli.disable_env must be boolean; got ${typeof rawDisableEnv}. Treating as false.`,\n );\n }\n }\n\n return new ApcliGroup({\n mode,\n include,\n exclude,\n disableEnv,\n registryInjected: opts.registryInjected,\n fromCliConfig,\n });\n }\n\n /**\n * Normalize an include/exclude list. Non-array → warn and return [].\n *\n * Unknown but well-formed entries emit a WARNING (spec §7 error table,\n * T-APCLI-25) but are retained in the returned list for forward-compat —\n * if apcore-cli later adds a subcommand named `foo`, existing configs\n * continue to work without a config change. At runtime, unknown names\n * simply never match any registered subcommand.\n */\n private static _normalizeList(raw: unknown, label: string): string[] {\n if (raw === undefined || raw === null) return [];\n if (!Array.isArray(raw)) {\n warn(`apcli.${label} must be a list; got ${typeof raw}. Ignoring.`);\n return [];\n }\n const out: string[] = [];\n for (const entry of raw) {\n if (typeof entry === \"string\" && entry.length > 0) {\n if (!APCLI_SUBCOMMAND_NAMES.has(entry)) {\n warn(\n `Unknown apcli subcommand '${entry}' in ${label} list — ignoring.`,\n );\n }\n out.push(entry);\n } else {\n warn(`apcli.${label} contains non-string entry; skipping.`);\n }\n }\n return out;\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /**\n * Resolve effective visibility mode after applying tier precedence.\n *\n * Returns one of `\"all\" | \"none\" | \"include\" | \"exclude\"` — never `\"auto\"`.\n *\n * Tier order (spec §4.4):\n * 1. CliConfig non-auto wins outright.\n * 2. `APCORE_CLI_APCLI` env var (unless sealed by disableEnv).\n * 3. yaml non-auto.\n * 4. Auto-detect from registryInjected.\n */\n resolveVisibility(): \"all\" | \"none\" | \"include\" | \"exclude\" {\n // Tier 1 — CliConfig non-auto.\n if (this._fromCliConfig && this._mode !== \"auto\") {\n return this._mode;\n }\n\n // Tier 2 — env var (unless sealed).\n if (!this._disableEnv) {\n const envMode = this._parseEnv(process.env.APCORE_CLI_APCLI);\n if (envMode !== null) {\n return envMode;\n }\n }\n\n // Tier 3 — yaml non-auto.\n if (this._mode !== \"auto\") {\n return this._mode;\n }\n\n // Tier 4 — auto-detect.\n return this._registryInjected ? \"none\" : \"all\";\n }\n\n /**\n * True iff `subcommand` passes the include/exclude filter.\n *\n * Callers MUST first check {@link resolveVisibility} — this method throws\n * under modes `\"all\"` or `\"none\"` (caller bug per spec §4.6).\n */\n isSubcommandIncluded(subcommand: string): boolean {\n const mode = this.resolveVisibility();\n if (mode === \"include\") return this._include.includes(subcommand);\n if (mode === \"exclude\") return !this._exclude.includes(subcommand);\n throw new Error(\n `isSubcommandIncluded called under mode '${mode}'; caller should bypass.`,\n );\n }\n\n /** True iff the `apcli` group itself should appear in root `--help`. */\n isGroupVisible(): boolean {\n return this.resolveVisibility() !== \"none\";\n }\n\n // -------------------------------------------------------------------------\n // Env parser (Tier 2) — co-located per spec §4.4\n // -------------------------------------------------------------------------\n\n /**\n * Parse APCORE_CLI_APCLI. Case-insensitive.\n *\n * - `show` / `1` / `true` → `\"all\"`\n * - `hide` / `0` / `false` → `\"none\"`\n * - Empty / unset → `null`\n * - Anything else → warn and return `null`\n */\n private _parseEnv(raw: string | undefined): \"all\" | \"none\" | null {\n if (raw === undefined || raw === \"\") return null;\n const normalized = raw.toLowerCase();\n if (normalized === \"show\" || normalized === \"1\" || normalized === \"true\") {\n return \"all\";\n }\n if (\n normalized === \"hide\" ||\n normalized === \"0\" ||\n normalized === \"false\"\n ) {\n return \"none\";\n }\n warn(\n `Unknown APCORE_CLI_APCLI value '${raw}', ignoring. ` +\n `Expected: show, hide, 1, 0, true, false.`,\n );\n return null;\n }\n}\n","/**\n * Module Exposure Filtering (FE-12).\n *\n * Provides declarative control over which discovered modules are exposed\n * as CLI commands. Supports three modes: all, include (whitelist), and\n * exclude (blacklist) with glob-pattern matching on module IDs.\n */\n\nimport { warn } from \"./logger.js\";\n\n// ---------------------------------------------------------------------------\n// Glob pattern compiler\n// ---------------------------------------------------------------------------\n\n/** Escape special regex characters in a string. */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Compile a glob pattern to a regex.\n *\n * - `*` matches a single dotted segment (no dots): `[^.]*`\n * - `**` matches across segments (any characters including dots): `.+`\n * - Literal text is matched exactly via regex escaping.\n */\nexport function compilePattern(pattern: string): RegExp {\n const sentinel = \"\\x00GLOB\\x00\";\n const escaped = pattern.replaceAll(\"**\", sentinel);\n const parts = escaped.split(\"*\");\n const regexParts = parts.map((p) => {\n const restored = p.replaceAll(sentinel, \"**\");\n return escapeRegex(restored);\n });\n let regex = regexParts.join(\"[^.]*\");\n regex = regex.replaceAll(\"\\\\*\\\\*\", \".+\");\n return new RegExp(`^${regex}$`);\n}\n\n/** Test whether a moduleId matches a glob pattern. */\nexport function globMatch(moduleId: string, pattern: string): boolean {\n return compilePattern(pattern).test(moduleId);\n}\n\n// ---------------------------------------------------------------------------\n// ExposureFilter\n// ---------------------------------------------------------------------------\n\n/**\n * Determines which modules are exposed as CLI commands.\n *\n * Filtering modes:\n * - `all`: every discovered module becomes a CLI command (default).\n * - `include`: only modules matching at least one include pattern are exposed.\n * - `exclude`: all modules are exposed except those matching any exclude pattern.\n */\nexport class ExposureFilter {\n static readonly VALID_MODES = [\"all\", \"include\", \"exclude\", \"none\"] as const;\n\n readonly _mode: string;\n private readonly _compiledInclude: RegExp[];\n private readonly _compiledExclude: RegExp[];\n\n constructor(mode = \"all\", include?: string[], exclude?: string[]) {\n // Cross-SDK parity with apcore-cli-rust/src/exposure.rs:70 (D11-008):\n // unknown mode values clamp to \"none\" with a warning so consumers that\n // introspect ``filter.mode`` see a consistent string across the three\n // SDKs. Runtime exposure decision is unchanged (isExposed already\n // fail-closes on unknown modes via its default-false branch); the\n // clamp aligns the persisted state.\n if (!ExposureFilter.VALID_MODES.includes(mode as (typeof ExposureFilter.VALID_MODES)[number])) {\n process.stderr.write(\n `Warning: Unknown ExposureFilter mode '${mode}' — defaulting to 'none'. Valid modes: ${ExposureFilter.VALID_MODES.join(\", \")}.\\n`,\n );\n mode = \"none\";\n }\n this._mode = mode;\n const dedup = (arr: string[]) => [...new Set(arr)];\n this._compiledInclude = dedup(include ?? []).map(compilePattern);\n this._compiledExclude = dedup(exclude ?? []).map(compilePattern);\n }\n\n /** Return true if the module should be exposed as a CLI command. */\n isExposed(moduleId: string): boolean {\n if (this._mode === \"all\") return true;\n if (this._mode === \"include\") {\n return this._compiledInclude.some((rx) => rx.test(moduleId));\n }\n if (this._mode === \"exclude\") {\n return !this._compiledExclude.some((rx) => rx.test(moduleId));\n }\n return false;\n }\n\n /** Partition moduleIds into [exposed, hidden] lists. */\n filterModules(moduleIds: string[]): [string[], string[]] {\n const exposed: string[] = [];\n const hidden: string[] = [];\n for (const mid of moduleIds) {\n (this.isExposed(mid) ? exposed : hidden).push(mid);\n }\n return [exposed, hidden];\n }\n\n /**\n * Create an ExposureFilter from a parsed config dict.\n *\n * Expected: `{ expose: { mode: \"include\", include: [\"admin.*\"] } }`\n */\n static fromConfig(config: Record<string, unknown>): ExposureFilter {\n const expose = config.expose ?? {};\n if (typeof expose !== \"object\" || expose === null || Array.isArray(expose)) {\n warn(\"Invalid 'expose' config (expected dict), using mode: all.\");\n return new ExposureFilter();\n }\n\n const exposeObj = expose as Record<string, unknown>;\n const mode = (exposeObj.mode as string) ?? \"all\";\n if (![\"all\", \"include\", \"exclude\"].includes(mode)) {\n throw new Error(\n `Invalid expose mode: '${mode}'. Must be one of: all, include, exclude.`,\n );\n }\n\n let include = exposeObj.include ?? [];\n if (!Array.isArray(include)) {\n warn(\"Invalid 'expose.include' (expected list), ignoring.\");\n include = [];\n }\n\n let exclude = exposeObj.exclude ?? [];\n if (!Array.isArray(exclude)) {\n warn(\"Invalid 'expose.exclude' (expected list), ignoring.\");\n exclude = [];\n }\n\n const filterList = (arr: unknown[], label: string): string[] => {\n const result: string[] = [];\n for (const p of arr) {\n if (!p) {\n warn(`Empty pattern in expose.${label}, skipping.`);\n } else {\n result.push(String(p));\n }\n }\n return result;\n };\n\n return new ExposureFilter(\n mode,\n filterList(include as unknown[], \"include\"),\n filterList(exclude as unknown[], \"exclude\"),\n );\n }\n}\n","/**\n * Canonical help formatter — clap/GNU-style output shared across the\n * apcore-cli SDK family (TS, Python, Rust).\n *\n * Conventions:\n * - Description before Usage\n * - `Usage: <prog> [OPTIONS] [COMMAND]` (uppercase)\n * - `Commands:` section before `Options:`\n * - `<UPPER>` placeholders\n * - `[default: VALUE]` (brackets, no quotes)\n * - `-h, --help` → \"Print help\", `-V, --version` → \"Print version\"\n * - Long-only options indented 4 extra spaces so `--long` aligns with\n * `-s, --long` rows\n */\n\nimport type { Command, Help, Option } from \"commander\";\n\ntype HelpTextSection =\n | string\n | ((ctx: { error: boolean; command: Command }) => string);\n\ninterface CommandHelpTextBag {\n beforeAll?: HelpTextSection;\n before?: HelpTextSection;\n after?: HelpTextSection;\n afterAll?: HelpTextSection;\n}\n\nfunction resolveHelpText(cmd: Command, section: keyof CommandHelpTextBag): string {\n const bag = (cmd as unknown as { _helpText?: CommandHelpTextBag })._helpText;\n const v = bag?.[section];\n if (typeof v === \"function\") return v({ error: false, command: cmd });\n return v ?? \"\";\n}\n\nfunction uppercasePlaceholders(flags: string): string {\n return flags\n .replace(/<([a-zA-Z0-9_-]+)>/g, (_, name) => `<${name.toUpperCase()}>`)\n .replace(/\\[([a-zA-Z0-9_-]+)\\]/g, (_, name) => `[${name.toUpperCase()}]`);\n}\n\nfunction optionTerm(opt: Option): string {\n const flags = uppercasePlaceholders(opt.flags);\n // Align long-only options with short+long rows: \" -s, --long\" vs \" --long\"\n if (!opt.short && flags.startsWith(\"--\")) return \" \" + flags;\n return flags;\n}\n\nfunction optionDescription(opt: Option): string {\n let desc = opt.description;\n const d = opt.defaultValue;\n if (d !== undefined && d !== false && d !== \"\" && d !== null) {\n desc = `${desc} [default: ${String(d)}]`;\n }\n return desc;\n}\n\n/**\n * Move `-h, --help` and `-V, --version` to the end of the options list so\n * they always render last (clap convention), regardless of registration\n * order inside `createCli`.\n */\nfunction reorderHelpVersionLast(opts: readonly Option[]): Option[] {\n const helpOpts: Option[] = [];\n const versionOpts: Option[] = [];\n const rest: Option[] = [];\n for (const o of opts) {\n if (o.long === \"--help\") helpOpts.push(o);\n else if (o.long === \"--version\") versionOpts.push(o);\n else rest.push(o);\n }\n return [...rest, ...helpOpts, ...versionOpts];\n}\n\nexport function canonicalFormatHelp(cmd: Command, helper: Help): string {\n const sections: string[] = [];\n\n const beforeAll = resolveHelpText(cmd, \"beforeAll\");\n if (beforeAll) sections.push(beforeAll);\n\n const desc = cmd.description();\n if (desc) sections.push(desc);\n\n const before = resolveHelpText(cmd, \"before\");\n if (before) sections.push(before);\n\n const visibleOpts = reorderHelpVersionLast(helper.visibleOptions(cmd));\n const visibleCmds = helper.visibleCommands(cmd);\n const args = (cmd as unknown as {\n registeredArguments?: Array<{ name: () => string; required: boolean }>;\n }).registeredArguments ?? [];\n\n let usage = `Usage: ${cmd.name()}`;\n if (visibleOpts.length > 0) usage += \" [OPTIONS]\";\n for (const a of args) {\n const n = a.name().toUpperCase();\n usage += a.required ? ` <${n}>` : ` [${n}]`;\n }\n if (visibleCmds.length > 0) usage += \" [COMMAND]\";\n sections.push(usage);\n\n if (visibleCmds.length > 0) {\n const terms = visibleCmds.map((c) => c.name());\n const w = Math.max(...terms.map((t) => t.length));\n const lines = [\"Commands:\"];\n visibleCmds.forEach((sub, i) => {\n lines.push(` ${terms[i].padEnd(w)} ${sub.description()}`);\n });\n sections.push(lines.join(\"\\n\"));\n }\n\n if (visibleOpts.length > 0) {\n const terms = visibleOpts.map(optionTerm);\n const w = Math.max(...terms.map((t) => t.length));\n const lines = [\"Options:\"];\n visibleOpts.forEach((opt, i) => {\n lines.push(` ${terms[i].padEnd(w)} ${optionDescription(opt)}`);\n });\n sections.push(lines.join(\"\\n\"));\n }\n\n const after = resolveHelpText(cmd, \"after\");\n if (after) sections.push(after);\n\n const afterAll = resolveHelpText(cmd, \"afterAll\");\n if (afterAll) sections.push(afterAll);\n\n return sections.join(\"\\n\\n\") + \"\\n\";\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 { ExposureFilter } from \"./exposure.js\";\nimport { warn } from \"./logger.js\";\nimport { RESERVED_GROUP_NAMES } from \"./builtin-group.js\";\nimport { EXIT_CODES } from \"./errors.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/** Strategy info returned by Executor.describePipeline(). */\nexport interface StrategyInfo {\n name: string;\n stepCount: number;\n stepNames: string[];\n description: string;\n}\n\n/** A step in the executor strategy (shape parity with apcore-js Step). */\nexport interface StrategyStep {\n name: string;\n pure?: boolean;\n removable: boolean;\n timeoutMs?: number;\n}\n\n/** Placeholder for apcore-js Executor. Shape-compatible with apcore-js >= 0.19.0. */\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 * Describe the executor's currently-set strategy. Returns StrategyInfo\n * (apcore-js >= 0.18.0). Takes no arguments — to introspect a different\n * strategy, use `Executor.listStrategies()` (static) via `executor.constructor`.\n */\n describePipeline?(): StrategyInfo;\n /** The current execution strategy object, exposing step metadata. */\n currentStrategy?: { readonly steps: readonly StrategyStep[] };\n}\n\n/** Result of a preflight validation check. */\nexport interface PreflightCheck {\n readonly check: string;\n readonly passed: boolean;\n readonly error?: unknown;\n readonly warnings?: string[];\n}\n\n/** Result of executor.validate() — parity with apcore-js PreflightResult. */\nexport interface PreflightResult {\n readonly valid: boolean;\n readonly requiresApproval: boolean;\n readonly checks: readonly PreflightCheck[];\n readonly errors?: ReadonlyArray<Record<string, unknown>>;\n}\n\n/** A single step in a pipeline trace — parity with apcore-js StepTrace. */\nexport interface PipelineTraceStep {\n readonly name: string;\n readonly durationMs: number;\n readonly skipped: boolean;\n readonly skipReason?: string | null;\n}\n\n/** Pipeline execution trace returned by callWithTrace() — parity with apcore-js PipelineTrace. */\nexport interface PipelineTrace {\n readonly moduleId?: string;\n readonly strategyName: string;\n readonly totalDurationMs: number;\n readonly success: boolean;\n readonly steps: readonly 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// FE-13 (builtin-group) replaced the per-command collision constant with a\n// live Commander tree walk (root + apcli subgroup). The reserved top-level\n// group name is `apcli` (see RESERVED_GROUP_NAMES in ./builtin-group.ts);\n// individual subcommand names are no longer a global namespace since they\n// live under the apcli/ prefix.\n\n/**\n * Hard-fail with exit 2 when a module resolves to a reserved CLI name.\n * FE-13 §4.10 enumerates three cases: explicit group, auto-group prefix,\n * and top-level alias/id. Error messages identify both the module id and\n * the offending name for debuggability.\n */\nfunction assertNotReserved(\n kind: \"group\" | \"auto-group\" | \"top-level\",\n name: string,\n moduleId: string,\n): void {\n if (!RESERVED_GROUP_NAMES.has(name)) return;\n let msg: string;\n if (kind === \"group\") {\n msg =\n `Error: Module '${moduleId}': display.cli.group '${name}' is reserved. ` +\n `Use a different CLI alias or set display.cli.group to another value.\\n`;\n } else if (kind === \"auto-group\") {\n msg =\n `Error: Module '${moduleId}': auto-group '${name}' is reserved. ` +\n `Rename the module id or set display.cli.group to another value.\\n`;\n } else {\n msg =\n `Error: Module '${moduleId}': top-level CLI name '${name}' is reserved. ` +\n `Use a different CLI alias.\\n`;\n }\n process.stderr.write(msg);\n process.exit(EXIT_CODES.INVALID_CLI_INPUT);\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 /** Exposure filter (FE-12) — controls which modules appear as CLI commands */\n exposureFilter: ExposureFilter;\n /** Effective group depth (CLAUDE.md v0.6.0): constructor arg > APCORE_CLI_GROUP_DEPTH env > 1. */\n readonly groupDepth: number;\n\n constructor(\n registry: Registry,\n executor: Executor,\n helpTextMaxLength = 1000,\n exposureFilter?: ExposureFilter,\n groupDepth?: number,\n ) {\n super(registry, executor, helpTextMaxLength);\n this.exposureFilter = exposureFilter ?? new ExposureFilter();\n this.groupDepth = GroupedModuleGroup.resolveGroupDepth(groupDepth);\n }\n\n /**\n * Resolve group depth from constructor arg > APCORE_CLI_GROUP_DEPTH env > default 1.\n * Invalid env values (non-integer, non-positive) fall through to the default.\n */\n static resolveGroupDepth(explicit: number | undefined): number {\n if (explicit !== undefined && Number.isFinite(explicit) && explicit > 0) {\n return Math.floor(explicit);\n }\n const raw = process.env.APCORE_CLI_GROUP_DEPTH;\n if (raw !== undefined && raw !== \"\") {\n const parsed = parseInt(raw, 10);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n return 1;\n }\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 * FE-13: hard-fails with exit 2 when a module resolves to the reserved\n * `apcli` namespace in any of three ways — explicit `display.cli.group`,\n * auto-grouped dotted prefix, or top-level alias/id. See spec §4.10.\n */\n buildGroupMap(): void {\n if (this.groupMapBuilt) {\n return;\n }\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 if (!this.exposureFilter.isExposed(moduleId)) {\n continue;\n }\n\n // Detect reserved-name collisions BEFORE routing — spec §4.10 three\n // cases: explicit group, auto-group prefix, top-level name.\n const display = getDisplay(cached);\n const cliDisplay = (display.cli && typeof display.cli === \"object\" && !Array.isArray(display.cli))\n ? (display.cli as Record<string, unknown>)\n : {};\n const explicitGroup = typeof cliDisplay.group === \"string\" && cliDisplay.group !== \"\"\n ? (cliDisplay.group as string)\n : undefined;\n if (explicitGroup !== undefined) {\n assertNotReserved(\"group\", explicitGroup, moduleId);\n }\n\n const [group, cmd] = GroupedModuleGroup.resolveGroup(moduleId, cached, this.groupDepth);\n if (group !== null && explicitGroup === undefined) {\n // Auto-grouped (e.g. `apcli.foo` → group=`apcli`).\n assertNotReserved(\"auto-group\", group, moduleId);\n }\n if (group === null) {\n assertNotReserved(\"top-level\", cmd, moduleId);\n this.topLevelModules.set(cmd, [moduleId, cached]);\n } else if (!/^[a-z][a-z0-9_-]*(\\.[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 this.groupMapBuilt = true;\n }\n\n /**\n * List all available command names: group names + top-level module names.\n *\n * FE-13: the built-in subcommand list is no longer folded in here — those\n * commands live under the `apcli` prefix and are registered directly by\n * `createCli`.\n */\n override listCommands(): string[] {\n this.buildGroupMap();\n const groupNames = [...this.groupMap.keys()].filter(\n (g) => !RESERVED_GROUP_NAMES.has(g),\n );\n const topNames = [...this.topLevelModules.keys()];\n return [...new Set([...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":["fs","path","crypto","os","hostname","join","resolve","readFileSync","fileURLToPath","path","Command","Option","resolve","sep","path","fs","yaml","docsUrl","Command","Option","Command","Option","Sandbox","Command","Command","Command","Option","Command","Option","__dirname","fileURLToPath","readFileSync","Command","Command","Option","durationMs","getAuditLogger","auditLogger","result","Sandbox","readFileSync","resolve","Command","Command"]}
|