@agents-inc/cli 0.45.0 → 0.46.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 (164) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/{chunk-NTPHCNJO.js → chunk-3WKFSTG6.js} +2 -2
  3. package/dist/{chunk-ELRGSZHZ.js → chunk-4C7PDDLY.js} +5 -5
  4. package/dist/{chunk-HKRLWERR.js → chunk-5M6JI76P.js} +2 -2
  5. package/dist/{chunk-473YHDYQ.js → chunk-5QRJUBK7.js} +131 -45
  6. package/dist/chunk-5QRJUBK7.js.map +1 -0
  7. package/dist/{chunk-KVHLKPYB.js → chunk-72GS6PIH.js} +7 -7
  8. package/dist/{chunk-FVN5PFFY.js → chunk-74HSA7C4.js} +3 -1
  9. package/dist/chunk-74HSA7C4.js.map +1 -0
  10. package/dist/chunk-7LDSHHKN.js +132 -0
  11. package/dist/chunk-7LDSHHKN.js.map +1 -0
  12. package/dist/{chunk-F3O5YHSI.js → chunk-C7BO2ASM.js} +2 -2
  13. package/dist/{chunk-ABE55TEU.js → chunk-CD64ZNYI.js} +2 -2
  14. package/dist/chunk-CDGHSTB6.js +69 -0
  15. package/dist/chunk-CDGHSTB6.js.map +1 -0
  16. package/dist/{chunk-Q5BSIARS.js → chunk-CTQHZELA.js} +15 -15
  17. package/dist/chunk-CTQHZELA.js.map +1 -0
  18. package/dist/{chunk-OALQWRLG.js → chunk-D7JTL3DJ.js} +2 -2
  19. package/dist/{chunk-KWWLPPHF.js → chunk-DO5OZHSS.js} +2 -2
  20. package/dist/{chunk-DAVOSI4M.js → chunk-FKBCYT7B.js} +5 -5
  21. package/dist/{chunk-VTDEENSP.js → chunk-FUEZQ2H6.js} +5 -5
  22. package/dist/{chunk-VTDEENSP.js.map → chunk-FUEZQ2H6.js.map} +1 -1
  23. package/dist/{chunk-V43QDMYQ.js → chunk-G2WNOT3R.js} +2 -2
  24. package/dist/{chunk-M3AGB4TR.js → chunk-GVLYNP2I.js} +4 -4
  25. package/dist/{chunk-WWSKP5SR.js → chunk-HM3DHMW7.js} +70 -24
  26. package/dist/chunk-HM3DHMW7.js.map +1 -0
  27. package/dist/{chunk-ENWMWIHP.js → chunk-I26YP2Q3.js} +5 -12
  28. package/dist/chunk-I26YP2Q3.js.map +1 -0
  29. package/dist/{chunk-KZNPPUQG.js → chunk-J64CA4V6.js} +5 -3
  30. package/dist/chunk-J64CA4V6.js.map +1 -0
  31. package/dist/{chunk-YQFU2KZ5.js → chunk-KWQ2BQXF.js} +3 -3
  32. package/dist/{chunk-SRFNNOLC.js → chunk-LFZXMQOH.js} +2 -2
  33. package/dist/{chunk-ARET3NYO.js → chunk-NMXNHRAK.js} +3 -3
  34. package/dist/{chunk-GUIRWCKI.js → chunk-ODQ2BKWU.js} +3 -3
  35. package/dist/{chunk-SYGEV3KV.js → chunk-PZLUO4OY.js} +4 -4
  36. package/dist/{chunk-CLHBKFHU.js → chunk-QBUOZVNZ.js} +2 -2
  37. package/dist/{chunk-ZECXM7LP.js → chunk-RT6IBH37.js} +3524 -3502
  38. package/dist/chunk-RT6IBH37.js.map +1 -0
  39. package/dist/{chunk-YRVTXSXP.js → chunk-RWR56UVK.js} +3 -18
  40. package/dist/chunk-RWR56UVK.js.map +1 -0
  41. package/dist/{chunk-OLZBZAW4.js → chunk-SGXUMZWL.js} +2 -2
  42. package/dist/{chunk-3S4GIO4B.js → chunk-TOWP4T5L.js} +2 -2
  43. package/dist/{chunk-FYNMNY4P.js → chunk-UK3AMBR7.js} +17 -11
  44. package/dist/chunk-UK3AMBR7.js.map +1 -0
  45. package/dist/{chunk-M2XPTQDT.js → chunk-VH3PI43B.js} +4 -4
  46. package/dist/{chunk-3JRWNWBF.js → chunk-XE6RTHUD.js} +2 -3
  47. package/dist/{chunk-3JRWNWBF.js.map → chunk-XE6RTHUD.js.map} +1 -1
  48. package/dist/{chunk-KCYNTAAF.js → chunk-YT7UHV67.js} +8 -8
  49. package/dist/{chunk-SBWMSNS2.js → chunk-YVMYQSED.js} +2 -2
  50. package/dist/commands/build/marketplace.js +12 -126
  51. package/dist/commands/build/marketplace.js.map +1 -1
  52. package/dist/commands/build/plugins.js +5 -5
  53. package/dist/commands/build/stack.js +5 -5
  54. package/dist/commands/compile.js +6 -6
  55. package/dist/commands/config/get.js +4 -4
  56. package/dist/commands/config/index.js +5 -5
  57. package/dist/commands/config/path.js +4 -4
  58. package/dist/commands/config/set-project.js +4 -4
  59. package/dist/commands/config/show.js +5 -5
  60. package/dist/commands/config/unset-project.js +4 -4
  61. package/dist/commands/diff.js +4 -4
  62. package/dist/commands/doctor.js +4 -4
  63. package/dist/commands/edit.js +29 -29
  64. package/dist/commands/eject.js +19 -23
  65. package/dist/commands/eject.js.map +1 -1
  66. package/dist/commands/import/skill.js +5 -5
  67. package/dist/commands/info.js +5 -5
  68. package/dist/commands/init.js +30 -29
  69. package/dist/commands/init.js.map +1 -1
  70. package/dist/commands/list.js +4 -4
  71. package/dist/commands/new/agent.js +52 -38
  72. package/dist/commands/new/agent.js.map +1 -1
  73. package/dist/commands/new/marketplace.js +252 -0
  74. package/dist/commands/new/marketplace.js.map +1 -0
  75. package/dist/commands/new/skill.js +30 -14
  76. package/dist/commands/new/skill.js.map +1 -1
  77. package/dist/commands/outdated.js +4 -4
  78. package/dist/commands/search.js +7 -7
  79. package/dist/commands/uninstall.js +6 -6
  80. package/dist/commands/update.js +6 -6
  81. package/dist/commands/validate.js +5 -5
  82. package/dist/components/skill-search/skill-search.js +3 -3
  83. package/dist/components/wizard/category-grid.js +2 -2
  84. package/dist/components/wizard/category-grid.test.js +2 -2
  85. package/dist/components/wizard/checkbox-grid.js +3 -3
  86. package/dist/components/wizard/checkbox-grid.test.js +3 -3
  87. package/dist/components/wizard/domain-selection.js +9 -8
  88. package/dist/components/wizard/help-modal.js +2 -2
  89. package/dist/components/wizard/menu-item.js +1 -1
  90. package/dist/components/wizard/search-modal.js +2 -2
  91. package/dist/components/wizard/search-modal.test.js +2 -2
  92. package/dist/components/wizard/section-progress.js +2 -2
  93. package/dist/components/wizard/section-progress.test.js +2 -2
  94. package/dist/components/wizard/selection-card.js +2 -2
  95. package/dist/components/wizard/source-grid.js +3 -3
  96. package/dist/components/wizard/source-grid.test.js +3 -3
  97. package/dist/components/wizard/stack-selection.js +8 -9
  98. package/dist/components/wizard/step-agents.js +8 -7
  99. package/dist/components/wizard/step-agents.test.js +25 -20
  100. package/dist/components/wizard/step-agents.test.js.map +1 -1
  101. package/dist/components/wizard/step-build.js +8 -8
  102. package/dist/components/wizard/step-build.test.js +10 -10
  103. package/dist/components/wizard/step-confirm.js +4 -4
  104. package/dist/components/wizard/step-confirm.test.js +8 -8
  105. package/dist/components/wizard/step-refine.js +2 -2
  106. package/dist/components/wizard/step-refine.test.js +2 -2
  107. package/dist/components/wizard/step-settings.js +5 -5
  108. package/dist/components/wizard/step-settings.test.js +8 -8
  109. package/dist/components/wizard/step-sources.js +10 -10
  110. package/dist/components/wizard/step-sources.test.js +11 -11
  111. package/dist/components/wizard/step-stack.js +12 -12
  112. package/dist/components/wizard/step-stack.test.js +27 -15
  113. package/dist/components/wizard/step-stack.test.js.map +1 -1
  114. package/dist/components/wizard/view-title.js +2 -2
  115. package/dist/components/wizard/wizard-layout.js +8 -8
  116. package/dist/components/wizard/wizard-tabs.js +2 -2
  117. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  118. package/dist/components/wizard/wizard.js +25 -25
  119. package/dist/hooks/init.js +3 -5
  120. package/dist/hooks/init.js.map +1 -1
  121. package/dist/{source-manager-HXFXBZJU.js → source-manager-6QZ2GDUA.js} +4 -4
  122. package/dist/stores/wizard-store.js +5 -5
  123. package/dist/stores/wizard-store.test.js +6 -6
  124. package/package.json +1 -1
  125. package/src/schemas/agent.schema.json +3 -0
  126. package/src/schemas/metadata.schema.json +4 -41
  127. package/src/schemas/project-config.schema.json +8 -4
  128. package/src/schemas/skills-matrix.schema.json +11 -298
  129. package/src/schemas/stacks.schema.json +2 -4
  130. package/dist/chunk-473YHDYQ.js.map +0 -1
  131. package/dist/chunk-5BDYODWP.js +0 -45
  132. package/dist/chunk-5BDYODWP.js.map +0 -1
  133. package/dist/chunk-ENWMWIHP.js.map +0 -1
  134. package/dist/chunk-FVN5PFFY.js.map +0 -1
  135. package/dist/chunk-FYNMNY4P.js.map +0 -1
  136. package/dist/chunk-KZNPPUQG.js.map +0 -1
  137. package/dist/chunk-Q5BSIARS.js.map +0 -1
  138. package/dist/chunk-WWSKP5SR.js.map +0 -1
  139. package/dist/chunk-YRVTXSXP.js.map +0 -1
  140. package/dist/chunk-ZECXM7LP.js.map +0 -1
  141. package/dist/cli/defaults/agent-mappings.yaml +0 -215
  142. /package/dist/{chunk-NTPHCNJO.js.map → chunk-3WKFSTG6.js.map} +0 -0
  143. /package/dist/{chunk-ELRGSZHZ.js.map → chunk-4C7PDDLY.js.map} +0 -0
  144. /package/dist/{chunk-HKRLWERR.js.map → chunk-5M6JI76P.js.map} +0 -0
  145. /package/dist/{chunk-KVHLKPYB.js.map → chunk-72GS6PIH.js.map} +0 -0
  146. /package/dist/{chunk-F3O5YHSI.js.map → chunk-C7BO2ASM.js.map} +0 -0
  147. /package/dist/{chunk-ABE55TEU.js.map → chunk-CD64ZNYI.js.map} +0 -0
  148. /package/dist/{chunk-OALQWRLG.js.map → chunk-D7JTL3DJ.js.map} +0 -0
  149. /package/dist/{chunk-KWWLPPHF.js.map → chunk-DO5OZHSS.js.map} +0 -0
  150. /package/dist/{chunk-DAVOSI4M.js.map → chunk-FKBCYT7B.js.map} +0 -0
  151. /package/dist/{chunk-V43QDMYQ.js.map → chunk-G2WNOT3R.js.map} +0 -0
  152. /package/dist/{chunk-M3AGB4TR.js.map → chunk-GVLYNP2I.js.map} +0 -0
  153. /package/dist/{chunk-YQFU2KZ5.js.map → chunk-KWQ2BQXF.js.map} +0 -0
  154. /package/dist/{chunk-SRFNNOLC.js.map → chunk-LFZXMQOH.js.map} +0 -0
  155. /package/dist/{chunk-ARET3NYO.js.map → chunk-NMXNHRAK.js.map} +0 -0
  156. /package/dist/{chunk-GUIRWCKI.js.map → chunk-ODQ2BKWU.js.map} +0 -0
  157. /package/dist/{chunk-SYGEV3KV.js.map → chunk-PZLUO4OY.js.map} +0 -0
  158. /package/dist/{chunk-CLHBKFHU.js.map → chunk-QBUOZVNZ.js.map} +0 -0
  159. /package/dist/{chunk-OLZBZAW4.js.map → chunk-SGXUMZWL.js.map} +0 -0
  160. /package/dist/{chunk-3S4GIO4B.js.map → chunk-TOWP4T5L.js.map} +0 -0
  161. /package/dist/{chunk-M2XPTQDT.js.map → chunk-VH3PI43B.js.map} +0 -0
  162. /package/dist/{chunk-KCYNTAAF.js.map → chunk-YT7UHV67.js.map} +0 -0
  163. /package/dist/{chunk-SBWMSNS2.js.map → chunk-YVMYQSED.js.map} +0 -0
  164. /package/dist/{source-manager-HXFXBZJU.js.map → source-manager-6QZ2GDUA.js.map} +0 -0
@@ -102,6 +102,7 @@ var GITHUB_SOURCE = {
102
102
  GH_PREFIX: "gh:"
103
103
  };
104
104
  var DEFAULT_SKILLS_SUBDIR = "skills";
105
+ var KEBAB_CASE_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
105
106
  var HASH_PREFIX_LENGTH = 7;
106
107
  var CACHE_HASH_LENGTH = 16;
107
108
  var CACHE_READABLE_PREFIX_LENGTH = 32;
@@ -182,6 +183,7 @@ export {
182
183
  UI_LAYOUT,
183
184
  GITHUB_SOURCE,
184
185
  DEFAULT_SKILLS_SUBDIR,
186
+ KEBAB_CASE_PATTERN,
185
187
  HASH_PREFIX_LENGTH,
186
188
  CACHE_HASH_LENGTH,
187
189
  CACHE_READABLE_PREFIX_LENGTH,
@@ -198,4 +200,4 @@ export {
198
200
  ASCII_LOGO,
199
201
  DEFAULT_PRESELECTED_SKILLS
200
202
  };
201
- //# sourceMappingURL=chunk-FVN5PFFY.js.map
203
+ //# sourceMappingURL=chunk-74HSA7C4.js.map
@@ -0,0 +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\n/** Strict kebab-case: starts with letter, segments separated by single hyphens, no trailing hyphens */\nexport const KEBAB_CASE_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\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;AAG9B,IAAM,qBAAqB;AAE3B,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":[]}
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ensureDir,
4
+ getErrorMessage,
5
+ glob,
6
+ pluginManifestSchema,
7
+ readFileSafe,
8
+ verbose,
9
+ warn,
10
+ writeFile
11
+ } from "./chunk-5QRJUBK7.js";
12
+ import {
13
+ MAX_PLUGIN_FILE_SIZE
14
+ } from "./chunk-74HSA7C4.js";
15
+ import {
16
+ init_esm_shims
17
+ } from "./chunk-DHET7RCE.js";
18
+
19
+ // src/cli/lib/marketplace-generator.ts
20
+ init_esm_shims();
21
+ import path from "path";
22
+ import { sortBy } from "remeda";
23
+ var PLUGIN_MANIFEST_PATH = ".claude-plugin/plugin.json";
24
+ var MARKETPLACE_SCHEMA_URL = "https://anthropic.com/claude-code/marketplace.schema.json";
25
+ var CATEGORY_PATTERNS = [
26
+ { pattern: /^web-/, category: "web" },
27
+ { pattern: /^api-/, category: "api" },
28
+ { pattern: /^cli-/, category: "cli" },
29
+ { pattern: /^meta-/, category: "methodology" },
30
+ { pattern: /^infra-/, category: "infra" },
31
+ { pattern: /^mobile-/, category: "mobile" },
32
+ { pattern: /^security-/, category: "security" }
33
+ ];
34
+ function inferCategoryFromPluginName(pluginName) {
35
+ for (const { pattern, category } of CATEGORY_PATTERNS) {
36
+ if (pattern.test(pluginName)) {
37
+ return category;
38
+ }
39
+ }
40
+ return void 0;
41
+ }
42
+ async function readPluginManifest(pluginDir) {
43
+ const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST_PATH);
44
+ try {
45
+ const content = await readFileSafe(manifestPath, MAX_PLUGIN_FILE_SIZE);
46
+ return pluginManifestSchema.parse(JSON.parse(content));
47
+ } catch (error) {
48
+ verbose(`Failed to read plugin manifest at '${manifestPath}': ${getErrorMessage(error)}`);
49
+ return null;
50
+ }
51
+ }
52
+ function convertManifestToMarketplacePlugin(manifest, pluginRoot, pluginDirName) {
53
+ const category = inferCategoryFromPluginName(manifest.name);
54
+ const plugin = {
55
+ name: manifest.name,
56
+ source: `./${pluginRoot}/${pluginDirName}`,
57
+ description: manifest.description,
58
+ version: manifest.version,
59
+ author: manifest.author,
60
+ keywords: manifest.keywords
61
+ };
62
+ if (category) {
63
+ plugin.category = category;
64
+ }
65
+ return plugin;
66
+ }
67
+ async function generateMarketplace(pluginsDir, options) {
68
+ verbose(`Scanning plugins directory: ${pluginsDir}`);
69
+ const manifestFiles = await glob(`**/${PLUGIN_MANIFEST_PATH}`, pluginsDir);
70
+ verbose(`Found ${manifestFiles.length} plugin manifests`);
71
+ const plugins = [];
72
+ for (const manifestFile of manifestFiles) {
73
+ const pluginDirName = manifestFile.split("/")[0];
74
+ const pluginDir = path.join(pluginsDir, pluginDirName);
75
+ const manifest = await readPluginManifest(pluginDir);
76
+ if (!manifest) {
77
+ warn(`Could not read plugin manifest: '${manifestFile}'`);
78
+ continue;
79
+ }
80
+ const plugin = convertManifestToMarketplacePlugin(
81
+ manifest,
82
+ options.pluginRoot.replace(/^\.\//, ""),
83
+ pluginDirName
84
+ );
85
+ plugins.push(plugin);
86
+ verbose(` [OK] ${plugin.name}`);
87
+ }
88
+ const sortedPlugins = sortBy(plugins, (p) => p.name);
89
+ const marketplace = {
90
+ $schema: MARKETPLACE_SCHEMA_URL,
91
+ name: options.name,
92
+ version: options.version ?? "1.0.0",
93
+ owner: {
94
+ name: options.ownerName
95
+ },
96
+ metadata: {
97
+ pluginRoot: options.pluginRoot
98
+ },
99
+ plugins: sortedPlugins
100
+ };
101
+ if (options.description) {
102
+ marketplace.description = options.description;
103
+ }
104
+ if (options.ownerEmail) {
105
+ marketplace.owner.email = options.ownerEmail;
106
+ }
107
+ return marketplace;
108
+ }
109
+ async function writeMarketplace(outputPath, marketplace) {
110
+ await ensureDir(path.dirname(outputPath));
111
+ const content = `${JSON.stringify(marketplace, null, 2)}
112
+ `;
113
+ await writeFile(outputPath, content);
114
+ }
115
+ function getMarketplaceStats(marketplace) {
116
+ const byCategory = {};
117
+ for (const plugin of marketplace.plugins) {
118
+ const category = plugin.category ?? "uncategorized";
119
+ byCategory[category] = (byCategory[category] ?? 0) + 1;
120
+ }
121
+ return {
122
+ total: marketplace.plugins.length,
123
+ byCategory
124
+ };
125
+ }
126
+
127
+ export {
128
+ generateMarketplace,
129
+ writeMarketplace,
130
+ getMarketplaceStats
131
+ };
132
+ //# sourceMappingURL=chunk-7LDSHHKN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/marketplace-generator.ts"],"sourcesContent":["import path from \"path\";\nimport { sortBy } from \"remeda\";\n\nimport { MAX_PLUGIN_FILE_SIZE } from \"../consts\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { readFileSafe, writeFile, glob, ensureDir } from \"../utils/fs\";\nimport { verbose, warn } from \"../utils/logger\";\nimport type { Marketplace, MarketplacePlugin, PluginManifest } from \"../types\";\nimport { pluginManifestSchema } from \"./schemas\";\n\nconst PLUGIN_MANIFEST_PATH = \".claude-plugin/plugin.json\";\nconst MARKETPLACE_SCHEMA_URL = \"https://anthropic.com/claude-code/marketplace.schema.json\";\n\n/**\n * Category patterns for marketplace plugins.\n *\n * Plugin names match skill IDs directly (e.g., \"web-framework-react\").\n * The category is the first segment of the ID:\n * - web-* -> web\n * - api-* -> api\n * - cli-* -> cli\n * - meta-* -> methodology\n * - infra-* -> infra\n * - mobile-* -> mobile\n * - security-* -> security\n */\nconst CATEGORY_PATTERNS: Array<{ pattern: RegExp; category: string }> = [\n { pattern: /^web-/, category: \"web\" },\n { pattern: /^api-/, category: \"api\" },\n { pattern: /^cli-/, category: \"cli\" },\n { pattern: /^meta-/, category: \"methodology\" },\n { pattern: /^infra-/, category: \"infra\" },\n { pattern: /^mobile-/, category: \"mobile\" },\n { pattern: /^security-/, category: \"security\" },\n];\n\ntype MarketplaceOptions = {\n name: string;\n version?: string;\n description?: string;\n ownerName: string;\n ownerEmail?: string;\n pluginRoot: string;\n};\n\nfunction inferCategoryFromPluginName(pluginName: string): string | undefined {\n for (const { pattern, category } of CATEGORY_PATTERNS) {\n if (pattern.test(pluginName)) {\n return category;\n }\n }\n return undefined;\n}\n\nasync function readPluginManifest(pluginDir: string): Promise<PluginManifest | null> {\n const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST_PATH);\n\n try {\n const content = await readFileSafe(manifestPath, MAX_PLUGIN_FILE_SIZE);\n return pluginManifestSchema.parse(JSON.parse(content));\n } catch (error) {\n verbose(`Failed to read plugin manifest at '${manifestPath}': ${getErrorMessage(error)}`);\n return null;\n }\n}\n\nfunction convertManifestToMarketplacePlugin(\n manifest: PluginManifest,\n pluginRoot: string,\n pluginDirName: string,\n): MarketplacePlugin {\n const category = inferCategoryFromPluginName(manifest.name);\n\n const plugin: MarketplacePlugin = {\n name: manifest.name,\n source: `./${pluginRoot}/${pluginDirName}`,\n description: manifest.description,\n version: manifest.version,\n author: manifest.author,\n keywords: manifest.keywords,\n };\n\n if (category) {\n plugin.category = category;\n }\n\n return plugin;\n}\n\nexport async function generateMarketplace(\n pluginsDir: string,\n options: MarketplaceOptions,\n): Promise<Marketplace> {\n verbose(`Scanning plugins directory: ${pluginsDir}`);\n\n const manifestFiles = await glob(`**/${PLUGIN_MANIFEST_PATH}`, pluginsDir);\n verbose(`Found ${manifestFiles.length} plugin manifests`);\n\n const plugins: MarketplacePlugin[] = [];\n\n for (const manifestFile of manifestFiles) {\n const pluginDirName = manifestFile.split(\"/\")[0];\n const pluginDir = path.join(pluginsDir, pluginDirName);\n\n const manifest = await readPluginManifest(pluginDir);\n if (!manifest) {\n warn(`Could not read plugin manifest: '${manifestFile}'`);\n continue;\n }\n\n const plugin = convertManifestToMarketplacePlugin(\n manifest,\n options.pluginRoot.replace(/^\\.\\//, \"\"),\n pluginDirName,\n );\n plugins.push(plugin);\n verbose(` [OK] ${plugin.name}`);\n }\n\n const sortedPlugins = sortBy(plugins, (p) => p.name);\n\n const marketplace: Marketplace = {\n $schema: MARKETPLACE_SCHEMA_URL,\n name: options.name,\n version: options.version ?? \"1.0.0\",\n owner: {\n name: options.ownerName,\n },\n metadata: {\n pluginRoot: options.pluginRoot,\n },\n plugins: sortedPlugins,\n };\n\n if (options.description) {\n marketplace.description = options.description;\n }\n\n if (options.ownerEmail) {\n marketplace.owner.email = options.ownerEmail;\n }\n\n return marketplace;\n}\n\nexport async function writeMarketplace(\n outputPath: string,\n marketplace: Marketplace,\n): Promise<void> {\n await ensureDir(path.dirname(outputPath));\n const content = `${JSON.stringify(marketplace, null, 2)}\\n`;\n await writeFile(outputPath, content);\n}\n\nexport function getMarketplaceStats(marketplace: Marketplace): {\n total: number;\n byCategory: Record<string, number>;\n} {\n const byCategory: Record<string, number> = {};\n\n for (const plugin of marketplace.plugins) {\n const category = plugin.category ?? \"uncategorized\";\n byCategory[category] = (byCategory[category] ?? 0) + 1;\n }\n\n return {\n total: marketplace.plugins.length,\n byCategory,\n };\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-KUV24B5M.js";
5
5
  import {
6
6
  CLI_COLORS
7
- } from "./chunk-FVN5PFFY.js";
7
+ } from "./chunk-74HSA7C4.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-DHET7RCE.js";
@@ -87,4 +87,4 @@ var SearchModal = ({ results, alias, onBind, onClose }) => {
87
87
  export {
88
88
  SearchModal
89
89
  };
90
- //# sourceMappingURL=chunk-F3O5YHSI.js.map
90
+ //# sourceMappingURL=chunk-C7BO2ASM.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  CLI_COLORS,
7
7
  SCROLL_VIEWPORT
8
- } from "./chunk-FVN5PFFY.js";
8
+ } from "./chunk-74HSA7C4.js";
9
9
  import {
10
10
  init_esm_shims
11
11
  } from "./chunk-DHET7RCE.js";
@@ -373,4 +373,4 @@ var CategoryGrid = ({
373
373
  export {
374
374
  CategoryGrid
375
375
  };
376
- //# sourceMappingURL=chunk-ABE55TEU.js.map
376
+ //# sourceMappingURL=chunk-CD64ZNYI.js.map
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getDomainDisplayName
4
+ } from "./chunk-RWR56UVK.js";
5
+ import {
6
+ CheckboxGrid
7
+ } from "./chunk-ODQ2BKWU.js";
8
+ import {
9
+ useWizardStore
10
+ } from "./chunk-UK3AMBR7.js";
11
+ import {
12
+ typedEntries
13
+ } from "./chunk-T4EXUIBY.js";
14
+ import {
15
+ init_esm_shims
16
+ } from "./chunk-DHET7RCE.js";
17
+
18
+ // src/cli/components/wizard/domain-selection.tsx
19
+ init_esm_shims();
20
+ import { useMemo } from "react";
21
+ import { unique } from "remeda";
22
+ import { jsx } from "react/jsx-runtime";
23
+ var BUILT_IN_DOMAIN_DESCRIPTIONS = {
24
+ web: "Frontend web applications",
25
+ api: "Backend APIs and services",
26
+ cli: "Command-line tools",
27
+ mobile: "Mobile applications",
28
+ shared: "Shared utilities and methodology"
29
+ };
30
+ var BUILT_IN_DOMAIN_ORDER = ["web", "api", "cli", "mobile"];
31
+ var DomainSelection = ({ matrix }) => {
32
+ const { selectedDomains, toggleDomain, setStep, setApproach, selectStack } = useWizardStore();
33
+ const availableDomains = useMemo(() => {
34
+ const matrixDomains = unique(
35
+ typedEntries(matrix.categories).map(([, cat]) => cat?.domain).filter((d) => d != null && d !== "shared")
36
+ );
37
+ const ordered = [
38
+ ...BUILT_IN_DOMAIN_ORDER.filter((d) => matrixDomains.includes(d)),
39
+ ...matrixDomains.filter((d) => !BUILT_IN_DOMAIN_ORDER.includes(d))
40
+ ];
41
+ return ordered.map((domain) => ({
42
+ id: domain,
43
+ label: getDomainDisplayName(domain),
44
+ description: BUILT_IN_DOMAIN_DESCRIPTIONS[domain] ?? `${getDomainDisplayName(domain)} skills`
45
+ }));
46
+ }, [matrix]);
47
+ const handleBack = () => {
48
+ setApproach(null);
49
+ selectStack(null);
50
+ };
51
+ return /* @__PURE__ */ jsx(
52
+ CheckboxGrid,
53
+ {
54
+ title: "Select domains to configure",
55
+ items: availableDomains,
56
+ selectedIds: selectedDomains,
57
+ onToggle: toggleDomain,
58
+ onContinue: () => setStep("build"),
59
+ onBack: handleBack,
60
+ continueLabel: (count) => `Continue with ${count} domain(s)`,
61
+ emptyMessage: "Please select at least one domain"
62
+ }
63
+ );
64
+ };
65
+
66
+ export {
67
+ DomainSelection
68
+ };
69
+ //# sourceMappingURL=chunk-CDGHSTB6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/domain-selection.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { unique } from \"remeda\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { Domain, MergedSkillsMatrix } from \"../../types/index.js\";\nimport { typedEntries } from \"../../utils/typed-object.js\";\nimport { CheckboxGrid, type CheckboxItem } from \"./checkbox-grid.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\n\nconst BUILT_IN_DOMAIN_DESCRIPTIONS: Record<Domain, string> = {\n web: \"Frontend web applications\",\n api: \"Backend APIs and services\",\n cli: \"Command-line tools\",\n mobile: \"Mobile applications\",\n shared: \"Shared utilities and methodology\",\n};\n\n/** Built-in domain display order. Custom domains appear after these. */\nconst BUILT_IN_DOMAIN_ORDER: Domain[] = [\"web\", \"api\", \"cli\", \"mobile\"];\n\ntype DomainSelectionProps = {\n matrix: MergedSkillsMatrix;\n};\n\nexport const DomainSelection: React.FC<DomainSelectionProps> = ({ matrix }) => {\n const { selectedDomains, toggleDomain, setStep, setApproach, selectStack } = useWizardStore();\n\n const availableDomains = useMemo((): CheckboxItem<Domain>[] => {\n const matrixDomains = unique(\n typedEntries(matrix.categories)\n .map(([, cat]) => cat?.domain)\n .filter((d): d is Domain => d != null && d !== \"shared\"),\n );\n\n const ordered: Domain[] = [\n ...BUILT_IN_DOMAIN_ORDER.filter((d) => matrixDomains.includes(d)),\n ...matrixDomains.filter((d) => !BUILT_IN_DOMAIN_ORDER.includes(d)),\n ];\n\n return ordered.map((domain) => ({\n id: domain,\n label: getDomainDisplayName(domain),\n description: BUILT_IN_DOMAIN_DESCRIPTIONS[domain] ?? `${getDomainDisplayName(domain)} skills`,\n }));\n }, [matrix]);\n\n const handleBack = () => {\n setApproach(null);\n selectStack(null);\n };\n\n return (\n <CheckboxGrid\n title=\"Select domains to configure\"\n // subtitle=\"Select one or more domains, then continue\"\n items={availableDomains}\n selectedIds={selectedDomains}\n onToggle={toggleDomain}\n onContinue={() => setStep(\"build\")}\n onBack={handleBack}\n continueLabel={(count) => `Continue with ${count} domain(s)`}\n emptyMessage=\"Please select at least one domain\"\n />\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,eAAe;AAC/B,SAAS,cAAc;AAkDnB;AA3CJ,IAAM,+BAAuD;AAAA,EAC3D,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AACV;AAGA,IAAM,wBAAkC,CAAC,OAAO,OAAO,OAAO,QAAQ;AAM/D,IAAM,kBAAkD,CAAC,EAAE,OAAO,MAAM;AAC7E,QAAM,EAAE,iBAAiB,cAAc,SAAS,aAAa,YAAY,IAAI,eAAe;AAE5F,QAAM,mBAAmB,QAAQ,MAA8B;AAC7D,UAAM,gBAAgB;AAAA,MACpB,aAAa,OAAO,UAAU,EAC3B,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,KAAK,MAAM,EAC5B,OAAO,CAAC,MAAmB,KAAK,QAAQ,MAAM,QAAQ;AAAA,IAC3D;AAEA,UAAM,UAAoB;AAAA,MACxB,GAAG,sBAAsB,OAAO,CAAC,MAAM,cAAc,SAAS,CAAC,CAAC;AAAA,MAChE,GAAG,cAAc,OAAO,CAAC,MAAM,CAAC,sBAAsB,SAAS,CAAC,CAAC;AAAA,IACnE;AAEA,WAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC9B,IAAI;AAAA,MACJ,OAAO,qBAAqB,MAAM;AAAA,MAClC,aAAa,6BAA6B,MAAM,KAAK,GAAG,qBAAqB,MAAM,CAAC;AAAA,IACtF,EAAE;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,aAAa,MAAM;AACvB,gBAAY,IAAI;AAChB,gBAAY,IAAI;AAAA,EAClB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MAEN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY,MAAM,QAAQ,OAAO;AAAA,MACjC,QAAQ;AAAA,MACR,eAAe,CAAC,UAAU,iBAAiB,KAAK;AAAA,MAChD,cAAa;AAAA;AAAA,EACf;AAEJ;","names":[]}
@@ -1,44 +1,44 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  WizardLayout
4
- } from "./chunk-DAVOSI4M.js";
4
+ } from "./chunk-FKBCYT7B.js";
5
5
  import {
6
6
  StepSettings
7
- } from "./chunk-ELRGSZHZ.js";
7
+ } from "./chunk-4C7PDDLY.js";
8
8
  import {
9
9
  StepSources
10
- } from "./chunk-KVHLKPYB.js";
10
+ } from "./chunk-72GS6PIH.js";
11
11
  import {
12
12
  StepStack
13
- } from "./chunk-VTDEENSP.js";
13
+ } from "./chunk-FUEZQ2H6.js";
14
14
  import {
15
15
  StepAgents
16
- } from "./chunk-WWSKP5SR.js";
16
+ } from "./chunk-HM3DHMW7.js";
17
17
  import {
18
18
  StepBuild
19
- } from "./chunk-KCYNTAAF.js";
19
+ } from "./chunk-YT7UHV67.js";
20
20
  import {
21
21
  StepConfirm
22
- } from "./chunk-M3AGB4TR.js";
22
+ } from "./chunk-GVLYNP2I.js";
23
23
  import {
24
24
  getStackName
25
- } from "./chunk-YRVTXSXP.js";
25
+ } from "./chunk-RWR56UVK.js";
26
26
  import {
27
27
  cliTheme
28
- } from "./chunk-HKRLWERR.js";
28
+ } from "./chunk-5M6JI76P.js";
29
29
  import {
30
30
  useWizardStore
31
- } from "./chunk-FYNMNY4P.js";
31
+ } from "./chunk-UK3AMBR7.js";
32
32
  import {
33
33
  resolveAlias,
34
34
  validateSelection
35
- } from "./chunk-ZECXM7LP.js";
35
+ } from "./chunk-RT6IBH37.js";
36
36
  import {
37
37
  warn
38
- } from "./chunk-473YHDYQ.js";
38
+ } from "./chunk-5QRJUBK7.js";
39
39
  import {
40
40
  CLI_COLORS
41
- } from "./chunk-FVN5PFFY.js";
41
+ } from "./chunk-74HSA7C4.js";
42
42
  import {
43
43
  init_esm_shims
44
44
  } from "./chunk-DHET7RCE.js";
@@ -286,7 +286,7 @@ var Wizard = ({
286
286
  );
287
287
  }
288
288
  case "agents":
289
- return /* @__PURE__ */ jsx(StepAgents, {});
289
+ return /* @__PURE__ */ jsx(StepAgents, { matrix });
290
290
  case "confirm": {
291
291
  const stackName = getStackName(store.selectedStackId, matrix);
292
292
  const technologyCount = store.getTechnologyCount();
@@ -323,4 +323,4 @@ var Wizard = ({
323
323
  export {
324
324
  Wizard
325
325
  };
326
- //# sourceMappingURL=chunk-Q5BSIARS.js.map
326
+ //# sourceMappingURL=chunk-CTQHZELA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard.tsx","../src/cli/components/hooks/use-wizard-initialization.ts","../src/cli/components/hooks/use-build-step-props.ts"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text, useApp, useInput, useStdout } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { cliTheme } from \"../themes/default.js\";\nimport { WizardLayout } from \"./wizard-layout.js\";\nimport { StepStack } from \"./step-stack.js\";\nimport { StepBuild } from \"./step-build.js\";\nimport { StepConfirm } from \"./step-confirm.js\";\nimport { StepSources } from \"./step-sources.js\";\nimport { StepSettings } from \"./step-settings.js\";\nimport { StepAgents } from \"./step-agents.js\";\nimport { resolveAlias, validateSelection } from \"../../lib/matrix/index.js\";\nimport type {\n AgentName,\n Domain,\n DomainSelections,\n MergedSkillsMatrix,\n SkillId,\n} from \"../../types/index.js\";\nimport { getStackName } from \"./utils.js\";\nimport { warn } from \"../../utils/logger.js\";\nimport { useWizardInitialization } from \"../hooks/use-wizard-initialization.js\";\nimport { useBuildStepProps } from \"../hooks/use-build-step-props.js\";\n\nexport type WizardResultV2 = {\n selectedSkills: SkillId[];\n selectedAgents: AgentName[];\n selectedStackId: string | null;\n domainSelections: DomainSelections;\n selectedDomains: Domain[];\n sourceSelections: Partial<Record<SkillId, string>>;\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n cancelled: boolean;\n validation: {\n valid: boolean;\n errors: Array<{ message: string }>;\n warnings: Array<{ message: string }>;\n };\n};\n\ntype WizardProps = {\n matrix: MergedSkillsMatrix;\n onComplete: (result: WizardResultV2) => void;\n onCancel: () => void;\n version?: string;\n marketplaceLabel?: string;\n logo?: string;\n initialStep?: WizardStep;\n initialInstallMode?: \"plugin\" | \"local\";\n initialExpertMode?: boolean;\n initialDomains?: Domain[];\n initialAgents?: AgentName[];\n installedSkillIds?: SkillId[];\n projectDir?: string;\n};\n\nconst MIN_TERMINAL_WIDTH = 80;\nconst MIN_TERMINAL_HEIGHT = 15;\n\nexport const Wizard: React.FC<WizardProps> = ({\n matrix,\n onComplete,\n onCancel,\n version,\n marketplaceLabel,\n logo,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n initialDomains,\n initialAgents,\n installedSkillIds,\n projectDir,\n}) => {\n const store = useWizardStore();\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;\n const terminalHeight = stdout.rows || MIN_TERMINAL_HEIGHT;\n const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;\n const isShortTerminal = terminalHeight < MIN_TERMINAL_HEIGHT;\n\n useWizardInitialization({\n matrix,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n initialDomains,\n initialAgents,\n installedSkillIds,\n });\n\n const buildStepProps = useBuildStepProps({ store, matrix, installedSkillIds });\n\n useInput((input, key) => {\n // ESC is handled by step-settings.tsx's own useKeyboardNavigation hook\n if (store.showSettings) {\n if (input === \"g\" || input === \"G\") {\n store.toggleSettings();\n }\n return;\n }\n\n if (store.showHelp) {\n if (key.escape || input === \"?\") {\n store.toggleHelp();\n }\n return;\n }\n\n if (input === \"?\") {\n store.toggleHelp();\n return;\n }\n\n if (key.escape) {\n // At the initial stack/scratch selection (approach not yet set), ESC cancels the wizard.\n // StackSelection handles its own ESC via the onCancel prop.\n // Other steps that don't have their own escape handler use goBack.\n if (\n store.step !== \"build\" &&\n store.step !== \"confirm\" &&\n store.step !== \"sources\" &&\n store.step !== \"agents\" &&\n store.step !== \"stack\"\n ) {\n store.goBack();\n }\n return;\n }\n\n if ((input === \"a\" || input === \"A\") && store.step === \"build\" && store.selectedStackId) {\n store.setStackAction(\"defaults\");\n store.setStep(\"confirm\");\n return;\n }\n\n if ((input === \"g\" || input === \"G\") && store.step === \"sources\") {\n store.toggleSettings();\n return;\n }\n\n if (input === \"e\" || input === \"E\") {\n store.toggleExpertMode();\n return;\n }\n if (input === \"p\" || input === \"P\") {\n store.toggleInstallMode();\n }\n });\n\n const handleComplete = useCallback(() => {\n let allSkills: SkillId[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = matrix.suggestedStacks.find((s) => s.id === store.selectedStackId);\n if (!stack) {\n warn(`Stack not found in matrix: '${store.selectedStackId}'`);\n }\n allSkills = [...(stack?.allSkillIds || [])];\n } else {\n const techNames = store.getAllSelectedTechnologies();\n allSkills = techNames.map((tech) => {\n const resolved = resolveAlias(tech, matrix);\n if (!matrix.skills[resolved]) {\n warn(\n `Technology '${tech}' could not be resolved to a skill ID - it may be missing from skill_aliases`,\n );\n }\n return resolved;\n });\n }\n\n const methodologySkills = store.getDefaultMethodologySkills();\n for (const skill of methodologySkills) {\n if (!allSkills.includes(skill)) {\n allSkills.push(skill);\n }\n }\n\n const validation = validateSelection(allSkills, matrix);\n\n const result: WizardResultV2 = {\n selectedSkills: allSkills,\n selectedAgents: store.selectedAgents,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n selectedDomains: store.selectedDomains,\n sourceSelections: store.sourceSelections,\n expertMode: store.expertMode,\n installMode: store.installMode,\n cancelled: false,\n validation,\n };\n\n onComplete(result);\n exit();\n }, [store, matrix, onComplete, exit]);\n\n const handleCancel = useCallback(() => {\n onCancel();\n exit();\n }, [onCancel, exit]);\n\n const renderStep = () => {\n switch (store.step) {\n case \"stack\":\n return <StepStack matrix={matrix} onCancel={handleCancel} />;\n\n case \"build\":\n return <StepBuild {...buildStepProps} />;\n\n case \"sources\": {\n if (store.showSettings) {\n return (\n <StepSettings\n projectDir={projectDir || process.cwd()}\n onClose={() => store.toggleSettings()}\n />\n );\n }\n return (\n <StepSources\n matrix={matrix}\n projectDir={projectDir}\n onContinue={() => {\n if (!initialAgents?.length) {\n store.preselectAgentsFromDomains();\n }\n store.setStep(\"agents\");\n }}\n onBack={store.goBack}\n />\n );\n }\n\n case \"agents\":\n return <StepAgents matrix={matrix} />;\n\n case \"confirm\": {\n const stackName = getStackName(store.selectedStackId, matrix);\n const technologyCount = store.getTechnologyCount();\n return (\n <StepConfirm\n onComplete={handleComplete}\n stackName={stackName}\n selectedDomains={store.selectedDomains}\n domainSelections={store.domainSelections}\n technologyCount={technologyCount}\n skillCount={technologyCount}\n agentCount={store.selectedAgents.length}\n installMode={store.installMode}\n onBack={store.goBack}\n />\n );\n }\n\n default:\n return null;\n }\n };\n\n if (isNarrowTerminal || isShortTerminal) {\n const issue = isNarrowTerminal\n ? `too narrow (${terminalWidth} columns, need ${MIN_TERMINAL_WIDTH})`\n : `too short (${terminalHeight} rows, need ${MIN_TERMINAL_HEIGHT})`;\n\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\" padding={1}>\n <Text color={CLI_COLORS.WARNING}>Terminal {issue}. Please resize your terminal.</Text>\n </Box>\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={cliTheme}>\n <WizardLayout version={version} marketplaceLabel={marketplaceLabel} logo={logo}>\n {renderStep()}\n </WizardLayout>\n </ThemeProvider>\n );\n};\n","import { useRef } from \"react\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport type { AgentName, Domain, MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\n\ntype UseWizardInitializationOptions = {\n matrix: MergedSkillsMatrix;\n initialStep?: WizardStep;\n initialInstallMode?: \"plugin\" | \"local\";\n initialExpertMode?: boolean;\n initialDomains?: Domain[];\n initialAgents?: AgentName[];\n installedSkillIds?: SkillId[];\n};\n\n/**\n * Runs one-time wizard store initialization before the first render.\n * Populates step, approach, install mode, and skill selections from props.\n */\nexport function useWizardInitialization({\n matrix,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n initialDomains,\n initialAgents,\n installedSkillIds,\n}: UseWizardInitializationOptions): void {\n const initialized = useRef(false);\n\n if (!initialized.current) {\n initialized.current = true;\n\n if (initialStep) {\n if (installedSkillIds?.length) {\n useWizardStore\n .getState()\n .populateFromSkillIds(installedSkillIds, matrix.skills, matrix.categories);\n }\n useWizardStore.setState({ step: initialStep, approach: \"scratch\" });\n }\n if (initialInstallMode) {\n useWizardStore.setState({ installMode: initialInstallMode });\n }\n if (initialExpertMode) {\n useWizardStore.setState({ expertMode: initialExpertMode });\n }\n // Restore saved domains from config, overriding the domains\n // derived by populateFromSkillIds\n if (initialDomains?.length) {\n useWizardStore.setState({ selectedDomains: initialDomains });\n }\n // Restore saved agents from config, overriding the default empty array\n if (initialAgents?.length) {\n useWizardStore.setState({ selectedAgents: initialAgents });\n }\n }\n}\n","import { useCallback } from \"react\";\nimport type { Domain, MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\nimport type { WizardState } from \"../../stores/wizard-store.js\";\nimport type { StepBuildProps } from \"../wizard/step-build.js\";\n\ntype UseBuildStepPropsOptions = {\n store: WizardState;\n matrix: MergedSkillsMatrix;\n installedSkillIds?: SkillId[];\n};\n\nexport function useBuildStepProps({\n store,\n matrix,\n installedSkillIds,\n}: UseBuildStepPropsOptions): StepBuildProps {\n const currentDomain = store.getCurrentDomain();\n const defaultDomains: Domain[] = [\"web\"];\n const effectiveDomains =\n store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;\n\n const allSelections = store.getAllSelectedTechnologies();\n\n const activeDomain: Domain = currentDomain || effectiveDomains[0] || \"web\";\n\n const onToggle = useCallback(\n (subcategoryId: Parameters<StepBuildProps[\"onToggle\"]>[0], techId: SkillId) => {\n const domain: Domain = store.getCurrentDomain() || \"web\";\n const cat = matrix.categories[subcategoryId];\n store.toggleTechnology(domain, subcategoryId, techId, cat?.exclusive ?? true);\n },\n [store, matrix],\n );\n\n const onContinue = useCallback(() => {\n if (!store.nextDomain()) {\n store.setStep(\"sources\");\n }\n }, [store]);\n\n const onBack = useCallback(() => {\n if (!store.prevDomain()) {\n store.goBack();\n }\n }, [store]);\n\n return {\n matrix,\n domain: activeDomain,\n selectedDomains: effectiveDomains,\n selections: store.domainSelections[activeDomain] || {},\n allSelections,\n showLabels: store.showLabels,\n expertMode: store.expertMode,\n installedSkillIds,\n onToggle,\n onToggleLabels: store.toggleShowLabels,\n onContinue,\n onBack,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-FVN5PFFY.js";
4
+ } from "./chunk-74HSA7C4.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -87,4 +87,4 @@ var HelpModal = ({ currentStep }) => {
87
87
  export {
88
88
  HelpModal
89
89
  };
90
- //# sourceMappingURL=chunk-OALQWRLG.js.map
90
+ //# sourceMappingURL=chunk-D7JTL3DJ.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-FVN5PFFY.js";
4
+ } from "./chunk-74HSA7C4.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -17,4 +17,4 @@ var ViewTitle = ({ children }) => {
17
17
  export {
18
18
  ViewTitle
19
19
  };
20
- //# sourceMappingURL=chunk-KWWLPPHF.js.map
20
+ //# sourceMappingURL=chunk-DO5OZHSS.js.map
@@ -2,17 +2,17 @@
2
2
  import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs
5
- } from "./chunk-3S4GIO4B.js";
5
+ } from "./chunk-TOWP4T5L.js";
6
6
  import {
7
7
  HelpModal
8
- } from "./chunk-OALQWRLG.js";
8
+ } from "./chunk-D7JTL3DJ.js";
9
9
  import {
10
10
  useWizardStore
11
- } from "./chunk-FYNMNY4P.js";
11
+ } from "./chunk-UK3AMBR7.js";
12
12
  import {
13
13
  CLI_COLORS,
14
14
  DEFAULT_PLUGIN_NAME
15
- } from "./chunk-FVN5PFFY.js";
15
+ } from "./chunk-74HSA7C4.js";
16
16
  import {
17
17
  init_esm_shims
18
18
  } from "./chunk-DHET7RCE.js";
@@ -179,4 +179,4 @@ var WizardLayout = ({
179
179
  export {
180
180
  WizardLayout
181
181
  };
182
- //# sourceMappingURL=chunk-DAVOSI4M.js.map
182
+ //# sourceMappingURL=chunk-FKBCYT7B.js.map
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "./chunk-ENWMWIHP.js";
4
+ } from "./chunk-I26YP2Q3.js";
5
5
  import {
6
6
  DomainSelection
7
- } from "./chunk-5BDYODWP.js";
7
+ } from "./chunk-CDGHSTB6.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-FYNMNY4P.js";
10
+ } from "./chunk-UK3AMBR7.js";
11
11
  import {
12
12
  init_esm_shims
13
13
  } from "./chunk-DHET7RCE.js";
@@ -18,7 +18,7 @@ import { jsx } from "react/jsx-runtime";
18
18
  var StepStack = ({ matrix, onCancel }) => {
19
19
  const { approach } = useWizardStore();
20
20
  if (approach !== null) {
21
- return /* @__PURE__ */ jsx(DomainSelection, {});
21
+ return /* @__PURE__ */ jsx(DomainSelection, { matrix });
22
22
  }
23
23
  return /* @__PURE__ */ jsx(StackSelection, { matrix, onCancel });
24
24
  };
@@ -26,4 +26,4 @@ var StepStack = ({ matrix, onCancel }) => {
26
26
  export {
27
27
  StepStack
28
28
  };
29
- //# sourceMappingURL=chunk-VTDEENSP.js.map
29
+ //# sourceMappingURL=chunk-FUEZQ2H6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/components/wizard/step-stack.tsx"],"sourcesContent":["import React from \"react\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { MergedSkillsMatrix } from \"../../types/index.js\";\nimport { StackSelection } from \"./stack-selection.js\";\nimport { DomainSelection } from \"./domain-selection.js\";\n\ntype StepStackProps = {\n matrix: MergedSkillsMatrix;\n onCancel?: () => void;\n};\n\n/**\n * Unified first step of the wizard.\n *\n * Sub-step 1 (approach is null): Shows stacks + \"Start from scratch\" in a single list.\n * Sub-step 2 (approach is set): Shows domain selection with pre-selected domains.\n *\n * After domain selection, proceeds to the \"build\" step.\n */\nexport const StepStack: React.FC<StepStackProps> = ({ matrix, onCancel }) => {\n const { approach } = useWizardStore();\n\n if (approach !== null) {\n return <DomainSelection />;\n }\n\n return <StackSelection matrix={matrix} onCancel={onCancel} />;\n};\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAuBW;AAJJ,IAAM,YAAsC,CAAC,EAAE,QAAQ,SAAS,MAAM;AAC3E,QAAM,EAAE,SAAS,IAAI,eAAe;AAEpC,MAAI,aAAa,MAAM;AACrB,WAAO,oBAAC,mBAAgB;AAAA,EAC1B;AAEA,SAAO,oBAAC,kBAAe,QAAgB,UAAoB;AAC7D;","names":[]}
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-stack.tsx"],"sourcesContent":["import React from \"react\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { MergedSkillsMatrix } from \"../../types/index.js\";\nimport { StackSelection } from \"./stack-selection.js\";\nimport { DomainSelection } from \"./domain-selection.js\";\n\ntype StepStackProps = {\n matrix: MergedSkillsMatrix;\n onCancel?: () => void;\n};\n\n/**\n * Unified first step of the wizard.\n *\n * Sub-step 1 (approach is null): Shows stacks + \"Start from scratch\" in a single list.\n * Sub-step 2 (approach is set): Shows domain selection with pre-selected domains.\n *\n * After domain selection, proceeds to the \"build\" step.\n */\nexport const StepStack: React.FC<StepStackProps> = ({ matrix, onCancel }) => {\n const { approach } = useWizardStore();\n\n if (approach !== null) {\n return <DomainSelection matrix={matrix} />;\n }\n\n return <StackSelection matrix={matrix} onCancel={onCancel} />;\n};\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAuBW;AAJJ,IAAM,YAAsC,CAAC,EAAE,QAAQ,SAAS,MAAM;AAC3E,QAAM,EAAE,SAAS,IAAI,eAAe;AAEpC,MAAI,aAAa,MAAM;AACrB,WAAO,oBAAC,mBAAgB,QAAgB;AAAA,EAC1C;AAEA,SAAO,oBAAC,kBAAe,QAAgB,UAAoB;AAC7D;","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  CLI_BIN_NAME,
4
4
  DEFAULT_BRANDING
5
- } from "./chunk-FVN5PFFY.js";
5
+ } from "./chunk-74HSA7C4.js";
6
6
  import {
7
7
  init_esm_shims
8
8
  } from "./chunk-DHET7RCE.js";
@@ -67,4 +67,4 @@ export {
67
67
  INFO_MESSAGES,
68
68
  DRY_RUN_MESSAGES
69
69
  };
70
- //# sourceMappingURL=chunk-V43QDMYQ.js.map
70
+ //# sourceMappingURL=chunk-G2WNOT3R.js.map
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDomainDisplayName
4
- } from "./chunk-YRVTXSXP.js";
4
+ } from "./chunk-RWR56UVK.js";
5
5
  import {
6
6
  ViewTitle
7
- } from "./chunk-KWWLPPHF.js";
7
+ } from "./chunk-DO5OZHSS.js";
8
8
  import {
9
9
  CLI_COLORS
10
- } from "./chunk-FVN5PFFY.js";
10
+ } from "./chunk-74HSA7C4.js";
11
11
  import {
12
12
  init_esm_shims
13
13
  } from "./chunk-DHET7RCE.js";
@@ -84,4 +84,4 @@ var StepConfirm = ({
84
84
  export {
85
85
  StepConfirm
86
86
  };
87
- //# sourceMappingURL=chunk-M3AGB4TR.js.map
87
+ //# sourceMappingURL=chunk-GVLYNP2I.js.map