wp-typia 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +4 -2
  2. package/dist-bunli/.bunli/commands.gen.js +1843 -1216
  3. package/dist-bunli/.bunli/commands.gen.js.map +36 -33
  4. package/dist-bunli/cli-03j0axbt.js +163 -0
  5. package/dist-bunli/cli-03j0axbt.js.map +11 -0
  6. package/dist-bunli/{cli-7svz19s1.js → cli-2ybmc22r.js} +370 -86
  7. package/dist-bunli/{cli-7svz19s1.js.map → cli-2ybmc22r.js.map} +15 -14
  8. package/dist-bunli/cli-7yg38ht2.js +427 -0
  9. package/dist-bunli/cli-7yg38ht2.js.map +12 -0
  10. package/dist-bunli/{cli-yw0mq0wq.js → cli-93wd227r.js} +108 -3
  11. package/dist-bunli/cli-93wd227r.js.map +10 -0
  12. package/dist-bunli/{cli-kan7a6db.js → cli-a6dwqnhq.js} +24 -2
  13. package/dist-bunli/cli-a6dwqnhq.js.map +11 -0
  14. package/dist-bunli/{cli-add-j2c81sh1.js → cli-add-pq6wm87p.js} +16 -9
  15. package/dist-bunli/{cli-add-j2c81sh1.js.map → cli-add-pq6wm87p.js.map} +3 -3
  16. package/dist-bunli/{cli-diagnostics-c65hhyhx.js → cli-diagnostics-e5gxeprp.js} +8 -4
  17. package/dist-bunli/{cli-diagnostics-c65hhyhx.js.map → cli-diagnostics-e5gxeprp.js.map} +1 -1
  18. package/dist-bunli/{cli-doctor-hft0wr0e.js → cli-doctor-qk6fwpds.js} +14 -13
  19. package/dist-bunli/{cli-doctor-hft0wr0e.js.map → cli-doctor-qk6fwpds.js.map} +3 -3
  20. package/dist-bunli/{cli-572d6g4m.js → cli-hv2yedw2.js} +2 -157
  21. package/dist-bunli/{cli-572d6g4m.js.map → cli-hv2yedw2.js.map} +4 -6
  22. package/dist-bunli/{cli-scaffold-vcg6wem5.js → cli-scaffold-s3nhwe7x.js} +9 -7
  23. package/dist-bunli/cli-scaffold-s3nhwe7x.js.map +10 -0
  24. package/dist-bunli/cli-t73q5aqz.js +103 -0
  25. package/dist-bunli/cli-t73q5aqz.js.map +10 -0
  26. package/dist-bunli/{cli-templates-4qxszbmc.js → cli-templates-j65r4k9v.js} +1 -1
  27. package/dist-bunli/{cli-wtrvnce5.js → cli-w4r0rr8a.js} +8 -8
  28. package/dist-bunli/cli-w4r0rr8a.js.map +10 -0
  29. package/dist-bunli/cli.js +127 -2863
  30. package/dist-bunli/cli.js.map +5 -56
  31. package/dist-bunli/command-list-37n1za5q.js +2485 -0
  32. package/dist-bunli/command-list-37n1za5q.js.map +58 -0
  33. package/dist-bunli/node-cli.js +432 -323
  34. package/dist-bunli/node-cli.js.map +11 -10
  35. package/dist-bunli/{sync-x91y9jtv.js → sync-k2k8svyc.js} +3 -2
  36. package/dist-bunli/{sync-x91y9jtv.js.map → sync-k2k8svyc.js.map} +1 -1
  37. package/package.json +6 -3
  38. package/dist-bunli/cli-kan7a6db.js.map +0 -11
  39. package/dist-bunli/cli-scaffold-vcg6wem5.js.map +0 -10
  40. package/dist-bunli/cli-wtrvnce5.js.map +0 -10
  41. package/dist-bunli/cli-yw0mq0wq.js.map +0 -10
  42. /package/dist-bunli/{cli-templates-4qxszbmc.js.map → cli-templates-j65r4k9v.js.map} +0 -0
@@ -1,70 +1,19 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli.ts", "../../../node_modules/.bun/@bunli+core@0.9.0+44deef6f8e4a2f18/node_modules/@bunli/core/src/plugin/create.ts", "../../../node_modules/.bun/@bunli+plugin-ai-detect@0.6.4+44deef6f8e4a2f18/node_modules/@bunli/plugin-ai-detect/src/index.ts", "../../../node_modules/.bun/@bunli+plugin-completions@0.3.5+44deef6f8e4a2f18/node_modules/@bunli/plugin-completions/dist/index.js", "../../../node_modules/.bun/@bunli+plugin-config@0.4.4+44deef6f8e4a2f18/node_modules/@bunli/plugin-config/src/index.ts", "../../../node_modules/.bun/@bunli+plugin-skills@0.1.0+44deef6f8e4a2f18/node_modules/@bunli/plugin-skills/src/plugin.ts", "../bunli.config.ts", "../src/command-contract.ts", "../src/command-option-metadata.ts", "../src/commands/add.ts", "../src/config.ts", "../src/render-loader.ts", "../src/runtime-bridge-add-dry-run.ts", "../src/runtime-bridge-output.ts", "../src/runtime-bridge-sync.ts", "../src/runtime-bridge.ts", "../src/ui/lazy-flow.tsx", "../src/ui/alternate-buffer-lifecycle.ts", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/utils/format.ts", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/form.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/form-context.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/form-field.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/select-field.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/multi-select-field.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/number-field.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/password-field.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/textarea-field.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/checkbox-field.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/schema-form.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/key-value-list.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/grid.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/modal.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/tabs.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/confirm.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/menu.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/nav-list.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/command-palette.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/filter.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/data-table.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/sidebar-layout.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/spinner.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/pager.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/choose.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/components/file-picker.tsx", "../../../node_modules/.bun/@bunli+tui@0.6.0+df522c502ed1ba91/node_modules/@bunli/tui/src/charts/index.tsx", "../src/commands/create.ts", "../src/commands/doctor.ts", "../src/mcp.ts", "../../../node_modules/.bun/@bunli+plugin-mcp@0.2.5+ef72ce197b058209/node_modules/@bunli/plugin-mcp/src/errors.ts", "../../../node_modules/.bun/@bunli+plugin-mcp@0.2.5+ef72ce197b058209/node_modules/@bunli/plugin-mcp/src/schema-to-zod.ts", "../../../node_modules/.bun/@bunli+plugin-mcp@0.2.5+ef72ce197b058209/node_modules/@bunli/plugin-mcp/src/utils.ts", "../../../node_modules/.bun/@bunli+plugin-mcp@0.2.5+ef72ce197b058209/node_modules/@bunli/plugin-mcp/src/converter.ts", "../../../node_modules/.bun/@bunli+plugin-mcp@0.2.5+ef72ce197b058209/node_modules/@bunli/plugin-mcp/src/codegen.ts", "../src/commands/mcp.ts", "../src/commands/migrate.ts", "../src/commands/sync.ts", "../src/commands/templates.ts", "../src/command-list.ts", "../src/config-override.ts", "../src/plugins/wp-typia-skills.ts", "../src/plugins/wp-typia-user-config.ts"],
3
+ "sources": ["../src/cli.ts", "../../../node_modules/.bun/@bunli+plugin-ai-detect@0.6.4+44deef6f8e4a2f18/node_modules/@bunli/plugin-ai-detect/src/index.ts", "../../../node_modules/.bun/@bunli+plugin-completions@0.3.5+44deef6f8e4a2f18/node_modules/@bunli/plugin-completions/dist/index.js", "../../../node_modules/.bun/@bunli+plugin-config@0.4.4+44deef6f8e4a2f18/node_modules/@bunli/plugin-config/src/index.ts", "../../../node_modules/.bun/@bunli+plugin-skills@0.1.0+44deef6f8e4a2f18/node_modules/@bunli/plugin-skills/src/plugin.ts", "../bunli.config.ts", "../src/command-contract.ts", "../src/config-override.ts", "../src/plugins/wp-typia-skills.ts", "../src/plugins/wp-typia-user-config.ts"],
4
4
  "sourcesContent": [
5
- "import fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { createCLI, type CLI } from \"@bunli/core\";\nimport { aiAgentPlugin } from \"@bunli/plugin-ai-detect\";\nimport { completionsPlugin } from \"@bunli/plugin-completions\";\nimport { configMergerPlugin } from \"@bunli/plugin-config\";\nimport { skillsPlugin } from \"@bunli/plugin-skills\";\n\nimport packageJson from \"../package.json\";\nimport { bunliConfig } from \"../bunli.config\";\nimport { normalizeWpTypiaArgv } from \"./command-contract\";\nimport { wpTypiaCommands } from \"./command-list\";\nimport { WP_TYPIA_CONFIG_SOURCES } from \"./config\";\nimport { extractWpTypiaConfigOverride } from \"./config-override\";\nimport { createWpTypiaSkillsMetadataPlugin } from \"./plugins/wp-typia-skills\";\nimport { wpTypiaUserConfigPlugin } from \"./plugins/wp-typia-user-config\";\n\nfunction resolveGeneratedMetadataPath(moduleUrl: string): string {\n\tconst candidates = [\n\t\tnew URL(\"./.bunli/commands.gen.js\", moduleUrl),\n\t\tnew URL(\"../lib/.bunli/commands.gen.js\", moduleUrl),\n\t\tnew URL(\"../.bunli/commands.gen.ts\", moduleUrl),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tconst candidatePath = fileURLToPath(candidate);\n\t\tif (fs.existsSync(candidatePath)) {\n\t\t\treturn candidatePath;\n\t\t}\n\t}\n\n\treturn fileURLToPath(new URL(\"../.bunli/commands.gen.ts\", moduleUrl));\n}\n\nasync function formatCliError(error: unknown): Promise<string> {\n\ttry {\n\t\tconst { formatCliDiagnosticError } = await import(\"@wp-typia/project-tools/cli-diagnostics\");\n\t\treturn formatCliDiagnosticError(error);\n\t} catch {\n\t\treturn error instanceof Error ? error.message : String(error);\n\t}\n}\n\nexport async function createWpTypiaCli(options: {\n\tconfigOverridePath?: string;\n} = {}): Promise<CLI> {\n\tconst cli = await createCLI({\n\t\t...bunliConfig,\n\t\tdescription: packageJson.description,\n\t\tname: packageJson.name,\n\t\tplugins: [\n\t\t\tconfigMergerPlugin({\n\t\t\t\tmergeStrategy: \"deep\",\n\t\t\t\tsources: [...WP_TYPIA_CONFIG_SOURCES],\n\t\t\t}),\n\t\t\twpTypiaUserConfigPlugin({\n\t\t\t\toverrideSource: options.configOverridePath,\n\t\t\t}),\n\t\t\taiAgentPlugin({}),\n\t\t\tcreateWpTypiaSkillsMetadataPlugin(wpTypiaCommands),\n\t\t\tskillsPlugin({\n\t\t\t\tdescription: packageJson.description,\n\t\t\t}),\n\t\t\tcompletionsPlugin({\n\t\t\t\tcommandName: \"wp-typia\",\n\t\t\t\texecutable: \"wp-typia\",\n\t\t\t\tgeneratedPath: resolveGeneratedMetadataPath(import.meta.url),\n\t\t\t}),\n\t\t],\n\t\tversion: packageJson.version,\n\t});\n\n\tfor (const command of wpTypiaCommands) {\n\t\tcli.command(command);\n\t}\n\n\treturn cli;\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\n\tconst normalizedArgv = normalizeWpTypiaArgv(argv);\n\tconst { argv: cliArgv, configOverridePath } = extractWpTypiaConfigOverride(normalizedArgv);\n\tconst cli = await createWpTypiaCli({ configOverridePath });\n\tawait cli.run(cliArgv);\n}\n\nexport async function runCliEntrypoint(argv = process.argv.slice(2)): Promise<void> {\n\ttry {\n\t\tawait main(argv);\n\t} catch (error) {\n\t\tconsole.error(`Error: ${await formatCliError(error)}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nif (import.meta.main) {\n\tvoid runCliEntrypoint();\n}\n\nexport default createWpTypiaCli;\n",
6
- "/**\n * Plugin development utilities\n */\n\nimport type { BunliPlugin, PluginFactory, MergeStores } from './types.js'\n\n/**\n * Create a plugin - supports both direct plugins and plugin factories\n * \n * @example Direct plugin with explicit store type:\n * ```typescript\n * interface MyStore {\n * count: number\n * message: string\n * }\n * \n * const myPlugin = createPlugin<MyStore>({\n * name: 'my-plugin',\n * store: {\n * count: 0,\n * message: ''\n * },\n * beforeCommand(context) {\n * context.store.count++ // TypeScript knows the type!\n * }\n * })\n * ```\n * \n * @example Plugin factory with options:\n * ```typescript\n * const myPlugin = createPlugin((options: { prefix: string }) => ({\n * name: 'my-plugin',\n * store: {\n * count: 0\n * },\n * beforeCommand(context) {\n * console.log(`${options.prefix}: ${context.store.count}`)\n * }\n * } satisfies BunliPlugin<{ count: number }>))\n * \n * // Use it:\n * myPlugin({ prefix: 'Hello' })\n * ```\n */\nexport function createPlugin<TOptions, TStore = {}>(\n factory: (options: TOptions) => BunliPlugin<TStore>\n): (options: TOptions) => BunliPlugin<TStore>\n\n// Overload for direct plugin\nexport function createPlugin<TStore = {}>(\n plugin: BunliPlugin<TStore>\n): BunliPlugin<TStore>\n\nexport function createPlugin<T>(\n input: T\n): T {\n return input\n}\n\n/**\n * Infer plugin options type from a plugin factory\n * \n * @example\n * ```typescript\n * type Options = InferPluginOptions<typeof myPlugin>\n * ```\n */\nexport type InferPluginOptions<T> = T extends PluginFactory<infer O, any> ? O : never\n\n/**\n * Infer plugin store type\n * \n * @example\n * ```typescript\n * type Store = InferPluginStore<typeof myPlugin>\n * ```\n */\nexport type InferPluginStore<T> = T extends BunliPlugin<infer S> ? S : T extends PluginFactory<any, infer S> ? S : {}\n\n/**\n * Create a test plugin for development and testing\n * \n * @example\n * ```typescript\n * const testPlugin = createTestPlugin(\n * { count: 0, message: '' },\n * {\n * beforeCommand(context) {\n * context.store.count++\n * console.log(`Count: ${context.store.count}`)\n * }\n * }\n * )\n * ```\n */\nexport function createTestPlugin<TStore = {}>(\n store: TStore,\n hooks: Partial<BunliPlugin<TStore>>\n): BunliPlugin<TStore> {\n return {\n name: 'test-plugin',\n version: '1.0.0',\n store,\n ...hooks\n }\n}\n\n/**\n * Compose multiple plugins into a single plugin\n * \n * @example\n * ```typescript\n * const composedPlugin = composePlugins(\n * authPlugin({ provider: 'github' }),\n * loggingPlugin({ level: 'debug' }),\n * metricsPlugin({ enabled: true })\n * )\n * ```\n */\nexport function composePlugins<T extends BunliPlugin[]>(\n ...plugins: T\n): BunliPlugin<MergeStores<T>> {\n const composedStore = plugins.reduce((acc, plugin) => {\n if (plugin.store) {\n return { ...acc, ...plugin.store }\n }\n return acc\n }, {} as MergeStores<T>)\n\n return {\n name: 'composed-plugin',\n version: '1.0.0',\n store: composedStore,\n async setup(context) {\n for (const plugin of plugins) {\n if (plugin.setup) {\n await plugin.setup(context)\n }\n }\n },\n async configResolved(config) {\n for (const plugin of plugins) {\n if (plugin.configResolved) {\n await plugin.configResolved(config)\n }\n }\n },\n async beforeCommand(context) {\n for (const plugin of plugins) {\n if (plugin.beforeCommand) {\n await plugin.beforeCommand(context)\n }\n }\n },\n async afterCommand(context) {\n for (const plugin of plugins) {\n if (plugin.afterCommand) {\n await plugin.afterCommand(context)\n }\n }\n }\n }\n}\n",
5
+ "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { createCLI, type CLI } from \"@bunli/core\";\nimport { aiAgentPlugin } from \"@bunli/plugin-ai-detect\";\nimport { completionsPlugin } from \"@bunli/plugin-completions\";\nimport { configMergerPlugin } from \"@bunli/plugin-config\";\nimport { skillsPlugin } from \"@bunli/plugin-skills\";\n\nimport packageJson from \"../package.json\";\nimport { bunliConfig } from \"../bunli.config\";\nimport { normalizeWpTypiaArgv } from \"./command-contract\";\nimport { WP_TYPIA_CONFIG_SOURCES } from \"./config\";\nimport { extractWpTypiaConfigOverride } from \"./config-override\";\nimport { createWpTypiaSkillsMetadataPlugin } from \"./plugins/wp-typia-skills\";\nimport { wpTypiaUserConfigPlugin } from \"./plugins/wp-typia-user-config\";\n\nfunction applyStandaloneSupportLayoutEnv(): void {\n\tif (process.env.WP_TYPIA_PROJECT_TOOLS_PACKAGE_ROOT) {\n\t\treturn;\n\t}\n\n\tconst executableDir = path.dirname(process.execPath);\n\tconst candidateRoots = [\n\t\tpath.join(executableDir, \".wp-typia\", \"share\", \"wp-typia-project-tools\"),\n\t\tpath.resolve(\n\t\t\texecutableDir,\n\t\t\t\"..\",\n\t\t\t\".wp-typia\",\n\t\t\t\"share\",\n\t\t\t\"wp-typia-project-tools\",\n\t\t),\n\t];\n\n\tfor (const candidateRoot of candidateRoots) {\n\t\tif (fs.existsSync(path.join(candidateRoot, \"package.json\"))) {\n\t\t\tprocess.env.WP_TYPIA_PROJECT_TOOLS_PACKAGE_ROOT = candidateRoot;\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nfunction resolveGeneratedMetadataPath(moduleUrl: string): string {\n\tconst candidates = [\n\t\tnew URL(\"./.bunli/commands.gen.js\", moduleUrl),\n\t\tnew URL(\"../lib/.bunli/commands.gen.js\", moduleUrl),\n\t\tnew URL(\"../.bunli/commands.gen.ts\", moduleUrl),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tconst candidatePath = fileURLToPath(candidate);\n\t\tif (fs.existsSync(candidatePath)) {\n\t\t\treturn candidatePath;\n\t\t}\n\t}\n\n\treturn fileURLToPath(new URL(\"../.bunli/commands.gen.ts\", moduleUrl));\n}\n\nasync function formatCliError(error: unknown): Promise<string> {\n\ttry {\n\t\tconst { formatCliDiagnosticError } = await import(\"@wp-typia/project-tools/cli-diagnostics\");\n\t\treturn formatCliDiagnosticError(error);\n\t} catch {\n\t\treturn error instanceof Error ? error.message : String(error);\n\t}\n}\n\nexport async function createWpTypiaCli(options: {\n\tconfigOverridePath?: string;\n} = {}): Promise<CLI> {\n\tapplyStandaloneSupportLayoutEnv();\n\tconst { wpTypiaCommands } = await import(\"./command-list\");\n\n\tconst cli = await createCLI({\n\t\t...bunliConfig,\n\t\tdescription: packageJson.description,\n\t\tname: packageJson.name,\n\t\tplugins: [\n\t\t\tconfigMergerPlugin({\n\t\t\t\tmergeStrategy: \"deep\",\n\t\t\t\tsources: [...WP_TYPIA_CONFIG_SOURCES],\n\t\t\t}),\n\t\t\twpTypiaUserConfigPlugin({\n\t\t\t\toverrideSource: options.configOverridePath,\n\t\t\t}),\n\t\t\taiAgentPlugin({}),\n\t\t\tcreateWpTypiaSkillsMetadataPlugin(wpTypiaCommands),\n\t\t\tskillsPlugin({\n\t\t\t\tdescription: packageJson.description,\n\t\t\t}),\n\t\t\tcompletionsPlugin({\n\t\t\t\tcommandName: \"wp-typia\",\n\t\t\t\texecutable: \"wp-typia\",\n\t\t\t\tgeneratedPath: resolveGeneratedMetadataPath(import.meta.url),\n\t\t\t}),\n\t\t],\n\t\tversion: packageJson.version,\n\t});\n\n\tfor (const command of wpTypiaCommands) {\n\t\tcli.command(command);\n\t}\n\n\treturn cli;\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\n\tconst normalizedArgv = normalizeWpTypiaArgv(argv);\n\tconst { argv: cliArgv, configOverridePath } = extractWpTypiaConfigOverride(normalizedArgv);\n\tconst cli = await createWpTypiaCli({ configOverridePath });\n\tawait cli.run(cliArgv);\n}\n\nexport async function runCliEntrypoint(argv = process.argv.slice(2)): Promise<void> {\n\ttry {\n\t\tawait main(argv);\n\t} catch (error) {\n\t\tconsole.error(`Error: ${await formatCliError(error)}`);\n\t\tprocess.exitCode = 1;\n\t}\n}\n\nif (import.meta.main) {\n\tvoid runCliEntrypoint();\n}\n\nexport default createWpTypiaCli;\n",
7
6
  "/**\n * AI agent detection plugin for Bunli\n * Detects various AI coding assistants from environment variables\n */\n\nimport type { BunliPlugin } from '@bunli/core/plugin'\nimport { createPlugin } from '@bunli/core/plugin'\n\n// Extend core interfaces with AI-specific fields\ndeclare module '@bunli/core/plugin' {\n interface EnvironmentInfo {\n /** AI agent detected */\n isAIAgent: boolean\n \n /** Detected AI agents */\n aiAgents: string[]\n }\n}\n\ninterface AIAgentInfo {\n name: string\n envVars: string[]\n detect: (env: NodeJS.ProcessEnv) => boolean\n}\n\n// Known AI agents and their detection patterns\nconst AI_AGENTS: AIAgentInfo[] = [\n {\n name: 'claude',\n envVars: ['CLAUDECODE', 'CLAUDE_CODE'],\n detect: (env) => !!env.CLAUDECODE || !!env.CLAUDE_CODE\n },\n {\n name: 'cursor',\n envVars: ['CURSOR_AGENT'],\n detect: (env) => !!env.CURSOR_AGENT\n },\n {\n name: 'codex',\n envVars: ['CODEX_CI', 'CODEX_THREAD_ID', 'CODEX_SANDBOX'],\n detect: (env) => !!env.CODEX_CI || !!env.CODEX_THREAD_ID || !!env.CODEX_SANDBOX\n },\n {\n name: 'amp',\n envVars: ['AMP_CURRENT_THREAD_ID', 'AGENT'],\n detect: (env) => !!env.AMP_CURRENT_THREAD_ID || env.AGENT === 'amp'\n },\n {\n name: 'gemini',\n envVars: ['GEMINI_CLI'],\n detect: (env) => !!env.GEMINI_CLI\n },\n {\n name: 'opencode',\n envVars: ['OPENCODE'],\n detect: (env) => env.OPENCODE === '1'\n },\n]\n\nexport interface AIDetectPluginOptions {\n /**\n * Additional custom AI agents to detect\n */\n customAgents?: AIAgentInfo[]\n \n /**\n * Whether to log detection results\n * Default: false\n */\n verbose?: boolean\n}\n\nexport interface AIDetectStore {\n isAIAgent: boolean\n aiAgents: string[]\n aiAgentEnvVars: string[]\n}\n\n/**\n * AI agent detection plugin factory\n */\nexport const aiAgentPlugin = createPlugin<AIDetectPluginOptions, AIDetectStore>((options = {}) => {\n const agents = [...AI_AGENTS, ...(options.customAgents || [])]\n \n return {\n name: '@bunli/plugin-ai-detect',\n version: '1.0.0',\n \n // Define initial store state\n store: {\n isAIAgent: false,\n aiAgents: [] as string[],\n aiAgentEnvVars: [] as string[]\n },\n \n beforeCommand(context) {\n const env = process.env\n const detectedAgents: string[] = []\n const allDetectedEnvVars: string[] = []\n \n // Initialize AI fields on the environment info\n context.env.isAIAgent = false\n context.env.aiAgents = []\n \n // Check all known AI agents\n for (const agent of agents) {\n if (agent.detect(env)) {\n detectedAgents.push(agent.name)\n \n // Store detected environment variables for this agent\n const detectedVars = agent.envVars.filter(v => !!env[v])\n allDetectedEnvVars.push(...detectedVars)\n \n // Log if verbose\n if (options.verbose) {\n console.log(`🤖 AI agent detected: ${agent.name}`)\n console.log(` Environment variables: ${detectedVars.join(', ')}`)\n }\n }\n }\n \n // Update context based on detection results\n if (detectedAgents.length > 0) {\n context.env.isAIAgent = true\n context.env.aiAgents = detectedAgents\n \n // Use type-safe store - TypeScript knows the exact types!\n if (context.store) {\n context.store.isAIAgent = true\n context.store.aiAgents = detectedAgents\n context.store.aiAgentEnvVars = allDetectedEnvVars\n }\n \n if (options.verbose) {\n if (detectedAgents.length === 1) {\n console.log(`🤖 AI agent detected: ${detectedAgents[0]}`)\n } else {\n console.log(`🤖 Multiple AI agents detected: ${detectedAgents.join(', ')}`)\n }\n }\n } else {\n // Ensure fields are initialized even when no AI agent detected\n if (context.store) {\n context.store.isAIAgent = false\n context.store.aiAgents = []\n context.store.aiAgentEnvVars = []\n }\n }\n }\n }\n})\n\n// Default export for convenience\nexport default aiAgentPlugin",
8
7
  "// @bun\n// src/plugin.ts\nimport { createPlugin } from \"@bunli/core/plugin\";\n\n// src/commands/completions.ts\nimport { defineCommand } from \"@bunli/core\";\n\n// src/engine/zsh.ts\nfunction generate(name, exec) {\n return `#compdef ${name}\ncompdef _${name} ${name}\n\n# zsh completion for ${name} -*- shell-script -*-\n\n__${name}_debug() {\n local file=\"$BASH_COMP_DEBUG_FILE\"\n if [[ -n \\${file} ]]; then\n echo \"$*\" >> \"\\${file}\"\n fi\n}\n\n_${name}() {\n local shellCompDirectiveError=${ShellCompDirective.ShellCompDirectiveError}\n local shellCompDirectiveNoSpace=${ShellCompDirective.ShellCompDirectiveNoSpace}\n local shellCompDirectiveNoFileComp=${ShellCompDirective.ShellCompDirectiveNoFileComp}\n local shellCompDirectiveFilterFileExt=${ShellCompDirective.ShellCompDirectiveFilterFileExt}\n local shellCompDirectiveFilterDirs=${ShellCompDirective.ShellCompDirectiveFilterDirs}\n local shellCompDirectiveKeepOrder=${ShellCompDirective.ShellCompDirectiveKeepOrder}\n\n local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace keepOrder\n local -a completions\n\n __${name}_debug \"\\\\n========= starting completion logic ==========\"\n __${name}_debug \"CURRENT: \\${CURRENT}, words[*]: \\${words[*]}\"\n\n # The user could have moved the cursor backwards on the command-line.\n # We need to trigger completion from the $CURRENT location, so we need\n # to truncate the command-line ($words) up to the $CURRENT location.\n # (We cannot use $CURSOR as its value does not work when a command is an alias.)\n words=( \"\\${=words[1,CURRENT]}\" )\n __${name}_debug \"Truncated words[*]: \\${words[*]},\"\n\n lastParam=\\${words[-1]}\n lastChar=\\${lastParam[-1]}\n __${name}_debug \"lastParam: \\${lastParam}, lastChar: \\${lastChar}\"\n\n # For zsh, when completing a flag with an = (e.g., ${name} -n=<TAB>)\n # completions must be prefixed with the flag\n setopt local_options BASH_REMATCH\n if [[ \"\\${lastParam}\" =~ '-.*=' ]]; then\n # We are dealing with a flag with an =\n flagPrefix=\"-P \\${BASH_REMATCH}\"\n fi\n\n # Prepare the command to obtain completions, ensuring arguments are quoted for eval\n local -a args_to_quote=(\"\\${(@)words[2,-1]}\")\n if [ \"\\${lastChar}\" = \"\" ]; then\n # If the last parameter is complete (there is a space following it)\n # We add an extra empty parameter so we can indicate this to the go completion code.\n __${name}_debug \"Adding extra empty parameter\"\n args_to_quote+=(\"\")\n fi\n\n # Use Zsh's (q) flag to quote each argument safely for eval\n local quoted_args=(\"\\${(@q)args_to_quote}\")\n\n # Join the main command and the quoted arguments into a single string for eval\n requestComp=\"${exec} complete -- \\${quoted_args[*]}\"\n\n __${name}_debug \"About to call: eval \\${requestComp}\"\n\n # Use eval to handle any environment variables and such\n out=$(eval \\${requestComp} 2>/dev/null)\n __${name}_debug \"completion output: \\${out}\"\n\n # Extract the directive integer following a : from the last line\n local lastLine\n while IFS='\n' read -r line; do\n lastLine=\\${line}\n done < <(printf \"%s\n\" \"\\${out[@]}\")\n __${name}_debug \"last line: \\${lastLine}\"\n\n if [ \"\\${lastLine[1]}\" = : ]; then\n directive=\\${lastLine[2,-1]}\n # Remove the directive including the : and the newline\n local suffix\n (( suffix=\\${#lastLine}+2))\n out=\\${out[1,-$suffix]}\n else\n # There is no directive specified. Leave $out as is.\n __${name}_debug \"No directive found. Setting to default\"\n directive=0\n fi\n\n __${name}_debug \"directive: \\${directive}\"\n __${name}_debug \"completions: \\${out}\"\n __${name}_debug \"flagPrefix: \\${flagPrefix}\"\n\n if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then\n __${name}_debug \"Completion received error. Ignoring completions.\"\n return\n fi\n\n local activeHelpMarker=\"%\"\n local endIndex=\\${#activeHelpMarker}\n local startIndex=$((\\${#activeHelpMarker}+1))\n local hasActiveHelp=0\n while IFS='\n' read -r comp; do\n # Check if this is an activeHelp statement (i.e., prefixed with $activeHelpMarker)\n if [ \"\\${comp[1,$endIndex]}\" = \"$activeHelpMarker\" ];then\n __${name}_debug \"ActiveHelp found: $comp\"\n comp=\"\\${comp[$startIndex,-1]}\"\n if [ -n \"$comp\" ]; then\n compadd -x \"\\${comp}\"\n __${name}_debug \"ActiveHelp will need delimiter\"\n hasActiveHelp=1\n fi\n continue\n fi\n\n if [ -n \"$comp\" ]; then\n # If requested, completions are returned with a description.\n # The description is preceded by a TAB character.\n # For zsh's _describe, we need to use a : instead of a TAB.\n # We first need to escape any : as part of the completion itself.\n comp=\\${comp//:/\\\\:}\n\n local tab=\"$(printf '\\\\t')\"\n comp=\\${comp//$tab/:}\n\n __${name}_debug \"Adding completion: \\${comp}\"\n completions+=\\${comp}\n lastComp=$comp\n fi\n done < <(printf \"%s\n\" \"\\${out[@]}\")\n\n # Add a delimiter after the activeHelp statements, but only if:\n # - there are completions following the activeHelp statements, or\n # - file completion will be performed (so there will be choices after the activeHelp)\n if [ $hasActiveHelp -eq 1 ]; then\n if [ \\${#completions} -ne 0 ] || [ $((directive & shellCompDirectiveNoFileComp)) -eq 0 ]; then\n __${name}_debug \"Adding activeHelp delimiter\"\n compadd -x \"--\"\n hasActiveHelp=0\n fi\n fi\n\n if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then\n __${name}_debug \"Activating nospace.\"\n noSpace=\"-S ''\"\n fi\n\n if [ $((directive & shellCompDirectiveKeepOrder)) -ne 0 ]; then\n __${name}_debug \"Activating keep order.\"\n keepOrder=\"-V\"\n fi\n\n if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then\n # File extension filtering\n local filteringCmd\n filteringCmd='_files'\n for filter in \\${completions[@]}; do\n if [ \\${filter[1]} != '*' ]; then\n # zsh requires a glob pattern to do file filtering\n filter=\"\\\\*.$filter\"\n fi\n filteringCmd+=\" -g $filter\"\n done\n filteringCmd+=\" \\${flagPrefix}\"\n\n __${name}_debug \"File filtering command: $filteringCmd\"\n _arguments '*:filename:'\"$filteringCmd\"\n elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then\n # File completion for directories only\n local subdir\n subdir=\"\\${completions[1]}\"\n if [ -n \"$subdir\" ]; then\n __${name}_debug \"Listing directories in $subdir\"\n pushd \"\\${subdir}\" >/dev/null 2>&1\n else\n __${name}_debug \"Listing directories in .\"\n fi\n\n local result\n _arguments '*:dirname:_files -/'\" \\${flagPrefix}\"\n result=$?\n if [ -n \"$subdir\" ]; then\n popd >/dev/null 2>&1\n fi\n return $result\n else\n __${name}_debug \"Calling _describe\"\n if eval _describe $keepOrder \"completions\" completions -Q \\${flagPrefix} \\${noSpace}; then\n __${name}_debug \"_describe found some completions\"\n\n # Return the success of having called _describe\n return 0\n else\n __${name}_debug \"_describe did not find completions.\"\n __${name}_debug \"Checking if we should do file completion.\"\n if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then\n __${name}_debug \"deactivating file completion\"\n\n # Return 0 to indicate completion is finished and prevent zsh from\n # trying other completion algorithms (which could cause hanging).\n # We use NoFileComp directive to explicitly disable file completion.\n return 0\n else\n # Perform file completion\n __${name}_debug \"Activating file completion\"\n\n # We must return the result of this command, so it must be the\n # last command, or else we must store its result to return it.\n _arguments '*:filename:_files'\" \\${flagPrefix}\"\n fi\n fi\n fi\n}\n\n# don't run the completion function when being sourced or eval-ed\nif [ \"\\${funcstack[1]}\" = \"_${name}\" ]; then\n _${name}\nfi\n`;\n}\n\n// src/engine/bash.ts\nfunction generate2(name, exec) {\n const nameForVar = name.replace(/[-:]/g, \"_\");\n const ShellCompDirectiveError = ShellCompDirective.ShellCompDirectiveError;\n const ShellCompDirectiveNoSpace = ShellCompDirective.ShellCompDirectiveNoSpace;\n const ShellCompDirectiveNoFileComp = ShellCompDirective.ShellCompDirectiveNoFileComp;\n const ShellCompDirectiveFilterFileExt = ShellCompDirective.ShellCompDirectiveFilterFileExt;\n const ShellCompDirectiveFilterDirs = ShellCompDirective.ShellCompDirectiveFilterDirs;\n const ShellCompDirectiveKeepOrder = ShellCompDirective.ShellCompDirectiveKeepOrder;\n return `# bash completion for ${name}\n\n# Define shell completion directives\nreadonly ShellCompDirectiveError=${ShellCompDirectiveError}\nreadonly ShellCompDirectiveNoSpace=${ShellCompDirectiveNoSpace}\nreadonly ShellCompDirectiveNoFileComp=${ShellCompDirectiveNoFileComp}\nreadonly ShellCompDirectiveFilterFileExt=${ShellCompDirectiveFilterFileExt}\nreadonly ShellCompDirectiveFilterDirs=${ShellCompDirectiveFilterDirs}\nreadonly ShellCompDirectiveKeepOrder=${ShellCompDirectiveKeepOrder}\n\n# Function to debug completion\n__${nameForVar}_debug() {\n if [[ -n \\${BASH_COMP_DEBUG_FILE:-} ]]; then\n echo \"$*\" >> \"\\${BASH_COMP_DEBUG_FILE}\"\n fi\n}\n\n# Function to handle completions\n__${nameForVar}_complete() {\n local cur prev words cword\n _get_comp_words_by_ref -n \"=:\" cur prev words cword\n\n local requestComp out directive\n\n # Build the command to get completions\n requestComp=\"${exec} complete -- \\${words[@]:1}\"\n\n # Add an empty parameter if the last parameter is complete\n if [[ -z \"$cur\" ]]; then\n requestComp=\"$requestComp ''\"\n fi\n\n # Get completions from the program\n out=$(eval \"$requestComp\" 2>/dev/null)\n\n # Extract directive if present\n directive=0\n if [[ \"$out\" == *:* ]]; then\n directive=\\${out##*:}\n out=\\${out%:*}\n fi\n\n # Process completions based on directive\n if [[ $((directive & $ShellCompDirectiveError)) -ne 0 ]]; then\n # Error, no completion\n return\n fi\n\n # Apply directives\n if [[ $((directive & $ShellCompDirectiveNoSpace)) -ne 0 ]]; then\n compopt -o nospace\n fi\n if [[ $((directive & $ShellCompDirectiveKeepOrder)) -ne 0 ]]; then\n compopt -o nosort\n fi\n if [[ $((directive & $ShellCompDirectiveNoFileComp)) -ne 0 ]]; then\n compopt +o default\n fi\n\n # Handle file extension filtering\n if [[ $((directive & $ShellCompDirectiveFilterFileExt)) -ne 0 ]]; then\n local filter=\"\"\n for ext in $out; do\n filter=\"$filter|$ext\"\n done\n filter=\"\\\\.($filter)\"\n compopt -o filenames\n COMPREPLY=( $(compgen -f -X \"!$filter\" -- \"$cur\") )\n return\n fi\n\n # Handle directory filtering\n if [[ $((directive & $ShellCompDirectiveFilterDirs)) -ne 0 ]]; then\n compopt -o dirnames\n COMPREPLY=( $(compgen -d -- \"$cur\") )\n return\n fi\n\n # Process completions\n local IFS=$'\\\\n'\n local tab=$(printf '\\\\t')\n\n # Parse completions with descriptions\n local completions=()\n while read -r comp; do\n if [[ \"$comp\" == *$tab* ]]; then\n # Split completion and description\n local value=\\${comp%%$tab*}\n local desc=\\${comp#*$tab}\n completions+=(\"$value\")\n else\n completions+=(\"$comp\")\n fi\n done <<< \"$out\"\n\n # Return completions\n COMPREPLY=( $(compgen -W \"\\${completions[*]}\" -- \"$cur\") )\n}\n\n# Register completion function\ncomplete -F __${nameForVar}_complete ${name}\n`;\n}\n\n// src/engine/fish.ts\nfunction generate3(name, exec) {\n const nameForVar = name.replace(/[-:]/g, \"_\");\n const ShellCompDirectiveError = ShellCompDirective.ShellCompDirectiveError;\n const ShellCompDirectiveNoSpace = ShellCompDirective.ShellCompDirectiveNoSpace;\n const ShellCompDirectiveNoFileComp = ShellCompDirective.ShellCompDirectiveNoFileComp;\n const ShellCompDirectiveFilterFileExt = ShellCompDirective.ShellCompDirectiveFilterFileExt;\n const ShellCompDirectiveFilterDirs = ShellCompDirective.ShellCompDirectiveFilterDirs;\n const ShellCompDirectiveKeepOrder = ShellCompDirective.ShellCompDirectiveKeepOrder;\n return `# fish completion for ${name} -*- shell-script -*-\n\nfunction __${nameForVar}_debug\n set -l file \"$BASH_COMP_DEBUG_FILE\"\n if test -n \"$file\"\n echo \"$argv\" >> $file\n end\nend\n\nfunction __${nameForVar}_perform_completion\n __${nameForVar}_debug \"Starting __${nameForVar}_perform_completion\"\n\n # Extract all args except the last one\n set -l args (commandline -opc)\n # Extract the last arg and escape it in case it is a space or wildcard\n set -l lastArg (string escape -- (commandline -ct))\n\n __${nameForVar}_debug \"args: $args\"\n __${nameForVar}_debug \"last arg: $lastArg\"\n\n # Build the completion request command\n set -l requestComp \"${exec} complete -- (string join ' ' -- (string escape -- $args[2..-1])) $lastArg\"\n\n __${nameForVar}_debug \"Calling $requestComp\"\n set -l results (eval $requestComp 2> /dev/null)\n\n # Some programs may output extra empty lines after the directive.\n # Let's ignore them or else it will break completion.\n # Ref: https://github.com/spf13/cobra/issues/1279\n for line in $results[-1..1]\n if test (string trim -- $line) = \"\"\n # Found an empty line, remove it\n set results $results[1..-2]\n else\n # Found non-empty line, we have our proper output\n break\n end\n end\n\n set -l comps $results[1..-2]\n set -l directiveLine $results[-1]\n\n # For Fish, when completing a flag with an = (e.g., <program> -n=<TAB>)\n # completions must be prefixed with the flag\n set -l flagPrefix (string match -r -- '-.*=' \"$lastArg\")\n\n __${nameForVar}_debug \"Comps: $comps\"\n __${nameForVar}_debug \"DirectiveLine: $directiveLine\"\n __${nameForVar}_debug \"flagPrefix: $flagPrefix\"\n\n for comp in $comps\n printf \"%s%s\\\\n\" \"$flagPrefix\" \"$comp\"\n end\n\n printf \"%s\\\\n\" \"$directiveLine\"\nend\n\n# This function limits calls to __${nameForVar}_perform_completion, by caching the result\nfunction __${nameForVar}_perform_completion_once\n __${nameForVar}_debug \"Starting __${nameForVar}_perform_completion_once\"\n\n if test -n \"$__${nameForVar}_perform_completion_once_result\"\n __${nameForVar}_debug \"Seems like a valid result already exists, skipping __${nameForVar}_perform_completion\"\n return 0\n end\n\n set --global __${nameForVar}_perform_completion_once_result (__${nameForVar}_perform_completion)\n if test -z \"$__${nameForVar}_perform_completion_once_result\"\n __${nameForVar}_debug \"No completions, probably due to a failure\"\n return 1\n end\n\n __${nameForVar}_debug \"Performed completions and set __${nameForVar}_perform_completion_once_result\"\n return 0\nend\n\n# This function is used to clear the cached result after completions are run\nfunction __${nameForVar}_clear_perform_completion_once_result\n __${nameForVar}_debug \"\"\n __${nameForVar}_debug \"========= clearing previously set __${nameForVar}_perform_completion_once_result variable ==========\"\n set --erase __${nameForVar}_perform_completion_once_result\n __${nameForVar}_debug \"Successfully erased the variable __${nameForVar}_perform_completion_once_result\"\nend\n\nfunction __${nameForVar}_requires_order_preservation\n __${nameForVar}_debug \"\"\n __${nameForVar}_debug \"========= checking if order preservation is required ==========\"\n\n __${nameForVar}_perform_completion_once\n if test -z \"$__${nameForVar}_perform_completion_once_result\"\n __${nameForVar}_debug \"Error determining if order preservation is required\"\n return 1\n end\n\n set -l directive (string sub --start 2 $__${nameForVar}_perform_completion_once_result[-1])\n __${nameForVar}_debug \"Directive is: $directive\"\n\n set -l shellCompDirectiveKeepOrder ${ShellCompDirectiveKeepOrder}\n set -l keeporder (math (math --scale 0 $directive / $shellCompDirectiveKeepOrder) % 2)\n __${nameForVar}_debug \"Keeporder is: $keeporder\"\n\n if test $keeporder -ne 0\n __${nameForVar}_debug \"This does require order preservation\"\n return 0\n end\n\n __${nameForVar}_debug \"This doesn't require order preservation\"\n return 1\nend\n\n# This function does two things:\n# - Obtain the completions and store them in the global __${nameForVar}_comp_results\n# - Return false if file completion should be performed\nfunction __${nameForVar}_prepare_completions\n __${nameForVar}_debug \"\"\n __${nameForVar}_debug \"========= starting completion logic ==========\"\n\n # Start fresh\n set --erase __${nameForVar}_comp_results\n\n __${nameForVar}_perform_completion_once\n __${nameForVar}_debug \"Completion results: $__${nameForVar}_perform_completion_once_result\"\n\n if test -z \"$__${nameForVar}_perform_completion_once_result\"\n __${nameForVar}_debug \"No completion, probably due to a failure\"\n # Might as well do file completion, in case it helps\n return 1\n end\n\n set -l directive (string sub --start 2 $__${nameForVar}_perform_completion_once_result[-1])\n set --global __${nameForVar}_comp_results $__${nameForVar}_perform_completion_once_result[1..-2]\n\n __${nameForVar}_debug \"Completions are: $__${nameForVar}_comp_results\"\n __${nameForVar}_debug \"Directive is: $directive\"\n\n set -l shellCompDirectiveError ${ShellCompDirectiveError}\n set -l shellCompDirectiveNoSpace ${ShellCompDirectiveNoSpace}\n set -l shellCompDirectiveNoFileComp ${ShellCompDirectiveNoFileComp}\n set -l shellCompDirectiveFilterFileExt ${ShellCompDirectiveFilterFileExt}\n set -l shellCompDirectiveFilterDirs ${ShellCompDirectiveFilterDirs}\n\n if test -z \"$directive\"\n set directive 0\n end\n\n set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2)\n if test $compErr -eq 1\n __${nameForVar}_debug \"Received error directive: aborting.\"\n # Might as well do file completion, in case it helps\n return 1\n end\n\n set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2)\n set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2)\n if test $filefilter -eq 1; or test $dirfilter -eq 1\n __${nameForVar}_debug \"File extension filtering or directory filtering not supported\"\n # Do full file completion instead\n return 1\n end\n\n set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2)\n set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2)\n\n __${nameForVar}_debug \"nospace: $nospace, nofiles: $nofiles\"\n\n # If we want to prevent a space, or if file completion is NOT disabled,\n # we need to count the number of valid completions.\n # To do so, we will filter on prefix as the completions we have received\n # may not already be filtered so as to allow fish to match on different\n # criteria than the prefix.\n if test $nospace -ne 0; or test $nofiles -eq 0\n set -l prefix (commandline -t | string escape --style=regex)\n __${nameForVar}_debug \"prefix: $prefix\"\n\n set -l completions (string match -r -- \"^$prefix.*\" $__${nameForVar}_comp_results)\n set --global __${nameForVar}_comp_results $completions\n __${nameForVar}_debug \"Filtered completions are: $__${nameForVar}_comp_results\"\n\n # Important not to quote the variable for count to work\n set -l numComps (count $__${nameForVar}_comp_results)\n __${nameForVar}_debug \"numComps: $numComps\"\n\n if test $numComps -eq 1; and test $nospace -ne 0\n # We must first split on \\\\t to get rid of the descriptions to be\n # able to check what the actual completion will be.\n # We don't need descriptions anyway since there is only a single\n # real completion which the shell will expand immediately.\n set -l split (string split --max 1 \"\\\\t\" $__${nameForVar}_comp_results[1])\n\n # Fish won't add a space if the completion ends with any\n # of the following characters: @=/:.,\n set -l lastChar (string sub -s -1 -- $split)\n if not string match -r -q \"[@=/:.,]\" -- \"$lastChar\"\n # In other cases, to support the \"nospace\" directive we trick the shell\n # by outputting an extra, longer completion.\n __${nameForVar}_debug \"Adding second completion to perform nospace directive\"\n set --global __${nameForVar}_comp_results $split[1] $split[1].\n __${nameForVar}_debug \"Completions are now: $__${nameForVar}_comp_results\"\n end\n end\n\n if test $numComps -eq 0; and test $nofiles -eq 0\n # To be consistent with bash and zsh, we only trigger file\n # completion when there are no other completions\n __${nameForVar}_debug \"Requesting file completion\"\n return 1\n end\n end\n\n return 0\nend\n\n# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves\n# so we can properly delete any completions provided by another script.\n# Only do this if the program can be found, or else fish may print some errors; besides,\n# the existing completions will only be loaded if the program can be found.\nif type -q \"${name}\"\n # The space after the program name is essential to trigger completion for the program\n # and not completion of the program name itself.\n # Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.\n complete --do-complete \"${name} \" > /dev/null 2>&1\nend\n\n# Remove any pre-existing completions for the program since we will be handling all of them.\ncomplete -c ${name} -e\n\n# This will get called after the two calls below and clear the cached result\ncomplete -c ${name} -n '__${nameForVar}_clear_perform_completion_once_result'\n# The call to __${nameForVar}_prepare_completions will setup __${nameForVar}_comp_results\n# which provides the program's completion choices.\n# If this doesn't require order preservation, we don't use the -k flag\ncomplete -c ${name} -n 'not __${nameForVar}_requires_order_preservation && __${nameForVar}_prepare_completions' -f -a '$__${nameForVar}_comp_results'\n# Otherwise we use the -k flag\ncomplete -k -c ${name} -n '__${nameForVar}_requires_order_preservation && __${nameForVar}_prepare_completions' -f -a '$__${nameForVar}_comp_results'\n`;\n}\n\n// src/engine/powershell.ts\nfunction generate4(name, exec) {\n const nameForVar = name.replace(/[-:]/g, \"_\");\n const ShellCompDirectiveError = ShellCompDirective.ShellCompDirectiveError;\n const ShellCompDirectiveNoSpace = ShellCompDirective.ShellCompDirectiveNoSpace;\n const ShellCompDirectiveNoFileComp = ShellCompDirective.ShellCompDirectiveNoFileComp;\n const ShellCompDirectiveFilterFileExt = ShellCompDirective.ShellCompDirectiveFilterFileExt;\n const ShellCompDirectiveFilterDirs = ShellCompDirective.ShellCompDirectiveFilterDirs;\n const ShellCompDirectiveKeepOrder = ShellCompDirective.ShellCompDirectiveKeepOrder;\n return `# powershell completion for ${name} -*- shell-script -*-\n\n [Console]::OutputEncoding = [System.Text.Encoding]::UTF8\n function __${name}_debug {\n if ($env:BASH_COMP_DEBUG_FILE) {\n \"$args\" | Out-File -Append -FilePath \"$env:BASH_COMP_DEBUG_FILE\"\n }\n }\n\n filter __${name}_escapeStringWithSpecialChars {\n $_ -replace '\\\\s|#|@|\\\\$|;|,|''|\\\\{|\\\\}|\\\\(|\\\\)|\"|\\\\||<|>|&','\\`$&'\n }\n\n[scriptblock]$__${nameForVar}CompleterBlock = {\n param(\n $WordToComplete,\n $CommandAst,\n $CursorPosition\n )\n\n # Get the current command line and convert into a string\n $Command = $CommandAst.CommandElements\n $Command = \"$Command\"\n\n __${name}_debug \"\"\n __${name}_debug \"========= starting completion logic ==========\"\n __${name}_debug \"WordToComplete: $WordToComplete Command: $Command CursorPosition: $CursorPosition\"\n\n # The user could have moved the cursor backwards on the command-line.\n # We need to trigger completion from the $CursorPosition location, so we need\n # to truncate the command-line ($Command) up to the $CursorPosition location.\n # Make sure the $Command is longer then the $CursorPosition before we truncate.\n # This happens because the $Command does not include the last space.\n if ($Command.Length -gt $CursorPosition) {\n $Command = $Command.Substring(0, $CursorPosition)\n }\n __${name}_debug \"Truncated command: $Command\"\n\n $ShellCompDirectiveError=${ShellCompDirectiveError}\n $ShellCompDirectiveNoSpace=${ShellCompDirectiveNoSpace}\n $ShellCompDirectiveNoFileComp=${ShellCompDirectiveNoFileComp}\n $ShellCompDirectiveFilterFileExt=${ShellCompDirectiveFilterFileExt}\n $ShellCompDirectiveFilterDirs=${ShellCompDirectiveFilterDirs}\n $ShellCompDirectiveKeepOrder=${ShellCompDirectiveKeepOrder}\n\n # Prepare the command to request completions for the program.\n # Split the command at the first space to separate the program and arguments.\n $Program, $Arguments = $Command.Split(\" \", 2)\n\n $QuotedArgs = ($Arguments -split ' ' | ForEach-Object { \"'\" + ($_ -replace \"'\", \"''\") + \"'\" }) -join ' '\n __${name}_debug \"QuotedArgs: $QuotedArgs\"\n\n $RequestComp = \"& ${exec} complete '--' $QuotedArgs\"\n __${name}_debug \"RequestComp: $RequestComp\"\n\n # we cannot use $WordToComplete because it\n # has the wrong values if the cursor was moved\n # so use the last argument\n if ($WordToComplete -ne \"\" ) {\n $WordToComplete = $Arguments.Split(\" \")[-1]\n }\n __${name}_debug \"New WordToComplete: $WordToComplete\"\n\n\n # Check for flag with equal sign\n $IsEqualFlag = ($WordToComplete -Like \"--*=*\" )\n if ( $IsEqualFlag ) {\n __${name}_debug \"Completing equal sign flag\"\n # Remove the flag part\n $Flag, $WordToComplete = $WordToComplete.Split(\"=\", 2)\n }\n\n if ( $WordToComplete -eq \"\" -And ( -Not $IsEqualFlag )) {\n # If the last parameter is complete (there is a space following it)\n # We add an extra empty parameter so we can indicate this to the go method.\n __${name}_debug \"Adding extra empty parameter\"\n # PowerShell 7.2+ changed the way how the arguments are passed to executables,\n # so for pre-7.2 or when Legacy argument passing is enabled we need to use\n if ($PSVersionTable.PsVersion -lt [version]'7.2.0' -or\n ($PSVersionTable.PsVersion -lt [version]'7.3.0' -and -not [ExperimentalFeature]::IsEnabled(\"PSNativeCommandArgumentPassing\")) -or\n (($PSVersionTable.PsVersion -ge [version]'7.3.0' -or [ExperimentalFeature]::IsEnabled(\"PSNativeCommandArgumentPassing\")) -and\n $PSNativeCommandArgumentPassing -eq 'Legacy')) {\n $RequestComp=\"$RequestComp\" + ' \\`\"\\`\"'\n } else {\n $RequestComp = \"$RequestComp\" + ' \"\"'\n }\n }\n\n __${name}_debug \"Calling $RequestComp\"\n # First disable ActiveHelp which is not supported for Powershell\n $env:ActiveHelp = 0\n\n # call the command store the output in $out and redirect stderr and stdout to null\n # $Out is an array contains each line per element\n Invoke-Expression -OutVariable out \"$RequestComp\" 2>&1 | Out-Null\n\n # get directive from last line\n [int]$Directive = $Out[-1].TrimStart(':')\n if ($Directive -eq \"\") {\n # There is no directive specified\n $Directive = 0\n }\n __${name}_debug \"The completion directive is: $Directive\"\n\n # remove directive (last element) from out\n $Out = $Out | Where-Object { $_ -ne $Out[-1] }\n __${name}_debug \"The completions are: $Out\"\n\n if (($Directive -band $ShellCompDirectiveError) -ne 0 ) {\n # Error code. No completion.\n __${name}_debug \"Received error from custom completion go code\"\n return\n }\n\n $Longest = 0\n [Array]$Values = $Out | ForEach-Object {\n # Split the output in name and description\n $Name, $Description = $_.Split(\"\\`t\", 2)\n __${name}_debug \"Name: $Name Description: $Description\"\n\n # Look for the longest completion so that we can format things nicely\n if ($Longest -lt $Name.Length) {\n $Longest = $Name.Length\n }\n\n # Set the description to a one space string if there is none set.\n # This is needed because the CompletionResult does not accept an empty string as argument\n if (-Not $Description) {\n $Description = \" \"\n }\n @{ Name = \"$Name\"; Description = \"$Description\" }\n }\n\n\n $Space = \" \"\n if (($Directive -band $ShellCompDirectiveNoSpace) -ne 0 ) {\n # remove the space here\n __${name}_debug \"ShellCompDirectiveNoSpace is called\"\n $Space = \"\"\n }\n\n if ((($Directive -band $ShellCompDirectiveFilterFileExt) -ne 0 ) -or\n (($Directive -band $ShellCompDirectiveFilterDirs) -ne 0 )) {\n __${name}_debug \"ShellCompDirectiveFilterFileExt ShellCompDirectiveFilterDirs are not supported\"\n\n # return here to prevent the completion of the extensions\n return\n }\n\n $Values = $Values | Where-Object {\n # filter the result\n $_.Name -like \"$WordToComplete*\"\n\n # Join the flag back if we have an equal sign flag\n if ( $IsEqualFlag ) {\n __${name}_debug \"Join the equal sign flag back to the completion value\"\n $_.Name = $Flag + \"=\" + $_.Name\n }\n }\n\n # we sort the values in ascending order by name if keep order isn't passed\n if (($Directive -band $ShellCompDirectiveKeepOrder) -eq 0 ) {\n $Values = $Values | Sort-Object -Property Name\n }\n\n if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) {\n __${name}_debug \"ShellCompDirectiveNoFileComp is called\"\n\n if ($Values.Length -eq 0) {\n # Just print an empty string here so the\n # shell does not start to complete paths.\n # We cannot use CompletionResult here because\n # it does not accept an empty string as argument.\n \"\"\n return\n }\n }\n\n # Get the current mode\n $Mode = (Get-PSReadLineKeyHandler | Where-Object { $_.Key -eq \"Tab\" }).Function\n __${name}_debug \"Mode: $Mode\"\n\n $Values | ForEach-Object {\n\n # store temporary because switch will overwrite $_\n $comp = $_\n\n # PowerShell supports three different completion modes\n # - TabCompleteNext (default windows style - on each key press the next option is displayed)\n # - Complete (works like bash)\n # - MenuComplete (works like zsh)\n # You set the mode with Set-PSReadLineKeyHandler -Key Tab -Function <mode>\n\n # CompletionResult Arguments:\n # 1) CompletionText text to be used as the auto completion result\n # 2) ListItemText text to be displayed in the suggestion list\n # 3) ResultType type of completion result\n # 4) ToolTip text for the tooltip with details about the object\n\n switch ($Mode) {\n\n # bash like\n \"Complete\" {\n\n if ($Values.Length -eq 1) {\n __${name}_debug \"Only one completion left\"\n\n # insert space after value\n [System.Management.Automation.CompletionResult]::new($($comp.Name | __${name}_escapeStringWithSpecialChars) + $Space, \"$($comp.Name)\", 'ParameterValue', \"$($comp.Description)\")\n\n } else {\n # Add the proper number of spaces to align the descriptions\n while($comp.Name.Length -lt $Longest) {\n $comp.Name = $comp.Name + \" \"\n }\n\n # Check for empty description and only add parentheses if needed\n if ($($comp.Description) -eq \" \" ) {\n $Description = \"\"\n } else {\n $Description = \" ($($comp.Description))\"\n }\n\n [System.Management.Automation.CompletionResult]::new(\"$($comp.Name)$Description\", \"$($comp.Name)$Description\", 'ParameterValue', \"$($comp.Description)\")\n }\n }\n\n # zsh like\n \"MenuComplete\" {\n # insert space after value\n # MenuComplete will automatically show the ToolTip of\n # the highlighted value at the bottom of the suggestions.\n [System.Management.Automation.CompletionResult]::new($($comp.Name | __${name}_escapeStringWithSpecialChars) + $Space, \"$($comp.Name)\", 'ParameterValue', \"$($comp.Description)\")\n }\n\n # TabCompleteNext and in case we get something unknown\n Default {\n # Like MenuComplete but we don't want to add a space here because\n # the user need to press space anyway to get the completion.\n # Description will not be shown because that's not possible with TabCompleteNext\n [System.Management.Automation.CompletionResult]::new($($comp.Name | __${name}_escapeStringWithSpecialChars), \"$($comp.Name)\", 'ParameterValue', \"$($comp.Description)\")\n }\n }\n\n }\n}\n\nRegister-ArgumentCompleter -CommandName '${name}' -ScriptBlock $__${nameForVar}CompleterBlock\n`;\n}\n\n// src/engine/t.ts\nvar ShellCompDirective = {\n ShellCompDirectiveError: 1 << 0,\n ShellCompDirectiveNoSpace: 1 << 1,\n ShellCompDirectiveNoFileComp: 1 << 2,\n ShellCompDirectiveFilterFileExt: 1 << 3,\n ShellCompDirectiveFilterDirs: 1 << 4,\n ShellCompDirectiveKeepOrder: 1 << 5,\n shellCompDirectiveMaxValue: 1 << 6,\n ShellCompDirectiveDefault: 0\n};\n\nclass Argument {\n name;\n variadic;\n command;\n handler;\n constructor(command, name, handler, variadic = false) {\n this.command = command;\n this.name = name;\n this.handler = handler;\n this.variadic = variadic;\n }\n}\n\nclass Option {\n value;\n description;\n command;\n handler;\n alias;\n isBoolean;\n constructor(command, value, description, handler, alias, isBoolean) {\n this.command = command;\n this.value = value;\n this.description = description;\n this.handler = handler;\n this.alias = alias;\n this.isBoolean = isBoolean;\n }\n}\n\nclass Command {\n value;\n description;\n options = new Map;\n arguments = new Map;\n parent;\n constructor(value, description) {\n this.value = value;\n this.description = description;\n }\n option(value, description, handlerOrAlias, alias) {\n let handler;\n let aliasStr;\n let isBoolean;\n if (typeof handlerOrAlias === \"function\") {\n handler = handlerOrAlias;\n aliasStr = alias;\n isBoolean = false;\n } else if (typeof handlerOrAlias === \"string\") {\n handler = undefined;\n aliasStr = handlerOrAlias;\n isBoolean = true;\n } else {\n handler = undefined;\n aliasStr = undefined;\n isBoolean = true;\n }\n const option = new Option(this, value, description, handler, aliasStr, isBoolean);\n this.options.set(value, option);\n return this;\n }\n argument(name, handler, variadic = false) {\n const arg = new Argument(this, name, handler, variadic);\n this.arguments.set(name, arg);\n return this;\n }\n}\nvar SUPPORTED_SHELLS = new Set([\"zsh\", \"bash\", \"fish\", \"powershell\"]);\n\nclass RootCommand extends Command {\n commands = new Map;\n completions = [];\n directive = ShellCompDirective.ShellCompDirectiveDefault;\n constructor() {\n super(\"\", \"\");\n }\n command(value, description) {\n const c = new Command(value, description);\n this.commands.set(value, c);\n return c;\n }\n stripOptions(args) {\n const parts = [];\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n if (arg.startsWith(\"-\")) {\n i++;\n const hasInlineValue = arg.includes(\"=\");\n let isBoolean = false;\n const rootOption = this.findOption(this, arg);\n if (rootOption) {\n isBoolean = rootOption.isBoolean ?? false;\n } else {\n for (const [, command] of this.commands) {\n const option = this.findOption(command, arg);\n if (option) {\n isBoolean = option.isBoolean ?? false;\n break;\n }\n }\n }\n if (!hasInlineValue && !isBoolean && i < args.length && !args[i].startsWith(\"-\")) {\n i++;\n }\n } else {\n parts.push(arg);\n i++;\n }\n }\n return parts;\n }\n matchCommand(args) {\n args = this.stripOptions(args);\n const parts = [];\n let remaining = [];\n let matchedCommand = null;\n for (let i = 0;i < args.length; i++) {\n const k = args[i];\n parts.push(k);\n const potential = this.commands.get(parts.join(\" \"));\n if (potential) {\n matchedCommand = potential;\n } else {\n remaining = args.slice(i, args.length);\n break;\n }\n }\n return [matchedCommand || this, remaining];\n }\n shouldCompleteFlags(lastPrevArg, toComplete) {\n if (toComplete.startsWith(\"-\")) {\n return true;\n }\n if (lastPrevArg?.startsWith(\"-\")) {\n let option = this.findOption(this, lastPrevArg);\n if (!option) {\n for (const [, command] of this.commands) {\n option = this.findOption(command, lastPrevArg);\n if (option)\n break;\n }\n }\n if (option && option.isBoolean) {\n return false;\n }\n return true;\n }\n return false;\n }\n shouldCompleteCommands(toComplete) {\n return !toComplete.startsWith(\"-\");\n }\n handleFlagCompletion(command, previousArgs, toComplete, lastPrevArg) {\n let optionName;\n if (toComplete.includes(\"=\")) {\n const [flag] = toComplete.split(\"=\");\n optionName = flag;\n } else if (lastPrevArg?.startsWith(\"-\")) {\n const option = this.findOption(command, lastPrevArg);\n if (option && !option.isBoolean) {\n optionName = lastPrevArg;\n }\n }\n if (optionName) {\n const option = this.findOption(command, optionName);\n if (option?.handler) {\n const suggestions = [];\n option.handler.call(option, (value, description) => suggestions.push({ value, description }), command.options);\n this.completions = suggestions;\n }\n return;\n }\n if (toComplete.startsWith(\"-\")) {\n const isShortFlag = toComplete.startsWith(\"-\") && !toComplete.startsWith(\"--\");\n const cleanToComplete = toComplete.replace(/^-+/, \"\");\n for (const [name, option] of command.options) {\n if (isShortFlag && option.alias && `-${option.alias}`.startsWith(toComplete)) {\n this.completions.push({\n value: `-${option.alias}`,\n description: option.description\n });\n } else if (!isShortFlag && name.startsWith(cleanToComplete)) {\n this.completions.push({\n value: `--${name}`,\n description: option.description\n });\n }\n }\n }\n }\n findOption(command, optionName) {\n const normalized = this.normalizeOptionToken(optionName);\n let option = command.options.get(optionName);\n if (option)\n return option;\n option = command.options.get(normalized);\n if (option)\n return option;\n for (const [_name, opt] of command.options) {\n if (opt.alias === normalized) {\n return opt;\n }\n }\n return;\n }\n normalizeOptionToken(optionName) {\n return optionName.replace(/^-+/, \"\").split(\"=\")[0] ?? \"\";\n }\n handleCommandCompletion(previousArgs, toComplete) {\n const commandParts = this.stripOptions(previousArgs);\n for (const [k, command] of this.commands) {\n if (k === \"\")\n continue;\n const parts = k.split(\" \");\n const match = parts.slice(0, commandParts.length).every((part, i) => part === commandParts[i]);\n if (match && parts[commandParts.length]?.startsWith(toComplete)) {\n this.completions.push({\n value: parts[commandParts.length],\n description: command.description\n });\n }\n }\n }\n handlePositionalCompletion(command, previousArgs) {\n const commandParts = command.value.split(\" \").length;\n const currentArgIndex = Math.max(0, previousArgs.length - commandParts);\n const argumentEntries = Array.from(command.arguments.entries());\n if (argumentEntries.length > 0) {\n let targetArgument;\n if (currentArgIndex < argumentEntries.length) {\n const [_argName, argument] = argumentEntries[currentArgIndex];\n targetArgument = argument;\n } else {\n const lastArgument = argumentEntries[argumentEntries.length - 1][1];\n if (lastArgument.variadic) {\n targetArgument = lastArgument;\n }\n }\n if (targetArgument && targetArgument.handler && typeof targetArgument.handler === \"function\") {\n const suggestions = [];\n targetArgument.handler.call(targetArgument, (value, description) => suggestions.push({ value, description }), command.options);\n this.completions.push(...suggestions);\n }\n }\n }\n complete(toComplete) {\n this.directive = ShellCompDirective.ShellCompDirectiveNoFileComp;\n const seen = new Set;\n this.completions.filter((comp) => {\n if (seen.has(comp.value))\n return false;\n seen.add(comp.value);\n return true;\n }).filter((comp) => {\n if (toComplete.includes(\"=\")) {\n const [, valueToComplete] = toComplete.split(\"=\");\n return comp.value.startsWith(valueToComplete ?? \"\");\n }\n return comp.value.startsWith(toComplete);\n }).forEach((comp) => console.log(`${comp.value}\t${comp.description ?? \"\"}`));\n console.log(`:${this.directive}`);\n }\n parse(args) {\n this.completions = [];\n const endsWithSpace = args[args.length - 1] === \"\";\n if (endsWithSpace) {\n args.pop();\n }\n let toComplete = args[args.length - 1] || \"\";\n const previousArgs = args.slice(0, -1);\n if (endsWithSpace) {\n if (toComplete !== \"\") {\n previousArgs.push(toComplete);\n }\n toComplete = \"\";\n }\n const [matchedCommand] = this.matchCommand(previousArgs);\n const lastPrevArg = previousArgs[previousArgs.length - 1];\n if (this.shouldCompleteFlags(lastPrevArg, toComplete)) {\n this.handleFlagCompletion(matchedCommand, previousArgs, toComplete, lastPrevArg);\n } else {\n if (lastPrevArg?.startsWith(\"-\") && toComplete === \"\" && endsWithSpace) {\n let option = this.findOption(this, lastPrevArg);\n if (!option) {\n for (const [, command] of this.commands) {\n option = this.findOption(command, lastPrevArg);\n if (option)\n break;\n }\n }\n if (option && option.isBoolean) {\n this.complete(toComplete);\n return;\n }\n }\n if (this.shouldCompleteCommands(toComplete)) {\n this.handleCommandCompletion(previousArgs, toComplete);\n }\n if (matchedCommand && matchedCommand.arguments.size > 0) {\n this.handlePositionalCompletion(matchedCommand, previousArgs);\n }\n }\n this.complete(toComplete);\n }\n setup(name, executable, shell) {\n if (!SUPPORTED_SHELLS.has(shell)) {\n throw new Error(`Unsupported shell: ${shell}`);\n }\n switch (shell) {\n case \"zsh\": {\n const script = generate(name, executable);\n console.log(script);\n break;\n }\n case \"bash\": {\n const script = generate2(name, executable);\n console.log(script);\n break;\n }\n case \"fish\": {\n const script = generate3(name, executable);\n console.log(script);\n break;\n }\n case \"powershell\": {\n const script = generate4(name, executable);\n console.log(script);\n break;\n }\n }\n }\n}\nvar t = new RootCommand;\n// ../../node_modules/.bun/better-result@2.7.0/node_modules/better-result/dist/index.mjs\nfunction dual(arity, body) {\n if (arity === 2)\n return (...args) => {\n if (args.length >= 2)\n return body(args[0], args[1]);\n return (self) => body(self, args[0]);\n };\n if (arity === 3)\n return (...args) => {\n if (args.length >= 3)\n return body(args[0], args[1], args[2]);\n return (self) => body(self, args[0], args[1]);\n };\n if (arity === 4)\n return (...args) => {\n if (args.length >= 4)\n return body(args[0], args[1], args[2], args[3]);\n return (self) => body(self, args[0], args[1], args[2]);\n };\n return (...args) => {\n if (args.length >= arity)\n return body(...args);\n return (self) => body(self, ...args);\n };\n}\nvar serializeCause = (cause) => {\n if (cause instanceof Error)\n return {\n name: cause.name,\n message: cause.message,\n stack: cause.stack\n };\n return cause;\n};\nvar isAnyTaggedError = (value) => {\n return value instanceof Error && \"_tag\" in value && typeof value._tag === \"string\";\n};\nvar TaggedError = Object.assign((tag) => () => {\n\n class Base extends Error {\n _tag = tag;\n static is(value) {\n return value instanceof Base;\n }\n constructor(args) {\n const message = args && \"message\" in args && typeof args.message === \"string\" ? args.message : undefined;\n const cause = args && \"cause\" in args ? args.cause : undefined;\n super(message, cause !== undefined ? { cause } : undefined);\n if (args)\n Object.assign(this, args);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = tag;\n if (cause instanceof Error && cause.stack) {\n const indented = cause.stack.replace(/\\n/g, `\n `);\n this.stack = `${this.stack}\nCaused by: ${indented}`;\n }\n }\n toJSON() {\n return {\n ...this,\n _tag: this._tag,\n name: this.name,\n message: this.message,\n cause: serializeCause(this.cause),\n stack: this.stack\n };\n }\n }\n return Base;\n}, { is: isAnyTaggedError });\nvar matchError = dual(2, (err$1, handlers) => {\n const handler = handlers[err$1._tag];\n return handler(err$1);\n});\nvar matchErrorPartial = dual(3, (err$1, handlers, fallback) => {\n const handler = handlers[err$1._tag];\n if (typeof handler === \"function\")\n return handler(err$1);\n return fallback(err$1);\n});\nvar UnhandledException = class extends TaggedError(\"UnhandledException\")() {\n constructor(args) {\n const message = args.cause instanceof Error ? `Unhandled exception: ${args.cause.message}` : `Unhandled exception: ${String(args.cause)}`;\n super({\n message,\n cause: args.cause\n });\n }\n};\nvar Panic = class extends TaggedError(\"Panic\")() {\n};\nvar ResultDeserializationError = class extends TaggedError(\"ResultDeserializationError\")() {\n constructor(args) {\n super({\n message: `Failed to deserialize value as Result: expected { status: \"ok\", value } or { status: \"error\", error }`,\n value: args.value\n });\n }\n};\nvar panic = (message, cause) => {\n throw new Panic({\n message,\n cause\n });\n};\nvar tryOrPanic = (fn, message) => {\n try {\n return fn();\n } catch (cause) {\n throw panic(message, cause);\n }\n};\nvar tryOrPanicAsync = async (fn, message) => {\n try {\n return await fn();\n } catch (cause) {\n throw panic(message, cause);\n }\n};\nvar Ok = class Ok2 {\n status = \"ok\";\n constructor(value) {\n this.value = value;\n }\n isOk() {\n return true;\n }\n isErr() {\n return false;\n }\n map(fn) {\n return tryOrPanic(() => new Ok2(fn(this.value)), \"map callback threw\");\n }\n mapError(_fn) {\n return this;\n }\n andThen(fn) {\n return tryOrPanic(() => fn(this.value), \"andThen callback threw\");\n }\n andThenAsync(fn) {\n return tryOrPanicAsync(() => fn(this.value), \"andThenAsync callback threw\");\n }\n match(handlers) {\n return tryOrPanic(() => handlers.ok(this.value), \"match ok handler threw\");\n }\n unwrap(_message) {\n return this.value;\n }\n unwrapOr(_fallback) {\n return this.value;\n }\n tap(fn) {\n return tryOrPanic(() => {\n fn(this.value);\n return this;\n }, \"tap callback threw\");\n }\n tapAsync(fn) {\n return tryOrPanicAsync(async () => {\n await fn(this.value);\n return this;\n }, \"tapAsync callback threw\");\n }\n *[Symbol.iterator]() {\n return this.value;\n }\n};\nvar Err = class Err2 {\n status = \"error\";\n constructor(error) {\n this.error = error;\n }\n isOk() {\n return false;\n }\n isErr() {\n return true;\n }\n map(_fn) {\n return this;\n }\n mapError(fn) {\n return tryOrPanic(() => new Err2(fn(this.error)), \"mapError callback threw\");\n }\n andThen(_fn) {\n return this;\n }\n andThenAsync(_fn) {\n return Promise.resolve(this);\n }\n match(handlers) {\n return tryOrPanic(() => handlers.err(this.error), \"match err handler threw\");\n }\n unwrap(message) {\n return panic(message ?? `Unwrap called on Err: ${String(this.error)}`, this.error);\n }\n unwrapOr(fallback) {\n return fallback;\n }\n tap(_fn) {\n return this;\n }\n tapAsync(_fn) {\n return Promise.resolve(this);\n }\n *[Symbol.iterator]() {\n yield this;\n return panic(\"Unreachable: Err yielded in Result.gen but generator continued\", this.error);\n }\n};\nfunction ok(value) {\n return new Ok(value);\n}\nvar isOk = (result) => {\n return result.status === \"ok\";\n};\nvar err = (error) => new Err(error);\nvar isError = (result) => {\n return result.status === \"error\";\n};\nvar tryFn = (options, config) => {\n const execute = () => {\n if (typeof options === \"function\")\n try {\n return ok(options());\n } catch (cause) {\n return err(new UnhandledException({ cause }));\n }\n try {\n return ok(options.try());\n } catch (originalCause) {\n try {\n return err(options.catch(originalCause));\n } catch (catchHandlerError) {\n throw panic(\"Result.try catch handler threw\", catchHandlerError);\n }\n }\n };\n const times = config?.retry?.times ?? 0;\n let result = execute();\n for (let retry = 0;retry < times && result.status === \"error\"; retry++)\n result = execute();\n return result;\n};\nvar tryPromise = async (options, config) => {\n const execute = async () => {\n if (typeof options === \"function\")\n try {\n return ok(await options());\n } catch (cause) {\n return err(new UnhandledException({ cause }));\n }\n try {\n return ok(await options.try());\n } catch (originalCause) {\n try {\n return err(await options.catch(originalCause));\n } catch (catchHandlerError) {\n throw panic(\"Result.tryPromise catch handler threw\", catchHandlerError);\n }\n }\n };\n const retry = config?.retry;\n if (!retry)\n return execute();\n const getDelay = (retryAttempt) => {\n switch (retry.backoff) {\n case \"constant\":\n return retry.delayMs;\n case \"linear\":\n return retry.delayMs * (retryAttempt + 1);\n case \"exponential\":\n return retry.delayMs * 2 ** retryAttempt;\n }\n };\n const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n let result = await execute();\n const shouldRetryFn = retry.shouldRetry ?? (() => true);\n for (let attempt = 0;attempt < retry.times; attempt++) {\n if (result.status !== \"error\")\n break;\n const error = result.error;\n if (!tryOrPanic(() => shouldRetryFn(error), \"shouldRetry predicate threw\"))\n break;\n await sleep(getDelay(attempt));\n result = await execute();\n }\n return result;\n};\nvar map = dual(2, (result, fn) => {\n return result.map(fn);\n});\nvar mapError = dual(2, (result, fn) => {\n return result.mapError(fn);\n});\nvar andThen = dual(2, (result, fn) => {\n return result.andThen(fn);\n});\nvar andThenAsync = dual(2, (result, fn) => {\n return result.andThenAsync(fn);\n});\nvar match = dual(2, (result, handlers) => {\n return result.match(handlers);\n});\nvar tap = dual(2, (result, fn) => {\n return result.tap(fn);\n});\nvar tapAsync = dual(2, (result, fn) => {\n return result.tapAsync(fn);\n});\nvar unwrap = (result, message) => {\n return result.unwrap(message);\n};\nfunction assertIsResult(value) {\n if (value !== null && typeof value === \"object\" && \"status\" in value && (value.status === \"ok\" || value.status === \"error\"))\n return;\n return panic(\"Result.gen body must return Result.ok() or Result.err(), got: \" + (value === null ? \"null\" : typeof value === \"object\" ? JSON.stringify(value) : String(value)));\n}\nvar unwrapOr = dual(2, (result, fallback) => {\n return result.unwrapOr(fallback);\n});\nvar gen = (body, thisArg) => {\n const iterator = body.call(thisArg);\n if (Symbol.asyncIterator in iterator)\n return (async () => {\n const asyncIter = iterator;\n let state$1;\n try {\n state$1 = await asyncIter.next();\n } catch (cause) {\n throw panic(\"generator body threw\", cause);\n }\n assertIsResult(state$1.value);\n if (!state$1.done)\n try {\n await asyncIter.return?.(undefined);\n } catch (cause) {\n throw panic(\"generator cleanup threw\", cause);\n }\n return state$1.value;\n })();\n const syncIter = iterator;\n let state;\n try {\n state = syncIter.next();\n } catch (cause) {\n throw panic(\"generator body threw\", cause);\n }\n assertIsResult(state.value);\n if (!state.done)\n try {\n syncIter.return?.(undefined);\n } catch (cause) {\n throw panic(\"generator cleanup threw\", cause);\n }\n return state.value;\n};\nasync function* resultAwait(promise) {\n return yield* await promise;\n}\nfunction isSerializedResult(obj) {\n return obj !== null && typeof obj === \"object\" && \"status\" in obj && (obj.status === \"ok\" && (\"value\" in obj) || obj.status === \"error\" && (\"error\" in obj));\n}\nvar serialize = (result) => {\n return result.status === \"ok\" ? {\n status: \"ok\",\n value: result.value\n } : {\n status: \"error\",\n error: result.error\n };\n};\nvar deserialize = (value) => {\n if (isSerializedResult(value))\n return value.status === \"ok\" ? new Ok(value.value) : new Err(value.error);\n return err(new ResultDeserializationError({ value }));\n};\nvar hydrate = (value) => {\n return deserialize(value);\n};\nvar partition = (results) => {\n const oks = [];\n const errs = [];\n for (const r of results)\n if (r.status === \"ok\")\n oks.push(r.value);\n else\n errs.push(r.error);\n return [oks, errs];\n};\nvar flatten = (result) => {\n if (result.status === \"ok\")\n return result.value;\n return result;\n};\nvar Result = {\n ok,\n isOk,\n err,\n isError,\n try: tryFn,\n tryPromise,\n map,\n mapError,\n andThen,\n andThenAsync,\n match,\n tap,\n tapAsync,\n unwrap,\n unwrapOr,\n gen,\n await: resultAwait,\n serialize,\n deserialize,\n hydrate,\n partition,\n flatten\n};\n\n// src/utils/metadata.ts\nimport { resolve } from \"path\";\nimport { readFile } from \"fs/promises\";\nimport { pathToFileURL } from \"url\";\nclass PackageJsonReadError extends TaggedError(\"PackageJsonReadError\")() {\n}\n\nclass LoadGeneratedMetadataError extends TaggedError(\"LoadGeneratedMetadataError\")() {\n}\nfunction stripScope(name) {\n const idx = name.lastIndexOf(\"/\");\n return idx >= 0 ? name.slice(idx + 1) : name;\n}\nasync function resolveCliInfo(options = {}) {\n if (options.commandName && options.executable) {\n return { commandName: options.commandName, executable: options.executable };\n }\n const packageJsonResult = await readProjectPackageJson();\n const pkg = Result.isOk(packageJsonResult) ? packageJsonResult.value : null;\n const pkgName = typeof pkg?.name === \"string\" ? pkg.name : undefined;\n const pkgNameStripped = pkgName ? stripScope(pkgName) : undefined;\n let inferredCommandName;\n const bin = pkg?.bin;\n if (typeof bin === \"string\") {\n inferredCommandName = pkgNameStripped;\n } else if (bin && typeof bin === \"object\") {\n const keys = Object.keys(bin);\n if (pkgNameStripped && keys.includes(pkgNameStripped))\n inferredCommandName = pkgNameStripped;\n else\n inferredCommandName = keys[0];\n if (inferredCommandName)\n inferredCommandName = stripScope(inferredCommandName);\n } else {\n inferredCommandName = pkgNameStripped;\n }\n const commandName = options.commandName ?? inferredCommandName ?? \"cli\";\n const executable = options.executable ?? commandName;\n return { commandName, executable };\n}\nasync function loadGeneratedMetadata(options = {}) {\n const generatedPath = options.generatedPath ?? \".bunli/commands.gen.ts\";\n const absolute = resolve(process.cwd(), generatedPath);\n const url = pathToFileURL(absolute).href;\n return await Result.tryPromise({\n try: async () => {\n const mod = await import(url);\n const list = mod.generated?.list?.() ?? [];\n return { commands: list.map((i) => i.metadata) };\n },\n catch: (cause) => new LoadGeneratedMetadataError({\n generatedPath,\n message: `Could not load command metadata from ${generatedPath}. Make sure it exists (run \"bunli generate\").`,\n cause\n })\n });\n}\nasync function readProjectPackageJson() {\n return Result.tryPromise({\n try: async () => {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n const pkgContent = await readFile(pkgPath, \"utf-8\");\n const parsed = JSON.parse(pkgContent);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"package.json must be a JSON object\");\n }\n return parsed;\n },\n catch: (cause) => new PackageJsonReadError({\n message: \"Could not read project package.json\",\n cause\n })\n });\n}\n\n// src/tab/registry.ts\nimport { GLOBAL_FLAGS } from \"@bunli/core\";\nfunction canonicalCommandPath(name) {\n return name.replace(/\\s+/g, \"/\").replace(/\\/+/g, \"/\").replace(/^\\/+|\\/+$/g, \"\").trim();\n}\nfunction resolveNestedCommandName(parentPath, rawName) {\n const child = canonicalCommandPath(rawName);\n if (!child)\n return parentPath ?? \"\";\n if (!parentPath)\n return child;\n if (!child.includes(\"/\")) {\n return `${parentPath}/${child}`;\n }\n if (child === parentPath || child.startsWith(`${parentPath}/`)) {\n return child;\n }\n return child;\n}\nfunction flattenCommandTree(commands) {\n const flattened = [];\n const walk = (meta, parentPath) => {\n const resolvedName = resolveNestedCommandName(parentPath, meta.name);\n if (!resolvedName)\n return;\n flattened.push({\n ...meta,\n name: resolvedName\n });\n for (const nested of meta.commands ?? []) {\n walk(nested, resolvedName);\n }\n };\n for (const meta of commands) {\n walk(meta);\n }\n return flattened;\n}\nfunction normalizeCommandPath(name) {\n return name.replace(/\\//g, \" \").trim();\n}\nfunction isBooleanOption(meta) {\n const t2 = meta.type.toLowerCase();\n return t2.includes(\"boolean\") || t2.includes(\"bool\");\n}\nfunction addGlobalFlags(cmd) {\n for (const [name, flag] of Object.entries(GLOBAL_FLAGS)) {\n const desc = flag.description ?? \"\";\n const short = \"short\" in flag ? flag.short : undefined;\n const handler = createGlobalFlagHandler(name);\n if (handler) {\n if (short)\n cmd.option(name, desc, handler, short);\n else\n cmd.option(name, desc, handler);\n continue;\n }\n if (short)\n cmd.option(name, desc, short);\n else\n cmd.option(name, desc);\n }\n}\nfunction createGlobalFlagHandler(name) {\n const enumValues = name === \"format\" ? [\"json\", \"yaml\", \"md\", \"toon\"] : name === \"image-mode\" ? [\"off\", \"auto\", \"on\"] : undefined;\n if (!enumValues)\n return;\n return (complete) => {\n for (const value of enumValues)\n complete(value, \"\");\n };\n}\nfunction addOption(cmd, name, meta) {\n const desc = meta.description ?? \"\";\n const short = meta.short;\n if (isBooleanOption(meta)) {\n if (short)\n cmd.option(name, desc, short);\n else\n cmd.option(name, desc);\n return;\n }\n const enumValues = meta.enumValues;\n const literalValue = meta.literalValue;\n const handler = (complete) => {\n if (enumValues && enumValues.length > 0) {\n for (const v of enumValues)\n complete(String(v), \"\");\n return;\n }\n if (literalValue !== undefined) {\n complete(String(literalValue), \"\");\n }\n };\n if (short)\n cmd.option(name, desc, handler, short);\n else\n cmd.option(name, desc, handler);\n}\nfunction addCommandOptions(cmd, meta) {\n for (const [name, opt] of Object.entries(meta.options ?? {})) {\n addOption(cmd, name, opt);\n }\n}\nfunction expandAliases(meta, opts) {\n const primary = normalizeCommandPath(meta.name);\n if (!opts.includeAliases || !meta.alias)\n return [primary];\n const aliases = Array.isArray(meta.alias) ? meta.alias : [meta.alias];\n const parts = primary.split(\" \").filter(Boolean);\n const parent = parts.slice(0, -1);\n const expanded = [primary];\n for (const a of aliases) {\n const aliasRaw = String(a).trim();\n if (!aliasRaw)\n continue;\n if (aliasRaw.includes(\"/\") || aliasRaw.includes(\" \")) {\n expanded.push(normalizeCommandPath(aliasRaw));\n continue;\n }\n expanded.push([...parent, aliasRaw].join(\" \").trim());\n }\n return expanded;\n}\nfunction buildRegistry(commands, options = {}) {\n const opts = {\n includeAliases: options.includeAliases ?? true,\n includeGlobalFlags: options.includeGlobalFlags ?? true\n };\n const root = new RootCommand;\n const flattenedCommands = flattenCommandTree(commands);\n const metaByPath = new Map;\n const allPaths = new Set;\n for (const meta of flattenedCommands) {\n for (const path of expandAliases(meta, opts)) {\n metaByPath.set(path, meta);\n const parts = path.split(\" \").filter(Boolean);\n for (let i = 1;i <= parts.length; i += 1) {\n allPaths.add(parts.slice(0, i).join(\" \"));\n }\n }\n }\n const sortedPaths = Array.from(allPaths).sort((a, b) => {\n const al = a.split(\" \").length;\n const bl = b.split(\" \").length;\n if (al !== bl)\n return al - bl;\n return a.localeCompare(b);\n });\n const tabCommands = new Map;\n for (const path of sortedPaths) {\n const meta = metaByPath.get(path);\n const desc = meta?.description ?? \"\";\n const cmd = root.command(path, desc);\n tabCommands.set(path, cmd);\n if (opts.includeGlobalFlags)\n addGlobalFlags(cmd);\n if (meta)\n addCommandOptions(cmd, meta);\n }\n if (opts.includeGlobalFlags)\n addGlobalFlags(root);\n return root;\n}\n\n// src/commands/completions.ts\nvar SHELLS = [\"bash\", \"zsh\", \"fish\", \"powershell\"];\nfunction isShell(value) {\n return SHELLS.includes(value);\n}\n\nclass CompletionProtocolError extends TaggedError(\"CompletionProtocolError\")() {\n}\nfunction completionsCommand(pluginOptions) {\n return defineCommand({\n name: \"completions\",\n alias: [\"complete\"],\n description: \"Generate shell completion scripts and handle completion protocol callbacks\",\n handler: async ({ runtime, colors }) => {\n const argv = runtime.args;\n const invokedCommand = runtime.command.split(/\\s+/).at(-1) ?? \"completions\";\n const isProtocolCommand = invokedCommand === \"complete\";\n if (!isProtocolCommand) {\n const first = argv[0];\n if (argv.length === 1 && typeof first === \"string\" && isShell(first)) {\n const shell = first;\n const { commandName, executable } = await resolveCliInfo(pluginOptions);\n const root = new RootCommand;\n root.setup(commandName, executable, shell);\n return;\n }\n console.error(colors.red(\"Missing or invalid shell name for completions script generation.\"));\n console.error(colors.dim(\"Usage: <cli> completions <bash|zsh|fish|powershell>\"));\n console.error(colors.dim(\"Protocol callback form: <cli> complete -- <args...>\"));\n return;\n }\n const metadataResult = await loadGeneratedMetadata(pluginOptions);\n if (Result.isError(metadataResult)) {\n console.log(\":1\");\n if (process.env.BUNLI_DEBUG_COMPLETIONS) {\n console.error(colors.red(metadataResult.error.message));\n }\n return;\n }\n const parseResult = Result.try({\n try: () => {\n const root = buildRegistry(metadataResult.value.commands, {\n includeAliases: pluginOptions.includeAliases,\n includeGlobalFlags: pluginOptions.includeGlobalFlags\n });\n root.parse(argv);\n },\n catch: (cause) => new CompletionProtocolError({\n message: \"Completion registry failed to parse protocol arguments.\",\n cause\n })\n });\n if (Result.isError(parseResult)) {\n console.log(\":1\");\n if (process.env.BUNLI_DEBUG_COMPLETIONS) {\n console.error(colors.red(parseResult.error.message));\n }\n }\n }\n });\n}\n\n// src/plugin.ts\nvar completionsPlugin = createPlugin((options = {}) => ({\n name: \"completions\",\n setup(context) {\n const command = completionsCommand(options);\n context.registerCommand(command);\n }\n}));\nexport {\n completionsPlugin\n};\n",
9
8
  "/**\n * Config merger plugin for Bunli\n * Loads configuration from multiple sources and merges them\n */\n\nimport { readFile, access } from 'fs/promises'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { Result, TaggedError } from 'better-result'\nimport { createPlugin } from '@bunli/core/plugin'\nimport { deepMerge } from '@bunli/core/utils'\nimport type { BunliPlugin } from '@bunli/core/plugin'\n\nexport interface ConfigPluginOptions {\n /**\n * Config file sources to load\n * Supports template variables: {{name}} for app name\n * Default: ['~/.config/{{name}}/config.json', '.{{name}}rc', '.{{name}}rc.json']\n */\n sources?: string[]\n \n /**\n * Merge strategy\n * - 'deep': Recursively merge objects (default)\n * - 'shallow': Only merge top-level properties\n */\n mergeStrategy?: 'shallow' | 'deep'\n \n /**\n * Whether to stop on first found config\n * Default: false (loads and merges all found configs)\n */\n stopOnFirst?: boolean\n}\n\nclass ConfigFileNotFoundError extends TaggedError('ConfigFileNotFoundError')<{\n path: string\n message: string\n cause: unknown\n}>() {}\n\nclass ConfigFileReadError extends TaggedError('ConfigFileReadError')<{\n path: string\n message: string\n cause: unknown\n}>() {}\n\nclass ConfigFileParseError extends TaggedError('ConfigFileParseError')<{\n path: string\n message: string\n cause: unknown\n}>() {}\n\ntype ReadConfigError =\n | ConfigFileNotFoundError\n | ConfigFileReadError\n | ConfigFileParseError\n\n/**\n * Config merger plugin factory\n */\nexport const configMergerPlugin = createPlugin<ConfigPluginOptions, {}>((options = {}) => {\n const sources = options.sources || [\n '~/.config/{{name}}/config.json',\n '.{{name}}rc',\n '.{{name}}rc.json',\n '.config/{{name}}.json'\n ]\n \n return {\n name: '@bunli/plugin-config',\n version: '1.0.0',\n \n async setup(context) {\n const appName = context.config.name || 'bunli'\n const configs: Array<Record<string, unknown>> = []\n \n for (const source of sources) {\n // Resolve template variables and home directory\n const configPath = source\n .replace(/^~/, homedir())\n .replace(/\\{\\{name\\}\\}/g, appName)\n\n const loadedConfig = await readConfigSource(configPath)\n if (Result.isError(loadedConfig)) {\n if (ConfigFileNotFoundError.is(loadedConfig.error)) {\n context.logger.debug(`Config file not found: ${configPath}`)\n continue\n }\n\n if (ConfigFileParseError.is(loadedConfig.error)) {\n context.logger.warn(`Failed to parse config file ${configPath}: ${loadedConfig.error.message}`)\n continue\n }\n\n context.logger.warn(`Failed to load config file ${configPath}: ${loadedConfig.error.message}`)\n continue\n }\n\n configs.push(loadedConfig.value)\n context.logger.debug(`Loaded config from ${configPath}`)\n\n // Stop if requested\n if (options.stopOnFirst) {\n break\n }\n }\n \n if (configs.length > 0) {\n // Merge all found configs\n let merged: Record<string, unknown>\n \n if (options.mergeStrategy === 'shallow') {\n merged = Object.assign({}, ...configs) as Record<string, unknown>\n } else {\n // Deep merge is already available\n merged = deepMerge(...configs) as Record<string, unknown>\n }\n \n context.updateConfig(merged)\n context.logger.info(`Merged ${configs.length} config file(s)`)\n }\n }\n }\n})\n\n// Default export for convenience\nexport default configMergerPlugin\n\nasync function readConfigSource(path: string): Promise<Result<Record<string, unknown>, ReadConfigError>> {\n const existsResult = await Result.tryPromise({\n try: async () => {\n await access(path)\n },\n catch: (cause) =>\n new ConfigFileNotFoundError({\n path,\n message: `Config file not found: ${path}`,\n cause\n })\n })\n if (Result.isError(existsResult)) {\n return existsResult\n }\n\n const readResult = await Result.tryPromise({\n try: async () => await readFile(path, 'utf-8'),\n catch: (cause) =>\n new ConfigFileReadError({\n path,\n message: `Unable to read config file: ${path}`,\n cause\n })\n })\n if (Result.isError(readResult)) {\n return readResult\n }\n\n return Result.try({\n try: () => {\n const parsed = JSON.parse(readResult.value)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Config file must contain a JSON object')\n }\n return parsed as Record<string, unknown>\n },\n catch: (cause) =>\n new ConfigFileParseError({\n path,\n message: `Invalid JSON in config file: ${path}`,\n cause\n })\n })\n}\n",
10
9
  "import { createPlugin } from '@bunli/core/plugin'\nimport type { PluginContext } from '@bunli/core/plugin'\nimport { defineCommand, defineGroup } from '@bunli/core'\nimport { z } from 'zod'\nimport type { Agent } from './agents.js'\n\nexport interface SkillsPluginOptions {\n /** CLI description for the generated skill. */\n description?: string\n /** Additional agents to register beyond the built-in list. */\n agents?: Agent[]\n}\n\nexport const skillsPlugin = createPlugin<SkillsPluginOptions>(\n (options = {}) => ({\n name: 'skills',\n\n setup(context: PluginContext) {\n const skillsGroup = defineGroup({\n name: 'skills',\n description: 'Manage agent skill files',\n commands: [\n defineCommand({\n name: 'sync',\n description: 'Generate and install skill files for detected agents',\n options: {\n global: {\n schema: z.boolean().default(true),\n description: 'Install globally (default) or project-local',\n argumentKind: 'flag'\n },\n force: {\n schema: z.boolean().default(false),\n short: 'f',\n description: 'Force regeneration even if up to date',\n argumentKind: 'flag'\n }\n },\n async handler({ flags, colors, output }) {\n const typedFlags = flags as { global: boolean; force: boolean }\n\n // Dynamically import to avoid loading fs at plugin registration time\n const { syncSkills } = await import('./sync.js')\n const { detectAgents, builtinAgents } = await import('./agents.js')\n\n const allAgents = options.agents\n ? [...builtinAgents, ...options.agents]\n : builtinAgents\n\n const detected = detectAgents(allAgents)\n\n // Access commands from the CLI — we get them via the plugin context store\n const commands = context.store.get('_skillsCommands') as Map<string, any> | undefined\n if (!commands || commands.size === 0) {\n console.log(colors.yellow('No commands registered. Nothing to sync.'))\n return\n }\n\n const cliName = context.store.get('_skillsCliName') as string || 'cli'\n\n const result = await syncSkills(cliName, commands, {\n global: typedFlags.global,\n force: typedFlags.force,\n description: options.description,\n agents: detected\n })\n\n if (!result.updated && !typedFlags.force) {\n console.log(colors.dim('Skills are up to date.'))\n output({ updated: false, agents: detected.map((a) => a.name) })\n return\n }\n\n console.log(colors.green(`Synced skills to ${result.paths.length} location(s)`))\n for (const install of result.agents) {\n console.log(colors.dim(` ${install.agent}: ${install.mode} → ${install.path}`))\n }\n\n output({\n updated: true,\n paths: result.paths,\n agents: result.agents.map((a) => ({\n agent: a.agent,\n path: a.path,\n mode: a.mode\n }))\n })\n }\n }),\n\n defineCommand({\n name: 'list',\n description: 'List detected agents on this system',\n async handler({ colors, output }) {\n const { detectAgents, builtinAgents } = await import('./agents.js')\n\n const allAgents = options.agents\n ? [...builtinAgents, ...options.agents]\n : builtinAgents\n\n const detected = detectAgents(allAgents)\n\n if (detected.length === 0) {\n console.log(colors.dim('No agents detected.'))\n output({ agents: [] })\n return\n }\n\n console.log(`Detected ${detected.length} agent(s):\\n`)\n for (const agent of detected) {\n const tag = agent.universal ? colors.dim(' (universal)') : ''\n console.log(` ${colors.bold(agent.name)}${tag}`)\n console.log(colors.dim(` ${agent.projectSkillsDir}`))\n }\n\n output({\n agents: detected.map((a) => ({\n name: a.name,\n universal: a.universal,\n projectSkillsDir: a.projectSkillsDir,\n globalSkillsDir: a.globalSkillsDir\n }))\n })\n }\n })\n ]\n })\n\n context.registerCommand(skillsGroup)\n }\n })\n)\n",
11
10
  "import { defineConfig } from \"@bunli/core\";\n\nimport packageJson from \"./package.json\";\n\nexport const bunliConfig = defineConfig({\n\tname: packageJson.name,\n\tversion: packageJson.version,\n\tdescription: packageJson.description,\n\tcommands: {\n\t\tentry: \"./src/cli.ts\",\n\t\tdirectory: \"./src/commands\",\n\t\tgenerateReport: true,\n\t},\n\tbuild: {\n\t\tentry: \"./src/cli.ts\",\n\t\toutdir: \"./dist-bunli\",\n\t\tsourcemap: true,\n\t},\n\ttest: {\n\t\tpattern: [\"tests/*.test.ts\"],\n\t\tcoverage: false,\n\t\twatch: false,\n\t},\n\ttui: {\n\t\trenderer: {\n\t\t\tbufferMode: \"alternate\",\n\t\t},\n\t},\n});\n\nexport default bunliConfig;\n",
12
- "import path from 'node:path'\nimport {\n ADD_OPTION_METADATA,\n collectOptionNamesByType,\n CREATE_OPTION_METADATA,\n GLOBAL_OPTION_METADATA,\n MIGRATE_OPTION_METADATA,\n TEMPLATES_OPTION_METADATA,\n} from './command-option-metadata'\n\nexport const WP_TYPIA_CANONICAL_CREATE_USAGE = 'wp-typia create <project-dir>';\nexport const WP_TYPIA_POSITIONAL_ALIAS_USAGE = 'wp-typia <project-dir>';\nexport const WP_TYPIA_CANONICAL_MIGRATE_USAGE = 'wp-typia migrate <subcommand>';\nexport const WP_TYPIA_DEPRECATED_MIGRATIONS_USAGE =\n 'wp-typia migrations <subcommand>';\nexport const WP_TYPIA_BUNLI_MIGRATION_DOC =\n 'https://imjlk.github.io/wp-typia/maintainers/bunli-cli-migration/';\n\nexport const WP_TYPIA_RESERVED_TOP_LEVEL_COMMAND_NAMES = [\n 'create',\n 'sync',\n 'add',\n 'migrate',\n 'templates',\n 'doctor',\n 'mcp',\n 'help',\n 'version',\n 'skills',\n 'completions',\n 'complete',\n] as const;\n\nexport const WP_TYPIA_TOP_LEVEL_COMMAND_NAMES = [\n 'create',\n 'sync',\n 'add',\n 'migrate',\n 'templates',\n 'doctor',\n 'mcp',\n] as const;\n\nconst STRING_OPTION_NAMES_BY_COMMAND = {\n add: new Set(collectOptionNamesByType(ADD_OPTION_METADATA, 'string')),\n create: new Set(collectOptionNamesByType(CREATE_OPTION_METADATA, 'string')),\n migrate: new Set(collectOptionNamesByType(MIGRATE_OPTION_METADATA, 'string')),\n templates: new Set(collectOptionNamesByType(TEMPLATES_OPTION_METADATA, 'string')),\n} as const;\n\nconst GLOBAL_STRING_OPTION_NAMES = new Set(\n collectOptionNamesByType(GLOBAL_OPTION_METADATA, 'string'),\n);\n\nconst SHORT_OPTION_NAMES_WITH_VALUES = new Set<string>(\n Object.values({\n ...ADD_OPTION_METADATA,\n ...GLOBAL_OPTION_METADATA,\n ...CREATE_OPTION_METADATA,\n ...MIGRATE_OPTION_METADATA,\n ...TEMPLATES_OPTION_METADATA,\n })\n .filter((option) => option.type === 'string')\n .flatMap((option) =>\n 'short' in option && typeof option.short === 'string' ? [option.short] : [],\n ),\n);\n\nfunction isLongOptionValueConsumer(optionName: string): boolean {\n if (GLOBAL_STRING_OPTION_NAMES.has(optionName)) {\n return true;\n }\n\n return Object.values(STRING_OPTION_NAMES_BY_COMMAND).some((optionNames) =>\n optionNames.has(optionName as never),\n );\n}\n\nfunction findFirstPositionalIndex(argv: string[]): number {\n const positionalIndexes = collectPositionalIndexes(argv);\n return positionalIndexes[0] ?? -1;\n}\n\nfunction collectPositionalIndexes(argv: string[]): number[] {\n const positionalIndexes: number[] = [];\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--') {\n for (let restIndex = index + 1; restIndex < argv.length; restIndex += 1) {\n positionalIndexes.push(restIndex);\n }\n break;\n }\n if (!arg.startsWith('-') || arg === '-') {\n positionalIndexes.push(index);\n continue;\n }\n if (arg.startsWith('--')) {\n if (arg.includes('=')) {\n continue;\n }\n if (isLongOptionValueConsumer(arg.slice(2))) {\n index += 1;\n }\n continue;\n }\n if (arg.length === 2 && SHORT_OPTION_NAMES_WITH_VALUES.has(arg.slice(1))) {\n index += 1;\n }\n }\n\n return positionalIndexes;\n}\n\nexport const WP_TYPIA_FUTURE_COMMAND_TREE = [\n {\n description: 'Scaffold a new wp-typia project.',\n name: 'create',\n },\n {\n description: 'Run the common generated-project sync workflow.',\n name: 'sync',\n },\n {\n description: 'Extend an official wp-typia workspace.',\n name: 'add',\n subcommands: [\n 'block',\n 'variation',\n 'pattern',\n 'binding-source',\n 'rest-resource',\n 'editor-plugin',\n 'hooked-block',\n ],\n },\n {\n description: 'Run migration workflows.',\n name: 'migrate',\n subcommands: [\n 'init',\n 'snapshot',\n 'diff',\n 'scaffold',\n 'plan',\n 'wizard',\n 'verify',\n 'doctor',\n 'fixtures',\n 'fuzz',\n ],\n },\n {\n description: 'Inspect scaffold templates.',\n name: 'templates',\n subcommands: ['list', 'inspect'],\n },\n {\n description: 'Run repository and project diagnostics.',\n name: 'doctor',\n },\n {\n description: 'Inspect or sync schema-driven MCP metadata.',\n name: 'mcp',\n subcommands: ['list', 'sync'],\n },\n] as const;\n\nexport function isReservedTopLevelCommandName(value: string): boolean {\n return WP_TYPIA_RESERVED_TOP_LEVEL_COMMAND_NAMES.includes(\n value as (typeof WP_TYPIA_RESERVED_TOP_LEVEL_COMMAND_NAMES)[number],\n );\n}\n\nfunction assertStringOptionValues(argv: string[]): void {\n const firstPositionalIndex = findFirstPositionalIndex(argv);\n if (firstPositionalIndex === -1) {\n return;\n }\n\n const commandName = argv[\n firstPositionalIndex\n ] as keyof typeof STRING_OPTION_NAMES_BY_COMMAND;\n const stringOptionNames = new Set<string>(GLOBAL_STRING_OPTION_NAMES);\n for (const optionName of STRING_OPTION_NAMES_BY_COMMAND[commandName] ?? []) {\n stringOptionNames.add(optionName);\n }\n\n for (let index = firstPositionalIndex + 1; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--') {\n break;\n }\n if (arg.length === 2 && arg.startsWith('-')) {\n if (SHORT_OPTION_NAMES_WITH_VALUES.has(arg.slice(1))) {\n const next = argv[index + 1];\n if (!next || next.startsWith('-')) {\n throw new Error(`\\`${arg}\\` requires a value.`);\n }\n index += 1;\n }\n continue;\n }\n if (!arg.startsWith('--')) {\n continue;\n }\n\n const [rawName, inlineValue] = arg.slice(2).split('=', 2);\n if (!stringOptionNames.has(rawName)) {\n continue;\n }\n\n if (arg.includes('=')) {\n if (!inlineValue) {\n throw new Error(`\\`--${rawName}\\` requires a value.`);\n }\n continue;\n }\n\n const next = argv[index + 1];\n if (!next || next.startsWith('-')) {\n throw new Error(`\\`--${rawName}\\` requires a value.`);\n }\n index += 1;\n }\n}\n\nfunction isWindowsDrivePath(value: string): boolean {\n return /^[A-Za-z]:([\\\\/]|$)/.test(value);\n}\n\nfunction looksLikeStructuredProjectInput(value: string): boolean {\n if (value.includes('#')) {\n return true;\n }\n\n if (!isWindowsDrivePath(value) && /^[A-Za-z][A-Za-z0-9+.-]*:/u.test(value)) {\n return true;\n }\n\n return value.startsWith('@') && value.includes('/');\n}\n\nfunction assertPositionalAliasProjectDir(projectDir: string): void {\n const normalizedProjectDir =\n path.normalize(projectDir).replace(/[\\\\/]+$/u, '') || path.normalize(projectDir);\n if (normalizedProjectDir === '.' || normalizedProjectDir === '..') {\n throw new Error(\n `The positional alias does not scaffold into \\`${projectDir}\\`. Use \\`${WP_TYPIA_CANONICAL_CREATE_USAGE}\\` with an explicit child directory instead.`,\n );\n }\n\n if (looksLikeStructuredProjectInput(projectDir)) {\n throw new Error(\n `The positional alias only accepts unambiguous local project directories. Use \\`${WP_TYPIA_CANONICAL_CREATE_USAGE}\\` for \\`${projectDir}\\`.`,\n );\n }\n}\n\nexport function normalizeWpTypiaArgv(argv: string[]): string[] {\n const positionalIndexes = collectPositionalIndexes(argv);\n const firstPositionalIndex = positionalIndexes[0] ?? -1;\n if (firstPositionalIndex === -1) {\n return argv;\n }\n\n const firstPositional = argv[firstPositionalIndex];\n if (!firstPositional) {\n return argv;\n }\n\n if (firstPositional === 'migrations') {\n throw new Error(\n '`wp-typia migrations` was removed in favor of `wp-typia migrate`. Use `wp-typia migrate <subcommand>` instead.',\n );\n }\n\n if (isReservedTopLevelCommandName(firstPositional)) {\n assertStringOptionValues(argv);\n return argv;\n }\n\n if (positionalIndexes.length > 1) {\n const extraPositionals = positionalIndexes\n .slice(1)\n .map((index) => argv[index])\n .filter(\n (value): value is string =>\n typeof value === 'string' && value.length > 0,\n );\n\n throw new Error(\n `The positional alias only accepts a single project directory. Use \\`${WP_TYPIA_CANONICAL_CREATE_USAGE}\\` for scaffold invocations with additional positional arguments, or check the command spelling if you meant another top-level command. Extra positional arguments: ${extraPositionals.map((value) => `\\`${value}\\``).join(', ')}.`,\n );\n }\n\n assertPositionalAliasProjectDir(firstPositional);\n\n const normalizedArgv = [\n ...argv.slice(0, firstPositionalIndex),\n 'create',\n ...argv.slice(firstPositionalIndex),\n ];\n assertStringOptionValues(normalizedArgv);\n return normalizedArgv;\n}\n",
13
- "import { z } from \"zod\";\n\nexport type CommandOptionMetadata = {\n\targumentKind?: \"flag\";\n\tdescription: string;\n\tshort?: string;\n\ttype: \"boolean\" | \"string\";\n};\n\ntype CommandOptionMetadataMap = Record<string, CommandOptionMetadata>;\n\n/**\n * Shared `wp-typia create` option metadata used by both the Bunli command\n * definitions and the Node fallback parser/help surface.\n */\nexport const CREATE_OPTION_METADATA = {\n\t\"alternate-render-targets\": {\n\t\tdescription:\n\t\t\t\"Comma-separated alternate render targets for dynamic block scaffolds (email,mjml,plain-text).\",\n\t\ttype: \"string\",\n\t},\n\t\"data-storage\": {\n\t\tdescription: \"Persistence storage mode for persistence-capable templates.\",\n\t\ttype: \"string\",\n\t},\n\t\"dry-run\": {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Preview scaffold output without writing files to the target directory.\",\n\t\ttype: \"boolean\",\n\t},\n\t\"external-layer-id\": {\n\t\tdescription: \"Explicit layer id when an external layer package exposes multiple selectable layers.\",\n\t\ttype: \"string\",\n\t},\n\t\"external-layer-source\": {\n\t\tdescription: \"Local path, GitHub locator, or npm package that exposes wp-typia.layers.json for built-in templates.\",\n\t\ttype: \"string\",\n\t},\n\t\"inner-blocks-preset\": {\n\t\tdescription:\n\t\t\t\"Compound-only InnerBlocks preset (freeform, ordered, horizontal, locked-structure).\",\n\t\ttype: \"string\",\n\t},\n\tnamespace: {\n\t\tdescription: \"Override the default block namespace.\",\n\t\ttype: \"string\",\n\t},\n\t\"no-install\": {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Skip dependency installation after scaffold.\",\n\t\ttype: \"boolean\",\n\t},\n\t\"package-manager\": {\n\t\tdescription: \"Package manager to use for install and scripts.\",\n\t\tshort: \"p\",\n\t\ttype: \"string\",\n\t},\n\t\"persistence-policy\": {\n\t\tdescription: \"Authenticated or public write policy for persistence-capable templates.\",\n\t\ttype: \"string\",\n\t},\n\t\"php-prefix\": {\n\t\tdescription: \"Custom PHP symbol prefix.\",\n\t\ttype: \"string\",\n\t},\n\t\"query-post-type\": {\n\t\tdescription: \"Default post type assigned to Query Loop variation scaffolds.\",\n\t\ttype: \"string\",\n\t},\n\ttemplate: {\n\t\tdescription: \"Template id or external template package.\",\n\t\tshort: \"t\",\n\t\ttype: \"string\",\n\t},\n\t\"text-domain\": {\n\t\tdescription: \"Custom text domain for the generated project.\",\n\t\ttype: \"string\",\n\t},\n\tvariant: {\n\t\tdescription: \"Optional template variant identifier.\",\n\t\ttype: \"string\",\n\t},\n\t\"with-migration-ui\": {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Enable migration UI support when the template supports it.\",\n\t\ttype: \"boolean\",\n\t},\n\t\"with-test-preset\": {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Include the Playwright smoke-test preset.\",\n\t\ttype: \"boolean\",\n\t},\n\t\"with-wp-env\": {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Include a local wp-env preset.\",\n\t\ttype: \"boolean\",\n\t},\n\tyes: {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Accept defaults without prompt fallbacks.\",\n\t\tshort: \"y\",\n\t\ttype: \"boolean\",\n\t},\n} as const satisfies CommandOptionMetadataMap;\n\n/**\n * Shared `wp-typia add` option metadata used by both runtime entry paths.\n */\nexport const ADD_OPTION_METADATA = {\n\t\"alternate-render-targets\": {\n\t\tdescription:\n\t\t\t\"Comma-separated alternate render targets for dynamic block scaffolds (email,mjml,plain-text).\",\n\t\ttype: \"string\",\n\t},\n\tanchor: {\n\t\tdescription: \"Anchor block name for hooked-block workflows.\",\n\t\ttype: \"string\",\n\t},\n\tblock: {\n\t\tdescription: \"Target block slug for variation workflows.\",\n\t\ttype: \"string\",\n\t},\n\t\"data-storage\": {\n\t\tdescription: \"Persistence storage mode for persistence-capable templates.\",\n\t\ttype: \"string\",\n\t},\n\t\"dry-run\": {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Preview workspace file updates without writing them.\",\n\t\ttype: \"boolean\",\n\t},\n\t\"external-layer-id\": {\n\t\tdescription: \"Explicit layer id when an external layer package exposes multiple selectable layers.\",\n\t\ttype: \"string\",\n\t},\n\t\"external-layer-source\": {\n\t\tdescription: \"Local path, GitHub locator, or npm package that exposes wp-typia.layers.json for built-in block templates.\",\n\t\ttype: \"string\",\n\t},\n\t\"inner-blocks-preset\": {\n\t\tdescription:\n\t\t\t\"Compound-only InnerBlocks preset (freeform, ordered, horizontal, locked-structure).\",\n\t\ttype: \"string\",\n\t},\n\tmethods: {\n\t\tdescription: \"Comma-separated REST resource methods for rest-resource workflows.\",\n\t\ttype: \"string\",\n\t},\n\tnamespace: {\n\t\tdescription: \"REST namespace for rest-resource workflows.\",\n\t\ttype: \"string\",\n\t},\n\t\"persistence-policy\": {\n\t\tdescription: \"Persistence write policy for persistence-capable templates.\",\n\t\ttype: \"string\",\n\t},\n\tposition: {\n\t\tdescription: \"Hook position for hooked-block workflows.\",\n\t\ttype: \"string\",\n\t},\n\tslot: {\n\t\tdescription: \"Document editor shell slot for editor-plugin workflows.\",\n\t\ttype: \"string\",\n\t},\n\ttemplate: {\n\t\tdescription: \"Built-in block family for the new block.\",\n\t\ttype: \"string\",\n\t},\n} as const satisfies CommandOptionMetadataMap;\n\n/**\n * Shared `wp-typia migrate` option metadata used by both runtime entry paths.\n */\nexport const MIGRATE_OPTION_METADATA = {\n\tall: {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Run across every configured migration version and block target.\",\n\t\ttype: \"boolean\",\n\t},\n\t\"current-migration-version\": {\n\t\tdescription: \"Current migration version label for `migrate init`.\",\n\t\ttype: \"string\",\n\t},\n\tforce: {\n\t\targumentKind: \"flag\",\n\t\tdescription: \"Force overwrite behavior where supported.\",\n\t\ttype: \"boolean\",\n\t},\n\t\"from-migration-version\": {\n\t\tdescription: \"Source migration version label.\",\n\t\ttype: \"string\",\n\t},\n\titerations: {\n\t\tdescription: \"Iteration count for `migrate fuzz`.\",\n\t\ttype: \"string\",\n\t},\n\t\"migration-version\": {\n\t\tdescription: \"Version label to capture with `migrate snapshot`.\",\n\t\ttype: \"string\",\n\t},\n\tseed: {\n\t\tdescription: \"Deterministic fuzz seed.\",\n\t\ttype: \"string\",\n\t},\n\t\"to-migration-version\": {\n\t\tdescription: \"Target migration version label.\",\n\t\ttype: \"string\",\n\t},\n} as const satisfies CommandOptionMetadataMap;\n\n/**\n * Shared `wp-typia templates` option metadata.\n */\nexport const TEMPLATES_OPTION_METADATA = {\n\tid: {\n\t\tdescription: \"Template id for `templates inspect`.\",\n\t\ttype: \"string\",\n\t},\n} as const satisfies CommandOptionMetadataMap;\n\n/**\n * Global option metadata used by Node fallback parsing before command dispatch.\n */\nexport const GLOBAL_OPTION_METADATA = {\n\tconfig: {\n\t\tdescription: \"Config override file path.\",\n\t\tshort: \"c\",\n\t\ttype: \"string\",\n\t},\n\tformat: {\n\t\tdescription: \"Output format for supported commands.\",\n\t\ttype: \"string\",\n\t},\n\tid: {\n\t\tdescription: \"Template id for top-level `templates inspect` convenience.\",\n\t\ttype: \"string\",\n\t},\n\t\"output-dir\": {\n\t\tdescription: \"Output directory for generated MCP metadata.\",\n\t\ttype: \"string\",\n\t},\n} as const satisfies CommandOptionMetadataMap;\n\nexport function buildCommandOptions<TOptions extends CommandOptionMetadataMap>(\n\tmetadata: TOptions,\n): Record<string, {\n\targumentKind?: \"flag\";\n\tdescription: string;\n\tschema: z.ZodDefault<z.ZodBoolean> | z.ZodOptional<z.ZodString>;\n\tshort?: string;\n}> {\n\treturn Object.fromEntries(\n\t\tObject.entries(metadata).map(([name, option]) => [\n\t\t\tname,\n\t\t\t{\n\t\t\t\t...(option.argumentKind ? { argumentKind: option.argumentKind } : {}),\n\t\t\t\tdescription: option.description,\n\t\t\t\tschema:\n\t\t\t\t\toption.type === \"boolean\"\n\t\t\t\t\t\t? z.boolean().default(false)\n\t\t\t\t\t\t: z.string().optional(),\n\t\t\t\t...(option.short ? { short: option.short } : {}),\n\t\t\t},\n\t\t]),\n\t);\n}\n\nexport function collectOptionNamesByType(\n\tmetadata: CommandOptionMetadataMap,\n\ttype: CommandOptionMetadata[\"type\"],\n): string[] {\n\treturn Object.entries(metadata)\n\t\t.filter(([, option]) => option.type === type)\n\t\t.map(([name]) => name);\n}\n\nexport function formatNodeFallbackOptionHelp(\n\tmetadata: CommandOptionMetadataMap,\n): string[] {\n\treturn Object.entries(metadata).map(([name, option]) => {\n\t\tconst short = option.short ? `, -${option.short}` : \"\";\n\t\treturn `- --${name}${short}: ${option.description}`;\n\t});\n}\n",
14
- "import { createElement } from \"react\";\n\nimport { defineCommand } from \"@bunli/core\";\n\nimport {\n\tADD_OPTION_METADATA,\n\tbuildCommandOptions,\n} from \"../command-option-metadata\";\nimport { getAddBlockDefaults } from \"../config\";\nimport { resolveBundledModuleHref } from \"../render-loader\";\nimport { executeAddCommand } from \"../runtime-bridge\";\nimport type { WpTypiaRenderArgs } from \"./render-types\";\nimport { LazyFlow } from \"../ui/lazy-flow\";\n\nconst supportsInteractiveTui = typeof Bun !== \"undefined\";\n\nfunction loadAddFlow() {\n\treturn import(\n\t\tresolveBundledModuleHref(import.meta.url, [\n\t\t\t\"./ui/add-flow.js\",\n\t\t\t\"../ui/add-flow.js\",\n\t\t\t\"../ui/add-flow.tsx\",\n\t\t]),\n\t).then((module) => ({ default: module.AddFlow }));\n}\n\nconst addOptions = buildCommandOptions(ADD_OPTION_METADATA);\n\nexport const addCommand = defineCommand({\n\tdefaultFormat: \"toon\",\n\tdescription: \"Extend an official wp-typia workspace with blocks, variations, patterns, binding sources, plugin-level REST resources, editor plugins, or hooked blocks.\",\n\thandler: async (args) => {\n\t\tawait executeAddCommand({\n\t\t\tcwd: args.cwd,\n\t\t\tflags: args.flags as Record<string, unknown>,\n\t\t\tkind: args.positional[0],\n\t\t\tname: args.positional[1],\n\t\t});\n\t},\n\tname: \"add\",\n\toptions: addOptions,\n\t...(supportsInteractiveTui\n\t\t? {\n\t\t\t\trender: (args: WpTypiaRenderArgs) => {\n\t\t\t\t\tconst config =\n\t\t\t\t\t\targs.context?.store?.wpTypiaUserConfig &&\n\t\t\t\t\t\ttypeof args.context.store.wpTypiaUserConfig === \"object\"\n\t\t\t\t\t\t\t? getAddBlockDefaults(args.context.store.wpTypiaUserConfig)\n\t\t\t\t\t\t\t: {};\n\t\t\t\t\treturn createElement(LazyFlow, {\n\t\t\t\t\t\tloader: loadAddFlow,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tcwd: args.cwd,\n\t\t\t\t\t\t\tinitialValues: {\n\t\t\t\t\t\t\t\t\"alternate-render-targets\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"alternate-render-targets\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"alternate-render-targets\"],\n\t\t\t\t\t\t\t\t\"data-storage\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"data-storage\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"data-storage\"],\n\t\t\t\t\t\t\t\t\"external-layer-id\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"external-layer-id\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"external-layer-id\"],\n\t\t\t\t\t\t\t\t\"external-layer-source\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"external-layer-source\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"external-layer-source\"],\n\t\t\t\t\t\t\t\tanchor: (args.flags.anchor as string | undefined) ?? \"\",\n\t\t\t\t\t\t\t\tblock: (args.flags.block as string | undefined) ?? \"\",\n\t\t\t\t\t\t\t\tkind:\n\t\t\t\t\t\t\t\t\t(args.positional[0] as\n\t\t\t\t\t\t\t\t\t\t| \"block\"\n\t\t\t\t\t\t\t\t\t\t| \"variation\"\n\t\t\t\t\t\t\t\t\t\t| \"pattern\"\n\t\t\t\t\t\t\t\t\t\t| \"binding-source\"\n\t\t\t\t\t\t\t\t\t\t| \"rest-resource\"\n\t\t\t\t\t\t\t\t\t\t| \"editor-plugin\"\n\t\t\t\t\t\t\t\t\t\t| \"hooked-block\"\n\t\t\t\t\t\t\t\t\t\t| undefined) ?? \"block\",\n\t\t\t\t\t\t\t\tmethods: (args.flags.methods as string | undefined) ?? \"\",\n\t\t\t\t\t\t\t\tname: args.positional[1] ?? \"\",\n\t\t\t\t\t\t\t\tnamespace: (args.flags.namespace as string | undefined) ?? \"\",\n\t\t\t\t\t\t\t\t\"persistence-policy\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"persistence-policy\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"persistence-policy\"],\n\t\t\t\t\t\t\t\tposition: (args.flags.position as string | undefined) ?? \"after\",\n\t\t\t\t\t\t\t\tslot: (args.flags.slot as string | undefined) ?? \"PluginSidebar\",\n\t\t\t\t\t\t\t\ttemplate:\n\t\t\t\t\t\t\t\t\t(args.flags.template as string | undefined) ?? config.template,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\ttui: {\n\t\t\t\t\trenderer: {\n\t\t\t\t\t\tbufferMode: \"alternate\" as const,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t: {}),\n});\n\nexport default addCommand;\n",
15
- "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { isPlainObject as isRecord } from \"@wp-typia/api-client/runtime-primitives\";\n\nexport type WpTypiaSchemaSource = {\n\tnamespace: string;\n\tpath: string;\n};\n\nexport type WpTypiaUserConfig = {\n\tcreate?: {\n\t\t\"alternate-render-targets\"?: string;\n\t\t\"inner-blocks-preset\"?: string;\n\t\t\"data-storage\"?: string;\n\t\t\"dry-run\"?: boolean;\n\t\t\"external-layer-id\"?: string;\n\t\t\"external-layer-source\"?: string;\n\t\tnamespace?: string;\n\t\t\"no-install\"?: boolean;\n\t\t\"package-manager\"?: string;\n\t\t\"persistence-policy\"?: string;\n\t\t\"php-prefix\"?: string;\n\t\t\"query-post-type\"?: string;\n\t\ttemplate?: string;\n\t\t\"text-domain\"?: string;\n\t\tvariant?: string;\n\t\t\"with-migration-ui\"?: boolean;\n\t\t\"with-test-preset\"?: boolean;\n\t\t\"with-wp-env\"?: boolean;\n\t\tyes?: boolean;\n\t};\n\tadd?: {\n\t\tblock?: {\n\t\t\t\"alternate-render-targets\"?: string;\n\t\t\t\"data-storage\"?: string;\n\t\t\t\"external-layer-id\"?: string;\n\t\t\t\"external-layer-source\"?: string;\n\t\t\t\"inner-blocks-preset\"?: string;\n\t\t\t\"persistence-policy\"?: string;\n\t\t\ttemplate?: string;\n\t\t};\n\t};\n\tmcp?: {\n\t\tschemaSources?: WpTypiaSchemaSource[];\n\t};\n};\n\nexport const WP_TYPIA_CONFIG_SOURCES = [\n\t\"~/.config/wp-typia/config.json\",\n\t\".wp-typiarc\",\n\t\".wp-typiarc.json\",\n] as const;\ntype JsonRecord = Record<string, unknown>;\n\nfunction deepMerge<T extends JsonRecord>(base: T, incoming: JsonRecord): T {\n\tconst merged: JsonRecord = { ...base };\n\n\tfor (const [key, value] of Object.entries(incoming)) {\n\t\tif (Array.isArray(value)) {\n\t\t\tmerged[key] = value.slice();\n\t\t\tcontinue;\n\t\t}\n\t\tif (isRecord(value) && isRecord(merged[key])) {\n\t\t\tmerged[key] = deepMerge(merged[key] as JsonRecord, value);\n\t\t\tcontinue;\n\t\t}\n\t\tmerged[key] = value;\n\t}\n\n\treturn merged as T;\n}\n\nasync function readJsonFile(filePath: string): Promise<JsonRecord | null> {\n\ttry {\n\t\tconst source = await fs.readFile(filePath, \"utf8\");\n\t\tconst parsed = JSON.parse(source);\n\t\treturn isRecord(parsed) ? parsed : null;\n\t} catch (error) {\n\t\tif (\n\t\t\ttypeof error === \"object\" &&\n\t\t\terror !== null &&\n\t\t\t\"code\" in error &&\n\t\t\terror.code === \"ENOENT\"\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction resolveConfigPath(cwd: string, source: string): string {\n\tif (source.startsWith(\"~/\")) {\n\t\treturn path.join(os.homedir(), source.slice(2));\n\t}\n\treturn path.resolve(cwd, source);\n}\n\nexport function mergeWpTypiaUserConfig(\n\tbase: WpTypiaUserConfig,\n\tincoming: WpTypiaUserConfig,\n): WpTypiaUserConfig {\n\treturn deepMerge(base as JsonRecord, incoming as JsonRecord) as WpTypiaUserConfig;\n}\n\nexport async function loadWpTypiaUserConfigFromSource(\n\tcwd: string,\n\tsource: string,\n): Promise<WpTypiaUserConfig> {\n\tconst config = await readJsonFile(resolveConfigPath(cwd, source));\n\treturn (config ?? {}) as WpTypiaUserConfig;\n}\n\nexport async function loadWpTypiaUserConfig(cwd: string): Promise<WpTypiaUserConfig> {\n\tlet merged: JsonRecord = {};\n\n\tfor (const source of WP_TYPIA_CONFIG_SOURCES) {\n\t\tconst configPath = resolveConfigPath(cwd, source);\n\t\tconst config = await readJsonFile(configPath);\n\t\tif (config) {\n\t\t\tmerged = deepMerge(merged, config);\n\t\t}\n\t}\n\n\tconst packageJson = await readJsonFile(path.join(cwd, \"package.json\"));\n\tif (packageJson && isRecord(packageJson[\"wp-typia\"])) {\n\t\tmerged = deepMerge(merged, packageJson[\"wp-typia\"] as JsonRecord);\n\t}\n\n\treturn merged as WpTypiaUserConfig;\n}\n\nexport function getCreateDefaults(config: WpTypiaUserConfig): NonNullable<WpTypiaUserConfig[\"create\"]> {\n\treturn config.create ?? {};\n}\n\nexport function getAddBlockDefaults(\n\tconfig: WpTypiaUserConfig,\n): NonNullable<NonNullable<WpTypiaUserConfig[\"add\"]>[\"block\"]> {\n\treturn config.add?.block ?? {};\n}\n\nexport function getMcpSchemaSources(config: WpTypiaUserConfig): WpTypiaSchemaSource[] {\n\treturn config.mcp?.schemaSources ?? [];\n}\n",
16
- "import fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function resolveBundledModuleHref(baseUrl: string, candidates: string[]): string {\n\tfor (const candidate of candidates) {\n\t\tconst url = new URL(candidate, baseUrl);\n\t\tif (fs.existsSync(fileURLToPath(url))) {\n\t\t\treturn url.href;\n\t\t}\n\t}\n\n\treturn new URL(candidates[0]!, baseUrl).href;\n}\n",
17
- "import fs from \"node:fs\";\nimport { promises as fsp } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ntype WorkspaceFileOperation = `delete ${string}` | `update ${string}` | `write ${string}`;\n\nconst SKIPPED_COPY_ROOT_ENTRIES = new Set([\".git\", \"node_modules\"]);\nconst SKIPPED_COMPARE_ROOT_ENTRIES = new Set([\n\t\".git\",\n\t\".pnp.cjs\",\n\t\".pnp.loader.mjs\",\n\t\"node_modules\",\n]);\n\nasync function copyWorkspaceProject(sourceDir: string, targetDir: string): Promise<void> {\n\tawait fsp.cp(sourceDir, targetDir, {\n\t\tfilter: (sourcePath) => {\n\t\t\tconst relativePath = path.relative(sourceDir, sourcePath);\n\t\t\tif (relativePath === \"\") {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst [rootEntry] = relativePath.split(path.sep);\n\t\t\treturn !SKIPPED_COPY_ROOT_ENTRIES.has(rootEntry ?? \"\");\n\t\t},\n\t\trecursive: true,\n\t});\n}\n\nfunction ensureWorkspaceInstallMarkers(sourceDir: string, targetDir: string): void {\n\tconst sourceNodeModules = path.join(sourceDir, \"node_modules\");\n\tif (fs.existsSync(sourceNodeModules)) {\n\t\tfs.symlinkSync(sourceNodeModules, path.join(targetDir, \"node_modules\"), \"junction\");\n\t}\n\n\tfor (const marker of [\".pnp.cjs\", \".pnp.loader.mjs\"] as const) {\n\t\tconst sourceMarker = path.join(sourceDir, marker);\n\t\tif (!fs.existsSync(sourceMarker)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst targetMarker = path.join(targetDir, marker);\n\t\ttry {\n\t\t\tfs.symlinkSync(sourceMarker, targetMarker);\n\t\t} catch {\n\t\t\ttry {\n\t\t\t\tfs.linkSync(sourceMarker, targetMarker);\n\t\t\t} catch {\n\t\t\t\tfs.copyFileSync(sourceMarker, targetMarker);\n\t\t\t}\n\t\t}\n\t}\n}\n\nasync function listWorkspaceFiles(rootDir: string): Promise<Map<string, Buffer>> {\n\tconst files = new Map<string, Buffer>();\n\n\tasync function visit(currentDir: string): Promise<void> {\n\t\tconst entries = await fsp.readdir(currentDir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst absolutePath = path.join(currentDir, entry.name);\n\t\t\tconst relativePath = path.relative(rootDir, absolutePath);\n\t\t\tconst [rootEntry] = relativePath.split(path.sep);\n\t\t\tif (SKIPPED_COMPARE_ROOT_ENTRIES.has(rootEntry ?? \"\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tawait visit(absolutePath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!entry.isFile()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfiles.set(\n\t\t\t\trelativePath.replace(path.sep === \"\\\\\" ? /\\\\/gu : /\\//gu, \"/\"),\n\t\t\t\tawait fsp.readFile(absolutePath),\n\t\t\t);\n\t\t}\n\t}\n\n\tawait visit(rootDir);\n\treturn files;\n}\n\nfunction compareStrings(left: string, right: string): number {\n\tif (left < right) {\n\t\treturn -1;\n\t}\n\tif (left > right) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nasync function collectWorkspaceFileOperations(\n\tsourceDir: string,\n\tsimulatedDir: string,\n): Promise<WorkspaceFileOperation[]> {\n\tconst [sourceFiles, simulatedFiles] = await Promise.all([\n\t\tlistWorkspaceFiles(sourceDir),\n\t\tlistWorkspaceFiles(simulatedDir),\n\t]);\n\tconst operations: WorkspaceFileOperation[] = [];\n\n\tfor (const [relativePath, simulatedSource] of simulatedFiles) {\n\t\tconst originalSource = sourceFiles.get(relativePath);\n\t\tif (originalSource === undefined) {\n\t\t\toperations.push(`write ${relativePath}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!originalSource.equals(simulatedSource)) {\n\t\t\toperations.push(`update ${relativePath}`);\n\t\t}\n\t}\n\n\tfor (const relativePath of sourceFiles.keys()) {\n\t\tif (!simulatedFiles.has(relativePath)) {\n\t\t\toperations.push(`delete ${relativePath}`);\n\t\t}\n\t}\n\n\treturn operations.sort(compareStrings);\n}\n\n/**\n * Runs a mutating workspace add command against a temporary clone and reports\n * the file operations that would be applied to the real workspace.\n *\n * @param options Workspace add dry-run options.\n * @returns The simulated command result plus normalized file operations.\n */\nexport async function simulateWorkspaceAddDryRun<T>({\n\tcwd,\n\texecute,\n}: {\n\tcwd: string;\n\texecute: (simulatedCwd: string) => Promise<T>;\n}): Promise<{\n\tfileOperations: WorkspaceFileOperation[];\n\tresult: T;\n}> {\n\tconst { resolveWorkspaceProject } = await import(\"@wp-typia/project-tools/workspace-project\");\n\tconst workspace = resolveWorkspaceProject(cwd);\n\tconst relativeCwd = path.relative(workspace.projectDir, path.resolve(cwd));\n\tconst tempRoot = await fsp.mkdtemp(path.join(os.tmpdir(), \"wp-typia-add-plan-\"));\n\tconst simulatedProjectDir = path.join(tempRoot, \"workspace\");\n\n\ttry {\n\t\tawait copyWorkspaceProject(workspace.projectDir, simulatedProjectDir);\n\t\tensureWorkspaceInstallMarkers(workspace.projectDir, simulatedProjectDir);\n\n\t\tconst simulatedCwd =\n\t\t\trelativeCwd.length > 0 ? path.join(simulatedProjectDir, relativeCwd) : simulatedProjectDir;\n\t\tconst result = await execute(simulatedCwd);\n\t\tconst fileOperations = await collectWorkspaceFileOperations(\n\t\t\tworkspace.projectDir,\n\t\t\tsimulatedProjectDir,\n\t\t);\n\n\t\treturn {\n\t\t\tfileOperations,\n\t\t\tresult,\n\t\t};\n\t} finally {\n\t\tawait fsp.rm(tempRoot, { force: true, recursive: true });\n\t}\n}\n",
18
- "import packageJson from \"../package.json\";\nimport { formatPackageExecCommand } from \"@wp-typia/project-tools/package-managers\";\nimport type { AlternateBufferCompletionPayload } from \"./ui/alternate-buffer-lifecycle\";\n\ntype PrintLine = (line: string) => void;\n\nexport type CreateProgressPayload = {\n\tdetail: string;\n\ttitle: string;\n};\n\ntype ExternalLayerSelectOption = {\n\tdescription?: string;\n\textends: string[];\n\tid: string;\n};\n\n/**\n * Prints a formatted alternate-buffer completion payload to the provided writers.\n *\n * @param payload Structured completion payload to render.\n * @param options Optional line printers for normal output and warnings.\n * @returns Nothing.\n */\nexport function printCompletionPayload(\n\tpayload: AlternateBufferCompletionPayload,\n\toptions: {\n\t\tprintLine?: PrintLine;\n\t\twarnLine?: PrintLine;\n\t} = {},\n): void {\n\tconst printLine = options.printLine ?? (console.log as PrintLine);\n\tconst warnLine = options.warnLine ?? printLine;\n\n\tfor (const line of payload.preambleLines ?? []) {\n\t\tprintLine(line);\n\t}\n\tfor (const warning of payload.warningLines ?? []) {\n\t\twarnLine(`⚠️ ${warning}`);\n\t}\n\n\tconst hasDetails =\n\t\t(payload.summaryLines?.length ?? 0) > 0 ||\n\t\t(payload.nextSteps?.length ?? 0) > 0 ||\n\t\t(payload.optionalLines?.length ?? 0) > 0 ||\n\t\tBoolean(payload.optionalNote);\n\tconst hasLeadingContext =\n\t\t(payload.preambleLines?.length ?? 0) > 0 ||\n\t\t(payload.warningLines?.length ?? 0) > 0;\n\n\tprintLine(hasLeadingContext && hasDetails ? `\\n${payload.title}` : payload.title);\n\tfor (const line of payload.summaryLines ?? []) {\n\t\tprintLine(line);\n\t}\n\tif ((payload.nextSteps?.length ?? 0) > 0) {\n\t\tprintLine(\"Next steps:\");\n\t\tfor (const step of payload.nextSteps ?? []) {\n\t\t\tprintLine(` ${step}`);\n\t\t}\n\t}\n\tif ((payload.optionalLines?.length ?? 0) > 0) {\n\t\tprintLine(`\\n${payload.optionalTitle ?? \"Optional:\"}`);\n\t\tfor (const step of payload.optionalLines ?? []) {\n\t\t\tprintLine(` ${step}`);\n\t\t}\n\t}\n\tif (payload.optionalNote) {\n\t\tprintLine(`Note: ${payload.optionalNote}`);\n\t}\n}\n\n/**\n * Formats a lightweight create-progress line for fallback CLI output.\n *\n * @param payload User-facing scaffold progress payload.\n * @returns A single readable status line.\n */\nexport function formatCreateProgressLine(payload: CreateProgressPayload): string {\n\treturn `⏳ ${payload.title}: ${payload.detail}`;\n}\n\n/**\n * Builds the completion payload shown after a create flow succeeds.\n *\n * @param flow Resolved create-flow data including onboarding steps and warnings.\n * @returns A structured alternate-buffer completion payload.\n */\nexport function buildCreateCompletionPayload(flow: {\n\tnextSteps: string[];\n\toptionalOnboarding: {\n\t\tnote: string;\n\t\tsteps: string[];\n\t};\n\tpackageManager: string;\n\tprojectDir: string;\n\tresult: {\n\t\tselectedVariant?: string | null;\n\t\tvariables: {\n\t\t\ttitle: string;\n\t\t};\n\t\twarnings: string[];\n\t};\n}): AlternateBufferCompletionPayload {\n\tconst verificationSteps = [\n\t\tformatPackageExecCommand(\n\t\t\tflow.packageManager as \"bun\" | \"npm\" | \"pnpm\" | \"yarn\",\n\t\t\t`wp-typia@${packageJson.version}`,\n\t\t\t\"doctor\",\n\t\t),\n\t\t...flow.optionalOnboarding.steps,\n\t];\n\n\treturn {\n\t\tnextSteps: flow.nextSteps,\n\t\toptionalLines: verificationSteps,\n\t\toptionalNote: flow.optionalOnboarding.note,\n\t\toptionalTitle: \"Verify and sync (optional):\",\n\t\tpreambleLines: flow.result.selectedVariant\n\t\t\t? [`Template variant: ${flow.result.selectedVariant}`]\n\t\t\t: undefined,\n\t\tsummaryLines: [`Project directory: ${flow.projectDir}`],\n\t\ttitle: `✅ Created ${flow.result.variables.title} in ${flow.projectDir}`,\n\t\twarningLines: flow.result.warnings,\n\t};\n}\n\n/**\n * Builds the completion payload shown after a dry-run create flow succeeds.\n *\n * @param flow Resolved create-flow data including the non-mutating scaffold plan.\n * @returns A structured alternate-buffer completion payload.\n */\nexport function buildCreateDryRunPayload(flow: {\n\tpackageManager: string;\n\tplan: {\n\t\tdependencyInstall: \"skipped-by-flag\" | \"would-install\";\n\t\tfiles: string[];\n\t};\n\tprojectDir: string;\n\tresult: {\n\t\tselectedVariant?: string | null;\n\t\ttemplateId: string;\n\t\tvariables: {\n\t\t\ttitle: string;\n\t\t};\n\t\twarnings: string[];\n\t};\n}): AlternateBufferCompletionPayload {\n\tlet dependencyInstallLine: string;\n\tswitch (flow.plan.dependencyInstall) {\n\t\tcase \"skipped-by-flag\":\n\t\t\tdependencyInstallLine = \"Dependency install: already skipped via --no-install\";\n\t\t\tbreak;\n\t\tcase \"would-install\":\n\t\t\tdependencyInstallLine = \"Dependency install: would run during a real scaffold\";\n\t\t\tbreak;\n\t}\n\n\treturn {\n\t\toptionalLines: flow.plan.files.map((relativePath) => `write ${relativePath}`),\n\t\toptionalNote:\n\t\t\t\"No files were written because --dry-run was enabled. Re-run without --dry-run to materialize this scaffold.\",\n\t\toptionalTitle: `Planned files (${flow.plan.files.length}):`,\n\t\tpreambleLines: flow.result.selectedVariant\n\t\t\t? [`Template variant: ${flow.result.selectedVariant}`]\n\t\t\t: undefined,\n\t\tsummaryLines: [\n\t\t\t`Project directory: ${flow.projectDir}`,\n\t\t\t`Template: ${flow.result.templateId}`,\n\t\t\t`Package manager: ${flow.packageManager}`,\n\t\t\tdependencyInstallLine,\n\t\t],\n\t\ttitle: `🧪 Dry run for ${flow.result.variables.title} at ${flow.projectDir}`,\n\t\twarningLines: flow.result.warnings,\n\t};\n}\n\n/**\n * Builds the completion payload shown after a migrate command succeeds.\n *\n * @param options Completed migrate command metadata plus rendered lines.\n * @returns A structured alternate-buffer completion payload.\n */\nexport function buildMigrationCompletionPayload(options: {\n\tcommand: string;\n\tlines: string[];\n}): AlternateBufferCompletionPayload {\n\tconst summaryLines = options.lines.filter((line) => line.trim().length > 0);\n\n\treturn {\n\t\tsummaryLines,\n\t\ttitle: `✅ Completed wp-typia migrate ${options.command}`,\n\t};\n}\n\n/**\n * Builds the completion payload shown after an add flow succeeds.\n *\n * @param options Add-flow kind plus normalized values to summarize.\n * @returns A structured alternate-buffer completion payload.\n */\nexport function buildAddCompletionPayload(options: {\n\tkind:\n\t\t| \"binding-source\"\n\t\t| \"block\"\n\t\t| \"editor-plugin\"\n\t\t| \"hooked-block\"\n\t\t| \"pattern\"\n\t\t| \"rest-resource\"\n\t\t| \"variation\";\n\tprojectDir: string;\n\tvalues: Record<string, string>;\n\twarnings?: string[];\n}): AlternateBufferCompletionPayload {\n\tswitch (options.kind) {\n\t\tcase \"variation\":\n\t\t\treturn {\n\t\t\t\tsummaryLines: [\n\t\t\t\t\t`Variation: ${options.values.variationSlug}`,\n\t\t\t\t\t`Target block: ${options.values.blockSlug}`,\n\t\t\t\t\t`Project directory: ${options.projectDir}`,\n\t\t\t\t],\n\t\t\t\ttitle: \"✅ Added workspace variation\",\n\t\t\t};\n\t\tcase \"pattern\":\n\t\t\treturn {\n\t\t\t\tsummaryLines: [\n\t\t\t\t\t`Pattern: ${options.values.patternSlug}`,\n\t\t\t\t\t`Project directory: ${options.projectDir}`,\n\t\t\t\t],\n\t\t\t\ttitle: \"✅ Added workspace pattern\",\n\t\t\t};\n\t\tcase \"binding-source\":\n\t\t\treturn {\n\t\t\t\tsummaryLines: [\n\t\t\t\t\t`Binding source: ${options.values.bindingSourceSlug}`,\n\t\t\t\t\t`Project directory: ${options.projectDir}`,\n\t\t\t\t],\n\t\t\t\ttitle: \"✅ Added binding source\",\n\t\t\t};\n\t\tcase \"rest-resource\":\n\t\t\treturn {\n\t\t\t\tsummaryLines: [\n\t\t\t\t\t`REST resource: ${options.values.restResourceSlug}`,\n\t\t\t\t\t`Namespace: ${options.values.namespace}`,\n\t\t\t\t\t`Methods: ${options.values.methods}`,\n\t\t\t\t\t`Project directory: ${options.projectDir}`,\n\t\t\t\t],\n\t\t\t\ttitle: \"✅ Added plugin-level REST resource\",\n\t\t\t};\n\t\tcase \"editor-plugin\":\n\t\t\treturn {\n\t\t\t\tsummaryLines: [\n\t\t\t\t\t`Editor plugin: ${options.values.editorPluginSlug}`,\n\t\t\t\t\t`Slot: ${options.values.slot}`,\n\t\t\t\t\t`Project directory: ${options.projectDir}`,\n\t\t\t\t],\n\t\t\t\ttitle: \"✅ Added editor plugin\",\n\t\t\t};\n\t\tcase \"hooked-block\":\n\t\t\treturn {\n\t\t\t\tsummaryLines: [\n\t\t\t\t\t`Block: ${options.values.blockSlug}`,\n\t\t\t\t\t`Anchor: ${options.values.anchorBlockName}`,\n\t\t\t\t\t`Position: ${options.values.position}`,\n\t\t\t\t\t`Project directory: ${options.projectDir}`,\n\t\t\t\t],\n\t\t\t\ttitle: \"✅ Added blockHooks metadata\",\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tsummaryLines: [\n\t\t\t\t\t`Blocks: ${options.values.blockSlugs}`,\n\t\t\t\t\t`Template family: ${options.values.templateId}`,\n\t\t\t\t\t`Project directory: ${options.projectDir}`,\n\t\t\t\t],\n\t\t\t\ttitle: \"✅ Added workspace block\",\n\t\t\t\twarningLines: options.warnings,\n\t\t\t};\n\t}\n}\n\n/**\n * Builds the completion payload shown after a dry-run add flow succeeds.\n *\n * @param options Existing add completion metadata plus the planned file updates.\n * @returns A structured alternate-buffer completion payload.\n */\nexport function buildAddDryRunPayload(options: {\n\tcompletion: AlternateBufferCompletionPayload;\n\tfileOperations: string[];\n}): AlternateBufferCompletionPayload {\n\tconst normalizedTitle = options.completion.title.replace(/^✅\\s*Added\\s*/u, \"\");\n\n\treturn {\n\t\toptionalLines: options.fileOperations,\n\t\toptionalNote:\n\t\t\t\"No workspace files were changed because --dry-run was enabled. Re-run without --dry-run to apply this add command.\",\n\t\toptionalTitle: `Planned workspace updates (${options.fileOperations.length}):`,\n\t\tpreambleLines: options.completion.preambleLines,\n\t\tsummaryLines: options.completion.summaryLines,\n\t\ttitle: `🧪 Dry run for ${normalizedTitle || \"workspace add command\"}`,\n\t\twarningLines: options.completion.warningLines,\n\t};\n}\n\n/**\n * Prints a block of text lines using a shared line printer.\n *\n * @param lines Lines to print in order.\n * @param printLine Line printer to use.\n * @returns Nothing.\n */\nexport function printBlock(lines: string[], printLine: PrintLine): void {\n\tfor (const line of lines) {\n\t\tprintLine(line);\n\t}\n}\n\nfunction formatExternalLayerSelectHint(option: ExternalLayerSelectOption): string | undefined {\n\tconst details = [\n\t\toption.description,\n\t\toption.extends.length > 0 ? `extends ${option.extends.join(\", \")}` : undefined,\n\t].filter((value): value is string => typeof value === \"string\" && value.length > 0);\n\n\treturn details.length > 0 ? details.join(\" · \") : undefined;\n}\n\n/**\n * Converts external layer options into prompt-compatible select items.\n *\n * @param options External layer options returned by the block generator.\n * @returns Prompt select options with labels and hints.\n */\nexport function toExternalLayerPromptOptions(options: ExternalLayerSelectOption[]) {\n\treturn options.map((option) => ({\n\t\thint: formatExternalLayerSelectHint(option),\n\t\tlabel: option.id,\n\t\tvalue: option.id,\n\t}));\n}\n",
19
- "import { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\ntype PackageManagerId = \"bun\" | \"npm\" | \"pnpm\" | \"yarn\";\n\ntype SyncExecutionInput = {\n\tcheck?: boolean;\n\tcwd: string;\n};\n\ntype SyncProjectContext = {\n\tcwd: string;\n\tpackageJsonPath: string;\n\tpackageManager: PackageManagerId;\n\tscripts: Partial<Record<\"sync\" | \"sync-rest\" | \"sync-types\", string>>;\n};\n\nconst SYNC_INSTALL_MARKERS = [\"node_modules\", \".pnp.cjs\", \".pnp.loader.mjs\"] as const;\nconst LOCAL_SYNC_TOOL_PATTERN = /(^|[\\s;&|()])(?:tsx|wp-scripts)(?=($|[\\s;&|()]))/u;\n\nfunction formatRunScript(\n\tpackageManagerId: PackageManagerId,\n\tscriptName: string,\n\textraArgs = \"\",\n) {\n\tconst args = extraArgs.trim();\n\tif (packageManagerId === \"bun\") {\n\t\treturn args ? `bun run ${scriptName} ${args}` : `bun run ${scriptName}`;\n\t}\n\tif (packageManagerId === \"npm\") {\n\t\treturn args ? `npm run ${scriptName} -- ${args}` : `npm run ${scriptName}`;\n\t}\n\tif (packageManagerId === \"pnpm\") {\n\t\treturn args ? `pnpm run ${scriptName} ${args}` : `pnpm run ${scriptName}`;\n\t}\n\treturn args ? `yarn run ${scriptName} ${args}` : `yarn run ${scriptName}`;\n}\n\nfunction formatInstallCommand(packageManagerId: PackageManagerId): string {\n\tswitch (packageManagerId) {\n\t\tcase \"bun\":\n\t\t\treturn \"bun install\";\n\t\tcase \"pnpm\":\n\t\t\treturn \"pnpm install\";\n\t\tcase \"yarn\":\n\t\t\treturn \"yarn install\";\n\t\tdefault:\n\t\t\treturn \"npm install\";\n\t}\n}\n\nfunction getSyncRootError(cwd: string): Error {\n\treturn new Error(\n\t\t`No generated wp-typia project root was found at ${cwd}. Run \\`wp-typia sync\\` from a scaffolded project or official workspace root.`,\n\t);\n}\n\nfunction inferSyncPackageManager(cwd: string, packageManagerField?: string): PackageManagerId {\n\tconst field = String(packageManagerField ?? \"\");\n\tif (field.startsWith(\"bun@\")) return \"bun\";\n\tif (field.startsWith(\"npm@\")) return \"npm\";\n\tif (field.startsWith(\"pnpm@\")) return \"pnpm\";\n\tif (field.startsWith(\"yarn@\")) return \"yarn\";\n\n\tif (\n\t\tfs.existsSync(path.join(cwd, \"bun.lock\")) ||\n\t\tfs.existsSync(path.join(cwd, \"bun.lockb\"))\n\t) {\n\t\treturn \"bun\";\n\t}\n\tif (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) {\n\t\treturn \"pnpm\";\n\t}\n\tif (\n\t\tfs.existsSync(path.join(cwd, \"yarn.lock\")) ||\n\t\tfs.existsSync(path.join(cwd, \".pnp.cjs\")) ||\n\t\tfs.existsSync(path.join(cwd, \".pnp.loader.mjs\")) ||\n\t\tfs.existsSync(path.join(cwd, \".yarnrc.yml\"))\n\t) {\n\t\treturn \"yarn\";\n\t}\n\tif (\n\t\tfs.existsSync(path.join(cwd, \"package-lock.json\")) ||\n\t\tfs.existsSync(path.join(cwd, \"npm-shrinkwrap.json\"))\n\t) {\n\t\treturn \"npm\";\n\t}\n\n\treturn \"npm\";\n}\n\nfunction resolveSyncProjectContext(cwd: string): SyncProjectContext {\n\tconst packageJsonPath = path.join(cwd, \"package.json\");\n\tif (!fs.existsSync(packageJsonPath)) {\n\t\tthrow getSyncRootError(cwd);\n\t}\n\n\tconst packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")) as {\n\t\tpackageManager?: string;\n\t\tscripts?: Record<string, unknown>;\n\t};\n\tconst scripts = packageJson.scripts ?? {};\n\tconst syncScripts = {\n\t\tsync: typeof scripts.sync === \"string\" ? scripts.sync : undefined,\n\t\t\"sync-rest\":\n\t\t\ttypeof scripts[\"sync-rest\"] === \"string\" ? scripts[\"sync-rest\"] : undefined,\n\t\t\"sync-types\":\n\t\t\ttypeof scripts[\"sync-types\"] === \"string\" ? scripts[\"sync-types\"] : undefined,\n\t} satisfies SyncProjectContext[\"scripts\"];\n\n\tif (!syncScripts.sync && !syncScripts[\"sync-types\"]) {\n\t\tthrow new Error(\n\t\t\t`Expected ${packageJsonPath} to define either a \\`sync\\` or \\`sync-types\\` script.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tcwd,\n\t\tpackageJsonPath,\n\t\tpackageManager: inferSyncPackageManager(cwd, packageJson.packageManager),\n\t\tscripts: syncScripts,\n\t};\n}\n\nfunction findInstalledDependencyMarkerDir(projectDir: string): string | null {\n\tlet currentDir = path.resolve(projectDir);\n\n\twhile (true) {\n\t\tif (\n\t\t\tSYNC_INSTALL_MARKERS.some((marker) =>\n\t\t\t\tfs.existsSync(path.join(currentDir, marker)),\n\t\t\t)\n\t\t) {\n\t\t\treturn currentDir;\n\t\t}\n\n\t\tconst parentDir = path.dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nfunction scriptsLikelyNeedInstalledDependencies(project: SyncProjectContext): boolean {\n\tconst candidateScripts = project.scripts.sync\n\t\t? [project.scripts.sync]\n\t\t: [project.scripts[\"sync-types\"], project.scripts[\"sync-rest\"]];\n\n\treturn candidateScripts.some(\n\t\t(script): script is string =>\n\t\t\ttypeof script === \"string\" && LOCAL_SYNC_TOOL_PATTERN.test(script),\n\t);\n}\n\nfunction assertSyncDependenciesInstalled(project: SyncProjectContext): void {\n\tif (!scriptsLikelyNeedInstalledDependencies(project)) {\n\t\treturn;\n\t}\n\tconst markerDir = findInstalledDependencyMarkerDir(project.cwd);\n\tif (markerDir) {\n\t\treturn;\n\t}\n\n\tthrow new Error(\n\t\t`Project dependencies have not been installed yet. Run \\`${formatInstallCommand(project.packageManager)}\\` from the project root before \\`wp-typia sync\\`. The generated sync scripts rely on local tools such as \\`tsx\\`.`,\n\t);\n}\n\nfunction getPackageManagerRunInvocation(\n\tpackageManager: PackageManagerId,\n\tscriptName: string,\n\textraArgs: string[],\n): { args: string[]; command: string } {\n\tswitch (packageManager) {\n\t\tcase \"bun\":\n\t\t\treturn { args: [\"run\", scriptName, ...extraArgs], command: \"bun\" };\n\t\tcase \"npm\":\n\t\t\treturn {\n\t\t\t\targs: [\"run\", scriptName, ...(extraArgs.length > 0 ? [\"--\", ...extraArgs] : [])],\n\t\t\t\tcommand: \"npm\",\n\t\t\t};\n\t\tcase \"pnpm\":\n\t\t\treturn { args: [\"run\", scriptName, ...extraArgs], command: \"pnpm\" };\n\t\tcase \"yarn\":\n\t\t\treturn { args: [\"run\", scriptName, ...extraArgs], command: \"yarn\" };\n\t}\n}\n\nfunction runProjectScript(\n\tproject: SyncProjectContext,\n\tscriptName: \"sync\" | \"sync-rest\" | \"sync-types\",\n\textraArgs: string[],\n): void {\n\tconst script = project.scripts[scriptName];\n\tif (!script) {\n\t\treturn;\n\t}\n\n\tconst invocation = getPackageManagerRunInvocation(\n\t\tproject.packageManager,\n\t\tscriptName,\n\t\textraArgs,\n\t);\n\n\tconst result = spawnSync(invocation.command, invocation.args, {\n\t\tcwd: project.cwd,\n\t\tshell: process.platform === \"win32\",\n\t\tstdio: \"inherit\",\n\t});\n\n\tif (result.error || result.status !== 0) {\n\t\tthrow new Error(\n\t\t\t`\\`${formatRunScript(project.packageManager, scriptName, extraArgs.join(\" \"))}\\` failed.`,\n\t\t\t{\n\t\t\t\tcause: result.error,\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Executes the generated-project sync flow through the local project scripts.\n *\n * @param options Sync execution options including cwd and optional `--check`.\n * @returns A promise that resolves after the relevant sync scripts complete.\n */\nexport async function executeSyncCommand({\n\tcheck = false,\n\tcwd,\n}: SyncExecutionInput): Promise<void> {\n\tconst project = resolveSyncProjectContext(cwd);\n\tassertSyncDependenciesInstalled(project);\n\tconst extraArgs = check ? [\"--check\"] : [];\n\n\tif (project.scripts.sync) {\n\t\trunProjectScript(project, \"sync\", extraArgs);\n\t\treturn;\n\t}\n\n\trunProjectScript(project, \"sync-types\", extraArgs);\n\n\tif (project.scripts[\"sync-rest\"]) {\n\t\trunProjectScript(project, \"sync-rest\", extraArgs);\n\t}\n}\n",
20
- "import type { ReadlinePrompt } from \"@wp-typia/project-tools/cli-prompt\";\nimport { simulateWorkspaceAddDryRun } from \"./runtime-bridge-add-dry-run\";\nimport type { AlternateBufferCompletionPayload } from \"./ui/alternate-buffer-lifecycle\";\nimport {\n\tbuildAddCompletionPayload,\n\tbuildAddDryRunPayload,\n\tbuildCreateCompletionPayload,\n\tbuildCreateDryRunPayload,\n\tbuildMigrationCompletionPayload,\n\tformatCreateProgressLine,\n\tprintBlock,\n\tprintCompletionPayload,\n\ttoExternalLayerPromptOptions,\n} from \"./runtime-bridge-output\";\nexport {\n\tbuildCreateCompletionPayload,\n\tbuildCreateDryRunPayload,\n\tbuildMigrationCompletionPayload,\n\tformatCreateProgressLine,\n\tprintCompletionPayload,\n} from \"./runtime-bridge-output\";\nexport { executeSyncCommand } from \"./runtime-bridge-sync\";\n\ntype CreateProgressPayload = {\n\tdetail: string;\n\ttitle: string;\n};\n\ntype CreateExecutionInput = {\n\tprojectDir: string;\n\tcwd: string;\n\temitOutput?: boolean;\n\tflags: Record<string, unknown>;\n\tinteractive?: boolean;\n\tonProgress?: (payload: CreateProgressPayload) => void;\n\tprintLine?: PrintLine;\n\tprompt?: ReadlinePrompt;\n\twarnLine?: PrintLine;\n};\n\ntype AddExecutionInput = {\n\tcwd: string;\n\temitOutput?: boolean;\n\tflags: Record<string, unknown>;\n\tinteractive?: boolean;\n\tkind?: string;\n\tname?: string;\n\tprintLine?: PrintLine;\n\tprompt?: ReadlinePrompt;\n\twarnLine?: PrintLine;\n};\n\ntype TemplatesExecutionInput = {\n\tflags: {\n\t\tid?: string;\n\t\tsubcommand?: string;\n\t};\n};\n\ntype MigrateExecutionInput = {\n\tcommand?: string;\n\tcwd: string;\n\tflags: Record<string, unknown>;\n\tprompt?: ReadlinePrompt;\n\trenderLine?: (line: string) => void;\n};\n\ntype PrintLine = (line: string) => void;\ntype CliCommandId = \"add\" | \"create\" | \"doctor\" | \"migrate\";\n\nconst loadCliAddRuntime = () => import(\"@wp-typia/project-tools/cli-add\");\nconst loadCliDiagnosticsRuntime = () => import(\"@wp-typia/project-tools/cli-diagnostics\");\nconst loadCliDoctorRuntime = () => import(\"@wp-typia/project-tools/cli-doctor\");\nconst loadCliPromptRuntime = () => import(\"@wp-typia/project-tools/cli-prompt\");\nconst loadCliScaffoldRuntime = () => import(\"@wp-typia/project-tools/cli-scaffold\");\nconst loadCliTemplatesRuntime = () => import(\"@wp-typia/project-tools/cli-templates\");\nconst loadWorkspaceProjectRuntime = () => import(\"@wp-typia/project-tools/workspace-project\");\nconst loadMigrationsRuntime = () => import(\"@wp-typia/project-tools/migrations\");\n\nasync function wrapCliCommandError(command: CliCommandId, error: unknown) {\n\tconst { createCliCommandError } = await loadCliDiagnosticsRuntime();\n\treturn createCliCommandError({ command, error });\n}\n\nfunction shouldWrapCliCommandError(options: {\n\temitOutput?: boolean;\n\trenderLine?: ((line: string) => void) | undefined;\n}): boolean {\n\tif (options.emitOutput === false) {\n\t\treturn false;\n\t}\n\n\tif (options.renderLine) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction readOptionalStringFlag(\n\tflags: Record<string, unknown>,\n\tname: string,\n): string | undefined {\n\tconst value = flags[name];\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`\\`--${name}\\` requires a value.`);\n\t}\n\treturn value;\n}\n\nfunction readOptionalLooseStringFlag(\n\tflags: Record<string, unknown>,\n\tname: string,\n): string | undefined {\n\tconst value = flags[name];\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(`\\`--${name}\\` requires a value.`);\n\t}\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction pushFlag(argv: string[], name: string, value: unknown): void {\n\tif (value === undefined || value === null || value === false) {\n\t\treturn;\n\t}\n\tif (value === true) {\n\t\targv.push(`--${name}`);\n\t\treturn;\n\t}\n\targv.push(`--${name}`, String(value));\n}\n\nconst PACKAGE_MANAGER_PROMPT_OPTIONS = [\n\t{ label: \"npm\", value: \"npm\", hint: \"Use npm\" },\n\t{ label: \"pnpm\", value: \"pnpm\", hint: \"Use pnpm\" },\n\t{ label: \"yarn\", value: \"yarn\", hint: \"Use yarn\" },\n\t{ label: \"bun\", value: \"bun\", hint: \"Use bun\" },\n] as const;\n\nconst DATA_STORAGE_PROMPT_OPTIONS = [\n\t{ label: \"custom-table\", value: \"custom-table\", hint: \"Dedicated custom table storage\" },\n\t{ label: \"post-meta\", value: \"post-meta\", hint: \"Persist through post meta\" },\n] as const;\n\nconst PERSISTENCE_POLICY_PROMPT_OPTIONS = [\n\t{ label: \"authenticated\", value: \"authenticated\", hint: \"Authenticated write policy\" },\n\t{ label: \"public\", value: \"public\", hint: \"Public token policy\" },\n] as const;\n\nconst BOOLEAN_PROMPT_OPTIONS = [\n\t{ label: \"Yes\", value: \"yes\", hint: \"Enable this option\" },\n\t{ label: \"No\", value: \"no\", hint: \"Keep the default disabled state\" },\n] as const;\n\nfunction emitCompletion(\n\tpayload: AlternateBufferCompletionPayload,\n\toptions: {\n\t\temitOutput: boolean;\n\t\tprintLine: PrintLine;\n\t\twarnLine?: PrintLine;\n\t},\n): AlternateBufferCompletionPayload {\n\tif (options.emitOutput) {\n\t\tprintCompletionPayload(payload, {\n\t\t\tprintLine: options.printLine,\n\t\t\twarnLine: options.warnLine,\n\t\t});\n\t}\n\n\treturn payload;\n}\n\nexport async function executeCreateCommand({\n\tprojectDir,\n\tcwd,\n\temitOutput = true,\n\tflags,\n\tinteractive,\n\tonProgress,\n\tprintLine = console.log as PrintLine,\n\tprompt,\n\twarnLine = console.warn as PrintLine,\n}: CreateExecutionInput): Promise<AlternateBufferCompletionPayload> {\n\tconst [\n\t\t{ createReadlinePrompt },\n\t\t{ runScaffoldFlow },\n\t\t{ getTemplateSelectOptions },\n\t] = await Promise.all([\n\t\tloadCliPromptRuntime(),\n\t\tloadCliScaffoldRuntime(),\n\t\tloadCliTemplatesRuntime(),\n\t]);\n\tconst shouldPrompt =\n\t\tinteractive ?? (!Boolean(flags.yes) && Boolean(process.stdin.isTTY) && Boolean(process.stdout.isTTY));\n\tconst activePrompt = shouldPrompt ? (prompt ?? createReadlinePrompt()) : undefined;\n\tconst shouldPromptForExternalLayerSelection =\n\t\tBoolean(activePrompt) && activePrompt !== prompt;\n\tconst effectiveYes = Boolean(flags.yes) || (Boolean(flags[\"dry-run\"]) && !Boolean(activePrompt));\n\n\ttry {\n\t\tconst flow = await runScaffoldFlow({\n\t\t\talternateRenderTargets: readOptionalLooseStringFlag(\n\t\t\t\tflags,\n\t\t\t\t\"alternate-render-targets\",\n\t\t\t),\n\t\t\tcwd,\n\t\t\tdataStorageMode: readOptionalLooseStringFlag(flags, \"data-storage\"),\n\t\t\tdryRun: Boolean(flags[\"dry-run\"]),\n\t\t\texternalLayerId: readOptionalLooseStringFlag(flags, \"external-layer-id\"),\n\t\t\texternalLayerSource: readOptionalLooseStringFlag(flags, \"external-layer-source\"),\n\t\t\tinnerBlocksPreset: readOptionalLooseStringFlag(flags, \"inner-blocks-preset\"),\n\t\t\tisInteractive: Boolean(activePrompt),\n\t\t\tnamespace: readOptionalLooseStringFlag(flags, \"namespace\"),\n\t\t\tnoInstall: Boolean(flags[\"no-install\"]),\n\t\t\tpackageManager: readOptionalLooseStringFlag(flags, \"package-manager\"),\n\t\t\tpersistencePolicy: readOptionalLooseStringFlag(flags, \"persistence-policy\"),\n\t\t\tphpPrefix: readOptionalLooseStringFlag(flags, \"php-prefix\"),\n\t\t\tprojectInput: projectDir,\n\t\t\tonProgress: async (progress) => {\n\t\t\t\tconst payload = {\n\t\t\t\t\tdetail: progress.detail,\n\t\t\t\t\ttitle: progress.title,\n\t\t\t\t};\n\t\t\t\tonProgress?.(payload);\n\t\t\t\tif (emitOutput) {\n\t\t\t\t\tprintLine(formatCreateProgressLine(payload));\n\t\t\t\t}\n\t\t\t},\n\t\t\tpromptText: activePrompt\n\t\t\t\t? (message, defaultValue, validate) => activePrompt.text(message, defaultValue, validate)\n\t\t\t\t: undefined,\n\t\t\tqueryPostType: readOptionalLooseStringFlag(flags, \"query-post-type\"),\n\t\t\tselectDataStorage: activePrompt\n\t\t\t\t? () => activePrompt.select(\"Select a data storage mode\", [...DATA_STORAGE_PROMPT_OPTIONS], 1)\n\t\t\t\t: undefined,\n\t\t\tselectExternalLayerId: shouldPromptForExternalLayerSelection && activePrompt\n\t\t\t\t? (options) =>\n\t\t\t\t\t\tactivePrompt.select(\n\t\t\t\t\t\t\t\"Select an external layer\",\n\t\t\t\t\t\t\ttoExternalLayerPromptOptions(options),\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t\tselectPackageManager: activePrompt\n\t\t\t\t? () => activePrompt.select(\"Select a package manager\", [...PACKAGE_MANAGER_PROMPT_OPTIONS], 1)\n\t\t\t\t: undefined,\n\t\t\tselectPersistencePolicy: activePrompt\n\t\t\t\t? () =>\n\t\t\t\t\t\tactivePrompt.select(\n\t\t\t\t\t\t\t\"Select a persistence policy\",\n\t\t\t\t\t\t\t[...PERSISTENCE_POLICY_PROMPT_OPTIONS],\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t\tselectTemplate: activePrompt\n\t\t\t\t? () => activePrompt.select(\"Select a template\", getTemplateSelectOptions(), 1)\n\t\t\t\t: undefined,\n\t\t\tselectWithMigrationUi: activePrompt\n\t\t\t\t? async () =>\n\t\t\t\t\t\t(await activePrompt.select(\"Enable migration UI support?\", [...BOOLEAN_PROMPT_OPTIONS], 2)) ===\n\t\t\t\t\t\t\"yes\"\n\t\t\t\t: undefined,\n\t\t\tselectWithTestPreset: activePrompt\n\t\t\t\t? async () =>\n\t\t\t\t\t\t(await activePrompt.select(\"Include the Playwright test preset?\", [...BOOLEAN_PROMPT_OPTIONS], 2)) ===\n\t\t\t\t\t\t\"yes\"\n\t\t\t\t: undefined,\n\t\t\tselectWithWpEnv: activePrompt\n\t\t\t\t? async () =>\n\t\t\t\t\t\t(await activePrompt.select(\"Include a local wp-env preset?\", [...BOOLEAN_PROMPT_OPTIONS], 2)) ===\n\t\t\t\t\t\t\"yes\"\n\t\t\t\t: undefined,\n\t\t\ttemplateId: readOptionalLooseStringFlag(flags, \"template\"),\n\t\t\ttextDomain: readOptionalLooseStringFlag(flags, \"text-domain\"),\n\t\t\tvariant: readOptionalLooseStringFlag(flags, \"variant\"),\n\t\t\twithMigrationUi: flags[\"with-migration-ui\"] as boolean | undefined,\n\t\t\twithTestPreset: flags[\"with-test-preset\"] as boolean | undefined,\n\t\t\twithWpEnv: flags[\"with-wp-env\"] as boolean | undefined,\n\t\t\tyes: effectiveYes,\n\t\t});\n\n\t\tconst payload = flow.dryRun && flow.plan\n\t\t\t? buildCreateDryRunPayload({\n\t\t\t\t\tpackageManager: flow.packageManager,\n\t\t\t\t\tplan: flow.plan,\n\t\t\t\t\tprojectDir: flow.projectDir,\n\t\t\t\t\tresult: flow.result,\n\t\t\t\t})\n\t\t\t: buildCreateCompletionPayload(flow);\n\t\treturn emitCompletion(payload, { emitOutput, printLine, warnLine });\n\t} catch (error) {\n\t\tif (!shouldWrapCliCommandError({ emitOutput })) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow await wrapCliCommandError(\"create\", error);\n\t} finally {\n\t\tif (activePrompt && activePrompt !== prompt) {\n\t\t\tactivePrompt.close();\n\t\t}\n\t}\n}\n\nexport async function executeAddCommand({\n\tcwd,\n\temitOutput = true,\n\tflags,\n\tinteractive,\n\tkind,\n\tname,\n\tprintLine = console.log as PrintLine,\n\tprompt,\n\twarnLine = console.warn as PrintLine,\n}: AddExecutionInput): Promise<AlternateBufferCompletionPayload | void> {\n\tif (!kind) {\n\t\tconst { formatAddHelpText } = await loadCliAddRuntime();\n\t\tprintLine(formatAddHelpText());\n\t\treturn;\n\t}\n\n\tconst addRuntime = await loadCliAddRuntime();\n\tlet activePrompt: ReadlinePrompt | undefined;\n\tconst dryRun = Boolean(flags[\"dry-run\"]);\n\n\ttry {\n\t\tif (kind === \"variation\") {\n\t\t\tif (!name) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`wp-typia add variation` requires <name>. Usage: wp-typia add variation <name> --block <block-slug>\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst blockSlug = readOptionalStringFlag(flags, \"block\");\n\t\t\tif (!blockSlug) {\n\t\t\t\tthrow new Error(\"`wp-typia add variation` requires --block <block-slug>.\");\n\t\t\t}\n\n\t\t\tconst simulated = dryRun\n\t\t\t\t? await simulateWorkspaceAddDryRun({\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\texecute: (simulatedCwd) =>\n\t\t\t\t\t\t\taddRuntime.runAddVariationCommand({\n\t\t\t\t\t\t\t\tblockName: blockSlug,\n\t\t\t\t\t\t\t\tcwd: simulatedCwd,\n\t\t\t\t\t\t\t\tvariationName: name,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t: null;\n\t\t\tconst result =\n\t\t\t\tsimulated?.result ??\n\t\t\t\t(await addRuntime.runAddVariationCommand({\n\t\t\t\t\tblockName: blockSlug,\n\t\t\t\t\tcwd,\n\t\t\t\t\tvariationName: name,\n\t\t\t\t}));\n\t\t\tconst completion = buildAddCompletionPayload({\n\t\t\t\tkind: \"variation\",\n\t\t\t\tprojectDir: result.projectDir,\n\t\t\t\tvalues: {\n\t\t\t\t\tblockSlug: result.blockSlug,\n\t\t\t\t\tvariationSlug: result.variationSlug,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!dryRun) {\n\t\t\t\treturn emitCompletion(completion, { emitOutput, printLine });\n\t\t\t}\n\n\t\t\treturn emitCompletion(\n\t\t\t\tbuildAddDryRunPayload({\n\t\t\t\t\tcompletion,\n\t\t\t\t\tfileOperations: simulated!.fileOperations,\n\t\t\t\t}),\n\t\t\t\t{ emitOutput, printLine },\n\t\t\t);\n\t\t}\n\n\t\tif (kind === \"pattern\") {\n\t\t\tif (!name) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`wp-typia add pattern` requires <name>. Usage: wp-typia add pattern <name>.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst simulated = dryRun\n\t\t\t\t? await simulateWorkspaceAddDryRun({\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\texecute: (simulatedCwd) =>\n\t\t\t\t\t\t\taddRuntime.runAddPatternCommand({\n\t\t\t\t\t\t\t\tcwd: simulatedCwd,\n\t\t\t\t\t\t\t\tpatternName: name,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t: null;\n\t\t\tconst result =\n\t\t\t\tsimulated?.result ??\n\t\t\t\t(await addRuntime.runAddPatternCommand({\n\t\t\t\t\tcwd,\n\t\t\t\t\tpatternName: name,\n\t\t\t\t}));\n\t\t\tconst completion = buildAddCompletionPayload({\n\t\t\t\tkind: \"pattern\",\n\t\t\t\tprojectDir: result.projectDir,\n\t\t\t\tvalues: {\n\t\t\t\t\tpatternSlug: result.patternSlug,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!dryRun) {\n\t\t\t\treturn emitCompletion(completion, { emitOutput, printLine });\n\t\t\t}\n\n\t\t\treturn emitCompletion(\n\t\t\t\tbuildAddDryRunPayload({\n\t\t\t\t\tcompletion,\n\t\t\t\t\tfileOperations: simulated!.fileOperations,\n\t\t\t\t}),\n\t\t\t\t{ emitOutput, printLine },\n\t\t\t);\n\t\t}\n\n\t\tif (kind === \"binding-source\") {\n\t\t\tif (!name) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`wp-typia add binding-source` requires <name>. Usage: wp-typia add binding-source <name>.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst simulated = dryRun\n\t\t\t\t? await simulateWorkspaceAddDryRun({\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\texecute: (simulatedCwd) =>\n\t\t\t\t\t\t\taddRuntime.runAddBindingSourceCommand({\n\t\t\t\t\t\t\t\tbindingSourceName: name,\n\t\t\t\t\t\t\t\tcwd: simulatedCwd,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t: null;\n\t\t\tconst result =\n\t\t\t\tsimulated?.result ??\n\t\t\t\t(await addRuntime.runAddBindingSourceCommand({\n\t\t\t\t\tbindingSourceName: name,\n\t\t\t\t\tcwd,\n\t\t\t\t}));\n\t\t\tconst completion = buildAddCompletionPayload({\n\t\t\t\tkind: \"binding-source\",\n\t\t\t\tprojectDir: result.projectDir,\n\t\t\t\tvalues: {\n\t\t\t\t\tbindingSourceSlug: result.bindingSourceSlug,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!dryRun) {\n\t\t\t\treturn emitCompletion(completion, { emitOutput, printLine });\n\t\t\t}\n\n\t\t\treturn emitCompletion(\n\t\t\t\tbuildAddDryRunPayload({\n\t\t\t\t\tcompletion,\n\t\t\t\t\tfileOperations: simulated!.fileOperations,\n\t\t\t\t}),\n\t\t\t\t{ emitOutput, printLine },\n\t\t\t);\n\t\t}\n\n\t\tif (kind === \"rest-resource\") {\n\t\t\tif (!name) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`wp-typia add rest-resource` requires <name>. Usage: wp-typia add rest-resource <name> [--namespace <vendor/v1>] [--methods <list,read,create>].\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst methods = readOptionalStringFlag(flags, \"methods\");\n\t\t\tconst namespace = readOptionalStringFlag(flags, \"namespace\");\n\t\t\tconst simulated = dryRun\n\t\t\t\t? await simulateWorkspaceAddDryRun({\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\texecute: (simulatedCwd) =>\n\t\t\t\t\t\t\taddRuntime.runAddRestResourceCommand({\n\t\t\t\t\t\t\t\tcwd: simulatedCwd,\n\t\t\t\t\t\t\t\tmethods,\n\t\t\t\t\t\t\t\tnamespace,\n\t\t\t\t\t\t\t\trestResourceName: name,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t: null;\n\t\t\tconst result =\n\t\t\t\tsimulated?.result ??\n\t\t\t\t(await addRuntime.runAddRestResourceCommand({\n\t\t\t\t\tcwd,\n\t\t\t\t\tmethods,\n\t\t\t\t\tnamespace,\n\t\t\t\t\trestResourceName: name,\n\t\t\t\t}));\n\t\t\tconst completion = buildAddCompletionPayload({\n\t\t\t\tkind: \"rest-resource\",\n\t\t\t\tprojectDir: result.projectDir,\n\t\t\t\tvalues: {\n\t\t\t\t\tmethods: result.methods.join(\", \"),\n\t\t\t\t\tnamespace: result.namespace,\n\t\t\t\t\trestResourceSlug: result.restResourceSlug,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!dryRun) {\n\t\t\t\treturn emitCompletion(completion, { emitOutput, printLine });\n\t\t\t}\n\n\t\t\treturn emitCompletion(\n\t\t\t\tbuildAddDryRunPayload({\n\t\t\t\t\tcompletion,\n\t\t\t\t\tfileOperations: simulated!.fileOperations,\n\t\t\t\t}),\n\t\t\t\t{ emitOutput, printLine },\n\t\t\t);\n\t\t}\n\n\t\tif (kind === \"editor-plugin\") {\n\t\t\tif (!name) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`wp-typia add editor-plugin` requires <name>. Usage: wp-typia add editor-plugin <name> [--slot <PluginSidebar>].\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst slot = readOptionalStringFlag(flags, \"slot\");\n\t\t\tconst simulated = dryRun\n\t\t\t\t? await simulateWorkspaceAddDryRun({\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\texecute: (simulatedCwd) =>\n\t\t\t\t\t\t\taddRuntime.runAddEditorPluginCommand({\n\t\t\t\t\t\t\t\tcwd: simulatedCwd,\n\t\t\t\t\t\t\t\teditorPluginName: name,\n\t\t\t\t\t\t\t\tslot,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t: null;\n\t\t\tconst result =\n\t\t\t\tsimulated?.result ??\n\t\t\t\t(await addRuntime.runAddEditorPluginCommand({\n\t\t\t\t\tcwd,\n\t\t\t\t\teditorPluginName: name,\n\t\t\t\t\tslot,\n\t\t\t\t}));\n\t\t\tconst completion = buildAddCompletionPayload({\n\t\t\t\tkind: \"editor-plugin\",\n\t\t\t\tprojectDir: result.projectDir,\n\t\t\t\tvalues: {\n\t\t\t\t\teditorPluginSlug: result.editorPluginSlug,\n\t\t\t\t\tslot: result.slot,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!dryRun) {\n\t\t\t\treturn emitCompletion(completion, { emitOutput, printLine });\n\t\t\t}\n\n\t\t\treturn emitCompletion(\n\t\t\t\tbuildAddDryRunPayload({\n\t\t\t\t\tcompletion,\n\t\t\t\t\tfileOperations: simulated!.fileOperations,\n\t\t\t\t}),\n\t\t\t\t{ emitOutput, printLine },\n\t\t\t);\n\t\t}\n\n\t\tif (kind === \"hooked-block\") {\n\t\t\tif (!name) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`wp-typia add hooked-block` requires <block-slug>. Usage: wp-typia add hooked-block <block-slug> --anchor <anchor-block-name> --position <before|after|firstChild|lastChild>.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst anchorBlockName = readOptionalStringFlag(flags, \"anchor\");\n\t\t\tif (!anchorBlockName) {\n\t\t\t\tthrow new Error(\"`wp-typia add hooked-block` requires --anchor <anchor-block-name>.\");\n\t\t\t}\n\n\t\t\tconst position = readOptionalStringFlag(flags, \"position\");\n\t\t\tif (!position) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`wp-typia add hooked-block` requires --position <before|after|firstChild|lastChild>.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst simulated = dryRun\n\t\t\t\t? await simulateWorkspaceAddDryRun({\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\texecute: (simulatedCwd) =>\n\t\t\t\t\t\t\taddRuntime.runAddHookedBlockCommand({\n\t\t\t\t\t\t\t\tanchorBlockName,\n\t\t\t\t\t\t\t\tblockName: name,\n\t\t\t\t\t\t\t\tcwd: simulatedCwd,\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t: null;\n\t\t\tconst result =\n\t\t\t\tsimulated?.result ??\n\t\t\t\t(await addRuntime.runAddHookedBlockCommand({\n\t\t\t\t\tanchorBlockName,\n\t\t\t\t\tblockName: name,\n\t\t\t\t\tcwd,\n\t\t\t\t\tposition,\n\t\t\t\t}));\n\t\t\tconst completion = buildAddCompletionPayload({\n\t\t\t\tkind: \"hooked-block\",\n\t\t\t\tprojectDir: result.projectDir,\n\t\t\t\tvalues: {\n\t\t\t\t\tanchorBlockName: result.anchorBlockName,\n\t\t\t\t\tblockSlug: result.blockSlug,\n\t\t\t\t\tposition: result.position,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!dryRun) {\n\t\t\t\treturn emitCompletion(completion, { emitOutput, printLine });\n\t\t\t}\n\n\t\t\treturn emitCompletion(\n\t\t\t\tbuildAddDryRunPayload({\n\t\t\t\t\tcompletion,\n\t\t\t\t\tfileOperations: simulated!.fileOperations,\n\t\t\t\t}),\n\t\t\t\t{ emitOutput, printLine },\n\t\t\t);\n\t\t}\n\n\t\tif (kind !== \"block\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown add kind \"${kind}\". Expected one of: block, variation, pattern, binding-source, rest-resource, editor-plugin, hooked-block.`,\n\t\t\t);\n\t\t}\n\n\t\tif (!name) {\n\t\t\tthrow new Error(\n\t\t\t\t\"`wp-typia add block` requires <name>. Usage: wp-typia add block <name> --template <basic|interactivity|persistence|compound>\",\n\t\t\t);\n\t\t}\n\n\t\tif (!flags.template) {\n\t\t\tthrow new Error(\n\t\t\t\t\"`wp-typia add block` requires --template <basic|interactivity|persistence|compound>.\",\n\t\t\t);\n\t\t}\n\n\t\tconst externalLayerId = readOptionalStringFlag(flags, \"external-layer-id\");\n\t\tconst externalLayerSource = readOptionalStringFlag(flags, \"external-layer-source\");\n\t\tconst shouldPromptForLayerSelection =\n\t\t\tBoolean(externalLayerSource) &&\n\t\t\t!Boolean(externalLayerId) &&\n\t\t\t(interactive ?? (Boolean(process.stdin.isTTY) && Boolean(process.stdout.isTTY)));\n\t\tconst promptRuntime = shouldPromptForLayerSelection\n\t\t\t? await loadCliPromptRuntime()\n\t\t\t: undefined;\n\t\tactivePrompt = shouldPromptForLayerSelection\n\t\t\t? (prompt ?? promptRuntime?.createReadlinePrompt())\n\t\t\t: undefined;\n\t\tconst selectPrompt = activePrompt;\n\n\t\tconst alternateRenderTargets = readOptionalStringFlag(\n\t\t\tflags,\n\t\t\t\"alternate-render-targets\",\n\t\t);\n\t\tconst dataStorageMode = readOptionalStringFlag(flags, \"data-storage\");\n\t\tconst innerBlocksPreset = readOptionalStringFlag(flags, \"inner-blocks-preset\");\n\t\tconst persistencePolicy = readOptionalStringFlag(flags, \"persistence-policy\");\n\t\tconst resolvedTemplateId = readOptionalStringFlag(flags, \"template\") as\n\t\t\t| \"basic\"\n\t\t\t| \"interactivity\"\n\t\t\t| \"persistence\"\n\t\t\t| \"compound\";\n\n\t\tconst simulated = dryRun\n\t\t\t? await simulateWorkspaceAddDryRun({\n\t\t\t\t\tcwd,\n\t\t\t\t\texecute: (simulatedCwd) =>\n\t\t\t\t\t\taddRuntime.runAddBlockCommand({\n\t\t\t\t\t\t\talternateRenderTargets,\n\t\t\t\t\t\t\tblockName: name,\n\t\t\t\t\t\t\tcwd: simulatedCwd,\n\t\t\t\t\t\t\tdataStorageMode,\n\t\t\t\t\t\t\texternalLayerId,\n\t\t\t\t\t\t\texternalLayerSource,\n\t\t\t\t\t\t\tinnerBlocksPreset,\n\t\t\t\t\t\t\tpersistencePolicy,\n\t\t\t\t\t\t\tselectExternalLayerId: selectPrompt\n\t\t\t\t\t\t\t\t? (options) =>\n\t\t\t\t\t\t\t\t\t\tselectPrompt.select(\n\t\t\t\t\t\t\t\t\t\t\t\"Select an external layer\",\n\t\t\t\t\t\t\t\t\t\t\ttoExternalLayerPromptOptions(options),\n\t\t\t\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\ttemplateId: resolvedTemplateId,\n\t\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t: null;\n\t\tconst result =\n\t\t\tsimulated?.result ??\n\t\t\t(await addRuntime.runAddBlockCommand({\n\t\t\t\talternateRenderTargets,\n\t\t\t\tblockName: name,\n\t\t\t\tcwd,\n\t\t\t\tdataStorageMode,\n\t\t\t\texternalLayerId,\n\t\t\t\texternalLayerSource,\n\t\t\t\tinnerBlocksPreset,\n\t\t\t\tpersistencePolicy,\n\t\t\t\tselectExternalLayerId: selectPrompt\n\t\t\t\t\t? (options) =>\n\t\t\t\t\t\t\tselectPrompt.select(\n\t\t\t\t\t\t\t\t\"Select an external layer\",\n\t\t\t\t\t\t\t\ttoExternalLayerPromptOptions(options),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t: undefined,\n\t\t\t\ttemplateId: resolvedTemplateId,\n\t\t\t}));\n\n\t\tconst completion = buildAddCompletionPayload({\n\t\t\tkind: \"block\",\n\t\t\tprojectDir: result.projectDir,\n\t\t\tvalues: {\n\t\t\t\tblockSlugs: result.blockSlugs.join(\", \"),\n\t\t\t\ttemplateId: result.templateId,\n\t\t\t},\n\t\t\twarnings: result.warnings,\n\t\t});\n\t\tif (!dryRun) {\n\t\t\treturn emitCompletion(completion, { emitOutput, printLine, warnLine });\n\t\t}\n\n\t\treturn emitCompletion(\n\t\t\tbuildAddDryRunPayload({\n\t\t\t\tcompletion,\n\t\t\t\tfileOperations: simulated!.fileOperations,\n\t\t\t}),\n\t\t\t{ emitOutput, printLine, warnLine },\n\t\t);\n\t} catch (error) {\n\t\tif (!shouldWrapCliCommandError({ emitOutput })) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow await wrapCliCommandError(\"add\", error);\n\t} finally {\n\t\tif (activePrompt && activePrompt !== prompt) {\n\t\t\tactivePrompt.close();\n\t\t}\n\t}\n}\n\nexport async function executeTemplatesCommand(\n\t{ flags }: TemplatesExecutionInput,\n\tprintLine: PrintLine = console.log,\n): Promise<void> {\n\tconst {\n\t\tformatTemplateDetails,\n\t\tformatTemplateFeatures,\n\t\tformatTemplateSummary,\n\t\tgetTemplateById,\n\t\tlistTemplates,\n\t} = await loadCliTemplatesRuntime();\n\tconst subcommand = flags.subcommand ?? \"list\";\n\n\tif (subcommand === \"list\") {\n\t\tfor (const template of listTemplates()) {\n\t\t\tprintBlock(\n\t\t\t\t[formatTemplateSummary(template), formatTemplateFeatures(template)],\n\t\t\t\tprintLine,\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (subcommand === \"inspect\") {\n\t\tif (!flags.id) {\n\t\t\tthrow new Error(\"`wp-typia templates inspect` requires <template-id>.\");\n\t\t}\n\t\tconst template = getTemplateById(flags.id);\n\t\tif (!template) {\n\t\t\tthrow new Error(`Unknown template \"${flags.id}\".`);\n\t\t}\n\t\tprintBlock(\n\t\t\t[\n\t\t\t\tformatTemplateSummary(template),\n\t\t\t\tformatTemplateFeatures(template),\n\t\t\t\tformatTemplateDetails(template),\n\t\t\t],\n\t\t\tprintLine,\n\t\t);\n\t\treturn;\n\t}\n\n\tthrow new Error(`Unknown templates subcommand \"${subcommand}\". Expected list or inspect.`);\n}\n\nexport async function executeDoctorCommand(cwd: string): Promise<void> {\n\ttry {\n\t\tconst { runDoctor } = await loadCliDoctorRuntime();\n\t\tawait runDoctor(cwd);\n\t} catch (error) {\n\t\tthrow await wrapCliCommandError(\"doctor\", error);\n\t}\n}\n\nexport async function loadAddWorkspaceBlockOptions(cwd: string) {\n\tconst { tryResolveWorkspaceProject } = await loadWorkspaceProjectRuntime();\n\tconst workspace = tryResolveWorkspaceProject(cwd);\n\tif (!workspace) {\n\t\treturn [];\n\t}\n\n\tconst { getWorkspaceBlockSelectOptions } = await loadCliAddRuntime();\n\treturn getWorkspaceBlockSelectOptions(workspace.projectDir);\n}\n\nexport async function executeMigrateCommand({\n\tcommand,\n\tcwd,\n\tflags,\n\tprompt,\n\trenderLine,\n}: MigrateExecutionInput): Promise<AlternateBufferCompletionPayload | void> {\n\tconst { formatMigrationHelpText, parseMigrationArgs, runMigrationCommand } =\n\t\tawait loadMigrationsRuntime();\n\tif (!command) {\n\t\tconsole.log(formatMigrationHelpText());\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst argv = [command];\n\t\tpushFlag(argv, \"all\", flags.all);\n\t\tpushFlag(argv, \"force\", flags.force);\n\t\tpushFlag(\n\t\t\targv,\n\t\t\t\"current-migration-version\",\n\t\t\treadOptionalLooseStringFlag(flags, \"current-migration-version\"),\n\t\t);\n\t\tpushFlag(argv, \"migration-version\", readOptionalLooseStringFlag(flags, \"migration-version\"));\n\t\tpushFlag(\n\t\t\targv,\n\t\t\t\"from-migration-version\",\n\t\t\treadOptionalLooseStringFlag(flags, \"from-migration-version\"),\n\t\t);\n\t\tpushFlag(\n\t\t\targv,\n\t\t\t\"to-migration-version\",\n\t\t\treadOptionalLooseStringFlag(flags, \"to-migration-version\"),\n\t\t);\n\t\tpushFlag(argv, \"iterations\", readOptionalLooseStringFlag(flags, \"iterations\"));\n\t\tpushFlag(argv, \"seed\", readOptionalLooseStringFlag(flags, \"seed\"));\n\n\t\tconst parsed = parseMigrationArgs(argv);\n\t\tconst lines: string[] | null = renderLine ? [] : null;\n\t\tconst captureLine = (line: string) => {\n\t\t\tlines?.push(line);\n\t\t\tif (renderLine) {\n\t\t\t\trenderLine(line);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.log(line);\n\t\t};\n\t\tconst result = await runMigrationCommand(parsed, cwd, {\n\t\t\tprompt,\n\t\t\trenderLine: captureLine,\n\t\t});\n\t\tif (renderLine) {\n\t\t\treturn result && typeof result === \"object\" && \"cancelled\" in result && result.cancelled === true\n\t\t\t\t\t? undefined\n\t\t\t\t\t: buildMigrationCompletionPayload({\n\t\t\t\t\t\tcommand: parsed.command ?? \"plan\",\n\t\t\t\t\t\tlines: lines ?? [],\n\t\t\t\t\t});\n\t\t}\n\n\t\tif (result && typeof result === \"object\" && \"cancelled\" in result && result.cancelled === true) {\n\t\t\treturn;\n\t\t}\n\t} catch (error) {\n\t\tif (!shouldWrapCliCommandError({ renderLine })) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow await wrapCliCommandError(\"migrate\", error);\n\t}\n}\n\nexport async function listTemplatesForRuntime() {\n\tconst { listTemplates } = await loadCliTemplatesRuntime();\n\treturn listTemplates();\n}\n",
21
- "import { createElement, useEffect, useState, type ComponentType } from \"react\";\n\nimport {\n\tresolveLazyFlowComponent,\n\tuseAlternateBufferExitKeys,\n\tuseAlternateBufferLifecycle,\n} from \"./alternate-buffer-lifecycle\";\n\ntype LazyFlowProps<TProps> = {\n\tloader: () => Promise<{ default: ComponentType<TProps> }>;\n\tprops: TProps;\n};\n\nexport function LazyFlow<TProps>({ loader, props }: LazyFlowProps<TProps>) {\n\tconst [Component, setComponent] = useState<ComponentType<TProps> | null>(null);\n\tconst { handleFailure } = useAlternateBufferLifecycle(\"wp-typia TUI flow failed\", {\n\t\tenableExitKeys: false,\n\t});\n\n\tuseAlternateBufferExitKeys({\n\t\tenabled: Component === null,\n\t});\n\n\tuseEffect(() => {\n\t\tlet disposed = false;\n\n\t\tvoid resolveLazyFlowComponent({\n\t\t\tisDisposed: () => disposed,\n\t\t\tloader,\n\t\t\tonFailure: handleFailure,\n\t\t\tonLoaded: (component) => {\n\t\t\t\tsetComponent(() => component);\n\t\t\t},\n\t\t});\n\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t};\n\t}, [handleFailure, loader]);\n\n\tif (!Component) {\n\t\treturn null;\n\t}\n\n\treturn createElement(Component as ComponentType<any>, props as any);\n}\n",
22
- "import { useCallback, useState } from \"react\";\n\nimport { useRuntime } from \"@bunli/runtime/app\";\nimport { useKeyboard } from \"@bunli/tui\";\n\ntype AlternateBufferKeyEvent = {\n\tctrl?: boolean;\n\tsequence?: string;\n\tname?: string;\n};\n\nexport type AlternateBufferCompletionPayload = {\n\ttitle: string;\n\tpreambleLines?: string[];\n\tsummaryLines?: string[];\n\tnextSteps?: string[];\n\toptionalTitle?: string;\n\toptionalLines?: string[];\n\toptionalNote?: string;\n\twarningLines?: string[];\n};\n\nexport type AlternateBufferProgressPayload = {\n\tdescription?: string;\n\ttitle: string;\n};\n\ntype AlternateBufferFailureOptions = {\n\tcontext: string;\n\terror: unknown;\n\texit: () => void;\n\tlog?: (message: string) => void;\n};\n\ntype RunAlternateBufferActionOptions = {\n\taction: () => Promise<unknown>;\n\tcontext: string;\n\texit: () => void;\n\texitOnSuccess?: boolean;\n\tlog?: (message: string) => void;\n\tonSuccess?: (result: unknown) => void;\n};\n\ntype AlternateBufferLifecycleStatus = \"editing\" | \"submitting\" | \"completed\";\n\nexport function describeAlternateBufferFailure(context: string, error: unknown): string {\n\tconst message = error instanceof Error ? error.message : String(error);\n\treturn `${context}: ${message}`;\n}\n\nexport function isAlternateBufferExitKey(key: AlternateBufferKeyEvent): boolean {\n\treturn key.name === \"q\" || (key.ctrl === true && key.name === \"c\");\n}\n\nexport function isAlternateBufferCompletionKey(key: AlternateBufferKeyEvent): boolean {\n\treturn key.name === \"enter\" || key.sequence === \"\\r\" || key.sequence === \"\\n\";\n}\n\nexport function reportAlternateBufferFailure({\n\tcontext,\n\terror,\n\texit,\n\tlog = console.error,\n}: AlternateBufferFailureOptions): void {\n\tconst message = describeAlternateBufferFailure(context, error);\n\texit();\n\tlog(message);\n}\n\nexport async function runAlternateBufferAction({\n\taction,\n\tcontext,\n\texit,\n\texitOnSuccess = true,\n\tlog = console.error,\n\tonSuccess,\n}: RunAlternateBufferActionOptions): Promise<void> {\n\ttry {\n\t\tconst result = await action();\n\t\tonSuccess?.(result);\n\t\tif (exitOnSuccess) {\n\t\t\texit();\n\t\t}\n\t} catch (error) {\n\t\treportAlternateBufferFailure({ context, error, exit, log });\n\t}\n}\n\nexport async function resolveLazyFlowComponent<TProps>({\n\tloader,\n\tonLoaded,\n\tonFailure,\n\tisDisposed,\n}: {\n\tloader: () => Promise<{ default: React.ComponentType<TProps> }>;\n\tonLoaded: (component: React.ComponentType<TProps>) => void;\n\tonFailure: (error: unknown) => void;\n\tisDisposed: () => boolean;\n}): Promise<void> {\n\ttry {\n\t\tconst module = await loader();\n\t\tif (!isDisposed()) {\n\t\t\tonLoaded(module.default);\n\t\t}\n\t} catch (error) {\n\t\tif (!isDisposed()) {\n\t\t\tonFailure(error);\n\t\t}\n\t}\n}\n\nexport function useAlternateBufferExitKeys(options: {\n\tenabled?: boolean;\n\texit?: () => void;\n} = {}): void {\n\tconst runtime = useRuntime();\n\tconst exit = options.exit ?? (() => runtime.exit());\n\tconst enabled = options.enabled ?? true;\n\n\tuseKeyboard((key: AlternateBufferKeyEvent) => {\n\t\tif (!enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (isAlternateBufferExitKey(key)) {\n\t\t\texit();\n\t\t}\n\t});\n}\n\nexport function useAlternateBufferCompletionKeys(options: {\n\tenabled?: boolean;\n\texit?: () => void;\n} = {}): void {\n\tconst runtime = useRuntime();\n\tconst exit = options.exit ?? (() => runtime.exit());\n\tconst enabled = options.enabled ?? false;\n\n\tuseKeyboard((key: AlternateBufferKeyEvent) => {\n\t\tif (!enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (isAlternateBufferCompletionKey(key) || isAlternateBufferExitKey(key)) {\n\t\t\texit();\n\t\t}\n\t});\n}\n\nfunction isAlternateBufferCompletionPayload(\n\tvalue: unknown,\n): value is AlternateBufferCompletionPayload {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn false;\n\t}\n\n\tconst candidate = value as { title?: unknown };\n\treturn typeof candidate.title === \"string\" && candidate.title.trim().length > 0;\n}\n\nexport function useAlternateBufferLifecycle(\n\tcontext: string,\n\toptions: {\n\t\tenableExitKeys?: boolean;\n\t} = {},\n): {\n\tcompletion: AlternateBufferCompletionPayload | null;\n\thandleCancel: () => void;\n\thandleFailure: (error: unknown) => void;\n\thandleSubmit: (action: () => Promise<AlternateBufferCompletionPayload | void>) => Promise<void>;\n\tprogress: AlternateBufferProgressPayload | null;\n\treportProgress: (payload: AlternateBufferProgressPayload) => void;\n\tstatus: AlternateBufferLifecycleStatus;\n} {\n\tconst runtime = useRuntime();\n\tconst [completion, setCompletion] = useState<AlternateBufferCompletionPayload | null>(null);\n\tconst [progress, setProgress] = useState<AlternateBufferProgressPayload | null>(null);\n\tconst [status, setStatus] = useState<AlternateBufferLifecycleStatus>(\"editing\");\n\tconst exit = useCallback(() => {\n\t\truntime.exit();\n\t}, [runtime]);\n\n\tuseAlternateBufferExitKeys({\n\t\tenabled: (options.enableExitKeys ?? true) && status !== \"completed\",\n\t\texit,\n\t});\n\n\tuseAlternateBufferCompletionKeys({\n\t\tenabled: status === \"completed\",\n\t\texit,\n\t});\n\n\tconst handleCancel = useCallback(() => {\n\t\tsetCompletion(null);\n\t\tsetProgress(null);\n\t\tsetStatus(\"editing\");\n\t\texit();\n\t}, [exit]);\n\n\tconst handleFailure = useCallback(\n\t\t(error: unknown) => {\n\t\t\tsetCompletion(null);\n\t\t\tsetProgress(null);\n\t\t\tsetStatus(\"editing\");\n\t\t\treportAlternateBufferFailure({\n\t\t\t\tcontext,\n\t\t\t\terror,\n\t\t\t\texit,\n\t\t\t});\n\t\t},\n\t\t[context, exit],\n\t);\n\n\tconst handleSubmit = useCallback(\n\t\tasync (action: () => Promise<AlternateBufferCompletionPayload | void>) => {\n\t\t\tsetCompletion(null);\n\t\t\tsetProgress(null);\n\t\t\tsetStatus(\"submitting\");\n\n\t\t\ttry {\n\t\t\t\tconst result = await action();\n\t\t\t\tif (isAlternateBufferCompletionPayload(result)) {\n\t\t\t\t\tsetCompletion(result);\n\t\t\t\t\tsetProgress(null);\n\t\t\t\t\tsetStatus(\"completed\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\texit();\n\t\t\t} catch (error) {\n\t\t\t\tsetCompletion(null);\n\t\t\t\tsetProgress(null);\n\t\t\t\tsetStatus(\"editing\");\n\t\t\t\treportAlternateBufferFailure({\n\t\t\t\t\tcontext,\n\t\t\t\t\terror,\n\t\t\t\t\texit,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[context, exit],\n\t);\n\n\tconst reportProgress = useCallback((payload: AlternateBufferProgressPayload) => {\n\t\tsetProgress(payload);\n\t}, []);\n\n\treturn {\n\t\tcompletion,\n\t\thandleCancel,\n\t\thandleFailure,\n\t\thandleSubmit,\n\t\tprogress,\n\t\treportProgress,\n\t\tstatus,\n\t};\n}\n",
23
- "export type FormatType = 'markdown' | 'code' | 'emoji' | 'template'\n\n// ANSI escape codes\nconst RESET = '\\x1b[0m'\nconst BOLD = '\\x1b[1m'\nconst DIM = '\\x1b[2m'\nconst ITALIC = '\\x1b[3m'\nconst UNDERLINE = '\\x1b[4m'\nconst STRIKETHROUGH = '\\x1b[9m'\n\nfunction bold(s: string): string {\n return `${BOLD}${s}${RESET}`\n}\n\nfunction dim(s: string): string {\n return `${DIM}${s}${RESET}`\n}\n\nfunction italic(s: string): string {\n return `${ITALIC}${s}${RESET}`\n}\n\nfunction underline(s: string): string {\n return `${UNDERLINE}${s}${RESET}`\n}\n\nfunction strikethrough(s: string): string {\n return `${STRIKETHROUGH}${s}${RESET}`\n}\n\nfunction colored(s: string, r: number, g: number, b: number): string {\n return `\\x1b[38;2;${r};${g};${b}m${s}${RESET}`\n}\n\n// --- formatMarkdown ---\n\nfunction applyInlineFormats(line: string): string {\n // Bold: **text** or __text__\n line = line.replace(/\\*\\*(.+?)\\*\\*/g, (_match, content) => bold(content))\n line = line.replace(/__(.+?)__/g, (_match, content) => bold(content))\n\n // Strikethrough: ~~text~~\n line = line.replace(/~~(.+?)~~/g, (_match, content) => strikethrough(content))\n\n // Inline code: `code`\n line = line.replace(/`([^`]+)`/g, (_match, content) => dim(content))\n\n // Links: [text](url)\n line = line.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n (_match, text, url) => underline(text) + dim(` (${url})`)\n )\n\n // Italic: *text* (not bold) or _text_ (not bold)\n line = line.replace(/(?<!\\*)\\*(?!\\*)(.+?)(?<!\\*)\\*(?!\\*)/g, (_match, content) => italic(content))\n line = line.replace(/(?<!_)_(?!_)(.+?)(?<!_)_(?!_)/g, (_match, content) => italic(content))\n\n return line\n}\n\n/**\n * Format markdown text for terminal display using ANSI codes.\n */\nexport function formatMarkdown(text: string): string {\n const lines = text.split('\\n')\n const result: string[] = []\n let inCodeBlock = false\n const codeBlockLines: string[] = []\n\n for (const line of lines) {\n // Code block fences\n if (/^```/.test(line)) {\n if (inCodeBlock) {\n // End code block — render collected lines\n for (const codeLine of codeBlockLines) {\n result.push(dim(` ${codeLine}`))\n }\n codeBlockLines.length = 0\n inCodeBlock = false\n } else {\n inCodeBlock = true\n }\n continue\n }\n\n if (inCodeBlock) {\n codeBlockLines.push(line)\n continue\n }\n\n // Headers\n const headerMatch = line.match(/^(#{1,6})\\s+(.+)$/)\n if (headerMatch) {\n const level = headerMatch[1].length\n const content = headerMatch[2]\n if (level === 1) {\n result.push(bold(colored(content, 255, 255, 255)))\n } else if (level === 2) {\n result.push(bold(content))\n } else {\n result.push(bold(dim(content)))\n }\n continue\n }\n\n // Horizontal rules\n if (/^[-*_]{3,}$/.test(line)) {\n result.push('\\u2500'.repeat(40))\n continue\n }\n\n // Unordered list items\n const ulMatch = line.match(/^(\\s*)[-*+]\\s+(.+)$/)\n if (ulMatch) {\n result.push(`${ulMatch[1]}\\u2022 ${applyInlineFormats(ulMatch[2])}`)\n continue\n }\n\n // Blockquotes\n const bqMatch = line.match(/^>\\s*(.+)$/)\n if (bqMatch) {\n result.push(`\\u2502 ${italic(bqMatch[1])}`)\n continue\n }\n\n // Regular line — apply inline transforms\n result.push(applyInlineFormats(line))\n }\n\n // If code block was never closed, still render what we collected\n if (inCodeBlock) {\n for (const codeLine of codeBlockLines) {\n result.push(dim(` ${codeLine}`))\n }\n }\n\n return result.join('\\n')\n}\n\n// --- formatCode ---\n\nconst KEYWORDS = new Set([\n 'const', 'let', 'var', 'function', 'class', 'return', 'if', 'else',\n 'for', 'while', 'import', 'export', 'from', 'async', 'await',\n 'try', 'catch', 'throw', 'new', 'typeof', 'interface', 'type',\n 'enum', 'extends', 'implements', 'public', 'private', 'protected',\n 'def', 'fn', 'pub', 'use', 'mod', 'struct', 'impl', 'trait',\n])\n\n/**\n * Format code with basic syntax highlighting for terminal display.\n */\nexport function formatCode(code: string, _language?: string): string {\n const lines = code.split('\\n')\n const result: string[] = []\n\n for (const line of lines) {\n // Full-line comments\n const trimmed = line.trimStart()\n if (trimmed.startsWith('//') || trimmed.startsWith('#')) {\n result.push(dim(line))\n continue\n }\n\n let formatted = ''\n let i = 0\n while (i < line.length) {\n const ch = line[i]\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n const quote = ch\n let str = quote\n i++\n while (i < line.length && line[i] !== quote) {\n if (line[i] === '\\\\' && i + 1 < line.length) {\n str += line[i] + line[i + 1]\n i += 2\n } else {\n str += line[i]\n i++\n }\n }\n if (i < line.length) {\n str += line[i]\n i++\n }\n formatted += colored(str, 80, 200, 120) // green\n continue\n }\n\n // Numbers\n if (/[0-9]/.test(ch) && (i === 0 || /[\\s(=,+\\-*/]/.test(line[i - 1]))) {\n let num = ''\n while (i < line.length && /[0-9._]/.test(line[i])) {\n num += line[i]\n i++\n }\n formatted += colored(num, 230, 200, 80) // yellow\n continue\n }\n\n // Words (potential keywords)\n if (/[a-zA-Z_]/.test(ch)) {\n let word = ''\n while (i < line.length && /[a-zA-Z0-9_]/.test(line[i])) {\n word += line[i]\n i++\n }\n if (KEYWORDS.has(word)) {\n formatted += colored(word, 100, 150, 255) // blue\n } else {\n formatted += word\n }\n continue\n }\n\n // Inline comment\n if (ch === '/' && i + 1 < line.length && line[i + 1] === '/') {\n formatted += dim(line.slice(i))\n i = line.length\n continue\n }\n\n formatted += ch\n i++\n }\n\n result.push(formatted)\n }\n\n return result.join('\\n')\n}\n\n// --- formatEmoji ---\n\nconst EMOJI_MAP: Record<string, string> = {\n ':smile:': '\\u{1F604}',\n ':laughing:': '\\u{1F606}',\n ':wink:': '\\u{1F609}',\n ':heart:': '\\u2764\\uFE0F',\n ':fire:': '\\u{1F525}',\n ':rocket:': '\\u{1F680}',\n ':check:': '\\u2705',\n ':x:': '\\u274C',\n ':warning:': '\\u26A0\\uFE0F',\n ':star:': '\\u2B50',\n ':thumbsup:': '\\u{1F44D}',\n ':thumbsdown:': '\\u{1F44E}',\n ':wave:': '\\u{1F44B}',\n ':clap:': '\\u{1F44F}',\n ':eyes:': '\\u{1F440}',\n ':tada:': '\\u{1F389}',\n ':bug:': '\\u{1F41B}',\n ':wrench:': '\\u{1F527}',\n ':lock:': '\\u{1F512}',\n ':key:': '\\u{1F511}',\n ':bulb:': '\\u{1F4A1}',\n ':memo:': '\\u{1F4DD}',\n ':link:': '\\u{1F517}',\n ':package:': '\\u{1F4E6}',\n ':sparkles:': '\\u2728',\n ':zap:': '\\u26A1',\n ':gear:': '\\u2699\\uFE0F',\n ':earth:': '\\u{1F30D}',\n ':clock:': '\\u{1F552}',\n ':question:': '\\u2753',\n ':exclamation:': '\\u2757',\n ':pin:': '\\u{1F4CC}',\n ':bell:': '\\u{1F514}',\n ':gem:': '\\u{1F48E}',\n ':shield:': '\\u{1F6E1}\\uFE0F',\n}\n\n/**\n * Replace emoji shortcodes with unicode emoji.\n */\nexport function formatEmoji(text: string): string {\n return text.replace(/:([a-z_]+):/g, (match) => EMOJI_MAP[match] ?? match)\n}\n\n// --- format dispatcher ---\n\n/**\n * Apply a named format type.\n */\nexport function format(text: string, type: FormatType): string {\n switch (type) {\n case 'markdown':\n return formatMarkdown(text)\n case 'code':\n return formatCode(text)\n case 'emoji':\n return formatEmoji(text)\n case 'template':\n return text\n }\n}\n",
24
- "import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport { FormContext, type FormFieldRegistration } from './form-context.js'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { validateFormValues, type FormErrors } from './form-engine.js'\nimport { createKeyMatcher } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface FormProps<TSchema extends StandardSchemaV1 = StandardSchemaV1> {\n title: string\n schema: TSchema\n onSubmit: (values: StandardSchemaV1.InferOutput<TSchema>) => void | Promise<void>\n onCancel?: () => void\n onReset?: () => void\n onValidationError?: (errors: FormErrors) => void\n onDirtyChange?: (isDirty: boolean, dirtyFields: string[]) => void\n onSubmitStateChange?: (state: { isSubmitting: boolean; isValidating: boolean }) => void\n initialValues?: Partial<StandardSchemaV1.InferOutput<TSchema>>\n validateOnChange?: boolean\n submitHint?: string\n resetHint?: string\n scopeId?: string\n children: React.ReactNode\n}\n\nconst formKeymap = createKeyMatcher({\n cancel: ['escape'],\n nextField: ['tab'],\n previousField: ['shift+tab'],\n submitShortcut: ['ctrl+s'],\n resetShortcut: ['ctrl+r'],\n nextError: ['f8'],\n previousError: ['shift+f8'],\n submit: ['enter']\n})\n\nfunction areValuesEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true\n\n if (\n typeof left === 'object' &&\n left !== null &&\n typeof right === 'object' &&\n right !== null\n ) {\n try {\n return JSON.stringify(left) === JSON.stringify(right)\n } catch {\n return false\n }\n }\n\n return false\n}\n\nexport function Form<TSchema extends StandardSchemaV1>({\n title,\n schema,\n onSubmit,\n onCancel,\n onReset,\n onValidationError,\n onDirtyChange,\n onSubmitStateChange,\n initialValues,\n validateOnChange = true,\n submitHint,\n resetHint,\n scopeId,\n children\n}: FormProps<TSchema>) {\n const { tokens } = useTuiTheme()\n const keyboardScopeId = scopeId ?? `form:${title}`\n const initialValuesRef = useRef<Record<string, unknown>>({\n ...(initialValues as Record<string, unknown> | undefined)\n })\n\n const [values, setValues] = useState<Record<string, unknown>>(\n () => ({ ...initialValuesRef.current })\n )\n const valuesRef = useRef(values)\n const [errors, setErrors] = useState<FormErrors>({})\n const [touched, setTouched] = useState<Record<string, boolean>>({})\n const [fieldDefaults, setFieldDefaults] = useState<Record<string, unknown>>({})\n const [fieldOrder, setFieldOrder] = useState<string[]>([])\n const [fieldMeta, setFieldMeta] = useState<Record<string, FormFieldRegistration>>({})\n const [focusIndex, setFocusIndex] = useState(0)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isValidating, setIsValidating] = useState(false)\n\n const activeFieldName = fieldOrder[focusIndex] ?? null\n\n useEffect(() => {\n setFocusIndex((prev) => {\n if (fieldOrder.length === 0) return 0\n return Math.min(prev, fieldOrder.length - 1)\n })\n }, [fieldOrder])\n\n useEffect(() => {\n valuesRef.current = values\n }, [values])\n\n const baselineValues = useMemo(\n () => ({ ...fieldDefaults, ...initialValuesRef.current }),\n [fieldDefaults]\n )\n\n const dirtyFields = useMemo(() => {\n const keys = new Set<string>([\n ...Object.keys(baselineValues),\n ...Object.keys(values)\n ])\n\n const next: Record<string, boolean> = {}\n for (const key of keys) {\n next[key] = !areValuesEqual(values[key], baselineValues[key])\n }\n return next\n }, [baselineValues, values])\n\n const isDirty = useMemo(\n () => Object.values(dirtyFields).some(Boolean),\n [dirtyFields]\n )\n\n useEffect(() => {\n onDirtyChange?.(\n isDirty,\n Object.entries(dirtyFields)\n .filter(([, dirty]) => dirty)\n .map(([name]) => name)\n )\n }, [dirtyFields, isDirty, onDirtyChange])\n\n useEffect(() => {\n onSubmitStateChange?.({ isSubmitting, isValidating })\n }, [isSubmitting, isValidating, onSubmitStateChange])\n\n const registerField = useCallback((field: FormFieldRegistration) => {\n setFieldMeta((prev) => {\n if (prev[field.name]) return prev\n return { ...prev, [field.name]: field }\n })\n\n setFieldOrder((prev) => {\n if (prev.includes(field.name)) return prev\n return [...prev, field.name]\n })\n\n if (field.defaultValue !== undefined) {\n setFieldDefaults((prev) => {\n if (prev[field.name] !== undefined) return prev\n return { ...prev, [field.name]: field.defaultValue }\n })\n\n setValues((prev) => {\n if (prev[field.name] !== undefined) return prev\n return { ...prev, [field.name]: field.defaultValue }\n })\n }\n }, [])\n\n const unregisterField = useCallback((name: string) => {\n setFieldMeta((prev) => {\n if (!prev[name]) return prev\n const next = { ...prev }\n delete next[name]\n return next\n })\n\n setFieldOrder((prev) => prev.filter((fieldName) => fieldName !== name))\n setTouched((prev) => {\n if (!prev[name]) return prev\n const next = { ...prev }\n delete next[name]\n return next\n })\n setErrors((prev) => {\n if (!prev[name]) return prev\n const next = { ...prev }\n delete next[name]\n return next\n })\n }, [])\n\n const runValidation = useCallback(\n async (nextValues: Record<string, unknown>, notify: boolean) => {\n setIsValidating(true)\n try {\n const result = await validateFormValues(schema, nextValues)\n if (result.ok) {\n setErrors({})\n return result\n }\n\n setErrors(result.errors)\n if (notify) {\n onValidationError?.(result.errors)\n }\n return result\n } finally {\n setIsValidating(false)\n }\n },\n [schema, onValidationError]\n )\n\n const setFieldValue = useCallback(\n (name: string, value: unknown) => {\n const nextValues = { ...valuesRef.current, [name]: value }\n valuesRef.current = nextValues\n setValues(nextValues)\n setTouched((prev) => ({ ...prev, [name]: true }))\n if (validateOnChange) {\n void runValidation(nextValues, false)\n }\n },\n [runValidation, validateOnChange]\n )\n\n const markTouched = useCallback((name: string) => {\n setTouched((prev) => ({ ...prev, [name]: true }))\n }, [])\n\n const focusField = useCallback((name: string) => {\n const idx = fieldOrder.indexOf(name)\n if (idx >= 0) {\n setFocusIndex(idx)\n }\n }, [fieldOrder])\n\n const getErrorFields = useCallback((): string[] => {\n return fieldOrder.filter((name) => Boolean(errors[name]))\n }, [errors, fieldOrder])\n\n const focusFirstErrorField = useCallback(\n (nextErrors: FormErrors) => {\n const firstInOrder = fieldOrder.find((name) => Boolean(nextErrors[name]))\n if (firstInOrder) {\n focusField(firstInOrder)\n return\n }\n\n const fallback = Object.keys(nextErrors).find((name) => name !== '_form')\n if (fallback) {\n focusField(fallback)\n }\n },\n [fieldOrder, focusField]\n )\n\n const submit = useCallback(() => {\n void (async () => {\n const result = await runValidation(values, true)\n if (!result.ok) {\n focusFirstErrorField(result.errors)\n return\n }\n\n setIsSubmitting(true)\n try {\n await onSubmit(result.value as StandardSchemaV1.InferOutput<TSchema>)\n } finally {\n setIsSubmitting(false)\n }\n })()\n }, [focusFirstErrorField, onSubmit, runValidation, values])\n\n const reset = useCallback(() => {\n const nextValues = { ...baselineValues }\n setValues(nextValues)\n setTouched({})\n setErrors({})\n setFocusIndex(0)\n onReset?.()\n }, [baselineValues, onReset])\n\n const jumpToNextError = useCallback(() => {\n const errorFields = getErrorFields()\n if (errorFields.length === 0) return\n\n if (!activeFieldName) {\n focusField(errorFields[0] ?? '')\n return\n }\n\n const currentIndex = errorFields.indexOf(activeFieldName)\n const next = errorFields[(currentIndex + 1 + errorFields.length) % errorFields.length]\n if (next) {\n focusField(next)\n }\n }, [activeFieldName, focusField, getErrorFields])\n\n const jumpToPreviousError = useCallback(() => {\n const errorFields = getErrorFields()\n if (errorFields.length === 0) return\n\n if (!activeFieldName) {\n focusField(errorFields[errorFields.length - 1] ?? '')\n return\n }\n\n const currentIndex = errorFields.indexOf(activeFieldName)\n const prev = errorFields[(currentIndex - 1 + errorFields.length) % errorFields.length]\n if (prev) {\n focusField(prev)\n }\n }, [activeFieldName, focusField, getErrorFields])\n\n const isActiveScope = useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (formKeymap.match('cancel', key)) {\n onCancel?.()\n return true\n }\n\n if (formKeymap.match('nextField', key) || formKeymap.match('previousField', key)) {\n if (fieldOrder.length === 0) return\n setFocusIndex((prev) => {\n const delta = formKeymap.match('previousField', key) ? -1 : 1\n const next = prev + delta\n if (next < 0) return fieldOrder.length - 1\n if (next >= fieldOrder.length) return 0\n return next\n })\n return true\n }\n\n if (formKeymap.match('submitShortcut', key)) {\n submit()\n return true\n }\n\n if (formKeymap.match('resetShortcut', key)) {\n reset()\n return true\n }\n\n if (formKeymap.match('previousError', key)) {\n jumpToPreviousError()\n return true\n }\n\n if (formKeymap.match('nextError', key)) {\n jumpToNextError()\n return true\n }\n\n if (formKeymap.match('submit', key)) {\n if (activeFieldName) {\n const activeField = fieldMeta[activeFieldName]\n if (activeField?.submitOnEnter === false) return false\n }\n submit()\n return true\n }\n\n return false\n },\n { active: true, priority: 10 }\n )\n\n const footerMessage = useMemo(() => {\n if (isSubmitting) return 'Submitting...'\n if (isValidating) return 'Validating...'\n if (errors._form) return `Validation error: ${errors._form}`\n if (submitHint) return submitHint\n\n const dirtyLabel = isDirty ? 'dirty' : 'clean'\n return `Tab: next field | Enter: submit | Esc: cancel | Ctrl+S: submit | Ctrl+R: reset (${dirtyLabel}) | F8: next error`\n }, [errors._form, isDirty, isSubmitting, isValidating, submitHint])\n\n const contextValue = useMemo(\n () => ({\n values,\n errors,\n touched,\n dirtyFields,\n isDirty,\n isSubmitting,\n isValidating,\n keyboardScopeId,\n activeFieldName,\n registerField,\n unregisterField,\n setFieldValue,\n markTouched,\n focusField,\n submit,\n reset,\n getErrorFields,\n jumpToNextError,\n jumpToPreviousError\n }),\n [\n activeFieldName,\n dirtyFields,\n errors,\n focusField,\n getErrorFields,\n isDirty,\n isSubmitting,\n isValidating,\n jumpToNextError,\n jumpToPreviousError,\n keyboardScopeId,\n markTouched,\n registerField,\n reset,\n setFieldValue,\n submit,\n touched,\n unregisterField,\n values\n ]\n )\n\n return (\n <FormContext.Provider value={contextValue}>\n <box\n title={title}\n border\n padding={2}\n style={{\n flexDirection: 'column',\n borderColor: isActiveScope ? tokens.accent : tokens.border,\n backgroundColor: tokens.background\n }}\n >\n {children}\n <box style={{ flexDirection: 'row', gap: 2, marginTop: 2 }}>\n <text\n content={footerMessage}\n fg={errors._form ? tokens.textDanger : isDirty ? tokens.accent : tokens.textMuted}\n />\n {resetHint ? <text content={resetHint} fg={tokens.textMuted} /> : null}\n </box>\n </box>\n </FormContext.Provider>\n )\n}\n",
25
- "import { createContext, useCallback, useContext, useEffect } from 'react'\nimport type { FormErrors } from './form-engine.js'\n\nexport interface FormFieldRegistration {\n name: string\n defaultValue?: unknown\n submitOnEnter?: boolean\n}\n\nexport interface FormContextValue {\n values: Record<string, unknown>\n errors: FormErrors\n touched: Record<string, boolean>\n dirtyFields: Record<string, boolean>\n isDirty: boolean\n isSubmitting: boolean\n isValidating: boolean\n keyboardScopeId: string\n activeFieldName: string | null\n registerField: (field: FormFieldRegistration) => void\n unregisterField: (name: string) => void\n setFieldValue: (name: string, value: unknown) => void\n markTouched: (name: string) => void\n focusField: (name: string) => void\n submit: () => void\n reset: () => void\n getErrorFields: () => string[]\n jumpToNextError: () => void\n jumpToPreviousError: () => void\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null)\n\nexport function useFormContext(): FormContextValue {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('Interactive form fields must be rendered inside <Form>.')\n }\n return context\n}\n\nexport interface UseFormFieldOptions<T> {\n defaultValue?: T\n submitOnEnter?: boolean\n}\n\nexport interface UseFormFieldResult<T> {\n value: T\n error?: string\n touched: boolean\n focused: boolean\n setValue: (value: T) => void\n focus: () => void\n blur: () => void\n}\n\nexport function useFormField<T = unknown>(\n name: string,\n options: UseFormFieldOptions<T> = {}\n): UseFormFieldResult<T> {\n const context = useFormContext()\n const { registerField, unregisterField, setFieldValue, focusField, markTouched } = context\n\n useEffect(() => {\n registerField({\n name,\n defaultValue: options.defaultValue,\n submitOnEnter: options.submitOnEnter\n })\n\n return () => {\n unregisterField(name)\n }\n }, [name, options.defaultValue, options.submitOnEnter, registerField, unregisterField])\n\n const setValue = useCallback(\n (value: T) => {\n setFieldValue(name, value)\n },\n [name, setFieldValue]\n )\n\n const focus = useCallback(() => {\n focusField(name)\n }, [focusField, name])\n\n const blur = useCallback(() => {\n markTouched(name)\n }, [markTouched, name])\n\n const value = (context.values[name] ?? options.defaultValue ?? '') as T\n\n return {\n value,\n error: context.errors[name],\n touched: Boolean(context.touched[name]),\n focused: context.activeFieldName === name,\n setValue,\n focus,\n blur\n }\n}\n",
26
- "import { useCallback } from 'react'\nimport { useFormField } from './form-context.js'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface FormFieldProps {\n label: string\n name: string\n placeholder?: string\n required?: boolean\n description?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSubmit?: (value: string) => void\n prompt?: string\n charLimit?: number\n showCharCount?: boolean\n width?: number\n}\n\nexport function FormField({\n label,\n name,\n placeholder,\n required,\n description,\n defaultValue = '',\n onChange,\n onSubmit,\n prompt,\n charLimit,\n showCharCount = false,\n width\n}: FormFieldProps) {\n const { tokens } = useTuiTheme()\n const field = useFormField<string>(name, {\n defaultValue,\n submitOnEnter: true\n })\n\n const handleInput = useCallback((newValue: string) => {\n if (charLimit && newValue.length > charLimit) {\n newValue = newValue.slice(0, charLimit)\n }\n field.setValue(newValue)\n onChange?.(newValue)\n }, [field, onChange, charLimit])\n\n const handleSubmit = useCallback(() => {\n const submittedValue = field.value ?? ''\n field.setValue(submittedValue)\n field.blur()\n onSubmit?.(submittedValue)\n }, [field, onSubmit])\n\n const currentLength = (field.value ?? '').length\n\n return (\n <box style={{ flexDirection: 'column', marginBottom: 1, gap: 1 }}>\n <text\n content={`${field.focused ? '>' : ' '} ${label}${required ? ' *' : ''}`}\n fg={field.focused ? tokens.accent : tokens.textPrimary}\n />\n {description ? <text content={description} fg={tokens.textMuted} /> : null}\n <box\n title={label}\n border\n height={3}\n width={width}\n style={{\n marginTop: 0.5,\n borderColor: field.error ? tokens.textDanger : field.focused ? tokens.accent : tokens.borderMuted\n }}\n >\n {prompt ? (\n <box style={{ flexDirection: 'row' }}>\n <text content={prompt} fg={tokens.accent} />\n <input\n value={field.value ?? ''}\n placeholder={placeholder}\n onInput={handleInput}\n onSubmit={handleSubmit}\n focused={field.focused}\n style={{ focusedBackgroundColor: tokens.backgroundMuted, flexGrow: 1 }}\n />\n </box>\n ) : (\n <input\n value={field.value ?? ''}\n placeholder={placeholder}\n onInput={handleInput}\n onSubmit={handleSubmit}\n focused={field.focused}\n style={{\n focusedBackgroundColor: tokens.backgroundMuted\n }}\n />\n )}\n </box>\n {showCharCount && (\n <text\n content={charLimit ? `${currentLength}/${charLimit}` : `${currentLength} chars`}\n fg={charLimit && currentLength >= charLimit ? tokens.textWarning : tokens.textMuted}\n />\n )}\n {field.error ? <text content={field.error} fg={tokens.textDanger} /> : null}\n </box>\n )\n}\n",
27
- "import { useCallback, useMemo } from 'react'\nimport type { SelectOption } from '@opentui/core'\nimport { useFormField } from './form-context.js'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface SelectFieldProps {\n label: string\n name: string\n options: SelectOption[]\n required?: boolean\n description?: string\n defaultValue?: SelectOption['value']\n onChange?: (value: SelectOption['value']) => void\n}\n\nexport function SelectField({ \n label, \n name, \n options,\n required,\n description,\n defaultValue,\n onChange\n}: SelectFieldProps) {\n const { tokens } = useTuiTheme()\n const initialValue = defaultValue ?? options[0]?.value\n\n const field = useFormField<SelectOption['value']>(name, {\n defaultValue: initialValue,\n submitOnEnter: false\n })\n\n const selectedIndex = useMemo(() => {\n const index = options.findIndex((option) => option.value === field.value)\n if (index >= 0) return index\n return 0\n }, [field.value, options])\n\n const handleChange = useCallback((index: number, option: SelectOption | null) => {\n if (!option) return\n field.setValue(option.value)\n field.blur()\n onChange?.(option.value)\n }, [field, onChange])\n\n return (\n <box style={{ flexDirection: 'column', marginBottom: 1, gap: 1 }}>\n <text\n content={`${field.focused ? '>' : ' '} ${label}${required ? ' *' : ''}`}\n fg={field.focused ? tokens.accent : tokens.textPrimary}\n />\n {description ? <text content={description} fg={tokens.textMuted} /> : null}\n <box\n width='100%'\n border\n height={8}\n style={{\n marginTop: 0.5,\n borderColor: field.error ? tokens.textDanger : field.focused ? tokens.accent : tokens.borderMuted\n }}\n >\n <select\n options={options}\n selectedIndex={selectedIndex}\n onChange={handleChange}\n focused={field.focused}\n style={{\n flexGrow: 1\n }}\n />\n </box>\n {field.error ? <text content={field.error} fg={tokens.textDanger} /> : null}\n </box>\n )\n}\n",
28
- "import { useId, useMemo, useState } from 'react'\nimport type { SelectOption } from '@opentui/core'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { useFormField } from './form-context.js'\nimport { createKeyMatcher } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface MultiSelectOption extends SelectOption {\n label?: string\n hint?: string\n disabled?: boolean\n}\n\nexport interface MultiSelectFieldProps {\n label: string\n name: string\n options: MultiSelectOption[]\n required?: boolean\n description?: string\n defaultValue?: Array<SelectOption['value']>\n scopeId?: string\n}\n\nfunction nextEnabledIndex(options: MultiSelectOption[], from: number, delta: number): number {\n if (options.length === 0) return 0\n for (let step = 0; step < options.length; step += 1) {\n const next = (from + delta * (step + 1) + options.length) % options.length\n if (!options[next]?.disabled) return next\n }\n return from\n}\n\nconst multiSelectKeymap = createKeyMatcher({\n up: ['up', 'k'],\n down: ['down', 'j'],\n toggle: ['space'],\n submit: ['enter']\n})\n\nexport function MultiSelectField({\n label,\n name,\n options,\n required,\n description,\n defaultValue = [],\n scopeId\n}: MultiSelectFieldProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const field = useFormField<Array<SelectOption['value']>>(name, {\n defaultValue,\n submitOnEnter: false\n })\n const keyboardScopeId = scopeId ?? `multiselect:${name}:${reactScopeId}`\n const [activeIndex, setActiveIndex] = useState(() => options.findIndex((option) => !option.disabled))\n const selectedSet = useMemo(() => new Set(field.value ?? []), [field.value])\n\n const commit = (next: Set<SelectOption['value']>) => {\n field.setValue(\n options\n .filter((option) => next.has(option.value))\n .map((option) => option.value)\n )\n field.blur()\n }\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (!field.focused) return false\n\n if (multiSelectKeymap.match('up', key)) {\n setActiveIndex((prev) => nextEnabledIndex(options, prev, -1))\n return true\n }\n\n if (multiSelectKeymap.match('down', key)) {\n setActiveIndex((prev) => nextEnabledIndex(options, prev, 1))\n return true\n }\n\n if (multiSelectKeymap.match('toggle', key)) {\n const option = options[activeIndex]\n if (!option || option.disabled) return false\n const next = new Set(selectedSet)\n if (next.has(option.value)) {\n next.delete(option.value)\n } else {\n next.add(option.value)\n }\n commit(next)\n return true\n }\n\n if (multiSelectKeymap.match('submit', key)) {\n if (!required || selectedSet.size > 0) {\n field.blur()\n return true\n }\n }\n\n return false\n },\n { active: field.focused }\n )\n\n return (\n <box style={{ flexDirection: 'column', marginBottom: 1, gap: 1 }}>\n <text content={`${label}${required ? ' *' : ''}`} fg={tokens.textPrimary} />\n {description ? <text content={description} fg={tokens.textMuted} /> : null}\n <box border padding={1} style={{ flexDirection: 'column', gap: 1, borderColor: field.error ? tokens.textDanger : tokens.borderMuted }}>\n {options.map((option, index) => {\n const focused = field.focused && index === activeIndex\n const selected = selectedSet.has(option.value)\n const marker = selected ? '[x]' : '[ ]'\n const labelText = option.label ?? option.name\n const hintText = option.hint ?? option.description\n const disabled = option.disabled ? ' [disabled]' : ''\n return (\n <text\n key={`${name}-${option.value}`}\n content={`${focused ? '>' : ' '} ${marker} ${labelText}${hintText ? ` - ${hintText}` : ''}${disabled}`}\n fg={option.disabled ? tokens.textMuted : focused ? tokens.accent : tokens.textPrimary}\n />\n )\n })}\n </box>\n {field.error ? <text content={field.error} fg={tokens.textDanger} /> : null}\n </box>\n )\n}\n",
29
- "import { useCallback, useEffect, useState } from 'react'\nimport { useFormField } from './form-context.js'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface NumberFieldProps {\n label: string\n name: string\n placeholder?: string\n required?: boolean\n description?: string\n defaultValue?: number\n onChange?: (value: number | undefined) => void\n}\n\nexport function NumberField({\n label,\n name,\n placeholder,\n required,\n description,\n defaultValue,\n onChange\n}: NumberFieldProps) {\n const { tokens } = useTuiTheme()\n const field = useFormField<number | undefined>(name, {\n defaultValue,\n submitOnEnter: true\n })\n const [draft, setDraft] = useState(() =>\n typeof field.value === 'number' && Number.isFinite(field.value) ? String(field.value) : ''\n )\n\n useEffect(() => {\n if (typeof field.value === 'number' && Number.isFinite(field.value)) {\n setDraft(String(field.value))\n return\n }\n setDraft('')\n }, [field.value])\n\n const handleInput = useCallback(\n (value: string) => {\n setDraft(value)\n const trimmed = value.trim()\n if (!trimmed) {\n field.setValue(undefined)\n onChange?.(undefined)\n return\n }\n\n const parsed = Number(trimmed)\n if (!Number.isNaN(parsed)) {\n field.setValue(parsed)\n onChange?.(parsed)\n }\n },\n [field, onChange]\n )\n\n return (\n <box style={{ flexDirection: 'column', marginBottom: 1, gap: 1 }}>\n <text content={`${label}${required ? ' *' : ''}`} fg={tokens.textPrimary} />\n {description ? <text content={description} fg={tokens.textMuted} /> : null}\n <box border height={3} style={{ borderColor: field.error ? tokens.textDanger : tokens.borderMuted }}>\n <input\n value={draft}\n placeholder={placeholder}\n onInput={handleInput}\n focused={field.focused}\n style={{ focusedBackgroundColor: tokens.backgroundMuted }}\n />\n </box>\n {field.error ? <text content={field.error} fg={tokens.textDanger} /> : null}\n </box>\n )\n}\n",
30
- "import { useCallback, useMemo, useState } from 'react'\nimport { useFormContext, useFormField } from './form-context.js'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface PasswordFieldProps {\n label: string\n name: string\n placeholder?: string\n required?: boolean\n description?: string\n defaultValue?: string\n onChange?: (value: string) => void\n}\n\nfunction mask(value: string): string {\n return '*'.repeat(value.length)\n}\n\nfunction resolveTextInput(sequence: string): string {\n const normalized = sequence\n .replace(/\\u001b\\[200~/g, '')\n .replace(/\\u001b\\[201~/g, '')\n .replace(/\\r\\n/g, '')\n .replace(/[\\r\\n]/g, '')\n\n let output = ''\n for (const char of normalized) {\n const codePoint = char.codePointAt(0)\n if (typeof codePoint !== 'number') continue\n if (codePoint < 0x20 || codePoint === 0x7f) continue\n output += char\n }\n return output\n}\n\nexport function PasswordField({\n label,\n name,\n placeholder,\n required,\n description,\n defaultValue = '',\n onChange\n}: PasswordFieldProps) {\n const { tokens } = useTuiTheme()\n const { keyboardScopeId } = useFormContext()\n const field = useFormField<string>(name, {\n defaultValue,\n submitOnEnter: true\n })\n const [revealed, setRevealed] = useState(false)\n\n const handleInput = useCallback((value: string) => {\n field.setValue(value)\n onChange?.(value)\n }, [field, onChange])\n\n const value = field.value ?? ''\n const visibleValue = revealed ? value : mask(value)\n const display = useMemo(() => {\n const base =\n value.length > 0\n ? visibleValue\n : (placeholder ?? '')\n if (field.focused) return `${base}▌`\n return base\n }, [field.focused, placeholder, value.length, visibleValue])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (!field.focused) return false\n\n if (key.ctrl && key.name === 'r') {\n setRevealed((prev) => !prev)\n return true\n }\n\n if (key.name === 'backspace' || key.name === 'delete') {\n if (value.length === 0) return true\n handleInput(value.slice(0, -1))\n return true\n }\n\n if (key.ctrl || key.meta || key.option) {\n return false\n }\n\n const typed = resolveTextInput(key.sequence ?? '')\n if (typed.length > 0) {\n handleInput(`${value}${typed}`)\n return true\n }\n\n return false\n },\n { active: field.focused, priority: 10 }\n )\n\n return (\n <box style={{ flexDirection: 'column', marginBottom: 1, gap: 1 }}>\n <text\n content={`${field.focused ? '>' : ' '} ${label}${required ? ' *' : ''}`}\n fg={field.focused ? tokens.accent : tokens.textPrimary}\n />\n {description ? <text content={description} fg={tokens.textMuted} /> : null}\n <box\n border\n height={3}\n style={{ borderColor: field.error ? tokens.textDanger : field.focused ? tokens.accent : tokens.borderMuted }}\n >\n <box style={{ backgroundColor: field.focused ? tokens.backgroundMuted : tokens.background }}>\n <text\n content={display}\n fg={value.length === 0 ? tokens.textMuted : tokens.textPrimary}\n />\n </box>\n </box>\n <text content={`Value: ${mask(value)} ${revealed ? '(revealed)' : '(hidden, Ctrl+R reveal)'}`} fg={tokens.textMuted} />\n {field.error ? <text content={field.error} fg={tokens.textDanger} /> : null}\n </box>\n )\n}\n",
31
- "import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { TextareaRenderable } from '@opentui/core'\nimport { useFormField } from './form-context.js'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface TextareaFieldProps {\n label: string\n name: string\n placeholder?: string\n required?: boolean\n description?: string\n defaultValue?: string\n showLineNumbers?: boolean\n maxLines?: number\n charLimit?: number\n showCharCount?: boolean\n height?: number\n}\n\nexport function TextareaField({\n label,\n name,\n placeholder,\n required,\n description,\n defaultValue = '',\n showLineNumbers = false,\n maxLines,\n charLimit,\n showCharCount = false,\n height\n}: TextareaFieldProps) {\n const { tokens } = useTuiTheme()\n const field = useFormField<string>(name, {\n defaultValue,\n submitOnEnter: false\n })\n const ref = useRef<TextareaRenderable | null>(null)\n const [charCount, setCharCount] = useState(defaultValue.length)\n const [lineCount, setLineCount] = useState(1)\n\n const syncFromBuffer = useCallback(() => {\n let value = ref.current?.plainText ?? ''\n\n if (maxLines) {\n const lines = value.split('\\n')\n if (lines.length > maxLines) {\n value = lines.slice(0, maxLines).join('\\n')\n ref.current?.setText(value)\n }\n }\n\n if (charLimit && value.length > charLimit) {\n value = value.slice(0, charLimit)\n ref.current?.setText(value)\n }\n\n field.setValue(value)\n setCharCount(value.length)\n setLineCount(value.split('\\n').length)\n }, [field, maxLines, charLimit])\n\n useEffect(() => {\n const nextValue = field.value ?? ''\n const currentValue = ref.current?.plainText ?? ''\n if (currentValue !== nextValue) {\n ref.current?.setText(nextValue)\n }\n }, [field.value])\n\n return (\n <box style={{ flexDirection: 'column', marginBottom: 1, gap: 1 }}>\n <text content={`${label}${required ? ' *' : ''}`} fg={tokens.textPrimary} />\n {description ? <text content={description} fg={tokens.textMuted} /> : null}\n <box border height={height ?? 7} style={{ borderColor: field.error ? tokens.textDanger : tokens.borderMuted }}>\n <textarea\n ref={ref}\n initialValue={field.value ?? defaultValue}\n placeholder={placeholder}\n focused={field.focused}\n onContentChange={syncFromBuffer}\n onSubmit={() => {\n syncFromBuffer()\n field.blur()\n }}\n style={{\n focusedBackgroundColor: tokens.backgroundMuted\n }}\n />\n </box>\n {(showLineNumbers || showCharCount) && (\n <box style={{ flexDirection: 'row', gap: 2 }}>\n {showLineNumbers && (\n <text content={`Lines: ${lineCount}${maxLines ? `/${maxLines}` : ''}`} fg={tokens.textMuted} />\n )}\n {showCharCount && (\n <text\n content={charLimit ? `${charCount}/${charLimit}` : `${charCount} chars`}\n fg={charLimit && charCount >= charLimit ? tokens.textWarning : tokens.textMuted}\n />\n )}\n </box>\n )}\n {field.error ? <text content={field.error} fg={tokens.textDanger} /> : null}\n </box>\n )\n}\n",
32
- "import { useId } from 'react'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { useFormField } from './form-context.js'\nimport { createKeyMatcher } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface CheckboxFieldProps {\n label: string\n name: string\n description?: string\n defaultValue?: boolean\n scopeId?: string\n}\n\nconst checkboxKeymap = createKeyMatcher({\n toggle: ['space', 'enter']\n})\n\nexport function CheckboxField({ label, name, description, defaultValue = false, scopeId }: CheckboxFieldProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const field = useFormField<boolean>(name, {\n defaultValue,\n submitOnEnter: false\n })\n const keyboardScopeId = scopeId ?? `checkbox:${name}:${reactScopeId}`\n\n const toggle = () => {\n field.setValue(!field.value)\n field.blur()\n }\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (!field.focused) return false\n if (checkboxKeymap.match('toggle', key)) {\n toggle()\n return true\n }\n return false\n },\n { active: field.focused }\n )\n\n return (\n <box style={{ flexDirection: 'column', marginBottom: 1, gap: 1 }}>\n <text\n content={`${field.focused ? '>' : ' '} ${field.value ? '[x]' : '[ ]'} ${label}`}\n fg={field.focused ? tokens.accent : tokens.textPrimary}\n />\n {description ? <text content={description} fg={tokens.textMuted} /> : null}\n {field.error ? <text content={field.error} fg={tokens.textDanger} /> : null}\n </box>\n )\n}\n",
33
- "import { useEffect } from 'react'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type { SelectOption } from '@opentui/core'\nimport { Form, type FormProps } from './form.js'\nimport { FormField } from './form-field.js'\nimport { SelectField } from './select-field.js'\nimport { NumberField } from './number-field.js'\nimport { TextareaField } from './textarea-field.js'\nimport { PasswordField } from './password-field.js'\nimport { CheckboxField } from './checkbox-field.js'\nimport { MultiSelectField } from './multi-select-field.js'\nimport { useFormContext } from './form-context.js'\n\ntype FormOutput<TSchema extends StandardSchemaV1> = StandardSchemaV1.InferOutput<TSchema>\ntype SchemaFieldName<TSchema extends StandardSchemaV1> = keyof FormOutput<TSchema> & string\n\ninterface BaseSchemaField<TSchema extends StandardSchemaV1> {\n name: SchemaFieldName<TSchema>\n label: string\n required?: boolean\n description?: string\n visibleWhen?: (values: Partial<FormOutput<TSchema>>) => boolean\n deriveDefault?: (values: Partial<FormOutput<TSchema>>) => unknown\n}\n\nexport interface TextSchemaField<TSchema extends StandardSchemaV1> extends BaseSchemaField<TSchema> {\n kind: 'text'\n placeholder?: string\n defaultValue?: string\n}\n\nexport interface SelectSchemaField<TSchema extends StandardSchemaV1> extends BaseSchemaField<TSchema> {\n kind: 'select'\n options: SelectOption[]\n defaultValue?: SelectOption['value']\n}\n\nexport interface MultiSelectSchemaField<TSchema extends StandardSchemaV1> extends BaseSchemaField<TSchema> {\n kind: 'multiselect'\n options: SelectOption[]\n defaultValue?: Array<SelectOption['value']>\n}\n\nexport interface NumberSchemaField<TSchema extends StandardSchemaV1> extends BaseSchemaField<TSchema> {\n kind: 'number'\n placeholder?: string\n defaultValue?: number\n}\n\nexport interface PasswordSchemaField<TSchema extends StandardSchemaV1> extends BaseSchemaField<TSchema> {\n kind: 'password'\n placeholder?: string\n defaultValue?: string\n}\n\nexport interface TextareaSchemaField<TSchema extends StandardSchemaV1> extends BaseSchemaField<TSchema> {\n kind: 'textarea'\n placeholder?: string\n defaultValue?: string\n}\n\nexport interface CheckboxSchemaField<TSchema extends StandardSchemaV1> extends BaseSchemaField<TSchema> {\n kind: 'checkbox'\n defaultValue?: boolean\n}\n\nexport type SchemaField<TSchema extends StandardSchemaV1> =\n | TextSchemaField<TSchema>\n | SelectSchemaField<TSchema>\n | MultiSelectSchemaField<TSchema>\n | NumberSchemaField<TSchema>\n | PasswordSchemaField<TSchema>\n | TextareaSchemaField<TSchema>\n | CheckboxSchemaField<TSchema>\n\nexport interface SchemaFormProps<TSchema extends StandardSchemaV1>\n extends Omit<FormProps<TSchema>, 'children'> {\n fields: SchemaField<TSchema>[]\n}\n\nfunction SchemaFieldsRenderer<TSchema extends StandardSchemaV1>({\n fields\n}: {\n fields: SchemaField<TSchema>[]\n}) {\n const context = useFormContext()\n const values = context.values as Partial<FormOutput<TSchema>>\n\n useEffect(() => {\n for (const field of fields) {\n if (!field.deriveDefault) continue\n if (context.values[field.name] !== undefined) continue\n const derived = field.deriveDefault(values)\n if (derived !== undefined) {\n context.setFieldValue(field.name, derived)\n }\n }\n }, [context, fields, values])\n\n return (\n <>\n {fields.map((field) => {\n const visible = field.visibleWhen ? field.visibleWhen(values) : true\n if (!visible) return null\n\n if (field.kind === 'select') {\n return (\n <SelectField\n key={field.name}\n name={field.name}\n label={field.label}\n options={field.options}\n defaultValue={field.defaultValue}\n required={field.required}\n description={field.description}\n />\n )\n }\n\n if (field.kind === 'multiselect') {\n return (\n <MultiSelectField\n key={field.name}\n name={field.name}\n label={field.label}\n options={field.options}\n defaultValue={field.defaultValue}\n required={field.required}\n description={field.description}\n />\n )\n }\n\n if (field.kind === 'number') {\n return (\n <NumberField\n key={field.name}\n name={field.name}\n label={field.label}\n placeholder={field.placeholder}\n defaultValue={field.defaultValue}\n required={field.required}\n description={field.description}\n />\n )\n }\n\n if (field.kind === 'password') {\n return (\n <PasswordField\n key={field.name}\n name={field.name}\n label={field.label}\n placeholder={field.placeholder}\n defaultValue={field.defaultValue}\n required={field.required}\n description={field.description}\n />\n )\n }\n\n if (field.kind === 'textarea') {\n return (\n <TextareaField\n key={field.name}\n name={field.name}\n label={field.label}\n placeholder={field.placeholder}\n defaultValue={field.defaultValue}\n required={field.required}\n description={field.description}\n />\n )\n }\n\n if (field.kind === 'checkbox') {\n return (\n <CheckboxField\n key={field.name}\n name={field.name}\n label={field.label}\n defaultValue={field.defaultValue}\n description={field.description}\n />\n )\n }\n\n return (\n <FormField\n key={field.name}\n name={field.name}\n label={field.label}\n placeholder={field.placeholder}\n defaultValue={field.defaultValue}\n required={field.required}\n description={field.description}\n />\n )\n })}\n </>\n )\n}\n\nexport function SchemaForm<TSchema extends StandardSchemaV1>({\n fields,\n ...formProps\n}: SchemaFormProps<TSchema>) {\n return (\n <Form {...formProps}>\n <SchemaFieldsRenderer fields={fields} />\n </Form>\n )\n}\n",
34
- "import { useMemo } from 'react'\nimport { useTuiTheme } from '@bunli/runtime/app'\nimport { displayWidth, formatFixedWidth, type TextOverflowMode } from '@bunli/runtime/app'\n\nexport interface KeyValueItem {\n key: string\n value: string | number | boolean | null | undefined\n}\n\nexport interface KeyValueListProps {\n items: KeyValueItem[]\n minKeyWidth?: number\n maxLineWidth?: number\n fillWidth?: boolean\n overflow?: TextOverflowMode\n}\n\nexport function KeyValueList({\n items,\n minKeyWidth = 12,\n maxLineWidth,\n fillWidth = false,\n overflow = 'ellipsis'\n}: KeyValueListProps) {\n const { tokens } = useTuiTheme()\n\n const keyWidth = useMemo(\n () => Math.max(minKeyWidth, ...items.map((item) => displayWidth(item.key)), 0),\n [items, minKeyWidth]\n )\n const lineWidth = useMemo(() => {\n const contentLineWidth = Math.max(\n keyWidth + 3,\n ...items.map((item) => displayWidth(`${formatFixedWidth(item.key, keyWidth)} : ${String(item.value ?? '')}`))\n )\n const boundedLineWidth = typeof maxLineWidth === 'number'\n ? Math.max(keyWidth + 3, Math.min(maxLineWidth, contentLineWidth))\n : contentLineWidth\n\n if (!fillWidth || typeof maxLineWidth !== 'number') {\n return boundedLineWidth\n }\n\n return Math.max(boundedLineWidth, maxLineWidth)\n }, [fillWidth, items, keyWidth, maxLineWidth])\n\n return (\n <box style={{ flexDirection: 'column', gap: 1 }}>\n {items.map((item, index) => (\n <text\n key={`kv-${index}-${item.key}`}\n content={formatFixedWidth(\n `${formatFixedWidth(item.key, keyWidth)} : ${String(item.value ?? '')}`,\n lineWidth,\n { overflow }\n )}\n fg={tokens.textPrimary}\n />\n ))}\n </box>\n )\n}\n",
35
- "import { Children } from 'react'\nimport type { ReactNode } from 'react'\n\nexport interface GridProps {\n children: ReactNode\n columns?: number\n gap?: number\n}\n\nexport function Grid({ children, columns = 2, gap = 1 }: GridProps) {\n const items = Children.toArray(children)\n const normalizedColumns = Math.max(1, columns)\n const rows: ReactNode[][] = []\n\n for (let index = 0; index < items.length; index += normalizedColumns) {\n rows.push(items.slice(index, index + normalizedColumns))\n }\n\n return (\n <box style={{ flexDirection: 'column', gap }}>\n {rows.map((row, rowIndex) => (\n <box key={`grid-row-${rowIndex}`} style={{ flexDirection: 'row', gap }}>\n {row.map((item, itemIndex) => (\n <box key={`grid-item-${rowIndex}-${itemIndex}`}>\n {item}\n </box>\n ))}\n </box>\n ))}\n </box>\n )\n}\n",
36
- "import { useEffect, useId, useRef, type ReactNode } from 'react'\nimport type { BoxRenderable, Renderable } from '@opentui/core'\nimport { useRenderer } from '@opentui/react'\nimport { createKeyMatcher } from '@bunli/runtime/app'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { OverlayPortal } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface ModalProps {\n isOpen: boolean\n title: string\n children: ReactNode\n onClose?: () => void\n closeHint?: string\n scopeId?: string\n zIndex?: number\n}\n\nconst modalKeymap = createKeyMatcher({\n close: ['escape', 'ctrl+c'],\n trap: ['tab', 'shift+tab']\n})\n\nexport function Modal({\n isOpen,\n title,\n children,\n onClose,\n closeHint = 'Esc to close',\n scopeId,\n zIndex = 1000\n}: ModalProps) {\n const { tokens } = useTuiTheme()\n const renderer = useRenderer()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `modal:${title}:${reactScopeId}`\n const modalRef = useRef<BoxRenderable | null>(null)\n const previousFocusedRef = useRef<Renderable | null>(null)\n const wasOpenRef = useRef(false)\n\n useEffect(() => {\n if (isOpen && !wasOpenRef.current) {\n previousFocusedRef.current = renderer.currentFocusedRenderable\n\n const focusTarget = modalRef.current\n if (focusTarget) {\n renderer.focusRenderable(focusTarget)\n }\n }\n\n if (!isOpen && wasOpenRef.current) {\n const previous = previousFocusedRef.current\n if (previous) {\n try {\n renderer.focusRenderable(previous)\n } catch {\n // Ignore restore failures if previous focus target was destroyed.\n }\n }\n }\n\n wasOpenRef.current = isOpen\n }, [isOpen, renderer])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (!isOpen) return false\n\n if (modalKeymap.match('close', key)) {\n onClose?.()\n return true\n }\n\n if (modalKeymap.match('trap', key)) {\n const focusTarget = modalRef.current\n if (focusTarget) {\n renderer.focusRenderable(focusTarget)\n }\n return true\n }\n\n return false\n },\n { active: isOpen, priority: 100 }\n )\n\n return (\n <OverlayPortal active={isOpen} priority={zIndex}>\n <box\n position='absolute'\n top={1}\n left={2}\n right={2}\n zIndex={zIndex}\n border\n padding={2}\n title={title}\n focusable\n ref={modalRef}\n style={{\n flexDirection: 'column',\n gap: 1,\n borderColor: tokens.accent,\n backgroundColor: tokens.backgroundMuted\n }}\n >\n {children}\n <text content={closeHint} fg={tokens.textMuted} />\n </box>\n </OverlayPortal>\n )\n}\n",
37
- "import { useId, useMemo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { createKeyMatcher } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface TabItem {\n key: string\n label: string\n content: ReactNode\n}\n\nexport interface TabsProps {\n tabs: TabItem[]\n initialKey?: string\n activeKey?: string\n onChange?: (key: string) => void\n scopeId?: string\n keyboardEnabled?: boolean\n}\n\nconst tabsKeymap = createKeyMatcher({\n previous: ['left', 'h'],\n next: ['right', 'l']\n})\n\nexport function Tabs({\n tabs,\n initialKey,\n activeKey,\n onChange,\n scopeId,\n keyboardEnabled = true\n}: TabsProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `tabs:${reactScopeId}`\n const [internalKey, setInternalKey] = useState<string>(() => initialKey ?? tabs[0]?.key ?? '')\n const currentKey = activeKey ?? internalKey\n const currentIndex = Math.max(0, tabs.findIndex((tab) => tab.key === currentKey))\n\n const selectIndex = (index: number) => {\n const tab = tabs[index]\n if (!tab) return\n if (activeKey === undefined) {\n setInternalKey(tab.key)\n }\n onChange?.(tab.key)\n }\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (tabs.length === 0) return false\n if (tabsKeymap.match('previous', key)) {\n const next = (currentIndex - 1 + tabs.length) % tabs.length\n selectIndex(next)\n return true\n }\n if (tabsKeymap.match('next', key)) {\n const next = (currentIndex + 1) % tabs.length\n selectIndex(next)\n return true\n }\n return false\n },\n { active: keyboardEnabled }\n )\n\n const activeTab = useMemo(() => tabs[currentIndex] ?? null, [tabs, currentIndex])\n\n return (\n <box style={{ flexDirection: 'column', gap: 1 }}>\n <box style={{ flexDirection: 'row', gap: 2 }}>\n {tabs.map((tab, index) => {\n const isActive = index === currentIndex\n const label = isActive ? `[${tab.label}]` : tab.label\n return (\n <text\n key={tab.key}\n content={label}\n fg={isActive ? tokens.accent : tokens.textMuted}\n />\n )\n })}\n </box>\n <box border padding={1} style={{ borderColor: keyboardEnabled ? tokens.accent : tokens.border }}>\n {activeTab?.content ?? <text content=\"\" />}\n </box>\n </box>\n )\n}\n",
38
- "import { useId, useState } from 'react'\nimport type { KeyEvent } from '@opentui/core'\nimport { useScopedKeyboard, createKeyMatcher, useTuiTheme } from '@bunli/runtime/app'\n\nexport interface ConfirmProps {\n message: string\n defaultValue?: boolean\n affirmativeLabel?: string\n negativeLabel?: string\n onConfirm?: (value: boolean) => void\n onAbort?: () => void\n scopeId?: string\n keyboardEnabled?: boolean\n}\n\nconst confirmKeymap = createKeyMatcher({\n toggle: ['left', 'right', 'h', 'l', 'tab'],\n affirm: ['y'],\n negate: ['n', 'q'],\n submit: ['enter'],\n abort: ['escape']\n})\n\nexport function Confirm({\n message,\n defaultValue = false,\n affirmativeLabel = 'Yes',\n negativeLabel = 'No',\n onConfirm,\n onAbort,\n scopeId,\n keyboardEnabled = true\n}: ConfirmProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `confirm:${reactScopeId}`\n const [selected, setSelected] = useState(defaultValue)\n\n useScopedKeyboard(\n keyboardScopeId,\n (key: KeyEvent) => {\n if (confirmKeymap.match('toggle', key)) {\n setSelected((prev) => !prev)\n return true\n }\n\n if (confirmKeymap.match('affirm', key)) {\n setSelected(true)\n return true\n }\n\n if (confirmKeymap.match('negate', key)) {\n setSelected(false)\n return true\n }\n\n if (confirmKeymap.match('submit', key)) {\n setSelected((current) => {\n onConfirm?.(current)\n return current\n })\n return true\n }\n\n if (confirmKeymap.match('abort', key)) {\n onAbort?.()\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n return (\n <box style={{ flexDirection: 'row', gap: 1 }}>\n <text content={message} fg={tokens.textPrimary} />\n <text content={selected ? `[${affirmativeLabel}]` : ` ${affirmativeLabel} `} fg={selected ? tokens.accent : tokens.textMuted} />\n <text content=\"/\" fg={tokens.textMuted} />\n <text content={!selected ? `[${negativeLabel}]` : ` ${negativeLabel} `} fg={!selected ? tokens.accent : tokens.textMuted} />\n </box>\n )\n}\n",
39
- "import { useCallback, useEffect, useId, useMemo, useState } from 'react'\nimport type { KeyEvent } from '@opentui/core'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { createKeyMatcher } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\nimport { displayWidth, formatFixedWidth, type TextOverflowMode } from '@bunli/runtime/app'\n\nexport interface MenuItem {\n key: string\n label: string\n description?: string\n disabled?: boolean\n}\n\nexport interface MenuProps {\n title?: string\n items: MenuItem[]\n onSelect?: (key: string) => void\n initialIndex?: number\n scopeId?: string\n keyboardEnabled?: boolean\n maxLineWidth?: number\n overflow?: TextOverflowMode\n boxed?: boolean\n onKeyPress?: (key: KeyEvent, context: {\n index: number\n items: MenuItem[]\n setIndex: (nextIndex: number) => void\n select: (itemKey: string) => void\n }) => boolean\n}\n\nconst menuKeymap = createKeyMatcher({\n up: ['up', 'k'],\n down: ['down', 'j'],\n select: ['enter']\n})\n\nfunction isUpKey(key: KeyEvent) {\n const name = key.name?.toLowerCase()\n return menuKeymap.match('up', key) || name === 'arrowup' || key.sequence === '\\u001b[A'\n}\n\nfunction isDownKey(key: KeyEvent) {\n const name = key.name?.toLowerCase()\n return menuKeymap.match('down', key) || name === 'arrowdown' || key.sequence === '\\u001b[B'\n}\n\nfunction isSelectKey(key: KeyEvent) {\n const name = key.name?.toLowerCase()\n return (\n menuKeymap.match('select', key) ||\n name === 'return' ||\n key.sequence === '\\r' ||\n key.sequence === '\\n'\n )\n}\n\nexport function Menu({\n title,\n items,\n onSelect,\n initialIndex = 0,\n scopeId,\n keyboardEnabled = true,\n maxLineWidth,\n overflow = 'ellipsis',\n boxed = true,\n onKeyPress\n}: MenuProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `menu:${reactScopeId}`\n const [index, setIndex] = useState(initialIndex)\n const lineWidth = useMemo(() => {\n const contentLineWidth = Math.max(\n 8,\n ...items.map((entry) => {\n const entryDisabled = entry.disabled ? ' [disabled]' : ''\n return displayWidth(`> ${entry.label}${entryDisabled}${entry.description ? ` - ${entry.description}` : ''}`)\n })\n )\n\n if (typeof maxLineWidth === 'number') {\n return Math.max(8, Math.min(maxLineWidth, contentLineWidth))\n }\n\n return contentLineWidth\n }, [items, maxLineWidth])\n const clearLineWidth = useMemo(() => {\n if (boxed) return lineWidth\n if (typeof maxLineWidth === 'number') return lineWidth\n const terminalWidth = process.stdout.columns ?? 80\n return Math.max(lineWidth, terminalWidth - 2)\n }, [boxed, lineWidth, maxLineWidth])\n\n useEffect(() => {\n setIndex((prev) => {\n if (items.length === 0) return 0\n\n const bounded = ((prev % items.length) + items.length) % items.length\n if (!items[bounded]?.disabled) {\n return bounded\n }\n\n for (let offset = 1; offset < items.length; offset += 1) {\n const next = (bounded + offset) % items.length\n if (!items[next]?.disabled) {\n return next\n }\n }\n return bounded\n })\n }, [items])\n\n const move = useCallback((delta: number) => {\n if (items.length === 0) return\n\n setIndex((prev) => {\n for (let step = 0; step < items.length; step += 1) {\n const next = (prev + delta * (step + 1) + items.length) % items.length\n if (!items[next]?.disabled) {\n return next\n }\n }\n\n return prev\n })\n }, [items])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (\n onKeyPress?.(key, {\n index,\n items,\n setIndex: (nextIndex) => setIndex(nextIndex),\n select: (itemKey) => onSelect?.(itemKey)\n })\n ) {\n return true\n }\n\n if (isUpKey(key)) {\n move(-1)\n return true\n }\n\n if (isDownKey(key)) {\n move(1)\n return true\n }\n\n if (isSelectKey(key)) {\n const item = items[index]\n if (!item || item.disabled) return false\n onSelect?.(item.key)\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n const rows = (\n <>\n {title\n ? <text content={formatFixedWidth(title, clearLineWidth, { overflow: 'clip' })} fg={tokens.textPrimary} />\n : null}\n {items.map((item, itemIndex) => {\n const active = itemIndex === index\n const prefix = active ? '>\\u00a0' : '\\u00a0\\u00a0'\n const disabled = item.disabled ? ' [disabled]' : ''\n const rawLine = `${prefix}${item.label}${disabled}${item.description ? ` - ${item.description}` : ''}`\n\n return (\n <text\n key={item.key}\n content={formatFixedWidth(rawLine, clearLineWidth, { overflow })}\n fg={item.disabled ? tokens.textMuted : active ? tokens.accent : tokens.textPrimary}\n />\n )\n })}\n </>\n )\n\n if (!boxed) {\n return <box style={{ flexDirection: 'column', gap: 0 }}>{rows}</box>\n }\n\n return (\n <box\n border\n padding={1}\n style={{\n flexDirection: 'column',\n gap: 1,\n borderColor: keyboardEnabled ? tokens.accent : tokens.border\n }}\n >\n {rows}\n </box>\n )\n}\n",
40
- "import { useEffect, useId, useMemo, useState } from 'react'\nimport type { KeyEvent } from '@opentui/core'\nimport { createKeyMatcher, displayWidth, formatFixedWidth, useScopedKeyboard, useTuiTheme } from '@bunli/runtime/app'\nimport type { TextOverflowMode } from '@bunli/runtime/app'\n\nexport interface NavListItem {\n key: string\n label: string\n description?: string\n section?: string\n meta?: string\n disabled?: boolean\n}\n\nexport interface NavListProps {\n id?: string\n title?: string\n items: NavListItem[]\n value?: string\n defaultValue?: string\n onChange?: (key: string) => void\n onSelect?: (key: string) => void\n onFocusRequest?: () => void\n scopeId?: string\n keyboardEnabled?: boolean\n pointerEnabled?: boolean\n selectOnMove?: boolean\n maxLineWidth?: number\n overflow?: TextOverflowMode\n boxed?: boolean\n compact?: boolean\n wrapLabels?: boolean\n maxLabelLines?: number\n}\n\nconst navKeymap = createKeyMatcher({\n up: ['up', 'k'],\n down: ['down', 'j'],\n select: ['enter']\n})\n\nexport function moveSelectableNavIndex(items: NavListItem[], currentIndex: number, delta: number) {\n if (items.length === 0) return -1\n\n for (let step = 0; step < items.length; step += 1) {\n const nextIndex = (currentIndex + delta * (step + 1) + items.length) % items.length\n if (!items[nextIndex]?.disabled) {\n return nextIndex\n }\n }\n\n return currentIndex\n}\n\nexport function findFirstSelectableKey(items: NavListItem[]) {\n return items.find((item) => !item.disabled)?.key ?? items[0]?.key ?? ''\n}\n\nexport function resolveNavListModeWidth(maxLineWidth: number | undefined) {\n const terminalWidth = process.stdout.columns ?? 80\n return Math.max(18, maxLineWidth ?? (terminalWidth - 4))\n}\n\nfunction chunkWord(word: string, maxWidth: number): string[] {\n if (maxWidth <= 1 || displayWidth(word) <= maxWidth) {\n return [word]\n }\n\n const chunks: string[] = []\n let current = ''\n\n for (const char of word) {\n const next = `${current}${char}`\n if (current.length > 0 && displayWidth(next) > maxWidth) {\n chunks.push(current)\n current = char\n continue\n }\n current = next\n }\n\n if (current.length > 0) {\n chunks.push(current)\n }\n\n return chunks\n}\n\nfunction wrapNavLabelLines(\n label: string,\n lineWidth: number,\n prefix: string,\n maxLines: number,\n overflow: TextOverflowMode\n): string[] {\n if (maxLines <= 1) {\n return [formatFixedWidth(`${prefix}${label}`, lineWidth, { overflow })]\n }\n\n const restPrefix = '\\u00a0\\u00a0'\n const firstWidth = Math.max(1, lineWidth - displayWidth(prefix))\n const restWidth = Math.max(1, lineWidth - displayWidth(restPrefix))\n const rawWords = label.trim().split(/\\s+/).filter(Boolean)\n const words = rawWords.flatMap((word) => chunkWord(word, Math.max(firstWidth, restWidth)))\n\n if (words.length === 0) {\n return [formatFixedWidth(prefix, lineWidth, { overflow: 'clip' })]\n }\n\n const lines: string[] = []\n let current = ''\n let currentWidth = firstWidth\n\n for (const [wordIndex, word] of words.entries()) {\n const candidate = current.length > 0 ? `${current} ${word}` : word\n if (current.length > 0 && displayWidth(candidate) > currentWidth) {\n lines.push(current)\n if (lines.length === maxLines - 1) {\n const remaining = [word, ...words.slice(wordIndex + 1)].join(' ')\n lines.push(remaining)\n return lines.map((line, index) =>\n formatFixedWidth(`${index === 0 ? prefix : restPrefix}${line}`, lineWidth, { overflow })\n )\n }\n current = word\n currentWidth = restWidth\n continue\n }\n current = candidate\n }\n\n if (current.length > 0) {\n lines.push(current)\n }\n\n return lines.slice(0, maxLines).map((line, index) =>\n formatFixedWidth(`${index === 0 ? prefix : restPrefix}${line}`, lineWidth, { overflow })\n )\n}\n\nexport function NavList({\n id,\n title,\n items,\n value,\n defaultValue,\n onChange,\n onSelect,\n onFocusRequest,\n scopeId,\n keyboardEnabled = true,\n pointerEnabled = true,\n selectOnMove = true,\n maxLineWidth,\n overflow = 'ellipsis',\n boxed = false,\n compact = false,\n wrapLabels = false,\n maxLabelLines = 2\n}: NavListProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `nav-list:${reactScopeId}`\n const [internalValue, setInternalValue] = useState(() => defaultValue ?? findFirstSelectableKey(items))\n const [hoveredKey, setHoveredKey] = useState<string | null>(null)\n const currentValue = value ?? internalValue\n\n useEffect(() => {\n if (items.length === 0) {\n if (value === undefined) {\n setInternalValue('')\n }\n return\n }\n\n const match = items.find((item) => item.key === currentValue && !item.disabled)\n if (match) return\n\n if (value === undefined) {\n setInternalValue(findFirstSelectableKey(items))\n }\n }, [currentValue, items, value])\n\n const selectedIndex = useMemo(() => {\n const matchedIndex = items.findIndex((item) => item.key === currentValue)\n if (matchedIndex >= 0) return matchedIndex\n return Math.max(0, items.findIndex((item) => !item.disabled))\n }, [currentValue, items])\n\n const lineWidth = useMemo(() => resolveNavListModeWidth(maxLineWidth), [maxLineWidth])\n\n const selectKey = (nextKey: string, options: { confirm?: boolean } = {}) => {\n if (!nextKey) return\n const item = items.find((candidate) => candidate.key === nextKey)\n if (!item || item.disabled) return\n\n if (value === undefined) {\n setInternalValue(nextKey)\n }\n\n onChange?.(nextKey)\n if (options.confirm) {\n onSelect?.(nextKey)\n }\n }\n\n useScopedKeyboard(\n keyboardScopeId,\n (key: KeyEvent) => {\n if (items.length === 0) return false\n\n if (navKeymap.match('up', key)) {\n const nextIndex = moveSelectableNavIndex(items, selectedIndex, -1)\n const nextKey = items[nextIndex]?.key\n if (nextKey) {\n if (selectOnMove) {\n selectKey(nextKey)\n } else if (value === undefined) {\n setInternalValue(nextKey)\n }\n }\n return true\n }\n\n if (navKeymap.match('down', key)) {\n const nextIndex = moveSelectableNavIndex(items, selectedIndex, 1)\n const nextKey = items[nextIndex]?.key\n if (nextKey) {\n if (selectOnMove) {\n selectKey(nextKey)\n } else if (value === undefined) {\n setInternalValue(nextKey)\n }\n }\n return true\n }\n\n if (navKeymap.match('select', key)) {\n const selected = items[selectedIndex]\n if (!selected || selected.disabled) return false\n selectKey(selected.key, { confirm: true })\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n let previousSection: string | undefined\n\n const content = (\n <>\n {title ? <text content={formatFixedWidth(title, lineWidth, { overflow: 'clip' })} fg={tokens.textMuted} /> : null}\n {items.map((item) => {\n const selected = item.key === currentValue\n const hovered = item.key === hoveredKey\n const sectionLabel = item.section && item.section !== previousSection ? item.section : undefined\n previousSection = item.section\n\n const prefix = selected ? '>\\u00a0' : '\\u00a0\\u00a0'\n const metaWidth = item.meta ? displayWidth(item.meta) + 1 : 0\n const labelWidth = Math.max(8, lineWidth - 2 - metaWidth)\n const labelLines = wrapLabels && !item.meta\n ? wrapNavLabelLines(item.label, labelWidth, prefix, maxLabelLines, overflow)\n : [formatFixedWidth(`${prefix}${item.label}`, labelWidth, { overflow })]\n\n return (\n <box key={item.key} style={{ flexDirection: 'column', gap: compact ? 0 : 1 }}>\n {sectionLabel ? <text content={sectionLabel} fg={tokens.textMuted} /> : null}\n <box\n id={id ? `${id}--row-${item.key}` : undefined}\n width='100%'\n paddingLeft={boxed ? 0 : 1}\n paddingRight={boxed ? 0 : 1}\n style={{\n flexDirection: 'column',\n gap: compact ? 0 : 1,\n backgroundColor: selected || hovered ? tokens.backgroundMuted : undefined\n }}\n onMouseDown={pointerEnabled ? () => {\n onFocusRequest?.()\n selectKey(item.key, { confirm: true })\n } : undefined}\n onMouseOver={pointerEnabled ? () => {\n setHoveredKey(item.key)\n } : undefined}\n onMouseOut={pointerEnabled ? () => {\n setHoveredKey((current) => current === item.key ? null : current)\n } : undefined}\n >\n <box style={{ flexDirection: 'row', justifyContent: 'space-between' }}>\n <box style={{ flexDirection: 'column', flexGrow: 1 }}>\n {labelLines.map((line, lineIndex) => (\n <text\n key={`${item.key}-label-${lineIndex}`}\n content={line}\n fg={item.disabled ? tokens.textMuted : selected ? tokens.accent : hovered ? tokens.textPrimary : tokens.textPrimary}\n />\n ))}\n </box>\n {item.meta\n ? <text content={item.meta} fg={selected ? tokens.accent : tokens.textMuted} />\n : null}\n </box>\n {!compact && item.description\n ? <text content={formatFixedWidth(item.description, Math.max(14, lineWidth - 2), { overflow })} fg={tokens.textMuted} />\n : null}\n </box>\n </box>\n )\n })}\n </>\n )\n\n if (!boxed) {\n return <box id={id} width='100%' style={{ flexDirection: 'column', gap: compact ? 0 : 1 }}>{content}</box>\n }\n\n return (\n <box\n id={id}\n width='100%'\n border\n padding={1}\n style={{\n flexDirection: 'column',\n gap: compact ? 0 : 1,\n borderColor: keyboardEnabled ? tokens.accent : tokens.border\n }}\n >\n {content}\n </box>\n )\n}\n",
41
- "import { useEffect, useId, useMemo, useState } from 'react'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { createKeyMatcher } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\nimport { displayWidth, formatFixedWidth, type TextOverflowMode } from '@bunli/runtime/app'\n\nexport interface CommandPaletteItem {\n key: string\n label: string\n hint?: string\n}\n\nexport interface CommandPaletteProps {\n items: CommandPaletteItem[]\n placeholder?: string\n onSelect?: (key: string) => void\n scopeId?: string\n keyboardEnabled?: boolean\n inputFocused?: boolean\n maxLineWidth?: number\n overflow?: TextOverflowMode\n}\n\nconst paletteKeymap = createKeyMatcher({\n up: ['up', 'k'],\n down: ['down', 'j'],\n select: ['enter']\n})\n\nexport function CommandPalette({\n items,\n placeholder = 'Type to filter commands...',\n onSelect,\n scopeId,\n keyboardEnabled = true,\n inputFocused = true,\n maxLineWidth,\n overflow = 'ellipsis'\n}: CommandPaletteProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `command-palette:${reactScopeId}`\n const [query, setQuery] = useState('')\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n const filtered = useMemo(\n () =>\n items.filter((item) => item.label.toLowerCase().includes(query.toLowerCase())),\n [items, query]\n )\n\n useEffect(() => {\n setSelectedIndex((prev) => {\n if (filtered.length === 0) return 0\n return Math.min(prev, filtered.length - 1)\n })\n }, [filtered.length])\n const lineWidth = useMemo(() => {\n const contentLineWidth = Math.max(\n 8,\n ...items.map((item) => displayWidth(`> ${item.label}${item.hint ? ` - ${item.hint}` : ''}`))\n )\n if (typeof maxLineWidth === 'number') {\n return Math.max(8, Math.min(maxLineWidth, contentLineWidth))\n }\n return contentLineWidth\n }, [items, maxLineWidth])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (filtered.length === 0) return false\n\n if (paletteKeymap.match('up', key)) {\n setSelectedIndex((prev) => (prev - 1 + filtered.length) % filtered.length)\n return true\n }\n\n if (paletteKeymap.match('down', key)) {\n setSelectedIndex((prev) => (prev + 1) % filtered.length)\n return true\n }\n\n if (paletteKeymap.match('select', key)) {\n const item = filtered[selectedIndex]\n if (!item) return false\n onSelect?.(item.key)\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n return (\n <box\n border\n padding={1}\n style={{\n flexDirection: 'column',\n gap: 1,\n borderColor: keyboardEnabled ? tokens.accent : tokens.border\n }}\n >\n <input\n value={query}\n placeholder={placeholder}\n onInput={setQuery}\n focused={inputFocused}\n style={{ focusedBackgroundColor: tokens.backgroundMuted }}\n />\n <box style={{ flexDirection: 'column', gap: 1 }}>\n {filtered.length === 0 ? (\n <text content=\"No commands found\" fg={tokens.textMuted} />\n ) : (\n Array.from({ length: filtered.length }, (_, rowIndex) => {\n const item = filtered[rowIndex]\n if (!item) {\n return <text key={`palette-empty-${rowIndex}`} content={formatFixedWidth('', lineWidth, { overflow })} fg={tokens.textPrimary} />\n }\n\n const active = rowIndex === selectedIndex\n const rawLine = `${active ? '>' : ' '} ${item.label}${item.hint ? ` - ${item.hint}` : ''}`\n return (\n <text\n key={item.key}\n content={formatFixedWidth(rawLine, lineWidth, { overflow })}\n fg={active ? tokens.accent : tokens.textPrimary}\n />\n )\n })\n )}\n </box>\n </box>\n )\n}\n",
42
- "import { useEffect, useId, useMemo, useState } from 'react'\nimport type { KeyEvent } from '@opentui/core'\nimport { useScopedKeyboard, createKeyMatcher, useTuiTheme } from '@bunli/runtime/app'\nimport Fuse, { type FuseResultMatch } from 'fuse.js'\n\nexport interface FilterOption {\n label: string\n value: string\n description?: string\n}\n\nexport interface FilterProps {\n options: FilterOption[]\n placeholder?: string\n prompt?: string\n mode?: 'single' | 'multiple'\n limit?: number\n fuzzy?: boolean\n reverse?: boolean\n selectIfOne?: boolean\n height?: number\n onSelect?: (selected: FilterOption[]) => void\n onAbort?: () => void\n scopeId?: string\n keyboardEnabled?: boolean\n}\n\ninterface FilterResult {\n item: FilterOption\n matches?: ReadonlyArray<FuseResultMatch>\n refIndex: number\n}\n\nconst filterKeymap = createKeyMatcher({\n up: ['up'],\n down: ['down'],\n toggle: ['tab'],\n selectAll: ['ctrl+a'],\n submit: ['enter'],\n abort: ['escape']\n})\n\nexport function Filter({\n options,\n placeholder = 'Type to filter...',\n prompt = '> ',\n mode = 'single',\n limit = 0,\n fuzzy = true,\n reverse = false,\n selectIfOne = false,\n height = 10,\n onSelect,\n onAbort,\n scopeId,\n keyboardEnabled = true\n}: FilterProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `filter:${reactScopeId}`\n const [query, setQuery] = useState('')\n const [cursorIndex, setCursorIndex] = useState(0)\n const [selectedIndices, setSelectedIndices] = useState<Set<number>>(new Set())\n\n const fuse = useMemo(\n () =>\n new Fuse(options, {\n keys: ['label'],\n includeMatches: true,\n threshold: 0.3,\n ignoreLocation: true\n }),\n [options]\n )\n\n const filtered: FilterResult[] = useMemo(() => {\n if (!query) {\n return options.map((item, index) => ({\n item,\n matches: [] as FuseResultMatch[],\n refIndex: index\n }))\n }\n if (fuzzy) {\n return fuse.search(query).map((result) => ({\n item: result.item,\n matches: result.matches ?? [],\n refIndex: result.refIndex\n }))\n }\n return options\n .map((item, index) => ({ item, refIndex: index }))\n .filter(({ item }) => item.label.toLowerCase().includes(query.toLowerCase()))\n }, [options, query, fuzzy, fuse])\n\n const orderedFiltered = useMemo(() => {\n if (reverse) return [...filtered].reverse()\n return filtered\n }, [filtered, reverse])\n\n // Bound cursor when filtered list changes\n useEffect(() => {\n setCursorIndex((prev) => {\n if (orderedFiltered.length === 0) return 0\n return Math.min(prev, orderedFiltered.length - 1)\n })\n }, [orderedFiltered.length])\n\n // Auto-select if only one match\n useEffect(() => {\n if (selectIfOne && orderedFiltered.length === 1 && query.length > 0) {\n onSelect?.([orderedFiltered[0]!.item])\n }\n }, [selectIfOne, orderedFiltered, query, onSelect])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key: KeyEvent) => {\n if (filterKeymap.match('abort', key)) {\n onAbort?.()\n return true\n }\n\n if (filterKeymap.match('submit', key)) {\n if (mode === 'multiple') {\n const selected = Array.from(selectedIndices)\n .map((refIndex) => options[refIndex])\n .filter((opt): opt is FilterOption => opt !== undefined)\n onSelect?.(selected)\n } else {\n const result = orderedFiltered[cursorIndex]\n if (result) {\n onSelect?.([result.item])\n }\n }\n return true\n }\n\n if (filterKeymap.match('up', key)) {\n setCursorIndex((prev) => {\n if (orderedFiltered.length === 0) return 0\n return (prev - 1 + orderedFiltered.length) % orderedFiltered.length\n })\n return true\n }\n\n if (filterKeymap.match('down', key)) {\n setCursorIndex((prev) => {\n if (orderedFiltered.length === 0) return 0\n return (prev + 1) % orderedFiltered.length\n })\n return true\n }\n\n if (filterKeymap.match('toggle', key) && mode === 'multiple') {\n const result = orderedFiltered[cursorIndex]\n if (!result) return false\n setSelectedIndices((prev) => {\n const next = new Set(prev)\n if (next.has(result.refIndex)) {\n next.delete(result.refIndex)\n } else {\n if (limit > 0 && next.size >= limit) return prev\n next.add(result.refIndex)\n }\n return next\n })\n return true\n }\n\n if (filterKeymap.match('selectAll', key) && mode === 'multiple') {\n setSelectedIndices((prev) => {\n if (prev.size === orderedFiltered.length) {\n return new Set()\n }\n const allIndices = orderedFiltered.map((r) => r.refIndex)\n if (limit > 0) {\n return new Set(allIndices.slice(0, limit))\n }\n return new Set(allIndices)\n })\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n // Pagination\n const pageOffset = Math.max(0, Math.min(cursorIndex - Math.floor(height / 2), orderedFiltered.length - height))\n const visibleStart = Math.max(0, pageOffset)\n const visibleResults = orderedFiltered.slice(visibleStart, visibleStart + height)\n\n return (\n <box style={{ flexDirection: 'column', gap: 0 }}>\n {/* Search input */}\n <box style={{ flexDirection: 'row' }}>\n <text content={prompt} fg={tokens.accent} />\n <input\n value={query}\n placeholder={placeholder}\n onInput={setQuery}\n focused={keyboardEnabled}\n style={{ focusedBackgroundColor: tokens.backgroundMuted }}\n />\n </box>\n\n {/* Filtered results */}\n <box style={{ flexDirection: 'column' }}>\n {visibleResults.map((result, visIndex) => {\n const absoluteIndex = visIndex + visibleStart\n const isCursor = absoluteIndex === cursorIndex\n const isSelected = selectedIndices.has(result.refIndex)\n const prefix = isCursor ? '> ' : ' '\n const marker = mode === 'multiple' ? (isSelected ? '[x] ' : '[ ] ') : ''\n const desc = result.item.description ? ` - ${result.item.description}` : ''\n\n return (\n <text\n key={result.item.value}\n content={`${prefix}${marker}${result.item.label}${desc}`}\n fg={isCursor ? tokens.accent : tokens.textPrimary}\n />\n )\n })}\n </box>\n\n {/* Count indicator */}\n <text content={`${filtered.length}/${options.length}`} fg={tokens.textMuted} />\n </box>\n )\n}\n",
43
- "import { useEffect, useId, useMemo, useState } from 'react'\nimport { useScopedKeyboard } from '@bunli/runtime/app'\nimport { createKeyMatcher } from '@bunli/runtime/app'\nimport { useTuiTheme } from '@bunli/runtime/app'\nimport { displayWidth, formatFixedWidth, type TextOverflowMode } from '@bunli/runtime/app'\n\nexport interface DataTableColumn {\n key: string\n label: string\n}\n\nexport interface DataTableProps {\n columns: DataTableColumn[]\n rows: Array<Record<string, string | number | boolean | null | undefined>>\n onRowSelect?: (row: Record<string, string | number | boolean | null | undefined>) => void\n scopeId?: string\n keyboardEnabled?: boolean\n maxLineWidth?: number\n fillWidth?: boolean\n overflow?: TextOverflowMode\n}\n\nconst dataTableKeymap = createKeyMatcher({\n sortPrevious: ['left', 'h'],\n sortNext: ['right', 'l'],\n rowPrevious: ['up', 'k'],\n rowNext: ['down', 'j'],\n select: ['enter']\n})\n\nexport function DataTable({\n columns,\n rows,\n onRowSelect,\n scopeId,\n keyboardEnabled = true,\n maxLineWidth,\n fillWidth = false,\n overflow = 'ellipsis'\n}: DataTableProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `datatable:${reactScopeId}`\n const [sortIndex, setSortIndex] = useState(0)\n const [selectedRowIndex, setSelectedRowIndex] = useState(0)\n\n const sortColumn = columns[sortIndex]?.key\n\n const sortedRows = useMemo(() => {\n if (!sortColumn) return rows\n const copy = [...rows]\n copy.sort((a, b) => String(a[sortColumn] ?? '').localeCompare(String(b[sortColumn] ?? '')))\n return copy\n }, [rows, sortColumn])\n\n useEffect(() => {\n setSortIndex((prev) => {\n if (columns.length === 0) return 0\n return Math.min(prev, columns.length - 1)\n })\n }, [columns.length])\n\n useEffect(() => {\n setSelectedRowIndex((prev) => {\n if (sortedRows.length === 0) return 0\n return Math.min(prev, sortedRows.length - 1)\n })\n }, [sortedRows.length])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (dataTableKeymap.match('sortPrevious', key)) {\n if (columns.length === 0) return false\n setSortIndex((prev) => (prev - 1 + columns.length) % columns.length)\n return true\n }\n\n if (dataTableKeymap.match('sortNext', key)) {\n if (columns.length === 0) return false\n setSortIndex((prev) => (prev + 1) % columns.length)\n return true\n }\n\n if (dataTableKeymap.match('rowPrevious', key)) {\n if (sortedRows.length === 0) return false\n setSelectedRowIndex((prev) => Math.max(0, prev - 1))\n return true\n }\n\n if (dataTableKeymap.match('rowNext', key)) {\n if (sortedRows.length === 0) return false\n setSelectedRowIndex((prev) => Math.min(sortedRows.length - 1, prev + 1))\n return true\n }\n\n if (dataTableKeymap.match('select', key)) {\n const row = sortedRows[selectedRowIndex]\n if (!row) return false\n onRowSelect?.(row)\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n const widths = columns.map((column) =>\n Math.max(\n displayWidth(column.label),\n ...sortedRows.map((row) => displayWidth(String(row[column.key] ?? ''))),\n 1\n )\n )\n\n const rawHeader = columns\n .map((column, index) => {\n const decorated = index === sortIndex ? `${column.label}*` : column.label\n return formatFixedWidth(decorated, widths[index] ?? displayWidth(column.label), { overflow })\n })\n .join(' | ')\n const rawSeparator = widths.map((width) => '-'.repeat(width)).join('-+-')\n const rawRowLines = sortedRows.map((row) => columns\n .map((column, index) => formatFixedWidth(String(row[column.key] ?? ''), widths[index] ?? 1, { overflow }))\n .join(' | '))\n const contentWidth = Math.max(\n displayWidth(rawHeader),\n displayWidth(rawSeparator),\n ...rawRowLines.map((line) => displayWidth(line)),\n 1\n )\n const finalLineWidth = Math.max(\n 8,\n fillWidth && typeof maxLineWidth === 'number'\n ? maxLineWidth\n : Math.min(maxLineWidth ?? Number.POSITIVE_INFINITY, contentWidth)\n )\n const header = formatFixedWidth(rawHeader, finalLineWidth, { overflow })\n const separator = formatFixedWidth(rawSeparator, finalLineWidth, { overflow })\n\n const footer = formatFixedWidth('Arrows: navigate/sort | Enter: select row', finalLineWidth, { overflow })\n\n return (\n <box\n border\n padding={1}\n style={{\n flexDirection: 'column',\n gap: 1,\n borderColor: keyboardEnabled ? tokens.accent : tokens.border\n }}\n >\n <text content={header} fg={tokens.textPrimary} />\n <text content={separator} fg={tokens.borderMuted} />\n {sortedRows.length === 0 ? (\n <text content={formatFixedWidth('No rows', finalLineWidth, { overflow })} fg={tokens.textMuted} />\n ) : (\n sortedRows.map((row, rowIndex) => {\n const line = formatFixedWidth(rawRowLines[rowIndex] ?? '', finalLineWidth, { overflow })\n const active = rowIndex === selectedRowIndex\n return (\n <text\n key={`datatable-row-${rowIndex}`}\n content={formatFixedWidth(`${active ? '>' : ' '} ${line}`, finalLineWidth + 2, { overflow })}\n fg={active ? tokens.accent : tokens.textPrimary}\n />\n )\n })\n )}\n <text content={footer} fg={tokens.textMuted} />\n </box>\n )\n}\n",
44
- "import { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { useTuiTheme } from '@bunli/runtime/app'\nimport { useTerminalDimensions } from '@opentui/react'\n\nexport type SidebarLayoutMode = 'auto' | 'wide' | 'medium' | 'narrow'\nexport type SidebarLayoutResolvedMode = Exclude<SidebarLayoutMode, 'auto'>\nexport type SidebarLayoutPane = 'sidebar' | 'content' | 'inspector'\n\nexport interface SidebarLayoutPaneLabels {\n sidebar: string\n content: string\n inspector?: string\n}\n\nexport interface SidebarLayoutProps {\n header?: ReactNode\n status?: ReactNode\n sidebar: ReactNode\n content: ReactNode\n inspector?: ReactNode\n mode?: SidebarLayoutMode\n activePane?: SidebarLayoutPane\n defaultActivePane?: SidebarLayoutPane\n onActivePaneChange?: (pane: SidebarLayoutPane) => void\n paneLabels?: SidebarLayoutPaneLabels\n sidebarWidth?: number\n inspectorWidth?: number\n wideMinWidth?: number\n mediumMinWidth?: number\n gap?: number\n height?: number | `${number}%` | 'auto'\n}\n\nexport function resolveSidebarLayoutMode(\n terminalWidth: number,\n mode: SidebarLayoutMode,\n breakpoints: { mediumMinWidth: number; wideMinWidth: number }\n): SidebarLayoutResolvedMode {\n if (mode !== 'auto') return mode\n if (terminalWidth >= breakpoints.wideMinWidth) return 'wide'\n if (terminalWidth >= breakpoints.mediumMinWidth) return 'medium'\n return 'narrow'\n}\n\nfunction buildPaneOrder(inspector?: ReactNode): SidebarLayoutPane[] {\n return inspector ? ['sidebar', 'content', 'inspector'] : ['sidebar', 'content']\n}\n\nexport function SidebarLayout({\n header,\n status,\n sidebar,\n content,\n inspector,\n mode = 'auto',\n activePane,\n defaultActivePane = 'content',\n onActivePaneChange,\n paneLabels,\n sidebarWidth = 28,\n inspectorWidth = 38,\n wideMinWidth = 132,\n mediumMinWidth = 100,\n gap = 2,\n height = '100%'\n}: SidebarLayoutProps) {\n const { width: terminalWidth = 140 } = useTerminalDimensions()\n const { tokens } = useTuiTheme()\n const resolvedMode = resolveSidebarLayoutMode(terminalWidth, mode, {\n mediumMinWidth,\n wideMinWidth\n })\n const paneOrder = useMemo(() => buildPaneOrder(inspector), [inspector])\n const [internalActivePane, setInternalActivePane] = useState<SidebarLayoutPane>(defaultActivePane)\n const currentActivePane = paneOrder.includes(activePane ?? internalActivePane)\n ? (activePane ?? internalActivePane)\n : paneOrder[0] ?? 'content'\n\n useEffect(() => {\n if (!paneOrder.includes(currentActivePane)) {\n const nextPane = paneOrder[0] ?? 'content'\n if (activePane === undefined) {\n setInternalActivePane(nextPane)\n }\n onActivePaneChange?.(nextPane)\n }\n }, [activePane, currentActivePane, onActivePaneChange, paneOrder])\n\n const setPane = (pane: SidebarLayoutPane) => {\n if (!paneOrder.includes(pane)) return\n if (activePane === undefined) {\n setInternalActivePane(pane)\n }\n onActivePaneChange?.(pane)\n }\n\n const selectorRow = (panes: SidebarLayoutPane[], selectedPane: SidebarLayoutPane = currentActivePane) => (\n <box\n paddingLeft={1}\n paddingRight={1}\n style={{ flexDirection: 'row', gap: 2, justifyContent: 'space-between' }}\n >\n {panes.map((pane) => {\n const label = pane === 'sidebar'\n ? paneLabels?.sidebar ?? 'Browse'\n : pane === 'content'\n ? paneLabels?.content ?? 'Preview'\n : paneLabels?.inspector ?? 'Info'\n const selected = pane === selectedPane\n\n return (\n <text\n key={pane}\n content={selected ? `[${label}]` : label}\n fg={selected ? tokens.accent : tokens.textMuted}\n onMouseDown={() => setPane(pane)}\n />\n )\n })}\n </box>\n )\n\n const renderNarrowSelector = resolvedMode === 'narrow'\n ? (\n selectorRow(paneOrder)\n )\n : null\n\n const mainBody = (() => {\n if (resolvedMode === 'wide') {\n return (\n <box style={{ flexDirection: 'row', gap, flexGrow: 1, height: '100%' }}>\n <box width={sidebarWidth} height='100%'>{sidebar}</box>\n <box style={{ flexGrow: 1 }} height='100%'>{content}</box>\n {inspector ? <box width={inspectorWidth} height='100%'>{inspector}</box> : null}\n </box>\n )\n }\n\n if (resolvedMode === 'medium') {\n const sidePane = currentActivePane === 'inspector' && inspector ? inspector : content\n return (\n <box style={{ flexDirection: 'row', gap, flexGrow: 1, height: '100%' }}>\n <box width={sidebarWidth} height='100%'>{sidebar}</box>\n <box style={{ flexDirection: 'column', gap: 1, flexGrow: 1 }} height='100%'>\n {inspector\n ? selectorRow(['content', 'inspector'], currentActivePane === 'inspector' ? 'inspector' : 'content')\n : null}\n <box style={{ flexGrow: 1 }} height='100%'>{sidePane}</box>\n </box>\n </box>\n )\n }\n\n const narrowPane = currentActivePane === 'sidebar'\n ? sidebar\n : currentActivePane === 'inspector' && inspector\n ? inspector\n : content\n\n return (\n <box style={{ flexDirection: 'column', gap: 1, flexGrow: 1, height: '100%' }}>\n {renderNarrowSelector}\n <box style={{ flexGrow: 1 }} height='100%'>\n {narrowPane}\n </box>\n </box>\n )\n })()\n\n return (\n <box height={height} style={{ flexDirection: 'column', gap: 1 }}>\n {header}\n <box style={{ flexDirection: 'column', gap: 1, flexGrow: 1 }}>\n {mainBody}\n </box>\n {status}\n </box>\n )\n}\n",
45
- "import { useEffect, useState } from 'react'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport type SpinnerVariant = 'line' | 'dot' | 'minidot' | 'jump' | 'pulse' | 'points' | 'globe' | 'moon' | 'monkey' | 'meter' | 'hamburger'\n\nexport const SPINNERS: Record<SpinnerVariant, { frames: string[]; interval: number }> = {\n line: { frames: ['|', '/', '-', '\\\\'], interval: 130 },\n dot: { frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'], interval: 80 },\n minidot: { frames: ['⠄', '⠂', '⠁', '⠈', '⠐', '⠠'], interval: 100 },\n jump: { frames: ['⢀⠀', '⡀⠀', '⠄⠀', '⢂⠀', '⡂⠀', '⠅⠀', '⢃⠀', '⡃⠀', '⠍⠀', '⢋⠀', '⡋⠀', '⠍⠁', '⢋⠁', '⡋⠁', '⠍⠉', '⠋⠉', '⠋⠉', '⠉⠙', '⠉⠙', '⠉⠩', '⠈⢙', '⠈⡙', '⢈⠩', '⡂⠩', '⠅⠩', '⢃⠩', '⡃⠩', '⠍⠩', '⢋⠩', '⡋⠩', '⠍⠩', '⢋⠩', '⡋⠩', '⠍⢉', '⠍⡉', '⠍⠋'], interval: 100 },\n pulse: { frames: ['█', '▓', '▒', '░', '▒', '▓'], interval: 120 },\n points: { frames: ['∙∙∙', '●∙∙', '∙●∙', '∙∙●'], interval: 200 },\n globe: { frames: ['🌍', '🌎', '🌏'], interval: 200 },\n moon: { frames: ['🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘'], interval: 120 },\n monkey: { frames: ['🙈', '🙉', '🙊'], interval: 300 },\n meter: { frames: ['▱▱▱▱▱▱▱', '▰▱▱▱▱▱▱', '▰▰▱▱▱▱▱', '▰▰▰▱▱▱▱', '▰▰▰▰▱▱▱', '▰▰▰▰▰▱▱', '▰▰▰▰▰▰▱', '▰▰▰▰▰▰▰'], interval: 120 },\n hamburger: { frames: ['☱', '☲', '☴'], interval: 150 },\n}\n\nexport interface SpinnerProps {\n variant?: SpinnerVariant\n title?: string\n align?: 'left' | 'right'\n speed?: number\n}\n\nexport function Spinner({ variant = 'dot', title, align = 'left', speed }: SpinnerProps) {\n const { tokens } = useTuiTheme()\n const spinner = SPINNERS[variant]\n const { frames } = spinner\n const interval = speed ?? spinner.interval\n const [frameIndex, setFrameIndex] = useState(0)\n\n useEffect(() => {\n const id = setInterval(() => {\n setFrameIndex(prev => (prev + 1) % frames.length)\n }, interval)\n return () => clearInterval(id)\n }, [frames.length, interval])\n\n const frame = frames[frameIndex] ?? frames[0]!\n\n return (\n <box style={{ flexDirection: 'row', gap: 1 }}>\n {align === 'left' && <text content={frame} fg={tokens.accent} />}\n {title && <text content={title} fg={tokens.textPrimary} />}\n {align === 'right' && <text content={frame} fg={tokens.accent} />}\n </box>\n )\n}\n",
46
- "import { useCallback, useId, useMemo, useRef, useState } from 'react'\nimport type { KeyEvent, ScrollBoxRenderable } from '@opentui/core'\nimport { useScopedKeyboard, createKeyMatcher, useTuiTheme } from '@bunli/runtime/app'\n\nexport interface PagerProps {\n content: string\n title?: string\n showLineNumbers?: boolean\n height?: number | `${number}%` | 'auto'\n width?: number | `${number}%` | 'auto'\n scopeId?: string\n keyboardEnabled?: boolean\n onQuit?: () => void\n}\n\ntype PagerMode = 'normal' | 'search'\n\nconst pagerKeymap = createKeyMatcher({\n scrollDown: ['down', 'j'],\n scrollUp: ['up', 'k'],\n halfPageDown: ['d'],\n halfPageUp: ['u'],\n top: ['g', 'home'],\n bottom: ['end'],\n search: ['/'],\n nextMatch: ['n'],\n prevMatch: ['shift+n'],\n quit: ['q', 'escape']\n})\n\nfunction padLineNumber(lineNum: number, totalLines: number): string {\n const width = String(totalLines).length\n return String(lineNum).padStart(width, ' ')\n}\n\nfunction findMatchIndices(lines: string[], query: string): number[] {\n if (!query) return []\n const lowerQuery = query.toLowerCase()\n const indices: number[] = []\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].toLowerCase().includes(lowerQuery)) {\n indices.push(i)\n }\n }\n return indices\n}\n\nexport function Pager({\n content,\n title,\n showLineNumbers = false,\n height,\n width,\n scopeId,\n keyboardEnabled = true,\n onQuit\n}: PagerProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `pager:${reactScopeId}`\n\n const scrollRef = useRef<ScrollBoxRenderable>(null)\n\n const [mode, setMode] = useState<PagerMode>('normal')\n const [searchQuery, setSearchQuery] = useState('')\n const [matchIndices, setMatchIndices] = useState<number[]>([])\n const [currentMatchIndex, setCurrentMatchIndex] = useState(0)\n\n const lines = useMemo(() => content.split('\\n'), [content])\n\n const scrollToLine = useCallback((lineIndex: number) => {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = lineIndex\n }\n }, [])\n\n const isMatchLine = useCallback((lineIndex: number) => {\n return matchIndices.includes(lineIndex)\n }, [matchIndices])\n\n const executeSearch = useCallback(() => {\n const indices = findMatchIndices(lines, searchQuery)\n setMatchIndices(indices)\n setCurrentMatchIndex(0)\n setMode('normal')\n if (indices.length > 0) {\n scrollToLine(indices[0])\n }\n }, [lines, searchQuery, scrollToLine])\n\n const navigateToMatch = useCallback((direction: 'next' | 'prev') => {\n if (matchIndices.length === 0) return\n let nextIndex: number\n if (direction === 'next') {\n nextIndex = (currentMatchIndex + 1) % matchIndices.length\n } else {\n nextIndex = (currentMatchIndex - 1 + matchIndices.length) % matchIndices.length\n }\n setCurrentMatchIndex(nextIndex)\n scrollToLine(matchIndices[nextIndex])\n }, [matchIndices, currentMatchIndex, scrollToLine])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key: KeyEvent) => {\n if (mode === 'search') {\n if (key.name === 'escape') {\n setSearchQuery('')\n setMode('normal')\n return true\n }\n if (key.name === 'return' || key.sequence === '\\r' || key.sequence === '\\n') {\n executeSearch()\n return true\n }\n return false\n }\n\n // Normal mode\n if (pagerKeymap.match('scrollDown', key)) {\n scrollToLine((scrollRef.current?.scrollTop ?? 0) + 1)\n return true\n }\n\n if (pagerKeymap.match('scrollUp', key)) {\n scrollToLine(Math.max(0, (scrollRef.current?.scrollTop ?? 0) - 1))\n return true\n }\n\n // ctrl+d for half page down\n if (key.ctrl && key.name === 'd') {\n const halfPage = Math.max(1, Math.floor(lines.length / 4))\n scrollToLine((scrollRef.current?.scrollTop ?? 0) + halfPage)\n return true\n }\n\n // ctrl+u for half page up\n if (key.ctrl && key.name === 'u') {\n const halfPage = Math.max(1, Math.floor(lines.length / 4))\n scrollToLine(Math.max(0, (scrollRef.current?.scrollTop ?? 0) - halfPage))\n return true\n }\n\n if (pagerKeymap.match('halfPageDown', key) && !key.ctrl) {\n const halfPage = Math.max(1, Math.floor(lines.length / 4))\n scrollToLine((scrollRef.current?.scrollTop ?? 0) + halfPage)\n return true\n }\n\n if (pagerKeymap.match('halfPageUp', key) && !key.ctrl) {\n const halfPage = Math.max(1, Math.floor(lines.length / 4))\n scrollToLine(Math.max(0, (scrollRef.current?.scrollTop ?? 0) - halfPage))\n return true\n }\n\n if (pagerKeymap.match('top', key)) {\n scrollToLine(0)\n return true\n }\n\n // Shift+G for bottom\n if ((key.name === 'g' && key.shift) || key.name === 'G') {\n scrollToLine(Math.max(0, lines.length - 1))\n return true\n }\n\n if (pagerKeymap.match('bottom', key)) {\n scrollToLine(Math.max(0, lines.length - 1))\n return true\n }\n\n if (pagerKeymap.match('search', key)) {\n setMode('search')\n setSearchQuery('')\n return true\n }\n\n if (pagerKeymap.match('nextMatch', key)) {\n navigateToMatch('next')\n return true\n }\n\n if (pagerKeymap.match('prevMatch', key)) {\n navigateToMatch('prev')\n return true\n }\n\n if (pagerKeymap.match('quit', key)) {\n onQuit?.()\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n return (\n <box\n border\n height={height}\n width={width}\n style={{\n flexDirection: 'column',\n borderColor: keyboardEnabled ? tokens.accent : tokens.border\n }}\n >\n {title && <text content={title} fg={tokens.textPrimary} />}\n\n <scrollbox\n ref={scrollRef}\n flexGrow={1}\n focused={keyboardEnabled}\n scrollY\n viewportOptions={{ width: '100%' }}\n contentOptions={{ width: '100%' }}\n scrollbarOptions={{\n visible: true,\n trackOptions: {\n backgroundColor: tokens.backgroundMuted,\n foregroundColor: keyboardEnabled ? tokens.accent : tokens.borderMuted\n }\n }}\n >\n {lines.map((line, i) => (\n <text\n key={i}\n content={\n showLineNumbers\n ? `${padLineNumber(i + 1, lines.length)} ${line}`\n : line\n }\n fg={isMatchLine(i) ? tokens.accent : tokens.textPrimary}\n />\n ))}\n </scrollbox>\n\n {mode === 'search' && (\n <box style={{ flexDirection: 'row' }}>\n <text content=\"/\" fg={tokens.accent} />\n <input\n value={searchQuery}\n placeholder=\"Search...\"\n onInput={setSearchQuery}\n onSubmit={() => executeSearch()}\n focused={true}\n />\n </box>\n )}\n\n <text\n content={\n matchIndices.length > 0\n ? `Match ${currentMatchIndex + 1}/${matchIndices.length}`\n : ''\n }\n fg={tokens.textMuted}\n />\n </box>\n )\n}\n",
47
- "import { useCallback, useId, useMemo, useState } from 'react'\nimport type { KeyEvent } from '@opentui/core'\nimport { useScopedKeyboard, createKeyMatcher, useTuiTheme } from '@bunli/runtime/app'\n\nexport interface ChooseOption {\n label: string\n value: string\n description?: string\n disabled?: boolean\n}\n\nexport interface ChooseProps {\n options: ChooseOption[]\n mode?: 'single' | 'multiple'\n limit?: number\n ordered?: boolean\n height?: number\n cursor?: string\n selectedPrefix?: string\n unselectedPrefix?: string\n onSelect?: (selected: ChooseOption[]) => void\n onAbort?: () => void\n scopeId?: string\n keyboardEnabled?: boolean\n}\n\nconst chooseKeymap = createKeyMatcher({\n up: ['up', 'k'],\n down: ['down', 'j'],\n pageUp: ['left', 'h'],\n pageDown: ['right', 'l'],\n home: ['g', 'home'],\n end: ['end', 'G'],\n toggle: ['space', 'tab', 'x'],\n selectAll: ['a'],\n submit: ['enter'],\n abort: ['escape']\n})\n\nfunction nextEnabledIndex(options: ChooseOption[], from: number, delta: number): number {\n if (options.length === 0) return 0\n for (let step = 0; step < options.length; step += 1) {\n const next = (from + delta * (step + 1) + options.length) % options.length\n if (!options[next]?.disabled) return next\n }\n return from\n}\n\nfunction firstEnabledIndex(options: ChooseOption[]): number {\n for (let i = 0; i < options.length; i++) {\n if (!options[i]?.disabled) return i\n }\n return 0\n}\n\nfunction lastEnabledIndex(options: ChooseOption[]): number {\n for (let i = options.length - 1; i >= 0; i--) {\n if (!options[i]?.disabled) return i\n }\n return 0\n}\n\nexport function Choose({\n options,\n mode = 'single',\n limit = 0,\n ordered = false,\n height = 10,\n cursor = '>',\n selectedPrefix = '[x]',\n unselectedPrefix = '[ ]',\n onSelect,\n onAbort,\n scopeId,\n keyboardEnabled = true\n}: ChooseProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `choose:${reactScopeId}`\n\n const [cursorIndex, setCursorIndex] = useState(() => firstEnabledIndex(options))\n const [pageOffset, setPageOffset] = useState(0)\n // For ordered mode, store indices in selection order; for unordered, use a Set\n const [selectedIndices, setSelectedIndices] = useState<number[]>([])\n\n const selectedSet = useMemo(() => new Set(selectedIndices), [selectedIndices])\n\n const pageSize = height\n const totalPages = Math.max(1, Math.ceil(options.length / pageSize))\n\n const adjustPageOffset = useCallback((newCursorIndex: number, currentOffset: number): number => {\n if (newCursorIndex < currentOffset) {\n return newCursorIndex\n }\n if (newCursorIndex >= currentOffset + pageSize) {\n return newCursorIndex - pageSize + 1\n }\n return currentOffset\n }, [pageSize])\n\n const moveCursor = useCallback((delta: number) => {\n setCursorIndex((prev) => {\n const next = nextEnabledIndex(options, prev, delta)\n setPageOffset((offset) => adjustPageOffset(next, offset))\n return next\n })\n }, [options, adjustPageOffset])\n\n const movePage = useCallback((delta: number) => {\n setCursorIndex((prev) => {\n const targetIndex = Math.max(0, Math.min(options.length - 1, prev + delta * pageSize))\n // Find nearest enabled index from the target\n if (!options[targetIndex]?.disabled) {\n setPageOffset((offset) => adjustPageOffset(targetIndex, offset))\n return targetIndex\n }\n const next = nextEnabledIndex(options, targetIndex - (delta > 0 ? 1 : -1), delta > 0 ? 1 : -1)\n setPageOffset((offset) => adjustPageOffset(next, offset))\n return next\n })\n }, [options, pageSize, adjustPageOffset])\n\n const goHome = useCallback(() => {\n const idx = firstEnabledIndex(options)\n setCursorIndex(idx)\n setPageOffset(0)\n }, [options])\n\n const goEnd = useCallback(() => {\n const idx = lastEnabledIndex(options)\n setCursorIndex(idx)\n setPageOffset(Math.max(0, options.length - pageSize))\n }, [options, pageSize])\n\n const toggleIndex = useCallback((index: number) => {\n const option = options[index]\n if (!option || option.disabled) return\n\n setSelectedIndices((prev) => {\n const isSelected = prev.includes(index)\n if (isSelected) {\n return prev.filter((i) => i !== index)\n }\n if (limit > 0 && prev.length >= limit) {\n return prev\n }\n return [...prev, index]\n })\n }, [options, limit])\n\n const toggleAll = useCallback(() => {\n setSelectedIndices((prev) => {\n const enabledIndices = options\n .map((opt, i) => (!opt.disabled ? i : -1))\n .filter((i) => i !== -1)\n const allSelected = enabledIndices.every((i) => prev.includes(i))\n if (allSelected) {\n return []\n }\n if (limit > 0) {\n return enabledIndices.slice(0, limit)\n }\n return enabledIndices\n })\n }, [options, limit])\n\n const submit = useCallback(() => {\n if (mode === 'single') {\n const option = options[cursorIndex]\n if (option && !option.disabled) {\n onSelect?.([option])\n }\n } else {\n const indices = ordered\n ? selectedIndices\n : [...selectedIndices].sort((a, b) => a - b)\n const selected = indices\n .map((i) => options[i])\n .filter((opt): opt is ChooseOption => opt != null)\n onSelect?.(selected)\n }\n }, [mode, options, cursorIndex, selectedIndices, ordered, onSelect])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key) => {\n if (chooseKeymap.match('abort', key)) {\n onAbort?.()\n return true\n }\n\n if (chooseKeymap.match('up', key)) {\n moveCursor(-1)\n return true\n }\n\n if (chooseKeymap.match('down', key)) {\n moveCursor(1)\n return true\n }\n\n if (chooseKeymap.match('pageUp', key)) {\n movePage(-1)\n return true\n }\n\n if (chooseKeymap.match('pageDown', key)) {\n movePage(1)\n return true\n }\n\n if (chooseKeymap.match('home', key)) {\n goHome()\n return true\n }\n\n // Handle shift+g for end (G)\n if ((key.name === 'g' && key.shift) || chooseKeymap.match('end', key)) {\n goEnd()\n return true\n }\n\n if (mode === 'multiple' && chooseKeymap.match('toggle', key)) {\n toggleIndex(cursorIndex)\n return true\n }\n\n if (mode === 'multiple' && chooseKeymap.match('selectAll', key)) {\n toggleAll()\n return true\n }\n\n if (chooseKeymap.match('submit', key)) {\n submit()\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n const visibleOptions = options.slice(pageOffset, pageOffset + pageSize)\n const currentPage = Math.floor(pageOffset / pageSize) + 1\n const hasMoreAbove = pageOffset > 0\n const hasMoreBelow = pageOffset + pageSize < options.length\n\n return (\n <box style={{ flexDirection: 'column' }}>\n {visibleOptions.map((option, visIndex) => {\n const globalIndex = pageOffset + visIndex\n const isCursor = globalIndex === cursorIndex\n const isSelected = selectedSet.has(globalIndex)\n const prefix = isCursor ? cursor : ' '.repeat(cursor.length)\n const selectionMarker = mode === 'multiple'\n ? (isSelected ? selectedPrefix : unselectedPrefix) + ' '\n : ''\n\n return (\n <text\n key={option.value}\n content={`${prefix} ${selectionMarker}${option.label}${option.description ? ` - ${option.description}` : ''}`}\n fg={option.disabled ? tokens.textMuted : isCursor ? tokens.accent : tokens.textPrimary}\n />\n )\n })}\n {(hasMoreAbove || hasMoreBelow) ? (\n <text\n content={\n hasMoreAbove && hasMoreBelow\n ? `(page ${currentPage}/${totalPages})`\n : hasMoreAbove\n ? '\\u2191 more'\n : '\\u2193 more'\n }\n fg={tokens.textMuted}\n />\n ) : null}\n </box>\n )\n}\n",
48
- "import { useCallback, useId, useMemo, useState } from 'react'\nimport { resolve } from 'node:path'\nimport type { KeyEvent } from '@opentui/core'\nimport { useScopedKeyboard, createKeyMatcher, useTuiTheme } from '@bunli/runtime/app'\nimport { listDirectory, formatSize } from './file-picker-utils.js'\n\nexport type { FilePickerEntry } from './file-picker-utils.js'\nexport { listDirectory, formatSize } from './file-picker-utils.js'\n\nexport interface FilePickerProps {\n path?: string\n allowFiles?: boolean\n allowDirectories?: boolean\n showHidden?: boolean\n showPermissions?: boolean\n showSize?: boolean\n fileExtensions?: string[]\n height?: number\n cursor?: string\n onSelect?: (entry: import('./file-picker-utils.js').FilePickerEntry) => void\n onAbort?: () => void\n scopeId?: string\n keyboardEnabled?: boolean\n}\n\nconst filePickerKeymap = createKeyMatcher({\n up: ['up', 'k'],\n down: ['down', 'j'],\n enter: ['enter', 'right', 'l'],\n back: ['backspace', 'left', 'h'],\n toggleHidden: ['.'],\n quit: ['q', 'escape']\n})\n\nexport function FilePicker({\n path,\n allowFiles = true,\n allowDirectories = false,\n showHidden: initialShowHidden = false,\n showPermissions = false,\n showSize = false,\n fileExtensions,\n height = 15,\n cursor = '>',\n onSelect,\n onAbort,\n scopeId,\n keyboardEnabled = true\n}: FilePickerProps) {\n const { tokens } = useTuiTheme()\n const reactScopeId = useId()\n const keyboardScopeId = scopeId ?? `file-picker:${reactScopeId}`\n\n const [currentPath, setCurrentPath] = useState(() => resolve(path ?? '.'))\n const [cursorIndex, setCursorIndex] = useState(0)\n const [pageOffset, setPageOffset] = useState(0)\n const [showHidden, setShowHidden] = useState(initialShowHidden)\n\n const entries = useMemo(() => listDirectory(currentPath, {\n showHidden, allowFiles, allowDirectories, fileExtensions\n }), [currentPath, showHidden, fileExtensions, allowFiles, allowDirectories])\n\n const visibleEntries = useMemo(() => {\n return entries.slice(pageOffset, pageOffset + height)\n }, [entries, pageOffset, height])\n\n const moveCursor = useCallback((delta: number) => {\n if (entries.length === 0) return\n\n setCursorIndex(prev => {\n const next = Math.max(0, Math.min(entries.length - 1, prev + delta))\n\n if (next < pageOffset) {\n setPageOffset(next)\n } else if (next >= pageOffset + height) {\n setPageOffset(next - height + 1)\n }\n\n return next\n })\n }, [entries.length, pageOffset, height])\n\n const navigateToDirectory = useCallback((dirPath: string) => {\n setCurrentPath(dirPath)\n setCursorIndex(0)\n setPageOffset(0)\n }, [])\n\n useScopedKeyboard(\n keyboardScopeId,\n (key: KeyEvent) => {\n if (filePickerKeymap.match('up', key)) {\n moveCursor(-1)\n return true\n }\n\n if (filePickerKeymap.match('down', key)) {\n moveCursor(1)\n return true\n }\n\n if (filePickerKeymap.match('enter', key)) {\n const entry = entries[cursorIndex]\n if (!entry) return false\n\n if (entry.isDirectory) {\n if (allowDirectories) {\n onSelect?.(entry)\n } else {\n navigateToDirectory(entry.path)\n }\n } else if (allowFiles) {\n onSelect?.(entry)\n }\n return true\n }\n\n if (filePickerKeymap.match('back', key)) {\n const parentPath = resolve(currentPath, '..')\n if (parentPath !== currentPath) {\n navigateToDirectory(parentPath)\n }\n return true\n }\n\n if (filePickerKeymap.match('toggleHidden', key)) {\n setShowHidden(prev => !prev)\n setCursorIndex(0)\n setPageOffset(0)\n return true\n }\n\n if (filePickerKeymap.match('quit', key)) {\n onAbort?.()\n return true\n }\n\n return false\n },\n { active: keyboardEnabled }\n )\n\n const separatorLength = Math.min(currentPath.length, 40)\n\n return (\n <box style={{ flexDirection: 'column' }}>\n <text content={currentPath} fg={tokens.accent} />\n <text content={'\\u2500'.repeat(separatorLength)} fg={tokens.border} />\n\n <box style={{ flexDirection: 'column' }}>\n {visibleEntries.map((entry, visIndex) => {\n const globalIndex = pageOffset + visIndex\n const isCursor = globalIndex === cursorIndex\n const prefix = isCursor ? cursor : ' '.repeat(cursor.length)\n const typeIndicator = entry.isDirectory ? '\\uD83D\\uDCC1 ' : ' '\n const suffix = entry.isDirectory ? '/' : ''\n const sizeStr = showSize && entry.size != null ? ` (${formatSize(entry.size)})` : ''\n const permStr = showPermissions && entry.permissions ? ` [${entry.permissions}]` : ''\n\n return (\n <text\n key={entry.path}\n content={`${prefix} ${typeIndicator}${entry.name}${suffix}${sizeStr}${permStr}`}\n fg={isCursor ? tokens.accent : entry.isDirectory ? tokens.textPrimary : tokens.textMuted}\n />\n )\n })}\n </box>\n\n <text content={'\\u2191\\u2193 navigate \\u2190 parent \\u2192 enter . hidden q quit'} fg={tokens.textMuted} />\n </box>\n )\n}\n",
49
- "import { useMemo } from 'react'\nimport { useTuiTheme } from '@bunli/runtime/app'\n\nexport interface SeriesPoint {\n label?: string\n value?: number | null\n}\n\nexport interface ChartSeries {\n name?: string\n color?: string\n points: SeriesPoint[]\n}\n\nexport interface AxisOptions {\n xLabel?: string\n yLabel?: string\n min?: number\n max?: number\n showRange?: boolean\n}\n\nexport type ChartSeriesInput = ChartSeries | ChartSeries[]\nexport type ValueFormatter = (value: number, point: SeriesPoint) => string\n\nexport interface ChartDomain {\n min: number\n max: number\n maxAbs: number\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction toSeriesArray(series: ChartSeriesInput): ChartSeries[] {\n return Array.isArray(series) ? series : [series]\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value !== 'number') return null\n if (!Number.isFinite(value)) return null\n return value\n}\n\nfunction computeDomain(seriesList: ChartSeries[], axis?: AxisOptions): ChartDomain {\n const values = seriesList\n .flatMap((series) => series.points)\n .map((point) => toNumber(point.value))\n .filter((value): value is number => value !== null)\n\n const minFromValues = values.length > 0 ? Math.min(...values) : 0\n const maxFromValues = values.length > 0 ? Math.max(...values) : 0\n\n const min = axis?.min ?? Math.min(minFromValues, 0)\n const max = axis?.max ?? Math.max(maxFromValues, 0)\n const maxAbs = Math.max(Math.abs(min), Math.abs(max), 1)\n\n return { min, max, maxAbs }\n}\n\nfunction defaultFormatter(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(2)\n}\n\nfunction paletteAt(index: number, fallback: string, palette?: string[]): string {\n if (palette && palette.length > 0) {\n return palette[index % palette.length] ?? fallback\n }\n return fallback\n}\n\nfunction pointLabel(point: SeriesPoint, index: number): string {\n return point.label ?? `#${index + 1}`\n}\n\nfunction resampleValues(values: Array<number | null>, width?: number): Array<number | null> {\n if (!width || width <= 0 || values.length === 0 || values.length === width) {\n return values\n }\n\n if (width === 1) {\n return [values[0] ?? null]\n }\n\n if (values.length === 1) {\n return Array.from({ length: width }, () => values[0] ?? null)\n }\n\n return Array.from({ length: width }, (_, outputIndex) => {\n const inputIndex = Math.round((outputIndex * (values.length - 1)) / (width - 1))\n return values[inputIndex] ?? null\n })\n}\n\nfunction renderBarLine(args: {\n point: SeriesPoint\n index: number\n maxAbs: number\n halfWidth: number\n formatter: ValueFormatter\n}): string {\n const value = toNumber(args.point.value)\n const label = pointLabel(args.point, args.index)\n\n if (value === null) {\n return `${label}: ${' '.repeat(args.halfWidth)}|${' '.repeat(args.halfWidth)} ·`\n }\n\n const ratio = clamp(Math.abs(value) / args.maxAbs, 0, 1)\n const width = Math.round(ratio * args.halfWidth)\n const negativeBar = value < 0 ? '█'.repeat(width).padStart(args.halfWidth, ' ') : ' '.repeat(args.halfWidth)\n const positiveBar = value > 0 ? '█'.repeat(width).padEnd(args.halfWidth, ' ') : ' '.repeat(args.halfWidth)\n\n return `${label}: ${negativeBar}|${positiveBar} ${args.formatter(value, args.point)}`\n}\n\nconst SPARKS = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█']\n\nfunction renderSparkline(values: Array<number | null>, min: number, max: number, placeholder = '·'): string {\n const span = max - min || 1\n\n return values\n .map((value) => {\n if (value === null) return placeholder\n const normalized = (value - min) / span\n const index = clamp(Math.round(normalized * (SPARKS.length - 1)), 0, SPARKS.length - 1)\n return SPARKS[index] ?? SPARKS[0] ?? '▁'\n })\n .join('')\n}\n\nexport interface BarChartProps {\n series: ChartSeriesInput\n width?: number\n color?: string\n palette?: string[]\n axis?: AxisOptions\n valueFormatter?: ValueFormatter\n}\n\nexport function BarChart({\n series,\n width = 24,\n color,\n palette,\n axis,\n valueFormatter = (value) => defaultFormatter(value)\n}: BarChartProps) {\n const { tokens } = useTuiTheme()\n const seriesList = toSeriesArray(series)\n const domain = useMemo(() => computeDomain(seriesList, axis), [axis, seriesList])\n const halfWidth = Math.max(6, Math.floor(width / 2))\n\n return (\n <box style={{ flexDirection: 'column' }}>\n {axis?.yLabel ? <text content={axis.yLabel} fg={tokens.textMuted} /> : null}\n\n {seriesList.map((item, seriesIndex) => {\n const seriesColor = item.color ?? color ?? paletteAt(seriesIndex, tokens.accent, palette)\n return (\n <box key={`bar-series-${seriesIndex}`} style={{ flexDirection: 'column' }}>\n {item.name ? <text content={`${item.name}:`} fg={tokens.textMuted} /> : null}\n {item.points.map((point, pointIndex) => (\n <text\n key={`bar-point-${seriesIndex}-${pointIndex}`}\n content={renderBarLine({\n point,\n index: pointIndex,\n maxAbs: domain.maxAbs,\n halfWidth,\n formatter: valueFormatter\n })}\n fg={seriesColor}\n />\n ))}\n </box>\n )\n })}\n\n {axis?.showRange !== false ? (\n <text content={`${domain.min} <- 0 -> ${domain.max}`} fg={tokens.textMuted} />\n ) : null}\n {axis?.xLabel ? <text content={axis.xLabel} fg={tokens.textMuted} /> : null}\n </box>\n )\n}\n\nexport interface LineChartProps {\n series: ChartSeriesInput\n width?: number\n color?: string\n palette?: string[]\n axis?: AxisOptions\n}\n\nexport function LineChart({ series, width, color, palette, axis }: LineChartProps) {\n const { tokens } = useTuiTheme()\n const seriesList = toSeriesArray(series)\n const domain = useMemo(() => computeDomain(seriesList, axis), [axis, seriesList])\n\n return (\n <box style={{ flexDirection: 'column' }}>\n {axis?.yLabel ? <text content={axis.yLabel} fg={tokens.textMuted} /> : null}\n {seriesList.map((item, seriesIndex) => {\n const seriesColor = item.color ?? color ?? paletteAt(seriesIndex, tokens.accent, palette)\n const points = resampleValues(item.points.map((point) => toNumber(point.value)), width)\n const sparkline = renderSparkline(points, domain.min, domain.max)\n const name = item.name ?? `Series ${seriesIndex + 1}`\n\n return (\n <text\n key={`line-series-${seriesIndex}`}\n content={`${name}: ${sparkline}`}\n fg={seriesColor}\n />\n )\n })}\n {axis?.showRange !== false ? (\n <text content={`${domain.min} … ${domain.max}`} fg={tokens.textMuted} />\n ) : null}\n {axis?.xLabel ? <text content={axis.xLabel} fg={tokens.textMuted} /> : null}\n </box>\n )\n}\n\nexport interface SparklineProps {\n values: Array<number | null | undefined>\n width?: number\n color?: string\n min?: number\n max?: number\n placeholder?: string\n}\n\nexport function Sparkline({ values, width, color, min, max, placeholder = '·' }: SparklineProps) {\n const { tokens } = useTuiTheme()\n if (values.length === 0) return <text content=\"\" fg={tokens.textMuted} />\n\n const normalizedValues = resampleValues(values.map((value) => toNumber(value)), width)\n const valid = normalizedValues.filter((value): value is number => value !== null)\n const computedMin = min ?? (valid.length > 0 ? Math.min(...valid) : 0)\n const computedMax = max ?? (valid.length > 0 ? Math.max(...valid) : 0)\n const spark = renderSparkline(normalizedValues, computedMin, computedMax, placeholder)\n\n return <text content={spark} fg={color ?? tokens.accent} />\n}\n\nexport const __chartInternalsForTests = {\n clamp,\n toSeriesArray,\n toNumber,\n computeDomain,\n resampleValues,\n renderBarLine,\n renderSparkline\n}\n",
50
- "import { createElement } from \"react\";\n\nimport { defineCommand } from \"@bunli/core\";\n\nimport {\n\tbuildCommandOptions,\n\tCREATE_OPTION_METADATA,\n} from \"../command-option-metadata\";\nimport { getCreateDefaults } from \"../config\";\nimport { resolveBundledModuleHref } from \"../render-loader\";\nimport { executeCreateCommand } from \"../runtime-bridge\";\nimport type { WpTypiaRenderArgs } from \"./render-types\";\nimport { LazyFlow } from \"../ui/lazy-flow\";\n\nconst supportsInteractiveTui = typeof Bun !== \"undefined\";\n\nfunction loadCreateFlow() {\n\treturn import(\n\t\tresolveBundledModuleHref(import.meta.url, [\n\t\t\t\"./ui/create-flow.js\",\n\t\t\t\"../ui/create-flow.js\",\n\t\t\t\"../ui/create-flow.tsx\",\n\t\t]),\n\t).then((module) => ({ default: module.CreateFlow }));\n}\n\nconst createOptions = buildCommandOptions(CREATE_OPTION_METADATA);\n\nexport const createCommand = defineCommand({\n\tdefaultFormat: \"toon\",\n\tdescription: \"Scaffold a new wp-typia project.\",\n\thandler: async (args) => {\n\t\tconst projectDir = args.positional[0];\n\t\tif (!projectDir) {\n\t\t\tconst { createCliCommandError } = await import(\"@wp-typia/project-tools/cli-diagnostics\");\n\t\t\tthrow createCliCommandError({\n\t\t\t\tcommand: \"create\",\n\t\t\t\tdetailLines: [\"`wp-typia create` requires <project-dir>.\"],\n\t\t\t});\n\t\t}\n\t\tawait executeCreateCommand({\n\t\t\tcwd: args.cwd,\n\t\t\tflags: args.flags as Record<string, unknown>,\n\t\t\tprojectDir,\n\t\t});\n\t},\n\tname: \"create\",\n\toptions: createOptions,\n\t...(supportsInteractiveTui\n\t\t? {\n\t\t\t\trender: (args: WpTypiaRenderArgs) => {\n\t\t\t\t\tconst config =\n\t\t\t\t\t\targs.context?.store?.wpTypiaUserConfig &&\n\t\t\t\t\t\ttypeof args.context.store.wpTypiaUserConfig === \"object\"\n\t\t\t\t\t\t\t? getCreateDefaults(args.context.store.wpTypiaUserConfig)\n\t\t\t\t\t\t\t: {};\n\t\t\t\t\treturn createElement(LazyFlow, {\n\t\t\t\t\t\tloader: loadCreateFlow,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tcwd: args.cwd,\n\t\t\t\t\t\t\tinitialValues: {\n\t\t\t\t\t\t\t\t\"alternate-render-targets\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"alternate-render-targets\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"alternate-render-targets\"],\n\t\t\t\t\t\t\t\t\"data-storage\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"data-storage\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"data-storage\"],\n\t\t\t\t\t\t\t\t\"dry-run\": Boolean(\n\t\t\t\t\t\t\t\t\targs.flags[\"dry-run\"] ?? config[\"dry-run\"] ?? false,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\"external-layer-id\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"external-layer-id\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"external-layer-id\"],\n\t\t\t\t\t\t\t\t\"external-layer-source\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"external-layer-source\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"external-layer-source\"],\n\t\t\t\t\t\t\t\tnamespace:\n\t\t\t\t\t\t\t\t\t(args.flags.namespace as string | undefined) ?? config.namespace,\n\t\t\t\t\t\t\t\t\"no-install\": Boolean(\n\t\t\t\t\t\t\t\t\targs.flags[\"no-install\"] ?? config[\"no-install\"] ?? false,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\"package-manager\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"package-manager\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"package-manager\"],\n\t\t\t\t\t\t\t\t\"persistence-policy\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"persistence-policy\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"persistence-policy\"],\n\t\t\t\t\t\t\t\t\"php-prefix\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"php-prefix\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"php-prefix\"],\n\t\t\t\t\t\t\t\t\"query-post-type\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"query-post-type\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"query-post-type\"],\n\t\t\t\t\t\t\t\t\"project-dir\": args.positional[0] ?? \"\",\n\t\t\t\t\t\t\t\ttemplate:\n\t\t\t\t\t\t\t\t\t(args.flags.template as string | undefined) ?? config.template,\n\t\t\t\t\t\t\t\t\"text-domain\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"text-domain\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\tconfig[\"text-domain\"],\n\t\t\t\t\t\t\t\tvariant:\n\t\t\t\t\t\t\t\t\t(args.flags.variant as string | undefined) ?? config.variant,\n\t\t\t\t\t\t\t\t\"with-migration-ui\": Boolean(\n\t\t\t\t\t\t\t\t\targs.flags[\"with-migration-ui\"] ??\n\t\t\t\t\t\t\t\t\t\tconfig[\"with-migration-ui\"] ??\n\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\"with-test-preset\": Boolean(\n\t\t\t\t\t\t\t\t\targs.flags[\"with-test-preset\"] ??\n\t\t\t\t\t\t\t\t\t\tconfig[\"with-test-preset\"] ??\n\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\"with-wp-env\": Boolean(\n\t\t\t\t\t\t\t\t\targs.flags[\"with-wp-env\"] ?? config[\"with-wp-env\"] ?? false,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tyes: Boolean(args.flags.yes ?? config.yes ?? false),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\ttui: {\n\t\t\t\t\trenderer: {\n\t\t\t\t\t\tbufferMode: \"alternate\" as const,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t: {}),\n});\n\nexport default createCommand;\n",
51
- "import { defineCommand } from \"@bunli/core\";\nimport { executeDoctorCommand } from \"../runtime-bridge\";\n\nexport const doctorCommand = defineCommand({\n\tdefaultFormat: \"toon\",\n\tdescription: \"Run repository and project diagnostics.\",\n\thandler: async (args) => {\n\t\tconst prefersStructuredOutput =\n\t\t\t(args.formatExplicit && args.format !== \"toon\") ||\n\t\t\tBoolean(args.context?.store?.isAIAgent);\n\t\tif (prefersStructuredOutput) {\n\t\t\tconst [{ getDoctorChecks }, { createCliCommandError, getDoctorFailureDetailLines }] =\n\t\t\t\tawait Promise.all([\n\t\t\t\t\timport(\"@wp-typia/project-tools/cli-doctor\"),\n\t\t\t\t\timport(\"@wp-typia/project-tools/cli-diagnostics\"),\n\t\t\t\t]);\n\t\t\tconst checks = await getDoctorChecks(args.cwd);\n\t\t\targs.output({ checks });\n\t\t\tif (checks.some((check) => check.status === \"fail\")) {\n\t\t\t\tthrow createCliCommandError({\n\t\t\t\t\tcommand: \"doctor\",\n\t\t\t\t\tdetailLines: getDoctorFailureDetailLines(checks),\n\t\t\t\t\tsummary: \"One or more doctor checks failed.\",\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tawait executeDoctorCommand(args.cwd);\n\t},\n\tname: \"doctor\",\n});\n\nexport default doctorCommand;\n",
52
- "import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { Result } from \"better-result\";\nimport {\n\tcreateCommandsFromMCPTools,\n\textractCommandMetadata,\n\tgenerateMCPTypes,\n\ttype MCPToolGroup,\n\ttype MCPTool,\n} from \"@bunli/plugin-mcp\";\n\nimport type { WpTypiaSchemaSource } from \"./config\";\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isTool(value: unknown): value is MCPTool {\n\treturn (\n\t\tisObject(value) &&\n\t\ttypeof value.name === \"string\" &&\n\t\t(value.description === undefined || typeof value.description === \"string\")\n\t);\n}\n\nfunction isToolGroup(value: unknown): value is MCPToolGroup {\n\treturn (\n\t\tisObject(value) &&\n\t\ttypeof value.namespace === \"string\" &&\n\t\tArray.isArray(value.tools) &&\n\t\tvalue.tools.every(isTool)\n\t);\n}\n\nasync function readSchemaSource(\n\tcwd: string,\n\tsource: WpTypiaSchemaSource,\n): Promise<MCPToolGroup> {\n\tconst schemaPath = path.resolve(cwd, source.path);\n\tconst raw = await fs.readFile(schemaPath, \"utf8\");\n\tconst parsed = JSON.parse(raw);\n\n\tif (isToolGroup(parsed)) {\n\t\treturn parsed;\n\t}\n\n\tif (Array.isArray(parsed) && parsed.every(isTool)) {\n\t\treturn {\n\t\t\tnamespace: source.namespace,\n\t\t\ttools: parsed,\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t`Schema source \"${source.path}\" must contain either one MCPToolGroup object or an array of MCP tools.`,\n\t);\n}\n\nexport async function loadMcpToolGroups(\n\tcwd: string,\n\tschemaSources: WpTypiaSchemaSource[],\n): Promise<MCPToolGroup[]> {\n\treturn Promise.all(schemaSources.map((source) => readSchemaSource(cwd, source)));\n}\n\nexport async function syncMcpSchemas(\n\tcwd: string,\n\tschemaSources: WpTypiaSchemaSource[],\n\toutputDir = path.join(cwd, \".bunli\", \"mcp\"),\n): Promise<{\n\tcommandCount: number;\n\tgroups: MCPToolGroup[];\n\toutputDir: string;\n}> {\n\tconst groups = await loadMcpToolGroups(cwd, schemaSources);\n\tconst result = await generateMCPTypes({\n\t\toutputDir,\n\t\ttools: groups,\n\t});\n\tif (Result.isError(result)) {\n\t\tthrow result.error;\n\t}\n\n\tconst registry = groups.map((group) => ({\n\t\tnamespace: group.namespace,\n\t\ttools: group.tools.map((tool) => extractCommandMetadata(tool, group.namespace)),\n\t}));\n\n\tfor (const group of groups) {\n\t\tconst convert = createCommandsFromMCPTools(group.tools, {\n\t\t\tcreateHandler: () => async () => {},\n\t\t\tnamespace: group.namespace,\n\t\t});\n\t\tif (Result.isError(convert)) {\n\t\t\tthrow convert.error;\n\t\t}\n\t}\n\n\tawait fs.mkdir(outputDir, { recursive: true });\n\tawait fs.writeFile(\n\t\tpath.join(outputDir, \"registry.json\"),\n\t\t`${JSON.stringify(registry, null, 2)}\\n`,\n\t\t\"utf8\",\n\t);\n\n\treturn {\n\t\tcommandCount: registry.reduce((count, group) => count + group.tools.length, 0),\n\t\tgroups,\n\t\toutputDir,\n\t};\n}\n",
53
- "import { TaggedError } from 'better-result'\n\nexport class SchemaConversionError extends TaggedError('SchemaConversionError')<{\n path: string\n message: string\n cause: unknown\n}>() {}\n\nexport class ConvertToolsError extends TaggedError('ConvertToolsError')<{\n toolName: string\n message: string\n cause: unknown\n}>() {}\n\nexport class GenerateMCPTypesError extends TaggedError('GenerateMCPTypesError')<{\n outputDir: string\n message: string\n cause: unknown\n}>() {}\n\nexport class McpToolsProviderError extends TaggedError('McpToolsProviderError')<{\n message: string\n cause: unknown\n}>() {}\n",
54
- "/**\n * JSON Schema 7 to Zod Schema converter\n *\n * Converts MCP tool inputSchema (JSON Schema format) to Zod schemas\n * for use in Bunli CLI options.\n */\n\nimport { Result } from 'better-result'\nimport { z, type ZodTypeAny } from 'zod'\nimport { SchemaConversionError } from './errors.js'\nimport type { JSONSchema7 } from './types.js'\n\n/**\n * Options for schema conversion\n */\nexport interface SchemaConversionOptions {\n /**\n * Whether to make schemas coercive (parse strings to numbers, etc.)\n * Useful for CLI input which is always strings initially\n * @default true\n */\n coerce?: boolean\n}\n\n/**\n * Convert JSON Schema to Zod schema\n *\n * Supports:\n * - Primitive types: string, number, integer, boolean\n * - Enums and literals\n * - Arrays with item schemas\n * - Objects\n * - Constraints: min/max, minLength/maxLength, pattern\n * - Default values\n *\n * Returns `Err<SchemaConversionError>` for invalid runtime schema values\n * (for example, malformed regex patterns).\n */\nexport function jsonSchemaToZodSchema(\n schema: JSONSchema7 | undefined,\n options: SchemaConversionOptions = {}\n): Result<ZodTypeAny, SchemaConversionError> {\n return convertSchema(schema, options, '$')\n}\n\nfunction convertSchema(\n schema: JSONSchema7 | undefined,\n options: SchemaConversionOptions,\n path: string\n): Result<ZodTypeAny, SchemaConversionError> {\n const { coerce = true } = options\n\n // Handle undefined/null schema\n if (!schema || typeof schema !== 'object') {\n return Result.ok(z.unknown())\n }\n\n // Handle const (literal value)\n if (schema.const !== undefined) {\n return Result.ok(z.literal(schema.const as string | number | boolean))\n }\n\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n // Filter out null values and ensure at least one value\n const enumValues = schema.enum.filter((v): v is string | number => v !== null)\n if (enumValues.length > 0) {\n if (enumValues.every((v): v is string => typeof v === 'string')) {\n return Result.ok(z.enum(enumValues as [string, ...string[]]))\n }\n\n const literals = enumValues.map(v => z.literal(v))\n return unionFromSchemas(literals, path)\n }\n }\n\n // Handle anyOf/oneOf (union types)\n if (schema.anyOf && schema.anyOf.length > 0) {\n const schemas = mapSchemas(schema.anyOf, options, `${path}.anyOf`)\n if (Result.isError(schemas)) {\n return schemas\n }\n return unionFromSchemas(schemas.value, `${path}.anyOf`)\n }\n\n if (schema.oneOf && schema.oneOf.length > 0) {\n const schemas = mapSchemas(schema.oneOf, options, `${path}.oneOf`)\n if (Result.isError(schemas)) {\n return schemas\n }\n return unionFromSchemas(schemas.value, `${path}.oneOf`)\n }\n\n // Handle type-based conversion\n const schemaType = Array.isArray(schema.type) ? schema.type[0] : schema.type\n\n switch (schemaType) {\n case 'string':\n return buildStringSchema(schema, path)\n\n case 'number':\n case 'integer':\n return Result.ok(buildNumberSchema(schema, coerce))\n\n case 'boolean':\n return Result.ok(buildBooleanSchema())\n\n case 'array':\n return buildArraySchema(schema, options, path)\n\n case 'object':\n return buildObjectSchema(schema, options, path)\n\n case 'null':\n return Result.ok(z.null())\n\n default:\n // No type specified - try to infer from other properties\n if (schema.properties) {\n return buildObjectSchema(schema, options, path)\n }\n if (schema.items) {\n return buildArraySchema(schema, options, path)\n }\n return Result.ok(z.unknown())\n }\n}\n\n/**\n * Build Zod string schema with constraints\n */\nfunction buildStringSchema(\n schema: JSONSchema7,\n path: string\n): Result<z.ZodString, SchemaConversionError> {\n let zodSchema = z.string()\n\n // Apply constraints\n if (schema.minLength !== undefined) {\n zodSchema = zodSchema.min(schema.minLength)\n }\n if (schema.maxLength !== undefined) {\n zodSchema = zodSchema.max(schema.maxLength)\n }\n if (schema.pattern) {\n const pattern = schema.pattern\n const regexResult = Result.try({\n try: () => new RegExp(pattern),\n catch: (cause) =>\n new SchemaConversionError({\n path,\n message: `Invalid regex pattern \"${pattern}\"`,\n cause\n })\n })\n\n if (Result.isError(regexResult)) {\n return regexResult\n }\n\n zodSchema = zodSchema.regex(regexResult.value)\n }\n\n // Apply format validations\n if (schema.format) {\n switch (schema.format) {\n case 'email':\n zodSchema = zodSchema.email()\n break\n case 'uri':\n case 'url':\n zodSchema = zodSchema.url()\n break\n case 'uuid':\n zodSchema = zodSchema.uuid()\n break\n case 'date-time':\n zodSchema = zodSchema.datetime()\n break\n case 'date':\n zodSchema = zodSchema.date()\n break\n // Other formats: skip validation\n }\n }\n\n return Result.ok(zodSchema)\n}\n\n/**\n * Build Zod number schema with constraints\n */\nfunction buildNumberSchema(\n schema: JSONSchema7,\n coerce: boolean,\n): z.ZodNumber | z.ZodCoercedNumber {\n let zodSchema = coerce ? z.coerce.number() : z.number()\n\n // Integer constraint\n if (schema.type === 'integer' || (Array.isArray(schema.type) && schema.type.includes('integer'))) {\n zodSchema = zodSchema.int()\n }\n\n // Apply constraints\n if (schema.minimum !== undefined) {\n zodSchema = zodSchema.min(schema.minimum)\n }\n if (schema.maximum !== undefined) {\n zodSchema = zodSchema.max(schema.maximum)\n }\n if (schema.exclusiveMinimum !== undefined) {\n zodSchema = zodSchema.gt(schema.exclusiveMinimum)\n }\n if (schema.exclusiveMaximum !== undefined) {\n zodSchema = zodSchema.lt(schema.exclusiveMaximum)\n }\n if (schema.multipleOf !== undefined) {\n zodSchema = zodSchema.multipleOf(schema.multipleOf)\n }\n\n return zodSchema\n}\n\n/**\n * Build Zod boolean schema\n */\nfunction buildBooleanSchema(): z.ZodBoolean {\n return z.boolean()\n}\n\n/**\n * Build Zod array schema\n */\nfunction buildArraySchema(\n schema: JSONSchema7,\n options: SchemaConversionOptions,\n path: string\n): Result<ZodTypeAny, SchemaConversionError> {\n let itemSchema: ZodTypeAny = z.unknown()\n\n if (schema.items) {\n if (Array.isArray(schema.items)) {\n if (schema.items.length > 0) {\n const itemResult = convertSchema(schema.items[0], options, `${path}.items[0]`)\n if (Result.isError(itemResult)) {\n return itemResult\n }\n itemSchema = itemResult.value\n }\n } else {\n const itemResult = convertSchema(schema.items, options, `${path}.items`)\n if (Result.isError(itemResult)) {\n return itemResult\n }\n itemSchema = itemResult.value\n }\n }\n\n let zodSchema = z.array(itemSchema)\n\n // Apply constraints\n if (schema.minItems !== undefined) {\n zodSchema = zodSchema.min(schema.minItems)\n }\n if (schema.maxItems !== undefined) {\n zodSchema = zodSchema.max(schema.maxItems)\n }\n\n return Result.ok(zodSchema)\n}\n\n/**\n * Build Zod object schema\n */\nfunction buildObjectSchema(\n schema: JSONSchema7,\n options: SchemaConversionOptions,\n path: string\n): Result<ZodTypeAny, SchemaConversionError> {\n // For nested objects without properties, use record\n if (!schema.properties) {\n return Result.ok(z.record(z.string(), z.unknown()))\n }\n\n // Build object shape\n const shape: Record<string, ZodTypeAny> = {}\n const requiredFields = new Set(schema.required || [])\n\n for (const [propName, propSchema] of Object.entries(schema.properties)) {\n const propResult = convertSchema(propSchema, options, `${path}.properties.${propName}`)\n if (Result.isError(propResult)) {\n return propResult\n }\n\n let propZodSchema = propResult.value\n\n // Apply default if present\n if (propSchema.default !== undefined) {\n propZodSchema = propZodSchema.default(propSchema.default)\n }\n\n // Make optional if not required\n if (!requiredFields.has(propName)) {\n propZodSchema = propZodSchema.optional()\n }\n\n shape[propName] = propZodSchema\n }\n\n return Result.ok(z.object(shape))\n}\n\nfunction mapSchemas(\n schemas: JSONSchema7[],\n options: SchemaConversionOptions,\n path: string\n): Result<ZodTypeAny[], SchemaConversionError> {\n const zodSchemas: ZodTypeAny[] = []\n\n for (let index = 0; index < schemas.length; index += 1) {\n const converted = convertSchema(schemas[index], options, `${path}[${index}]`)\n if (Result.isError(converted)) {\n return converted\n }\n zodSchemas.push(converted.value)\n }\n\n return Result.ok(zodSchemas)\n}\n\nfunction unionFromSchemas(\n schemas: ZodTypeAny[],\n path: string\n): Result<ZodTypeAny, SchemaConversionError> {\n if (schemas.length === 0) {\n return Result.err(\n new SchemaConversionError({\n path,\n message: `Cannot create union from an empty schema set at ${path}`,\n cause: new Error('Empty schema union')\n })\n )\n }\n\n if (schemas.length === 1) {\n return Result.ok(schemas[0]!)\n }\n\n let unionSchema: ZodTypeAny = z.union([schemas[0]!, schemas[1]!])\n for (let index = 2; index < schemas.length; index += 1) {\n unionSchema = z.union([unionSchema, schemas[index]!])\n }\n\n return Result.ok(unionSchema)\n}\n\n/**\n * Extract metadata from JSON Schema for codegen\n *\n * Returns information useful for generating TypeScript types\n * and completion hints.\n */\nexport interface SchemaMetadata {\n type: string\n description?: string\n enumValues?: Array<string | number>\n minimum?: number\n maximum?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n format?: string\n isArray?: boolean\n itemType?: string\n hasDefault?: boolean\n default?: unknown\n}\n\nexport function extractSchemaMetadata(schema: JSONSchema7 | undefined): SchemaMetadata {\n if (!schema) {\n return { type: 'unknown' }\n }\n\n const schemaType = Array.isArray(schema.type) ? schema.type[0] : schema.type\n const metadata: SchemaMetadata = {\n type: schemaType || 'unknown',\n description: schema.description,\n hasDefault: schema.default !== undefined,\n default: schema.default\n }\n\n // Extract enum values\n if (schema.enum) {\n metadata.enumValues = schema.enum.filter((v): v is string | number =>\n typeof v === 'string' || typeof v === 'number'\n )\n }\n\n // Extract constraints\n if (schema.minimum !== undefined) metadata.minimum = schema.minimum\n if (schema.maximum !== undefined) metadata.maximum = schema.maximum\n if (schema.minLength !== undefined) metadata.minLength = schema.minLength\n if (schema.maxLength !== undefined) metadata.maxLength = schema.maxLength\n if (schema.pattern) metadata.pattern = schema.pattern\n if (schema.format) metadata.format = schema.format\n\n // Array info\n if (schemaType === 'array') {\n metadata.isArray = true\n if (schema.items && !Array.isArray(schema.items)) {\n const itemType = Array.isArray(schema.items.type) ? schema.items.type[0] : schema.items.type\n metadata.itemType = itemType || 'unknown'\n }\n }\n\n return metadata\n}\n",
55
- "/**\n * Naming utilities for converting MCP tool names to CLI command names\n */\n\n/**\n * Convert a string to kebab-case\n * Handles snake_case, camelCase, and PascalCase\n *\n * @example\n * toKebabCase('create_issue') // 'create-issue'\n * toKebabCase('createIssue') // 'create-issue'\n * toKebabCase('CreateIssue') // 'create-issue'\n */\nexport function toKebabCase(str: string): string {\n return str\n // Handle snake_case\n .replace(/_/g, '-')\n // Handle camelCase and PascalCase\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase()\n}\n\n/**\n * Convert MCP tool name to CLI command name\n * Applies toKebabCase and optionally adds namespace prefix\n *\n * @example\n * toCommandName('create_issue', 'linear') // 'linear:create-issue'\n * toCommandName('list-users') // 'list-users'\n */\nexport function toCommandName(toolName: string, namespace?: string): string {\n const kebabName = toKebabCase(toolName)\n return namespace ? `${namespace}:${kebabName}` : kebabName\n}\n\n/**\n * Convert MCP property name to CLI flag name\n * Uses kebab-case for consistency with CLI conventions\n *\n * @example\n * toFlagName('teamId') // 'team-id'\n * toFlagName('issue_priority') // 'issue-priority'\n */\nexport function toFlagName(propName: string): string {\n return toKebabCase(propName)\n}\n\n/**\n * Convert string to PascalCase\n * Handles kebab-case, snake_case, and namespaced names\n * Used for generating TypeScript variable names\n *\n * @example\n * toPascalCase('create-issue') // 'CreateIssue'\n * toPascalCase('create_issue') // 'CreateIssue'\n * toPascalCase('linear:list-users') // 'LinearListUsers'\n * toPascalCase('company_research_exa') // 'CompanyResearchExa'\n */\nexport function toPascalCase(str: string): string {\n return str\n .split(/[-:_]/)\n .filter(Boolean)\n .map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('')\n}\n\n/**\n * Convert kebab-case to camelCase\n * Used for generating TypeScript property names\n *\n * @example\n * toCamelCase('team-id') // 'teamId'\n * toCamelCase('issue-priority') // 'issuePriority'\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str)\n return pascal.charAt(0).toLowerCase() + pascal.slice(1)\n}\n\n/**\n * Escape string for use in TypeScript string literals\n */\nexport function escapeString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n}\n\n/**\n * Generate a unique variable name from a command name\n * Ensures uniqueness by tracking used names\n */\nexport function generateUniqueVarName(\n commandName: string,\n usedNames: Set<string>\n): string {\n let baseName = toPascalCase(commandName)\n let uniqueName = baseName\n let counter = 1\n\n while (usedNames.has(uniqueName)) {\n uniqueName = `${baseName}${counter}`\n counter++\n }\n\n usedNames.add(uniqueName)\n return uniqueName\n}\n",
56
- "/**\n * MCP Tool to Bunli Command converter\n *\n * This is the core transformation layer - converts MCP tool schemas\n * into Bunli commands. No SDK dependency, just pure transformation.\n */\n\nimport { option, type Command, type CLIOption, type Options } from '@bunli/core'\nimport { Result } from 'better-result'\nimport type { MCPTool, ConvertOptions, MCPCommand } from './types.js'\nimport { ConvertToolsError } from './errors.js'\nimport { jsonSchemaToZodSchema } from './schema-to-zod.js'\nimport { toCommandName, toFlagName } from './utils.js'\n\n/**\n * Convert MCP tools to Bunli commands\n *\n * This is the main entry point for the plugin. Takes an array of MCP tool\n * objects (fetched by your MCP client) and converts them to Bunli commands.\n *\n * @example\n * ```typescript\n * // Fetch tools from your MCP client\n * const tools = await yourMcpClient.listTools()\n *\n * // Convert to Bunli commands\n * const commands = createCommandsFromMCPTools(tools, {\n * namespace: 'linear',\n * createHandler: (toolName) => async ({ flags }) => {\n * return yourMcpClient.call(toolName, flags)\n * }\n * })\n *\n * // Register with CLI\n * commands.forEach(cmd => cli.command(cmd))\n * ```\n */\nexport function createCommandsFromMCPTools<TStore = Record<string, unknown>>(\n tools: MCPTool[],\n options: ConvertOptions<TStore>\n): Result<MCPCommand<TStore>[], ConvertToolsError> {\n const commands: MCPCommand<TStore>[] = []\n\n for (const tool of tools) {\n const converted = convertToolToCommand(tool, options)\n if (Result.isError(converted)) {\n return converted\n }\n commands.push(converted.value)\n }\n\n return Result.ok(commands)\n}\n\n/**\n * Convert a single MCP tool to a Bunli command\n */\nfunction convertToolToCommand<TStore>(\n tool: MCPTool,\n options: ConvertOptions<TStore>\n): Result<MCPCommand<TStore>, ConvertToolsError> {\n const {\n namespace,\n createHandler,\n commandName: customCommandName,\n flagName: customFlagName\n } = options\n\n // Generate command name\n const commandName = customCommandName\n ? customCommandName(tool.name)\n : toCommandName(tool.name, namespace)\n\n // Convert input schema to Bunli options\n const bunliOptionsResult = convertInputSchemaToOptions(\n tool.name,\n tool.inputSchema,\n customFlagName || toFlagName\n )\n if (Result.isError(bunliOptionsResult)) {\n return bunliOptionsResult\n }\n\n // Create the command\n const command: MCPCommand<TStore> = {\n name: commandName,\n description: tool.description || `Invoke MCP tool: ${tool.name}`,\n options: bunliOptionsResult.value,\n handler: createHandler(tool.name)\n }\n\n return Result.ok(command)\n}\n\n/**\n * Convert MCP inputSchema to Bunli options\n */\nfunction convertInputSchemaToOptions(\n toolName: string,\n inputSchema: MCPTool['inputSchema'],\n flagNameTransform: (name: string) => string\n): Result<Options, ConvertToolsError> {\n const bunliOptions: Options = {}\n\n if (!inputSchema?.properties) {\n return Result.ok(bunliOptions)\n }\n\n const requiredFields = new Set(inputSchema.required || [])\n\n for (const [propName, propSchema] of Object.entries(inputSchema.properties)) {\n // Convert JSON Schema to Zod\n const schemaResult = jsonSchemaToZodSchema(propSchema, { coerce: true })\n if (Result.isError(schemaResult)) {\n return Result.err(\n new ConvertToolsError({\n toolName,\n message: `Failed to convert input schema field \"${propName}\" for tool \"${toolName}\"`,\n cause: schemaResult.error\n })\n )\n }\n let zodSchema = schemaResult.value\n\n // Apply default if present\n if (propSchema.default !== undefined) {\n zodSchema = zodSchema.default(propSchema.default)\n }\n\n // Make optional if not required\n if (!requiredFields.has(propName)) {\n zodSchema = zodSchema.optional()\n }\n\n // Convert property name to flag name\n const flagName = flagNameTransform(propName)\n\n // Extract short option from description if present (e.g., \"[-t] Title\")\n const shortMatch = propSchema.description?.match(/^\\[-([a-zA-Z])\\]\\s*/)\n const short = shortMatch ? shortMatch[1] : undefined\n const description = shortMatch\n ? propSchema.description?.slice(shortMatch[0].length)\n : propSchema.description\n\n // Create CLI option\n bunliOptions[flagName] = option(zodSchema, {\n description,\n short\n })\n }\n\n return Result.ok(bunliOptions)\n}\n\n/**\n * Convert a single MCP tool to command metadata (for codegen)\n *\n * Returns metadata that can be used to generate TypeScript types\n * without creating the full command object.\n */\nexport interface MCPCommandMetadata {\n name: string\n toolName: string\n namespace?: string\n description?: string\n options: Record<string, {\n type: string\n required: boolean\n description?: string\n short?: string\n enumValues?: Array<string | number>\n minimum?: number\n maximum?: number\n hasDefault?: boolean\n default?: unknown\n }>\n}\n\nexport function extractCommandMetadata(\n tool: MCPTool,\n namespace?: string,\n flagNameTransform: (name: string) => string = toFlagName\n): MCPCommandMetadata {\n const commandName = toCommandName(tool.name, namespace)\n\n const optionsMeta: MCPCommandMetadata['options'] = {}\n\n if (tool.inputSchema?.properties) {\n const requiredFields = new Set(tool.inputSchema.required || [])\n\n for (const [propName, propSchema] of Object.entries(tool.inputSchema.properties)) {\n const flagName = flagNameTransform(propName)\n const schemaType = Array.isArray(propSchema.type) ? propSchema.type[0] : propSchema.type\n\n // Extract short option\n const shortMatch = propSchema.description?.match(/^\\[-([a-zA-Z])\\]\\s*/)\n const short = shortMatch ? shortMatch[1] : undefined\n const description = shortMatch\n ? propSchema.description?.slice(shortMatch[0].length)\n : propSchema.description\n\n optionsMeta[flagName] = {\n type: schemaType || 'unknown',\n required: requiredFields.has(propName) && propSchema.default === undefined,\n description,\n short,\n hasDefault: propSchema.default !== undefined,\n default: propSchema.default\n }\n\n // Add constraints\n if (propSchema.enum) {\n optionsMeta[flagName]!.enumValues = propSchema.enum.filter(\n (v): v is string | number => typeof v === 'string' || typeof v === 'number'\n )\n }\n if (propSchema.minimum !== undefined) {\n optionsMeta[flagName]!.minimum = propSchema.minimum\n }\n if (propSchema.maximum !== undefined) {\n optionsMeta[flagName]!.maximum = propSchema.maximum\n }\n }\n }\n\n return {\n name: commandName,\n toolName: tool.name,\n namespace,\n description: tool.description,\n options: optionsMeta\n }\n}\n",
57
- "/**\n * Type generation for MCP commands\n *\n * Generates TypeScript files with Zod schemas and module augmentation\n * for RegisteredCommands. Similar to Prisma's client generation pattern.\n */\n\nimport { mkdir, writeFile } from 'fs/promises'\nimport { join } from 'path'\nimport { Result } from 'better-result'\nimport type { GenerateTypesOptions, MCPToolGroup, MCPTool, JSONSchema7 } from './types.js'\nimport { extractCommandMetadata, type MCPCommandMetadata } from './converter.js'\nimport { toPascalCase, escapeString } from './utils.js'\nimport { GenerateMCPTypesError } from './errors.js'\n\n/**\n * Generate TypeScript types for MCP commands\n *\n * Creates files like `.bunli/mcp-linear.gen.ts` with:\n * - Zod schemas for each command's options\n * - TypeScript types inferred from schemas\n * - Module augmentation for RegisteredCommands\n *\n * @example\n * ```typescript\n * await generateMCPTypes({\n * tools: [\n * { namespace: 'linear', tools: linearTools }\n * ],\n * outputDir: '.bunli'\n * })\n * ```\n */\nexport async function generateMCPTypes(\n options: GenerateTypesOptions\n): Promise<Result<void, GenerateMCPTypesError>> {\n const { tools, outputDir } = options\n\n return await Result.tryPromise({\n try: async () => {\n // Ensure output directory exists\n await mkdir(outputDir, { recursive: true })\n\n // Generate a file for each namespace\n for (const { namespace, tools: toolList } of tools) {\n if (!toolList || toolList.length === 0) continue\n\n const content = generateNamespaceTypes(namespace, toolList)\n const fileName = `mcp-${namespace}.gen.ts`\n const filePath = join(outputDir, fileName)\n\n await writeFile(filePath, content, 'utf-8')\n }\n\n // Generate index file that re-exports all\n const indexContent = generateIndexFile(tools)\n await writeFile(join(outputDir, 'mcp-index.gen.ts'), indexContent, 'utf-8')\n },\n catch: (cause) =>\n new GenerateMCPTypesError({\n outputDir,\n message: `Failed to generate MCP types in ${outputDir}`,\n cause\n })\n })\n}\n\n/**\n * Generate types for a single namespace\n */\nfunction generateNamespaceTypes(namespace: string, tools: MCPTool[]): string {\n const lines: string[] = []\n\n // Header\n lines.push(`// This file was automatically generated by @bunli/plugin-mcp`)\n lines.push(`// DO NOT EDIT - changes will be overwritten`)\n lines.push(``)\n lines.push(`import type { Command, Options, CLIOption } from '@bunli/core'`)\n lines.push(`import { option } from '@bunli/core'`)\n lines.push(`import { z } from 'zod'`)\n lines.push(``)\n\n // Extract metadata for all tools\n const metadata = tools.map(tool => extractCommandMetadata(tool, namespace))\n\n // Generate Zod schemas and types for each command\n for (const cmd of metadata) {\n lines.push(generateCommandSchema(cmd))\n lines.push(``)\n }\n\n // Generate module augmentation\n lines.push(generateModuleAugmentation(namespace, metadata))\n\n return lines.join('\\n')\n}\n\n/**\n * Generate Zod schema and types for a single command\n */\nfunction generateCommandSchema(cmd: MCPCommandMetadata): string {\n const lines: string[] = []\n const baseName = toPascalCase(cmd.name)\n\n // Generate options object\n lines.push(`// ${cmd.description || cmd.toolName}`)\n lines.push(`export const ${baseName}Options = {`)\n\n for (const [flagName, opt] of Object.entries(cmd.options)) {\n const zodSchema = generateZodSchemaString(opt)\n const metadata: string[] = []\n\n if (opt.description) {\n metadata.push(`description: '${escapeString(opt.description)}'`)\n }\n if (opt.short) {\n metadata.push(`short: '${opt.short}'`)\n }\n\n const metadataStr = metadata.length > 0 ? `, { ${metadata.join(', ')} }` : ''\n lines.push(` '${flagName}': option(${zodSchema}${metadataStr}),`)\n }\n\n lines.push(`} as const`)\n lines.push(``)\n\n // Generate flags type\n lines.push(`export type ${baseName}Flags = {`)\n\n for (const [flagName, opt] of Object.entries(cmd.options)) {\n const tsType = jsonSchemaTypeToTS(opt.type, opt.enumValues)\n const optional = !opt.required ? '?' : ''\n lines.push(` '${flagName}'${optional}: ${tsType}`)\n }\n\n lines.push(`}`)\n\n return lines.join('\\n')\n}\n\n/**\n * Generate Zod schema string from option metadata\n */\nfunction generateZodSchemaString(opt: MCPCommandMetadata['options'][string]): string {\n let schema: string\n\n // Handle enum types\n if (opt.enumValues && opt.enumValues.length > 0) {\n if (opt.enumValues.every((v): v is string => typeof v === 'string')) {\n const values = opt.enumValues.map(v => `'${escapeString(v as string)}'`).join(', ')\n schema = `z.enum([${values}])`\n } else {\n const literals = opt.enumValues.map(v =>\n typeof v === 'string' ? `z.literal('${escapeString(v)}')` : `z.literal(${v})`\n ).join(', ')\n schema = `z.union([${literals}])`\n }\n } else {\n // Handle base types\n switch (opt.type) {\n case 'string':\n schema = 'z.string()'\n break\n case 'number':\n schema = 'z.coerce.number()'\n break\n case 'integer':\n schema = 'z.coerce.number().int()'\n break\n case 'boolean':\n schema = 'z.boolean()'\n break\n case 'array':\n schema = 'z.array(z.unknown())'\n break\n case 'object':\n schema = 'z.record(z.unknown())'\n break\n default:\n schema = 'z.unknown()'\n }\n }\n\n // Add constraints\n if (opt.minimum !== undefined) {\n schema += `.min(${opt.minimum})`\n }\n if (opt.maximum !== undefined) {\n schema += `.max(${opt.maximum})`\n }\n\n // Add default\n if (opt.hasDefault && opt.default !== undefined) {\n const defaultVal = typeof opt.default === 'string'\n ? `'${escapeString(opt.default)}'`\n : JSON.stringify(opt.default)\n schema += `.default(${defaultVal})`\n }\n\n // Make optional if not required\n if (!opt.required && !opt.hasDefault) {\n schema += '.optional()'\n }\n\n return schema\n}\n\n/**\n * Convert JSON Schema type to TypeScript type\n */\nfunction jsonSchemaTypeToTS(\n type: string,\n enumValues?: Array<string | number>\n): string {\n // Handle enum\n if (enumValues && enumValues.length > 0) {\n return enumValues\n .map(v => typeof v === 'string' ? `'${escapeString(v)}'` : String(v))\n .join(' | ')\n }\n\n switch (type) {\n case 'string':\n return 'string'\n case 'number':\n case 'integer':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'array':\n return 'unknown[]'\n case 'object':\n return 'Record<string, unknown>'\n case 'null':\n return 'null'\n default:\n return 'unknown'\n }\n}\n\n/**\n * Generate module augmentation for RegisteredCommands\n */\nfunction generateModuleAugmentation(\n namespace: string,\n metadata: MCPCommandMetadata[]\n): string {\n const lines: string[] = []\n\n lines.push(`// Module augmentation for type-safe execute()`)\n lines.push(`declare module '@bunli/core' {`)\n lines.push(` interface RegisteredCommands {`)\n\n for (const cmd of metadata) {\n const baseName = toPascalCase(cmd.name)\n lines.push(` '${cmd.name}': Command<typeof ${baseName}Options>`)\n }\n\n lines.push(` }`)\n lines.push(`}`)\n\n return lines.join('\\n')\n}\n\n/**\n * Generate index file that re-exports all namespaces\n */\nfunction generateIndexFile(toolGroups: MCPToolGroup[]): string {\n const lines: string[] = []\n\n lines.push(`// This file was automatically generated by @bunli/plugin-mcp`)\n lines.push(`// DO NOT EDIT - changes will be overwritten`)\n lines.push(``)\n\n for (const { namespace } of toolGroups) {\n if (!namespace) continue\n lines.push(`export * from './mcp-${namespace}.gen.js'`)\n }\n\n return lines.join('\\n')\n}\n",
58
- "import { defineCommand } from \"@bunli/core\";\nimport { z } from \"zod\";\n\nimport { getMcpSchemaSources } from \"../config\";\nimport { loadMcpToolGroups, syncMcpSchemas } from \"../mcp\";\n\nexport const mcpCommand = defineCommand({\n\tdefaultFormat: \"json\",\n\tdescription: \"Inspect or sync schema-driven MCP metadata for wp-typia.\",\n\thandler: async (args) => {\n\t\tconst subcommand = args.positional[0] ?? \"list\";\n\t\tconst userConfig =\n\t\t\targs.context?.store?.wpTypiaUserConfig &&\n\t\t\ttypeof args.context.store.wpTypiaUserConfig === \"object\"\n\t\t\t\t? args.context.store.wpTypiaUserConfig\n\t\t\t\t: {};\n\t\tconst schemaSources = getMcpSchemaSources(userConfig);\n\n\t\tif (schemaSources.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No MCP schema sources are configured. Add `mcp.schemaSources` in ~/.config/wp-typia/config.json, .wp-typiarc(.json), or package.json#wp-typia.\",\n\t\t\t);\n\t\t}\n\n\t\tif (subcommand === \"list\") {\n\t\t\tconst groups = await loadMcpToolGroups(args.cwd, schemaSources);\n\t\t\tconst summary = groups.map((group) => ({\n\t\t\t\tnamespace: group.namespace,\n\t\t\t\ttoolCount: group.tools.length,\n\t\t\t\ttools: group.tools.map((tool) => tool.name),\n\t\t\t}));\n\t\t\tconst prefersStructuredOutput =\n\t\t\t\t(args.formatExplicit && args.format !== \"toon\") ||\n\t\t\t\targs.agent ||\n\t\t\t\tBoolean(args.context?.store?.isAIAgent);\n\t\t\tif (prefersStructuredOutput) {\n\t\t\t\targs.output({ groups: summary });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const group of summary) {\n\t\t\t\tconsole.log(`${group.namespace} (${group.toolCount})`);\n\t\t\t\tfor (const tool of group.tools) {\n\t\t\t\t\tconsole.log(` - ${tool}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (subcommand === \"sync\") {\n\t\t\tconst outputDir =\n\t\t\t\t(args.flags[\"output-dir\"] as string | undefined) ?? `${args.cwd}/.bunli/mcp`;\n\t\t\tconst result = await syncMcpSchemas(args.cwd, schemaSources, outputDir);\n\t\t\tconsole.log(\n\t\t\t\t`Synced ${result.commandCount} MCP tools across ${result.groups.length} namespaces into ${result.outputDir}.`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(`Unknown mcp subcommand \"${subcommand}\". Expected list or sync.`);\n\t},\n\tname: \"mcp\",\n\toptions: {\n\t\t\"output-dir\": {\n\t\t\tdescription: \"Output directory for generated MCP metadata during `mcp sync`.\",\n\t\t\tschema: z.string().optional(),\n\t\t},\n\t},\n});\n\nexport default mcpCommand;\n",
59
- "import { createElement } from \"react\";\n\nimport { defineCommand } from \"@bunli/core\";\n\nimport {\n\tbuildCommandOptions,\n\tMIGRATE_OPTION_METADATA,\n} from \"../command-option-metadata\";\nimport { resolveBundledModuleHref } from \"../render-loader\";\nimport { executeMigrateCommand } from \"../runtime-bridge\";\nimport type { WpTypiaRenderArgs } from \"./render-types\";\nimport { LazyFlow } from \"../ui/lazy-flow\";\n\nconst supportsInteractiveTui = typeof Bun !== \"undefined\";\n\nfunction loadMigrateFlow() {\n\treturn import(\n\t\tresolveBundledModuleHref(import.meta.url, [\n\t\t\t\"./ui/migrate-flow.js\",\n\t\t\t\"../ui/migrate-flow.js\",\n\t\t\t\"../ui/migrate-flow.tsx\",\n\t\t]),\n\t).then((module) => ({ default: module.MigrateFlow }));\n}\n\nconst migrateOptions = buildCommandOptions(MIGRATE_OPTION_METADATA);\n\nexport const migrateCommand = defineCommand({\n\tdefaultFormat: \"toon\",\n\tdescription: \"Run migration workflows for migration-capable wp-typia projects.\",\n\thandler: async (args) => {\n\t\tawait executeMigrateCommand({\n\t\t\tcommand: args.positional[0],\n\t\t\tcwd: args.cwd,\n\t\t\tflags: args.flags as Record<string, unknown>,\n\t\t});\n\t},\n\tname: \"migrate\",\n\toptions: migrateOptions,\n\t...(supportsInteractiveTui\n\t\t? {\n\t\t\t\trender: (args: WpTypiaRenderArgs) =>\n\t\t\t\t\tcreateElement(LazyFlow, {\n\t\t\t\t\t\tloader: loadMigrateFlow,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tcwd: args.cwd,\n\t\t\t\t\t\t\tinitialValues: {\n\t\t\t\t\t\t\t\tall: Boolean(args.flags.all ?? false),\n\t\t\t\t\t\t\t\tcommand:\n\t\t\t\t\t\t\t\t\t(args.positional[0] as\n\t\t\t\t\t\t\t\t\t\t| \"init\"\n\t\t\t\t\t\t\t\t\t\t| \"snapshot\"\n\t\t\t\t\t\t\t\t\t\t| \"plan\"\n\t\t\t\t\t\t\t\t\t\t| \"wizard\"\n\t\t\t\t\t\t\t\t\t\t| \"diff\"\n\t\t\t\t\t\t\t\t\t\t| \"scaffold\"\n\t\t\t\t\t\t\t\t\t\t| \"verify\"\n\t\t\t\t\t\t\t\t\t\t| \"doctor\"\n\t\t\t\t\t\t\t\t\t\t| \"fixtures\"\n\t\t\t\t\t\t\t\t\t\t| \"fuzz\"\n\t\t\t\t\t\t\t\t\t\t| undefined) ?? \"plan\",\n\t\t\t\t\t\t\t\t\"current-migration-version\": args.flags[\n\t\t\t\t\t\t\t\t\t\"current-migration-version\"\n\t\t\t\t\t\t\t\t] as string | undefined,\n\t\t\t\t\t\t\t\tforce: Boolean(args.flags.force ?? false),\n\t\t\t\t\t\t\t\t\"from-migration-version\": args.flags[\n\t\t\t\t\t\t\t\t\t\"from-migration-version\"\n\t\t\t\t\t\t\t\t] as string | undefined,\n\t\t\t\t\t\t\t\titerations: args.flags.iterations as string | undefined,\n\t\t\t\t\t\t\t\t\"migration-version\": args.flags[\n\t\t\t\t\t\t\t\t\t\"migration-version\"\n\t\t\t\t\t\t\t\t] as string | undefined,\n\t\t\t\t\t\t\t\tseed: args.flags.seed as string | undefined,\n\t\t\t\t\t\t\t\t\"to-migration-version\":\n\t\t\t\t\t\t\t\t\t(args.flags[\"to-migration-version\"] as string | undefined) ??\n\t\t\t\t\t\t\t\t\t\"current\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\ttui: {\n\t\t\t\t\trenderer: {\n\t\t\t\t\t\tbufferMode: \"alternate\" as const,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t: {}),\n});\n\nexport default migrateCommand;\n",
60
- "import { defineCommand } from \"@bunli/core\";\nimport { z } from \"zod\";\n\nimport { executeSyncCommand } from \"../runtime-bridge\";\n\nexport const syncCommand = defineCommand({\n\tdescription: \"Run the common generated-project sync workflow.\",\n\thandler: async (args) => {\n\t\tawait executeSyncCommand({\n\t\t\tcheck: Boolean(args.flags.check),\n\t\t\tcwd: args.cwd,\n\t\t});\n\t},\n\tname: \"sync\",\n\toptions: {\n\t\tcheck: {\n\t\t\targumentKind: \"flag\" as const,\n\t\t\tdescription:\n\t\t\t\t\"Check generated artifacts without writing changes. Advanced sync-types-only flags stay on sync-types.\",\n\t\t\tschema: z.boolean().default(false),\n\t\t},\n\t},\n});\n\nexport default syncCommand;\n",
61
- "import { defineCommand } from \"@bunli/core\";\n\nimport {\n\tbuildCommandOptions,\n\tTEMPLATES_OPTION_METADATA,\n} from \"../command-option-metadata\";\nimport { executeTemplatesCommand, listTemplatesForRuntime } from \"../runtime-bridge\";\n\nexport const templatesCommand = defineCommand({\n\tdefaultFormat: \"json\",\n\tdescription: \"Inspect built-in and external scaffold templates.\",\n\thandler: async (args) => {\n\t\tconst subcommand = (args.positional[0] ?? \"list\") as string;\n\t\tconst id = args.positional[1] ?? (args.flags.id as string | undefined);\n\t\tconst effectiveSubcommand =\n\t\t\tsubcommand === \"list\" && typeof id === \"string\" && id.length > 0\n\t\t\t\t? \"inspect\"\n\t\t\t\t: subcommand;\n\t\tconst prefersStructuredOutput =\n\t\t\t(args.formatExplicit && args.format !== \"toon\") ||\n\t\t\targs.agent ||\n\t\t\tBoolean(args.context?.store?.isAIAgent);\n\n\t\tif (prefersStructuredOutput) {\n\t\t\tconst templates = await listTemplatesForRuntime();\n\t\t\tif (effectiveSubcommand === \"list\") {\n\t\t\t\targs.output({ templates });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (effectiveSubcommand === \"inspect\" && id) {\n\t\t\t\tconst template = templates.find((entry) => entry.id === id);\n\t\t\t\tif (!template) {\n\t\t\t\t\tthrow new Error(`Unknown template \"${id}\".`);\n\t\t\t\t}\n\t\t\t\targs.output({ template });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tawait executeTemplatesCommand({\n\t\t\tflags: { id, subcommand: effectiveSubcommand },\n\t\t});\n\t},\n\tname: \"templates\",\n\toptions: buildCommandOptions(TEMPLATES_OPTION_METADATA),\n});\n\nexport default templatesCommand;\n",
62
- "import type { Command } from \"@bunli/core\";\n\nimport { addCommand } from \"./commands/add\";\nimport { createCommand } from \"./commands/create\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport { mcpCommand } from \"./commands/mcp\";\nimport { migrateCommand } from \"./commands/migrate\";\nimport { syncCommand } from \"./commands/sync\";\nimport { templatesCommand } from \"./commands/templates\";\n\nexport const wpTypiaCommands: Command<any, any>[] = [\n\tcreateCommand,\n\tsyncCommand,\n\taddCommand,\n\tmigrateCommand,\n\ttemplatesCommand,\n\tdoctorCommand,\n\tmcpCommand,\n];\n",
11
+ "import path from 'node:path'\nimport {\n ADD_OPTION_METADATA,\n buildCommandOptionParser,\n collectOptionNamesByType,\n CREATE_OPTION_METADATA,\n GLOBAL_OPTION_METADATA,\n MIGRATE_OPTION_METADATA,\n TEMPLATES_OPTION_METADATA,\n} from './command-option-metadata'\n\nexport const WP_TYPIA_CANONICAL_CREATE_USAGE = 'wp-typia create <project-dir>';\nexport const WP_TYPIA_POSITIONAL_ALIAS_USAGE = 'wp-typia <project-dir>';\nexport const WP_TYPIA_CANONICAL_MIGRATE_USAGE = 'wp-typia migrate <subcommand>';\nexport const WP_TYPIA_DEPRECATED_MIGRATIONS_USAGE =\n 'wp-typia migrations <subcommand>';\nexport const WP_TYPIA_BUNLI_MIGRATION_DOC =\n 'https://imjlk.github.io/wp-typia/maintainers/bunli-cli-migration/';\n\nexport const WP_TYPIA_RESERVED_TOP_LEVEL_COMMAND_NAMES = [\n 'create',\n 'sync',\n 'add',\n 'migrate',\n 'templates',\n 'doctor',\n 'mcp',\n 'help',\n 'version',\n 'skills',\n 'completions',\n 'complete',\n] as const;\n\nexport const WP_TYPIA_TOP_LEVEL_COMMAND_NAMES = [\n 'create',\n 'sync',\n 'add',\n 'migrate',\n 'templates',\n 'doctor',\n 'mcp',\n] as const;\n\nconst SHARED_OPTION_PARSER = buildCommandOptionParser(\n ADD_OPTION_METADATA,\n GLOBAL_OPTION_METADATA,\n CREATE_OPTION_METADATA,\n MIGRATE_OPTION_METADATA,\n TEMPLATES_OPTION_METADATA,\n);\n\nconst STRING_OPTION_NAMES_BY_COMMAND = {\n add: new Set(collectOptionNamesByType(ADD_OPTION_METADATA, 'string')),\n create: new Set(collectOptionNamesByType(CREATE_OPTION_METADATA, 'string')),\n migrate: new Set(collectOptionNamesByType(MIGRATE_OPTION_METADATA, 'string')),\n templates: new Set(collectOptionNamesByType(TEMPLATES_OPTION_METADATA, 'string')),\n} as const;\n\nconst GLOBAL_STRING_OPTION_NAMES = new Set(\n collectOptionNamesByType(GLOBAL_OPTION_METADATA, 'string'),\n);\n\nconst SHORT_OPTION_NAMES_WITH_VALUES = new Set<string>(\n [...SHARED_OPTION_PARSER.shortFlagMap.entries()]\n .filter(([, option]) => option.type === 'string')\n .map(([short]) => short),\n);\n\nfunction isLongOptionValueConsumer(optionName: string): boolean {\n if (GLOBAL_STRING_OPTION_NAMES.has(optionName)) {\n return true;\n }\n\n return Object.values(STRING_OPTION_NAMES_BY_COMMAND).some((optionNames) =>\n optionNames.has(optionName as never),\n );\n}\n\nfunction findFirstPositionalIndex(argv: string[]): number {\n const positionalIndexes = collectPositionalIndexes(argv);\n return positionalIndexes[0] ?? -1;\n}\n\nfunction collectPositionalIndexes(argv: string[]): number[] {\n const positionalIndexes: number[] = [];\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--') {\n for (let restIndex = index + 1; restIndex < argv.length; restIndex += 1) {\n positionalIndexes.push(restIndex);\n }\n break;\n }\n if (!arg.startsWith('-') || arg === '-') {\n positionalIndexes.push(index);\n continue;\n }\n if (arg.startsWith('--')) {\n if (arg.includes('=')) {\n continue;\n }\n if (isLongOptionValueConsumer(arg.slice(2))) {\n index += 1;\n }\n continue;\n }\n if (arg.length === 2 && SHORT_OPTION_NAMES_WITH_VALUES.has(arg.slice(1))) {\n index += 1;\n }\n }\n\n return positionalIndexes;\n}\n\nexport const WP_TYPIA_FUTURE_COMMAND_TREE = [\n {\n description: 'Scaffold a new wp-typia project.',\n name: 'create',\n },\n {\n description: 'Run the common generated-project sync workflow.',\n name: 'sync',\n },\n {\n description: 'Extend an official wp-typia workspace.',\n name: 'add',\n subcommands: [\n 'block',\n 'variation',\n 'pattern',\n 'binding-source',\n 'rest-resource',\n 'editor-plugin',\n 'hooked-block',\n ],\n },\n {\n description: 'Run migration workflows.',\n name: 'migrate',\n subcommands: [\n 'init',\n 'snapshot',\n 'diff',\n 'scaffold',\n 'plan',\n 'wizard',\n 'verify',\n 'doctor',\n 'fixtures',\n 'fuzz',\n ],\n },\n {\n description: 'Inspect scaffold templates.',\n name: 'templates',\n subcommands: ['list', 'inspect'],\n },\n {\n description: 'Run repository and project diagnostics.',\n name: 'doctor',\n },\n {\n description: 'Inspect or sync schema-driven MCP metadata.',\n name: 'mcp',\n subcommands: ['list', 'sync'],\n },\n] as const;\n\nexport function isReservedTopLevelCommandName(value: string): boolean {\n return WP_TYPIA_RESERVED_TOP_LEVEL_COMMAND_NAMES.includes(\n value as (typeof WP_TYPIA_RESERVED_TOP_LEVEL_COMMAND_NAMES)[number],\n );\n}\n\nfunction assertStringOptionValues(argv: string[]): void {\n const firstPositionalIndex = findFirstPositionalIndex(argv);\n if (firstPositionalIndex === -1) {\n return;\n }\n\n const commandName = argv[\n firstPositionalIndex\n ] as keyof typeof STRING_OPTION_NAMES_BY_COMMAND;\n const stringOptionNames = new Set<string>(GLOBAL_STRING_OPTION_NAMES);\n for (const optionName of STRING_OPTION_NAMES_BY_COMMAND[commandName] ?? []) {\n stringOptionNames.add(optionName);\n }\n\n for (let index = firstPositionalIndex + 1; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--') {\n break;\n }\n if (arg.length === 2 && arg.startsWith('-')) {\n if (SHORT_OPTION_NAMES_WITH_VALUES.has(arg.slice(1))) {\n const next = argv[index + 1];\n if (!next || next.startsWith('-')) {\n throw new Error(`\\`${arg}\\` requires a value.`);\n }\n index += 1;\n }\n continue;\n }\n if (!arg.startsWith('--')) {\n continue;\n }\n\n const [rawName, inlineValue] = arg.slice(2).split('=', 2);\n if (!stringOptionNames.has(rawName)) {\n continue;\n }\n\n if (arg.includes('=')) {\n if (!inlineValue) {\n throw new Error(`\\`--${rawName}\\` requires a value.`);\n }\n continue;\n }\n\n const next = argv[index + 1];\n if (!next || next.startsWith('-')) {\n throw new Error(`\\`--${rawName}\\` requires a value.`);\n }\n index += 1;\n }\n}\n\nfunction isWindowsDrivePath(value: string): boolean {\n return /^[A-Za-z]:([\\\\/]|$)/.test(value);\n}\n\nfunction looksLikeStructuredProjectInput(value: string): boolean {\n if (value.includes('#')) {\n return true;\n }\n\n if (!isWindowsDrivePath(value) && /^[A-Za-z][A-Za-z0-9+.-]*:/u.test(value)) {\n return true;\n }\n\n return value.startsWith('@') && value.includes('/');\n}\n\nfunction assertPositionalAliasProjectDir(projectDir: string): void {\n const normalizedProjectDir =\n path.normalize(projectDir).replace(/[\\\\/]+$/u, '') || path.normalize(projectDir);\n if (normalizedProjectDir === '.' || normalizedProjectDir === '..') {\n throw new Error(\n `The positional alias does not scaffold into \\`${projectDir}\\`. Use \\`${WP_TYPIA_CANONICAL_CREATE_USAGE}\\` with an explicit child directory instead.`,\n );\n }\n\n if (looksLikeStructuredProjectInput(projectDir)) {\n throw new Error(\n `The positional alias only accepts unambiguous local project directories. Use \\`${WP_TYPIA_CANONICAL_CREATE_USAGE}\\` for \\`${projectDir}\\`.`,\n );\n }\n}\n\nexport function normalizeWpTypiaArgv(argv: string[]): string[] {\n const positionalIndexes = collectPositionalIndexes(argv);\n const firstPositionalIndex = positionalIndexes[0] ?? -1;\n if (firstPositionalIndex === -1) {\n return argv;\n }\n\n const firstPositional = argv[firstPositionalIndex];\n if (!firstPositional) {\n return argv;\n }\n\n if (firstPositional === 'migrations') {\n throw new Error(\n '`wp-typia migrations` was removed in favor of `wp-typia migrate`. Use `wp-typia migrate <subcommand>` instead.',\n );\n }\n\n if (isReservedTopLevelCommandName(firstPositional)) {\n assertStringOptionValues(argv);\n return argv;\n }\n\n if (positionalIndexes.length > 1) {\n const extraPositionals = positionalIndexes\n .slice(1)\n .map((index) => argv[index])\n .filter(\n (value): value is string =>\n typeof value === 'string' && value.length > 0,\n );\n\n throw new Error(\n `The positional alias only accepts a single project directory. Use \\`${WP_TYPIA_CANONICAL_CREATE_USAGE}\\` for scaffold invocations with additional positional arguments, or check the command spelling if you meant another top-level command. Extra positional arguments: ${extraPositionals.map((value) => `\\`${value}\\``).join(', ')}.`,\n );\n }\n\n assertPositionalAliasProjectDir(firstPositional);\n\n const normalizedArgv = [\n ...argv.slice(0, firstPositionalIndex),\n 'create',\n ...argv.slice(firstPositionalIndex),\n ];\n assertStringOptionValues(normalizedArgv);\n return normalizedArgv;\n}\n",
63
12
  "export function extractWpTypiaConfigOverride(argv: string[]): {\n\targv: string[];\n\tconfigOverridePath?: string;\n} {\n\tconst nextArgv: string[] = [];\n\tlet configOverridePath: string | undefined;\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index];\n\t\tif (!arg) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === \"--\") {\n\t\t\tnextArgv.push(...argv.slice(index));\n\t\t\tbreak;\n\t\t}\n\n\t\tif (arg === \"--config\" || arg === \"-c\") {\n\t\t\tconst next = argv[index + 1];\n\t\t\tif (!next || next.startsWith(\"-\")) {\n\t\t\t\tthrow new Error(`\\`${arg}\\` requires a value.`);\n\t\t\t}\n\t\t\tconfigOverridePath = next;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith(\"--config=\")) {\n\t\t\tconst inlineValue = arg.slice(\"--config=\".length);\n\t\t\tif (!inlineValue) {\n\t\t\t\tthrow new Error(\"`--config` requires a value.\");\n\t\t\t}\n\t\t\tconfigOverridePath = inlineValue;\n\t\t\tcontinue;\n\t\t}\n\n\t\tnextArgv.push(arg);\n\t}\n\n\treturn {\n\t\targv: nextArgv,\n\t\tconfigOverridePath,\n\t};\n}\n",
64
13
  "import type { BunliPlugin } from \"@bunli/core/plugin\";\nimport type { Command } from \"@bunli/core\";\n\nexport function createWpTypiaSkillsMetadataPlugin(commands: Command[]): BunliPlugin {\n\treturn {\n\t\tname: \"wp-typia-skills-metadata\",\n\t\tsetup(context) {\n\t\t\tcontext.store.set(\n\t\t\t\t\"_skillsCommands\",\n\t\t\t\tnew Map(commands.map((command) => [command.name, command])),\n\t\t\t);\n\t\t\tcontext.store.set(\"_skillsCliName\", \"wp-typia\");\n\t\t},\n\t};\n}\n",
65
14
  "import { createPlugin } from \"@bunli/core/plugin\";\n\nimport {\n\tloadWpTypiaUserConfig,\n\tloadWpTypiaUserConfigFromSource,\n\tmergeWpTypiaUserConfig,\n\ttype WpTypiaUserConfig,\n} from \"../config\";\n\ndeclare module \"@bunli/core/plugin\" {\n\tinterface CommandContext {\n\t\twpTypiaUserConfig?: WpTypiaUserConfig;\n\t\tisAIAgent?: boolean;\n\t\taiAgents?: string[];\n\t\taiAgentEnvVars?: string[];\n\t}\n}\n\nexport const wpTypiaUserConfigPlugin = createPlugin((options: { overrideSource?: string } = {}) => {\n\tlet resolvedConfig: WpTypiaUserConfig = {};\n\n\treturn {\n\t\tname: \"wp-typia-user-config\",\n\t\tasync setup(context) {\n\t\t\tresolvedConfig = await loadWpTypiaUserConfig(context.paths.cwd);\n\t\t\tif (options.overrideSource) {\n\t\t\t\tconst overrideConfig = await loadWpTypiaUserConfigFromSource(\n\t\t\t\t\tcontext.paths.cwd,\n\t\t\t\t\toptions.overrideSource,\n\t\t\t\t);\n\t\t\t\tresolvedConfig = mergeWpTypiaUserConfig(resolvedConfig, overrideConfig);\n\t\t\t}\n\t\t},\n\t\tbeforeCommand(context) {\n\t\t\tcontext.store.wpTypiaUserConfig = resolvedConfig;\n\t\t},\n\t};\n});\n\nexport default wpTypiaUserConfigPlugin;\n"
66
15
  ],
67
- "mappings": "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",
68
- "debugId": "55AB25074B8174E464756E2164756E21",
16
+ "mappings": "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",
17
+ "debugId": "0C9C19F6722BBE6B64756E2164756E21",
69
18
  "names": []
70
19
  }