@agents-inc/cli 0.42.0 → 0.45.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 (166) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +128 -113
  3. package/assets/logo.png +0 -0
  4. package/assets/logo.svg +75 -0
  5. package/config/stacks.yaml +0 -321
  6. package/dist/{chunk-J73KIP6Z.js → chunk-3JRWNWBF.js} +66 -4
  7. package/dist/chunk-3JRWNWBF.js.map +1 -0
  8. package/dist/{chunk-MHET2RG2.js → chunk-3S4GIO4B.js} +2 -2
  9. package/dist/{chunk-UXNHU7Y7.js → chunk-473YHDYQ.js} +3 -12
  10. package/dist/chunk-473YHDYQ.js.map +1 -0
  11. package/dist/{chunk-GVRZY5KI.js → chunk-5BDYODWP.js} +3 -3
  12. package/dist/{chunk-53K3URKF.js → chunk-ABE55TEU.js} +5 -3
  13. package/dist/chunk-ABE55TEU.js.map +1 -0
  14. package/dist/{chunk-2TWELY5M.js → chunk-ARET3NYO.js} +3 -3
  15. package/dist/{chunk-X34RGEFX.js → chunk-CLHBKFHU.js} +2 -2
  16. package/dist/{chunk-ORJPGZVD.js → chunk-DAVOSI4M.js} +7 -7
  17. package/dist/chunk-DAVOSI4M.js.map +1 -0
  18. package/dist/{chunk-IUYU2TP6.js → chunk-ELRGSZHZ.js} +7 -7
  19. package/dist/{chunk-MI4NWOWD.js → chunk-ENWMWIHP.js} +7 -7
  20. package/dist/{chunk-52SI5XJH.js → chunk-F3O5YHSI.js} +2 -7
  21. package/dist/chunk-F3O5YHSI.js.map +1 -0
  22. package/dist/{chunk-PP7NDFFE.js → chunk-FVN5PFFY.js} +8 -1
  23. package/dist/{chunk-PP7NDFFE.js.map → chunk-FVN5PFFY.js.map} +1 -1
  24. package/dist/{chunk-XRA4LHTJ.js → chunk-FYNMNY4P.js} +6 -8
  25. package/dist/chunk-FYNMNY4P.js.map +1 -0
  26. package/dist/{chunk-GCN7GGWE.js → chunk-GUIRWCKI.js} +3 -3
  27. package/dist/{chunk-AQANPOLS.js → chunk-HKRLWERR.js} +2 -2
  28. package/dist/{chunk-EPJ2GJNJ.js → chunk-KCYNTAAF.js} +9 -9
  29. package/dist/{chunk-33D24DAF.js → chunk-KVHLKPYB.js} +10 -10
  30. package/dist/{chunk-MMD26LKJ.js → chunk-KWWLPPHF.js} +2 -2
  31. package/dist/{chunk-FDY6SGSA.js → chunk-KZNPPUQG.js} +2 -2
  32. package/dist/{chunk-GIZ6DENW.js → chunk-M2XPTQDT.js} +4 -4
  33. package/dist/{chunk-BKW34TKI.js → chunk-M3AGB4TR.js} +3 -3
  34. package/dist/{chunk-ZHJEZ7AU.js → chunk-NTPHCNJO.js} +2 -2
  35. package/dist/{chunk-44QCEK7E.js → chunk-OALQWRLG.js} +2 -2
  36. package/dist/{chunk-PEAPABFI.js → chunk-OLZBZAW4.js} +2 -2
  37. package/dist/{chunk-FF4Z7MHY.js → chunk-Q5BSIARS.js} +26 -18
  38. package/dist/chunk-Q5BSIARS.js.map +1 -0
  39. package/dist/{chunk-UVVNWF43.js → chunk-SBWMSNS2.js} +2 -2
  40. package/dist/{chunk-ALWLM5MC.js → chunk-SRFNNOLC.js} +2 -2
  41. package/dist/{chunk-KA253GGY.js → chunk-SYGEV3KV.js} +4 -4
  42. package/dist/{chunk-HMGWGWFT.js → chunk-V43QDMYQ.js} +2 -2
  43. package/dist/{chunk-WMAALRQI.js → chunk-VTDEENSP.js} +4 -4
  44. package/dist/{chunk-VHGIQN5O.js → chunk-WWSKP5SR.js} +4 -4
  45. package/dist/{chunk-EFZN22TO.js → chunk-YQFU2KZ5.js} +3 -3
  46. package/dist/{chunk-SYHRJG5G.js → chunk-ZECXM7LP.js} +162 -278
  47. package/dist/chunk-ZECXM7LP.js.map +1 -0
  48. package/dist/commands/build/marketplace.js +3 -3
  49. package/dist/commands/build/plugins.js +5 -5
  50. package/dist/commands/build/stack.js +5 -5
  51. package/dist/commands/compile.js +6 -6
  52. package/dist/commands/config/get.js +4 -4
  53. package/dist/commands/config/index.js +5 -5
  54. package/dist/commands/config/path.js +4 -4
  55. package/dist/commands/config/set-project.js +4 -4
  56. package/dist/commands/config/show.js +5 -5
  57. package/dist/commands/config/unset-project.js +4 -4
  58. package/dist/commands/diff.js +4 -4
  59. package/dist/commands/doctor.js +4 -4
  60. package/dist/commands/edit.js +33 -30
  61. package/dist/commands/edit.js.map +1 -1
  62. package/dist/commands/eject.js +39 -14
  63. package/dist/commands/eject.js.map +1 -1
  64. package/dist/commands/import/skill.js +5 -5
  65. package/dist/commands/info.js +5 -5
  66. package/dist/commands/init.js +31 -36
  67. package/dist/commands/init.js.map +1 -1
  68. package/dist/commands/list.js +4 -4
  69. package/dist/commands/new/agent.js +5 -5
  70. package/dist/commands/new/skill.js +4 -5
  71. package/dist/commands/new/skill.js.map +1 -1
  72. package/dist/commands/outdated.js +4 -4
  73. package/dist/commands/search.js +7 -7
  74. package/dist/commands/uninstall.js +6 -6
  75. package/dist/commands/update.js +6 -6
  76. package/dist/commands/validate.js +5 -5
  77. package/dist/components/skill-search/skill-search.js +3 -3
  78. package/dist/components/wizard/category-grid.js +2 -2
  79. package/dist/components/wizard/category-grid.test.js +184 -98
  80. package/dist/components/wizard/category-grid.test.js.map +1 -1
  81. package/dist/components/wizard/checkbox-grid.js +3 -3
  82. package/dist/components/wizard/checkbox-grid.test.js +3 -3
  83. package/dist/components/wizard/domain-selection.js +8 -8
  84. package/dist/components/wizard/help-modal.js +2 -2
  85. package/dist/components/wizard/menu-item.js +1 -1
  86. package/dist/components/wizard/search-modal.js +2 -2
  87. package/dist/components/wizard/search-modal.test.js +2 -11
  88. package/dist/components/wizard/search-modal.test.js.map +1 -1
  89. package/dist/components/wizard/section-progress.js +2 -2
  90. package/dist/components/wizard/section-progress.test.js +2 -2
  91. package/dist/components/wizard/selection-card.js +2 -2
  92. package/dist/components/wizard/source-grid.js +3 -3
  93. package/dist/components/wizard/source-grid.test.js +5 -9
  94. package/dist/components/wizard/source-grid.test.js.map +1 -1
  95. package/dist/components/wizard/stack-selection.js +8 -8
  96. package/dist/components/wizard/step-agents.js +7 -7
  97. package/dist/components/wizard/step-agents.test.js +7 -7
  98. package/dist/components/wizard/step-build.js +8 -8
  99. package/dist/components/wizard/step-build.test.js +25 -40
  100. package/dist/components/wizard/step-build.test.js.map +1 -1
  101. package/dist/components/wizard/step-confirm.js +3 -3
  102. package/dist/components/wizard/step-confirm.test.js +7 -7
  103. package/dist/components/wizard/step-refine.js +2 -2
  104. package/dist/components/wizard/step-refine.test.js +2 -2
  105. package/dist/components/wizard/step-settings.js +5 -5
  106. package/dist/components/wizard/step-settings.test.js +8 -8
  107. package/dist/components/wizard/step-sources.js +11 -11
  108. package/dist/components/wizard/step-sources.test.js +14 -20
  109. package/dist/components/wizard/step-sources.test.js.map +1 -1
  110. package/dist/components/wizard/step-stack.js +11 -11
  111. package/dist/components/wizard/step-stack.test.js +17 -26
  112. package/dist/components/wizard/step-stack.test.js.map +1 -1
  113. package/dist/components/wizard/view-title.js +2 -2
  114. package/dist/components/wizard/wizard-layout.js +8 -8
  115. package/dist/components/wizard/wizard-tabs.js +2 -2
  116. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  117. package/dist/components/wizard/wizard.js +26 -26
  118. package/dist/config/stacks.yaml +0 -321
  119. package/dist/hooks/init.js +3 -3
  120. package/dist/{source-manager-ABK5COKX.js → source-manager-HXFXBZJU.js} +4 -4
  121. package/dist/stores/wizard-store.js +5 -5
  122. package/dist/stores/wizard-store.test.js +29 -49
  123. package/dist/stores/wizard-store.test.js.map +1 -1
  124. package/package.json +3 -1
  125. package/src/schemas/metadata.schema.json +0 -5
  126. package/dist/chunk-52SI5XJH.js.map +0 -1
  127. package/dist/chunk-53K3URKF.js.map +0 -1
  128. package/dist/chunk-FF4Z7MHY.js.map +0 -1
  129. package/dist/chunk-J73KIP6Z.js.map +0 -1
  130. package/dist/chunk-ORJPGZVD.js.map +0 -1
  131. package/dist/chunk-SYHRJG5G.js.map +0 -1
  132. package/dist/chunk-UXNHU7Y7.js.map +0 -1
  133. package/dist/chunk-XRA4LHTJ.js.map +0 -1
  134. package/dist/commands/version/bump.js +0 -79
  135. package/dist/commands/version/bump.js.map +0 -1
  136. package/dist/commands/version/index.js +0 -54
  137. package/dist/commands/version/index.js.map +0 -1
  138. package/dist/commands/version/set.js +0 -86
  139. package/dist/commands/version/set.js.map +0 -1
  140. package/dist/commands/version/show.js +0 -54
  141. package/dist/commands/version/show.js.map +0 -1
  142. /package/dist/{chunk-MHET2RG2.js.map → chunk-3S4GIO4B.js.map} +0 -0
  143. /package/dist/{chunk-GVRZY5KI.js.map → chunk-5BDYODWP.js.map} +0 -0
  144. /package/dist/{chunk-2TWELY5M.js.map → chunk-ARET3NYO.js.map} +0 -0
  145. /package/dist/{chunk-X34RGEFX.js.map → chunk-CLHBKFHU.js.map} +0 -0
  146. /package/dist/{chunk-IUYU2TP6.js.map → chunk-ELRGSZHZ.js.map} +0 -0
  147. /package/dist/{chunk-MI4NWOWD.js.map → chunk-ENWMWIHP.js.map} +0 -0
  148. /package/dist/{chunk-GCN7GGWE.js.map → chunk-GUIRWCKI.js.map} +0 -0
  149. /package/dist/{chunk-AQANPOLS.js.map → chunk-HKRLWERR.js.map} +0 -0
  150. /package/dist/{chunk-EPJ2GJNJ.js.map → chunk-KCYNTAAF.js.map} +0 -0
  151. /package/dist/{chunk-33D24DAF.js.map → chunk-KVHLKPYB.js.map} +0 -0
  152. /package/dist/{chunk-MMD26LKJ.js.map → chunk-KWWLPPHF.js.map} +0 -0
  153. /package/dist/{chunk-FDY6SGSA.js.map → chunk-KZNPPUQG.js.map} +0 -0
  154. /package/dist/{chunk-GIZ6DENW.js.map → chunk-M2XPTQDT.js.map} +0 -0
  155. /package/dist/{chunk-BKW34TKI.js.map → chunk-M3AGB4TR.js.map} +0 -0
  156. /package/dist/{chunk-ZHJEZ7AU.js.map → chunk-NTPHCNJO.js.map} +0 -0
  157. /package/dist/{chunk-44QCEK7E.js.map → chunk-OALQWRLG.js.map} +0 -0
  158. /package/dist/{chunk-PEAPABFI.js.map → chunk-OLZBZAW4.js.map} +0 -0
  159. /package/dist/{chunk-UVVNWF43.js.map → chunk-SBWMSNS2.js.map} +0 -0
  160. /package/dist/{chunk-ALWLM5MC.js.map → chunk-SRFNNOLC.js.map} +0 -0
  161. /package/dist/{chunk-KA253GGY.js.map → chunk-SYGEV3KV.js.map} +0 -0
  162. /package/dist/{chunk-HMGWGWFT.js.map → chunk-V43QDMYQ.js.map} +0 -0
  163. /package/dist/{chunk-WMAALRQI.js.map → chunk-VTDEENSP.js.map} +0 -0
  164. /package/dist/{chunk-VHGIQN5O.js.map → chunk-WWSKP5SR.js.map} +0 -0
  165. /package/dist/{chunk-EFZN22TO.js.map → chunk-YQFU2KZ5.js.map} +0 -0
  166. /package/dist/{source-manager-ABK5COKX.js.map → source-manager-HXFXBZJU.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/utils/errors.ts","../src/cli/utils/logger.ts","../src/cli/utils/fs.ts","../src/cli/lib/schemas.ts"],"sourcesContent":["/** Extract a human-readable message from an unknown error value. */\nexport function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","// Logging utility for lib/ modules that don't have access to oclif command context.\n// In oclif commands, prefer using this.log() instead.\n\nlet verboseMode = false;\n\nexport function setVerbose(enabled: boolean): void {\n verboseMode = enabled;\n}\n\nexport function verbose(msg: string): void {\n if (verboseMode) {\n console.log(` ${msg}`);\n }\n}\n\n// Always visible (not gated by verbose mode).\n// Used for user-facing progress output: compilation ticks, summaries, validation results.\nexport function log(msg: string): void {\n console.log(msg);\n}\n\n// Always visible (not gated by verbose mode).\n// Used for issues the user should know about, like unresolved references.\n//\n// Error/warning message style guide:\n// - Start with a capital letter (restructure if it would capitalize a function name)\n// - End with a period if it's a complete sentence\n// - End without a period if it's a fragment (e.g., \"Skipping 'foo': missing SKILL.md\")\n// - Wrap dynamic values in single quotes: 'value' (not bare or double-quoted)\n// - Do NOT prefix the message with \"Warning:\" — this function adds it automatically\n// - After a colon, use lowercase (e.g., \"Skipping 'foo': invalid frontmatter\")\n// - Use em dash for supplemental info (e.g., \"Missing category — defaulting to 'local'\")\nexport function warn(msg: string): void {\n console.warn(` Warning: ${msg}`);\n}\n","import fs from \"fs-extra\";\nimport fg from \"fast-glob\";\nimport path from \"path\";\n\nexport async function readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, \"utf-8\");\n}\n\n/**\n * Reads a file with a size limit check before reading content.\n * Throws if the file exceeds maxSizeBytes. Prevents DoS from oversized files.\n */\nexport async function readFileSafe(filePath: string, maxSizeBytes: number): Promise<string> {\n const stats = await fs.stat(filePath);\n if (stats.size > maxSizeBytes) {\n throw new Error(\n `File too large: '${filePath}' is ${stats.size} bytes (limit: ${maxSizeBytes} bytes)`,\n );\n }\n return fs.readFile(filePath, \"utf-8\");\n}\n\nexport async function readFileOptional(filePath: string, fallback = \"\"): Promise<string> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch {\n return fallback;\n }\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n return fs.pathExists(filePath);\n}\n\nexport async function directoryExists(dirPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dirPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function listDirectories(dirPath: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\nexport async function glob(pattern: string, cwd: string): Promise<string[]> {\n return fg(pattern, { cwd, onlyFiles: true });\n}\n\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\nexport async function remove(filePath: string): Promise<void> {\n await fs.remove(filePath);\n}\n\nexport async function copy(src: string, dest: string): Promise<void> {\n await fs.copy(src, dest);\n}\n","import { z } from \"zod\";\nimport { warn } from \"../utils/logger\";\nimport type {\n AgentHookAction,\n AgentHookDefinition,\n AgentName,\n AgentYamlConfig,\n AlternativeGroup,\n BoundSkill,\n CategoryDefinition,\n CategoryPath,\n ConflictRule,\n DiscourageRule,\n Domain,\n Marketplace,\n MarketplaceMetadata,\n MarketplaceOwner,\n MarketplacePlugin,\n MarketplaceRemoteSource,\n ModelName,\n PermissionMode,\n PluginAuthor,\n PluginManifest,\n RecommendRule,\n RelationshipDefinitions,\n RequireRule,\n SkillAssignment,\n SkillDisplayName,\n SkillId,\n SkillSourceType,\n SkillsMatrixConfig,\n Subcategory,\n} from \"../types\";\n\n// Bridge pattern: z.ZodType<ExistingType> ensures Zod output matches our union types\nexport const domainSchema = z.enum([\"web\", \"api\", \"cli\", \"mobile\", \"shared\"]) as z.ZodType<Domain>;\n\nexport const skillSourceTypeSchema = z.enum([\n \"public\",\n \"private\",\n \"local\",\n]) as z.ZodType<SkillSourceType>;\n\nexport const boundSkillSchema: z.ZodType<BoundSkill> = z.object({\n id: z.string() as z.ZodType<SkillId>,\n sourceUrl: z.string(),\n sourceName: z.string(),\n boundTo: z.string(),\n description: z.string().optional(),\n});\n\n/** Raw subcategory values (before cast) — used to derive stackSubcategorySchema */\nconst SUBCATEGORY_VALUES = [\n \"web-framework\",\n \"web-styling\",\n \"web-client-state\",\n \"web-server-state\",\n \"web-forms\",\n \"web-testing\",\n \"web-ui-components\",\n \"web-mocking\",\n \"web-error-handling\",\n \"web-i18n\",\n \"web-file-upload\",\n \"web-files\",\n \"web-utilities\",\n \"web-realtime\",\n \"web-animation\",\n \"web-pwa\",\n \"web-accessibility\",\n \"web-performance\",\n \"web-base-framework\",\n \"api-api\",\n \"api-database\",\n \"api-auth\",\n \"api-observability\",\n \"api-analytics\",\n \"api-email\",\n \"api-performance\",\n \"mobile-framework\",\n \"mobile-platform\",\n \"shared-monorepo\",\n \"shared-tooling\",\n \"shared-security\",\n \"shared-methodology\",\n \"shared-research\",\n \"shared-reviewing\",\n \"shared-ci-cd\",\n \"cli-framework\",\n \"cli-prompts\",\n \"cli-testing\",\n] as const;\n\n// Bridge pattern: z.ZodType<ExistingType> ensures Zod output matches our union types\nexport const subcategorySchema = z.enum(SUBCATEGORY_VALUES) as z.ZodType<Subcategory>;\n\n/**\n * Extended subcategory enum for stack configs.\n * Identical to subcategorySchema since SUBCATEGORY_VALUES already includes\n * stacks-only keys (web-base-framework, mobile-platform).\n */\nexport const stackSubcategorySchema = z.enum(SUBCATEGORY_VALUES);\n\nexport const agentNameSchema = z.enum([\n \"web-developer\",\n \"api-developer\",\n \"cli-developer\",\n \"web-architecture\",\n \"agent-summoner\",\n \"documentor\",\n \"skill-summoner\",\n \"cli-migrator\",\n \"pattern-scout\",\n \"web-pattern-critique\",\n \"web-pm\",\n \"api-researcher\",\n \"web-researcher\",\n \"api-reviewer\",\n \"cli-reviewer\",\n \"web-reviewer\",\n \"cli-tester\",\n \"web-tester\",\n]) as z.ZodType<AgentName>;\n\nexport const modelNameSchema = z.enum([\n \"sonnet\",\n \"opus\",\n \"haiku\",\n \"inherit\",\n]) as z.ZodType<ModelName>;\n\nexport const permissionModeSchema = z.enum([\n \"default\",\n \"acceptEdits\",\n \"dontAsk\",\n \"bypassPermissions\",\n \"plan\",\n \"delegate\",\n]) as z.ZodType<PermissionMode>;\n\nexport const skillDisplayNameSchema = z.enum([\n \"react\",\n \"vue\",\n \"angular\",\n \"solidjs\",\n \"nextjs-app-router\",\n \"nextjs-server-actions\",\n \"remix\",\n \"nuxt\",\n \"scss-modules\",\n \"cva\",\n \"tailwind\",\n \"zustand\",\n \"redux-toolkit\",\n \"pinia\",\n \"ngrx-signalstore\",\n \"jotai\",\n \"mobx\",\n \"react-query\",\n \"swr\",\n \"graphql-apollo\",\n \"graphql-urql\",\n \"trpc\",\n \"react-hook-form\",\n \"vee-validate\",\n \"zod-validation\",\n \"vitest\",\n \"playwright-e2e\",\n \"cypress-e2e\",\n \"react-testing-library\",\n \"vue-test-utils\",\n \"msw\",\n \"shadcn-ui\",\n \"tanstack-table\",\n \"radix-ui\",\n \"hono\",\n \"express\",\n \"fastify\",\n \"drizzle\",\n \"prisma\",\n \"better-auth\",\n \"axiom-pino-sentry\",\n \"posthog\",\n \"posthog-flags\",\n \"resend\",\n \"github-actions\",\n \"react-native\",\n \"expo\",\n \"turborepo\",\n \"tooling\",\n \"posthog-setup\",\n \"env\",\n \"observability-setup\",\n \"email-setup\",\n \"framer-motion\",\n \"css-animations\",\n \"view-transitions\",\n \"storybook\",\n \"error-boundaries\",\n \"accessibility\",\n \"websockets\",\n \"sse\",\n \"socket-io\",\n \"service-workers\",\n \"file-upload\",\n \"image-handling\",\n \"date-fns\",\n \"api-testing\",\n \"api-performance\",\n \"web-performance\",\n \"security\",\n \"commander\",\n \"cli-commander\",\n \"oclif\",\n \"reviewing\",\n \"cli-reviewing\",\n \"research-methodology\",\n \"investigation-requirements\",\n \"anti-over-engineering\",\n \"success-criteria\",\n \"write-verification\",\n \"improvement-protocol\",\n \"context-management\",\n]) as z.ZodType<SkillDisplayName>;\n\n/** Matches SkillId format: prefix-subcategory-name (at least 3 dash-separated segments) */\nexport const SKILL_ID_PATTERN = /^(web|api|cli|mobile|infra|meta|security)-.+-.+$/;\n\n// Regex-based since Zod cannot express template literal types natively\nexport const skillIdSchema = z\n .string()\n .regex(\n SKILL_ID_PATTERN,\n \"Must be a valid skill ID (e.g., 'web-framework-react')\",\n ) as z.ZodType<SkillId>;\n\n// Accepts: \"prefix-subcategory\", bare subcategory, or \"local\"\nexport const categoryPathSchema = z.string().refine(\n (val): val is CategoryPath => {\n if (val === \"local\") return true;\n if (/^(web|api|cli|mobile|infra|meta|security|shared)-.+$/.test(val)) return true;\n return subcategorySchema.safeParse(val).success;\n },\n {\n message: \"Must be a valid category path (e.g., 'web-framework', 'shared-testing', or 'local')\",\n },\n) as z.ZodType<CategoryPath>;\n\nexport const agentHookActionSchema: z.ZodType<AgentHookAction> = z.object({\n type: z.enum([\"command\", \"script\", \"prompt\"]),\n command: z.string().optional(),\n script: z.string().optional(),\n prompt: z.string().optional(),\n});\n\nexport const agentHookDefinitionSchema: z.ZodType<AgentHookDefinition> = z.object({\n matcher: z.string().optional(),\n hooks: z.array(agentHookActionSchema).optional(),\n});\n\nexport const hooksRecordSchema = z.record(z.string(), z.array(agentHookDefinitionSchema));\n\n/** Strict hook definition — hooks array is required and must have at least one action */\nconst strictAgentHookDefinitionSchema = z.object({\n matcher: z.string().optional(),\n hooks: z.array(agentHookActionSchema).min(1),\n});\n\n/** Strict hooks record for validation schemas (requires at least one hook action per definition) */\nexport const strictHooksRecordSchema = z.record(\n z.string(),\n z.array(strictAgentHookDefinitionSchema),\n);\n\nexport const skillAssignmentSchema: z.ZodType<SkillAssignment> = z.object({\n id: skillIdSchema,\n preloaded: z.boolean().optional(),\n local: z.boolean().optional(),\n path: z.string().optional(),\n});\n\n// Lenient: accepts any string for `name` since local/custom skills may not follow strict SkillId pattern\nexport const skillFrontmatterLoaderSchema = z.object({\n name: z.string(),\n description: z.string(),\n model: modelNameSchema.optional(),\n});\n\n// Lenient loader: invalid category/skillId warnings are legitimate.\nexport const skillMetadataLoaderSchema = z\n .object({\n category: categoryPathSchema.optional(),\n categoryExclusive: z.boolean().optional(),\n author: z.string().optional(),\n tags: z.array(z.string()).optional(),\n requires: z.array(skillIdSchema).optional(),\n compatibleWith: z.array(skillIdSchema).optional(),\n conflictsWith: z.array(skillIdSchema).optional(),\n })\n .passthrough();\n\nexport const pluginAuthorSchema: z.ZodType<PluginAuthor> = z.object({\n name: z.string().min(1),\n email: z.string().optional(),\n});\n\nexport const pluginManifestSchema: z.ZodType<PluginManifest> = z.object({\n name: z.string(),\n version: z.string().optional(),\n description: z.string().optional(),\n author: pluginAuthorSchema.optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), hooksRecordSchema]).optional(),\n});\n\n/** Strict schema for plugin.json validation (IDE, agentsinc validate). Rejects unknown fields. */\nexport const pluginManifestValidationSchema = z\n .object({\n name: z.string().min(1),\n version: z.string().optional(),\n description: z.string().optional(),\n author: pluginAuthorSchema.optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), strictHooksRecordSchema]).optional(),\n })\n .strict();\n\nexport const agentYamlConfigSchema: z.ZodType<AgentYamlConfig> = z.object({\n id: agentNameSchema,\n title: z.string(),\n description: z.string(),\n model: modelNameSchema.optional(),\n tools: z.array(z.string()),\n disallowedTools: z.array(z.string()).optional(),\n permissionMode: permissionModeSchema.optional(),\n hooks: hooksRecordSchema.optional(),\n outputFormat: z.string().optional(),\n});\n\n// Defined before projectConfigLoaderSchema so it can reference stackAgentConfigSchema\n// Single skill assignment element: either a bare SkillId string or an object { id, preloaded? }\nconst skillAssignmentElementSchema = z.union([skillIdSchema, skillAssignmentSchema]);\n\n/**\n * Agent config within a stack: maps subcategory to skill assignment(s).\n * Keys restricted to valid Subcategory values from skills-matrix.yaml.\n * Lenient: accepts bare string, object, or array from YAML.\n * Consumers normalize all values to SkillAssignment[] after parsing.\n *\n * Uses z.record(z.string()) with superRefine for key validation because\n * z.record(z.enum()) treats all enum values as required properties.\n */\nconst stackSubcategoryValues: Set<string> = new Set(stackSubcategorySchema.options);\nexport const stackAgentConfigSchema = z\n .record(\n z.string(),\n z.union([skillAssignmentElementSchema, z.array(skillAssignmentElementSchema)]),\n )\n .superRefine((val, ctx) => {\n for (const key of Object.keys(val)) {\n if (!stackSubcategoryValues.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n path: [key],\n message: `Invalid subcategory '${key}'. Must be one of: ${[...stackSubcategoryValues].join(\", \")}`,\n });\n }\n }\n });\n\n/**\n * Lenient loader for .claude/config.yaml (ProjectConfig).\n * name/agents optional since partial configs are valid at load time.\n * Full validation happens in validateProjectConfig().\n */\nexport const projectConfigLoaderSchema = z\n .object({\n version: z.literal(\"1\").optional(),\n /** Project/plugin name in kebab-case */\n name: z.string().optional(),\n description: z.string().optional(),\n /** Agent IDs to compile (e.g., [\"web-developer\", \"api-developer\"]) */\n agents: z.array(z.string()).optional(),\n /** Flat list of all skill IDs used by this project */\n skills: z.array(skillIdSchema).optional(),\n\n /** Author handle (e.g., \"@vince\") */\n author: z.string().optional(),\n /** \"local\" = .claude/agents, \"plugin\" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */\n installMode: z.enum([\"local\", \"plugin\"]).optional(),\n /** Whether expert mode (advanced/niche skills) was enabled in the wizard */\n expertMode: z.boolean().optional(),\n /** Selected domains from the wizard (persisted for edit mode restoration) */\n domains: z.array(domainSchema).optional(),\n /** Selected agents from the wizard (persisted for edit mode restoration) */\n selectedAgents: z.array(z.string()).optional(),\n /** Agent-to-subcategory-to-skill mappings from selected stack (accepts same formats as stacks.yaml) */\n stack: z.record(z.string(), stackAgentConfigSchema).optional(),\n /** Skills source path or URL (e.g., \"github:my-org/skills\") */\n source: z.string().optional(),\n /** Marketplace identifier for plugin installation */\n marketplace: z.string().optional(),\n /** Separate source for agents when different from skills source */\n agentsSource: z.string().optional(),\n })\n .passthrough();\n\n/**\n * Strict schema for IDE validation of .claude-src/config.yaml (ProjectConfig).\n * Used to generate project-config.schema.json for yaml-language-server.\n * Requires name/agents (the fields validateProjectConfig checks) and\n * does NOT use .passthrough() so the IDE flags unknown properties.\n */\nexport const projectConfigValidationSchema = z.object({\n version: z.literal(\"1\").optional(),\n /** Project/plugin name in kebab-case */\n name: z.string(),\n description: z.string().optional(),\n /** Agent IDs to compile (e.g., [\"web-developer\", \"api-developer\"]) */\n agents: z.array(z.string()),\n /** Flat list of all skill IDs used by this project */\n skills: z.array(skillIdSchema),\n /** Author handle (e.g., \"@vince\") */\n author: z.string().optional(),\n /** \"local\" = .claude/agents, \"plugin\" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */\n installMode: z.enum([\"local\", \"plugin\"]),\n /** Whether expert mode (advanced/niche skills) was enabled in the wizard */\n expertMode: z.boolean().optional(),\n /** Selected domains from the wizard (persisted for edit mode restoration) */\n domains: z.array(domainSchema).optional(),\n /** Agent-to-subcategory-to-skill mappings from selected stack */\n stack: z.record(z.string(), stackAgentConfigSchema),\n /** Skills source path or URL (e.g., \"github:my-org/skills\") */\n source: z.string(),\n /** Marketplace identifier for plugin installation */\n marketplace: z.string().optional(),\n /** Separate source for agents when different from skills source */\n agentsSource: z.string().optional(),\n});\n\nexport const categoryDefinitionSchema: z.ZodType<CategoryDefinition> = z.object({\n id: subcategorySchema,\n displayName: z.string(),\n description: z.string(),\n domain: domainSchema.optional(),\n exclusive: z.boolean(),\n required: z.boolean(),\n order: z.number(),\n icon: z.string().optional(),\n});\n\n// Lenient: accepts both SkillId and SkillDisplayName, resolved to canonical IDs by matrix-loader\nconst skillRefInYaml = z.string() as z.ZodType<SkillId>;\n\nexport const conflictRuleSchema: z.ZodType<ConflictRule> = z.object({\n skills: z.array(skillRefInYaml).min(2),\n reason: z.string(),\n});\n\nexport const discourageRuleSchema: z.ZodType<DiscourageRule> = z.object({\n skills: z.array(skillRefInYaml).min(2),\n reason: z.string(),\n});\n\nexport const recommendRuleSchema: z.ZodType<RecommendRule> = z.object({\n when: skillRefInYaml,\n suggest: z.array(skillRefInYaml).min(1),\n reason: z.string(),\n});\n\nexport const requireRuleSchema: z.ZodType<RequireRule> = z.object({\n skill: skillRefInYaml,\n needs: z.array(skillRefInYaml).min(1),\n needsAny: z.boolean().optional(),\n reason: z.string(),\n});\n\nexport const alternativeGroupSchema: z.ZodType<AlternativeGroup> = z.object({\n purpose: z.string(),\n skills: z.array(skillRefInYaml).min(1),\n});\n\nexport const relationshipDefinitionsSchema: z.ZodType<RelationshipDefinitions> = z.object({\n conflicts: z.array(conflictRuleSchema),\n discourages: z.array(discourageRuleSchema),\n recommends: z.array(recommendRuleSchema),\n requires: z.array(requireRuleSchema),\n alternatives: z.array(alternativeGroupSchema),\n});\n\nexport const skillsMatrixConfigSchema: z.ZodType<SkillsMatrixConfig> = z.object({\n version: z.string(),\n categories: z.record(subcategorySchema, categoryDefinitionSchema) as z.ZodType<\n SkillsMatrixConfig[\"categories\"]\n >,\n relationships: relationshipDefinitionsSchema,\n skillAliases: z.record(skillDisplayNameSchema, skillIdSchema) as z.ZodType<\n SkillsMatrixConfig[\"skillAliases\"]\n >,\n});\n\n/**\n * Raw metadata from a local skill's metadata.yaml.\n * All fields optional — the loader validates cliName after parsing.\n */\nexport const localRawMetadataSchema = z\n .object({\n /** Short name shown in the wizard grid (e.g., \"my-custom-react\") */\n cliName: z.string().optional(),\n /** One-line description for the wizard */\n cliDescription: z.string().optional(),\n /** Subcategory to place this skill in (e.g., \"web-framework\") */\n category: categoryPathSchema.optional(),\n /** If true, only one skill from this category can be selected */\n categoryExclusive: z.boolean().optional(),\n /** When an AI agent should invoke this skill */\n usageGuidance: z.string().optional(),\n tags: z.array(z.string()).optional(),\n /** Framework skills this is compatible with (for Build step filtering) */\n compatibleWith: z.array(skillIdSchema).optional(),\n /** Skills that cannot coexist with this one */\n conflictsWith: z.array(skillIdSchema).optional(),\n /** Skills that must be selected before this one */\n requires: z.array(skillIdSchema).optional(),\n /** Setup skills that must be installed first (e.g., env setup) */\n requiresSetup: z.array(skillIdSchema).optional(),\n /** Usage skills this setup skill configures (inverse relationship) */\n providesSetupFor: z.array(skillIdSchema).optional(),\n })\n .passthrough();\n\n/** Metadata for local skills that were forked/copied from a marketplace skill */\nexport const localSkillMetadataSchema = z\n .object({\n forkedFrom: z\n .object({\n /** Original skill ID before forking (e.g., \"web-framework-react\") */\n skillId: skillIdSchema,\n /** SHA hash of the original content at fork time (for diff detection) */\n contentHash: z.string(),\n /** ISO date when the fork was created */\n date: z.string(),\n /** Source URL the skill was installed from (e.g., \"github:agents-inc/skills\") */\n source: z.string().optional(),\n })\n .optional(),\n })\n .passthrough();\n\nexport const stackSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string(),\n /** Maps agent IDs to their subcategory-to-skill assignments */\n agents: z.record(z.string(), stackAgentConfigSchema),\n /** High-level philosophy guiding this stack's technology choices */\n philosophy: z.string().optional(),\n});\n\n// Pre-normalization schema: values may be string or string[].\n// loadStacks() normalizes to StacksConfig (all values SkillId[]) after parsing.\nexport const stacksConfigSchema = z.object({\n stacks: z.array(stackSchema).min(1),\n});\n\nexport const marketplaceRemoteSourceSchema: z.ZodType<MarketplaceRemoteSource> = z.object({\n source: z.enum([\"github\", \"url\"]),\n repo: z.string().optional(),\n url: z.string().optional(),\n ref: z.string().optional(),\n});\n\nexport const marketplacePluginSchema: z.ZodType<MarketplacePlugin> = z.object({\n name: z.string().min(1),\n /** Local directory path (relative to pluginRoot) or remote source config */\n source: z.union([z.string(), marketplaceRemoteSourceSchema]),\n description: z.string().optional(),\n version: z.string().optional(),\n author: pluginAuthorSchema.optional(),\n /** Marketplace category for grouping (e.g., \"framework\", \"testing\") */\n category: z.string().optional(),\n keywords: z.array(z.string()).optional(),\n});\n\nexport const marketplaceOwnerSchema: z.ZodType<MarketplaceOwner> = z.object({\n name: z.string().min(1),\n email: z.string().optional(),\n});\n\nexport const marketplaceMetadataSchema: z.ZodType<MarketplaceMetadata> = z.object({\n /** Base directory for resolving plugin source paths (e.g., \"plugins/\") */\n pluginRoot: z.string().optional(),\n});\n\nexport const marketplaceSchema: z.ZodType<Marketplace> = z.object({\n $schema: z.string().optional(),\n name: z.string().min(1),\n version: z.string().min(1),\n description: z.string().optional(),\n owner: marketplaceOwnerSchema,\n metadata: marketplaceMetadataSchema.optional(),\n plugins: z.array(marketplacePluginSchema).min(1),\n});\n\n/** Default agent-skill mappings from config/defaults.yaml (fallback when no stack is selected) */\nexport const defaultMappingsSchema = z.object({\n /** Maps skill path patterns to the agent IDs that should receive them */\n skillToAgents: z.record(z.string(), z.array(z.string())),\n /** Maps agent IDs to skill ID prefixes they should receive by default */\n agentSkillPrefixes: z.record(z.string(), z.array(z.string())).optional(),\n});\n\n/** Tool permission overrides (allow/deny lists for Claude Code tool access) */\nexport const permissionConfigSchema = z.object({\n /** Tool names or patterns to explicitly allow */\n allow: z.array(z.string()).optional(),\n /** Tool names or patterns to explicitly deny */\n deny: z.array(z.string()).optional(),\n});\n\n/** Settings file schema (.claude/settings.yaml) for project-level configuration */\nexport const settingsFileSchema = z\n .object({\n permissions: permissionConfigSchema.optional(),\n })\n .passthrough();\n\n/** Metadata for skills imported via `agentsinc import skill` (tracks original source for updates) */\nexport const importedSkillMetadataSchema = z\n .object({\n forkedFrom: z\n .object({\n /** Source URL or identifier where the skill was imported from */\n source: z.string(),\n /** Original skill name in the source */\n skillName: z.string(),\n /** SHA hash of the original content at import time */\n contentHash: z.string(),\n /** ISO date when the import was performed */\n date: z.string(),\n })\n .optional(),\n })\n .passthrough();\n\n/** Branding overrides for white-labeling the CLI */\nexport const brandingConfigSchema = z.object({\n /** Custom CLI name (e.g., \"Acme Dev Tools\") */\n name: z.string().optional(),\n /** Custom tagline shown in wizard header */\n tagline: z.string().optional(),\n});\n\n/**\n * Project source configuration from .claude/config.yaml.\n * Stores multi-source settings, custom directory overrides, and bound skills.\n */\nexport const projectSourceConfigSchema = z\n .object({\n /** Primary skills source (path or URL) */\n source: z.string().optional(),\n /** Author handle for this project's config */\n author: z.string().optional(),\n /** Marketplace identifier for plugin installation */\n marketplace: z.string().optional(),\n /** Separate source for agent definitions (when different from skills) */\n agentsSource: z.string().optional(),\n /** Additional skill sources (private marketplaces, custom repos) */\n sources: z\n .array(\n z.object({\n /** Display name for the source (shown in wizard) */\n name: z.string(),\n /** Source URL (e.g., \"github:acme-corp/claude-skills\") */\n url: z.string(),\n description: z.string().optional(),\n /** Git ref (branch/tag/commit) for the source */\n ref: z.string().optional(),\n }),\n )\n .optional(),\n /** Skills explicitly bound to subcategories via search (from Step Sources) */\n boundSkills: z.array(boundSkillSchema).optional(),\n /** Branding overrides for white-labeling the CLI */\n branding: brandingConfigSchema.optional(),\n /** Custom skills directory override (default: \"src/skills\") */\n skillsDir: z.string().optional(),\n /** Custom agents directory override (default: \"src/agents\") */\n agentsDir: z.string().optional(),\n /** Custom stacks file path override (default: \"config/stacks.yaml\") */\n stacksFile: z.string().optional(),\n /** Custom matrix file path override (default: \"config/skills-matrix.yaml\") */\n matrixFile: z.string().optional(),\n })\n .passthrough();\n\n/**\n * Strict schema for IDE validation of .claude-src/config.yaml (ProjectSourceConfig).\n * Used to generate project-source-config.schema.json for yaml-language-server.\n * All fields optional (source configs may have any subset) but no unknown properties.\n */\nexport const projectSourceConfigValidationSchema = z.object({\n source: z.string().optional(),\n author: z.string().optional(),\n marketplace: z.string().optional(),\n agentsSource: z.string().optional(),\n sources: z\n .array(\n z.object({\n name: z.string(),\n url: z.string(),\n description: z.string().optional(),\n ref: z.string().optional(),\n }),\n )\n .optional(),\n boundSkills: z.array(boundSkillSchema).optional(),\n branding: brandingConfigSchema.optional(),\n skillsDir: z.string().optional(),\n agentsDir: z.string().optional(),\n stacksFile: z.string().optional(),\n matrixFile: z.string().optional(),\n});\n\n// Strict validation schemas enforce all constraints and use .strict() to reject unknown fields,\n// unlike the lenient loader schemas above which use .passthrough() for backward compatibility\nconst KEBAB_CASE_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\n\n/** Strict schema for compiled agent.yaml output. Lenient id (any string) since marketplace agents may use custom identifiers. */\nexport const agentYamlGenerationSchema = z\n .object({\n $schema: z.string().optional(),\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string().min(1),\n model: modelNameSchema.optional(),\n tools: z.array(z.string()).min(1),\n disallowedTools: z.array(z.string()).optional(),\n permissionMode: permissionModeSchema.optional(),\n hooks: strictHooksRecordSchema.optional(),\n outputFormat: z.string().optional(),\n })\n .strict();\n\n/** Strict validation for agent AGENT.md frontmatter (used by plugin-validator) */\nexport const agentFrontmatterValidationSchema = z\n .object({\n /** Agent name in kebab-case (becomes the Task tool identifier) */\n name: z.string().regex(KEBAB_CASE_PATTERN).min(1),\n description: z.string().min(1),\n /** Comma-separated list of allowed tools */\n tools: z.string().optional(),\n /** Comma-separated list of denied tools */\n disallowedTools: z.string().optional(),\n model: modelNameSchema.optional(),\n permissionMode: permissionModeSchema.optional(),\n /** Skill names to preload (embed in agent prompt) */\n skills: z.array(z.string().min(1)).optional(),\n hooks: strictHooksRecordSchema.optional(),\n })\n .strict();\n\n/** Strict validation for SKILL.md frontmatter (matches Claude Code plugin spec) */\nexport const skillFrontmatterValidationSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().min(1),\n /** If true, Claude cannot invoke this skill on its own */\n \"disable-model-invocation\": z.boolean().optional(),\n /** If true, user can invoke this skill directly */\n \"user-invocable\": z.boolean().optional(),\n /** Comma-separated list of tools this skill can use */\n \"allowed-tools\": z.string().optional(),\n model: modelNameSchema.optional(),\n /** \"fork\" means skill runs in a forked context (separate conversation) */\n context: z.enum([\"fork\"]).optional(),\n /** Agent name this skill is scoped to */\n agent: z.string().optional(),\n /** Hint text shown when user invokes the skill */\n \"argument-hint\": z.string().optional(),\n })\n .strict();\n\n/** Strict validation for metadata.yaml in published skills (enforces author format, length limits) */\nexport const metadataValidationSchema = z\n .object({\n /** Domain-prefixed subcategory (e.g., \"web-framework\") */\n category: subcategorySchema,\n categoryExclusive: z.boolean().optional(),\n /** Author handle — must start with @ (e.g., \"@vince\") */\n author: z.string().regex(/^@[a-z][a-z0-9-]*$/),\n /** Short display name for the wizard grid (max 30 chars) */\n cliName: z.string().min(1).max(30),\n /** One-line description for the wizard (max 60 chars) */\n cliDescription: z.string().min(1).max(60),\n /** When an AI agent should invoke this skill (min 10 chars to ensure usefulness) */\n usageGuidance: z.string().min(10),\n requires: z.array(z.string().min(1)).optional(),\n compatibleWith: z.array(z.string().min(1)).optional(),\n conflictsWith: z.array(z.string().min(1)).optional(),\n /** Searchable tags — kebab-case only */\n tags: z.array(z.string().regex(/^[a-z][a-z0-9-]*$/)).optional(),\n requiresSetup: z.array(z.string().min(1)).optional(),\n providesSetupFor: z.array(z.string().min(1)).optional(),\n /** 7-char hex SHA of skill content (for change detection) */\n contentHash: z\n .string()\n .regex(/^[a-f0-9]{7}$/)\n .optional(),\n /** ISO date of last update */\n updated: z.string().optional(),\n /** Provenance tracking when skill was forked from another */\n forkedFrom: z\n .object({\n /** Original skill ID */\n skillId: z.string(),\n /** Version of the original at fork time */\n version: z.number().int().min(1).optional(),\n /** Content hash of the original at fork time */\n contentHash: z.string(),\n /** Source URL or identifier */\n source: z.string().optional(),\n /** ISO date of the fork */\n date: z.string(),\n })\n .optional(),\n })\n .strict();\n\nconst stackSkillAssignmentSchema = z\n .object({\n id: z.string().min(1),\n /** If true, skill content is embedded in the compiled agent prompt */\n preloaded: z.boolean().optional(),\n })\n .strict();\n\n/** Strict validation for published stack config.yaml (marketplace stacks) */\nexport const stackConfigValidationSchema = z\n .object({\n /** Unique stack identifier in kebab-case */\n id: z.string().regex(KEBAB_CASE_PATTERN).optional(),\n name: z.string().min(1),\n version: z.string(),\n author: z.string().min(1),\n description: z.string().optional(),\n /** ISO date when this stack was first created */\n created: z.string().optional(),\n /** ISO date of last update */\n updated: z.string().optional(),\n /** Primary framework this stack is designed for (e.g., \"nextjs\", \"remix\") */\n framework: z.string().optional(),\n /** All skills used in this stack (flat list, at least one required) */\n skills: z.array(stackSkillAssignmentSchema).min(1),\n /** Agent IDs this stack compiles (at least one required) */\n agents: z.array(z.string().regex(KEBAB_CASE_PATTERN)).min(1),\n /** Per-agent skill assignments: { agentId: { subcategory: [skillAssignment] } } */\n agentSkills: z\n .record(z.string(), z.record(z.string(), z.array(stackSkillAssignmentSchema)))\n .optional(),\n /** High-level philosophy guiding technology choices */\n philosophy: z.string().optional(),\n /** Guiding principles for agents using this stack */\n principles: z.array(z.string().min(1)).optional(),\n tags: z.array(z.string().regex(KEBAB_CASE_PATTERN)).optional(),\n /** Per-skill overrides: alternative suggestions and lock status */\n overrides: z\n .record(\n z.string(),\n z\n .object({\n /** Suggested alternative skill IDs if this one is swapped */\n alternatives: z.array(z.string().min(1)).optional(),\n /** If true, this skill cannot be swapped by the user */\n locked: z.boolean().optional(),\n })\n .strict(),\n )\n .optional(),\n /** Community metrics for sorting/ranking */\n metrics: z\n .object({\n upvotes: z.number().int().min(0).optional(),\n downloads: z.number().int().min(0).optional(),\n })\n .strict()\n .optional(),\n /** Lifecycle hooks triggered by file changes or commands */\n hooks: z\n .record(\n z.string(),\n z.array(\n z.object({\n /** Glob pattern to match file paths (e.g., \"*.tsx\") */\n matcher: z.string().optional(),\n hooks: z.array(agentHookActionSchema).min(1),\n }),\n ),\n )\n .optional(),\n })\n .strict();\n\n/** Format Zod validation issues into a human-readable string (e.g., \"path.to.field: Expected string; other: Required\") */\nexport function formatZodErrors(issues: z.ZodIssue[]): string {\n return issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n}\n\n/**\n * Validates that a parsed JSON/YAML value does not exceed a maximum nesting depth.\n * Returns true if the structure is within limits, false if it exceeds maxDepth.\n */\nexport function validateNestingDepth(value: unknown, maxDepth: number): boolean {\n function check(val: unknown, depth: number): boolean {\n if (depth > maxDepth) return false;\n if (Array.isArray(val)) {\n return val.every((item) => check(item, depth + 1));\n }\n if (val !== null && typeof val === \"object\") {\n return Object.values(val).every((v) => check(v, depth + 1));\n }\n return true;\n }\n return check(value, 0);\n}\n\n/**\n * Logs warnings for unknown fields in a parsed object compared to a list of expected keys.\n * Used at security-critical parsing boundaries (marketplace, settings) where `.passthrough()`\n * is kept for backward compatibility but unexpected fields should be surfaced.\n */\nexport function warnUnknownFields(\n parsed: Record<string, unknown>,\n expectedKeys: readonly string[],\n context: string,\n): void {\n const expectedSet = new Set(expectedKeys);\n const unknownKeys = Object.keys(parsed).filter((k) => !expectedSet.has(k));\n if (unknownKeys.length > 0) {\n warn(`Unknown fields in ${context}: ${unknownKeys.join(\", \")}`);\n }\n}\n"],"mappings":"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A;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,uBAAuB,EAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,yBAAyB,EAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM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","names":[]}
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CheckboxGrid
4
- } from "./chunk-GCN7GGWE.js";
4
+ } from "./chunk-GUIRWCKI.js";
5
5
  import {
6
6
  useWizardStore
7
- } from "./chunk-XRA4LHTJ.js";
7
+ } from "./chunk-FYNMNY4P.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-DHET7RCE.js";
@@ -42,4 +42,4 @@ var DomainSelection = () => {
42
42
  export {
43
43
  DomainSelection
44
44
  };
45
- //# sourceMappingURL=chunk-GVRZY5KI.js.map
45
+ //# sourceMappingURL=chunk-5BDYODWP.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  CLI_COLORS,
7
7
  SCROLL_VIEWPORT
8
- } from "./chunk-PP7NDFFE.js";
8
+ } from "./chunk-FVN5PFFY.js";
9
9
  import {
10
10
  init_esm_shims
11
11
  } from "./chunk-DHET7RCE.js";
@@ -164,6 +164,7 @@ var getCompatibilityLabel = (option, isLocked) => {
164
164
  };
165
165
  var SkillTag = ({ option, isFocused, isLocked, showLabels }) => {
166
166
  const getTextColor = () => {
167
+ if (option.state === "disabled" && option.selected) return CLI_COLORS.PRIMARY;
167
168
  if (isLocked || option.state === "disabled") return CLI_COLORS.NEUTRAL;
168
169
  if (option.selected) return CLI_COLORS.PRIMARY;
169
170
  if (option.state === "recommended") return CLI_COLORS.UNFOCUSED;
@@ -171,6 +172,7 @@ var SkillTag = ({ option, isFocused, isLocked, showLabels }) => {
171
172
  return CLI_COLORS.NEUTRAL;
172
173
  };
173
174
  const getStateBorderColor = () => {
175
+ if (option.state === "disabled" && option.selected) return CLI_COLORS.PRIMARY;
174
176
  if (isLocked || option.state === "disabled") return CLI_COLORS.NEUTRAL;
175
177
  if (option.selected) return CLI_COLORS.PRIMARY;
176
178
  if (option.state === "recommended") return CLI_COLORS.UNFOCUSED;
@@ -187,7 +189,7 @@ var SkillTag = ({ option, isFocused, isLocked, showLabels }) => {
187
189
  borderStyle: "single",
188
190
  flexShrink: 0,
189
191
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
190
- /* @__PURE__ */ jsxs(Text, { color: textColor, bold: true, children: [
192
+ /* @__PURE__ */ jsxs(Text, { color: textColor, bold: true, dimColor: option.state === "disabled" && option.selected, children: [
191
193
  " ",
192
194
  option.label,
193
195
  " "
@@ -371,4 +373,4 @@ var CategoryGrid = ({
371
373
  export {
372
374
  CategoryGrid
373
375
  };
374
- //# sourceMappingURL=chunk-53K3URKF.js.map
376
+ //# sourceMappingURL=chunk-ABE55TEU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/category-grid.tsx","../src/cli/components/hooks/use-category-grid-input.ts"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { Box, type DOMElement, Text, measureElement } from \"ink\";\n\nimport { CLI_COLORS, SCROLL_VIEWPORT } from \"../../consts.js\";\nimport type { SkillId, Subcategory } from \"../../types/index.js\";\nimport { isSectionLocked, useCategoryGridInput } from \"../hooks/use-category-grid-input.js\";\nimport { useFocusedListItem } from \"../hooks/use-focused-list-item.js\";\n\nexport type OptionState = \"normal\" | \"recommended\" | \"discouraged\" | \"disabled\";\n\nexport type CategoryOption = {\n id: SkillId;\n label: string;\n state: OptionState;\n stateReason?: string;\n selected: boolean;\n local?: boolean;\n installed?: boolean;\n};\n\nexport type CategoryRow = {\n id: Subcategory;\n displayName: string;\n required: boolean;\n exclusive: boolean;\n options: CategoryOption[];\n};\n\nexport type CategoryGridProps = {\n categories: CategoryRow[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n showLabels: boolean;\n expertMode: boolean;\n onToggle: (categoryId: Subcategory, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n /** Optional initial focus row (default: 0). Use with React `key` to reset. */\n defaultFocusedRow?: number;\n /** Optional initial focus col (default: 0). Use with React `key` to reset. */\n defaultFocusedCol?: number;\n /** Optional callback fired whenever the focused position changes */\n onFocusChange?: (row: number, col: number) => void;\n};\n\nconst SYMBOL_REQUIRED = \"*\";\n\n/**\n * Priority order for skill states in the initial sort.\n * Lower numbers appear first. Selected skills are sorted above all states.\n */\nconst STATE_PRIORITY: Record<OptionState, number> = {\n recommended: 0,\n normal: 1,\n discouraged: 2,\n disabled: 3,\n};\n\n/**\n * Sort options by: selected first, then by state priority.\n * Within each group, original matrix order is preserved (stable sort).\n */\nconst stableSortByState = (options: CategoryOption[]): CategoryOption[] => {\n return [...options].sort((a, b) => {\n if (a.selected !== b.selected) return a.selected ? -1 : 1;\n return STATE_PRIORITY[a.state] - STATE_PRIORITY[b.state];\n });\n};\n\nconst findNextValidOption = (\n options: CategoryOption[],\n currentIndex: number,\n direction: 1 | -1,\n wrap = true,\n): number => {\n const length = options.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex + direction;\n\n if (wrap) {\n if (index < 0) index = length - 1;\n if (index >= length) index = 0;\n } else {\n if (index < 0) index = 0;\n if (index >= length) index = length - 1;\n }\n\n return index;\n};\n\ntype SkillTagProps = {\n option: CategoryOption;\n isFocused: boolean;\n isLocked: boolean;\n showLabels: boolean;\n};\n\nconst getCompatibilityLabel = (option: CategoryOption, isLocked: boolean): string | null => {\n if (option.selected) return \"(selected)\";\n if (isLocked || option.state === \"disabled\") return \"(disabled)\";\n if (option.state === \"recommended\") return \"(recommended)\";\n if (option.state === \"discouraged\") return \"(discouraged)\";\n return null;\n};\n\nconst SkillTag: React.FC<SkillTagProps> = ({ option, isFocused, isLocked, showLabels }) => {\n const getTextColor = (): string => {\n if (option.state === \"disabled\" && option.selected) return CLI_COLORS.PRIMARY;\n if (isLocked || option.state === \"disabled\") return CLI_COLORS.NEUTRAL;\n if (option.selected) return CLI_COLORS.PRIMARY;\n if (option.state === \"recommended\") return CLI_COLORS.UNFOCUSED;\n if (option.state === \"discouraged\") return CLI_COLORS.WARNING;\n\n return CLI_COLORS.NEUTRAL;\n };\n\n const getStateBorderColor = (): string => {\n if (option.state === \"disabled\" && option.selected) return CLI_COLORS.PRIMARY;\n if (isLocked || option.state === \"disabled\") return CLI_COLORS.NEUTRAL;\n if (option.selected) return CLI_COLORS.PRIMARY;\n if (option.state === \"recommended\") return CLI_COLORS.UNFOCUSED;\n if (option.state === \"discouraged\") return CLI_COLORS.WARNING;\n return CLI_COLORS.UNFOCUSED;\n };\n\n const textColor = getTextColor();\n const compatibilityLabel = showLabels ? getCompatibilityLabel(option, isLocked) : null;\n\n return (\n <Box\n marginRight={1}\n borderColor={isFocused ? getStateBorderColor() : CLI_COLORS.NEUTRAL}\n borderStyle=\"single\"\n flexShrink={0}\n >\n <>\n <Text color={textColor} bold dimColor={option.state === \"disabled\" && option.selected}>\n {\" \"}\n {option.label}{\" \"}\n </Text>\n {compatibilityLabel && <Text dimColor>{compatibilityLabel} </Text>}\n </>\n </Box>\n );\n};\n\ntype CategorySectionProps = {\n isFirst: boolean;\n category: CategoryRow;\n options: CategoryOption[];\n isLocked: boolean;\n isFocused: boolean;\n focusedOptionIndex: number;\n showLabels: boolean;\n};\n\nconst CategorySection: React.FC<CategorySectionProps> = ({\n isFirst,\n category,\n options,\n isLocked,\n isFocused,\n focusedOptionIndex,\n showLabels,\n}) => {\n return (\n <Box flexDirection=\"column\" marginTop={isFirst ? 0 : 1}>\n <Box flexDirection=\"row\">\n <Text dimColor={isLocked} color={isFocused ? \"#fff\" : \"gray\"}>\n {category.displayName}\n </Text>\n {category.required && (\n <Text color={isLocked ? CLI_COLORS.NEUTRAL : CLI_COLORS.ERROR} dimColor={isLocked}>\n {\" \"}\n {SYMBOL_REQUIRED}\n </Text>\n )}\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {options.map((option, index) => (\n <SkillTag\n key={option.id}\n option={option}\n isFocused={isFocused && index === focusedOptionIndex && !isLocked}\n isLocked={isLocked}\n showLabels={showLabels}\n />\n ))}\n </Box>\n </Box>\n );\n};\n\ntype ProcessedCategory = CategoryRow & { sortedOptions: CategoryOption[] };\n\nexport const CategoryGrid: React.FC<CategoryGridProps> = ({\n categories,\n availableHeight = 0,\n showLabels,\n expertMode,\n onToggle,\n onToggleLabels,\n defaultFocusedRow = 0,\n defaultFocusedCol = 0,\n onFocusChange,\n}) => {\n // Cache the initial sort order per category so toggling selections does not reorder skills.\n // The ref resets when the component remounts (e.g., domain change via key={activeDomain}).\n const initialOrderRef = useRef<Map<string, SkillId[]>>(new Map());\n\n const processedCategories = useMemo(\n () =>\n categories.map((category) => {\n const cached = initialOrderRef.current.get(category.id);\n if (cached) {\n const orderMap = new Map(cached.map((id, idx) => [id, idx]));\n const sorted = [...category.options].sort((a, b) => {\n const aIdx = orderMap.get(a.id) ?? Infinity;\n const bIdx = orderMap.get(b.id) ?? Infinity;\n return aIdx - bIdx;\n });\n return { ...category, sortedOptions: sorted };\n }\n const sorted = stableSortByState(category.options);\n initialOrderRef.current.set(\n category.id,\n sorted.map((o) => o.id),\n );\n return { ...category, sortedOptions: sorted };\n }),\n [categories],\n );\n\n const getColCount = useCallback(\n (row: number): number => processedCategories[row]?.sortedOptions.length ?? 0,\n [processedCategories],\n );\n\n const isRowLocked = useCallback(\n (row: number): boolean => {\n const cat = processedCategories[row];\n return cat ? isSectionLocked(cat.id, categories) : false;\n },\n [processedCategories, categories],\n );\n\n const findValidCol = useCallback(\n (row: number, currentCol: number, direction: 1 | -1): number => {\n const options = processedCategories[row]?.sortedOptions || [];\n const catId = processedCategories[row]?.id;\n if (catId && isSectionLocked(catId, categories)) return currentCol;\n return findNextValidOption(options, currentCol, direction, true);\n },\n [processedCategories, categories],\n );\n\n const { focusedRow, focusedCol, setFocused, moveFocus } = useFocusedListItem(\n processedCategories.length,\n getColCount,\n {\n wrap: true,\n isRowLocked,\n findValidCol,\n onChange: onFocusChange,\n initialRow: defaultFocusedRow,\n initialCol: defaultFocusedCol,\n },\n );\n\n useCategoryGridInput({\n processedCategories,\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n });\n\n const sectionRefs = useRef<(DOMElement | null)[]>([]);\n const [sectionHeights, setSectionHeights] = useState<number[]>([]);\n const [scrollTopPx, setScrollTopPx] = useState(0);\n\n const setSectionRef = useCallback((index: number, el: DOMElement | null) => {\n sectionRefs.current[index] = el;\n }, []);\n\n useEffect(() => {\n const heights = sectionRefs.current.map((el) => {\n if (el) {\n const { height } = measureElement(el);\n return height;\n }\n return 0;\n });\n setSectionHeights((prev) => {\n if (prev.length === heights.length && prev.every((h, i) => h === heights[i])) {\n return prev;\n }\n return heights;\n });\n });\n\n const scrollEnabled = availableHeight > 0 && availableHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS;\n\n useEffect(() => {\n if (!scrollEnabled || sectionHeights.length === 0) return;\n\n let topOfFocused = 0;\n for (let i = 0; i < focusedRow; i++) {\n topOfFocused += sectionHeights[i] ?? 0;\n }\n const focusedHeight = sectionHeights[focusedRow] ?? 0;\n const bottomOfFocused = topOfFocused + focusedHeight;\n\n setScrollTopPx((prev) => {\n if (topOfFocused < prev) {\n return topOfFocused;\n }\n if (bottomOfFocused > prev + availableHeight) {\n return bottomOfFocused - availableHeight;\n }\n return prev;\n });\n }, [focusedRow, sectionHeights, scrollEnabled, availableHeight]);\n\n if (categories.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No categories to display.</Text>\n </Box>\n );\n }\n\n const sectionElements = processedCategories.map((category, index) => {\n const isLocked = isSectionLocked(category.id, categories);\n\n return (\n <Box key={category.id} ref={(el) => setSectionRef(index, el)} flexShrink={0}>\n <CategorySection\n category={category}\n options={category.sortedOptions}\n isLocked={isLocked}\n isFocused={index === focusedRow}\n focusedOptionIndex={focusedCol}\n showLabels={showLabels}\n isFirst={index === 0}\n />\n </Box>\n );\n });\n\n // When no height constraint, render flat (tests, or before first measurement)\n if (!scrollEnabled) {\n return (\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {sectionElements}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" height={availableHeight} overflow=\"hidden\">\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} flexShrink={0}>\n {sectionElements}\n </Box>\n </Box>\n );\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { useInput } from \"ink\";\n\nimport type { Subcategory, SkillId } from \"../../types/index.js\";\nimport type { CategoryOption, CategoryRow } from \"../wizard/category-grid.js\";\n\nconst FRAMEWORK_CATEGORY_ID = \"web-framework\";\n\n// Locked = non-framework section when no framework is selected\nexport const isSectionLocked = (categoryId: Subcategory, categories: CategoryRow[]): boolean => {\n if (categoryId === FRAMEWORK_CATEGORY_ID) {\n return false;\n }\n\n const frameworkCategory = categories.find((cat) => cat.id === FRAMEWORK_CATEGORY_ID);\n if (!frameworkCategory) return false;\n\n return !frameworkCategory.options.some((opt) => opt.selected);\n};\n\nexport const findValidStartColumn = (_options: CategoryOption[]): number => {\n return 0;\n};\n\n/** Find next unlocked section index (wrapping, direction: forward) */\nexport const findNextUnlockedIndex = (\n processed: { id: Subcategory; sortedOptions: CategoryOption[] }[],\n currentIndex: number,\n allCategories: CategoryRow[],\n): number => {\n const length = processed.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex;\n let attempts = 0;\n\n while (attempts < length) {\n index += 1;\n if (index >= length) index = 0;\n\n const category = processed[index];\n if (category && !isSectionLocked(category.id, allCategories)) {\n return index;\n }\n\n attempts++;\n }\n\n return currentIndex;\n};\n\ntype ProcessedCategory = CategoryRow & { sortedOptions: CategoryOption[] };\n\ntype UseCategoryGridInputOptions = {\n processedCategories: ProcessedCategory[];\n categories: CategoryRow[];\n focusedRow: number;\n focusedCol: number;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: \"up\" | \"down\" | \"left\" | \"right\") => void;\n onToggle: (categoryId: Subcategory, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n};\n\nexport function useCategoryGridInput({\n processedCategories,\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n}: UseCategoryGridInputOptions): void {\n const currentRow = processedCategories[focusedRow];\n const currentOptions = currentRow?.sortedOptions || [];\n const currentLocked = currentRow ? isSectionLocked(currentRow.id, categories) : false;\n\n // Adjust column when current row's options change externally (e.g. option becomes disabled)\n useEffect(() => {\n if (!currentRow) return;\n\n const maxCol = currentOptions.length - 1;\n if (focusedCol > maxCol) {\n const newCol = Math.max(0, maxCol);\n setFocused(focusedRow, newCol);\n }\n }, [focusedRow, currentOptions, focusedCol, setFocused, currentRow]);\n\n // Bounce off locked sections when a section becomes locked (e.g. framework deselected)\n useEffect(() => {\n if (currentRow && currentLocked) {\n const nextUnlocked = findNextUnlockedIndex(processedCategories, focusedRow, categories);\n if (nextUnlocked !== focusedRow) {\n const newRowOptions = processedCategories[nextUnlocked]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n setFocused(nextUnlocked, newCol);\n }\n }\n }, [currentRow, currentLocked, focusedRow, processedCategories, categories, setFocused]);\n\n // Store the latest handler in a ref so that the useInput effect never needs to\n // re-register on the event emitter. This avoids a stale-closure race condition\n // where, after a domain switch (CategoryGrid remount via key={activeDomain}),\n // the useInput effect may not yet have re-registered the updated handler when\n // the first keypress arrives — causing the first space press to be silently lost.\n type InputKey = {\n leftArrow: boolean;\n rightArrow: boolean;\n upArrow: boolean;\n downArrow: boolean;\n tab: boolean;\n shift: boolean;\n };\n\n const handlerRef = useRef<((input: string, key: InputKey) => void) | null>(null);\n handlerRef.current = (input: string, key: InputKey) => {\n if (key.tab && key.shift) {\n onToggleLabels();\n return;\n }\n\n if (key.tab && !key.shift) {\n const nextSection = findNextUnlockedIndex(processedCategories, focusedRow, categories);\n if (nextSection !== focusedRow) {\n const newRowOptions = processedCategories[nextSection]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n setFocused(nextSection, newCol);\n }\n return;\n }\n\n if (input === \"d\" || input === \"D\") {\n onToggleLabels();\n return;\n }\n\n if (input === \" \") {\n if (currentLocked) return;\n const currentOption = currentOptions[focusedCol];\n if (currentOption && currentOption.state !== \"disabled\") {\n onToggle(currentRow.id, currentOption.id);\n }\n return;\n }\n\n const isLeft = key.leftArrow || input === \"h\";\n const isRight = key.rightArrow || input === \"l\";\n const isUp = key.upArrow || input === \"k\";\n const isDown = key.downArrow || input === \"j\";\n\n if (isLeft) {\n if (currentLocked) return;\n moveFocus(\"left\");\n } else if (isRight) {\n if (currentLocked) return;\n moveFocus(\"right\");\n } else if (isUp) {\n moveFocus(\"up\");\n } else if (isDown) {\n moveFocus(\"down\");\n }\n };\n\n // Stable handler reference — never changes, so useInput's effect registers once\n const stableHandler = useCallback((input: string, key: InputKey) => {\n handlerRef.current?.(input, key);\n }, []);\n\n useInput(stableHandler);\n}\n"],"mappings":"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","names":["useCallback","useEffect","useRef","useRef","sorted","useCallback","useEffect"]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  cliTheme
4
- } from "./chunk-AQANPOLS.js";
4
+ } from "./chunk-HKRLWERR.js";
5
5
  import {
6
6
  useTextInput
7
7
  } from "./chunk-U3IGFMCY.js";
@@ -9,7 +9,7 @@ import {
9
9
  CLI_COLORS,
10
10
  UI_LAYOUT,
11
11
  UI_SYMBOLS
12
- } from "./chunk-PP7NDFFE.js";
12
+ } from "./chunk-FVN5PFFY.js";
13
13
  import {
14
14
  init_esm_shims
15
15
  } from "./chunk-DHET7RCE.js";
@@ -343,4 +343,4 @@ var SkillSearch = ({
343
343
  export {
344
344
  SkillSearch
345
345
  };
346
- //# sourceMappingURL=chunk-2TWELY5M.js.map
346
+ //# sourceMappingURL=chunk-ARET3NYO.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  getErrorMessage,
4
4
  warn
5
- } from "./chunk-UXNHU7Y7.js";
5
+ } from "./chunk-473YHDYQ.js";
6
6
  import {
7
7
  init_esm_shims
8
8
  } from "./chunk-DHET7RCE.js";
@@ -180,4 +180,4 @@ export {
180
180
  claudePluginMarketplaceAdd,
181
181
  claudePluginUninstall
182
182
  };
183
- //# sourceMappingURL=chunk-X34RGEFX.js.map
183
+ //# sourceMappingURL=chunk-CLHBKFHU.js.map
@@ -2,25 +2,25 @@
2
2
  import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs
5
- } from "./chunk-MHET2RG2.js";
5
+ } from "./chunk-3S4GIO4B.js";
6
6
  import {
7
7
  HelpModal
8
- } from "./chunk-44QCEK7E.js";
8
+ } from "./chunk-OALQWRLG.js";
9
9
  import {
10
10
  useWizardStore
11
- } from "./chunk-XRA4LHTJ.js";
11
+ } from "./chunk-FYNMNY4P.js";
12
12
  import {
13
13
  CLI_COLORS,
14
14
  DEFAULT_PLUGIN_NAME
15
- } from "./chunk-PP7NDFFE.js";
15
+ } from "./chunk-FVN5PFFY.js";
16
16
  import {
17
17
  init_esm_shims
18
18
  } from "./chunk-DHET7RCE.js";
19
19
 
20
20
  // src/cli/components/wizard/wizard-layout.tsx
21
21
  init_esm_shims();
22
- import { Fragment } from "react";
23
22
  import { Box, Text } from "ink";
23
+ import { Fragment } from "react";
24
24
 
25
25
  // src/cli/components/hooks/use-terminal-dimensions.ts
26
26
  init_esm_shims();
@@ -124,7 +124,7 @@ var WizardLayout = ({
124
124
  const { completedSteps, skippedSteps } = store.getStepProgress();
125
125
  const { rows: terminalHeight } = useTerminalDimensions();
126
126
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 1, height: terminalHeight, children: [
127
- logo && /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { children: logo }) }),
127
+ logo && /* @__PURE__ */ jsx(Box, { flexDirection: "row", marginTop: 1, columnGap: 1, children: /* @__PURE__ */ jsx(Text, { children: logo }) }),
128
128
  /* @__PURE__ */ jsxs(Box, { children: [
129
129
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Marketplace: " }),
130
130
  /* @__PURE__ */ jsx(Text, { bold: true, children: marketplaceLabel || `${DEFAULT_PLUGIN_NAME} (public)` })
@@ -179,4 +179,4 @@ var WizardLayout = ({
179
179
  export {
180
180
  WizardLayout
181
181
  };
182
- //# sourceMappingURL=chunk-ORJPGZVD.js.map
182
+ //# sourceMappingURL=chunk-DAVOSI4M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard-layout.tsx","../src/cli/components/hooks/use-terminal-dimensions.ts"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React, { Fragment } from \"react\";\nimport { CLI_COLORS, DEFAULT_PLUGIN_NAME } from \"../../consts.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { useTerminalDimensions } from \"../hooks/use-terminal-dimensions.js\";\nimport { HelpModal } from \"./help-modal.js\";\nimport { WIZARD_STEPS, WizardTabs } from \"./wizard-tabs.js\";\n\ntype KeyHintProps = {\n isVisible?: boolean;\n isActive?: boolean;\n label: string;\n values: string[];\n};\n\nconst DefinitionItem: React.FC<KeyHintProps> = ({\n isVisible = true,\n isActive = false,\n label,\n values,\n}) => {\n if (!isVisible) {\n return null;\n }\n\n return (\n <Text>\n {values.map((value) => (\n <Fragment key={value}>\n <Text\n backgroundColor=\"black\"\n color={isActive ? CLI_COLORS.PRIMARY : CLI_COLORS.UNFOCUSED}\n >\n {\" \"}\n {value}{\" \"}\n </Text>{\" \"}\n </Fragment>\n ))}\n <Text color={isActive ? CLI_COLORS.PRIMARY : undefined}>{label}</Text>\n </Text>\n );\n};\n\nconst HOT_KEYS: { label: string; values: string[] }[] = [\n { label: \"navigate\", values: [\"\\u2190/\\u2192\", \"\\u2191/\\u2193\"] },\n { label: \"select\", values: [\"SPACE\"] },\n { label: \"continue\", values: [\"ENTER\"] },\n { label: \"back\", values: [\"ESC\"] },\n];\n\nconst WizardFooter = () => {\n const store = useWizardStore();\n\n return (\n <Box\n columnGap={2}\n borderTop\n borderRight={false}\n borderBottom\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingLeft={1}\n paddingRight={1}\n >\n <DefinitionItem\n label=\"Accept defaults\"\n values={[\"A\"]}\n isVisible={store.step === \"build\" && !!store.selectedStackId}\n />\n {HOT_KEYS.map((hotkey) => (\n <DefinitionItem {...hotkey} key={hotkey.label} />\n ))}\n </Box>\n );\n};\n\ntype WizardLayoutProps = {\n version?: string;\n marketplaceLabel?: string;\n logo?: string;\n children: React.ReactNode;\n};\n\nexport const WizardLayout: React.FC<WizardLayoutProps> = ({\n version,\n marketplaceLabel,\n logo,\n children,\n}) => {\n const store = useWizardStore();\n const { completedSteps, skippedSteps } = store.getStepProgress();\n const { rows: terminalHeight } = useTerminalDimensions();\n\n return (\n <Box flexDirection=\"column\" paddingX={1} height={terminalHeight}>\n {logo && (\n <Box flexDirection=\"row\" marginTop={1} columnGap={1}>\n <Text>{logo}</Text>\n </Box>\n )}\n <Box>\n <Text dimColor>Marketplace: </Text>\n <Text bold>{marketplaceLabel || `${DEFAULT_PLUGIN_NAME} (public)`}</Text>\n </Box>\n <WizardTabs\n steps={WIZARD_STEPS}\n currentStep={store.step}\n completedSteps={completedSteps}\n skippedSteps={skippedSteps}\n version={version}\n />\n {store.showHelp ? (\n <HelpModal currentStep={store.step} />\n ) : (\n <>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginTop={1}>\n {children}\n </Box>\n <Box paddingX={1} columnGap={2} marginTop={2}>\n <DefinitionItem label=\"Expert mode\" values={[\"E\"]} isActive={store.expertMode} />\n <DefinitionItem\n label=\"Labels\"\n values={[\"D\"]}\n isVisible={store.step === \"build\"}\n isActive={store.showLabels}\n />\n <DefinitionItem\n label=\"Plugin mode\"\n values={[\"P\"]}\n isActive={store.installMode === \"plugin\"}\n />\n <DefinitionItem\n label=\"Settings\"\n values={[\"G\"]}\n isVisible={store.step === \"sources\"}\n isActive={store.showSettings}\n />\n <DefinitionItem label=\"Help\" values={[\"?\"]} />\n </Box>\n <WizardFooter />\n </>\n )}\n </Box>\n );\n};\n","import { useState, useEffect } from \"react\";\nimport { useStdout } from \"ink\";\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport type TerminalDimensions = {\n /** Terminal width in columns */\n columns: number;\n /** Terminal height in rows */\n rows: number;\n};\n\n/**\n * Tracks terminal dimensions reactively. Re-renders on resize.\n *\n * Falls back to DEFAULT_COLUMNS x DEFAULT_ROWS when stdout is not a TTY\n * (e.g., piped output, CI environments, tests).\n */\nexport function useTerminalDimensions(): TerminalDimensions {\n const { stdout } = useStdout();\n\n const [dimensions, setDimensions] = useState<TerminalDimensions>(() => ({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n }));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n });\n };\n\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return dimensions;\n}\n"],"mappings":"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","names":["Fragment"]}
@@ -2,12 +2,12 @@
2
2
  import {
3
3
  useModalState
4
4
  } from "./chunk-7SOPVGDV.js";
5
- import {
6
- ViewTitle
7
- } from "./chunk-MMD26LKJ.js";
8
5
  import {
9
6
  useKeyboardNavigation
10
7
  } from "./chunk-KUV24B5M.js";
8
+ import {
9
+ ViewTitle
10
+ } from "./chunk-KWWLPPHF.js";
11
11
  import {
12
12
  useTextInput
13
13
  } from "./chunk-U3IGFMCY.js";
@@ -16,14 +16,14 @@ import {
16
16
  addSource,
17
17
  getSourceSummary,
18
18
  removeSource
19
- } from "./chunk-SYHRJG5G.js";
19
+ } from "./chunk-ZECXM7LP.js";
20
20
  import {
21
21
  getErrorMessage,
22
22
  verbose
23
- } from "./chunk-UXNHU7Y7.js";
23
+ } from "./chunk-473YHDYQ.js";
24
24
  import {
25
25
  CLI_COLORS
26
- } from "./chunk-PP7NDFFE.js";
26
+ } from "./chunk-FVN5PFFY.js";
27
27
  import {
28
28
  init_esm_shims
29
29
  } from "./chunk-DHET7RCE.js";
@@ -232,4 +232,4 @@ var StepSettings = ({ projectDir, onClose }) => {
232
232
  export {
233
233
  StepSettings
234
234
  };
235
- //# sourceMappingURL=chunk-IUYU2TP6.js.map
235
+ //# sourceMappingURL=chunk-ELRGSZHZ.js.map
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- SelectionCard
4
- } from "./chunk-ZHJEZ7AU.js";
5
2
  import {
6
3
  getDomainsFromStack
7
4
  } from "./chunk-YRVTXSXP.js";
5
+ import {
6
+ SelectionCard
7
+ } from "./chunk-NTPHCNJO.js";
8
8
  import {
9
9
  ViewTitle
10
- } from "./chunk-MMD26LKJ.js";
10
+ } from "./chunk-KWWLPPHF.js";
11
11
  import {
12
12
  useWizardStore
13
- } from "./chunk-XRA4LHTJ.js";
13
+ } from "./chunk-FYNMNY4P.js";
14
14
  import {
15
15
  DEFAULT_SCRATCH_DOMAINS
16
- } from "./chunk-PP7NDFFE.js";
16
+ } from "./chunk-FVN5PFFY.js";
17
17
  import {
18
18
  init_esm_shims
19
19
  } from "./chunk-DHET7RCE.js";
@@ -99,4 +99,4 @@ var StackSelection = ({ matrix, onCancel }) => {
99
99
  export {
100
100
  StackSelection
101
101
  };
102
- //# sourceMappingURL=chunk-MI4NWOWD.js.map
102
+ //# sourceMappingURL=chunk-ENWMWIHP.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-KUV24B5M.js";
5
5
  import {
6
6
  CLI_COLORS
7
- } from "./chunk-PP7NDFFE.js";
7
+ } from "./chunk-FVN5PFFY.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-DHET7RCE.js";
@@ -18,7 +18,6 @@ var MARKER_FOCUSED = "\u25B8";
18
18
  var MARKER_SPACER = " ";
19
19
  var ResultRow = ({ candidate, isFocused }) => {
20
20
  const marker = isFocused ? MARKER_FOCUSED : MARKER_SPACER;
21
- const versionLabel = candidate.version != null ? `v${candidate.version}` : "";
22
21
  const sourceLabel = `${candidate.sourceName}/${candidate.id}`;
23
22
  return /* @__PURE__ */ jsxs(Box, { children: [
24
23
  /* @__PURE__ */ jsxs(Text, { bold: isFocused, color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: [
@@ -26,10 +25,6 @@ var ResultRow = ({ candidate, isFocused }) => {
26
25
  " "
27
26
  ] }),
28
27
  /* @__PURE__ */ jsx(Text, { bold: isFocused, color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: sourceLabel }),
29
- versionLabel && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
30
- " ",
31
- versionLabel
32
- ] }),
33
28
  candidate.description && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
34
29
  " ",
35
30
  candidate.description
@@ -92,4 +87,4 @@ var SearchModal = ({ results, alias, onBind, onClose }) => {
92
87
  export {
93
88
  SearchModal
94
89
  };
95
- //# sourceMappingURL=chunk-52SI5XJH.js.map
90
+ //# sourceMappingURL=chunk-F3O5YHSI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/search-modal.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { BoundSkillCandidate } from \"../../types/index.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { useKeyboardNavigation } from \"../hooks/use-keyboard-navigation.js\";\n\nexport type SearchModalProps = {\n results: BoundSkillCandidate[];\n alias: string;\n onBind: (candidate: BoundSkillCandidate) => void;\n onClose: () => void;\n};\n\nconst MARKER_FOCUSED = \"\\u25B8\";\nconst MARKER_SPACER = \" \";\n\ntype ResultRowProps = {\n candidate: BoundSkillCandidate;\n isFocused: boolean;\n};\n\nconst ResultRow: React.FC<ResultRowProps> = ({ candidate, isFocused }) => {\n const marker = isFocused ? MARKER_FOCUSED : MARKER_SPACER;\n const sourceLabel = `${candidate.sourceName}/${candidate.id}`;\n\n return (\n <Box>\n <Text bold={isFocused} color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {marker}{\" \"}\n </Text>\n <Text bold={isFocused} color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {sourceLabel}\n </Text>\n {candidate.description && (\n <Text dimColor>\n {\" \"}\n {candidate.description}\n </Text>\n )}\n </Box>\n );\n};\n\nexport const SearchModal: React.FC<SearchModalProps> = ({ results, alias, onBind, onClose }) => {\n const handleEnter = useCallback(\n (index: number) => {\n if (results.length > 0) {\n const selected = results[index];\n if (selected) {\n onBind(selected);\n }\n }\n },\n [results, onBind],\n );\n\n const { focusedIndex } = useKeyboardNavigation(\n results.length,\n { onEnter: handleEnter, onEscape: onClose },\n { vimKeys: false },\n );\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={CLI_COLORS.NEUTRAL}\n paddingX={1}\n paddingY={0}\n marginTop={1}\n >\n <Text bold>Search results for &quot;{alias}&quot;</Text>\n <Text> </Text>\n\n {results.length === 0 ? (\n <Text dimColor>No results found</Text>\n ) : (\n results.map((candidate, index) => (\n <ResultRow\n key={`${candidate.sourceName}-${candidate.id}`}\n candidate={candidate}\n isFocused={index === focusedIndex}\n />\n ))\n )}\n\n <Text> </Text>\n <Text dimColor>\n {\"\\u2191\"}/{\"\\u2193\"} navigate ENTER bind ESC close\n </Text>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA,SAAgB,mBAAmB;AACnC,SAAS,KAAK,YAAY;AA0BpB,SAGA,KAHA;AAdN,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AAOtB,IAAM,YAAsC,CAAC,EAAE,WAAW,UAAU,MAAM;AACxE,QAAM,SAAS,YAAY,iBAAiB;AAC5C,QAAM,cAAc,GAAG,UAAU,UAAU,IAAI,UAAU,EAAE;AAE3D,SACE,qBAAC,OACC;AAAA,yBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,WAAW,UAAU,QAC5D;AAAA;AAAA,MAAQ;AAAA,OACX;AAAA,IACA,oBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,WAAW,UAAU,QAC5D,uBACH;AAAA,IACC,UAAU,eACT,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,MACA,UAAU;AAAA,OACb;AAAA,KAEJ;AAEJ;AAEO,IAAM,cAA0C,CAAC,EAAE,SAAS,OAAO,QAAQ,QAAQ,MAAM;AAC9F,QAAM,cAAc;AAAA,IAClB,CAAC,UAAkB;AACjB,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,WAAW,QAAQ,KAAK;AAC9B,YAAI,UAAU;AACZ,iBAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,MAAM;AAAA,EAClB;AAEA,QAAM,EAAE,aAAa,IAAI;AAAA,IACvB,QAAQ;AAAA,IACR,EAAE,SAAS,aAAa,UAAU,QAAQ;AAAA,IAC1C,EAAE,SAAS,MAAM;AAAA,EACnB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,WAAW;AAAA,MACxB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MAEX;AAAA,6BAAC,QAAK,MAAI,MAAC;AAAA;AAAA,UAA0B;AAAA,UAAM;AAAA,WAAM;AAAA,QACjD,oBAAC,QAAK,eAAC;AAAA,QAEN,QAAQ,WAAW,IAClB,oBAAC,QAAK,UAAQ,MAAC,8BAAgB,IAE/B,QAAQ,IAAI,CAAC,WAAW,UACtB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW,UAAU;AAAA;AAAA,UAFhB,GAAG,UAAU,UAAU,IAAI,UAAU,EAAE;AAAA,QAG9C,CACD;AAAA,QAGH,oBAAC,QAAK,eAAC;AAAA,QACP,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,UAAS;AAAA,UAAE;AAAA,UAAS;AAAA,WACvB;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -140,6 +140,12 @@ var CLI_COLORS = {
140
140
  WHITE: "white"
141
141
  };
142
142
  var DEFAULT_SCRATCH_DOMAINS = ["web", "api", "mobile"];
143
+ var ASCII_LOGO = ` \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557
144
+ \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D
145
+ \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551
146
+ \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551
147
+ \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557
148
+ \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D`;
143
149
  var DEFAULT_PRESELECTED_SKILLS = [
144
150
  "meta-methodology-anti-over-engineering",
145
151
  "meta-methodology-context-management",
@@ -189,6 +195,7 @@ export {
189
195
  DEFAULT_PUBLIC_SOURCE_NAME,
190
196
  CLI_COLORS,
191
197
  DEFAULT_SCRATCH_DOMAINS,
198
+ ASCII_LOGO,
192
199
  DEFAULT_PRESELECTED_SKILLS
193
200
  };
194
- //# sourceMappingURL=chunk-PP7NDFFE.js.map
201
+ //# sourceMappingURL=chunk-FVN5PFFY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/consts.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { Domain, SkillId } from \"./types/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// After tsup build, dist/ is flat, so we go up one level from dist/ to get CLI root\n// In development (src/cli/consts.ts), we go up two levels\nconst isInDist = __dirname.includes(\"/dist\");\nconst CLI_ROOT = isInDist ? path.resolve(__dirname, \"..\") : path.resolve(__dirname, \"../..\");\nexport const PROJECT_ROOT = CLI_ROOT;\n\nexport const CLAUDE_DIR = \".claude\";\nexport const CLAUDE_SRC_DIR = \".claude-src\";\nexport const PLUGINS_SUBDIR = \"plugins\";\nexport const PLUGIN_MANIFEST_DIR = \".claude-plugin\";\nexport const PLUGIN_MANIFEST_FILE = \"plugin.json\";\nexport const DEFAULT_PLUGIN_NAME = \"agents-inc\";\n\nexport const CACHE_DIR = path.join(os.homedir(), \".cache\", DEFAULT_PLUGIN_NAME);\n\nexport const CLI_BIN_NAME = \"agentsinc\";\n\nexport const SKILLS_MATRIX_PATH = \"config/skills-matrix.yaml\";\nexport const STACKS_FILE_PATH = \"config/stacks.yaml\";\nexport const SKILLS_DIR_PATH = \"src/skills\";\nexport const LOCAL_SKILLS_PATH = \".claude/skills\";\nexport const ARCHIVED_SKILLS_DIR_NAME = \"_archived\";\n\nexport const DIRS = {\n agents: \"src/agents\",\n skills: \"src/skills\",\n stacks: \"src/stacks\",\n templates: \"src/agents/_templates\",\n commands: \"src/commands\",\n} as const;\n\nexport const STANDARD_FILES = {\n SKILL_MD: \"SKILL.md\",\n METADATA_YAML: \"metadata.yaml\",\n METADATA_JSON: \"metadata.json\",\n CONFIG_YAML: \"config.yaml\",\n SKILLS_MATRIX_YAML: \"skills-matrix.yaml\",\n AGENT_YAML: \"agent.yaml\",\n PLUGIN_JSON: \"plugin.json\",\n CLAUDE_MD: \"CLAUDE.md\",\n REFERENCE_MD: \"reference.md\",\n INTRO_MD: \"intro.md\",\n WORKFLOW_MD: \"workflow.md\",\n EXAMPLES_MD: \"examples.md\",\n OUTPUT_FORMAT_MD: \"output-format.md\",\n CRITICAL_REQUIREMENTS_MD: \"critical-requirements.md\",\n CRITICAL_REMINDERS_MD: \"critical-reminders.md\",\n} as const;\n\nexport const STANDARD_DIRS = {\n EXAMPLES: \"examples\",\n SCRIPTS: \"scripts\",\n SKILLS: \"skills\",\n} as const;\n\nexport const DEFAULT_VERSION = \"1.0.0\";\n\n// \"0.0.0\" indicates no version was explicitly set\nexport const DEFAULT_DISPLAY_VERSION = \"0.0.0\";\n\n// JSON Schema URLs for yaml-language-server $schema comments.\n// Uses raw.githubusercontent.com so schemas resolve without requiring the CLI as a dependency.\nconst SCHEMA_PKG_PREFIX = \"https://raw.githubusercontent.com/agents-inc/cli/main/src/schemas\";\n\nexport const SCHEMA_PATHS = {\n agent: `${SCHEMA_PKG_PREFIX}/agent.schema.json`,\n metadata: `${SCHEMA_PKG_PREFIX}/metadata.schema.json`,\n marketplace: `${SCHEMA_PKG_PREFIX}/marketplace.schema.json`,\n projectConfig: `${SCHEMA_PKG_PREFIX}/project-config.schema.json`,\n projectSourceConfig: `${SCHEMA_PKG_PREFIX}/project-source-config.schema.json`,\n skillsMatrix: `${SCHEMA_PKG_PREFIX}/skills-matrix.schema.json`,\n stacks: `${SCHEMA_PKG_PREFIX}/stacks.schema.json`,\n} as const;\n\n/** Generates a yaml-language-server schema comment for the top of YAML files. */\nexport function yamlSchemaComment(schemaPath: string): string {\n return `# yaml-language-server: $schema=${schemaPath}`;\n}\n\nexport const YAML_FORMATTING = {\n INDENT: 2,\n LINE_WIDTH: 120,\n /** lineWidth: 0 disables wrapping — used for metadata files */\n LINE_WIDTH_NONE: 0,\n} as const;\n\nexport const UI_SYMBOLS = {\n CHECKBOX_CHECKED: \"[x]\",\n CHECKBOX_UNCHECKED: \"[ ]\",\n CHEVRON: \"\\u276F\",\n CHEVRON_SPACER: \" \",\n SELECTED: \"\\u2713\",\n UNSELECTED: \"\\u25CB\",\n CURRENT: \"\\u25CF\",\n SKIPPED: \"\\u2013\",\n DISCOURAGED: \"!\",\n DISABLED: \"\\u2013\",\n SCROLL_UP: \"\\u25B2\",\n SCROLL_DOWN: \"\\u25BC\",\n} as const;\n\nexport const UI_LAYOUT = {\n MAX_VISIBLE_RESULTS: 10,\n DESCRIPTION_WIDTH: 30,\n COPIED_MESSAGE_TIMEOUT_MS: 2000,\n FALLBACK_MESSAGE_TIMEOUT_MS: 3000,\n} as const;\n\nexport const GITHUB_SOURCE = {\n HTTPS_PREFIX: \"https://github.com/\",\n GITHUB_PREFIX: \"github:\",\n GH_PREFIX: \"gh:\",\n} as const;\n\nexport const DEFAULT_SKILLS_SUBDIR = \"skills\";\n\nexport const HASH_PREFIX_LENGTH = 7;\n\n/** Hex chars from SHA-256 hash used in cache directory names (64 bits of collision resistance) */\nexport const CACHE_HASH_LENGTH = 16;\n\n/** Max chars of human-readable prefix in cache directory names (for debugging) */\nexport const CACHE_READABLE_PREFIX_LENGTH = 32;\n\n// File size limits for parsing boundaries (DoS prevention)\nconst ONE_MB = 1024 * 1024;\nexport const MAX_MARKETPLACE_FILE_SIZE = 10 * ONE_MB;\nexport const MAX_PLUGIN_FILE_SIZE = ONE_MB;\nexport const MAX_CONFIG_FILE_SIZE = ONE_MB;\n\nexport const MAX_JSON_NESTING_DEPTH = 10;\nexport const MAX_MARKETPLACE_PLUGINS = 10_000;\n\nexport const SCROLL_VIEWPORT = {\n /** Height of the \"N more above\" scroll indicator */\n SCROLL_INDICATOR_HEIGHT: 1,\n /** Estimated lines per category name row (including top margin) */\n CATEGORY_NAME_LINES: 2,\n /** Margin between category sections (marginTop on CategorySection) */\n CATEGORY_MARGIN_LINES: 1,\n /** Minimum rows to show at least 1 category before enabling scroll */\n MIN_VIEWPORT_ROWS: 5,\n /** Minimum terminal height to show the wizard at all */\n MIN_TERMINAL_HEIGHT: 15,\n} as const;\n\nexport const DEFAULT_BRANDING = {\n NAME: \"Agents Inc.\",\n TAGLINE: \"AI-powered development tools\",\n} as const;\n\n/** Fallback name for the default public marketplace when marketplace.json is unavailable */\nexport const DEFAULT_PUBLIC_SOURCE_NAME = \"Agents Inc\";\n\nexport const CLI_COLORS = {\n PRIMARY: \"cyan\",\n SUCCESS: \"green\",\n ERROR: \"red\",\n WARNING: \"yellow\",\n INFO: \"blue\",\n NEUTRAL: \"gray\",\n FOCUS: \"cyan\",\n UNFOCUSED: \"white\",\n WHITE: \"white\",\n} as const;\n\n/** Default domains pre-selected when \"Start from scratch\" is chosen (all except CLI) */\nexport const DEFAULT_SCRATCH_DOMAINS: readonly Domain[] = [\"web\", \"api\", \"mobile\"];\n\nexport const DEFAULT_PRESELECTED_SKILLS: readonly SkillId[] = [\n \"meta-methodology-anti-over-engineering\",\n \"meta-methodology-context-management\",\n \"meta-methodology-improvement-protocol\",\n \"meta-methodology-investigation-requirements\",\n \"meta-methodology-success-criteria\",\n \"meta-methodology-write-verification\",\n];\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli/consts.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { Domain, SkillId } from \"./types/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// After tsup build, dist/ is flat, so we go up one level from dist/ to get CLI root\n// In development (src/cli/consts.ts), we go up two levels\nconst isInDist = __dirname.includes(\"/dist\");\nconst CLI_ROOT = isInDist ? path.resolve(__dirname, \"..\") : path.resolve(__dirname, \"../..\");\nexport const PROJECT_ROOT = CLI_ROOT;\n\nexport const CLAUDE_DIR = \".claude\";\nexport const CLAUDE_SRC_DIR = \".claude-src\";\nexport const PLUGINS_SUBDIR = \"plugins\";\nexport const PLUGIN_MANIFEST_DIR = \".claude-plugin\";\nexport const PLUGIN_MANIFEST_FILE = \"plugin.json\";\nexport const DEFAULT_PLUGIN_NAME = \"agents-inc\";\n\nexport const CACHE_DIR = path.join(os.homedir(), \".cache\", DEFAULT_PLUGIN_NAME);\n\nexport const CLI_BIN_NAME = \"agentsinc\";\n\nexport const SKILLS_MATRIX_PATH = \"config/skills-matrix.yaml\";\nexport const STACKS_FILE_PATH = \"config/stacks.yaml\";\nexport const SKILLS_DIR_PATH = \"src/skills\";\nexport const LOCAL_SKILLS_PATH = \".claude/skills\";\nexport const ARCHIVED_SKILLS_DIR_NAME = \"_archived\";\n\nexport const DIRS = {\n agents: \"src/agents\",\n skills: \"src/skills\",\n stacks: \"src/stacks\",\n templates: \"src/agents/_templates\",\n commands: \"src/commands\",\n} as const;\n\nexport const STANDARD_FILES = {\n SKILL_MD: \"SKILL.md\",\n METADATA_YAML: \"metadata.yaml\",\n METADATA_JSON: \"metadata.json\",\n CONFIG_YAML: \"config.yaml\",\n SKILLS_MATRIX_YAML: \"skills-matrix.yaml\",\n AGENT_YAML: \"agent.yaml\",\n PLUGIN_JSON: \"plugin.json\",\n CLAUDE_MD: \"CLAUDE.md\",\n REFERENCE_MD: \"reference.md\",\n INTRO_MD: \"intro.md\",\n WORKFLOW_MD: \"workflow.md\",\n EXAMPLES_MD: \"examples.md\",\n OUTPUT_FORMAT_MD: \"output-format.md\",\n CRITICAL_REQUIREMENTS_MD: \"critical-requirements.md\",\n CRITICAL_REMINDERS_MD: \"critical-reminders.md\",\n} as const;\n\nexport const STANDARD_DIRS = {\n EXAMPLES: \"examples\",\n SCRIPTS: \"scripts\",\n SKILLS: \"skills\",\n} as const;\n\nexport const DEFAULT_VERSION = \"1.0.0\";\n\n// \"0.0.0\" indicates no version was explicitly set\nexport const DEFAULT_DISPLAY_VERSION = \"0.0.0\";\n\n// JSON Schema URLs for yaml-language-server $schema comments.\n// Uses raw.githubusercontent.com so schemas resolve without requiring the CLI as a dependency.\nconst SCHEMA_PKG_PREFIX = \"https://raw.githubusercontent.com/agents-inc/cli/main/src/schemas\";\n\nexport const SCHEMA_PATHS = {\n agent: `${SCHEMA_PKG_PREFIX}/agent.schema.json`,\n metadata: `${SCHEMA_PKG_PREFIX}/metadata.schema.json`,\n marketplace: `${SCHEMA_PKG_PREFIX}/marketplace.schema.json`,\n projectConfig: `${SCHEMA_PKG_PREFIX}/project-config.schema.json`,\n projectSourceConfig: `${SCHEMA_PKG_PREFIX}/project-source-config.schema.json`,\n skillsMatrix: `${SCHEMA_PKG_PREFIX}/skills-matrix.schema.json`,\n stacks: `${SCHEMA_PKG_PREFIX}/stacks.schema.json`,\n} as const;\n\n/** Generates a yaml-language-server schema comment for the top of YAML files. */\nexport function yamlSchemaComment(schemaPath: string): string {\n return `# yaml-language-server: $schema=${schemaPath}`;\n}\n\nexport const YAML_FORMATTING = {\n INDENT: 2,\n LINE_WIDTH: 120,\n /** lineWidth: 0 disables wrapping — used for metadata files */\n LINE_WIDTH_NONE: 0,\n} as const;\n\nexport const UI_SYMBOLS = {\n CHECKBOX_CHECKED: \"[x]\",\n CHECKBOX_UNCHECKED: \"[ ]\",\n CHEVRON: \"\\u276F\",\n CHEVRON_SPACER: \" \",\n SELECTED: \"\\u2713\",\n UNSELECTED: \"\\u25CB\",\n CURRENT: \"\\u25CF\",\n SKIPPED: \"\\u2013\",\n DISCOURAGED: \"!\",\n DISABLED: \"\\u2013\",\n SCROLL_UP: \"\\u25B2\",\n SCROLL_DOWN: \"\\u25BC\",\n} as const;\n\nexport const UI_LAYOUT = {\n MAX_VISIBLE_RESULTS: 10,\n DESCRIPTION_WIDTH: 30,\n COPIED_MESSAGE_TIMEOUT_MS: 2000,\n FALLBACK_MESSAGE_TIMEOUT_MS: 3000,\n} as const;\n\nexport const GITHUB_SOURCE = {\n HTTPS_PREFIX: \"https://github.com/\",\n GITHUB_PREFIX: \"github:\",\n GH_PREFIX: \"gh:\",\n} as const;\n\nexport const DEFAULT_SKILLS_SUBDIR = \"skills\";\n\nexport const HASH_PREFIX_LENGTH = 7;\n\n/** Hex chars from SHA-256 hash used in cache directory names (64 bits of collision resistance) */\nexport const CACHE_HASH_LENGTH = 16;\n\n/** Max chars of human-readable prefix in cache directory names (for debugging) */\nexport const CACHE_READABLE_PREFIX_LENGTH = 32;\n\n// File size limits for parsing boundaries (DoS prevention)\nconst ONE_MB = 1024 * 1024;\nexport const MAX_MARKETPLACE_FILE_SIZE = 10 * ONE_MB;\nexport const MAX_PLUGIN_FILE_SIZE = ONE_MB;\nexport const MAX_CONFIG_FILE_SIZE = ONE_MB;\n\nexport const MAX_JSON_NESTING_DEPTH = 10;\nexport const MAX_MARKETPLACE_PLUGINS = 10_000;\n\nexport const SCROLL_VIEWPORT = {\n /** Height of the \"N more above\" scroll indicator */\n SCROLL_INDICATOR_HEIGHT: 1,\n /** Estimated lines per category name row (including top margin) */\n CATEGORY_NAME_LINES: 2,\n /** Margin between category sections (marginTop on CategorySection) */\n CATEGORY_MARGIN_LINES: 1,\n /** Minimum rows to show at least 1 category before enabling scroll */\n MIN_VIEWPORT_ROWS: 5,\n /** Minimum terminal height to show the wizard at all */\n MIN_TERMINAL_HEIGHT: 15,\n} as const;\n\nexport const DEFAULT_BRANDING = {\n NAME: \"Agents Inc.\",\n TAGLINE: \"AI-powered development tools\",\n} as const;\n\n/** Fallback name for the default public marketplace when marketplace.json is unavailable */\nexport const DEFAULT_PUBLIC_SOURCE_NAME = \"Agents Inc\";\n\nexport const CLI_COLORS = {\n PRIMARY: \"cyan\",\n SUCCESS: \"green\",\n ERROR: \"red\",\n WARNING: \"yellow\",\n INFO: \"blue\",\n NEUTRAL: \"gray\",\n FOCUS: \"cyan\",\n UNFOCUSED: \"white\",\n WHITE: \"white\",\n} as const;\n\n/** Default domains pre-selected when \"Start from scratch\" is chosen (all except CLI) */\nexport const DEFAULT_SCRATCH_DOMAINS: readonly Domain[] = [\"web\", \"api\", \"mobile\"];\n\nexport const ASCII_LOGO = ` █████╗ ██████╗ ███████╗███╗ ██╗████████╗███████╗ ██╗███╗ ██╗ ██████╗\n██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔════╝ ██║████╗ ██║██╔════╝\n███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ███████╗ ██║██╔██╗ ██║██║\n██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║ ██║██║╚██╗██║██║\n██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ███████║ ██║██║ ╚████║╚██████╗\n╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝`;\n\nexport const DEFAULT_PRESELECTED_SKILLS: readonly SkillId[] = [\n \"meta-methodology-anti-over-engineering\",\n \"meta-methodology-context-management\",\n \"meta-methodology-improvement-protocol\",\n \"meta-methodology-investigation-requirements\",\n \"meta-methodology-success-criteria\",\n \"meta-methodology-write-verification\",\n];\n"],"mappings":";;;;;;AAAA;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAG9B,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,KAAK,QAAQ,UAAU;AAIzC,IAAM,WAAW,UAAU,SAAS,OAAO;AAC3C,IAAM,WAAW,WAAW,KAAK,QAAQ,WAAW,IAAI,IAAI,KAAK,QAAQ,WAAW,OAAO;AACpF,IAAM,eAAe;AAErB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAE5B,IAAM,YAAY,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,mBAAmB;AAEvE,IAAM,eAAe;AAErB,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,2BAA2B;AAEjC,IAAM,OAAO;AAAA,EAClB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ;AAEO,IAAM,iBAAiB;AAAA,EAC5B,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,uBAAuB;AACzB;AAEO,IAAM,gBAAgB;AAAA,EAC3B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACV;AAEO,IAAM,kBAAkB;AAGxB,IAAM,0BAA0B;AAIvC,IAAM,oBAAoB;AAEnB,IAAM,eAAe;AAAA,EAC1B,OAAO,GAAG,iBAAiB;AAAA,EAC3B,UAAU,GAAG,iBAAiB;AAAA,EAC9B,aAAa,GAAG,iBAAiB;AAAA,EACjC,eAAe,GAAG,iBAAiB;AAAA,EACnC,qBAAqB,GAAG,iBAAiB;AAAA,EACzC,cAAc,GAAG,iBAAiB;AAAA,EAClC,QAAQ,GAAG,iBAAiB;AAC9B;AAGO,SAAS,kBAAkB,YAA4B;AAC5D,SAAO,mCAAmC,UAAU;AACtD;AAEO,IAAM,kBAAkB;AAAA,EAC7B,QAAQ;AAAA,EACR,YAAY;AAAA;AAAA,EAEZ,iBAAiB;AACnB;AAEO,IAAM,aAAa;AAAA,EACxB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AACf;AAEO,IAAM,YAAY;AAAA,EACvB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,2BAA2B;AAAA,EAC3B,6BAA6B;AAC/B;AAEO,IAAM,gBAAgB;AAAA,EAC3B,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AACb;AAEO,IAAM,wBAAwB;AAE9B,IAAM,qBAAqB;AAG3B,IAAM,oBAAoB;AAG1B,IAAM,+BAA+B;AAG5C,IAAM,SAAS,OAAO;AACf,IAAM,4BAA4B,KAAK;AACvC,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAEhC,IAAM,kBAAkB;AAAA;AAAA,EAE7B,yBAAyB;AAAA;AAAA,EAEzB,qBAAqB;AAAA;AAAA,EAErB,uBAAuB;AAAA;AAAA,EAEvB,mBAAmB;AAAA;AAAA,EAEnB,qBAAqB;AACvB;AAEO,IAAM,mBAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,SAAS;AACX;AAGO,IAAM,6BAA6B;AAEnC,IAAM,aAAa;AAAA,EACxB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,OAAO;AACT;AAGO,IAAM,0BAA6C,CAAC,OAAO,OAAO,QAAQ;AAE1E,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnB,IAAM,6BAAiD;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -1,21 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getSkillDisplayLabel
4
- } from "./chunk-FDY6SGSA.js";
4
+ } from "./chunk-KZNPPUQG.js";
5
5
  import {
6
6
  resolveAlias
7
- } from "./chunk-SYHRJG5G.js";
7
+ } from "./chunk-ZECXM7LP.js";
8
8
  import {
9
9
  typedEntries,
10
10
  typedKeys
11
11
  } from "./chunk-T4EXUIBY.js";
12
12
  import {
13
13
  warn
14
- } from "./chunk-UXNHU7Y7.js";
14
+ } from "./chunk-473YHDYQ.js";
15
15
  import {
16
16
  DEFAULT_PRESELECTED_SKILLS,
17
17
  DEFAULT_PUBLIC_SOURCE_NAME
18
- } from "./chunk-PP7NDFFE.js";
18
+ } from "./chunk-FVN5PFFY.js";
19
19
  import {
20
20
  init_esm_shims
21
21
  } from "./chunk-DHET7RCE.js";
@@ -54,8 +54,7 @@ var SOURCE_DISPLAY_NAMES = {
54
54
  function formatSourceLabel(source) {
55
55
  const displayName = SOURCE_DISPLAY_NAMES[source.name] ?? source.name;
56
56
  const prefix = source.installed ? "\u2713 " : "";
57
- const versionSuffix = source.version ? ` \xB7 v${source.version}` : "";
58
- return `${prefix}${displayName}${versionSuffix}`;
57
+ return `${prefix}${displayName}`;
59
58
  }
60
59
  function resolveSkillForPopulation(skillId, skills, categories) {
61
60
  const skill = skills[skillId];
@@ -370,7 +369,6 @@ var useWizardStore = create((set, get) => ({
370
369
  id: source.name,
371
370
  label: formatSourceLabel({
372
371
  name: source.name,
373
- version: source.version,
374
372
  installed: source.installed
375
373
  }),
376
374
  selected: selectedSource === source.name,
@@ -392,4 +390,4 @@ var useWizardStore = create((set, get) => ({
392
390
  export {
393
391
  useWizardStore
394
392
  };
395
- //# sourceMappingURL=chunk-XRA4LHTJ.js.map
393
+ //# sourceMappingURL=chunk-FYNMNY4P.js.map