alepha 0.20.2 → 0.20.4
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/README.md +0 -1
- package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui.css +1 -1
- package/dist/api/audits/index.browser.js +49 -0
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.js +49 -0
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +2 -61
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +4 -4
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.d.ts +1 -10
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/parameters/index.browser.js +37 -0
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +12 -68
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +57 -4
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/users/index.browser.js +6 -0
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +148 -227
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +60 -14
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +2 -1
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/bucket/index.d.ts +77 -107
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +153 -5
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +12 -2
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +26 -0
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +11 -1
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +11 -1
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +7 -5
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -3
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +637 -11660
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +707 -532
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +4 -8
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js +20 -16
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +51 -77
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +65 -15
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +10 -13
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js +30 -12
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.js +1 -1
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +27 -3
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +8 -11
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +27 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +27 -3
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +27 -3
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +69 -10
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +135 -13
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/smtp/index.js +130 -16
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +30 -2
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +35 -12
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.js +32 -1
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +238 -31
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +198 -67
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +2 -362
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +18 -409
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +41 -194
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +27 -422
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +17 -20
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +1 -5
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +17 -20
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/react/core/index.d.ts +102 -1
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +65 -1
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +6 -0
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +7 -7
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +7 -1
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +6 -0
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.js +22 -17
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +98 -4
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +58 -5
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +122 -6
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/{chunk-DBEY4PJZ.js → chunk-6Ep1yQYe.js} +1 -1
- package/dist/react/testing/index.js +1 -1
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/ui/index.d.ts +195 -1
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js +64 -1
- package/dist/react/ui/index.js.map +1 -1
- package/dist/react/websocket/index.js.map +1 -1
- package/dist/redis/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -2
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +1 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +1 -1
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +2 -2
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +24 -10
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js +10 -3
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +1 -4
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +47 -9
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.js +19 -1
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +4 -5
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.js.map +1 -1
- package/dist/websocket/index.browser.js +32 -5
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.d.ts +3 -1
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +42 -6
- package/dist/websocket/index.js.map +1 -1
- package/package.json +685 -274
- package/src/api/files/__tests__/FileController.spec.ts +1 -1
- package/src/api/jobs/__tests__/$job.spec.ts +5 -1
- package/src/api/parameters/services/ParameterProvider.ts +21 -4
- package/src/api/users/__tests__/SessionService.spec.ts +99 -0
- package/src/api/users/__tests__/UserJobs.spec.ts +67 -0
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +15 -0
- package/src/api/users/entities/sessions.ts +6 -0
- package/src/api/users/jobs/UserJobs.ts +44 -17
- package/src/api/users/providers/RealmProvider.ts +4 -0
- package/src/api/users/schemas/userQuerySchema.ts +0 -1
- package/src/api/users/services/SessionService.ts +27 -0
- package/src/api/users/services/UserService.ts +1 -5
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +14 -0
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +14 -0
- package/src/api/verifications/services/VerificationService.ts +1 -0
- package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +74 -0
- package/src/bucket/index.ts +19 -2
- package/src/bucket/primitives/$bucket.ts +9 -1
- package/src/bucket/providers/CloudflareR2Provider.ts +2 -137
- package/src/bucket/providers/NodeS3BucketProvider.ts +218 -0
- package/src/cache/core/index.ts +29 -0
- package/src/cache/core/primitives/$cache.ts +14 -1
- package/src/cli/config/defineConfig.ts +13 -15
- package/src/cli/core/__tests__/init.spec.ts +214 -7
- package/src/cli/core/commands/init.ts +12 -0
- package/src/cli/core/services/PackageManagerUtils.ts +23 -6
- package/src/cli/core/services/ProjectScaffolder.ts +315 -33
- package/src/cli/core/tasks/BuildCloudflareTask.ts +5 -0
- package/src/cli/core/tasks/BuildDockerTask.ts +9 -10
- package/src/cli/core/tasks/BuildServerTask.ts +8 -0
- package/src/cli/core/templates/agentMd.ts +2 -10
- package/src/cli/core/templates/apiIndexTs.ts +23 -1
- package/src/cli/core/templates/componentsJsonTs.ts +39 -0
- package/src/cli/core/templates/mainCss.ts +1 -0
- package/src/cli/core/templates/saasAdminLayoutTsx.ts +77 -0
- package/src/cli/core/templates/saasAdminPagesTsx.ts +26 -0
- package/src/cli/core/templates/saasAuthLayoutTsx.ts +20 -0
- package/src/cli/core/templates/saasAuthPagesTsx.ts +62 -0
- package/src/cli/core/templates/saasRealmProviderTs.ts +46 -0
- package/src/cli/core/templates/webAppRouterTs.ts +104 -1
- package/src/cli/core/templates/webIndexTs.ts +23 -1
- package/src/cli/devtools/index.ts +12 -26
- package/src/cli/platform/__tests__/SecretsCommand.spec.ts +2 -0
- package/src/cli/platform/index.ts +15 -24
- package/src/cli/vendor/atoms/vendorOptions.ts +1 -1
- package/src/cli/vendor/index.ts +14 -23
- package/src/command/providers/CliProvider.ts +1 -1
- package/src/core/Alepha.ts +11 -1
- package/src/core/helpers/ref.ts +18 -0
- package/src/core/index.shared.ts +1 -0
- package/src/core/interfaces/Service.ts +3 -1
- package/src/core/providers/SchemaValidator.ts +9 -1
- package/src/core/providers/TypeProvider.ts +2 -3
- package/src/datetime/REFACTORING.md +118 -0
- package/src/datetime/providers/DateTimeProvider.ts +203 -24
- package/src/lock/core/index.ts +31 -0
- package/src/lock/core/primitives/$lock.ts +14 -1
- package/src/logger/services/Logger.ts +1 -1
- package/src/mcp/__tests__/$resource.spec.ts +1 -1
- package/src/mcp/__tests__/$tool.spec.ts +1 -1
- package/src/mcp/__tests__/McpServerProvider.spec.ts +1 -1
- package/src/mcp/__tests__/jsonrpc.spec.ts +1 -1
- package/src/mcp/helpers/jsonrpc.ts +26 -1
- package/src/mcp/index.ts +10 -5
- package/src/mcp/interfaces/McpTypes.ts +83 -6
- package/src/mcp/primitives/$prompt.ts +18 -1
- package/src/mcp/primitives/$resource.ts +18 -1
- package/src/mcp/primitives/$tool.ts +83 -7
- package/src/mcp/providers/McpServerProvider.ts +74 -16
- package/src/mcp/transports/StreamableHttpMcpTransport.ts +226 -0
- package/src/orm/REFACTORING.md +330 -0
- package/src/orm/__tests__/$repository-tests.ts +1 -0
- package/src/orm/__tests__/orm-next-tests.ts +2 -67
- package/src/orm/__tests__/orm-next.spec.ts +0 -21
- package/src/orm/core/index.shared.ts +0 -2
- package/src/orm/core/index.ts +1 -2
- package/src/orm/core/primitives/$repository.ts +3 -6
- package/src/orm/core/primitives/$transactional.ts +11 -0
- package/src/orm/core/providers/drivers/DatabaseProvider.ts +0 -5
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +11 -13
- package/src/orm/core/schemas/updateSchema.ts +1 -1
- package/src/orm/core/services/ModelBuilder.ts +1 -13
- package/src/orm/core/services/PgRelationManager.ts +4 -2
- package/src/orm/core/services/Repository.ts +1 -42
- package/src/orm/core/services/SqliteModelBuilder.ts +2 -33
- package/src/orm/postgres/services/PostgresModelBuilder.ts +10 -45
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +86 -0
- package/src/react/core/hooks/useQuery.ts +153 -0
- package/src/react/core/index.ts +1 -0
- package/src/react/form/services/FormModel.ts +15 -6
- package/src/react/form/services/parseField.ts +8 -0
- package/src/react/i18n/providers/I18nProvider.ts +8 -2
- package/src/react/intro/components/GettingStartedAuthSlide.tsx +11 -4
- package/src/react/router/__tests__/$page.spec.tsx +0 -16
- package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +213 -2
- package/src/react/router/__tests__/ssr.spec.tsx +339 -0
- package/src/react/router/primitives/$page.ts +28 -4
- package/src/react/router/providers/ReactBrowserProvider.ts +73 -0
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +1 -1
- package/src/react/router/providers/ReactPageProvider.ts +27 -9
- package/src/react/router/providers/ReactPreloadProvider.ts +1 -1
- package/src/react/router/providers/ReactServerProvider.ts +1 -0
- package/src/react/ui/atoms/uiThemeListAtom.ts +36 -0
- package/src/react/ui/index.ts +6 -0
- package/src/react/ui/services/SchemaControl.ts +209 -0
- package/src/scheduler/providers/CronProvider.ts +1 -1
- package/src/security/primitives/$basicAuth.ts +1 -1
- package/src/security/primitives/$issuer.ts +6 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +5 -1
- package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +75 -0
- package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +306 -0
- package/src/server/core/errors/ValidationError.ts +13 -1
- package/src/server/core/interfaces/ServerRequest.ts +1 -0
- package/src/server/core/primitives/$action.ts +16 -5
- package/src/server/core/providers/ServerProvider.ts +1 -1
- package/src/server/core/providers/ServerRouterProvider.ts +28 -6
- package/src/server/core/services/HttpClient.ts +1 -1
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +6 -8
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +10 -4
- package/src/websocket/services/WebSocketClient.ts +11 -5
- package/src/mcp/transports/SseMcpTransport.ts +0 -182
- package/src/orm/core/__tests__/parseQueryString.spec.ts +0 -196
- package/src/orm/core/helpers/parseQueryString.ts +0 -502
- package/src/orm/core/primitives/$view.ts +0 -88
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["createPromptInterface","createPromptInterface"],"sources":["../../src/command/helpers/PrettyAsker.ts","../../src/command/helpers/Asker.ts","../../src/command/helpers/EnvUtils.ts","../../src/command/helpers/PrettyPrint.ts","../../src/command/errors/CommandError.ts","../../src/command/helpers/Runner.ts","../../src/command/primitives/$command.ts","../../src/command/providers/CliProvider.ts","../../src/command/index.ts"],"sourcesContent":["import { stdin, stdout } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport { $inject, Alepha, AlephaError, type TSchema } from \"alepha\";\nimport { ConsoleColorProvider } from \"alepha/logger\";\n\n/**\n * Clack-style interactive prompt renderer.\n *\n * Provides pretty enum selectors (arrow-key navigation),\n * text inputs, and confirm prompts with box-drawing framing.\n */\nexport class PrettyAsker {\n protected readonly alepha = $inject(Alepha);\n protected readonly color = $inject(ConsoleColorProvider);\n\n /**\n * Whether to use pretty mode.\n *\n * Same conditions as Runner.useDynamicLogger.\n */\n public get enabled(): boolean {\n if (this.alepha.isCI() || this.alepha.env.CLAUDECODE) {\n return false;\n }\n\n const logLevel = String(this.alepha.env.LOG_LEVEL || \"\").toLowerCase();\n if (logLevel === \"debug\" || logLevel === \"trace\") {\n return false;\n }\n\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // Framing\n // ---------------------------------------------------------------------------\n\n /**\n * Print the opening frame with a title.\n */\n public intro(title: string): void {\n const c = this.color;\n this.write(`\\n${c.set(\"DIM\", \"┌\")} ${c.set(\"BOLD\", title)}\\n`);\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n }\n\n /**\n * Print the closing frame with a message.\n */\n public outro(message: string): void {\n const c = this.color;\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.write(`${c.set(\"DIM\", \"└\")} ${message}\\n\\n`);\n }\n\n // ---------------------------------------------------------------------------\n // Select (arrow-key navigation)\n // ---------------------------------------------------------------------------\n\n /**\n * Arrow-key select prompt for enum schemas.\n */\n public async select(question: string, options: string[]): Promise<string> {\n let selectedIndex = 0;\n\n this.write(`${this.color.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(question);\n this.renderOptions(options, selectedIndex);\n\n return new Promise<string>((resolve, reject) => {\n const hasRawMode = typeof stdin.setRawMode === \"function\";\n if (!hasRawMode) {\n // Fallback: no raw mode (piped stdin, etc.)\n this.clearOptions(options.length);\n this.writeCompletedMarker(question);\n this.writeAnswer(options[0]);\n resolve(options[0]);\n return;\n }\n\n stdin.setRawMode(true);\n stdin.resume();\n\n const onKeypress = (data: Buffer) => {\n const key = data.toString();\n\n // Ctrl+C\n if (key === \"\\x03\") {\n cleanup();\n stdin.setRawMode(false);\n stdin.pause();\n reject(new AlephaError(\"Aborted.\"));\n return;\n }\n\n // Arrow up / k\n if (key === \"\\x1b[A\" || key === \"k\") {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n this.clearOptions(options.length);\n this.renderOptions(options, selectedIndex);\n return;\n }\n\n // Arrow down / j\n if (key === \"\\x1b[B\" || key === \"j\") {\n selectedIndex = (selectedIndex + 1) % options.length;\n this.clearOptions(options.length);\n this.renderOptions(options, selectedIndex);\n return;\n }\n\n // Enter\n if (key === \"\\r\" || key === \"\\n\") {\n cleanup();\n stdin.setRawMode(false);\n stdin.pause();\n\n // Clear options and replace with completed marker + answer\n this.clearOptions(options.length);\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(options[selectedIndex]);\n\n resolve(options[selectedIndex]);\n }\n };\n\n const cleanup = () => {\n stdin.removeListener(\"data\", onKeypress);\n };\n\n stdin.on(\"data\", onKeypress);\n });\n }\n\n // ---------------------------------------------------------------------------\n // Text input\n // ---------------------------------------------------------------------------\n\n /**\n * Text input prompt with clack framing.\n */\n public async text(question: string, schema?: TSchema): Promise<string> {\n const c = this.color;\n const defaultValue =\n schema && \"default\" in schema ? String(schema.default) : undefined;\n\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(question);\n\n const defaultHint = defaultValue\n ? ` ${c.set(\"DIM\", `(${defaultValue})`)}`\n : \"\";\n\n this.write(`${c.set(\"DIM\", \"│\")} ${c.set(\"DIM\", \">\")}${defaultHint} `);\n\n const rl = this.createPromptInterface();\n try {\n const answer = await rl.question(\"\");\n const value = answer.trim() || defaultValue || \"\";\n\n // Move up to overwrite the input line\n this.write(\"\\x1b[1A\\x1b[2K\");\n // Move up to overwrite the active marker\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(value);\n\n if (schema) {\n return this.alepha.codec.decode(schema, value || undefined) as string;\n }\n return value;\n } finally {\n rl.close();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Confirm (Y/n)\n // ---------------------------------------------------------------------------\n\n /**\n * Yes/No confirm prompt with clack framing.\n */\n public async confirm(question: string): Promise<boolean> {\n const c = this.color;\n\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(`${question} ${c.set(\"DIM\", \"(Y/n)\")}`);\n this.write(`${c.set(\"DIM\", \"│\")} ${c.set(\"DIM\", \">\")} `);\n\n const rl = this.createPromptInterface();\n try {\n const answer = await rl.question(\"\");\n const value = answer.trim().toLowerCase();\n const result = value !== \"n\" && value !== \"no\";\n\n // Move up to overwrite input\n this.write(\"\\x1b[1A\\x1b[2K\");\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(result ? \"Yes\" : \"No\");\n\n return result;\n } finally {\n rl.close();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Rendering helpers\n // ---------------------------------------------------------------------------\n\n protected renderOptions(options: string[], selectedIndex: number): void {\n const c = this.color;\n for (let i = 0; i < options.length; i++) {\n const isSelected = i === selectedIndex;\n const marker = isSelected\n ? `${c.set(\"CYAN\", \"❯\")} ${c.set(\"CYAN\", options[i])}`\n : ` ${c.set(\"DIM\", options[i])}`;\n this.write(`${c.set(\"DIM\", \"│\")} ${marker}\\n`);\n }\n }\n\n protected clearOptions(count: number): void {\n for (let i = 0; i < count; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n }\n\n protected writeActiveMarker(question: string): void {\n this.write(`${this.color.set(\"CYAN\", \"◆\")} ${question}\\n`);\n }\n\n protected clearActiveMarker(): void {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n\n protected writeCompletedMarker(question: string): void {\n this.write(`${this.color.set(\"DIM\", \"◇\")} ${question}\\n`);\n }\n\n protected writeAnswer(value: string): void {\n this.write(\n `${this.color.set(\"DIM\", \"│\")} ${this.color.set(\"DIM\", value)}\\n`,\n );\n }\n\n protected write(str: string): void {\n stdout.write(str);\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input: stdin, output: stdout });\n }\n}\n","import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport {\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n type TString,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { PrettyAsker } from \"./PrettyAsker.ts\";\n\nexport interface AskOptions<T extends TSchema = TString> {\n /**\n * Response schema expected.\n *\n * Recommended schemas:\n * - t.text() - for free text input\n * - t.number() - for numeric input\n * - t.boolean() - for yes/no input (accepts \"true\", \"false\", \"1\", \"0\")\n * - t.enum([\"option1\", \"option2\"]) - for predefined options\n *\n * You can use schema.default to provide a default value.\n *\n * @example\n * ```ts\n * ask(\"What is your name?\", { schema: t.text({ default: \"John Doe\" }) })\n * ```\n *\n * @default TString\n */\n schema?: T;\n\n /**\n * Custom validation function.\n * Throws an AlephaError in case of validation failure.\n */\n validate?: (value: Static<T>) => void;\n}\n\nexport interface AskMethod {\n <T extends TSchema = TString>(\n question: string,\n options?: AskOptions<T>,\n ): Promise<Static<T>>;\n\n permission: (question: string) => Promise<boolean>;\n intro: (title: string) => void;\n outro: (message: string) => void;\n}\n\nexport class Asker {\n protected readonly log = $logger();\n public readonly ask: AskMethod;\n protected readonly alepha = $inject(Alepha);\n protected readonly pretty = $inject(PrettyAsker);\n\n constructor() {\n this.ask = this.createAskMethod();\n }\n\n protected createAskMethod(): AskMethod {\n const askFn: AskMethod = async <T extends TSchema = TString>(\n question: string,\n options: AskOptions<T> = {},\n ) => {\n return await this.prompt<T>(question, options);\n };\n\n askFn.permission = async (question: string) => {\n if (this.pretty.enabled) {\n return this.pretty.confirm(question);\n }\n const response = await this.prompt(`${question} [Y/n]`, {\n schema: t.enum([\"Y\", \"y\", \"n\", \"no\", \"yes\"], { default: \"Y\" }),\n });\n return response.charAt(0).toLowerCase() === \"y\";\n };\n\n askFn.intro = (title: string) => {\n if (this.pretty.enabled) {\n this.pretty.intro(title);\n }\n };\n\n askFn.outro = (message: string) => {\n if (this.pretty.enabled) {\n this.pretty.outro(message);\n }\n };\n\n return askFn;\n }\n\n protected async prompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n if (this.pretty.enabled) {\n return this.prettyPrompt(question, options);\n }\n return this.plainPrompt(question, options);\n }\n\n /**\n * Pretty mode: delegate to PrettyAsker based on schema type.\n */\n protected async prettyPrompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const schema = options.schema as any;\n\n // Enum schema → arrow-key select\n if (schema?.enum && Array.isArray(schema.enum)) {\n const value = await this.pretty.select(question, schema.enum);\n if (options.validate) {\n options.validate(value as Static<T>);\n }\n return value as Static<T>;\n }\n\n // Text/other schema → text input\n const value = await this.pretty.text(question, schema);\n if (options.validate) {\n options.validate(value as Static<T>);\n }\n return value as Static<T>;\n }\n\n /**\n * Plain mode: readline-based prompts (CI, Claude Code, debug).\n */\n protected async plainPrompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const rl = this.createPromptInterface();\n let value: any;\n try {\n do {\n try {\n this.log.info(question);\n const answer = await rl.question(\"> \");\n if (options.schema) {\n value = this.alepha.codec.decode(\n options.schema,\n answer ? answer.trim() : undefined,\n );\n } else {\n value = String(answer.trim());\n }\n if (options.validate) {\n options.validate(value);\n }\n } catch (error) {\n if (error instanceof AlephaError) {\n this.log.error(`${error.message}\\n`);\n value = undefined;\n } else {\n throw error;\n }\n }\n } while (value === undefined);\n } finally {\n rl.close();\n }\n\n return value;\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input, output });\n }\n}\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { FileSystemProvider } from \"alepha/system\";\n\nexport class EnvUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Load environment variables from .env files into process.env.\n *\n * Variables that already exist in process.env are NOT overwritten,\n * matching the standard dotenv convention where the shell environment\n * takes precedence over .env file values.\n *\n * By default, it loads from \".env\" and \".env.local\".\n * You can specify additional files to load, e.g. [\".env\", \".env.production\"].\n */\n public async loadEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<void> {\n const vars = await this.parseEnv(root, files);\n for (const [key, value] of Object.entries(vars)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n }\n\n /**\n * Parse environment variables from .env files without mutating process.env.\n *\n * Returns a merged record from all files (later files override earlier ones).\n * For each file, also tries the `.local` variant (e.g. `.env.production.local`).\n */\n public async parseEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n\n for (const it of files) {\n for (const file of [it, `${it}.local`]) {\n const envPath = this.fs.join(root, file);\n try {\n const buffer = await this.fs.readFile(envPath);\n const envContent = buffer.toString(\"utf8\");\n for (const line of envContent.split(\"\\n\")) {\n const [key, ...rest] = line.split(\"=\");\n if (key) {\n const trimmedKey = key.trim();\n if (trimmedKey && !trimmedKey.startsWith(\"#\")) {\n let value = rest.join(\"=\").trim();\n // Strip matching surrounding quotes (single or double)\n if (\n value.length >= 2 &&\n ((value[0] === '\"' && value[value.length - 1] === '\"') ||\n (value[0] === \"'\" && value[value.length - 1] === \"'\"))\n ) {\n value = value.slice(1, -1);\n }\n result[trimmedKey] = value;\n }\n }\n }\n this.log.debug(`Parsed environment variables from ${envPath}`);\n } catch {\n this.log.debug(`No ${file} file found at ${envPath}, skipping.`);\n }\n }\n }\n\n return result;\n }\n}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Interval } from \"alepha/datetime\";\n\nexport class PrettyPrint {\n protected dateTimeProvider = $inject(DateTimeProvider);\n protected spinnerInterval?: Interval;\n protected readonly frames = [\n \"⠋\",\n \"⠙\",\n \"⠹\",\n \"⠸\",\n \"⠼\",\n \"⠴\",\n \"⠦\",\n \"⠧\",\n \"⠇\",\n \"⠏\",\n ];\n protected tasks = new Map<\n string,\n {\n taskName: string;\n frameIndex: number;\n status: \"running\" | \"success\" | \"error\";\n startTime: number;\n duration?: string;\n message?: string;\n }\n >();\n protected lastLineCount = 0;\n protected header?: string;\n protected commandStartTime?: number;\n protected paused = false;\n\n // stdout interception\n protected originalStdoutWrite?: (...args: any[]) => boolean;\n protected bufferedOutput: string[] = [];\n protected isOwnWrite = false;\n\n // ANSI color codes\n protected readonly colors = {\n reset: \"\\x1b[0m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n dim: \"\\x1b[2m\",\n };\n\n /**\n * Start a new command session with header\n */\n public startCommand(cliName: string, commandName: string): void {\n this.header = commandName ? `${cliName} ${commandName}` : cliName;\n this.commandStartTime = this.dateTimeProvider.nowMillis();\n this.tasks.clear();\n this.lastLineCount = 0;\n this.write(`┌─ ${this.header}\\n`);\n }\n\n /**\n * End the command session with footer\n */\n public endCommand(): void {\n this.restoreStdout();\n if (this.commandStartTime) {\n const totalDuration = (\n (this.dateTimeProvider.nowMillis() - this.commandStartTime) /\n 1000\n ).toFixed(1);\n this.write(`└─ Done in ${totalDuration}s\\n`);\n }\n this.header = undefined;\n this.commandStartTime = undefined;\n }\n\n /**\n * Start an animated spinner with a task name\n */\n public startSpinner(id: string, taskName: string): void {\n this.tasks.set(id, {\n taskName,\n frameIndex: 0,\n status: \"running\",\n startTime: this.dateTimeProvider.nowMillis(),\n });\n\n this.interceptStdout();\n\n // Start interval if not already running\n if (!this.spinnerInterval) {\n this.spinnerInterval = this.dateTimeProvider.createInterval(\n () => this.updateDisplay(),\n 80,\n true,\n );\n }\n\n this.updateDisplay();\n }\n\n /**\n * Stop the spinner and show success with a tick\n */\n public success(\n id: string,\n taskName?: string,\n duration?: string,\n message?: string,\n ): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"success\";\n if (taskName) task.taskName = taskName;\n if (duration) task.duration = duration;\n if (message) task.message = message;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n }\n\n /**\n * Stop the spinner and show error with a cross\n */\n public error(id: string, taskName?: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"error\";\n if (taskName) task.taskName = taskName;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n this.restoreStdout();\n }\n\n /**\n * Update the display for all tasks\n */\n protected updateDisplay(): void {\n // Clear previous spinner lines\n if (this.lastLineCount > 0) {\n for (let i = 0; i < this.lastLineCount; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n }\n\n // Flush buffered external output (appears permanently above spinner)\n if (this.bufferedOutput.length > 0) {\n for (const chunk of this.bufferedOutput) {\n this.write(chunk);\n }\n this.bufferedOutput = [];\n }\n\n // Render all tasks\n const taskArray = Array.from(this.tasks.values());\n const prefix = this.header ? \"│ \" : \"\";\n\n for (const task of taskArray) {\n let line = prefix;\n\n if (task.status === \"running\") {\n const frame = this.frames[task.frameIndex];\n const elapsed = String(\n Math.floor(\n (this.dateTimeProvider.nowMillis() - task.startTime) / 100,\n ) / 10,\n ).padEnd(3, \".0\");\n line += `${this.colors.cyan}${frame}${this.colors.reset} ${this.colors.dim}${task.taskName}${this.colors.reset} ${this.colors.dim}${elapsed}s${this.colors.reset}`;\n task.frameIndex = (task.frameIndex + 1) % this.frames.length;\n } else if (task.status === \"success\") {\n const durationStr = task.duration\n ? ` ${this.colors.dim}${task.duration}${this.colors.reset}`\n : \"\";\n const messageStr = task.message ? ` - ${task.message}` : \"\";\n line += `${this.colors.green}✓${this.colors.reset} ${task.taskName}${durationStr}${messageStr}`;\n } else if (task.status === \"error\") {\n line += `${this.colors.red}✗${this.colors.reset} ${task.taskName}`;\n }\n\n this.write(`${line}\\n`);\n }\n\n this.lastLineCount = taskArray.length;\n }\n\n /**\n * Check if all tasks are done and stop the interval\n */\n protected checkIfAllDone(): void {\n const hasRunningTasks = Array.from(this.tasks.values()).some(\n (task) => task.status === \"running\",\n );\n\n if (!hasRunningTasks && this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Pause the spinner animation and restore stdout so external processes\n * (e.g. interactive login) can write to the terminal directly.\n */\n public pause(): void {\n if (this.paused) return;\n this.paused = true;\n\n // Stop the animation interval\n this.stopSpinner();\n\n // Clear spinner lines from screen so external output starts clean\n if (this.lastLineCount > 0) {\n for (let i = 0; i < this.lastLineCount; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n this.lastLineCount = 0;\n }\n\n // Close the box before external output\n if (this.header) {\n this.write(\"└───\\n\\n\");\n }\n\n this.restoreStdout();\n }\n\n /**\n * Resume the spinner animation after a pause.\n */\n public resume(): void {\n if (!this.paused) return;\n this.paused = false;\n\n // Reopen the box after external output\n if (this.header) {\n this.write(\"\\n┌───\\n\");\n }\n\n this.interceptStdout();\n\n const hasRunningTasks = Array.from(this.tasks.values()).some(\n (task) => task.status === \"running\",\n );\n\n if (hasRunningTasks) {\n this.updateDisplay();\n\n if (!this.spinnerInterval) {\n this.spinnerInterval = this.dateTimeProvider.createInterval(\n () => this.updateDisplay(),\n 80,\n true,\n );\n }\n }\n }\n\n /**\n * Stop the spinner without showing any symbol\n */\n public stopSpinner(): void {\n if (this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Clear all tasks\n */\n public clear(): void {\n this.tasks.clear();\n this.stopSpinner();\n this.restoreStdout();\n this.lastLineCount = 0;\n }\n\n // ---------------------------------------------------------------------------\n // stdout interception\n // ---------------------------------------------------------------------------\n\n /**\n * Intercept process.stdout.write so external writes (logs, wrangler output)\n * are buffered instead of breaking the spinner animation. Buffered output is\n * flushed above the spinner area on each redraw.\n */\n protected interceptStdout(): void {\n if (this.originalStdoutWrite) return;\n\n const original = process.stdout.write.bind(process.stdout);\n this.originalStdoutWrite = original;\n\n process.stdout.write = ((\n chunk: any,\n encodingOrCb?: any,\n cb?: any,\n ): boolean => {\n if (this.isOwnWrite) {\n return original(chunk, encodingOrCb, cb);\n }\n this.bufferedOutput.push(String(chunk));\n return true;\n }) as typeof process.stdout.write;\n }\n\n /**\n * Restore the original process.stdout.write and flush remaining buffer.\n */\n protected restoreStdout(): void {\n if (!this.originalStdoutWrite) return;\n\n const original = this.originalStdoutWrite;\n this.originalStdoutWrite = undefined;\n process.stdout.write = original as typeof process.stdout.write;\n\n for (const chunk of this.bufferedOutput) {\n original(chunk);\n }\n this.bufferedOutput = [];\n }\n\n /**\n * Write to stdout bypassing the intercept.\n */\n protected write(str: string): void {\n this.isOwnWrite = true;\n process.stdout.write(str);\n this.isOwnWrite = false;\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class CommandError extends AlephaError {\n readonly name = \"CommandError\";\n}\n","import { cp, glob, rm } from \"node:fs/promises\";\nimport { $inject, Alepha } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { ShellProvider } from \"alepha/system\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { PrettyPrint } from \"./PrettyPrint.ts\";\n\nexport type Task = {\n name: string;\n handler: () => any;\n};\n\ninterface Timer {\n name: string;\n duration: string;\n}\n\nexport interface RunOptions {\n /**\n * Rename the command for logging purposes.\n */\n alias?: string;\n\n /**\n * Root directory to execute the command in.\n */\n root?: string;\n}\n\nexport interface RunnerMethod {\n (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ): Promise<string>;\n rm: (glob: string | string[], options?: RunOptions) => Promise<string>;\n cp: (source: string, dest: string, options?: RunOptions) => Promise<string>;\n\n /**\n * Ends the runner and prints a summary of executed tasks.\n *\n * > This is automatically called at the end of command execution.\n * > But can be called manually if needed to print more stuff before the command ends.\n */\n end: () => void;\n\n /**\n * Pause the spinner so external processes can write to stdout directly.\n */\n pause: () => void;\n\n /**\n * Resume the spinner after a pause.\n */\n resume: () => void;\n}\n\nexport class Runner {\n protected readonly log = $logger();\n protected readonly dateTime = $inject(DateTimeProvider);\n protected timers: Timer[] = [];\n protected readonly startTime: number = this.dateTime.nowMillis();\n protected readonly prettyPrint = $inject(PrettyPrint);\n protected readonly alepha = $inject(Alepha);\n protected readonly shell = $inject(ShellProvider);\n public readonly run: RunnerMethod;\n protected cliName = \"\";\n protected commandName = \"\";\n protected firstTaskStarted = false;\n protected taskCounter = 0;\n\n constructor() {\n this.run = this.createRunMethod();\n }\n\n public get useDynamicLogger() {\n if (this.alepha.isCI() || this.alepha.env.CLAUDECODE) {\n return false;\n }\n\n const logLevel = String(this.alepha.env.LOG_LEVEL || \"\").toLowerCase();\n if (logLevel === \"debug\" || logLevel === \"trace\") {\n return false;\n }\n\n return this.alepha.env.LOG_FORMAT === \"raw\";\n }\n\n /**\n * Start a new command session with header (for pretty print mode)\n */\n public startCommand(cliName: string, commandName: string): void {\n this.cliName = cliName;\n this.commandName = commandName;\n this.firstTaskStarted = false;\n this.taskCounter = 0;\n }\n\n protected createRunMethod() {\n const runFn: RunnerMethod = async (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ) => {\n if (this.useDynamicLogger && !this.firstTaskStarted) {\n this.prettyPrint.startCommand(this.cliName, this.commandName);\n }\n\n this.firstTaskStarted = true;\n\n const root =\n typeof options === \"object\" && options.root ? options.root : undefined;\n\n if (Array.isArray(cmd)) {\n return await this.execute(\n cmd.map((it) =>\n typeof it === \"string\"\n ? { name: it, handler: () => this.exec(it, { root }) }\n : it,\n ),\n );\n }\n\n const alias = typeof options === \"object\" ? options.alias : undefined;\n const name = alias ?? (typeof cmd === \"string\" ? cmd : cmd.name);\n const handler =\n typeof options === \"function\"\n ? options\n : typeof cmd === \"string\"\n ? () => this.exec(cmd, { root })\n : cmd.handler;\n\n return await this.execute({\n name,\n handler,\n });\n };\n\n runFn.rm = async (\n files: string | string[],\n options: RunOptions = {},\n ): Promise<string> => {\n if (Array.isArray(files) || files.includes(\"*\")) {\n return runFn({\n name:\n options.alias ??\n `rm -rf ${Array.isArray(files) ? files.join(\" \") : files}`,\n handler: async () => {\n for await (const file of glob(files)) {\n this.log.trace(`Removing ${file}`);\n await rm(file, { recursive: true, force: true });\n }\n },\n });\n }\n this.log.trace(`Removing ${files}`);\n return runFn({\n name: options.alias ?? `rm -rf ${files}`,\n handler: () => rm(files, { recursive: true, force: true }),\n });\n };\n\n runFn.cp = async (\n source: string,\n dist: string,\n options: RunOptions = {},\n ): Promise<string> => {\n this.log.trace(`Copying ${source} to ${dist}`);\n return runFn(\n {\n name: options.alias ?? `cp -r ${source} ${dist}`,\n handler: () => cp(source, dist, { recursive: true }),\n },\n options,\n );\n };\n\n runFn.end = () => this.end();\n runFn.pause = () => {\n if (this.useDynamicLogger) this.prettyPrint.pause();\n };\n runFn.resume = () => {\n if (this.useDynamicLogger) this.prettyPrint.resume();\n };\n\n return runFn;\n }\n\n protected async exec(\n cmd: string,\n opts: { root?: string } = {},\n ): Promise<string> {\n return this.shell.run(cmd, { root: opts.root, capture: true });\n }\n\n /**\n * Executes one or more tasks.\n *\n * @param task - A single task or an array of tasks to run in parallel.\n */\n protected async execute(task: Task | Task[]): Promise<string> {\n if (Array.isArray(task)) {\n await Promise.all(task.map((t) => this.executeTask(t)));\n return \"\"; // not supported for now\n } else {\n return await this.executeTask(task);\n }\n }\n\n /**\n * Prints a summary of all executed tasks and their durations.\n */\n public end(): void {\n if (this.useDynamicLogger && this.firstTaskStarted) {\n this.prettyPrint.endCommand();\n return;\n }\n\n // Non-dynamic mode: use logging\n if (this.timers.length === 0) return;\n\n this.log.info(\"\");\n const totalTime = (\n (this.dateTime.nowMillis() - this.startTime) /\n 1000\n ).toFixed(1);\n this.log.info(`Total time: ${totalTime}s`);\n this.log.info(``);\n\n // clear timers after rendering\n this.timers = [];\n }\n\n protected async executeTask(task: Task): Promise<string> {\n const now = this.dateTime.nowMillis();\n const taskId = `task-${++this.taskCounter}`; // Use unique counter-based ID\n\n // Setup dynamic logger\n if (this.useDynamicLogger) {\n this.prettyPrint.startSpinner(taskId, task.name);\n } else {\n this.log.info(`Starting '${task.name}' ...`);\n }\n\n let stdout = \"\";\n\n try {\n stdout = String((await task.handler()) ?? \"\");\n } catch (error) {\n // Clear spinner and show error\n if (this.useDynamicLogger) {\n this.prettyPrint.error(taskId, task.name);\n }\n if (error instanceof Error && \"stdout\" in error) {\n this.log.info(`\\n\\n${error.stdout}`);\n }\n throw new CommandError(`Task '${task.name}' failed`, { cause: error });\n }\n\n if (stdout) this.log.trace(stdout);\n\n const duration = ((this.dateTime.nowMillis() - now) / 1000).toFixed(1);\n\n const message =\n stdout && !stdout.includes(\"\\n\") ? stdout.trim() : undefined;\n\n // Clear spinner and show completion\n if (this.useDynamicLogger) {\n this.prettyPrint.success(taskId, task.name, `${duration}s`, message);\n } else {\n const suffix = message ? ` - ${message}` : \"\";\n this.log.info(`Finished '${task.name}' after ${duration}s${suffix}`);\n }\n\n this.timers.push({\n name: task.name,\n duration: `${duration}s`,\n });\n\n return stdout;\n }\n\n protected renderTable(data: string[][]): void {\n if (data.length === 0) return;\n\n const col1Width = Math.max(...data.map(([col1]) => col1.length), 7);\n const col2Width = Math.max(...data.map(([, col2]) => col2.length), 8);\n\n const divider = `+${\"-\".repeat(col1Width + 2)}+${\"-\".repeat(\n col2Width + 2,\n )}+`;\n this.log.info(divider);\n this.log.info(\n `| ${\"Command\".padEnd(col1Width)} | ${\"Duration\".padEnd(col2Width)} |`,\n );\n this.log.info(divider);\n for (const [col1, col2] of data) {\n this.log.info(\n `| ${col1.padEnd(col1Width)} | ${col2.padEnd(col2Width)} |`,\n );\n }\n this.log.info(divider);\n }\n}\n","import type * as fs from \"node:fs/promises\";\nimport type { glob } from \"node:fs/promises\";\nimport {\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n type TSchema,\n t,\n} from \"alepha\";\nimport type { AskMethod } from \"../helpers/Asker.ts\";\nimport type { RunnerMethod } from \"../helpers/Runner.ts\";\n\n/**\n * Declares a CLI command.\n *\n * This primitive allows you to define a command, its flags, and its handler\n * within your Alepha application structure.\n */\nexport const $command = <\n T extends TObject,\n A extends TSchema,\n E extends TObject,\n>(\n options: CommandPrimitiveOptions<T, A, E>,\n) => createPrimitive(CommandPrimitive<T, A, E>, options);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandPrimitiveOptions<\n T extends TObject,\n A extends TSchema,\n E extends TObject = TObject,\n> {\n /**\n * The handler function to execute when the command is matched.\n *\n * For parent commands with children, the handler is called when:\n * - The parent command is invoked without a subcommand\n * - The parent command is invoked with --help (to show available subcommands)\n */\n handler: (args: CommandHandlerArgs<T, A, E>) => Async<void>;\n\n /**\n * The name of the command. If omitted, the property key is used.\n *\n * An empty string \"\" denotes the root command.\n */\n name?: string;\n\n /**\n * A short description of the command, shown in the help message.\n */\n description?: string;\n\n /**\n * An array of alternative names for the command.\n */\n aliases?: string[];\n\n /**\n * A TypeBox object schema defining the flags for the command.\n */\n flags?: T;\n\n /**\n * A TypeBox object schema defining required environment variables.\n *\n * Environment variables are validated before the handler runs (fail fast).\n * They are displayed in the help output under \"Env:\" section.\n *\n * @example\n * ```ts\n * $command({\n * env: t.object({\n * VERCEL_TOKEN: t.text({ description: \"Vercel API token\" }),\n * VERCEL_ORG_ID: t.optional(t.text({ description: \"Organization ID\" })),\n * }),\n * handler: async ({ env }) => {\n * // env.VERCEL_TOKEN is typed & guaranteed to exist\n * console.log(env.VERCEL_TOKEN);\n * }\n * })\n * ```\n */\n env?: E;\n\n /**\n * An optional TypeBox schema defining the arguments for the command.\n *\n * @example\n * args: t.text()\n * my-cli command <arg1: string>\n *\n * args: t.optional(t.text())\n * my-cli command [arg1: string]\n *\n * args: t.tuple([t.text(), t.number()])\n * my-cli command <arg1: string> <arg2: number>\n *\n * args: t.tuple([t.text(), t.optional(t.number())])\n * my-cli command <arg1: string> [arg2: number]\n */\n args?: A;\n\n /**\n * Marks this command as the root command.\n * Equivalent to setting name to an empty string \"\".\n */\n root?: boolean;\n\n /**\n * Run this command's handler BEFORE the specified target command.\n *\n * Pre-hooks are not listed in help and cannot be called directly.\n * They receive the same parsed flags and args as the target command.\n *\n * @example\n * ```ts\n * class BuildCommands {\n * prebuild = $command({\n * pre: \"build\",\n * handler: async ({ run }) => {\n * await run(\"cleaning dist folder...\", () => fs.rm(\"dist\"));\n * }\n * });\n *\n * build = $command({\n * name: \"build\",\n * handler: async () => { ... }\n * });\n * }\n * ```\n */\n pre?: string;\n\n /**\n * Run this command's handler AFTER the specified target command.\n *\n * Post-hooks are not listed in help and cannot be called directly.\n * They receive the same parsed flags and args as the target command.\n *\n * @example\n * ```ts\n * class BuildCommands {\n * build = $command({\n * name: \"build\",\n * handler: async () => { ... }\n * });\n *\n * postbuild = $command({\n * post: \"build\",\n * handler: async ({ run }) => {\n * await run(\"generating checksums...\", generateChecksums);\n * }\n * });\n * }\n * ```\n */\n post?: string;\n\n /**\n * If true, this command will be hidden from the help output.\n */\n hide?: boolean;\n\n /**\n * Adds a `--mode, -m` flag to load environment files.\n *\n * When enabled:\n * - Loads `.env` and `.env.local` by default\n * - With `--mode production`, also loads `.env.production` and `.env.production.local`\n * - The mode value is exposed in the handler as `mode: string | undefined`\n *\n * Set to `true` to enable with no default, or a string to set a default mode.\n *\n * This follows Vite's environment loading convention.\n * @see https://vite.dev/guide/env-and-mode\n *\n * @example\n * ```ts\n * // No default mode\n * build = $command({\n * mode: true,\n * handler: async ({ mode }) => {\n * console.log(`Building for ${mode ?? 'development'}...`);\n * }\n * });\n *\n * // Default mode \"production\"\n * deploy = $command({\n * mode: \"production\",\n * handler: async ({ mode }) => {\n * console.log(`Deploying for ${mode}...`); // always defined\n * }\n * });\n * ```\n *\n * Usage:\n * - `cli build` - loads .env (mode = undefined)\n * - `cli build --mode production` - loads .env and .env.production\n * - `cli deploy` - loads .env and .env.production (default mode)\n * - `cli deploy --mode staging` - loads .env and .env.staging\n */\n mode?: boolean | string;\n\n /**\n * Child commands (subcommands) for this command.\n *\n * When children are defined, the command becomes a parent command that\n * can be invoked with space-separated subcommands:\n *\n * @example\n * ```ts\n * class DeployCommands {\n * // Subcommands\n * vercel = $command({\n * description: \"Deploy to Vercel\",\n * handler: async () => { ... }\n * });\n *\n * cloudflare = $command({\n * description: \"Deploy to Cloudflare\",\n * handler: async () => { ... }\n * });\n *\n * // Parent command with children\n * deploy = $command({\n * description: \"Deploy the application\",\n * children: [this.vercel, this.cloudflare],\n * handler: async () => {\n * // Called when \"deploy\" is invoked without subcommand\n * console.log(\"Available: deploy vercel, deploy cloudflare\");\n * }\n * });\n * }\n * ```\n *\n * This allows CLI usage like:\n * - `cli deploy vercel` - runs the vercel subcommand\n * - `cli deploy cloudflare` - runs the cloudflare subcommand\n * - `cli deploy` - runs the parent handler (shows available subcommands)\n * - `cli deploy --help` - shows help with all available subcommands\n */\n children?: CommandPrimitive<any, any>[];\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class CommandPrimitive<\n T extends TObject = TObject,\n A extends TSchema = TSchema,\n E extends TObject = TObject,\n> extends Primitive<CommandPrimitiveOptions<T, A, E>> {\n public readonly flags = this.options.flags ?? t.object({});\n public readonly env = this.options.env ?? t.object({});\n public readonly aliases = this.options.aliases ?? [];\n\n protected onInit() {\n if (this.options.pre || this.options.post) {\n this.options.hide ??= true;\n }\n }\n\n public get name(): string {\n if (this.options.root) {\n return \"\";\n }\n if (this.options.pre) {\n return `pre${this.options.pre}`;\n }\n if (this.options.post) {\n return `post${this.options.post}`;\n }\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n\n /**\n * Get the child commands (subcommands) for this command.\n */\n public get children(): CommandPrimitive<any, any>[] {\n return this.options.children ?? [];\n }\n\n /**\n * Check if this command has child commands (is a parent command).\n */\n public get hasChildren(): boolean {\n return this.children.length > 0;\n }\n\n /**\n * Find a child command by name or alias.\n */\n public findChild(name: string): CommandPrimitive<any, any> | undefined {\n return this.children.find(\n (child) => child.name === name || child.aliases.includes(name),\n );\n }\n}\n\n$command[KIND] = CommandPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandHandlerArgs<\n T extends TObject,\n A extends TSchema = TSchema,\n E extends TObject = TObject,\n> {\n flags: Static<T>;\n args: A extends TSchema ? Static<A> : Array<string>;\n env: Static<E>;\n run: RunnerMethod;\n ask: AskMethod;\n glob: typeof glob;\n fs: typeof fs;\n\n /**\n * The root directory where the command is executed.\n */\n root: string;\n\n /**\n * Display help for the current command.\n *\n * Useful for parent commands with children to show available subcommands\n * when invoked without a specific subcommand.\n *\n * @example\n * ```ts\n * deploy = $command({\n * children: [this.vercel, this.cloudflare],\n * handler: async ({ help }) => {\n * help(); // Shows available subcommands\n * }\n * });\n * ```\n */\n help: () => void;\n\n /**\n * The current execution mode (e.g., \"development\", \"production\", \"staging\").\n *\n * Use --mode flag to set this value when running the command.\n */\n mode?: string;\n}\n","import * as fs from \"node:fs/promises\";\nimport { glob } from \"node:fs/promises\";\nimport {\n $atom,\n $env,\n $hook,\n $inject,\n $state,\n Alepha,\n type Static,\n type TObject,\n type TSchema,\n type TUnion,\n TypeBoxError,\n t,\n} from \"alepha\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { Asker } from \"../helpers/Asker.ts\";\nimport { EnvUtils } from \"../helpers/EnvUtils.ts\";\nimport { Runner } from \"../helpers/Runner.ts\";\nimport {\n $command,\n type CommandHandlerArgs,\n type CommandPrimitive,\n} from \"../primitives/$command.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n CLI_NAME: t.text({\n default: \"cli\",\n description: \"Name of the CLI application.\",\n }),\n CLI_DESCRIPTION: t.text({\n default: \"\",\n description: \"Description of the CLI application.\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * CLI provider configuration atom\n */\nexport const cliOptions = $atom({\n name: \"alepha.command.cli.options\",\n schema: t.object({\n name: t.optional(\n t.string({\n description: \"Name of the CLI application.\",\n }),\n ),\n description: t.optional(\n t.string({\n description: \"Description of the CLI application.\",\n }),\n ),\n argv: t.optional(\n t.array(t.string(), {\n description: \"Command line arguments to parse.\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type CliProviderOptions = Static<typeof cliOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [cliOptions.key]: CliProviderOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * CLI provider for parsing and executing commands.\n *\n * Handles:\n * - Command resolution (simple, nested, colon-notation)\n * - Flag and argument parsing\n * - Environment variable validation\n * - Help generation\n * - Pre/post command hooks\n *\n * @example\n * ```typescript\n * // Define a command\n * class MyCommands {\n * build = $command({\n * name: \"build\",\n * description: \"Build the project\",\n * flags: t.object({ watch: t.optional(t.boolean()) }),\n * handler: async ({ flags }) => { ... }\n * });\n * }\n *\n * // CLI automatically discovers and executes commands\n * const alepha = Alepha.create().with(MyCommands);\n * ```\n */\nexport class CliProvider {\n // ─────────────────────────────────────────────────────────────────────────────\n // Dependencies\n // ─────────────────────────────────────────────────────────────────────────────\n\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly color = $inject(ConsoleColorProvider);\n protected readonly runner = $inject(Runner);\n protected readonly asker = $inject(Asker);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly options = $state(cliOptions);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Configuration\n // ─────────────────────────────────────────────────────────────────────────────\n\n protected get name(): string {\n return this.options.name || this.env.CLI_NAME;\n }\n\n protected get description(): string {\n return this.options.description || this.env.CLI_DESCRIPTION;\n }\n\n protected get argv(): string[] {\n return (\n this.options.argv ||\n (typeof process !== \"undefined\" ? process.argv.slice(2) : [])\n );\n }\n\n /**\n * Global flags available to all commands.\n */\n protected readonly globalFlags = {\n help: {\n aliases: [\"h\", \"help\"],\n description: \"Show this help message\",\n schema: t.boolean(),\n },\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Main entry point - resolves and executes the command from process.argv.\n * This is the production execution path with full lifecycle support.\n */\n protected readonly onReady = $hook({\n on: \"ready\",\n handler: async () => {\n const argv = [...this.argv];\n\n // Extract positional arguments (potential command path)\n const positionalArgs = argv.filter((arg) => !arg.startsWith(\"-\"));\n\n // Resolve command using space-separated or colon-notation\n const { command, consumedArgs } = this.resolveCommand(positionalArgs);\n\n const globalFlags = this.parseFlags(\n argv,\n Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n { strict: false }, // Don't throw for command-specific flags\n );\n\n if (globalFlags.help) {\n this.printHelp(command);\n return;\n }\n\n if (!command) {\n // Check if there's a root command (name === \"\")\n const rootCommand = this.findCommand(\"\");\n\n // If we have positional args but no matching command, show error\n const commandName = positionalArgs[0] ?? \"\";\n if (commandName !== \"\" && !rootCommand?.options.args) {\n this.log.error(`Unknown command: '${commandName}'`);\n this.printHelp();\n return;\n }\n\n // Execute root command if it exists\n if (rootCommand) {\n await this.executeCommand(rootCommand, argv, true);\n return;\n }\n\n // No command found and no root command\n return;\n }\n\n // Remove consumed command path args from argv for argument parsing\n const remainingArgv = this.removeConsumedArgs(argv, consumedArgs);\n\n // Since we've removed the command path, treat it like a root command for parsing\n await this.executeCommand(command, remainingArgv, true);\n },\n });\n\n /**\n * Execute a command with full lifecycle support.\n *\n * This is the production execution path that includes:\n * - Mode-based .env file loading\n * - Pre/post command hooks\n * - Runner session for pretty CLI output\n * - Alepha context wrapper for proper scoping\n *\n * @see run() for a lightweight test-only alternative\n */\n protected async executeCommand(\n command: CommandPrimitive<TObject>,\n argv: string[],\n isRootCommand: boolean,\n ): Promise<void> {\n const root = process.cwd();\n\n // Handle --mode flag if command has mode option enabled\n let modeValue: string | undefined;\n if (command.options.mode) {\n modeValue = this.parseModeFlag(argv);\n // Use default mode if not provided and mode is a string\n if (modeValue === undefined && typeof command.options.mode === \"string\") {\n modeValue = command.options.mode;\n }\n await this.loadModeEnv(root, modeValue);\n }\n\n const commandFlags = this.parseCommandFlags(argv, command.flags, {\n modeEnabled: !!command.options.mode,\n });\n const commandArgs = this.parseCommandArgs(\n argv,\n command.options.args,\n isRootCommand,\n command.flags,\n );\n const commandEnv = this.parseCommandEnv(command.env, command.name);\n\n await this.alepha.context.run(async () => {\n this.log.debug(`Executing command '${command.name}'...`, {\n flags: commandFlags,\n args: commandArgs,\n mode: modeValue,\n });\n\n const runner = this.runner;\n\n // Start command session for pretty print\n runner.startCommand(this.name, command.name);\n\n const args = {\n flags: commandFlags,\n args: commandArgs,\n env: commandEnv,\n run: runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root,\n help: () => this.printHelp(command),\n mode: modeValue,\n };\n\n // Execute pre-hooks\n const preHooks = this.findPreHooks(command.name);\n for (const hook of preHooks) {\n this.log.debug(`Executing pre-hook for '${command.name}'...`);\n await hook.options.handler(args as CommandHandlerArgs<TObject>);\n }\n\n // Execute main command\n await command.options.handler(args as CommandHandlerArgs<TObject>);\n\n // Execute post-hooks\n const postHooks = this.findPostHooks(command.name);\n for (const hook of postHooks) {\n this.log.debug(`Executing post-hook for '${command.name}'...`);\n await hook.options.handler(args as CommandHandlerArgs<TObject>);\n }\n\n runner.end();\n\n this.log.debug(`Command '${command.name}' executed successfully.`);\n });\n }\n\n /**\n * Remove consumed command path arguments from argv (keeps flags and remaining args).\n */\n protected removeConsumedArgs(\n argv: string[],\n consumedArgs: string[],\n ): string[] {\n const result: string[] = [];\n let consumedIndex = 0;\n\n for (const arg of argv) {\n if (arg.startsWith(\"-\")) {\n result.push(arg);\n } else if (\n consumedIndex < consumedArgs.length &&\n arg === consumedArgs[consumedIndex]\n ) {\n consumedIndex++;\n // Skip this arg, it's part of the command path\n } else {\n result.push(arg);\n }\n }\n\n return result;\n }\n\n /**\n * Resolve a command from positional arguments.\n *\n * Supports:\n * 1. Space-separated subcommands: `deploy vercel` -> finds deploy command, then vercel child\n * 2. Colon notation (backwards compat): `deploy:vercel` -> finds command with name \"deploy:vercel\"\n * 3. Simple commands: `build` -> finds command with name \"build\"\n */\n protected resolveCommand(positionalArgs: string[]): {\n command: CommandPrimitive<TObject> | undefined;\n consumedArgs: string[];\n } {\n if (positionalArgs.length === 0) {\n return { command: undefined, consumedArgs: [] };\n }\n\n const firstArg = positionalArgs[0];\n\n // First, try colon notation for backwards compatibility (e.g., \"deploy:vercel\")\n if (firstArg.includes(\":\")) {\n const command = this.findCommand(firstArg);\n if (command) {\n return { command, consumedArgs: [firstArg] };\n }\n }\n\n // Try to find command with space-separated subcommand path\n // Only search top-level commands to avoid child commands shadowing\n // top-level ones (e.g., \"platform > build\" shadowing standalone \"build\")\n let currentCommand = this.findTopLevelCommand(firstArg);\n const consumedArgs: string[] = [];\n\n if (!currentCommand) {\n return { command: undefined, consumedArgs: [] };\n }\n\n consumedArgs.push(firstArg);\n\n // Walk through remaining args to find nested subcommands\n for (let i = 1; i < positionalArgs.length; i++) {\n const arg = positionalArgs[i];\n\n if (!currentCommand.hasChildren) {\n break;\n }\n\n const childCommand = currentCommand.findChild(arg);\n if (childCommand) {\n currentCommand = childCommand;\n consumedArgs.push(arg);\n } else {\n // No matching child, stop here\n break;\n }\n }\n\n return { command: currentCommand, consumedArgs };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public API\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get all registered commands in the application.\n */\n public get commands(): CommandPrimitive<any>[] {\n return this.alepha.primitives($command);\n }\n\n /**\n * Execute a command handler with given arguments.\n *\n * This is a **lightweight test helper** that directly invokes the command handler\n * without the full production lifecycle. It intentionally skips:\n * - Pre/post command hooks\n * - Runner session (pretty CLI output)\n * - Alepha context wrapper\n * - .env.{mode} file loading\n *\n * For production execution, the `onReady` hook uses `executeCommand()` which\n * provides the full lifecycle. Merging them would either make this method too\n * heavy for simple testing or require many optional parameters to toggle behaviors.\n *\n * @example\n * ```typescript\n * // In tests\n * const cli = alepha.inject(CliProvider);\n * const cmd = alepha.inject(InitCommand);\n *\n * await cli.run(cmd.init, \"--agent --pm=yarn\");\n * await cli.run(cmd.init, { argv: \"--agent\", root: \"/project\" });\n * ```\n */\n public async run<T extends TObject, A extends TSchema>(\n command: CommandPrimitive<T, A>,\n options:\n | string\n | string[]\n | { argv?: string | string[]; root?: string } = {},\n ): Promise<void> {\n const opts =\n typeof options === \"string\" || Array.isArray(options)\n ? { argv: options }\n : options;\n const args =\n typeof opts.argv === \"string\"\n ? opts.argv.split(\" \").filter(Boolean)\n : (opts.argv ?? []);\n const root = opts.root ?? process.cwd();\n\n const commandFlags = this.parseCommandFlags(args, command.flags, {\n modeEnabled: !!command.options.mode,\n });\n const commandArgs = this.parseCommandArgs(\n args,\n command.options.args,\n true,\n command.flags,\n );\n const commandEnv = this.parseCommandEnv(command.env, command.name);\n\n let modeValue: string | undefined;\n if (command.options.mode) {\n modeValue = this.parseModeFlag(args);\n if (modeValue === undefined && typeof command.options.mode === \"string\") {\n modeValue = command.options.mode;\n }\n }\n\n await command.options.handler({\n flags: commandFlags,\n args: commandArgs,\n env: commandEnv,\n run: this.runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root,\n help: () => this.printHelp(command),\n mode: modeValue,\n } as CommandHandlerArgs<T, A>);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Command Resolution\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Find a command by name or alias\n */\n protected findCommand(name: string): CommandPrimitive<TObject> | undefined {\n return this.commands.findLast(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Find a top-level command by name or alias (excludes child commands)\n */\n protected findTopLevelCommand(\n name: string,\n ): CommandPrimitive<TObject> | undefined {\n return this.getTopLevelCommands().findLast(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Find all pre-hooks for a command (commands named `pre{commandName}`)\n */\n protected findPreHooks(commandName: string): CommandPrimitive<TObject>[] {\n return this.commands.filter((cmd) => cmd.name === `pre${commandName}`);\n }\n\n /**\n * Find all post-hooks for a command (commands named `post{commandName}`)\n */\n protected findPostHooks(commandName: string): CommandPrimitive<TObject>[] {\n return this.commands.filter((cmd) => cmd.name === `post${commandName}`);\n }\n\n /**\n * Get global flags (help only, root command flags are NOT global)\n */\n protected getAllGlobalFlags(): Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n > {\n return { ...this.globalFlags };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Parsing (Flags, Args, Env)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Parse command flags from argv using the command's flag schema\n */\n protected parseCommandFlags(\n argv: string[],\n schema: TObject,\n options: { modeEnabled?: boolean } = {},\n ): Record<string, any> {\n const { modeEnabled = false } = options;\n const flagDefs = Object.entries(schema.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value,\n }));\n\n // Add mode flags if mode is enabled (they're parsed elsewhere by parseModeFlag)\n if (modeEnabled) {\n flagDefs.push({\n key: \"__mode__\",\n aliases: [\"mode\", \"m\"],\n description: undefined,\n schema: t.string(),\n });\n }\n\n const parsed = this.parseFlags(argv, flagDefs);\n\n // Remove the mode flag from parsed result (it's handled separately)\n delete parsed.__mode__;\n\n // apply manually defaults for optional properties that have defaults\n for (const [key, value] of Object.entries(schema.properties)) {\n if (!(key in parsed) && t.schema.isOptional(value)) {\n const innerSchema = value;\n if (innerSchema && \"default\" in innerSchema) {\n parsed[key] = innerSchema.default;\n }\n }\n }\n\n try {\n return this.alepha.codec.decode(schema, parsed);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid flag: ${error.cause.instancePath || \"command\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Parse and validate environment variables using the command's env schema\n */\n protected parseCommandEnv(\n schema: TObject,\n commandName: string,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n const missing: string[] = [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const value = process.env[key];\n\n if (value !== undefined) {\n result[key] = value;\n } else if (\"default\" in propSchema) {\n result[key] = propSchema.default;\n } else if (t.schema.isOptional(propSchema)) {\n // Optional with no default — leave undefined\n } else {\n missing.push(key);\n }\n }\n\n if (missing.length > 0) {\n const vars = missing.join(\", \");\n throw new CommandError(\n `Missing required environment variable${missing.length > 1 ? \"s\" : \"\"}: ${vars}`,\n );\n }\n\n try {\n return this.alepha.codec.decode(schema, result);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid environment variable: ${error.cause.instancePath || \"env\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Parse --mode or -m flag from argv for environment file loading\n */\n protected parseModeFlag(argv: string[]): string | undefined {\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n // Handle --mode=value or -m=value\n if (arg.startsWith(\"--mode=\") || arg.startsWith(\"-m=\")) {\n return arg.split(\"=\")[1];\n }\n\n // Handle --mode value or -m value\n if (arg === \"--mode\" || arg === \"-m\") {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n return nextArg;\n }\n throw new CommandError(\"Flag --mode requires a value.\");\n }\n }\n\n return undefined;\n }\n\n /**\n * Load .env and .env.{mode} files into process.env\n */\n protected async loadModeEnv(\n root: string,\n mode: string | undefined,\n ): Promise<void> {\n const envFiles = [\".env\"];\n if (mode) {\n envFiles.push(`.env.${mode}`);\n }\n this.log.debug(`Loading env files: ${envFiles.join(\", \")}`);\n await this.envUtils.loadEnv(root, envFiles);\n }\n\n /**\n * Low-level flag parser - extracts flag values from argv based on definitions\n */\n protected parseFlags(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n options: { strict?: boolean } = {},\n ): Record<string, any> {\n const { strict = true } = options;\n const result: Record<string, any> = {};\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg.startsWith(\"-\")) continue;\n\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n let value = valueParts.join(\"=\");\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) {\n if (strict) {\n throw new CommandError(`Unknown flag: --${rawKey}`);\n }\n continue;\n }\n\n // Check if schema is a union containing boolean (allows flag without value)\n const isUnionWithBoolean =\n t.schema.isUnion(def.schema) &&\n (def.schema as TUnion).anyOf.some((s) => t.schema.isBoolean(s));\n\n if (t.schema.isBoolean(def.schema)) {\n result[def.key] = true;\n } else if (isUnionWithBoolean && !value) {\n // Union with boolean: --flag without value → true\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n // Has a value after space: --flag value\n result[def.key] = nextArg;\n i++; // consume next arg\n } else {\n // No value: --flag → true\n result[def.key] = true;\n }\n } else if (value) {\n // Value provided via --flag=value syntax\n try {\n if (t.schema.isObject(def.schema) || t.schema.isArray(def.schema)) {\n result[def.key] = JSON.parse(value);\n } else {\n result[def.key] = value;\n }\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n } else {\n // Check for space-separated value: --flag value\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n value = nextArg;\n try {\n if (t.schema.isObject(def.schema) || t.schema.isArray(def.schema)) {\n result[def.key] = JSON.parse(value);\n } else {\n result[def.key] = value;\n }\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n } else {\n throw new CommandError(`Flag --${rawKey} requires a value.`);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get indices of argv elements consumed by flags (for separating args from flags)\n */\n protected getFlagConsumedIndices(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n ): Set<number> {\n const consumed = new Set<number>();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg.startsWith(\"-\")) continue;\n\n consumed.add(i);\n\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n const hasEqualValue = valueParts.length > 0;\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) continue;\n\n // Check if schema is a union containing boolean\n const isUnionWithBoolean =\n t.schema.isUnion(def.schema) &&\n (def.schema as TUnion).anyOf.some((s) => t.schema.isBoolean(s));\n\n // If not a boolean flag and no = value, the next arg is consumed as the value\n // Exception: union with boolean can work without a value\n if (\n !t.schema.isBoolean(def.schema) &&\n !isUnionWithBoolean &&\n !hasEqualValue\n ) {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n consumed.add(i + 1);\n }\n } else if (isUnionWithBoolean && !hasEqualValue) {\n // Union with boolean: check if next arg looks like a value (not a flag)\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n consumed.add(i + 1);\n }\n }\n }\n\n return consumed;\n }\n\n protected parseCommandArgs(\n argv: string[],\n schema?: TSchema,\n isRootCommand = false,\n flagSchema?: TObject,\n ): any {\n if (!schema) {\n return undefined;\n }\n\n // Get indices consumed by flags (including space-separated values)\n const flagDefs = flagSchema\n ? Object.entries(flagSchema.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n schema: value as TSchema,\n }))\n : [];\n const consumedIndices = this.getFlagConsumedIndices(argv, flagDefs);\n\n // Extract positional arguments (non-flag arguments that aren't consumed as flag values)\n const positionalArgs = argv.filter(\n (arg, idx) => !arg.startsWith(\"-\") && !consumedIndices.has(idx),\n );\n // For root commands, there's no command name to remove; otherwise slice off the command name\n const argsOnly = isRootCommand ? positionalArgs : positionalArgs.slice(1);\n\n try {\n if (t.schema.isOptional(schema)) {\n // Handle optional args: t.optional(t.text())\n if (argsOnly.length === 0) {\n return undefined;\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n } else if (t.schema.isTuple(schema) && schema.items) {\n // Handle tuple args: t.tuple([t.text(), t.number()])\n const result: any[] = [];\n const items = schema.items;\n for (let i = 0; i < items.length; i++) {\n const itemSchema = items[i];\n if (i < argsOnly.length) {\n result.push(this.parseArgumentValue(argsOnly[i], itemSchema));\n } else if (t.schema.isOptional(itemSchema)) {\n result.push(undefined);\n } else {\n throw new CommandError(\n `Missing required argument at position ${i + 1}`,\n );\n }\n }\n return result;\n } else {\n // Handle single arg: t.text(), t.number(), etc.\n if (argsOnly.length === 0) {\n throw new CommandError(\"Missing required argument\");\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n }\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(`Invalid argument: ${error.value.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Convert a string argument value to the appropriate type based on schema\n */\n protected parseArgumentValue(value: string, schema: TSchema): any {\n if (t.schema.isString(schema)) {\n return value;\n }\n\n if (t.schema.isNumber(schema) || t.schema.isInteger(schema)) {\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new CommandError(`Expected number, got \"${value}\"`);\n }\n if (t.schema.isInteger(schema) && !Number.isInteger(num)) {\n throw new CommandError(`Expected integer, got \"${value}\"`);\n }\n return num;\n }\n\n if (t.schema.isBoolean(schema)) {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\") return true;\n if (lower === \"false\" || lower === \"0\") return false;\n throw new CommandError(`Expected boolean, got \"${value}\"`);\n }\n\n // For other types, return the string value and let TypeBox validate it\n return value;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Help Generation\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Generate usage string for command arguments (e.g., \"<path>\" or \"[path]\")\n */\n protected generateArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n if (t.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` [${key}${typeName}]`;\n }\n\n if (t.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (t.schema.isOptional(item)) {\n return `[${argName}${typeName}]`;\n }\n return `<${argName}${typeName}>`;\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` <${key}${typeName}>`;\n }\n\n /**\n * Get display type name for a schema (e.g., \": number\", \": boolean\")\n */\n protected getTypeName(schema: TSchema): string {\n if (!schema) return \"\";\n\n // Check TypeBox type guards first\n if (t.schema.isString(schema)) return \"\";\n if (t.schema.isNumber(schema)) return \": number\";\n if (t.schema.isInteger(schema)) return \": integer\";\n if (t.schema.isBoolean(schema)) return \": boolean\";\n\n return \"\";\n }\n\n /**\n * Print help for a specific command or general CLI help.\n *\n * @param command - If provided, shows help for this specific command.\n * If omitted, shows general CLI help with all commands.\n */\n public printHelp(command?: CommandPrimitive<any>): void {\n const cliName = this.name || \"cli\";\n const c = this.color;\n this.log.info(\"\"); // Newline\n\n if (command?.name) {\n // Command-specific help\n const hasChildren = command.hasChildren;\n const argsUsage = hasChildren\n ? ` ${c.set(\"CYAN\", \"<command>\")}`\n : this.generateColoredArgsUsage(command.options.args);\n const commandPath = this.getCommandPath(command);\n const usage =\n `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", commandPath)}${argsUsage}`.trim();\n this.log.info(`${c.set(\"WHITE_BOLD\", \"Usage:\")} ${usage}`);\n\n if (command.options.description) {\n this.log.info(``);\n this.log.info(`\\t${command.options.description}`);\n }\n\n // Show subcommands if this is a parent command\n if (hasChildren) {\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Commands:\"));\n const maxSubCmdLength = this.getMaxChildCmdLength(command.children);\n\n for (const child of command.children) {\n if (child.options.hide) {\n continue;\n }\n const childArgsUsage = this.generateArgsUsage(child.options.args);\n const cmdStr = [child.name, ...child.aliases].join(\", \");\n const fullCmdStr = `${cmdStr}${childArgsUsage}`;\n const coloredCmd = `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", commandPath)} ${c.set(\"CYAN\", fullCmdStr)}`;\n const padding = \" \".repeat(\n Math.max(0, maxSubCmdLength - fullCmdStr.length),\n );\n this.log.info(\n ` ${coloredCmd}${padding} ${child.options.description ?? \"\"}`,\n );\n }\n }\n\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Flags:\"));\n\n const flags = [\n ...Object.entries(command.flags.properties).map(([key, value]) => ({\n key,\n schema: value,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : [])),\n ],\n description: (value as any).description,\n })),\n // Add --mode flag if command has mode option enabled\n ...(command.options.mode\n ? [\n {\n key: \"mode\",\n aliases: [\"m\", \"mode\"],\n description:\n typeof command.options.mode === \"string\"\n ? `Environment mode - loads .env.{mode} (default: ${command.options.mode})`\n : \"Environment mode (e.g., production, staging) - loads .env.{mode}\",\n schema: t.string() as TSchema,\n },\n ]\n : []),\n ...Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n ];\n\n const maxFlagLength = this.getMaxFlagLength(flags);\n for (const flag of flags) {\n const { aliases, description } = flag;\n const schema = \"schema\" in flag ? (flag.schema as TSchema) : undefined;\n // Sort aliases by length (shorter first: -t before --target)\n const sortedAliases = (Array.isArray(aliases) ? aliases : [aliases])\n .slice()\n .sort((a, b) => a.length - b.length);\n const flagStr = sortedAliases\n .map((a: string) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n const coloredFlag = c.set(\"GREY_LIGHT\", flagStr);\n const padding = \" \".repeat(Math.max(0, maxFlagLength - flagStr.length));\n const formattedDesc = this.formatFlagDescription(description, schema);\n this.log.info(` ${coloredFlag}${padding} ${formattedDesc}`);\n }\n\n // Show environment variables if defined\n const envVars = Object.entries(command.env.properties);\n if (envVars.length > 0) {\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Env:\"));\n const maxEnvLength = Math.max(...envVars.map(([key]) => key.length));\n for (const [key, schema] of envVars) {\n const isOptional = t.schema.isOptional(schema as TSchema);\n const description = (schema as any).description ?? \"\";\n const optionalStr = isOptional\n ? c.set(\"GREY_DARK\", \" (optional)\")\n : c.set(\"RED\", \" (required)\");\n const coloredKey = c.set(\"CYAN\", key);\n const padding = \" \".repeat(Math.max(0, maxEnvLength - key.length));\n this.log.info(\n ` ${coloredKey}${padding} ${description}${optionalStr}`,\n );\n }\n }\n } else {\n // general help\n this.log.info(this.description || \"Available commands:\");\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Commands:\"));\n\n // Get top-level commands (commands that are not children of other commands)\n const topLevelCommands = this.getTopLevelCommands();\n const maxCmdLength = this.getMaxCmdLength(topLevelCommands);\n\n for (const cmd of topLevelCommands) {\n // skip root command and hooks in list\n if (cmd.name === \"\" || cmd.options.hide) {\n continue;\n }\n\n const cmdStr = [cmd.name, ...cmd.aliases].join(\", \");\n const argsUsage = cmd.hasChildren\n ? \" <command>\"\n : this.generateArgsUsage(cmd.options.args);\n const fullCmdStr = `${cmdStr}${argsUsage}`;\n const coloredCmd = `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", fullCmdStr)}`;\n const padding = \" \".repeat(\n Math.max(0, maxCmdLength - fullCmdStr.length),\n );\n this.log.info(\n ` ${coloredCmd}${padding} ${cmd.options.description ?? \"\"}`,\n );\n }\n\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Flags:\"));\n\n // In general help, also show root command flags\n const rootCommand = this.commands.find((cmd) => cmd.name === \"\");\n const rootFlags = rootCommand\n ? Object.entries(rootCommand.flags.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value as TSchema,\n }))\n : [];\n\n const globalFlags = [\n ...rootFlags,\n ...Object.values(this.getAllGlobalFlags()),\n ];\n const maxFlagLength = this.getMaxFlagLength(globalFlags);\n for (const { aliases, description, schema } of globalFlags) {\n const flagStr = aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n const coloredFlag = c.set(\"GREY_LIGHT\", flagStr);\n const padding = \" \".repeat(Math.max(0, maxFlagLength - flagStr.length));\n const formattedDesc = this.formatFlagDescription(description, schema);\n this.log.info(` ${coloredFlag}${padding} ${formattedDesc}`);\n }\n }\n this.log.info(\"\"); // Newline\n }\n\n /**\n * Generate colored usage string for command arguments (for help display)\n */\n protected generateColoredArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n const c = this.color;\n\n if (t.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` ${c.set(\"GREY_DARK\", `[${key}${typeName}]`)}`;\n }\n\n if (t.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (t.schema.isOptional(item)) {\n return c.set(\"GREY_DARK\", `[${argName}${typeName}]`);\n }\n return c.set(\"CYAN\", `<${argName}${typeName}>`);\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` ${c.set(\"CYAN\", `<${key}${typeName}>`)}`;\n }\n\n /**\n * Get the full command path (e.g., \"deploy vercel\" for a nested command)\n */\n protected getCommandPath(command: CommandPrimitive<any>): string {\n const path: string[] = [command.name];\n let current = command;\n\n // Walk up the tree to find parents\n while (true) {\n const parent = this.findParentCommand(current);\n if (!parent) break;\n path.unshift(parent.name);\n current = parent;\n }\n\n return path.join(\" \");\n }\n\n /**\n * Find the parent command of a nested command\n */\n protected findParentCommand(\n command: CommandPrimitive<any>,\n ): CommandPrimitive<any> | undefined {\n for (const cmd of this.commands) {\n if (cmd.children.includes(command)) {\n return cmd;\n }\n }\n return undefined;\n }\n\n /**\n * Get top-level commands (commands that are not children of other commands)\n */\n protected getTopLevelCommands(): CommandPrimitive<any>[] {\n const allChildren = new Set<CommandPrimitive<any>>();\n\n // Collect all children\n for (const command of this.commands) {\n for (const child of command.children) {\n allChildren.add(child);\n }\n }\n\n // Return commands that are not children\n return this.commands.filter((cmd) => !allChildren.has(cmd));\n }\n\n /**\n * Calculate max display length for child commands (for help alignment)\n */\n protected getMaxChildCmdLength(children: CommandPrimitive<any>[]): number {\n return Math.max(\n ...children\n .filter((c) => !c.options.hide)\n .map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n 0,\n );\n }\n\n /**\n * Calculate max display length for commands (for help alignment)\n */\n protected getMaxCmdLength(commands: CommandPrimitive[]): number {\n return Math.max(\n ...commands\n .filter((c) => !c.options.hide && c.name !== \"\")\n .map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = c.hasChildren\n ? \" <command>\"\n : this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n );\n }\n\n /**\n * Calculate max display length for flags (for help alignment)\n */\n protected getMaxFlagLength(flags: { aliases: string[] }[]): number {\n return Math.max(\n ...flags.map((f) => {\n const aliases = Array.isArray(f.aliases) ? f.aliases : [f.aliases];\n return aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \").length;\n }),\n );\n }\n\n /**\n * Extract enum values from a schema if it represents an enum.\n * Returns undefined if the schema is not an enum.\n */\n protected getEnumValues(schema: TSchema): string[] | undefined {\n if (!schema) return undefined;\n\n // Check if schema has an enum property (t.enum creates schemas with this)\n if (\n \"enum\" in schema &&\n Array.isArray(schema.enum) &&\n schema.enum.every((v) => typeof v === \"string\")\n ) {\n return schema.enum as string[];\n }\n\n // Also check for union of string literals (alternative enum representation)\n if (t.schema.isUnion(schema)) {\n const union = schema as TUnion;\n const values: string[] = [];\n\n for (const variant of union.anyOf) {\n // Check if the variant is a string literal (has const property)\n if (\n t.schema.isString(variant) &&\n \"const\" in variant &&\n typeof variant.const === \"string\"\n ) {\n values.push(variant.const);\n } else {\n // Not all variants are string literals, not a simple enum\n return undefined;\n }\n }\n\n return values.length > 0 ? values : undefined;\n }\n\n return undefined;\n }\n\n /**\n * Format flag description with enum values if applicable.\n */\n protected formatFlagDescription(\n description: string | undefined,\n schema: TSchema | undefined,\n ): string {\n const baseDesc = description ?? \"\";\n\n if (!schema) return baseDesc;\n\n const enumValues = this.getEnumValues(schema);\n if (enumValues && enumValues.length > 0) {\n const valuesStr = enumValues.join(\", \");\n const c = this.color;\n const enumHint = c.set(\"GREY_DARK\", `[${valuesStr}]`);\n return baseDesc ? `${baseDesc} ${enumHint}` : enumHint;\n }\n\n return baseDesc;\n }\n}\n","import { $module } from \"alepha\";\nimport { Asker } from \"./helpers/Asker.ts\";\nimport { EnvUtils } from \"./helpers/EnvUtils.ts\";\nimport { PrettyAsker } from \"./helpers/PrettyAsker.ts\";\nimport { PrettyPrint } from \"./helpers/PrettyPrint.ts\";\nimport { Runner } from \"./helpers/Runner.ts\";\nimport { $command } from \"./primitives/$command.ts\";\nimport { CliProvider } from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./errors/CommandError.ts\";\nexport * from \"./helpers/Asker.ts\";\nexport * from \"./helpers/EnvUtils.ts\";\nexport * from \"./helpers/PrettyAsker.ts\";\nexport * from \"./helpers/PrettyPrint.ts\";\nexport * from \"./helpers/Runner.ts\";\nexport * from \"./primitives/$command.ts\";\nexport * from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Declarative CLI command framework.\n *\n * **Features:**\n * - CLI command definitions\n * - Interactive CLI prompts\n * - Command execution\n * - Formatted colored output\n * - Environment variable utilities\n * - Schema validation for CLI arguments\n *\n * @module alepha.command\n */\nexport const AlephaCommand = $module({\n name: \"alepha.command\",\n primitives: [$command],\n services: [CliProvider, Runner, Asker, PrettyAsker, PrettyPrint, EnvUtils],\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"typebox\" {\n interface StringOptions {\n /**\n * Additional aliases for the flags.\n *\n * @module alepha.command\n */\n aliases?: string[];\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAWA,IAAa,cAAb,MAAyB;CACvB,SAA4B,QAAQ,OAAO;CAC3C,QAA2B,QAAQ,qBAAqB;;;;;;CAOxD,IAAW,UAAmB;AAC5B,MAAI,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,IAAI,WACxC,QAAO;EAGT,MAAM,WAAW,OAAO,KAAK,OAAO,IAAI,aAAa,GAAG,CAAC,aAAa;AACtE,MAAI,aAAa,WAAW,aAAa,QACvC,QAAO;AAGT,SAAO;;;;;CAUT,MAAa,OAAqB;EAChC,MAAM,IAAI,KAAK;AACf,OAAK,MAAM,KAAK,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,QAAQ,MAAM,CAAC,IAAI;AAC/D,OAAK,MAAM,GAAG,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI;;;;;CAMtC,MAAa,SAAuB;EAClC,MAAM,IAAI,KAAK;AACf,OAAK,MAAM,GAAG,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI;AACpC,OAAK,MAAM,GAAG,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,MAAM;;;;;CAUpD,MAAa,OAAO,UAAkB,SAAoC;EACxE,IAAI,gBAAgB;AAEpB,OAAK,MAAM,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI;AAC7C,OAAK,kBAAkB,SAAS;AAChC,OAAK,cAAc,SAAS,cAAc;AAE1C,SAAO,IAAI,SAAiB,SAAS,WAAW;AAE9C,OAAI,EADe,OAAO,MAAM,eAAe,aAC9B;AAEf,SAAK,aAAa,QAAQ,OAAO;AACjC,SAAK,qBAAqB,SAAS;AACnC,SAAK,YAAY,QAAQ,GAAG;AAC5B,YAAQ,QAAQ,GAAG;AACnB;;AAGF,SAAM,WAAW,KAAK;AACtB,SAAM,QAAQ;GAEd,MAAM,cAAc,SAAiB;IACnC,MAAM,MAAM,KAAK,UAAU;AAG3B,QAAI,QAAQ,KAAQ;AAClB,cAAS;AACT,WAAM,WAAW,MAAM;AACvB,WAAM,OAAO;AACb,YAAO,IAAI,YAAY,WAAW,CAAC;AACnC;;AAIF,QAAI,QAAQ,YAAY,QAAQ,KAAK;AACnC,sBAAiB,gBAAgB,IAAI,QAAQ,UAAU,QAAQ;AAC/D,UAAK,aAAa,QAAQ,OAAO;AACjC,UAAK,cAAc,SAAS,cAAc;AAC1C;;AAIF,QAAI,QAAQ,YAAY,QAAQ,KAAK;AACnC,sBAAiB,gBAAgB,KAAK,QAAQ;AAC9C,UAAK,aAAa,QAAQ,OAAO;AACjC,UAAK,cAAc,SAAS,cAAc;AAC1C;;AAIF,QAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,cAAS;AACT,WAAM,WAAW,MAAM;AACvB,WAAM,OAAO;AAGb,UAAK,aAAa,QAAQ,OAAO;AACjC,UAAK,mBAAmB;AACxB,UAAK,qBAAqB,SAAS;AACnC,UAAK,YAAY,QAAQ,eAAe;AAExC,aAAQ,QAAQ,eAAe;;;GAInC,MAAM,gBAAgB;AACpB,UAAM,eAAe,QAAQ,WAAW;;AAG1C,SAAM,GAAG,QAAQ,WAAW;IAC5B;;;;;CAUJ,MAAa,KAAK,UAAkB,QAAmC;EACrE,MAAM,IAAI,KAAK;EACf,MAAM,eACJ,UAAU,aAAa,SAAS,OAAO,OAAO,QAAQ,GAAG,KAAA;AAE3D,OAAK,MAAM,GAAG,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI;AACpC,OAAK,kBAAkB,SAAS;EAEhC,MAAM,cAAc,eAChB,IAAI,EAAE,IAAI,OAAO,IAAI,aAAa,GAAG,KACrC;AAEJ,OAAK,MAAM,GAAG,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,IAAI,GAAG,YAAY,GAAG;EAEvE,MAAM,KAAK,KAAK,uBAAuB;AACvC,MAAI;GAEF,MAAM,SADS,MAAM,GAAG,SAAS,GAAG,EACf,MAAM,IAAI,gBAAgB;AAG/C,QAAK,MAAM,iBAAiB;AAE5B,QAAK,mBAAmB;AACxB,QAAK,qBAAqB,SAAS;AACnC,QAAK,YAAY,MAAM;AAEvB,OAAI,OACF,QAAO,KAAK,OAAO,MAAM,OAAO,QAAQ,SAAS,KAAA,EAAU;AAE7D,UAAO;YACC;AACR,MAAG,OAAO;;;;;;CAWd,MAAa,QAAQ,UAAoC;EACvD,MAAM,IAAI,KAAK;AAEf,OAAK,MAAM,GAAG,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI;AACpC,OAAK,kBAAkB,GAAG,SAAS,GAAG,EAAE,IAAI,OAAO,QAAQ,GAAG;AAC9D,OAAK,MAAM,GAAG,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,IAAI,CAAC,GAAG;EAEzD,MAAM,KAAK,KAAK,uBAAuB;AACvC,MAAI;GAEF,MAAM,SADS,MAAM,GAAG,SAAS,GAAG,EACf,MAAM,CAAC,aAAa;GACzC,MAAM,SAAS,UAAU,OAAO,UAAU;AAG1C,QAAK,MAAM,iBAAiB;AAC5B,QAAK,mBAAmB;AACxB,QAAK,qBAAqB,SAAS;AACnC,QAAK,YAAY,SAAS,QAAQ,KAAK;AAEvC,UAAO;YACC;AACR,MAAG,OAAO;;;CAQd,cAAwB,SAAmB,eAA6B;EACtE,MAAM,IAAI,KAAK;AACf,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;GAEvC,MAAM,SADa,MAAM,gBAErB,GAAG,EAAE,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,QAAQ,GAAG,KAClD,KAAK,EAAE,IAAI,OAAO,QAAQ,GAAG;AACjC,QAAK,MAAM,GAAG,EAAE,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI;;;CAInD,aAAuB,OAAqB;AAC1C,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IACzB,MAAK,MAAM,iBAAiB;;CAIhC,kBAA4B,UAAwB;AAClD,OAAK,MAAM,GAAG,KAAK,MAAM,IAAI,QAAQ,IAAI,CAAC,IAAI,SAAS,IAAI;;CAG7D,oBAAoC;AAClC,OAAK,MAAM,iBAAiB;;CAG9B,qBAA+B,UAAwB;AACrD,OAAK,MAAM,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,SAAS,IAAI;;CAG5D,YAAsB,OAAqB;AACzC,OAAK,MACH,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,IAChE;;CAGH,MAAgB,KAAmB;AACjC,SAAO,MAAM,IAAI;;CAGnB,wBAAkC;AAChC,SAAOA,gBAAsB;GAAE,OAAO;GAAO,QAAQ;GAAQ,CAAC;;;;;ACxMlE,IAAa,QAAb,MAAmB;CACjB,MAAyB,SAAS;CAClC;CACA,SAA4B,QAAQ,OAAO;CAC3C,SAA4B,QAAQ,YAAY;CAEhD,cAAc;AACZ,OAAK,MAAM,KAAK,iBAAiB;;CAGnC,kBAAuC;EACrC,MAAM,QAAmB,OACvB,UACA,UAAyB,EAAE,KACxB;AACH,UAAO,MAAM,KAAK,OAAU,UAAU,QAAQ;;AAGhD,QAAM,aAAa,OAAO,aAAqB;AAC7C,OAAI,KAAK,OAAO,QACd,QAAO,KAAK,OAAO,QAAQ,SAAS;AAKtC,WAHiB,MAAM,KAAK,OAAO,GAAG,SAAS,SAAS,EACtD,QAAQ,EAAE,KAAK;IAAC;IAAK;IAAK;IAAK;IAAM;IAAM,EAAE,EAAE,SAAS,KAAK,CAAC,EAC/D,CAAC,EACc,OAAO,EAAE,CAAC,aAAa,KAAK;;AAG9C,QAAM,SAAS,UAAkB;AAC/B,OAAI,KAAK,OAAO,QACd,MAAK,OAAO,MAAM,MAAM;;AAI5B,QAAM,SAAS,YAAoB;AACjC,OAAI,KAAK,OAAO,QACd,MAAK,OAAO,MAAM,QAAQ;;AAI9B,SAAO;;CAGT,MAAgB,OACd,UACA,SACoB;AACpB,MAAI,KAAK,OAAO,QACd,QAAO,KAAK,aAAa,UAAU,QAAQ;AAE7C,SAAO,KAAK,YAAY,UAAU,QAAQ;;;;;CAM5C,MAAgB,aACd,UACA,SACoB;EACpB,MAAM,SAAS,QAAQ;AAGvB,MAAI,QAAQ,QAAQ,MAAM,QAAQ,OAAO,KAAK,EAAE;GAC9C,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,UAAU,OAAO,KAAK;AAC7D,OAAI,QAAQ,SACV,SAAQ,SAAS,MAAmB;AAEtC,UAAO;;EAIT,MAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,UAAU,OAAO;AACtD,MAAI,QAAQ,SACV,SAAQ,SAAS,MAAmB;AAEtC,SAAO;;;;;CAMT,MAAgB,YACd,UACA,SACoB;EACpB,MAAM,KAAK,KAAK,uBAAuB;EACvC,IAAI;AACJ,MAAI;AACF;AACE,QAAI;AACF,UAAK,IAAI,KAAK,SAAS;KACvB,MAAM,SAAS,MAAM,GAAG,SAAS,KAAK;AACtC,SAAI,QAAQ,OACV,SAAQ,KAAK,OAAO,MAAM,OACxB,QAAQ,QACR,SAAS,OAAO,MAAM,GAAG,KAAA,EAC1B;SAED,SAAQ,OAAO,OAAO,MAAM,CAAC;AAE/B,SAAI,QAAQ,SACV,SAAQ,SAAS,MAAM;aAElB,OAAO;AACd,SAAI,iBAAiB,aAAa;AAChC,WAAK,IAAI,MAAM,GAAG,MAAM,QAAQ,IAAI;AACpC,cAAQ,KAAA;WAER,OAAM;;UAGH,UAAU,KAAA;YACX;AACR,MAAG,OAAO;;AAGZ,SAAO;;CAGT,wBAAkC;AAChC,SAAOC,gBAAsB;GAAE,OAAA;GAAO,QAAA;GAAQ,CAAC;;;;;AC1KnD,IAAa,WAAb,MAAsB;CACpB,MAAyB,SAAS;CAClC,KAAwB,QAAQ,mBAAmB;;;;;;;;;;;CAYnD,MAAa,QACX,MACA,QAAkB,CAAC,OAAO,EACX;EACf,MAAM,OAAO,MAAM,KAAK,SAAS,MAAM,MAAM;AAC7C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,CAC7C,KAAI,QAAQ,IAAI,SAAS,KAAA,EACvB,SAAQ,IAAI,OAAO;;;;;;;;CAWzB,MAAa,SACX,MACA,QAAkB,CAAC,OAAO,EACO;EACjC,MAAM,SAAiC,EAAE;AAEzC,OAAK,MAAM,MAAM,MACf,MAAK,MAAM,QAAQ,CAAC,IAAI,GAAG,GAAG,QAAQ,EAAE;GACtC,MAAM,UAAU,KAAK,GAAG,KAAK,MAAM,KAAK;AACxC,OAAI;IAEF,MAAM,cADS,MAAM,KAAK,GAAG,SAAS,QAAQ,EACpB,SAAS,OAAO;AAC1C,SAAK,MAAM,QAAQ,WAAW,MAAM,KAAK,EAAE;KACzC,MAAM,CAAC,KAAK,GAAG,QAAQ,KAAK,MAAM,IAAI;AACtC,SAAI,KAAK;MACP,MAAM,aAAa,IAAI,MAAM;AAC7B,UAAI,cAAc,CAAC,WAAW,WAAW,IAAI,EAAE;OAC7C,IAAI,QAAQ,KAAK,KAAK,IAAI,CAAC,MAAM;AAEjC,WACE,MAAM,UAAU,MACd,MAAM,OAAO,QAAO,MAAM,MAAM,SAAS,OAAO,QAC/C,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO,KAEnD,SAAQ,MAAM,MAAM,GAAG,GAAG;AAE5B,cAAO,cAAc;;;;AAI3B,SAAK,IAAI,MAAM,qCAAqC,UAAU;WACxD;AACN,SAAK,IAAI,MAAM,MAAM,KAAK,iBAAiB,QAAQ,aAAa;;;AAKtE,SAAO;;;;;ACtEX,IAAa,cAAb,MAAyB;CACvB,mBAA6B,QAAQ,iBAAiB;CACtD;CACA,SAA4B;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,wBAAkB,IAAI,KAUnB;CACH,gBAA0B;CAC1B;CACA;CACA,SAAmB;CAGnB;CACA,iBAAqC,EAAE;CACvC,aAAuB;CAGvB,SAA4B;EAC1B,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK;EACN;;;;CAKD,aAAoB,SAAiB,aAA2B;AAC9D,OAAK,SAAS,cAAc,GAAG,QAAQ,GAAG,gBAAgB;AAC1D,OAAK,mBAAmB,KAAK,iBAAiB,WAAW;AACzD,OAAK,MAAM,OAAO;AAClB,OAAK,gBAAgB;AACrB,OAAK,MAAM,MAAM,KAAK,OAAO,IAAI;;;;;CAMnC,aAA0B;AACxB,OAAK,eAAe;AACpB,MAAI,KAAK,kBAAkB;GACzB,MAAM,kBACH,KAAK,iBAAiB,WAAW,GAAG,KAAK,oBAC1C,KACA,QAAQ,EAAE;AACZ,QAAK,MAAM,cAAc,cAAc,KAAK;;AAE9C,OAAK,SAAS,KAAA;AACd,OAAK,mBAAmB,KAAA;;;;;CAM1B,aAAoB,IAAY,UAAwB;AACtD,OAAK,MAAM,IAAI,IAAI;GACjB;GACA,YAAY;GACZ,QAAQ;GACR,WAAW,KAAK,iBAAiB,WAAW;GAC7C,CAAC;AAEF,OAAK,iBAAiB;AAGtB,MAAI,CAAC,KAAK,gBACR,MAAK,kBAAkB,KAAK,iBAAiB,qBACrC,KAAK,eAAe,EAC1B,IACA,KACD;AAGH,OAAK,eAAe;;;;;CAMtB,QACE,IACA,UACA,UACA,SACM;EACN,MAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,MAAI,MAAM;AACR,QAAK,SAAS;AACd,OAAI,SAAU,MAAK,WAAW;AAC9B,OAAI,SAAU,MAAK,WAAW;AAC9B,OAAI,QAAS,MAAK,UAAU;AAC5B,QAAK,eAAe;;AAGtB,OAAK,gBAAgB;;;;;CAMvB,MAAa,IAAY,UAAyB;EAChD,MAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,MAAI,MAAM;AACR,QAAK,SAAS;AACd,OAAI,SAAU,MAAK,WAAW;AAC9B,QAAK,eAAe;;AAGtB,OAAK,gBAAgB;AACrB,OAAK,eAAe;;;;;CAMtB,gBAAgC;AAE9B,MAAI,KAAK,gBAAgB,EACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,eAAe,IACtC,MAAK,MAAM,iBAAiB;AAKhC,MAAI,KAAK,eAAe,SAAS,GAAG;AAClC,QAAK,MAAM,SAAS,KAAK,eACvB,MAAK,MAAM,MAAM;AAEnB,QAAK,iBAAiB,EAAE;;EAI1B,MAAM,YAAY,MAAM,KAAK,KAAK,MAAM,QAAQ,CAAC;EACjD,MAAM,SAAS,KAAK,SAAS,QAAQ;AAErC,OAAK,MAAM,QAAQ,WAAW;GAC5B,IAAI,OAAO;AAEX,OAAI,KAAK,WAAW,WAAW;IAC7B,MAAM,QAAQ,KAAK,OAAO,KAAK;IAC/B,MAAM,UAAU,OACd,KAAK,OACF,KAAK,iBAAiB,WAAW,GAAG,KAAK,aAAa,IACxD,GAAG,GACL,CAAC,OAAO,GAAG,KAAK;AACjB,YAAQ,GAAG,KAAK,OAAO,OAAO,QAAQ,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,MAAM,KAAK,WAAW,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,QAAQ,GAAG,KAAK,OAAO;AAC5J,SAAK,cAAc,KAAK,aAAa,KAAK,KAAK,OAAO;cAC7C,KAAK,WAAW,WAAW;IACpC,MAAM,cAAc,KAAK,WACrB,KAAK,KAAK,OAAO,MAAM,KAAK,WAAW,KAAK,OAAO,UACnD;IACJ,MAAM,aAAa,KAAK,UAAU,MAAM,KAAK,YAAY;AACzD,YAAQ,GAAG,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,MAAM,GAAG,KAAK,WAAW,cAAc;cAC1E,KAAK,WAAW,QACzB,SAAQ,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,MAAM,GAAG,KAAK;AAG1D,QAAK,MAAM,GAAG,KAAK,IAAI;;AAGzB,OAAK,gBAAgB,UAAU;;;;;CAMjC,iBAAiC;AAK/B,MAAI,CAJoB,MAAM,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC,MACrD,SAAS,KAAK,WAAW,UAC3B,IAEuB,KAAK,iBAAiB;AAC5C,QAAK,iBAAiB,cAAc,KAAK,gBAAgB;AACzD,QAAK,kBAAkB,KAAA;;;;;;;CAQ3B,QAAqB;AACnB,MAAI,KAAK,OAAQ;AACjB,OAAK,SAAS;AAGd,OAAK,aAAa;AAGlB,MAAI,KAAK,gBAAgB,GAAG;AAC1B,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,eAAe,IACtC,MAAK,MAAM,iBAAiB;AAE9B,QAAK,gBAAgB;;AAIvB,MAAI,KAAK,OACP,MAAK,MAAM,WAAW;AAGxB,OAAK,eAAe;;;;;CAMtB,SAAsB;AACpB,MAAI,CAAC,KAAK,OAAQ;AAClB,OAAK,SAAS;AAGd,MAAI,KAAK,OACP,MAAK,MAAM,WAAW;AAGxB,OAAK,iBAAiB;AAMtB,MAJwB,MAAM,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC,MACrD,SAAS,KAAK,WAAW,UAC3B,EAEoB;AACnB,QAAK,eAAe;AAEpB,OAAI,CAAC,KAAK,gBACR,MAAK,kBAAkB,KAAK,iBAAiB,qBACrC,KAAK,eAAe,EAC1B,IACA,KACD;;;;;;CAQP,cAA2B;AACzB,MAAI,KAAK,iBAAiB;AACxB,QAAK,iBAAiB,cAAc,KAAK,gBAAgB;AACzD,QAAK,kBAAkB,KAAA;;;;;;CAO3B,QAAqB;AACnB,OAAK,MAAM,OAAO;AAClB,OAAK,aAAa;AAClB,OAAK,eAAe;AACpB,OAAK,gBAAgB;;;;;;;CAYvB,kBAAkC;AAChC,MAAI,KAAK,oBAAqB;EAE9B,MAAM,WAAW,QAAQ,OAAO,MAAM,KAAK,QAAQ,OAAO;AAC1D,OAAK,sBAAsB;AAE3B,UAAQ,OAAO,UACb,OACA,cACA,OACY;AACZ,OAAI,KAAK,WACP,QAAO,SAAS,OAAO,cAAc,GAAG;AAE1C,QAAK,eAAe,KAAK,OAAO,MAAM,CAAC;AACvC,UAAO;;;;;;CAOX,gBAAgC;AAC9B,MAAI,CAAC,KAAK,oBAAqB;EAE/B,MAAM,WAAW,KAAK;AACtB,OAAK,sBAAsB,KAAA;AAC3B,UAAQ,OAAO,QAAQ;AAEvB,OAAK,MAAM,SAAS,KAAK,eACvB,UAAS,MAAM;AAEjB,OAAK,iBAAiB,EAAE;;;;;CAM1B,MAAgB,KAAmB;AACjC,OAAK,aAAa;AAClB,UAAQ,OAAO,MAAM,IAAI;AACzB,OAAK,aAAa;;;;;ACvUtB,IAAa,eAAb,cAAkC,YAAY;CAC5C,OAAgB;;;;ACsDlB,IAAa,SAAb,MAAoB;CAClB,MAAyB,SAAS;CAClC,WAA8B,QAAQ,iBAAiB;CACvD,SAA4B,EAAE;CAC9B,YAAuC,KAAK,SAAS,WAAW;CAChE,cAAiC,QAAQ,YAAY;CACrD,SAA4B,QAAQ,OAAO;CAC3C,QAA2B,QAAQ,cAAc;CACjD;CACA,UAAoB;CACpB,cAAwB;CACxB,mBAA6B;CAC7B,cAAwB;CAExB,cAAc;AACZ,OAAK,MAAM,KAAK,iBAAiB;;CAGnC,IAAW,mBAAmB;AAC5B,MAAI,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,IAAI,WACxC,QAAO;EAGT,MAAM,WAAW,OAAO,KAAK,OAAO,IAAI,aAAa,GAAG,CAAC,aAAa;AACtE,MAAI,aAAa,WAAW,aAAa,QACvC,QAAO;AAGT,SAAO,KAAK,OAAO,IAAI,eAAe;;;;;CAMxC,aAAoB,SAAiB,aAA2B;AAC9D,OAAK,UAAU;AACf,OAAK,cAAc;AACnB,OAAK,mBAAmB;AACxB,OAAK,cAAc;;CAGrB,kBAA4B;EAC1B,MAAM,QAAsB,OAC1B,KACA,YACG;AACH,OAAI,KAAK,oBAAoB,CAAC,KAAK,iBACjC,MAAK,YAAY,aAAa,KAAK,SAAS,KAAK,YAAY;AAG/D,QAAK,mBAAmB;GAExB,MAAM,OACJ,OAAO,YAAY,YAAY,QAAQ,OAAO,QAAQ,OAAO,KAAA;AAE/D,OAAI,MAAM,QAAQ,IAAI,CACpB,QAAO,MAAM,KAAK,QAChB,IAAI,KAAK,OACP,OAAO,OAAO,WACV;IAAE,MAAM;IAAI,eAAe,KAAK,KAAK,IAAI,EAAE,MAAM,CAAC;IAAE,GACpD,GACL,CACF;GAIH,MAAM,QADQ,OAAO,YAAY,WAAW,QAAQ,QAAQ,KAAA,OACrC,OAAO,QAAQ,WAAW,MAAM,IAAI;GAC3D,MAAM,UACJ,OAAO,YAAY,aACf,UACA,OAAO,QAAQ,iBACP,KAAK,KAAK,KAAK,EAAE,MAAM,CAAC,GAC9B,IAAI;AAEZ,UAAO,MAAM,KAAK,QAAQ;IACxB;IACA;IACD,CAAC;;AAGJ,QAAM,KAAK,OACT,OACA,UAAsB,EAAE,KACJ;AACpB,OAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,SAAS,IAAI,CAC7C,QAAO,MAAM;IACX,MACE,QAAQ,SACR,UAAU,MAAM,QAAQ,MAAM,GAAG,MAAM,KAAK,IAAI,GAAG;IACrD,SAAS,YAAY;AACnB,gBAAW,MAAM,QAAQ,KAAK,MAAM,EAAE;AACpC,WAAK,IAAI,MAAM,YAAY,OAAO;AAClC,YAAM,GAAG,MAAM;OAAE,WAAW;OAAM,OAAO;OAAM,CAAC;;;IAGrD,CAAC;AAEJ,QAAK,IAAI,MAAM,YAAY,QAAQ;AACnC,UAAO,MAAM;IACX,MAAM,QAAQ,SAAS,UAAU;IACjC,eAAe,GAAG,OAAO;KAAE,WAAW;KAAM,OAAO;KAAM,CAAC;IAC3D,CAAC;;AAGJ,QAAM,KAAK,OACT,QACA,MACA,UAAsB,EAAE,KACJ;AACpB,QAAK,IAAI,MAAM,WAAW,OAAO,MAAM,OAAO;AAC9C,UAAO,MACL;IACE,MAAM,QAAQ,SAAS,SAAS,OAAO,GAAG;IAC1C,eAAe,GAAG,QAAQ,MAAM,EAAE,WAAW,MAAM,CAAC;IACrD,EACD,QACD;;AAGH,QAAM,YAAY,KAAK,KAAK;AAC5B,QAAM,cAAc;AAClB,OAAI,KAAK,iBAAkB,MAAK,YAAY,OAAO;;AAErD,QAAM,eAAe;AACnB,OAAI,KAAK,iBAAkB,MAAK,YAAY,QAAQ;;AAGtD,SAAO;;CAGT,MAAgB,KACd,KACA,OAA0B,EAAE,EACX;AACjB,SAAO,KAAK,MAAM,IAAI,KAAK;GAAE,MAAM,KAAK;GAAM,SAAS;GAAM,CAAC;;;;;;;CAQhE,MAAgB,QAAQ,MAAsC;AAC5D,MAAI,MAAM,QAAQ,KAAK,EAAE;AACvB,SAAM,QAAQ,IAAI,KAAK,KAAK,MAAM,KAAK,YAAY,EAAE,CAAC,CAAC;AACvD,UAAO;QAEP,QAAO,MAAM,KAAK,YAAY,KAAK;;;;;CAOvC,MAAmB;AACjB,MAAI,KAAK,oBAAoB,KAAK,kBAAkB;AAClD,QAAK,YAAY,YAAY;AAC7B;;AAIF,MAAI,KAAK,OAAO,WAAW,EAAG;AAE9B,OAAK,IAAI,KAAK,GAAG;EACjB,MAAM,cACH,KAAK,SAAS,WAAW,GAAG,KAAK,aAClC,KACA,QAAQ,EAAE;AACZ,OAAK,IAAI,KAAK,eAAe,UAAU,GAAG;AAC1C,OAAK,IAAI,KAAK,GAAG;AAGjB,OAAK,SAAS,EAAE;;CAGlB,MAAgB,YAAY,MAA6B;EACvD,MAAM,MAAM,KAAK,SAAS,WAAW;EACrC,MAAM,SAAS,QAAQ,EAAE,KAAK;AAG9B,MAAI,KAAK,iBACP,MAAK,YAAY,aAAa,QAAQ,KAAK,KAAK;MAEhD,MAAK,IAAI,KAAK,aAAa,KAAK,KAAK,OAAO;EAG9C,IAAI,SAAS;AAEb,MAAI;AACF,YAAS,OAAQ,MAAM,KAAK,SAAS,IAAK,GAAG;WACtC,OAAO;AAEd,OAAI,KAAK,iBACP,MAAK,YAAY,MAAM,QAAQ,KAAK,KAAK;AAE3C,OAAI,iBAAiB,SAAS,YAAY,MACxC,MAAK,IAAI,KAAK,OAAO,MAAM,SAAS;AAEtC,SAAM,IAAI,aAAa,SAAS,KAAK,KAAK,WAAW,EAAE,OAAO,OAAO,CAAC;;AAGxE,MAAI,OAAQ,MAAK,IAAI,MAAM,OAAO;EAElC,MAAM,aAAa,KAAK,SAAS,WAAW,GAAG,OAAO,KAAM,QAAQ,EAAE;EAEtE,MAAM,UACJ,UAAU,CAAC,OAAO,SAAS,KAAK,GAAG,OAAO,MAAM,GAAG,KAAA;AAGrD,MAAI,KAAK,iBACP,MAAK,YAAY,QAAQ,QAAQ,KAAK,MAAM,GAAG,SAAS,IAAI,QAAQ;OAC/D;GACL,MAAM,SAAS,UAAU,MAAM,YAAY;AAC3C,QAAK,IAAI,KAAK,aAAa,KAAK,KAAK,UAAU,SAAS,GAAG,SAAS;;AAGtE,OAAK,OAAO,KAAK;GACf,MAAM,KAAK;GACX,UAAU,GAAG,SAAS;GACvB,CAAC;AAEF,SAAO;;CAGT,YAAsB,MAAwB;AAC5C,MAAI,KAAK,WAAW,EAAG;EAEvB,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC,UAAU,KAAK,OAAO,EAAE,EAAE;EACnE,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,KAAK,GAAG,UAAU,KAAK,OAAO,EAAE,EAAE;EAErE,MAAM,UAAU,IAAI,IAAI,OAAO,YAAY,EAAE,CAAC,GAAG,IAAI,OACnD,YAAY,EACb,CAAC;AACF,OAAK,IAAI,KAAK,QAAQ;AACtB,OAAK,IAAI,KACP,KAAK,UAAU,OAAO,UAAU,CAAC,KAAK,WAAW,OAAO,UAAU,CAAC,IACpE;AACD,OAAK,IAAI,KAAK,QAAQ;AACtB,OAAK,MAAM,CAAC,MAAM,SAAS,KACzB,MAAK,IAAI,KACP,KAAK,KAAK,OAAO,UAAU,CAAC,KAAK,KAAK,OAAO,UAAU,CAAC,IACzD;AAEH,OAAK,IAAI,KAAK,QAAQ;;;;;;;;;;;ACvR1B,MAAa,YAKX,YACG,gBAAgB,kBAA2B,QAAQ;AAgOxD,IAAa,mBAAb,cAIU,UAA4C;CACpD,QAAwB,KAAK,QAAQ,SAAS,EAAE,OAAO,EAAE,CAAC;CAC1D,MAAsB,KAAK,QAAQ,OAAO,EAAE,OAAO,EAAE,CAAC;CACtD,UAA0B,KAAK,QAAQ,WAAW,EAAE;CAEpD,SAAmB;AACjB,MAAI,KAAK,QAAQ,OAAO,KAAK,QAAQ,KACnC,MAAK,QAAQ,SAAS;;CAI1B,IAAW,OAAe;AACxB,MAAI,KAAK,QAAQ,KACf,QAAO;AAET,MAAI,KAAK,QAAQ,IACf,QAAO,MAAM,KAAK,QAAQ;AAE5B,MAAI,KAAK,QAAQ,KACf,QAAO,OAAO,KAAK,QAAQ;AAE7B,SAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,OAAO;;;;;CAM7C,IAAW,WAAyC;AAClD,SAAO,KAAK,QAAQ,YAAY,EAAE;;;;;CAMpC,IAAW,cAAuB;AAChC,SAAO,KAAK,SAAS,SAAS;;;;;CAMhC,UAAiB,MAAsD;AACrE,SAAO,KAAK,SAAS,MAClB,UAAU,MAAM,SAAS,QAAQ,MAAM,QAAQ,SAAS,KAAK,CAC/D;;;AAIL,SAAS,QAAQ;;;AClRjB,MAAM,YAAY,EAAE,OAAO;CACzB,UAAU,EAAE,KAAK;EACf,SAAS;EACT,aAAa;EACd,CAAC;CACF,iBAAiB,EAAE,KAAK;EACtB,SAAS;EACT,aAAa;EACd,CAAC;CACH,CAAC;;;;AASF,MAAa,aAAa,MAAM;CAC9B,MAAM;CACN,QAAQ,EAAE,OAAO;EACf,MAAM,EAAE,SACN,EAAE,OAAO,EACP,aAAa,gCACd,CAAC,CACH;EACD,aAAa,EAAE,SACb,EAAE,OAAO,EACP,aAAa,uCACd,CAAC,CACH;EACD,MAAM,EAAE,SACN,EAAE,MAAM,EAAE,QAAQ,EAAE,EAClB,aAAa,oCACd,CAAC,CACH;EACF,CAAC;CACF,SAAS,EAAE;CACZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCF,IAAa,cAAb,MAAyB;CAKvB,MAAyB,KAAK,UAAU;CACxC,SAA4B,QAAQ,OAAO;CAC3C,MAAyB,SAAS;CAClC,QAA2B,QAAQ,qBAAqB;CACxD,SAA4B,QAAQ,OAAO;CAC3C,QAA2B,QAAQ,MAAM;CACzC,WAA8B,QAAQ,SAAS;CAC/C,UAA6B,OAAO,WAAW;CAM/C,IAAc,OAAe;AAC3B,SAAO,KAAK,QAAQ,QAAQ,KAAK,IAAI;;CAGvC,IAAc,cAAsB;AAClC,SAAO,KAAK,QAAQ,eAAe,KAAK,IAAI;;CAG9C,IAAc,OAAiB;AAC7B,SACE,KAAK,QAAQ,SACZ,OAAO,YAAY,cAAc,QAAQ,KAAK,MAAM,EAAE,GAAG,EAAE;;;;;CAOhE,cAAiC,EAC/B,MAAM;EACJ,SAAS,CAAC,KAAK,OAAO;EACtB,aAAa;EACb,QAAQ,EAAE,SAAS;EACpB,EACF;;;;;CAUD,UAA6B,MAAM;EACjC,IAAI;EACJ,SAAS,YAAY;GACnB,MAAM,OAAO,CAAC,GAAG,KAAK,KAAK;GAG3B,MAAM,iBAAiB,KAAK,QAAQ,QAAQ,CAAC,IAAI,WAAW,IAAI,CAAC;GAGjE,MAAM,EAAE,SAAS,iBAAiB,KAAK,eAAe,eAAe;AAWrE,OAToB,KAAK,WACvB,MACA,OAAO,QAAQ,KAAK,mBAAmB,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY;IAC9D;IACA,GAAG;IACJ,EAAE,EACH,EAAE,QAAQ,OAAO,CAClB,CAEe,MAAM;AACpB,SAAK,UAAU,QAAQ;AACvB;;AAGF,OAAI,CAAC,SAAS;IAEZ,MAAM,cAAc,KAAK,YAAY,GAAG;IAGxC,MAAM,cAAc,eAAe,MAAM;AACzC,QAAI,gBAAgB,MAAM,CAAC,aAAa,QAAQ,MAAM;AACpD,UAAK,IAAI,MAAM,qBAAqB,YAAY,GAAG;AACnD,UAAK,WAAW;AAChB;;AAIF,QAAI,aAAa;AACf,WAAM,KAAK,eAAe,aAAa,MAAM,KAAK;AAClD;;AAIF;;GAIF,MAAM,gBAAgB,KAAK,mBAAmB,MAAM,aAAa;AAGjE,SAAM,KAAK,eAAe,SAAS,eAAe,KAAK;;EAE1D,CAAC;;;;;;;;;;;;CAaF,MAAgB,eACd,SACA,MACA,eACe;EACf,MAAM,OAAO,QAAQ,KAAK;EAG1B,IAAI;AACJ,MAAI,QAAQ,QAAQ,MAAM;AACxB,eAAY,KAAK,cAAc,KAAK;AAEpC,OAAI,cAAc,KAAA,KAAa,OAAO,QAAQ,QAAQ,SAAS,SAC7D,aAAY,QAAQ,QAAQ;AAE9B,SAAM,KAAK,YAAY,MAAM,UAAU;;EAGzC,MAAM,eAAe,KAAK,kBAAkB,MAAM,QAAQ,OAAO,EAC/D,aAAa,CAAC,CAAC,QAAQ,QAAQ,MAChC,CAAC;EACF,MAAM,cAAc,KAAK,iBACvB,MACA,QAAQ,QAAQ,MAChB,eACA,QAAQ,MACT;EACD,MAAM,aAAa,KAAK,gBAAgB,QAAQ,KAAK,QAAQ,KAAK;AAElE,QAAM,KAAK,OAAO,QAAQ,IAAI,YAAY;AACxC,QAAK,IAAI,MAAM,sBAAsB,QAAQ,KAAK,OAAO;IACvD,OAAO;IACP,MAAM;IACN,MAAM;IACP,CAAC;GAEF,MAAM,SAAS,KAAK;AAGpB,UAAO,aAAa,KAAK,MAAM,QAAQ,KAAK;GAE5C,MAAM,OAAO;IACX,OAAO;IACP,MAAM;IACN,KAAK;IACL,KAAK,OAAO;IACZ,KAAK,KAAK,MAAM;IAChB;IACA;IACA;IACA,YAAY,KAAK,UAAU,QAAQ;IACnC,MAAM;IACP;GAGD,MAAM,WAAW,KAAK,aAAa,QAAQ,KAAK;AAChD,QAAK,MAAM,QAAQ,UAAU;AAC3B,SAAK,IAAI,MAAM,2BAA2B,QAAQ,KAAK,MAAM;AAC7D,UAAM,KAAK,QAAQ,QAAQ,KAAoC;;AAIjE,SAAM,QAAQ,QAAQ,QAAQ,KAAoC;GAGlE,MAAM,YAAY,KAAK,cAAc,QAAQ,KAAK;AAClD,QAAK,MAAM,QAAQ,WAAW;AAC5B,SAAK,IAAI,MAAM,4BAA4B,QAAQ,KAAK,MAAM;AAC9D,UAAM,KAAK,QAAQ,QAAQ,KAAoC;;AAGjE,UAAO,KAAK;AAEZ,QAAK,IAAI,MAAM,YAAY,QAAQ,KAAK,0BAA0B;IAClE;;;;;CAMJ,mBACE,MACA,cACU;EACV,MAAM,SAAmB,EAAE;EAC3B,IAAI,gBAAgB;AAEpB,OAAK,MAAM,OAAO,KAChB,KAAI,IAAI,WAAW,IAAI,CACrB,QAAO,KAAK,IAAI;WAEhB,gBAAgB,aAAa,UAC7B,QAAQ,aAAa,eAErB;MAGA,QAAO,KAAK,IAAI;AAIpB,SAAO;;;;;;;;;;CAWT,eAAyB,gBAGvB;AACA,MAAI,eAAe,WAAW,EAC5B,QAAO;GAAE,SAAS,KAAA;GAAW,cAAc,EAAE;GAAE;EAGjD,MAAM,WAAW,eAAe;AAGhC,MAAI,SAAS,SAAS,IAAI,EAAE;GAC1B,MAAM,UAAU,KAAK,YAAY,SAAS;AAC1C,OAAI,QACF,QAAO;IAAE;IAAS,cAAc,CAAC,SAAS;IAAE;;EAOhD,IAAI,iBAAiB,KAAK,oBAAoB,SAAS;EACvD,MAAM,eAAyB,EAAE;AAEjC,MAAI,CAAC,eACH,QAAO;GAAE,SAAS,KAAA;GAAW,cAAc,EAAE;GAAE;AAGjD,eAAa,KAAK,SAAS;AAG3B,OAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;GAC9C,MAAM,MAAM,eAAe;AAE3B,OAAI,CAAC,eAAe,YAClB;GAGF,MAAM,eAAe,eAAe,UAAU,IAAI;AAClD,OAAI,cAAc;AAChB,qBAAiB;AACjB,iBAAa,KAAK,IAAI;SAGtB;;AAIJ,SAAO;GAAE,SAAS;GAAgB;GAAc;;;;;CAUlD,IAAW,WAAoC;AAC7C,SAAO,KAAK,OAAO,WAAW,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BzC,MAAa,IACX,SACA,UAGkD,EAAE,EACrC;EACf,MAAM,OACJ,OAAO,YAAY,YAAY,MAAM,QAAQ,QAAQ,GACjD,EAAE,MAAM,SAAS,GACjB;EACN,MAAM,OACJ,OAAO,KAAK,SAAS,WACjB,KAAK,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,GACnC,KAAK,QAAQ,EAAE;EACtB,MAAM,OAAO,KAAK,QAAQ,QAAQ,KAAK;EAEvC,MAAM,eAAe,KAAK,kBAAkB,MAAM,QAAQ,OAAO,EAC/D,aAAa,CAAC,CAAC,QAAQ,QAAQ,MAChC,CAAC;EACF,MAAM,cAAc,KAAK,iBACvB,MACA,QAAQ,QAAQ,MAChB,MACA,QAAQ,MACT;EACD,MAAM,aAAa,KAAK,gBAAgB,QAAQ,KAAK,QAAQ,KAAK;EAElE,IAAI;AACJ,MAAI,QAAQ,QAAQ,MAAM;AACxB,eAAY,KAAK,cAAc,KAAK;AACpC,OAAI,cAAc,KAAA,KAAa,OAAO,QAAQ,QAAQ,SAAS,SAC7D,aAAY,QAAQ,QAAQ;;AAIhC,QAAM,QAAQ,QAAQ,QAAQ;GAC5B,OAAO;GACP,MAAM;GACN,KAAK;GACL,KAAK,KAAK,OAAO;GACjB,KAAK,KAAK,MAAM;GAChB;GACA;GACA;GACA,YAAY,KAAK,UAAU,QAAQ;GACnC,MAAM;GACP,CAA6B;;;;;CAUhC,YAAsB,MAAqD;AACzE,SAAO,KAAK,SAAS,UAClB,YAAY,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,SAAS,KAAK,CACrE;;;;;CAMH,oBACE,MACuC;AACvC,SAAO,KAAK,qBAAqB,CAAC,UAC/B,YAAY,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,SAAS,KAAK,CACrE;;;;;CAMH,aAAuB,aAAkD;AACvE,SAAO,KAAK,SAAS,QAAQ,QAAQ,IAAI,SAAS,MAAM,cAAc;;;;;CAMxE,cAAwB,aAAkD;AACxE,SAAO,KAAK,SAAS,QAAQ,QAAQ,IAAI,SAAS,OAAO,cAAc;;;;;CAMzE,oBAGE;AACA,SAAO,EAAE,GAAG,KAAK,aAAa;;;;;CAUhC,kBACE,MACA,QACA,UAAqC,EAAE,EAClB;EACrB,MAAM,EAAE,cAAc,UAAU;EAChC,MAAM,WAAW,OAAO,QAAQ,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,YAAY;GACxE;GACA,SAAS,CACP,KACA,GAAK,MAAc,YACf,MAAc,QAAQ,CAAE,MAAc,MAAM,GAAG,KAAA,MACjD,EAAE,CACL;GACD,aAAc,MAAc;GAC5B,QAAQ;GACT,EAAE;AAGH,MAAI,YACF,UAAS,KAAK;GACZ,KAAK;GACL,SAAS,CAAC,QAAQ,IAAI;GACtB,aAAa,KAAA;GACb,QAAQ,EAAE,QAAQ;GACnB,CAAC;EAGJ,MAAM,SAAS,KAAK,WAAW,MAAM,SAAS;AAG9C,SAAO,OAAO;AAGd,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,WAAW,CAC1D,KAAI,EAAE,OAAO,WAAW,EAAE,OAAO,WAAW,MAAM,EAAE;GAClD,MAAM,cAAc;AACpB,OAAI,eAAe,aAAa,YAC9B,QAAO,OAAO,YAAY;;AAKhC,MAAI;AACF,UAAO,KAAK,OAAO,MAAM,OAAO,QAAQ,OAAO;WACxC,OAAO;AACd,OAAI,iBAAiB,aACnB,OAAM,IAAI,aACR,iBAAiB,MAAM,MAAM,gBAAgB,UAAU,GAAG,MAAM,MAAM,UACvE;AAEH,SAAM;;;;;;CAOV,gBACE,QACA,aACqB;EACrB,MAAM,SAA8B,EAAE;EACtC,MAAM,UAAoB,EAAE;AAE5B,OAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,OAAO,WAAW,EAAE;GACjE,MAAM,QAAQ,QAAQ,IAAI;AAE1B,OAAI,UAAU,KAAA,EACZ,QAAO,OAAO;YACL,aAAa,WACtB,QAAO,OAAO,WAAW;YAChB,EAAE,OAAO,WAAW,WAAW,EAAE,OAG1C,SAAQ,KAAK,IAAI;;AAIrB,MAAI,QAAQ,SAAS,GAAG;GACtB,MAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,SAAM,IAAI,aACR,wCAAwC,QAAQ,SAAS,IAAI,MAAM,GAAG,IAAI,OAC3E;;AAGH,MAAI;AACF,UAAO,KAAK,OAAO,MAAM,OAAO,QAAQ,OAAO;WACxC,OAAO;AACd,OAAI,iBAAiB,aACnB,OAAM,IAAI,aACR,iCAAiC,MAAM,MAAM,gBAAgB,MAAM,GAAG,MAAM,MAAM,UACnF;AAEH,SAAM;;;;;;CAOV,cAAwB,MAAoC;AAC1D,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,MAAM,KAAK;AAGjB,OAAI,IAAI,WAAW,UAAU,IAAI,IAAI,WAAW,MAAM,CACpD,QAAO,IAAI,MAAM,IAAI,CAAC;AAIxB,OAAI,QAAQ,YAAY,QAAQ,MAAM;IACpC,MAAM,UAAU,KAAK,IAAI;AACzB,QAAI,WAAW,CAAC,QAAQ,WAAW,IAAI,CACrC,QAAO;AAET,UAAM,IAAI,aAAa,gCAAgC;;;;;;;CAU7D,MAAgB,YACd,MACA,MACe;EACf,MAAM,WAAW,CAAC,OAAO;AACzB,MAAI,KACF,UAAS,KAAK,QAAQ,OAAO;AAE/B,OAAK,IAAI,MAAM,sBAAsB,SAAS,KAAK,KAAK,GAAG;AAC3D,QAAM,KAAK,SAAS,QAAQ,MAAM,SAAS;;;;;CAM7C,WACE,MACA,UACA,UAAgC,EAAE,EACb;EACrB,MAAM,EAAE,SAAS,SAAS;EAC1B,MAAM,SAA8B,EAAE;AAEtC,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,MAAM,KAAK;AACjB,OAAI,CAAC,IAAI,WAAW,IAAI,CAAE;GAE1B,MAAM,CAAC,QAAQ,GAAG,cAAc,IAAI,QAAQ,WAAW,GAAG,CAAC,MAAM,IAAI;GACrE,IAAI,QAAQ,WAAW,KAAK,IAAI;GAEhC,MAAM,MAAM,SAAS,MAAM,MAAM,EAAE,QAAQ,SAAS,OAAO,CAAC;AAC5D,OAAI,CAAC,KAAK;AACR,QAAI,OACF,OAAM,IAAI,aAAa,mBAAmB,SAAS;AAErD;;GAIF,MAAM,qBACJ,EAAE,OAAO,QAAQ,IAAI,OAAO,IAC3B,IAAI,OAAkB,MAAM,MAAM,MAAM,EAAE,OAAO,UAAU,EAAE,CAAC;AAEjE,OAAI,EAAE,OAAO,UAAU,IAAI,OAAO,CAChC,QAAO,IAAI,OAAO;YACT,sBAAsB,CAAC,OAAO;IAEvC,MAAM,UAAU,KAAK,IAAI;AACzB,QAAI,WAAW,CAAC,QAAQ,WAAW,IAAI,EAAE;AAEvC,YAAO,IAAI,OAAO;AAClB;UAGA,QAAO,IAAI,OAAO;cAEX,MAET,KAAI;AACF,QAAI,EAAE,OAAO,SAAS,IAAI,OAAO,IAAI,EAAE,OAAO,QAAQ,IAAI,OAAO,CAC/D,QAAO,IAAI,OAAO,KAAK,MAAM,MAAM;QAEnC,QAAO,IAAI,OAAO;WAEd;AACN,UAAM,IAAI,aAAa,iCAAiC,SAAS;;QAE9D;IAEL,MAAM,UAAU,KAAK,IAAI;AACzB,QAAI,WAAW,CAAC,QAAQ,WAAW,IAAI,EAAE;AACvC,aAAQ;AACR,SAAI;AACF,UAAI,EAAE,OAAO,SAAS,IAAI,OAAO,IAAI,EAAE,OAAO,QAAQ,IAAI,OAAO,CAC/D,QAAO,IAAI,OAAO,KAAK,MAAM,MAAM;UAEnC,QAAO,IAAI,OAAO;aAEd;AACN,YAAM,IAAI,aAAa,iCAAiC,SAAS;;UAGnE,OAAM,IAAI,aAAa,UAAU,OAAO,oBAAoB;;;AAKlE,SAAO;;;;;CAMT,uBACE,MACA,UACa;EACb,MAAM,2BAAW,IAAI,KAAa;AAElC,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,MAAM,KAAK;AACjB,OAAI,CAAC,IAAI,WAAW,IAAI,CAAE;AAE1B,YAAS,IAAI,EAAE;GAEf,MAAM,CAAC,QAAQ,GAAG,cAAc,IAAI,QAAQ,WAAW,GAAG,CAAC,MAAM,IAAI;GACrE,MAAM,gBAAgB,WAAW,SAAS;GAE1C,MAAM,MAAM,SAAS,MAAM,MAAM,EAAE,QAAQ,SAAS,OAAO,CAAC;AAC5D,OAAI,CAAC,IAAK;GAGV,MAAM,qBACJ,EAAE,OAAO,QAAQ,IAAI,OAAO,IAC3B,IAAI,OAAkB,MAAM,MAAM,MAAM,EAAE,OAAO,UAAU,EAAE,CAAC;AAIjE,OACE,CAAC,EAAE,OAAO,UAAU,IAAI,OAAO,IAC/B,CAAC,sBACD,CAAC,eACD;IACA,MAAM,UAAU,KAAK,IAAI;AACzB,QAAI,WAAW,CAAC,QAAQ,WAAW,IAAI,CACrC,UAAS,IAAI,IAAI,EAAE;cAEZ,sBAAsB,CAAC,eAAe;IAE/C,MAAM,UAAU,KAAK,IAAI;AACzB,QAAI,WAAW,CAAC,QAAQ,WAAW,IAAI,CACrC,UAAS,IAAI,IAAI,EAAE;;;AAKzB,SAAO;;CAGT,iBACE,MACA,QACA,gBAAgB,OAChB,YACK;AACL,MAAI,CAAC,OACH;EAIF,MAAM,WAAW,aACb,OAAO,QAAQ,WAAW,WAAW,CAAC,KAAK,CAAC,KAAK,YAAY;GAC3D;GACA,SAAS,CACP,KACA,GAAK,MAAc,YACf,MAAc,QAAQ,CAAE,MAAc,MAAM,GAAG,KAAA,MACjD,EAAE,CACL;GACD,QAAQ;GACT,EAAE,GACH,EAAE;EACN,MAAM,kBAAkB,KAAK,uBAAuB,MAAM,SAAS;EAGnE,MAAM,iBAAiB,KAAK,QACzB,KAAK,QAAQ,CAAC,IAAI,WAAW,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAChE;EAED,MAAM,WAAW,gBAAgB,iBAAiB,eAAe,MAAM,EAAE;AAEzE,MAAI;AACF,OAAI,EAAE,OAAO,WAAW,OAAO,EAAE;AAE/B,QAAI,SAAS,WAAW,EACtB;AAEF,WAAO,KAAK,mBAAmB,SAAS,IAAI,OAAO;cAC1C,EAAE,OAAO,QAAQ,OAAO,IAAI,OAAO,OAAO;IAEnD,MAAM,SAAgB,EAAE;IACxB,MAAM,QAAQ,OAAO;AACrB,SAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;KACrC,MAAM,aAAa,MAAM;AACzB,SAAI,IAAI,SAAS,OACf,QAAO,KAAK,KAAK,mBAAmB,SAAS,IAAI,WAAW,CAAC;cACpD,EAAE,OAAO,WAAW,WAAW,CACxC,QAAO,KAAK,KAAA,EAAU;SAEtB,OAAM,IAAI,aACR,yCAAyC,IAAI,IAC9C;;AAGL,WAAO;UACF;AAEL,QAAI,SAAS,WAAW,EACtB,OAAM,IAAI,aAAa,4BAA4B;AAErD,WAAO,KAAK,mBAAmB,SAAS,IAAI,OAAO;;WAE9C,OAAO;AACd,OAAI,iBAAiB,aACnB,OAAM,IAAI,aAAa,qBAAqB,MAAM,MAAM,UAAU;AAEpE,SAAM;;;;;;CAOV,mBAA6B,OAAe,QAAsB;AAChE,MAAI,EAAE,OAAO,SAAS,OAAO,CAC3B,QAAO;AAGT,MAAI,EAAE,OAAO,SAAS,OAAO,IAAI,EAAE,OAAO,UAAU,OAAO,EAAE;GAC3D,MAAM,MAAM,OAAO,MAAM;AACzB,OAAI,OAAO,MAAM,IAAI,CACnB,OAAM,IAAI,aAAa,yBAAyB,MAAM,GAAG;AAE3D,OAAI,EAAE,OAAO,UAAU,OAAO,IAAI,CAAC,OAAO,UAAU,IAAI,CACtD,OAAM,IAAI,aAAa,0BAA0B,MAAM,GAAG;AAE5D,UAAO;;AAGT,MAAI,EAAE,OAAO,UAAU,OAAO,EAAE;GAC9B,MAAM,QAAQ,MAAM,aAAa;AACjC,OAAI,UAAU,UAAU,UAAU,IAAK,QAAO;AAC9C,OAAI,UAAU,WAAW,UAAU,IAAK,QAAO;AAC/C,SAAM,IAAI,aAAa,0BAA0B,MAAM,GAAG;;AAI5D,SAAO;;;;;CAUT,kBAA4B,QAA0B;AACpD,MAAI,CAAC,OACH,QAAO;AAGT,MAAI,EAAE,OAAO,WAAW,OAAO,EAAE;GAC/B,MAAM,WAAW,KAAK,YAAY,OAAO;AAEzC,UAAO,KADK,WAAW,SAAU,OAAe,QAAQ,SACtC,SAAS;;AAG7B,MAAI,EAAE,OAAO,QAAQ,OAAO,IAAI,OAAO,MAUrC,QAAO,IATO,OAAO,MACF,KAAK,MAAM,UAAU;GACtC,MAAM,UAAU,MAAM,QAAQ;GAC9B,MAAM,WAAW,KAAK,YAAY,KAAK;AACvC,OAAI,EAAE,OAAO,WAAW,KAAK,CAC3B,QAAO,IAAI,UAAU,SAAS;AAEhC,UAAO,IAAI,UAAU,SAAS;IAC9B,CACc,KAAK,IAAI;EAG3B,MAAM,WAAW,KAAK,YAAY,OAAO;AAEzC,SAAO,KADK,WAAW,SAAU,OAAe,QAAQ,SACtC,SAAS;;;;;CAM7B,YAAsB,QAAyB;AAC7C,MAAI,CAAC,OAAQ,QAAO;AAGpB,MAAI,EAAE,OAAO,SAAS,OAAO,CAAE,QAAO;AACtC,MAAI,EAAE,OAAO,SAAS,OAAO,CAAE,QAAO;AACtC,MAAI,EAAE,OAAO,UAAU,OAAO,CAAE,QAAO;AACvC,MAAI,EAAE,OAAO,UAAU,OAAO,CAAE,QAAO;AAEvC,SAAO;;;;;;;;CAST,UAAiB,SAAuC;EACtD,MAAM,UAAU,KAAK,QAAQ;EAC7B,MAAM,IAAI,KAAK;AACf,OAAK,IAAI,KAAK,GAAG;AAEjB,MAAI,SAAS,MAAM;GAEjB,MAAM,cAAc,QAAQ;GAC5B,MAAM,YAAY,cACd,IAAI,EAAE,IAAI,QAAQ,YAAY,KAC9B,KAAK,yBAAyB,QAAQ,QAAQ,KAAK;GACvD,MAAM,cAAc,KAAK,eAAe,QAAQ;GAChD,MAAM,QACJ,GAAG,EAAE,IAAI,cAAc,QAAQ,CAAC,GAAG,EAAE,IAAI,QAAQ,YAAY,GAAG,YAAY,MAAM;AACpF,QAAK,IAAI,KAAK,GAAG,EAAE,IAAI,cAAc,SAAS,CAAC,GAAG,QAAQ;AAE1D,OAAI,QAAQ,QAAQ,aAAa;AAC/B,SAAK,IAAI,KAAK,GAAG;AACjB,SAAK,IAAI,KAAK,KAAK,QAAQ,QAAQ,cAAc;;AAInD,OAAI,aAAa;AACf,SAAK,IAAI,KAAK,GAAG;AACjB,SAAK,IAAI,KAAK,EAAE,IAAI,cAAc,YAAY,CAAC;IAC/C,MAAM,kBAAkB,KAAK,qBAAqB,QAAQ,SAAS;AAEnE,SAAK,MAAM,SAAS,QAAQ,UAAU;AACpC,SAAI,MAAM,QAAQ,KAChB;KAEF,MAAM,iBAAiB,KAAK,kBAAkB,MAAM,QAAQ,KAAK;KAEjE,MAAM,aAAa,GADJ,CAAC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK,GACzB;KAC/B,MAAM,aAAa,GAAG,EAAE,IAAI,cAAc,QAAQ,CAAC,GAAG,EAAE,IAAI,QAAQ,YAAY,CAAC,GAAG,EAAE,IAAI,QAAQ,WAAW;KAC7G,MAAM,UAAU,IAAI,OAClB,KAAK,IAAI,GAAG,kBAAkB,WAAW,OAAO,CACjD;AACD,UAAK,IAAI,KACP,OAAO,aAAa,QAAQ,IAAI,MAAM,QAAQ,eAAe,KAC9D;;;AAIL,QAAK,IAAI,KAAK,GAAG;AACjB,QAAK,IAAI,KAAK,EAAE,IAAI,cAAc,SAAS,CAAC;GAE5C,MAAM,QAAQ;IACZ,GAAG,OAAO,QAAQ,QAAQ,MAAM,WAAW,CAAC,KAAK,CAAC,KAAK,YAAY;KACjE;KACA,QAAQ;KACR,SAAS,CACP,KACA,GAAK,MAAc,YACf,MAAc,QAAQ,CAAE,MAAc,MAAM,GAAG,EAAE,EACtD;KACD,aAAc,MAAc;KAC7B,EAAE;IAEH,GAAI,QAAQ,QAAQ,OAChB,CACE;KACE,KAAK;KACL,SAAS,CAAC,KAAK,OAAO;KACtB,aACE,OAAO,QAAQ,QAAQ,SAAS,WAC5B,kDAAkD,QAAQ,QAAQ,KAAK,KACvE;KACN,QAAQ,EAAE,QAAQ;KACnB,CACF,GACD,EAAE;IACN,GAAG,OAAO,QAAQ,KAAK,mBAAmB,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY;KACjE;KACA,GAAG;KACJ,EAAE;IACJ;GAED,MAAM,gBAAgB,KAAK,iBAAiB,MAAM;AAClD,QAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,EAAE,SAAS,gBAAgB;IACjC,MAAM,SAAS,YAAY,OAAQ,KAAK,SAAqB,KAAA;IAK7D,MAAM,WAHiB,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAChE,OAAO,CACP,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,OAAO,CAEnC,KAAK,MAAe,EAAE,WAAW,IAAI,IAAI,MAAM,KAAK,IAAK,CACzD,KAAK,KAAK;IACb,MAAM,cAAc,EAAE,IAAI,cAAc,QAAQ;IAChD,MAAM,UAAU,IAAI,OAAO,KAAK,IAAI,GAAG,gBAAgB,QAAQ,OAAO,CAAC;IACvE,MAAM,gBAAgB,KAAK,sBAAsB,aAAa,OAAO;AACrE,SAAK,IAAI,KAAK,OAAO,cAAc,QAAQ,IAAI,gBAAgB;;GAIjE,MAAM,UAAU,OAAO,QAAQ,QAAQ,IAAI,WAAW;AACtD,OAAI,QAAQ,SAAS,GAAG;AACtB,SAAK,IAAI,KAAK,GAAG;AACjB,SAAK,IAAI,KAAK,EAAE,IAAI,cAAc,OAAO,CAAC;IAC1C,MAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC;AACpE,SAAK,MAAM,CAAC,KAAK,WAAW,SAAS;KACnC,MAAM,aAAa,EAAE,OAAO,WAAW,OAAkB;KACzD,MAAM,cAAe,OAAe,eAAe;KACnD,MAAM,cAAc,aAChB,EAAE,IAAI,aAAa,cAAc,GACjC,EAAE,IAAI,OAAO,cAAc;KAC/B,MAAM,aAAa,EAAE,IAAI,QAAQ,IAAI;KACrC,MAAM,UAAU,IAAI,OAAO,KAAK,IAAI,GAAG,eAAe,IAAI,OAAO,CAAC;AAClE,UAAK,IAAI,KACP,OAAO,aAAa,QAAQ,IAAI,cAAc,cAC/C;;;SAGA;AAEL,QAAK,IAAI,KAAK,KAAK,eAAe,sBAAsB;AACxD,QAAK,IAAI,KAAK,GAAG;AACjB,QAAK,IAAI,KAAK,EAAE,IAAI,cAAc,YAAY,CAAC;GAG/C,MAAM,mBAAmB,KAAK,qBAAqB;GACnD,MAAM,eAAe,KAAK,gBAAgB,iBAAiB;AAE3D,QAAK,MAAM,OAAO,kBAAkB;AAElC,QAAI,IAAI,SAAS,MAAM,IAAI,QAAQ,KACjC;IAOF,MAAM,aAAa,GAJJ,CAAC,IAAI,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,KAAK,GAClC,IAAI,cAClB,eACA,KAAK,kBAAkB,IAAI,QAAQ,KAAK;IAE5C,MAAM,aAAa,GAAG,EAAE,IAAI,cAAc,QAAQ,CAAC,GAAG,EAAE,IAAI,QAAQ,WAAW;IAC/E,MAAM,UAAU,IAAI,OAClB,KAAK,IAAI,GAAG,eAAe,WAAW,OAAO,CAC9C;AACD,SAAK,IAAI,KACP,OAAO,aAAa,QAAQ,IAAI,IAAI,QAAQ,eAAe,KAC5D;;AAGH,QAAK,IAAI,KAAK,GAAG;AACjB,QAAK,IAAI,KAAK,EAAE,IAAI,cAAc,SAAS,CAAC;GAG5C,MAAM,cAAc,KAAK,SAAS,MAAM,QAAQ,IAAI,SAAS,GAAG;GAehE,MAAM,cAAc,CAClB,GAfgB,cACd,OAAO,QAAQ,YAAY,MAAM,WAAW,CAAC,KAAK,CAAC,KAAK,YAAY;IAClE;IACA,SAAS,CACP,KACA,GAAK,MAAc,YACf,MAAc,QAAQ,CAAE,MAAc,MAAM,GAAG,KAAA,MACjD,EAAE,CACL;IACD,aAAc,MAAc;IAC5B,QAAQ;IACT,EAAE,GACH,EAAE,EAIJ,GAAG,OAAO,OAAO,KAAK,mBAAmB,CAAC,CAC3C;GACD,MAAM,gBAAgB,KAAK,iBAAiB,YAAY;AACxD,QAAK,MAAM,EAAE,SAAS,aAAa,YAAY,aAAa;IAC1D,MAAM,UAAU,QACb,KAAK,MAAO,EAAE,WAAW,IAAI,IAAI,MAAM,KAAK,IAAK,CACjD,KAAK,KAAK;IACb,MAAM,cAAc,EAAE,IAAI,cAAc,QAAQ;IAChD,MAAM,UAAU,IAAI,OAAO,KAAK,IAAI,GAAG,gBAAgB,QAAQ,OAAO,CAAC;IACvE,MAAM,gBAAgB,KAAK,sBAAsB,aAAa,OAAO;AACrE,SAAK,IAAI,KAAK,OAAO,cAAc,QAAQ,IAAI,gBAAgB;;;AAGnE,OAAK,IAAI,KAAK,GAAG;;;;;CAMnB,yBAAmC,QAA0B;AAC3D,MAAI,CAAC,OACH,QAAO;EAGT,MAAM,IAAI,KAAK;AAEf,MAAI,EAAE,OAAO,WAAW,OAAO,EAAE;GAC/B,MAAM,WAAW,KAAK,YAAY,OAAO;GACzC,MAAM,MAAM,WAAW,SAAU,OAAe,QAAQ;AACxD,UAAO,IAAI,EAAE,IAAI,aAAa,IAAI,MAAM,SAAS,GAAG;;AAGtD,MAAI,EAAE,OAAO,QAAQ,OAAO,IAAI,OAAO,MAUrC,QAAO,IATO,OAAO,MACF,KAAK,MAAM,UAAU;GACtC,MAAM,UAAU,MAAM,QAAQ;GAC9B,MAAM,WAAW,KAAK,YAAY,KAAK;AACvC,OAAI,EAAE,OAAO,WAAW,KAAK,CAC3B,QAAO,EAAE,IAAI,aAAa,IAAI,UAAU,SAAS,GAAG;AAEtD,UAAO,EAAE,IAAI,QAAQ,IAAI,UAAU,SAAS,GAAG;IAC/C,CACc,KAAK,IAAI;EAG3B,MAAM,WAAW,KAAK,YAAY,OAAO;EACzC,MAAM,MAAM,WAAW,SAAU,OAAe,QAAQ;AACxD,SAAO,IAAI,EAAE,IAAI,QAAQ,IAAI,MAAM,SAAS,GAAG;;;;;CAMjD,eAAyB,SAAwC;EAC/D,MAAM,OAAiB,CAAC,QAAQ,KAAK;EACrC,IAAI,UAAU;AAGd,SAAO,MAAM;GACX,MAAM,SAAS,KAAK,kBAAkB,QAAQ;AAC9C,OAAI,CAAC,OAAQ;AACb,QAAK,QAAQ,OAAO,KAAK;AACzB,aAAU;;AAGZ,SAAO,KAAK,KAAK,IAAI;;;;;CAMvB,kBACE,SACmC;AACnC,OAAK,MAAM,OAAO,KAAK,SACrB,KAAI,IAAI,SAAS,SAAS,QAAQ,CAChC,QAAO;;;;;CASb,sBAAyD;EACvD,MAAM,8BAAc,IAAI,KAA4B;AAGpD,OAAK,MAAM,WAAW,KAAK,SACzB,MAAK,MAAM,SAAS,QAAQ,SAC1B,aAAY,IAAI,MAAM;AAK1B,SAAO,KAAK,SAAS,QAAQ,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC;;;;;CAM7D,qBAA+B,UAA2C;AACxE,SAAO,KAAK,IACV,GAAG,SACA,QAAQ,MAAM,CAAC,EAAE,QAAQ,KAAK,CAC9B,KAAK,MAAM;AAGV,UAAO,GAFQ,CAAC,EAAE,MAAM,GAAG,EAAE,QAAQ,CAAC,KAAK,KAAK,GAC9B,KAAK,kBAAkB,EAAE,QAAQ,KAAK,GACzB;IAC/B,EACJ,EACD;;;;;CAMH,gBAA0B,UAAsC;AAC9D,SAAO,KAAK,IACV,GAAG,SACA,QAAQ,MAAM,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,GAAG,CAC/C,KAAK,MAAM;AAKV,UAAO,GAJQ,CAAC,EAAE,MAAM,GAAG,EAAE,QAAQ,CAAC,KAAK,KAAK,GAC9B,EAAE,cAChB,eACA,KAAK,kBAAkB,EAAE,QAAQ,KAAK,GACX;IAC/B,CACL;;;;;CAMH,iBAA2B,OAAwC;AACjE,SAAO,KAAK,IACV,GAAG,MAAM,KAAK,MAAM;AAElB,WADgB,MAAM,QAAQ,EAAE,QAAQ,GAAG,EAAE,UAAU,CAAC,EAAE,QAAQ,EAE/D,KAAK,MAAO,EAAE,WAAW,IAAI,IAAI,MAAM,KAAK,IAAK,CACjD,KAAK,KAAK,CAAC;IACd,CACH;;;;;;CAOH,cAAwB,QAAuC;AAC7D,MAAI,CAAC,OAAQ,QAAO,KAAA;AAGpB,MACE,UAAU,UACV,MAAM,QAAQ,OAAO,KAAK,IAC1B,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,SAAS,CAE/C,QAAO,OAAO;AAIhB,MAAI,EAAE,OAAO,QAAQ,OAAO,EAAE;GAC5B,MAAM,QAAQ;GACd,MAAM,SAAmB,EAAE;AAE3B,QAAK,MAAM,WAAW,MAAM,MAE1B,KACE,EAAE,OAAO,SAAS,QAAQ,IAC1B,WAAW,WACX,OAAO,QAAQ,UAAU,SAEzB,QAAO,KAAK,QAAQ,MAAM;OAG1B;AAIJ,UAAO,OAAO,SAAS,IAAI,SAAS,KAAA;;;;;;CASxC,sBACE,aACA,QACQ;EACR,MAAM,WAAW,eAAe;AAEhC,MAAI,CAAC,OAAQ,QAAO;EAEpB,MAAM,aAAa,KAAK,cAAc,OAAO;AAC7C,MAAI,cAAc,WAAW,SAAS,GAAG;GACvC,MAAM,YAAY,WAAW,KAAK,KAAK;GAEvC,MAAM,WADI,KAAK,MACI,IAAI,aAAa,IAAI,UAAU,GAAG;AACrD,UAAO,WAAW,GAAG,SAAS,GAAG,aAAa;;AAGhD,SAAO;;;;;;;;;;;;;;;;;;ACrwCX,MAAa,gBAAgB,QAAQ;CACnC,MAAM;CACN,YAAY,CAAC,SAAS;CACtB,UAAU;EAAC;EAAa;EAAQ;EAAO;EAAa;EAAa;EAAS;CAC3E,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["createPromptInterface","createPromptInterface"],"sources":["../../src/command/helpers/PrettyAsker.ts","../../src/command/helpers/Asker.ts","../../src/command/helpers/EnvUtils.ts","../../src/command/helpers/PrettyPrint.ts","../../src/command/errors/CommandError.ts","../../src/command/helpers/Runner.ts","../../src/command/primitives/$command.ts","../../src/command/providers/CliProvider.ts","../../src/command/index.ts"],"sourcesContent":["import { stdin, stdout } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport { $inject, Alepha, AlephaError, type TSchema } from \"alepha\";\nimport { ConsoleColorProvider } from \"alepha/logger\";\n\n/**\n * Clack-style interactive prompt renderer.\n *\n * Provides pretty enum selectors (arrow-key navigation),\n * text inputs, and confirm prompts with box-drawing framing.\n */\nexport class PrettyAsker {\n protected readonly alepha = $inject(Alepha);\n protected readonly color = $inject(ConsoleColorProvider);\n\n /**\n * Whether to use pretty mode.\n *\n * Same conditions as Runner.useDynamicLogger.\n */\n public get enabled(): boolean {\n if (this.alepha.isCI() || this.alepha.env.CLAUDECODE) {\n return false;\n }\n\n const logLevel = String(this.alepha.env.LOG_LEVEL || \"\").toLowerCase();\n if (logLevel === \"debug\" || logLevel === \"trace\") {\n return false;\n }\n\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // Framing\n // ---------------------------------------------------------------------------\n\n /**\n * Print the opening frame with a title.\n */\n public intro(title: string): void {\n const c = this.color;\n this.write(`\\n${c.set(\"DIM\", \"┌\")} ${c.set(\"BOLD\", title)}\\n`);\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n }\n\n /**\n * Print the closing frame with a message.\n */\n public outro(message: string): void {\n const c = this.color;\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.write(`${c.set(\"DIM\", \"└\")} ${message}\\n\\n`);\n }\n\n // ---------------------------------------------------------------------------\n // Select (arrow-key navigation)\n // ---------------------------------------------------------------------------\n\n /**\n * Arrow-key select prompt for enum schemas.\n */\n public async select(question: string, options: string[]): Promise<string> {\n let selectedIndex = 0;\n\n this.write(`${this.color.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(question);\n this.renderOptions(options, selectedIndex);\n\n return new Promise<string>((resolve, reject) => {\n const hasRawMode = typeof stdin.setRawMode === \"function\";\n if (!hasRawMode) {\n // Fallback: no raw mode (piped stdin, etc.)\n this.clearOptions(options.length);\n this.writeCompletedMarker(question);\n this.writeAnswer(options[0]);\n resolve(options[0]);\n return;\n }\n\n stdin.setRawMode(true);\n stdin.resume();\n\n const onKeypress = (data: Buffer) => {\n const key = data.toString();\n\n // Ctrl+C\n if (key === \"\\x03\") {\n cleanup();\n stdin.setRawMode(false);\n stdin.pause();\n reject(new AlephaError(\"Aborted.\"));\n return;\n }\n\n // Arrow up / k\n if (key === \"\\x1b[A\" || key === \"k\") {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n this.clearOptions(options.length);\n this.renderOptions(options, selectedIndex);\n return;\n }\n\n // Arrow down / j\n if (key === \"\\x1b[B\" || key === \"j\") {\n selectedIndex = (selectedIndex + 1) % options.length;\n this.clearOptions(options.length);\n this.renderOptions(options, selectedIndex);\n return;\n }\n\n // Enter\n if (key === \"\\r\" || key === \"\\n\") {\n cleanup();\n stdin.setRawMode(false);\n stdin.pause();\n\n // Clear options and replace with completed marker + answer\n this.clearOptions(options.length);\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(options[selectedIndex]);\n\n resolve(options[selectedIndex]);\n }\n };\n\n const cleanup = () => {\n stdin.removeListener(\"data\", onKeypress);\n };\n\n stdin.on(\"data\", onKeypress);\n });\n }\n\n // ---------------------------------------------------------------------------\n // Text input\n // ---------------------------------------------------------------------------\n\n /**\n * Text input prompt with clack framing.\n */\n public async text(question: string, schema?: TSchema): Promise<string> {\n const c = this.color;\n const defaultValue =\n schema && \"default\" in schema ? String(schema.default) : undefined;\n\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(question);\n\n const defaultHint = defaultValue\n ? ` ${c.set(\"DIM\", `(${defaultValue})`)}`\n : \"\";\n\n this.write(`${c.set(\"DIM\", \"│\")} ${c.set(\"DIM\", \">\")}${defaultHint} `);\n\n const rl = this.createPromptInterface();\n try {\n const answer = await rl.question(\"\");\n const value = answer.trim() || defaultValue || \"\";\n\n // Move up to overwrite the input line\n this.write(\"\\x1b[1A\\x1b[2K\");\n // Move up to overwrite the active marker\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(value);\n\n if (schema) {\n return this.alepha.codec.decode(schema, value || undefined) as string;\n }\n return value;\n } finally {\n rl.close();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Confirm (Y/n)\n // ---------------------------------------------------------------------------\n\n /**\n * Yes/No confirm prompt with clack framing.\n */\n public async confirm(question: string): Promise<boolean> {\n const c = this.color;\n\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(`${question} ${c.set(\"DIM\", \"(Y/n)\")}`);\n this.write(`${c.set(\"DIM\", \"│\")} ${c.set(\"DIM\", \">\")} `);\n\n const rl = this.createPromptInterface();\n try {\n const answer = await rl.question(\"\");\n const value = answer.trim().toLowerCase();\n const result = value !== \"n\" && value !== \"no\";\n\n // Move up to overwrite input\n this.write(\"\\x1b[1A\\x1b[2K\");\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(result ? \"Yes\" : \"No\");\n\n return result;\n } finally {\n rl.close();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Rendering helpers\n // ---------------------------------------------------------------------------\n\n protected renderOptions(options: string[], selectedIndex: number): void {\n const c = this.color;\n for (let i = 0; i < options.length; i++) {\n const isSelected = i === selectedIndex;\n const marker = isSelected\n ? `${c.set(\"CYAN\", \"❯\")} ${c.set(\"CYAN\", options[i])}`\n : ` ${c.set(\"DIM\", options[i])}`;\n this.write(`${c.set(\"DIM\", \"│\")} ${marker}\\n`);\n }\n }\n\n protected clearOptions(count: number): void {\n for (let i = 0; i < count; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n }\n\n protected writeActiveMarker(question: string): void {\n this.write(`${this.color.set(\"CYAN\", \"◆\")} ${question}\\n`);\n }\n\n protected clearActiveMarker(): void {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n\n protected writeCompletedMarker(question: string): void {\n this.write(`${this.color.set(\"DIM\", \"◇\")} ${question}\\n`);\n }\n\n protected writeAnswer(value: string): void {\n this.write(\n `${this.color.set(\"DIM\", \"│\")} ${this.color.set(\"DIM\", value)}\\n`,\n );\n }\n\n protected write(str: string): void {\n stdout.write(str);\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input: stdin, output: stdout });\n }\n}\n","import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport {\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n type TString,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { PrettyAsker } from \"./PrettyAsker.ts\";\n\nexport interface AskOptions<T extends TSchema = TString> {\n /**\n * Response schema expected.\n *\n * Recommended schemas:\n * - t.text() - for free text input\n * - t.number() - for numeric input\n * - t.boolean() - for yes/no input (accepts \"true\", \"false\", \"1\", \"0\")\n * - t.enum([\"option1\", \"option2\"]) - for predefined options\n *\n * You can use schema.default to provide a default value.\n *\n * @example\n * ```ts\n * ask(\"What is your name?\", { schema: t.text({ default: \"John Doe\" }) })\n * ```\n *\n * @default TString\n */\n schema?: T;\n\n /**\n * Custom validation function.\n * Throws an AlephaError in case of validation failure.\n */\n validate?: (value: Static<T>) => void;\n}\n\nexport interface AskMethod {\n <T extends TSchema = TString>(\n question: string,\n options?: AskOptions<T>,\n ): Promise<Static<T>>;\n\n permission: (question: string) => Promise<boolean>;\n intro: (title: string) => void;\n outro: (message: string) => void;\n}\n\nexport class Asker {\n protected readonly log = $logger();\n public readonly ask: AskMethod;\n protected readonly alepha = $inject(Alepha);\n protected readonly pretty = $inject(PrettyAsker);\n\n constructor() {\n this.ask = this.createAskMethod();\n }\n\n protected createAskMethod(): AskMethod {\n const askFn: AskMethod = async <T extends TSchema = TString>(\n question: string,\n options: AskOptions<T> = {},\n ) => {\n return await this.prompt<T>(question, options);\n };\n\n askFn.permission = async (question: string) => {\n if (this.pretty.enabled) {\n return this.pretty.confirm(question);\n }\n const response = await this.prompt(`${question} [Y/n]`, {\n schema: t.enum([\"Y\", \"y\", \"n\", \"no\", \"yes\"], { default: \"Y\" }),\n });\n return response.charAt(0).toLowerCase() === \"y\";\n };\n\n askFn.intro = (title: string) => {\n if (this.pretty.enabled) {\n this.pretty.intro(title);\n }\n };\n\n askFn.outro = (message: string) => {\n if (this.pretty.enabled) {\n this.pretty.outro(message);\n }\n };\n\n return askFn;\n }\n\n protected async prompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n if (this.pretty.enabled) {\n return this.prettyPrompt(question, options);\n }\n return this.plainPrompt(question, options);\n }\n\n /**\n * Pretty mode: delegate to PrettyAsker based on schema type.\n */\n protected async prettyPrompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const schema = options.schema as any;\n\n // Enum schema → arrow-key select\n if (schema?.enum && Array.isArray(schema.enum)) {\n const value = await this.pretty.select(question, schema.enum);\n if (options.validate) {\n options.validate(value as Static<T>);\n }\n return value as Static<T>;\n }\n\n // Text/other schema → text input\n const value = await this.pretty.text(question, schema);\n if (options.validate) {\n options.validate(value as Static<T>);\n }\n return value as Static<T>;\n }\n\n /**\n * Plain mode: readline-based prompts (CI, Claude Code, debug).\n */\n protected async plainPrompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const rl = this.createPromptInterface();\n let value: any;\n try {\n do {\n try {\n this.log.info(question);\n const answer = await rl.question(\"> \");\n if (options.schema) {\n value = this.alepha.codec.decode(\n options.schema,\n answer ? answer.trim() : undefined,\n );\n } else {\n value = String(answer.trim());\n }\n if (options.validate) {\n options.validate(value);\n }\n } catch (error) {\n if (error instanceof AlephaError) {\n this.log.error(`${error.message}\\n`);\n value = undefined;\n } else {\n throw error;\n }\n }\n } while (value === undefined);\n } finally {\n rl.close();\n }\n\n return value;\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input, output });\n }\n}\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { FileSystemProvider } from \"alepha/system\";\n\nexport class EnvUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Load environment variables from .env files into process.env.\n *\n * Variables that already exist in process.env are NOT overwritten,\n * matching the standard dotenv convention where the shell environment\n * takes precedence over .env file values.\n *\n * By default, it loads from \".env\" and \".env.local\".\n * You can specify additional files to load, e.g. [\".env\", \".env.production\"].\n */\n public async loadEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<void> {\n const vars = await this.parseEnv(root, files);\n for (const [key, value] of Object.entries(vars)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n }\n\n /**\n * Parse environment variables from .env files without mutating process.env.\n *\n * Returns a merged record from all files (later files override earlier ones).\n * For each file, also tries the `.local` variant (e.g. `.env.production.local`).\n */\n public async parseEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n\n for (const it of files) {\n for (const file of [it, `${it}.local`]) {\n const envPath = this.fs.join(root, file);\n try {\n const buffer = await this.fs.readFile(envPath);\n const envContent = buffer.toString(\"utf8\");\n for (const line of envContent.split(\"\\n\")) {\n const [key, ...rest] = line.split(\"=\");\n if (key) {\n const trimmedKey = key.trim();\n if (trimmedKey && !trimmedKey.startsWith(\"#\")) {\n let value = rest.join(\"=\").trim();\n // Strip matching surrounding quotes (single or double)\n if (\n value.length >= 2 &&\n ((value[0] === '\"' && value[value.length - 1] === '\"') ||\n (value[0] === \"'\" && value[value.length - 1] === \"'\"))\n ) {\n value = value.slice(1, -1);\n }\n result[trimmedKey] = value;\n }\n }\n }\n this.log.debug(`Parsed environment variables from ${envPath}`);\n } catch {\n this.log.debug(`No ${file} file found at ${envPath}, skipping.`);\n }\n }\n }\n\n return result;\n }\n}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Interval } from \"alepha/datetime\";\n\nexport class PrettyPrint {\n protected dateTimeProvider = $inject(DateTimeProvider);\n protected spinnerInterval?: Interval;\n protected readonly frames = [\n \"⠋\",\n \"⠙\",\n \"⠹\",\n \"⠸\",\n \"⠼\",\n \"⠴\",\n \"⠦\",\n \"⠧\",\n \"⠇\",\n \"⠏\",\n ];\n protected tasks = new Map<\n string,\n {\n taskName: string;\n frameIndex: number;\n status: \"running\" | \"success\" | \"error\";\n startTime: number;\n duration?: string;\n message?: string;\n }\n >();\n protected lastLineCount = 0;\n protected header?: string;\n protected commandStartTime?: number;\n protected paused = false;\n\n // stdout interception\n protected originalStdoutWrite?: (...args: any[]) => boolean;\n protected bufferedOutput: string[] = [];\n protected isOwnWrite = false;\n\n // ANSI color codes\n protected readonly colors = {\n reset: \"\\x1b[0m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n dim: \"\\x1b[2m\",\n };\n\n /**\n * Start a new command session with header\n */\n public startCommand(cliName: string, commandName: string): void {\n this.header = commandName ? `${cliName} ${commandName}` : cliName;\n this.commandStartTime = this.dateTimeProvider.nowMillis();\n this.tasks.clear();\n this.lastLineCount = 0;\n this.write(`┌─ ${this.header}\\n`);\n }\n\n /**\n * End the command session with footer\n */\n public endCommand(): void {\n this.restoreStdout();\n if (this.commandStartTime) {\n const totalDuration = (\n (this.dateTimeProvider.nowMillis() - this.commandStartTime) /\n 1000\n ).toFixed(1);\n this.write(`└─ Done in ${totalDuration}s\\n`);\n }\n this.header = undefined;\n this.commandStartTime = undefined;\n }\n\n /**\n * Start an animated spinner with a task name\n */\n public startSpinner(id: string, taskName: string): void {\n this.tasks.set(id, {\n taskName,\n frameIndex: 0,\n status: \"running\",\n startTime: this.dateTimeProvider.nowMillis(),\n });\n\n this.interceptStdout();\n\n // Start interval if not already running\n if (!this.spinnerInterval) {\n this.spinnerInterval = this.dateTimeProvider.createInterval(\n () => this.updateDisplay(),\n 80,\n true,\n );\n }\n\n this.updateDisplay();\n }\n\n /**\n * Stop the spinner and show success with a tick\n */\n public success(\n id: string,\n taskName?: string,\n duration?: string,\n message?: string,\n ): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"success\";\n if (taskName) task.taskName = taskName;\n if (duration) task.duration = duration;\n if (message) task.message = message;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n }\n\n /**\n * Stop the spinner and show error with a cross\n */\n public error(id: string, taskName?: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"error\";\n if (taskName) task.taskName = taskName;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n this.restoreStdout();\n }\n\n /**\n * Update the display for all tasks\n */\n protected updateDisplay(): void {\n // Clear previous spinner lines\n if (this.lastLineCount > 0) {\n for (let i = 0; i < this.lastLineCount; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n }\n\n // Flush buffered external output (appears permanently above spinner)\n if (this.bufferedOutput.length > 0) {\n for (const chunk of this.bufferedOutput) {\n this.write(chunk);\n }\n this.bufferedOutput = [];\n }\n\n // Render all tasks\n const taskArray = Array.from(this.tasks.values());\n const prefix = this.header ? \"│ \" : \"\";\n\n for (const task of taskArray) {\n let line = prefix;\n\n if (task.status === \"running\") {\n const frame = this.frames[task.frameIndex];\n const elapsed = String(\n Math.floor(\n (this.dateTimeProvider.nowMillis() - task.startTime) / 100,\n ) / 10,\n ).padEnd(3, \".0\");\n line += `${this.colors.cyan}${frame}${this.colors.reset} ${this.colors.dim}${task.taskName}${this.colors.reset} ${this.colors.dim}${elapsed}s${this.colors.reset}`;\n task.frameIndex = (task.frameIndex + 1) % this.frames.length;\n } else if (task.status === \"success\") {\n const durationStr = task.duration\n ? ` ${this.colors.dim}${task.duration}${this.colors.reset}`\n : \"\";\n const messageStr = task.message ? ` - ${task.message}` : \"\";\n line += `${this.colors.green}✓${this.colors.reset} ${task.taskName}${durationStr}${messageStr}`;\n } else if (task.status === \"error\") {\n line += `${this.colors.red}✗${this.colors.reset} ${task.taskName}`;\n }\n\n this.write(`${line}\\n`);\n }\n\n this.lastLineCount = taskArray.length;\n }\n\n /**\n * Check if all tasks are done and stop the interval\n */\n protected checkIfAllDone(): void {\n const hasRunningTasks = Array.from(this.tasks.values()).some(\n (task) => task.status === \"running\",\n );\n\n if (!hasRunningTasks && this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Pause the spinner animation and restore stdout so external processes\n * (e.g. interactive login) can write to the terminal directly.\n */\n public pause(): void {\n if (this.paused) return;\n this.paused = true;\n\n // Stop the animation interval\n this.stopSpinner();\n\n // Clear spinner lines from screen so external output starts clean\n if (this.lastLineCount > 0) {\n for (let i = 0; i < this.lastLineCount; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n this.lastLineCount = 0;\n }\n\n // Close the box before external output\n if (this.header) {\n this.write(\"└───\\n\\n\");\n }\n\n this.restoreStdout();\n }\n\n /**\n * Resume the spinner animation after a pause.\n */\n public resume(): void {\n if (!this.paused) return;\n this.paused = false;\n\n // Reopen the box after external output\n if (this.header) {\n this.write(\"\\n┌───\\n\");\n }\n\n this.interceptStdout();\n\n const hasRunningTasks = Array.from(this.tasks.values()).some(\n (task) => task.status === \"running\",\n );\n\n if (hasRunningTasks) {\n this.updateDisplay();\n\n if (!this.spinnerInterval) {\n this.spinnerInterval = this.dateTimeProvider.createInterval(\n () => this.updateDisplay(),\n 80,\n true,\n );\n }\n }\n }\n\n /**\n * Stop the spinner without showing any symbol\n */\n public stopSpinner(): void {\n if (this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Clear all tasks\n */\n public clear(): void {\n this.tasks.clear();\n this.stopSpinner();\n this.restoreStdout();\n this.lastLineCount = 0;\n }\n\n // ---------------------------------------------------------------------------\n // stdout interception\n // ---------------------------------------------------------------------------\n\n /**\n * Intercept process.stdout.write so external writes (logs, wrangler output)\n * are buffered instead of breaking the spinner animation. Buffered output is\n * flushed above the spinner area on each redraw.\n */\n protected interceptStdout(): void {\n if (this.originalStdoutWrite) return;\n\n const original = process.stdout.write.bind(process.stdout);\n this.originalStdoutWrite = original;\n\n process.stdout.write = ((\n chunk: any,\n encodingOrCb?: any,\n cb?: any,\n ): boolean => {\n if (this.isOwnWrite) {\n return original(chunk, encodingOrCb, cb);\n }\n this.bufferedOutput.push(String(chunk));\n return true;\n }) as typeof process.stdout.write;\n }\n\n /**\n * Restore the original process.stdout.write and flush remaining buffer.\n */\n protected restoreStdout(): void {\n if (!this.originalStdoutWrite) return;\n\n const original = this.originalStdoutWrite;\n this.originalStdoutWrite = undefined;\n process.stdout.write = original as typeof process.stdout.write;\n\n for (const chunk of this.bufferedOutput) {\n original(chunk);\n }\n this.bufferedOutput = [];\n }\n\n /**\n * Write to stdout bypassing the intercept.\n */\n protected write(str: string): void {\n this.isOwnWrite = true;\n process.stdout.write(str);\n this.isOwnWrite = false;\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class CommandError extends AlephaError {\n readonly name = \"CommandError\";\n}\n","import { cp, glob, rm } from \"node:fs/promises\";\nimport { $inject, Alepha } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { ShellProvider } from \"alepha/system\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { PrettyPrint } from \"./PrettyPrint.ts\";\n\nexport type Task = {\n name: string;\n handler: () => any;\n};\n\ninterface Timer {\n name: string;\n duration: string;\n}\n\nexport interface RunOptions {\n /**\n * Rename the command for logging purposes.\n */\n alias?: string;\n\n /**\n * Root directory to execute the command in.\n */\n root?: string;\n}\n\nexport interface RunnerMethod {\n (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ): Promise<string>;\n rm: (glob: string | string[], options?: RunOptions) => Promise<string>;\n cp: (source: string, dest: string, options?: RunOptions) => Promise<string>;\n\n /**\n * Ends the runner and prints a summary of executed tasks.\n *\n * > This is automatically called at the end of command execution.\n * > But can be called manually if needed to print more stuff before the command ends.\n */\n end: () => void;\n\n /**\n * Pause the spinner so external processes can write to stdout directly.\n */\n pause: () => void;\n\n /**\n * Resume the spinner after a pause.\n */\n resume: () => void;\n}\n\nexport class Runner {\n protected readonly log = $logger();\n protected readonly dateTime = $inject(DateTimeProvider);\n protected timers: Timer[] = [];\n protected readonly startTime: number = this.dateTime.nowMillis();\n protected readonly prettyPrint = $inject(PrettyPrint);\n protected readonly alepha = $inject(Alepha);\n protected readonly shell = $inject(ShellProvider);\n public readonly run: RunnerMethod;\n protected cliName = \"\";\n protected commandName = \"\";\n protected firstTaskStarted = false;\n protected taskCounter = 0;\n\n constructor() {\n this.run = this.createRunMethod();\n }\n\n public get useDynamicLogger() {\n if (this.alepha.isCI() || this.alepha.env.CLAUDECODE) {\n return false;\n }\n\n const logLevel = String(this.alepha.env.LOG_LEVEL || \"\").toLowerCase();\n if (logLevel === \"debug\" || logLevel === \"trace\") {\n return false;\n }\n\n return this.alepha.env.LOG_FORMAT === \"raw\";\n }\n\n /**\n * Start a new command session with header (for pretty print mode)\n */\n public startCommand(cliName: string, commandName: string): void {\n this.cliName = cliName;\n this.commandName = commandName;\n this.firstTaskStarted = false;\n this.taskCounter = 0;\n }\n\n protected createRunMethod() {\n const runFn: RunnerMethod = async (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ) => {\n if (this.useDynamicLogger && !this.firstTaskStarted) {\n this.prettyPrint.startCommand(this.cliName, this.commandName);\n }\n\n this.firstTaskStarted = true;\n\n const root =\n typeof options === \"object\" && options.root ? options.root : undefined;\n\n if (Array.isArray(cmd)) {\n return await this.execute(\n cmd.map((it) =>\n typeof it === \"string\"\n ? { name: it, handler: () => this.exec(it, { root }) }\n : it,\n ),\n );\n }\n\n const alias = typeof options === \"object\" ? options.alias : undefined;\n const name = alias ?? (typeof cmd === \"string\" ? cmd : cmd.name);\n const handler =\n typeof options === \"function\"\n ? options\n : typeof cmd === \"string\"\n ? () => this.exec(cmd, { root })\n : cmd.handler;\n\n return await this.execute({\n name,\n handler,\n });\n };\n\n runFn.rm = async (\n files: string | string[],\n options: RunOptions = {},\n ): Promise<string> => {\n if (Array.isArray(files) || files.includes(\"*\")) {\n return runFn({\n name:\n options.alias ??\n `rm -rf ${Array.isArray(files) ? files.join(\" \") : files}`,\n handler: async () => {\n for await (const file of glob(files)) {\n this.log.trace(`Removing ${file}`);\n await rm(file, { recursive: true, force: true });\n }\n },\n });\n }\n this.log.trace(`Removing ${files}`);\n return runFn({\n name: options.alias ?? `rm -rf ${files}`,\n handler: () => rm(files, { recursive: true, force: true }),\n });\n };\n\n runFn.cp = async (\n source: string,\n dist: string,\n options: RunOptions = {},\n ): Promise<string> => {\n this.log.trace(`Copying ${source} to ${dist}`);\n return runFn(\n {\n name: options.alias ?? `cp -r ${source} ${dist}`,\n handler: () => cp(source, dist, { recursive: true }),\n },\n options,\n );\n };\n\n runFn.end = () => this.end();\n runFn.pause = () => {\n if (this.useDynamicLogger) this.prettyPrint.pause();\n };\n runFn.resume = () => {\n if (this.useDynamicLogger) this.prettyPrint.resume();\n };\n\n return runFn;\n }\n\n protected async exec(\n cmd: string,\n opts: { root?: string } = {},\n ): Promise<string> {\n return this.shell.run(cmd, { root: opts.root, capture: true });\n }\n\n /**\n * Executes one or more tasks.\n *\n * @param task - A single task or an array of tasks to run in parallel.\n */\n protected async execute(task: Task | Task[]): Promise<string> {\n if (Array.isArray(task)) {\n await Promise.all(task.map((t) => this.executeTask(t)));\n return \"\"; // not supported for now\n } else {\n return await this.executeTask(task);\n }\n }\n\n /**\n * Prints a summary of all executed tasks and their durations.\n */\n public end(): void {\n if (this.useDynamicLogger && this.firstTaskStarted) {\n this.prettyPrint.endCommand();\n return;\n }\n\n // Non-dynamic mode: use logging\n if (this.timers.length === 0) return;\n\n this.log.info(\"\");\n const totalTime = (\n (this.dateTime.nowMillis() - this.startTime) /\n 1000\n ).toFixed(1);\n this.log.info(`Total time: ${totalTime}s`);\n this.log.info(``);\n\n // clear timers after rendering\n this.timers = [];\n }\n\n protected async executeTask(task: Task): Promise<string> {\n const now = this.dateTime.nowMillis();\n const taskId = `task-${++this.taskCounter}`; // Use unique counter-based ID\n\n // Setup dynamic logger\n if (this.useDynamicLogger) {\n this.prettyPrint.startSpinner(taskId, task.name);\n } else {\n this.log.info(`Starting '${task.name}' ...`);\n }\n\n let stdout = \"\";\n\n try {\n stdout = String((await task.handler()) ?? \"\");\n } catch (error) {\n // Clear spinner and show error\n if (this.useDynamicLogger) {\n this.prettyPrint.error(taskId, task.name);\n }\n if (error instanceof Error && \"stdout\" in error) {\n this.log.info(`\\n\\n${error.stdout}`);\n }\n throw new CommandError(`Task '${task.name}' failed`, { cause: error });\n }\n\n if (stdout) this.log.trace(stdout);\n\n const duration = ((this.dateTime.nowMillis() - now) / 1000).toFixed(1);\n\n const message =\n stdout && !stdout.includes(\"\\n\") ? stdout.trim() : undefined;\n\n // Clear spinner and show completion\n if (this.useDynamicLogger) {\n this.prettyPrint.success(taskId, task.name, `${duration}s`, message);\n } else {\n const suffix = message ? ` - ${message}` : \"\";\n this.log.info(`Finished '${task.name}' after ${duration}s${suffix}`);\n }\n\n this.timers.push({\n name: task.name,\n duration: `${duration}s`,\n });\n\n return stdout;\n }\n\n protected renderTable(data: string[][]): void {\n if (data.length === 0) return;\n\n const col1Width = Math.max(...data.map(([col1]) => col1.length), 7);\n const col2Width = Math.max(...data.map(([, col2]) => col2.length), 8);\n\n const divider = `+${\"-\".repeat(col1Width + 2)}+${\"-\".repeat(\n col2Width + 2,\n )}+`;\n this.log.info(divider);\n this.log.info(\n `| ${\"Command\".padEnd(col1Width)} | ${\"Duration\".padEnd(col2Width)} |`,\n );\n this.log.info(divider);\n for (const [col1, col2] of data) {\n this.log.info(\n `| ${col1.padEnd(col1Width)} | ${col2.padEnd(col2Width)} |`,\n );\n }\n this.log.info(divider);\n }\n}\n","import type * as fs from \"node:fs/promises\";\nimport type { glob } from \"node:fs/promises\";\nimport {\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n type TSchema,\n t,\n} from \"alepha\";\nimport type { AskMethod } from \"../helpers/Asker.ts\";\nimport type { RunnerMethod } from \"../helpers/Runner.ts\";\n\n/**\n * Declares a CLI command.\n *\n * This primitive allows you to define a command, its flags, and its handler\n * within your Alepha application structure.\n */\nexport const $command = <\n T extends TObject,\n A extends TSchema,\n E extends TObject,\n>(\n options: CommandPrimitiveOptions<T, A, E>,\n) => createPrimitive(CommandPrimitive<T, A, E>, options);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandPrimitiveOptions<\n T extends TObject,\n A extends TSchema,\n E extends TObject = TObject,\n> {\n /**\n * The handler function to execute when the command is matched.\n *\n * For parent commands with children, the handler is called when:\n * - The parent command is invoked without a subcommand\n * - The parent command is invoked with --help (to show available subcommands)\n */\n handler: (args: CommandHandlerArgs<T, A, E>) => Async<void>;\n\n /**\n * The name of the command. If omitted, the property key is used.\n *\n * An empty string \"\" denotes the root command.\n */\n name?: string;\n\n /**\n * A short description of the command, shown in the help message.\n */\n description?: string;\n\n /**\n * An array of alternative names for the command.\n */\n aliases?: string[];\n\n /**\n * A TypeBox object schema defining the flags for the command.\n */\n flags?: T;\n\n /**\n * A TypeBox object schema defining required environment variables.\n *\n * Environment variables are validated before the handler runs (fail fast).\n * They are displayed in the help output under \"Env:\" section.\n *\n * @example\n * ```ts\n * $command({\n * env: t.object({\n * VERCEL_TOKEN: t.text({ description: \"Vercel API token\" }),\n * VERCEL_ORG_ID: t.optional(t.text({ description: \"Organization ID\" })),\n * }),\n * handler: async ({ env }) => {\n * // env.VERCEL_TOKEN is typed & guaranteed to exist\n * console.log(env.VERCEL_TOKEN);\n * }\n * })\n * ```\n */\n env?: E;\n\n /**\n * An optional TypeBox schema defining the arguments for the command.\n *\n * @example\n * args: t.text()\n * my-cli command <arg1: string>\n *\n * args: t.optional(t.text())\n * my-cli command [arg1: string]\n *\n * args: t.tuple([t.text(), t.number()])\n * my-cli command <arg1: string> <arg2: number>\n *\n * args: t.tuple([t.text(), t.optional(t.number())])\n * my-cli command <arg1: string> [arg2: number]\n */\n args?: A;\n\n /**\n * Marks this command as the root command.\n * Equivalent to setting name to an empty string \"\".\n */\n root?: boolean;\n\n /**\n * Run this command's handler BEFORE the specified target command.\n *\n * Pre-hooks are not listed in help and cannot be called directly.\n * They receive the same parsed flags and args as the target command.\n *\n * @example\n * ```ts\n * class BuildCommands {\n * prebuild = $command({\n * pre: \"build\",\n * handler: async ({ run }) => {\n * await run(\"cleaning dist folder...\", () => fs.rm(\"dist\"));\n * }\n * });\n *\n * build = $command({\n * name: \"build\",\n * handler: async () => { ... }\n * });\n * }\n * ```\n */\n pre?: string;\n\n /**\n * Run this command's handler AFTER the specified target command.\n *\n * Post-hooks are not listed in help and cannot be called directly.\n * They receive the same parsed flags and args as the target command.\n *\n * @example\n * ```ts\n * class BuildCommands {\n * build = $command({\n * name: \"build\",\n * handler: async () => { ... }\n * });\n *\n * postbuild = $command({\n * post: \"build\",\n * handler: async ({ run }) => {\n * await run(\"generating checksums...\", generateChecksums);\n * }\n * });\n * }\n * ```\n */\n post?: string;\n\n /**\n * If true, this command will be hidden from the help output.\n */\n hide?: boolean;\n\n /**\n * Adds a `--mode, -m` flag to load environment files.\n *\n * When enabled:\n * - Loads `.env` and `.env.local` by default\n * - With `--mode production`, also loads `.env.production` and `.env.production.local`\n * - The mode value is exposed in the handler as `mode: string | undefined`\n *\n * Set to `true` to enable with no default, or a string to set a default mode.\n *\n * This follows Vite's environment loading convention.\n * @see https://vite.dev/guide/env-and-mode\n *\n * @example\n * ```ts\n * // No default mode\n * build = $command({\n * mode: true,\n * handler: async ({ mode }) => {\n * console.log(`Building for ${mode ?? 'development'}...`);\n * }\n * });\n *\n * // Default mode \"production\"\n * deploy = $command({\n * mode: \"production\",\n * handler: async ({ mode }) => {\n * console.log(`Deploying for ${mode}...`); // always defined\n * }\n * });\n * ```\n *\n * Usage:\n * - `cli build` - loads .env (mode = undefined)\n * - `cli build --mode production` - loads .env and .env.production\n * - `cli deploy` - loads .env and .env.production (default mode)\n * - `cli deploy --mode staging` - loads .env and .env.staging\n */\n mode?: boolean | string;\n\n /**\n * Child commands (subcommands) for this command.\n *\n * When children are defined, the command becomes a parent command that\n * can be invoked with space-separated subcommands:\n *\n * @example\n * ```ts\n * class DeployCommands {\n * // Subcommands\n * vercel = $command({\n * description: \"Deploy to Vercel\",\n * handler: async () => { ... }\n * });\n *\n * cloudflare = $command({\n * description: \"Deploy to Cloudflare\",\n * handler: async () => { ... }\n * });\n *\n * // Parent command with children\n * deploy = $command({\n * description: \"Deploy the application\",\n * children: [this.vercel, this.cloudflare],\n * handler: async () => {\n * // Called when \"deploy\" is invoked without subcommand\n * console.log(\"Available: deploy vercel, deploy cloudflare\");\n * }\n * });\n * }\n * ```\n *\n * This allows CLI usage like:\n * - `cli deploy vercel` - runs the vercel subcommand\n * - `cli deploy cloudflare` - runs the cloudflare subcommand\n * - `cli deploy` - runs the parent handler (shows available subcommands)\n * - `cli deploy --help` - shows help with all available subcommands\n */\n children?: CommandPrimitive<any, any>[];\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class CommandPrimitive<\n T extends TObject = TObject,\n A extends TSchema = TSchema,\n E extends TObject = TObject,\n> extends Primitive<CommandPrimitiveOptions<T, A, E>> {\n public readonly flags = this.options.flags ?? t.object({});\n public readonly env = this.options.env ?? t.object({});\n public readonly aliases = this.options.aliases ?? [];\n\n protected onInit() {\n if (this.options.pre || this.options.post) {\n this.options.hide ??= true;\n }\n }\n\n public get name(): string {\n if (this.options.root) {\n return \"\";\n }\n if (this.options.pre) {\n return `pre${this.options.pre}`;\n }\n if (this.options.post) {\n return `post${this.options.post}`;\n }\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n\n /**\n * Get the child commands (subcommands) for this command.\n */\n public get children(): CommandPrimitive<any, any>[] {\n return this.options.children ?? [];\n }\n\n /**\n * Check if this command has child commands (is a parent command).\n */\n public get hasChildren(): boolean {\n return this.children.length > 0;\n }\n\n /**\n * Find a child command by name or alias.\n */\n public findChild(name: string): CommandPrimitive<any, any> | undefined {\n return this.children.find(\n (child) => child.name === name || child.aliases.includes(name),\n );\n }\n}\n\n$command[KIND] = CommandPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandHandlerArgs<\n T extends TObject,\n A extends TSchema = TSchema,\n E extends TObject = TObject,\n> {\n flags: Static<T>;\n args: A extends TSchema ? Static<A> : Array<string>;\n env: Static<E>;\n run: RunnerMethod;\n ask: AskMethod;\n glob: typeof glob;\n fs: typeof fs;\n\n /**\n * The root directory where the command is executed.\n */\n root: string;\n\n /**\n * Display help for the current command.\n *\n * Useful for parent commands with children to show available subcommands\n * when invoked without a specific subcommand.\n *\n * @example\n * ```ts\n * deploy = $command({\n * children: [this.vercel, this.cloudflare],\n * handler: async ({ help }) => {\n * help(); // Shows available subcommands\n * }\n * });\n * ```\n */\n help: () => void;\n\n /**\n * The current execution mode (e.g., \"development\", \"production\", \"staging\").\n *\n * Use --mode flag to set this value when running the command.\n */\n mode?: string;\n}\n","import * as fs from \"node:fs/promises\";\nimport { glob } from \"node:fs/promises\";\nimport {\n $atom,\n $env,\n $hook,\n $inject,\n $state,\n Alepha,\n type Static,\n type TObject,\n type TSchema,\n type TUnion,\n TypeBoxError,\n t,\n} from \"alepha\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { Asker } from \"../helpers/Asker.ts\";\nimport { EnvUtils } from \"../helpers/EnvUtils.ts\";\nimport { Runner } from \"../helpers/Runner.ts\";\nimport {\n $command,\n type CommandHandlerArgs,\n type CommandPrimitive,\n} from \"../primitives/$command.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n CLI_NAME: t.text({\n default: \"cli\",\n description: \"Name of the CLI application.\",\n }),\n CLI_DESCRIPTION: t.text({\n default: \"\",\n description: \"Description of the CLI application.\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * CLI provider configuration atom\n */\nexport const cliOptions = $atom({\n name: \"alepha.command.cli.options\",\n schema: t.object({\n name: t.optional(\n t.string({\n description: \"Name of the CLI application.\",\n }),\n ),\n description: t.optional(\n t.string({\n description: \"Description of the CLI application.\",\n }),\n ),\n argv: t.optional(\n t.array(t.string(), {\n description: \"Command line arguments to parse.\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type CliProviderOptions = Static<typeof cliOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [cliOptions.key]: CliProviderOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * CLI provider for parsing and executing commands.\n *\n * Handles:\n * - Command resolution (simple, nested, colon-notation)\n * - Flag and argument parsing\n * - Environment variable validation\n * - Help generation\n * - Pre/post command hooks\n *\n * @example\n * ```typescript\n * // Define a command\n * class MyCommands {\n * build = $command({\n * name: \"build\",\n * description: \"Build the project\",\n * flags: t.object({ watch: t.optional(t.boolean()) }),\n * handler: async ({ flags }) => { ... }\n * });\n * }\n *\n * // CLI automatically discovers and executes commands\n * const alepha = Alepha.create().with(MyCommands);\n * ```\n */\nexport class CliProvider {\n // ─────────────────────────────────────────────────────────────────────────────\n // Dependencies\n // ─────────────────────────────────────────────────────────────────────────────\n\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly color = $inject(ConsoleColorProvider);\n protected readonly runner = $inject(Runner);\n protected readonly asker = $inject(Asker);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly options = $state(cliOptions);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Configuration\n // ─────────────────────────────────────────────────────────────────────────────\n\n protected get name(): string {\n return this.options.name || this.env.CLI_NAME;\n }\n\n protected get description(): string {\n return this.options.description || this.env.CLI_DESCRIPTION;\n }\n\n protected get argv(): string[] {\n return (\n this.options.argv ||\n (typeof process !== \"undefined\" ? process.argv.slice(2) : [])\n );\n }\n\n /**\n * Global flags available to all commands.\n */\n protected readonly globalFlags = {\n help: {\n aliases: [\"h\", \"help\"],\n description: \"Show this help message\",\n schema: t.boolean(),\n },\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Main entry point - resolves and executes the command from process.argv.\n * This is the production execution path with full lifecycle support.\n */\n protected readonly onReady = $hook({\n on: \"ready\",\n handler: async () => {\n const argv = [...this.argv];\n\n // Extract positional arguments (potential command path)\n const positionalArgs = argv.filter((arg) => !arg.startsWith(\"-\"));\n\n // Resolve command using space-separated or colon-notation\n const { command, consumedArgs } = this.resolveCommand(positionalArgs);\n\n const globalFlags = this.parseFlags(\n argv,\n Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n { strict: false }, // Don't throw for command-specific flags\n );\n\n if (globalFlags.help) {\n this.printHelp(command);\n return;\n }\n\n if (!command) {\n // Check if there's a root command (name === \"\")\n const rootCommand = this.findCommand(\"\");\n\n // If we have positional args but no matching command, show error\n const commandName = positionalArgs[0] ?? \"\";\n if (commandName !== \"\" && !rootCommand?.options.args) {\n this.log.error(`Unknown command: '${commandName}'`);\n this.printHelp();\n return;\n }\n\n // Execute root command if it exists\n if (rootCommand) {\n await this.executeCommand(rootCommand, argv, true);\n return;\n }\n\n // No command found and no root command\n return;\n }\n\n // Remove consumed command path args from argv for argument parsing\n const remainingArgv = this.removeConsumedArgs(argv, consumedArgs);\n\n // Since we've removed the command path, treat it like a root command for parsing\n await this.executeCommand(command, remainingArgv, true);\n },\n });\n\n /**\n * Execute a command with full lifecycle support.\n *\n * This is the production execution path that includes:\n * - Mode-based .env file loading\n * - Pre/post command hooks\n * - Runner session for pretty CLI output\n * - Alepha context wrapper for proper scoping\n *\n * @see run() for a lightweight test-only alternative\n */\n protected async executeCommand(\n command: CommandPrimitive<TObject>,\n argv: string[],\n isRootCommand: boolean,\n ): Promise<void> {\n const root = process.cwd();\n\n // Handle --mode flag if command has mode option enabled\n let modeValue: string | undefined;\n if (command.options.mode) {\n modeValue = this.parseModeFlag(argv);\n // Use default mode if not provided and mode is a string\n if (modeValue === undefined && typeof command.options.mode === \"string\") {\n modeValue = command.options.mode;\n }\n await this.loadModeEnv(root, modeValue);\n }\n\n const commandFlags = this.parseCommandFlags(argv, command.flags, {\n modeEnabled: !!command.options.mode,\n });\n const commandArgs = this.parseCommandArgs(\n argv,\n command.options.args,\n isRootCommand,\n command.flags,\n );\n const commandEnv = this.parseCommandEnv(command.env, command.name);\n\n await this.alepha.context.run(async () => {\n this.log.debug(`Executing command '${command.name}'...`, {\n flags: commandFlags,\n args: commandArgs,\n mode: modeValue,\n });\n\n const runner = this.runner;\n\n // Start command session for pretty print\n runner.startCommand(this.name, command.name);\n\n const args = {\n flags: commandFlags,\n args: commandArgs,\n env: commandEnv,\n run: runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root,\n help: () => this.printHelp(command),\n mode: modeValue,\n };\n\n // Execute pre-hooks\n const preHooks = this.findPreHooks(command.name);\n for (const hook of preHooks) {\n this.log.debug(`Executing pre-hook for '${command.name}'...`);\n await hook.options.handler(args as CommandHandlerArgs<TObject>);\n }\n\n // Execute main command\n await command.options.handler(args as CommandHandlerArgs<TObject>);\n\n // Execute post-hooks\n const postHooks = this.findPostHooks(command.name);\n for (const hook of postHooks) {\n this.log.debug(`Executing post-hook for '${command.name}'...`);\n await hook.options.handler(args as CommandHandlerArgs<TObject>);\n }\n\n runner.end();\n\n this.log.debug(`Command '${command.name}' executed successfully.`);\n });\n }\n\n /**\n * Remove consumed command path arguments from argv (keeps flags and remaining args).\n */\n protected removeConsumedArgs(\n argv: string[],\n consumedArgs: string[],\n ): string[] {\n const result: string[] = [];\n let consumedIndex = 0;\n\n for (const arg of argv) {\n if (arg.startsWith(\"-\")) {\n result.push(arg);\n } else if (\n consumedIndex < consumedArgs.length &&\n arg === consumedArgs[consumedIndex]\n ) {\n consumedIndex++;\n // Skip this arg, it's part of the command path\n } else {\n result.push(arg);\n }\n }\n\n return result;\n }\n\n /**\n * Resolve a command from positional arguments.\n *\n * Supports:\n * 1. Space-separated subcommands: `deploy vercel` -> finds deploy command, then vercel child\n * 2. Colon notation (backwards compat): `deploy:vercel` -> finds command with name \"deploy:vercel\"\n * 3. Simple commands: `build` -> finds command with name \"build\"\n */\n protected resolveCommand(positionalArgs: string[]): {\n command: CommandPrimitive<TObject> | undefined;\n consumedArgs: string[];\n } {\n if (positionalArgs.length === 0) {\n return { command: undefined, consumedArgs: [] };\n }\n\n const firstArg = positionalArgs[0];\n\n // First, try colon notation for backwards compatibility (e.g., \"deploy:vercel\")\n if (firstArg.includes(\":\")) {\n const command = this.findCommand(firstArg);\n if (command) {\n return { command, consumedArgs: [firstArg] };\n }\n }\n\n // Try to find command with space-separated subcommand path\n // Only search top-level commands to avoid child commands shadowing\n // top-level ones (e.g., \"platform > build\" shadowing standalone \"build\")\n let currentCommand = this.findTopLevelCommand(firstArg);\n const consumedArgs: string[] = [];\n\n if (!currentCommand) {\n return { command: undefined, consumedArgs: [] };\n }\n\n consumedArgs.push(firstArg);\n\n // Walk through remaining args to find nested subcommands\n for (let i = 1; i < positionalArgs.length; i++) {\n const arg = positionalArgs[i];\n\n if (!currentCommand.hasChildren) {\n break;\n }\n\n const childCommand = currentCommand.findChild(arg);\n if (childCommand) {\n currentCommand = childCommand;\n consumedArgs.push(arg);\n } else {\n // No matching child, stop here\n break;\n }\n }\n\n return { command: currentCommand, consumedArgs };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public API\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get all registered commands in the application.\n */\n public get commands(): CommandPrimitive<any>[] {\n return this.alepha.primitives($command);\n }\n\n /**\n * Execute a command handler with given arguments.\n *\n * This is a **lightweight test helper** that directly invokes the command handler\n * without the full production lifecycle. It intentionally skips:\n * - Pre/post command hooks\n * - Runner session (pretty CLI output)\n * - Alepha context wrapper\n * - .env.{mode} file loading\n *\n * For production execution, the `onReady` hook uses `executeCommand()` which\n * provides the full lifecycle. Merging them would either make this method too\n * heavy for simple testing or require many optional parameters to toggle behaviors.\n *\n * @example\n * ```typescript\n * // In tests\n * const cli = alepha.inject(CliProvider);\n * const cmd = alepha.inject(InitCommand);\n *\n * await cli.run(cmd.init, \"--agent --pm=yarn\");\n * await cli.run(cmd.init, { argv: \"--agent\", root: \"/project\" });\n * ```\n */\n public async run<T extends TObject, A extends TSchema>(\n command: CommandPrimitive<T, A>,\n options:\n | string\n | string[]\n | { argv?: string | string[]; root?: string } = {},\n ): Promise<void> {\n const opts =\n typeof options === \"string\" || Array.isArray(options)\n ? { argv: options }\n : options;\n const args =\n typeof opts.argv === \"string\"\n ? opts.argv.split(\" \").filter(Boolean)\n : (opts.argv ?? []);\n const root = opts.root ?? process.cwd();\n\n const commandFlags = this.parseCommandFlags(args, command.flags, {\n modeEnabled: !!command.options.mode,\n });\n const commandArgs = this.parseCommandArgs(\n args,\n command.options.args,\n true,\n command.flags,\n );\n const commandEnv = this.parseCommandEnv(command.env, command.name);\n\n let modeValue: string | undefined;\n if (command.options.mode) {\n modeValue = this.parseModeFlag(args);\n if (modeValue === undefined && typeof command.options.mode === \"string\") {\n modeValue = command.options.mode;\n }\n }\n\n await command.options.handler({\n flags: commandFlags,\n args: commandArgs,\n env: commandEnv,\n run: this.runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root,\n help: () => this.printHelp(command),\n mode: modeValue,\n } as CommandHandlerArgs<T, A>);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Command Resolution\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Find a command by name or alias\n */\n protected findCommand(name: string): CommandPrimitive<TObject> | undefined {\n return this.commands.findLast(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Find a top-level command by name or alias (excludes child commands)\n */\n protected findTopLevelCommand(\n name: string,\n ): CommandPrimitive<TObject> | undefined {\n return this.getTopLevelCommands().findLast(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Find all pre-hooks for a command (commands named `pre{commandName}`)\n */\n protected findPreHooks(commandName: string): CommandPrimitive<TObject>[] {\n return this.commands.filter((cmd) => cmd.name === `pre${commandName}`);\n }\n\n /**\n * Find all post-hooks for a command (commands named `post{commandName}`)\n */\n protected findPostHooks(commandName: string): CommandPrimitive<TObject>[] {\n return this.commands.filter((cmd) => cmd.name === `post${commandName}`);\n }\n\n /**\n * Get global flags (help only, root command flags are NOT global)\n */\n protected getAllGlobalFlags(): Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n > {\n return { ...this.globalFlags };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Parsing (Flags, Args, Env)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Parse command flags from argv using the command's flag schema\n */\n protected parseCommandFlags(\n argv: string[],\n schema: TObject,\n options: { modeEnabled?: boolean } = {},\n ): Record<string, any> {\n const { modeEnabled = false } = options;\n const flagDefs = Object.entries(schema.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value,\n }));\n\n // Add mode flags if mode is enabled (they're parsed elsewhere by parseModeFlag)\n if (modeEnabled) {\n flagDefs.push({\n key: \"__mode__\",\n aliases: [\"mode\", \"m\"],\n description: undefined,\n schema: t.string(),\n });\n }\n\n const parsed = this.parseFlags(argv, flagDefs);\n\n // Remove the mode flag from parsed result (it's handled separately)\n parsed.__mode__ = undefined;\n\n // apply manually defaults for optional properties that have defaults\n for (const [key, value] of Object.entries(schema.properties)) {\n if (!(key in parsed) && t.schema.isOptional(value)) {\n const innerSchema = value;\n if (innerSchema && \"default\" in innerSchema) {\n parsed[key] = innerSchema.default;\n }\n }\n }\n\n try {\n return this.alepha.codec.decode(schema, parsed);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid flag: ${error.cause.instancePath || \"command\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Parse and validate environment variables using the command's env schema\n */\n protected parseCommandEnv(\n schema: TObject,\n commandName: string,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n const missing: string[] = [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const value = process.env[key];\n\n if (value !== undefined) {\n result[key] = value;\n } else if (\"default\" in propSchema) {\n result[key] = propSchema.default;\n } else if (t.schema.isOptional(propSchema)) {\n // Optional with no default — leave undefined\n } else {\n missing.push(key);\n }\n }\n\n if (missing.length > 0) {\n const vars = missing.join(\", \");\n throw new CommandError(\n `Missing required environment variable${missing.length > 1 ? \"s\" : \"\"}: ${vars}`,\n );\n }\n\n try {\n return this.alepha.codec.decode(schema, result);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid environment variable: ${error.cause.instancePath || \"env\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Parse --mode or -m flag from argv for environment file loading\n */\n protected parseModeFlag(argv: string[]): string | undefined {\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n // Handle --mode=value or -m=value\n if (arg.startsWith(\"--mode=\") || arg.startsWith(\"-m=\")) {\n return arg.split(\"=\")[1];\n }\n\n // Handle --mode value or -m value\n if (arg === \"--mode\" || arg === \"-m\") {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n return nextArg;\n }\n throw new CommandError(\"Flag --mode requires a value.\");\n }\n }\n\n return undefined;\n }\n\n /**\n * Load .env and .env.{mode} files into process.env\n */\n protected async loadModeEnv(\n root: string,\n mode: string | undefined,\n ): Promise<void> {\n const envFiles = [\".env\"];\n if (mode) {\n envFiles.push(`.env.${mode}`);\n }\n this.log.debug(`Loading env files: ${envFiles.join(\", \")}`);\n await this.envUtils.loadEnv(root, envFiles);\n }\n\n /**\n * Low-level flag parser - extracts flag values from argv based on definitions\n */\n protected parseFlags(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n options: { strict?: boolean } = {},\n ): Record<string, any> {\n const { strict = true } = options;\n const result: Record<string, any> = {};\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg.startsWith(\"-\")) continue;\n\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n let value = valueParts.join(\"=\");\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) {\n if (strict) {\n throw new CommandError(`Unknown flag: --${rawKey}`);\n }\n continue;\n }\n\n // Check if schema is a union containing boolean (allows flag without value)\n const isUnionWithBoolean =\n t.schema.isUnion(def.schema) &&\n (def.schema as TUnion).anyOf.some((s) => t.schema.isBoolean(s));\n\n if (t.schema.isBoolean(def.schema)) {\n result[def.key] = true;\n } else if (isUnionWithBoolean && !value) {\n // Union with boolean: --flag without value → true\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n // Has a value after space: --flag value\n result[def.key] = nextArg;\n i++; // consume next arg\n } else {\n // No value: --flag → true\n result[def.key] = true;\n }\n } else if (value) {\n // Value provided via --flag=value syntax\n try {\n if (t.schema.isObject(def.schema) || t.schema.isArray(def.schema)) {\n result[def.key] = JSON.parse(value);\n } else {\n result[def.key] = value;\n }\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n } else {\n // Check for space-separated value: --flag value\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n value = nextArg;\n try {\n if (t.schema.isObject(def.schema) || t.schema.isArray(def.schema)) {\n result[def.key] = JSON.parse(value);\n } else {\n result[def.key] = value;\n }\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n } else {\n throw new CommandError(`Flag --${rawKey} requires a value.`);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get indices of argv elements consumed by flags (for separating args from flags)\n */\n protected getFlagConsumedIndices(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n ): Set<number> {\n const consumed = new Set<number>();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg.startsWith(\"-\")) continue;\n\n consumed.add(i);\n\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n const hasEqualValue = valueParts.length > 0;\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) continue;\n\n // Check if schema is a union containing boolean\n const isUnionWithBoolean =\n t.schema.isUnion(def.schema) &&\n (def.schema as TUnion).anyOf.some((s) => t.schema.isBoolean(s));\n\n // If not a boolean flag and no = value, the next arg is consumed as the value\n // Exception: union with boolean can work without a value\n if (\n !t.schema.isBoolean(def.schema) &&\n !isUnionWithBoolean &&\n !hasEqualValue\n ) {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n consumed.add(i + 1);\n }\n } else if (isUnionWithBoolean && !hasEqualValue) {\n // Union with boolean: check if next arg looks like a value (not a flag)\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n consumed.add(i + 1);\n }\n }\n }\n\n return consumed;\n }\n\n protected parseCommandArgs(\n argv: string[],\n schema?: TSchema,\n isRootCommand = false,\n flagSchema?: TObject,\n ): any {\n if (!schema) {\n return undefined;\n }\n\n // Get indices consumed by flags (including space-separated values)\n const flagDefs = flagSchema\n ? Object.entries(flagSchema.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n schema: value as TSchema,\n }))\n : [];\n const consumedIndices = this.getFlagConsumedIndices(argv, flagDefs);\n\n // Extract positional arguments (non-flag arguments that aren't consumed as flag values)\n const positionalArgs = argv.filter(\n (arg, idx) => !arg.startsWith(\"-\") && !consumedIndices.has(idx),\n );\n // For root commands, there's no command name to remove; otherwise slice off the command name\n const argsOnly = isRootCommand ? positionalArgs : positionalArgs.slice(1);\n\n try {\n if (t.schema.isOptional(schema)) {\n // Handle optional args: t.optional(t.text())\n if (argsOnly.length === 0) {\n return undefined;\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n } else if (t.schema.isTuple(schema) && schema.items) {\n // Handle tuple args: t.tuple([t.text(), t.number()])\n const result: any[] = [];\n const items = schema.items;\n for (let i = 0; i < items.length; i++) {\n const itemSchema = items[i];\n if (i < argsOnly.length) {\n result.push(this.parseArgumentValue(argsOnly[i], itemSchema));\n } else if (t.schema.isOptional(itemSchema)) {\n result.push(undefined);\n } else {\n throw new CommandError(\n `Missing required argument at position ${i + 1}`,\n );\n }\n }\n return result;\n } else {\n // Handle single arg: t.text(), t.number(), etc.\n if (argsOnly.length === 0) {\n throw new CommandError(\"Missing required argument\");\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n }\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(`Invalid argument: ${error.value.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Convert a string argument value to the appropriate type based on schema\n */\n protected parseArgumentValue(value: string, schema: TSchema): any {\n if (t.schema.isString(schema)) {\n return value;\n }\n\n if (t.schema.isNumber(schema) || t.schema.isInteger(schema)) {\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new CommandError(`Expected number, got \"${value}\"`);\n }\n if (t.schema.isInteger(schema) && !Number.isInteger(num)) {\n throw new CommandError(`Expected integer, got \"${value}\"`);\n }\n return num;\n }\n\n if (t.schema.isBoolean(schema)) {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\") return true;\n if (lower === \"false\" || lower === \"0\") return false;\n throw new CommandError(`Expected boolean, got \"${value}\"`);\n }\n\n // For other types, return the string value and let TypeBox validate it\n return value;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Help Generation\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Generate usage string for command arguments (e.g., \"<path>\" or \"[path]\")\n */\n protected generateArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n if (t.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` [${key}${typeName}]`;\n }\n\n if (t.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (t.schema.isOptional(item)) {\n return `[${argName}${typeName}]`;\n }\n return `<${argName}${typeName}>`;\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` <${key}${typeName}>`;\n }\n\n /**\n * Get display type name for a schema (e.g., \": number\", \": boolean\")\n */\n protected getTypeName(schema: TSchema): string {\n if (!schema) return \"\";\n\n // Check TypeBox type guards first\n if (t.schema.isString(schema)) return \"\";\n if (t.schema.isNumber(schema)) return \": number\";\n if (t.schema.isInteger(schema)) return \": integer\";\n if (t.schema.isBoolean(schema)) return \": boolean\";\n\n return \"\";\n }\n\n /**\n * Print help for a specific command or general CLI help.\n *\n * @param command - If provided, shows help for this specific command.\n * If omitted, shows general CLI help with all commands.\n */\n public printHelp(command?: CommandPrimitive<any>): void {\n const cliName = this.name || \"cli\";\n const c = this.color;\n this.log.info(\"\"); // Newline\n\n if (command?.name) {\n // Command-specific help\n const hasChildren = command.hasChildren;\n const argsUsage = hasChildren\n ? ` ${c.set(\"CYAN\", \"<command>\")}`\n : this.generateColoredArgsUsage(command.options.args);\n const commandPath = this.getCommandPath(command);\n const usage =\n `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", commandPath)}${argsUsage}`.trim();\n this.log.info(`${c.set(\"WHITE_BOLD\", \"Usage:\")} ${usage}`);\n\n if (command.options.description) {\n this.log.info(``);\n this.log.info(`\\t${command.options.description}`);\n }\n\n // Show subcommands if this is a parent command\n if (hasChildren) {\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Commands:\"));\n const maxSubCmdLength = this.getMaxChildCmdLength(command.children);\n\n for (const child of command.children) {\n if (child.options.hide) {\n continue;\n }\n const childArgsUsage = this.generateArgsUsage(child.options.args);\n const cmdStr = [child.name, ...child.aliases].join(\", \");\n const fullCmdStr = `${cmdStr}${childArgsUsage}`;\n const coloredCmd = `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", commandPath)} ${c.set(\"CYAN\", fullCmdStr)}`;\n const padding = \" \".repeat(\n Math.max(0, maxSubCmdLength - fullCmdStr.length),\n );\n this.log.info(\n ` ${coloredCmd}${padding} ${child.options.description ?? \"\"}`,\n );\n }\n }\n\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Flags:\"));\n\n const flags = [\n ...Object.entries(command.flags.properties).map(([key, value]) => ({\n key,\n schema: value,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : [])),\n ],\n description: (value as any).description,\n })),\n // Add --mode flag if command has mode option enabled\n ...(command.options.mode\n ? [\n {\n key: \"mode\",\n aliases: [\"m\", \"mode\"],\n description:\n typeof command.options.mode === \"string\"\n ? `Environment mode - loads .env.{mode} (default: ${command.options.mode})`\n : \"Environment mode (e.g., production, staging) - loads .env.{mode}\",\n schema: t.string() as TSchema,\n },\n ]\n : []),\n ...Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n ];\n\n const maxFlagLength = this.getMaxFlagLength(flags);\n for (const flag of flags) {\n const { aliases, description } = flag;\n const schema = \"schema\" in flag ? (flag.schema as TSchema) : undefined;\n // Sort aliases by length (shorter first: -t before --target)\n const sortedAliases = (Array.isArray(aliases) ? aliases : [aliases])\n .slice()\n .sort((a, b) => a.length - b.length);\n const flagStr = sortedAliases\n .map((a: string) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n const coloredFlag = c.set(\"GREY_LIGHT\", flagStr);\n const padding = \" \".repeat(Math.max(0, maxFlagLength - flagStr.length));\n const formattedDesc = this.formatFlagDescription(description, schema);\n this.log.info(` ${coloredFlag}${padding} ${formattedDesc}`);\n }\n\n // Show environment variables if defined\n const envVars = Object.entries(command.env.properties);\n if (envVars.length > 0) {\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Env:\"));\n const maxEnvLength = Math.max(...envVars.map(([key]) => key.length));\n for (const [key, schema] of envVars) {\n const isOptional = t.schema.isOptional(schema as TSchema);\n const description = (schema as any).description ?? \"\";\n const optionalStr = isOptional\n ? c.set(\"GREY_DARK\", \" (optional)\")\n : c.set(\"RED\", \" (required)\");\n const coloredKey = c.set(\"CYAN\", key);\n const padding = \" \".repeat(Math.max(0, maxEnvLength - key.length));\n this.log.info(\n ` ${coloredKey}${padding} ${description}${optionalStr}`,\n );\n }\n }\n } else {\n // general help\n this.log.info(this.description || \"Available commands:\");\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Commands:\"));\n\n // Get top-level commands (commands that are not children of other commands)\n const topLevelCommands = this.getTopLevelCommands();\n const maxCmdLength = this.getMaxCmdLength(topLevelCommands);\n\n for (const cmd of topLevelCommands) {\n // skip root command and hooks in list\n if (cmd.name === \"\" || cmd.options.hide) {\n continue;\n }\n\n const cmdStr = [cmd.name, ...cmd.aliases].join(\", \");\n const argsUsage = cmd.hasChildren\n ? \" <command>\"\n : this.generateArgsUsage(cmd.options.args);\n const fullCmdStr = `${cmdStr}${argsUsage}`;\n const coloredCmd = `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", fullCmdStr)}`;\n const padding = \" \".repeat(\n Math.max(0, maxCmdLength - fullCmdStr.length),\n );\n this.log.info(\n ` ${coloredCmd}${padding} ${cmd.options.description ?? \"\"}`,\n );\n }\n\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Flags:\"));\n\n // In general help, also show root command flags\n const rootCommand = this.commands.find((cmd) => cmd.name === \"\");\n const rootFlags = rootCommand\n ? Object.entries(rootCommand.flags.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value as TSchema,\n }))\n : [];\n\n const globalFlags = [\n ...rootFlags,\n ...Object.values(this.getAllGlobalFlags()),\n ];\n const maxFlagLength = this.getMaxFlagLength(globalFlags);\n for (const { aliases, description, schema } of globalFlags) {\n const flagStr = aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n const coloredFlag = c.set(\"GREY_LIGHT\", flagStr);\n const padding = \" \".repeat(Math.max(0, maxFlagLength - flagStr.length));\n const formattedDesc = this.formatFlagDescription(description, schema);\n this.log.info(` ${coloredFlag}${padding} ${formattedDesc}`);\n }\n }\n this.log.info(\"\"); // Newline\n }\n\n /**\n * Generate colored usage string for command arguments (for help display)\n */\n protected generateColoredArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n const c = this.color;\n\n if (t.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` ${c.set(\"GREY_DARK\", `[${key}${typeName}]`)}`;\n }\n\n if (t.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (t.schema.isOptional(item)) {\n return c.set(\"GREY_DARK\", `[${argName}${typeName}]`);\n }\n return c.set(\"CYAN\", `<${argName}${typeName}>`);\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` ${c.set(\"CYAN\", `<${key}${typeName}>`)}`;\n }\n\n /**\n * Get the full command path (e.g., \"deploy vercel\" for a nested command)\n */\n protected getCommandPath(command: CommandPrimitive<any>): string {\n const path: string[] = [command.name];\n let current = command;\n\n // Walk up the tree to find parents\n while (true) {\n const parent = this.findParentCommand(current);\n if (!parent) break;\n path.unshift(parent.name);\n current = parent;\n }\n\n return path.join(\" \");\n }\n\n /**\n * Find the parent command of a nested command\n */\n protected findParentCommand(\n command: CommandPrimitive<any>,\n ): CommandPrimitive<any> | undefined {\n for (const cmd of this.commands) {\n if (cmd.children.includes(command)) {\n return cmd;\n }\n }\n return undefined;\n }\n\n /**\n * Get top-level commands (commands that are not children of other commands)\n */\n protected getTopLevelCommands(): CommandPrimitive<any>[] {\n const allChildren = new Set<CommandPrimitive<any>>();\n\n // Collect all children\n for (const command of this.commands) {\n for (const child of command.children) {\n allChildren.add(child);\n }\n }\n\n // Return commands that are not children\n return this.commands.filter((cmd) => !allChildren.has(cmd));\n }\n\n /**\n * Calculate max display length for child commands (for help alignment)\n */\n protected getMaxChildCmdLength(children: CommandPrimitive<any>[]): number {\n return Math.max(\n ...children\n .filter((c) => !c.options.hide)\n .map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n 0,\n );\n }\n\n /**\n * Calculate max display length for commands (for help alignment)\n */\n protected getMaxCmdLength(commands: CommandPrimitive[]): number {\n return Math.max(\n ...commands\n .filter((c) => !c.options.hide && c.name !== \"\")\n .map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = c.hasChildren\n ? \" <command>\"\n : this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n );\n }\n\n /**\n * Calculate max display length for flags (for help alignment)\n */\n protected getMaxFlagLength(flags: { aliases: string[] }[]): number {\n return Math.max(\n ...flags.map((f) => {\n const aliases = Array.isArray(f.aliases) ? f.aliases : [f.aliases];\n return aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \").length;\n }),\n );\n }\n\n /**\n * Extract enum values from a schema if it represents an enum.\n * Returns undefined if the schema is not an enum.\n */\n protected getEnumValues(schema: TSchema): string[] | undefined {\n if (!schema) return undefined;\n\n // Check if schema has an enum property (t.enum creates schemas with this)\n if (\n \"enum\" in schema &&\n Array.isArray(schema.enum) &&\n schema.enum.every((v) => typeof v === \"string\")\n ) {\n return schema.enum as string[];\n }\n\n // Also check for union of string literals (alternative enum representation)\n if (t.schema.isUnion(schema)) {\n const union = schema as TUnion;\n const values: string[] = [];\n\n for (const variant of union.anyOf) {\n // Check if the variant is a string literal (has const property)\n if (\n t.schema.isString(variant) &&\n \"const\" in variant &&\n typeof variant.const === \"string\"\n ) {\n values.push(variant.const);\n } else {\n // Not all variants are string literals, not a simple enum\n return undefined;\n }\n }\n\n return values.length > 0 ? values : undefined;\n }\n\n return undefined;\n }\n\n /**\n * Format flag description with enum values if applicable.\n */\n protected formatFlagDescription(\n description: string | undefined,\n schema: TSchema | undefined,\n ): string {\n const baseDesc = description ?? \"\";\n\n if (!schema) return baseDesc;\n\n const enumValues = this.getEnumValues(schema);\n if (enumValues && enumValues.length > 0) {\n const valuesStr = enumValues.join(\", \");\n const c = this.color;\n const enumHint = c.set(\"GREY_DARK\", `[${valuesStr}]`);\n return baseDesc ? `${baseDesc} ${enumHint}` : enumHint;\n }\n\n return baseDesc;\n }\n}\n","import { $module } from \"alepha\";\nimport { Asker } from \"./helpers/Asker.ts\";\nimport { EnvUtils } from \"./helpers/EnvUtils.ts\";\nimport { PrettyAsker } from \"./helpers/PrettyAsker.ts\";\nimport { PrettyPrint } from \"./helpers/PrettyPrint.ts\";\nimport { Runner } from \"./helpers/Runner.ts\";\nimport { $command } from \"./primitives/$command.ts\";\nimport { CliProvider } from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./errors/CommandError.ts\";\nexport * from \"./helpers/Asker.ts\";\nexport * from \"./helpers/EnvUtils.ts\";\nexport * from \"./helpers/PrettyAsker.ts\";\nexport * from \"./helpers/PrettyPrint.ts\";\nexport * from \"./helpers/Runner.ts\";\nexport * from \"./primitives/$command.ts\";\nexport * from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Declarative CLI command framework.\n *\n * **Features:**\n * - CLI command definitions\n * - Interactive CLI prompts\n * - Command execution\n * - Formatted colored output\n * - Environment variable utilities\n * - Schema validation for CLI arguments\n *\n * @module alepha.command\n */\nexport const AlephaCommand = $module({\n name: \"alepha.command\",\n primitives: [$command],\n services: [CliProvider, Runner, Asker, PrettyAsker, PrettyPrint, EnvUtils],\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"typebox\" {\n interface StringOptions {\n /**\n * Additional aliases for the flags.\n *\n * @module alepha.command\n */\n aliases?: string[];\n }\n}\n"],"mappings":"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"}
|