@claude-collective/cli 0.2.0 → 0.8.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 (190) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/README.md +1 -1
  3. package/dist/chunk-3HBTELJN.js +114 -0
  4. package/dist/chunk-3HBTELJN.js.map +1 -0
  5. package/dist/chunk-3ZCB5K33.js +54 -0
  6. package/dist/chunk-3ZCB5K33.js.map +1 -0
  7. package/dist/chunk-66UDJBF6.js +96 -0
  8. package/dist/chunk-66UDJBF6.js.map +1 -0
  9. package/dist/chunk-6LS7XO3H.js +31 -0
  10. package/dist/chunk-6LS7XO3H.js.map +1 -0
  11. package/dist/chunk-A3J6IAXK.js +57 -0
  12. package/dist/chunk-A3J6IAXK.js.map +1 -0
  13. package/dist/chunk-A65SBAAJ.js +69 -0
  14. package/dist/chunk-A65SBAAJ.js.map +1 -0
  15. package/dist/chunk-ALEPJ6YN.js +80 -0
  16. package/dist/chunk-ALEPJ6YN.js.map +1 -0
  17. package/dist/chunk-C4ZTIYFR.js +84 -0
  18. package/dist/chunk-C4ZTIYFR.js.map +1 -0
  19. package/dist/chunk-CIY5UBRB.js +453 -0
  20. package/dist/chunk-CIY5UBRB.js.map +1 -0
  21. package/dist/chunk-DHET7RCE.js +50 -0
  22. package/dist/chunk-DHET7RCE.js.map +1 -0
  23. package/dist/chunk-DHFFRMF6.js +31 -0
  24. package/dist/chunk-DHFFRMF6.js.map +1 -0
  25. package/dist/chunk-DKGL77IY.js +307 -0
  26. package/dist/chunk-DKGL77IY.js.map +1 -0
  27. package/dist/chunk-ED73HCW2.js +315 -0
  28. package/dist/chunk-ED73HCW2.js.map +1 -0
  29. package/dist/chunk-FNOYEXUE.js +308 -0
  30. package/dist/chunk-FNOYEXUE.js.map +1 -0
  31. package/dist/chunk-G2FBJOZG.js +141 -0
  32. package/dist/chunk-G2FBJOZG.js.map +1 -0
  33. package/dist/chunk-HNDT5QRB.js +120 -0
  34. package/dist/chunk-HNDT5QRB.js.map +1 -0
  35. package/dist/chunk-K7PTOVX4.js +158 -0
  36. package/dist/chunk-K7PTOVX4.js.map +1 -0
  37. package/dist/chunk-LQTST4WY.js +91 -0
  38. package/dist/chunk-LQTST4WY.js.map +1 -0
  39. package/dist/chunk-LVKRVFYR.js +54 -0
  40. package/dist/chunk-LVKRVFYR.js.map +1 -0
  41. package/dist/chunk-M7YCPFIX.js +108 -0
  42. package/dist/chunk-M7YCPFIX.js.map +1 -0
  43. package/dist/chunk-MJSFR562.js +57 -0
  44. package/dist/chunk-MJSFR562.js.map +1 -0
  45. package/dist/chunk-MMDXNZPF.js +69 -0
  46. package/dist/chunk-MMDXNZPF.js.map +1 -0
  47. package/dist/chunk-MYAVQ23U.js +356 -0
  48. package/dist/chunk-MYAVQ23U.js.map +1 -0
  49. package/dist/chunk-NGBFJJ7Q.js +124 -0
  50. package/dist/chunk-NGBFJJ7Q.js.map +1 -0
  51. package/dist/chunk-OLBOTK3O.js +64 -0
  52. package/dist/chunk-OLBOTK3O.js.map +1 -0
  53. package/dist/chunk-PPNTD5LO.js +330 -0
  54. package/dist/chunk-PPNTD5LO.js.map +1 -0
  55. package/dist/chunk-Q2LH2DAB.js +392 -0
  56. package/dist/chunk-Q2LH2DAB.js.map +1 -0
  57. package/dist/chunk-Q6DR5QUH.js +547 -0
  58. package/dist/chunk-Q6DR5QUH.js.map +1 -0
  59. package/dist/chunk-QESUUPOE.js +241 -0
  60. package/dist/chunk-QESUUPOE.js.map +1 -0
  61. package/dist/chunk-QGGSLMO3.js +607 -0
  62. package/dist/chunk-QGGSLMO3.js.map +1 -0
  63. package/dist/chunk-SEBPPFUW.js +478 -0
  64. package/dist/chunk-SEBPPFUW.js.map +1 -0
  65. package/dist/chunk-SYQ7R2JO.js +95 -0
  66. package/dist/chunk-SYQ7R2JO.js.map +1 -0
  67. package/dist/chunk-TOPAIL5W.js +22 -0
  68. package/dist/chunk-TOPAIL5W.js.map +1 -0
  69. package/dist/chunk-U4VYHKPM.js +110 -0
  70. package/dist/chunk-U4VYHKPM.js.map +1 -0
  71. package/dist/chunk-UOWHJ6BE.js +83 -0
  72. package/dist/chunk-UOWHJ6BE.js.map +1 -0
  73. package/dist/chunk-XKEG3SCV.js +86 -0
  74. package/dist/chunk-XKEG3SCV.js.map +1 -0
  75. package/dist/chunk-XY3XDVMI.js +15599 -0
  76. package/dist/chunk-XY3XDVMI.js.map +1 -0
  77. package/dist/chunk-Y3V43XCU.js +76 -0
  78. package/dist/chunk-Y3V43XCU.js.map +1 -0
  79. package/dist/chunk-YKXBGCFD.js +129 -0
  80. package/dist/chunk-YKXBGCFD.js.map +1 -0
  81. package/dist/cli-v2/defaults/agent-mappings.yaml +185 -0
  82. package/dist/commands/build/marketplace.js +254 -0
  83. package/dist/commands/build/marketplace.js.map +1 -0
  84. package/dist/commands/build/plugins.js +324 -0
  85. package/dist/commands/build/plugins.js.map +1 -0
  86. package/dist/commands/build/stack.js +169 -0
  87. package/dist/commands/build/stack.js.map +1 -0
  88. package/dist/commands/compile.js +461 -0
  89. package/dist/commands/compile.js.map +1 -0
  90. package/dist/commands/config/get.js +60 -0
  91. package/dist/commands/config/get.js.map +1 -0
  92. package/dist/commands/config/index.js +22 -0
  93. package/dist/commands/config/index.js.map +1 -0
  94. package/dist/commands/config/path.js +35 -0
  95. package/dist/commands/config/path.js.map +1 -0
  96. package/dist/commands/config/set-project.js +61 -0
  97. package/dist/commands/config/set-project.js.map +1 -0
  98. package/dist/commands/config/set.js +60 -0
  99. package/dist/commands/config/set.js.map +1 -0
  100. package/dist/commands/config/show.js +13 -0
  101. package/dist/commands/config/show.js.map +1 -0
  102. package/dist/commands/config/unset-project.js +57 -0
  103. package/dist/commands/config/unset-project.js.map +1 -0
  104. package/dist/commands/config/unset.js +56 -0
  105. package/dist/commands/config/unset.js.map +1 -0
  106. package/dist/commands/diff.js +755 -0
  107. package/dist/commands/diff.js.map +1 -0
  108. package/dist/commands/doctor.js +413 -0
  109. package/dist/commands/doctor.js.map +1 -0
  110. package/dist/commands/edit.js +254 -0
  111. package/dist/commands/edit.js.map +1 -0
  112. package/dist/commands/eject.js +208 -0
  113. package/dist/commands/eject.js.map +1 -0
  114. package/dist/commands/info.js +205 -0
  115. package/dist/commands/info.js.map +1 -0
  116. package/dist/commands/init.js +915 -0
  117. package/dist/commands/init.js.map +1 -0
  118. package/dist/commands/list.js +44 -0
  119. package/dist/commands/list.js.map +1 -0
  120. package/dist/commands/new/agent.js +230 -0
  121. package/dist/commands/new/agent.js.map +1 -0
  122. package/dist/commands/new/skill.js +204 -0
  123. package/dist/commands/new/skill.js.map +1 -0
  124. package/dist/commands/outdated.js +242 -0
  125. package/dist/commands/outdated.js.map +1 -0
  126. package/dist/commands/search.js +115 -0
  127. package/dist/commands/search.js.map +1 -0
  128. package/dist/commands/test-imports.js +92 -0
  129. package/dist/commands/test-imports.js.map +1 -0
  130. package/dist/commands/uninstall.js +309 -0
  131. package/dist/commands/uninstall.js.map +1 -0
  132. package/dist/commands/update.js +428 -0
  133. package/dist/commands/update.js.map +1 -0
  134. package/dist/commands/validate.js +375 -0
  135. package/dist/commands/validate.js.map +1 -0
  136. package/dist/commands/version/bump.js +95 -0
  137. package/dist/commands/version/bump.js.map +1 -0
  138. package/dist/commands/version/index.js +70 -0
  139. package/dist/commands/version/index.js.map +1 -0
  140. package/dist/commands/version/set.js +101 -0
  141. package/dist/commands/version/set.js.map +1 -0
  142. package/dist/commands/version/show.js +70 -0
  143. package/dist/commands/version/show.js.map +1 -0
  144. package/dist/components/common/confirm.js +9 -0
  145. package/dist/components/common/confirm.js.map +1 -0
  146. package/dist/components/common/message.js +24 -0
  147. package/dist/components/common/message.js.map +1 -0
  148. package/dist/components/common/spinner.js +14 -0
  149. package/dist/components/common/spinner.js.map +1 -0
  150. package/dist/components/wizard/category-grid.js +9 -0
  151. package/dist/components/wizard/category-grid.js.map +1 -0
  152. package/dist/components/wizard/category-grid.test.js +728 -0
  153. package/dist/components/wizard/category-grid.test.js.map +1 -0
  154. package/dist/components/wizard/section-progress.js +9 -0
  155. package/dist/components/wizard/section-progress.js.map +1 -0
  156. package/dist/components/wizard/section-progress.test.js +281 -0
  157. package/dist/components/wizard/section-progress.test.js.map +1 -0
  158. package/dist/components/wizard/step-approach.js +11 -0
  159. package/dist/components/wizard/step-approach.js.map +1 -0
  160. package/dist/components/wizard/step-build.js +15 -0
  161. package/dist/components/wizard/step-build.js.map +1 -0
  162. package/dist/components/wizard/step-build.test.js +729 -0
  163. package/dist/components/wizard/step-build.test.js.map +1 -0
  164. package/dist/components/wizard/step-confirm.js +9 -0
  165. package/dist/components/wizard/step-confirm.js.map +1 -0
  166. package/dist/components/wizard/step-refine.js +9 -0
  167. package/dist/components/wizard/step-refine.js.map +1 -0
  168. package/dist/components/wizard/step-refine.test.js +235 -0
  169. package/dist/components/wizard/step-refine.test.js.map +1 -0
  170. package/dist/components/wizard/step-stack-options.js +11 -0
  171. package/dist/components/wizard/step-stack-options.js.map +1 -0
  172. package/dist/components/wizard/step-stack.js +11 -0
  173. package/dist/components/wizard/step-stack.js.map +1 -0
  174. package/dist/components/wizard/wizard-tabs.js +11 -0
  175. package/dist/components/wizard/wizard-tabs.js.map +1 -0
  176. package/dist/components/wizard/wizard.js +20 -0
  177. package/dist/components/wizard/wizard.js.map +1 -0
  178. package/dist/hooks/init.js +41 -0
  179. package/dist/hooks/init.js.map +1 -0
  180. package/dist/index.js +10 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/magic-string.es-RGXYGAW3.js +1316 -0
  183. package/dist/magic-string.es-RGXYGAW3.js.map +1 -0
  184. package/dist/stores/wizard-store.js +10 -0
  185. package/dist/stores/wizard-store.js.map +1 -0
  186. package/dist/stores/wizard-store.test.js +405 -0
  187. package/dist/stores/wizard-store.test.js.map +1 -0
  188. package/package.json +44 -25
  189. package/dist/cli/index.js +0 -6314
  190. package/dist/cli/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli-v2/components/wizard/step-build.test.tsx"],"sourcesContent":["/**\n * Tests for the StepBuild component.\n *\n * Tests domain-based technology selection using CategoryGrid.\n */\nimport React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport {\n StepBuild,\n type StepBuildProps,\n validateBuildStep,\n getDisplayLabel,\n} from \"./step-build\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n MergedSkillsMatrix,\n ResolvedSkill,\n CategoryDefinition,\n} from \"../../types-matrix\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\n// =============================================================================\n// Test Fixtures\n// =============================================================================\n\n/**\n * Create a minimal category definition.\n */\nconst createCategory = (\n id: string,\n name: string,\n overrides: Partial<CategoryDefinition> = {},\n): CategoryDefinition => ({\n id,\n name,\n description: `${name} category`,\n exclusive: true,\n required: false,\n order: 0,\n ...overrides,\n});\n\n/**\n * Create a minimal skill definition.\n */\nconst createSkill = (\n id: string,\n name: string,\n category: string,\n overrides: Partial<ResolvedSkill> = {},\n): ResolvedSkill => ({\n id,\n name,\n description: `${name} skill`,\n category,\n categoryExclusive: true,\n tags: [],\n author: \"test\",\n conflictsWith: [],\n recommends: [],\n recommendedBy: [],\n requires: [],\n requiredBy: [],\n alternatives: [],\n discourages: [],\n requiresSetup: [],\n providesSetupFor: [],\n path: `test/${id}`,\n ...overrides,\n});\n\n/**\n * Create a minimal matrix for testing.\n */\nconst createTestMatrix = (\n categories: CategoryDefinition[],\n skills: ResolvedSkill[],\n): MergedSkillsMatrix => ({\n version: \"1.0.0\",\n categories: Object.fromEntries(categories.map((c) => [c.id, c])),\n skills: Object.fromEntries(skills.map((s) => [s.id, s])),\n suggestedStacks: [],\n aliases: Object.fromEntries(\n skills.filter((s) => s.alias).map((s) => [s.alias!, s.id]),\n ),\n aliasesReverse: Object.fromEntries(\n skills.filter((s) => s.alias).map((s) => [s.id, s.alias!]),\n ),\n generatedAt: new Date().toISOString(),\n});\n\n// Create test categories\nconst webCategory = createCategory(\"web\", \"Web\", {\n description: \"Web development\",\n order: 0,\n});\n\nconst apiCategory = createCategory(\"api\", \"API\", {\n description: \"API development\",\n order: 1,\n});\n\nconst frameworkCategory = createCategory(\"framework\", \"Framework\", {\n parent: \"web\",\n domain: \"web\",\n required: true,\n order: 0,\n});\n\nconst stylingCategory = createCategory(\"styling\", \"Styling\", {\n parent: \"web\",\n domain: \"web\",\n required: true,\n order: 1,\n});\n\nconst stateCategory = createCategory(\"client-state\", \"Client State\", {\n parent: \"web\",\n domain: \"web\",\n required: false,\n order: 2,\n});\n\nconst apiFrameworkCategory = createCategory(\"api-framework\", \"API Framework\", {\n parent: \"api\",\n domain: \"api\",\n required: true,\n order: 0,\n});\n\nconst databaseCategory = createCategory(\"database\", \"Database\", {\n parent: \"api\",\n domain: \"api\",\n required: false,\n order: 1,\n});\n\n// Create test skills\nconst reactSkill = createSkill(\"react (@vince)\", \"React\", \"framework\", {\n alias: \"react\",\n});\n\nconst vueSkill = createSkill(\"vue (@vince)\", \"Vue\", \"framework\", {\n alias: \"vue\",\n});\n\nconst tailwindSkill = createSkill(\"tailwind (@vince)\", \"Tailwind\", \"styling\", {\n alias: \"tailwind\",\n});\n\nconst scssSkill = createSkill(\"scss (@vince)\", \"SCSS Modules\", \"styling\", {\n alias: \"scss\",\n});\n\nconst zustandSkill = createSkill(\n \"zustand (@vince)\",\n \"Zustand\",\n \"client-state\",\n {\n alias: \"zustand\",\n },\n);\n\nconst honoSkill = createSkill(\"hono (@vince)\", \"Hono\", \"api-framework\", {\n alias: \"hono\",\n});\n\nconst expressSkill = createSkill(\n \"express (@vince)\",\n \"Express\",\n \"api-framework\",\n {\n alias: \"express\",\n },\n);\n\nconst postgresSkill = createSkill(\n \"postgres (@vince)\",\n \"PostgreSQL\",\n \"database\",\n {\n alias: \"postgres\",\n },\n);\n\n// Default test matrix with web and API domains\nconst defaultMatrix = createTestMatrix(\n [\n webCategory,\n apiCategory,\n frameworkCategory,\n stylingCategory,\n stateCategory,\n apiFrameworkCategory,\n databaseCategory,\n ],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n ],\n);\n\n// Default props\nconst defaultProps: StepBuildProps = {\n matrix: defaultMatrix,\n domain: \"web\",\n selectedDomains: [\"web\"],\n currentDomainIndex: 0,\n selections: {},\n allSelections: [],\n focusedRow: 0,\n focusedCol: 0,\n showDescriptions: false,\n expertMode: false,\n onToggle: vi.fn(),\n onFocusChange: vi.fn(),\n onToggleDescriptions: vi.fn(),\n onToggleExpertMode: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepBuild = (props: Partial<StepBuildProps> = {}) => {\n return render(<StepBuild {...defaultProps} {...props} />);\n};\n\n// =============================================================================\n// Tests\n// =============================================================================\n\ndescribe(\"StepBuild component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n vi.clearAllMocks();\n });\n\n // ===========================================================================\n // Basic Rendering\n // ===========================================================================\n\n describe(\"rendering\", () => {\n it(\"should render CategoryGrid with correct categories for domain\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Web domain should show Framework, Styling, Client State\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n // Should NOT show API categories\n expect(output).not.toContain(\"API Framework\");\n expect(output).not.toContain(\"Database\");\n });\n\n it(\"should render API categories when domain is api\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // API domain should show API Framework, Database\n expect(output).toContain(\"API Framework\");\n expect(output).toContain(\"Database\");\n // Should NOT show Web categories\n expect(output).not.toContain(\"Styling\");\n expect(output).not.toContain(\"Client State\");\n });\n\n it(\"should render skills as options\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework skills\n expect(output).toContain(\"React\");\n expect(output).toContain(\"Vue\");\n // Styling skills\n expect(output).toContain(\"Tailwind\");\n expect(output).toContain(\"SCSS\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n expect(output).toContain(\"*\");\n });\n\n it(\"should show footer with keyboard hints\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Footer now shows full keyboard help text\n expect(output).toContain(\"ESC\");\n expect(output).toContain(\"ENTER\");\n });\n });\n\n // ===========================================================================\n // Progress Indicator\n // ===========================================================================\n\n describe(\"progress indicator\", () => {\n it(\"should show SectionProgress when multiple domains selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n currentDomainIndex: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Domain:\");\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"[1/2]\");\n expect(output).toContain(\"Next: API\");\n });\n\n it(\"should hide SectionProgress when single domain selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\"],\n currentDomainIndex: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain the progress indicator elements\n // Note: \"Domain:\" without SectionProgress wouldn't appear\n expect(output).not.toContain(\"[1/1]\");\n });\n\n it(\"should show 'Last step' when on final domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n domain: \"api\",\n currentDomainIndex: 1,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Domain:\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"[2/2]\");\n expect(output).toContain(\"Last step\");\n });\n\n it(\"should show correct domain display names\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\", \"cli\"],\n currentDomainIndex: 1,\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API\");\n expect(output).toContain(\"Next: CLI\");\n });\n });\n\n // ===========================================================================\n // Category Filtering\n // ===========================================================================\n\n describe(\"category filtering\", () => {\n it(\"should filter categories correctly by domain\", () => {\n // Web domain\n const { lastFrame: webFrame, unmount: webUnmount } = renderStepBuild({\n domain: \"web\",\n });\n const webOutput = webFrame();\n webUnmount();\n\n // API domain\n const { lastFrame: apiFrame, unmount: apiUnmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = apiUnmount;\n const apiOutput = apiFrame();\n\n // Web should have Framework, Styling, Client State\n expect(webOutput).toContain(\"Framework\");\n expect(webOutput).toContain(\"Styling\");\n expect(webOutput).toContain(\"Client State\");\n expect(webOutput).not.toContain(\"API Framework\");\n\n // API should have API Framework, Database\n expect(apiOutput).toContain(\"API Framework\");\n expect(apiOutput).toContain(\"Database\");\n expect(apiOutput).not.toContain(\"Styling\");\n });\n\n it(\"should sort categories by order\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework (order 0) should appear before Styling (order 1)\n // and Styling before Client State (order 2)\n const frameworkIndex = output?.indexOf(\"Framework\") ?? -1;\n const stylingIndex = output?.indexOf(\"Styling\") ?? -1;\n const stateIndex = output?.indexOf(\"Client State\") ?? -1;\n\n expect(frameworkIndex).toBeLessThan(stylingIndex);\n expect(stylingIndex).toBeLessThan(stateIndex);\n });\n });\n\n // ===========================================================================\n // Option States\n // ===========================================================================\n\n describe(\"option states\", () => {\n it(\"should show selected options correctly\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [\"react (@vince)\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show filled circle for selected\n expect(output).toContain(\"\\u25CF\"); // filled circle\n });\n\n it(\"should pass expertMode to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n expertMode: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Expert Mode: ON\");\n });\n\n it(\"should pass showDescriptions to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showDescriptions: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Show descriptions: ON\");\n });\n });\n\n // ===========================================================================\n // Keyboard Navigation\n // ===========================================================================\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter is pressed with valid selections\", async () => {\n const onContinue = vi.fn();\n // Provide selections for required categories to pass validation\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"react\"],\n styling: [\"tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n });\n\n it(\"should pass focus callbacks to CategoryGrid\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onFocusChange,\n focusedRow: 0,\n focusedCol: 0,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Arrow down should trigger focus change\n await stdin.write(\"\\x1B[B\"); // Arrow down\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalled();\n });\n\n it(\"should pass toggle callback to CategoryGrid\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onToggle,\n focusedRow: 0,\n focusedCol: 0,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Space should trigger toggle\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n });\n\n // ===========================================================================\n // Toggle Callbacks\n // ===========================================================================\n\n describe(\"toggle callbacks\", () => {\n it(\"should pass onToggleDescriptions to CategoryGrid\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"\\t\"); // Tab\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n\n it(\"should pass onToggleExpertMode to CategoryGrid\", async () => {\n const onToggleExpertMode = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleExpertMode });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"e\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleExpertMode).toHaveBeenCalled();\n });\n });\n\n // ===========================================================================\n // Edge Cases\n // ===========================================================================\n\n describe(\"edge cases\", () => {\n it(\"should handle domain with no categories\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"mobile\", // No mobile categories in test matrix\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show empty state message from CategoryGrid\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should handle unknown domain gracefully\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"unknown\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render without crashing\n expect(output).toBeDefined();\n });\n\n it(\"should handle empty allSelections\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should handle allSelections with skills from other domains\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n allSelections: [\"hono (@vince)\", \"postgres (@vince)\"], // API skills\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render web categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n // ===========================================================================\n // Multi-domain Scenarios\n // ===========================================================================\n\n describe(\"multi-domain scenarios\", () => {\n it(\"should work for first domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n selectedDomains: [\"web\", \"api\"],\n currentDomainIndex: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Domain:\");\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"[1/2]\");\n expect(output).toContain(\"Next: API\");\n });\n\n it(\"should work for last domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\"],\n currentDomainIndex: 1,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Domain:\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"[2/2]\");\n expect(output).toContain(\"Last step\");\n });\n\n it(\"should show three-domain progress correctly\", () => {\n // Add cli category to matrix\n const cliFrameworkCategory = createCategory(\n \"cli-framework\",\n \"CLI Framework\",\n {\n parent: \"cli\",\n domain: \"cli\",\n required: true,\n order: 0,\n },\n );\n const cliCategory = createCategory(\"cli\", \"CLI\", {\n description: \"CLI development\",\n order: 2,\n });\n const commanderSkill = createSkill(\n \"commander (@vince)\",\n \"Commander\",\n \"cli-framework\",\n {\n alias: \"commander\",\n },\n );\n\n const matrixWithCli = createTestMatrix(\n [\n webCategory,\n apiCategory,\n cliCategory,\n frameworkCategory,\n stylingCategory,\n stateCategory,\n apiFrameworkCategory,\n databaseCategory,\n cliFrameworkCategory,\n ],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n commanderSkill,\n ],\n );\n\n const { lastFrame, unmount } = renderStepBuild({\n matrix: matrixWithCli,\n domain: \"api\",\n selectedDomains: [\"web\", \"api\", \"cli\"],\n currentDomainIndex: 1,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2/3]\");\n expect(output).toContain(\"Next: CLI\");\n });\n });\n\n // ===========================================================================\n // Header and Selection Count\n // ===========================================================================\n\n describe(\"header and selection count\", () => {\n it(\"should show header with domain name\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Configure your\");\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"stack:\");\n });\n\n it(\"should show selection count in header\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // With no selections, should show 0/N selected\n expect(output).toContain(\"selected\");\n });\n\n it(\"should update selection count when items are selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [\"react (@vince)\", \"tailwind (@vince)\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show at least 2 selected\n expect(output).toContain(\"selected\");\n });\n });\n\n // ===========================================================================\n // Keyboard Help Text\n // ===========================================================================\n\n describe(\"keyboard help text\", () => {\n it(\"should show keyboard shortcuts help in footer\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Check for key parts of help text (may wrap due to terminal width)\n expect(output).toContain(\"SPACE select\");\n expect(output).toContain(\"TAB descriptions\");\n expect(output).toContain(\"ENTER continue\");\n expect(output).toContain(\"ESC\"); // May be on next line\n expect(output).toContain(\"back\");\n });\n\n it(\"should show arrow key navigation hints\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Check for arrow symbols in the help text\n expect(output).toContain(\"options\");\n expect(output).toContain(\"categories\");\n });\n });\n\n // ===========================================================================\n // Validation\n // ===========================================================================\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n name: \"Framework\",\n required: true,\n exclusive: true,\n options: [\n { id: \"react\", label: \"React\", state: \"normal\", selected: true },\n ],\n },\n ];\n const selections = { framework: [\"react\"] };\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n expect(result.message).toBeUndefined();\n });\n\n it(\"should return invalid when required category has no selection\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n name: \"Framework\",\n required: true,\n exclusive: true,\n options: [\n { id: \"react\", label: \"React\", state: \"normal\", selected: false },\n ],\n },\n ];\n const selections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\");\n });\n\n it(\"should return valid when optional categories have no selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"state\",\n name: \"State Management\",\n required: false,\n exclusive: true,\n options: [\n {\n id: \"zustand\",\n label: \"Zustand\",\n state: \"normal\",\n selected: false,\n },\n ],\n },\n ];\n const selections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n });\n\n it(\"should return invalid for first missing required category\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n name: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"styling\",\n name: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\"); // Should be the first one\n });\n });\n\n describe(\"validation on continue\", () => {\n it(\"should show validation error when trying to continue without required selection\", async () => {\n const onContinue = vi.fn();\n const { stdin, lastFrame, unmount } = renderStepBuild({\n onContinue,\n selections: {},\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue without selecting required framework\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Should show validation error and NOT call onContinue\n const output = lastFrame();\n expect(output).toContain(\"Please select\");\n expect(onContinue).not.toHaveBeenCalled();\n });\n\n it(\"should call onContinue when validation passes\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"react\"],\n styling: [\"tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue with required selections\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n });\n});\n\n// =============================================================================\n// getDisplayLabel Tests\n// =============================================================================\n\ndescribe(\"getDisplayLabel\", () => {\n it(\"should strip author suffix from name\", () => {\n expect(getDisplayLabel({ name: \"React (@vince)\" })).toBe(\"React\");\n });\n\n it(\"should preserve original capitalization\", () => {\n expect(getDisplayLabel({ name: \"SCSS Modules (@vince)\" })).toBe(\n \"SCSS Modules\",\n );\n });\n\n it(\"should handle hyphenated author names\", () => {\n expect(getDisplayLabel({ name: \"React (@vince-team)\" })).toBe(\"React\");\n });\n\n it(\"should handle names without author suffix\", () => {\n expect(getDisplayLabel({ name: \"React\" })).toBe(\"React\");\n });\n\n it(\"should handle extra whitespace before author suffix\", () => {\n expect(getDisplayLabel({ name: \"React (@vince)\" })).toBe(\"React\");\n });\n\n it(\"should not strip non-author parentheses\", () => {\n expect(getDisplayLabel({ name: \"React (library)\" })).toBe(\n \"React (library)\",\n );\n });\n\n it(\"should ignore alias and use name for display\", () => {\n // alias is available but we use name for accurate capitalization\n expect(\n getDisplayLabel({ alias: \"scss-modules\", name: \"SCSS Modules (@vince)\" }),\n ).toBe(\"SCSS Modules\");\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StepConfirm
4
+ } from "../../chunk-UOWHJ6BE.js";
5
+ import "../../chunk-DHET7RCE.js";
6
+ export {
7
+ StepConfirm
8
+ };
9
+ //# sourceMappingURL=step-confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StepRefine
4
+ } from "../../chunk-Y3V43XCU.js";
5
+ import "../../chunk-DHET7RCE.js";
6
+ export {
7
+ StepRefine
8
+ };
9
+ //# sourceMappingURL=step-refine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,235 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ARROW_DOWN,
4
+ ARROW_UP,
5
+ ENTER,
6
+ ESCAPE,
7
+ INPUT_DELAY_MS,
8
+ RENDER_DELAY_MS,
9
+ delay
10
+ } from "../../chunk-6LS7XO3H.js";
11
+ import {
12
+ render
13
+ } from "../../chunk-66UDJBF6.js";
14
+ import {
15
+ afterEach,
16
+ describe,
17
+ globalExpect,
18
+ it,
19
+ vi
20
+ } from "../../chunk-XY3XDVMI.js";
21
+ import {
22
+ StepRefine
23
+ } from "../../chunk-Y3V43XCU.js";
24
+ import {
25
+ init_esm_shims
26
+ } from "../../chunk-DHET7RCE.js";
27
+
28
+ // src/cli-v2/components/wizard/step-refine.test.tsx
29
+ init_esm_shims();
30
+ import { jsx } from "react/jsx-runtime";
31
+ var defaultProps = {
32
+ technologyCount: 12,
33
+ refineAction: "all-recommended",
34
+ onSelectAction: vi.fn(),
35
+ onContinue: vi.fn(),
36
+ onBack: vi.fn()
37
+ };
38
+ var renderStepRefine = (props = {}) => {
39
+ return render(/* @__PURE__ */ jsx(StepRefine, { ...defaultProps, ...props }));
40
+ };
41
+ describe("StepRefine component", () => {
42
+ let cleanup;
43
+ afterEach(() => {
44
+ cleanup?.();
45
+ cleanup = void 0;
46
+ vi.clearAllMocks();
47
+ });
48
+ describe("rendering", () => {
49
+ it("should render technology count correctly", () => {
50
+ const { lastFrame, unmount } = renderStepRefine({ technologyCount: 12 });
51
+ cleanup = unmount;
52
+ const output = lastFrame();
53
+ globalExpect(output).toContain("12");
54
+ globalExpect(output).toContain("technologies");
55
+ });
56
+ it("should render different technology count", () => {
57
+ const { lastFrame, unmount } = renderStepRefine({ technologyCount: 5 });
58
+ cleanup = unmount;
59
+ const output = lastFrame();
60
+ globalExpect(output).toContain("5");
61
+ globalExpect(output).toContain("technologies");
62
+ });
63
+ it("should render 'Use all recommended' option", () => {
64
+ const { lastFrame, unmount } = renderStepRefine();
65
+ cleanup = unmount;
66
+ const output = lastFrame();
67
+ globalExpect(output).toContain("Use all recommended skills (verified)");
68
+ });
69
+ it("should show 'Use all recommended' option as highlighted", () => {
70
+ const { lastFrame, unmount } = renderStepRefine({
71
+ refineAction: "all-recommended"
72
+ });
73
+ cleanup = unmount;
74
+ const output = lastFrame();
75
+ globalExpect(output).toContain(">");
76
+ globalExpect(output).toContain("Use all recommended skills");
77
+ });
78
+ it("should render verification description", () => {
79
+ const { lastFrame, unmount } = renderStepRefine();
80
+ cleanup = unmount;
81
+ const output = lastFrame();
82
+ globalExpect(output).toContain("fastest option");
83
+ globalExpect(output).toContain("verified");
84
+ globalExpect(output).toContain("Claude Collective");
85
+ });
86
+ });
87
+ describe("customize option", () => {
88
+ it("should show 'Customize' option as disabled/grayed", () => {
89
+ const { lastFrame, unmount } = renderStepRefine();
90
+ cleanup = unmount;
91
+ const output = lastFrame();
92
+ globalExpect(output).toContain("Customize skill sources");
93
+ });
94
+ it("should show '(coming soon)' label on customize option", () => {
95
+ const { lastFrame, unmount } = renderStepRefine();
96
+ cleanup = unmount;
97
+ const output = lastFrame();
98
+ globalExpect(output).toContain("(coming soon)");
99
+ });
100
+ it("should show customize description", () => {
101
+ const { lastFrame, unmount } = renderStepRefine();
102
+ cleanup = unmount;
103
+ const output = lastFrame();
104
+ globalExpect(output).toContain("Choose alternative skills for each technology");
105
+ });
106
+ });
107
+ describe("keyboard shortcuts display", () => {
108
+ it("should show ESC instruction for back", () => {
109
+ const { lastFrame, unmount } = renderStepRefine();
110
+ cleanup = unmount;
111
+ const output = lastFrame();
112
+ globalExpect(output).toContain("ESC");
113
+ globalExpect(output).toContain("back");
114
+ });
115
+ it("should show ENTER instruction for continue", () => {
116
+ const { lastFrame, unmount } = renderStepRefine();
117
+ cleanup = unmount;
118
+ const output = lastFrame();
119
+ globalExpect(output).toContain("ENTER");
120
+ globalExpect(output).toContain("continue");
121
+ });
122
+ });
123
+ describe("keyboard navigation", () => {
124
+ it("should call onContinue when Enter key is pressed", async () => {
125
+ const onContinue = vi.fn();
126
+ const { stdin, unmount } = renderStepRefine({ onContinue });
127
+ cleanup = unmount;
128
+ await delay(RENDER_DELAY_MS);
129
+ stdin.write(ENTER);
130
+ await delay(INPUT_DELAY_MS);
131
+ globalExpect(onContinue).toHaveBeenCalledTimes(1);
132
+ });
133
+ it("should call onBack when Escape key is pressed", async () => {
134
+ const onBack = vi.fn();
135
+ const { stdin, unmount } = renderStepRefine({ onBack });
136
+ cleanup = unmount;
137
+ await delay(RENDER_DELAY_MS);
138
+ stdin.write(ESCAPE);
139
+ await delay(INPUT_DELAY_MS);
140
+ globalExpect(onBack).toHaveBeenCalledTimes(1);
141
+ });
142
+ it("should call onSelectAction with 'all-recommended' on arrow up", async () => {
143
+ const onSelectAction = vi.fn();
144
+ const { stdin, unmount } = renderStepRefine({ onSelectAction });
145
+ cleanup = unmount;
146
+ await delay(RENDER_DELAY_MS);
147
+ stdin.write(ARROW_UP);
148
+ await delay(INPUT_DELAY_MS);
149
+ globalExpect(onSelectAction).toHaveBeenCalledWith("all-recommended");
150
+ });
151
+ it("should call onSelectAction with 'all-recommended' on arrow down", async () => {
152
+ const onSelectAction = vi.fn();
153
+ const { stdin, unmount } = renderStepRefine({ onSelectAction });
154
+ cleanup = unmount;
155
+ await delay(RENDER_DELAY_MS);
156
+ stdin.write(ARROW_DOWN);
157
+ await delay(INPUT_DELAY_MS);
158
+ globalExpect(onSelectAction).toHaveBeenCalledWith("all-recommended");
159
+ });
160
+ });
161
+ describe("selection state", () => {
162
+ it("should handle null refineAction (defaults to recommended)", () => {
163
+ const { lastFrame, unmount } = renderStepRefine({ refineAction: null });
164
+ cleanup = unmount;
165
+ const output = lastFrame();
166
+ globalExpect(output).toContain(">");
167
+ globalExpect(output).toContain("Use all recommended");
168
+ });
169
+ it("should handle 'all-recommended' refineAction", () => {
170
+ const { lastFrame, unmount } = renderStepRefine({
171
+ refineAction: "all-recommended"
172
+ });
173
+ cleanup = unmount;
174
+ const output = lastFrame();
175
+ globalExpect(output).toContain("Use all recommended");
176
+ });
177
+ it("should handle 'customize' refineAction (even though disabled)", () => {
178
+ const { lastFrame, unmount } = renderStepRefine({
179
+ refineAction: "customize"
180
+ });
181
+ cleanup = unmount;
182
+ const output = lastFrame();
183
+ globalExpect(output).toContain("Use all recommended");
184
+ globalExpect(output).toContain("Customize skill sources");
185
+ });
186
+ });
187
+ describe("edge cases", () => {
188
+ it("should handle zero technology count", () => {
189
+ const { lastFrame, unmount } = renderStepRefine({ technologyCount: 0 });
190
+ cleanup = unmount;
191
+ const output = lastFrame();
192
+ globalExpect(output).toContain("0");
193
+ globalExpect(output).toContain("technologies");
194
+ });
195
+ it("should handle single technology count", () => {
196
+ const { lastFrame, unmount } = renderStepRefine({ technologyCount: 1 });
197
+ cleanup = unmount;
198
+ const output = lastFrame();
199
+ globalExpect(output).toContain("1");
200
+ globalExpect(output).toContain("technologies");
201
+ });
202
+ it("should handle large technology count", () => {
203
+ const { lastFrame, unmount } = renderStepRefine({ technologyCount: 100 });
204
+ cleanup = unmount;
205
+ const output = lastFrame();
206
+ globalExpect(output).toContain("100");
207
+ globalExpect(output).toContain("technologies");
208
+ });
209
+ });
210
+ describe("multiple keyboard events", () => {
211
+ it("should allow multiple Enter presses", async () => {
212
+ const onContinue = vi.fn();
213
+ const { stdin, unmount } = renderStepRefine({ onContinue });
214
+ cleanup = unmount;
215
+ await delay(RENDER_DELAY_MS);
216
+ stdin.write(ENTER);
217
+ await delay(INPUT_DELAY_MS);
218
+ stdin.write(ENTER);
219
+ await delay(INPUT_DELAY_MS);
220
+ globalExpect(onContinue).toHaveBeenCalledTimes(2);
221
+ });
222
+ it("should allow multiple Escape presses", async () => {
223
+ const onBack = vi.fn();
224
+ const { stdin, unmount } = renderStepRefine({ onBack });
225
+ cleanup = unmount;
226
+ await delay(RENDER_DELAY_MS);
227
+ stdin.write(ESCAPE);
228
+ await delay(INPUT_DELAY_MS);
229
+ stdin.write(ESCAPE);
230
+ await delay(INPUT_DELAY_MS);
231
+ globalExpect(onBack).toHaveBeenCalledTimes(2);
232
+ });
233
+ });
234
+ });
235
+ //# sourceMappingURL=step-refine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli-v2/components/wizard/step-refine.test.tsx"],"sourcesContent":["/**\n * Tests for the StepRefine component.\n *\n * Tests the Refine step where users can choose skill sources.\n * For Phase 7, only \"Use all recommended\" is implemented.\n */\nimport React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport {\n StepRefine,\n type StepRefineProps,\n type RefineAction,\n} from \"./step-refine\";\nimport {\n ENTER,\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\n// =============================================================================\n// Test Fixtures\n// =============================================================================\n\nconst defaultProps: StepRefineProps = {\n technologyCount: 12,\n refineAction: \"all-recommended\",\n onSelectAction: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepRefine = (props: Partial<StepRefineProps> = {}) => {\n return render(<StepRefine {...defaultProps} {...props} />);\n};\n\n// =============================================================================\n// Tests\n// =============================================================================\n\ndescribe(\"StepRefine component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n vi.clearAllMocks();\n });\n\n // ===========================================================================\n // Basic Rendering\n // ===========================================================================\n\n describe(\"rendering\", () => {\n it(\"should render technology count correctly\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 12 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"12\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render different technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 5 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"5\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render 'Use all recommended' option\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended skills (verified)\");\n });\n\n it(\"should show 'Use all recommended' option as highlighted\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // The option should have the \">\" indicator\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended skills\");\n });\n\n it(\"should render verification description\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"fastest option\");\n expect(output).toContain(\"verified\");\n expect(output).toContain(\"Claude Collective\");\n });\n });\n\n // ===========================================================================\n // Customize Option Display\n // ===========================================================================\n\n describe(\"customize option\", () => {\n it(\"should show 'Customize' option as disabled/grayed\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should show '(coming soon)' label on customize option\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(coming soon)\");\n });\n\n it(\"should show customize description\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose alternative skills for each technology\");\n });\n });\n\n // ===========================================================================\n // Keyboard Shortcuts Display\n // ===========================================================================\n\n describe(\"keyboard shortcuts display\", () => {\n it(\"should show ESC instruction for back\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"ESC\");\n expect(output).toContain(\"back\");\n });\n\n it(\"should show ENTER instruction for continue\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"ENTER\");\n expect(output).toContain(\"continue\");\n });\n });\n\n // ===========================================================================\n // Keyboard Navigation\n // ===========================================================================\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter key is pressed\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(1);\n });\n\n it(\"should call onBack when Escape key is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(1);\n });\n\n it(\"should call onSelectAction with 'all-recommended' on arrow up\", async () => {\n const onSelectAction = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onSelectAction });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n expect(onSelectAction).toHaveBeenCalledWith(\"all-recommended\");\n });\n\n it(\"should call onSelectAction with 'all-recommended' on arrow down\", async () => {\n const onSelectAction = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onSelectAction });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n expect(onSelectAction).toHaveBeenCalledWith(\"all-recommended\");\n });\n });\n\n // ===========================================================================\n // Selection State\n // ===========================================================================\n\n describe(\"selection state\", () => {\n it(\"should handle null refineAction (defaults to recommended)\", () => {\n const { lastFrame, unmount } = renderStepRefine({ refineAction: null });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still show the recommended option with indicator\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended\");\n });\n\n it(\"should handle 'all-recommended' refineAction\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended\");\n });\n\n it(\"should handle 'customize' refineAction (even though disabled)\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"customize\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render, even if customize is selected\n expect(output).toContain(\"Use all recommended\");\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n // ===========================================================================\n // Edge Cases\n // ===========================================================================\n\n describe(\"edge cases\", () => {\n it(\"should handle zero technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 0 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"0\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle single technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 1 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"1\");\n // Note: \"technologies\" is plural even for 1 (simple implementation)\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle large technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 100 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"100\");\n expect(output).toContain(\"technologies\");\n });\n });\n\n // ===========================================================================\n // Multiple Keyboard Events\n // ===========================================================================\n\n describe(\"multiple keyboard events\", () => {\n it(\"should allow multiple Enter presses\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(2);\n });\n\n it(\"should allow multiple Escape presses\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(2);\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StepStackOptions
4
+ } from "../../chunk-A65SBAAJ.js";
5
+ import "../../chunk-K7PTOVX4.js";
6
+ import "../../chunk-A3J6IAXK.js";
7
+ import "../../chunk-DHET7RCE.js";
8
+ export {
9
+ StepStackOptions
10
+ };
11
+ //# sourceMappingURL=step-stack-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StepStack
4
+ } from "../../chunk-HNDT5QRB.js";
5
+ import "../../chunk-K7PTOVX4.js";
6
+ import "../../chunk-A3J6IAXK.js";
7
+ import "../../chunk-DHET7RCE.js";
8
+ export {
9
+ StepStack
10
+ };
11
+ //# sourceMappingURL=step-stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ WIZARD_STEPS,
4
+ WizardTabs
5
+ } from "../../chunk-ALEPJ6YN.js";
6
+ import "../../chunk-DHET7RCE.js";
7
+ export {
8
+ WIZARD_STEPS,
9
+ WizardTabs
10
+ };
11
+ //# sourceMappingURL=wizard-tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ Wizard
4
+ } from "../../chunk-ED73HCW2.js";
5
+ import "../../chunk-A65SBAAJ.js";
6
+ import "../../chunk-HNDT5QRB.js";
7
+ import "../../chunk-ALEPJ6YN.js";
8
+ import "../../chunk-XKEG3SCV.js";
9
+ import "../../chunk-Q6DR5QUH.js";
10
+ import "../../chunk-LVKRVFYR.js";
11
+ import "../../chunk-UOWHJ6BE.js";
12
+ import "../../chunk-Y3V43XCU.js";
13
+ import "../../chunk-PPNTD5LO.js";
14
+ import "../../chunk-K7PTOVX4.js";
15
+ import "../../chunk-A3J6IAXK.js";
16
+ import "../../chunk-DHET7RCE.js";
17
+ export {
18
+ Wizard
19
+ };
20
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ resolveSource
4
+ } from "../chunk-QESUUPOE.js";
5
+ import "../chunk-TOPAIL5W.js";
6
+ import "../chunk-MMDXNZPF.js";
7
+ import {
8
+ init_esm_shims
9
+ } from "../chunk-DHET7RCE.js";
10
+
11
+ // src/cli-v2/hooks/init.ts
12
+ init_esm_shims();
13
+ var hook = async function(options) {
14
+ const projectDir = process.cwd();
15
+ let sourceFlag;
16
+ const sourceArgIndex = options.argv.indexOf("--source");
17
+ if (sourceArgIndex !== -1 && sourceArgIndex + 1 < options.argv.length) {
18
+ sourceFlag = options.argv[sourceArgIndex + 1];
19
+ } else {
20
+ const sourceFlagWithEquals = options.argv.find(
21
+ (arg) => arg.startsWith("--source=")
22
+ );
23
+ if (sourceFlagWithEquals) {
24
+ sourceFlag = sourceFlagWithEquals.split("=")[1];
25
+ }
26
+ }
27
+ const sArgIndex = options.argv.indexOf("-s");
28
+ if (sArgIndex !== -1 && sArgIndex + 1 < options.argv.length) {
29
+ sourceFlag = options.argv[sArgIndex + 1];
30
+ }
31
+ try {
32
+ const resolvedConfig = await resolveSource(sourceFlag, projectDir);
33
+ options.config.sourceConfig = resolvedConfig;
34
+ } catch (error) {
35
+ }
36
+ };
37
+ var init_default = hook;
38
+ export {
39
+ init_default as default
40
+ };
41
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli-v2/hooks/init.ts"],"sourcesContent":["// Init hook - runs before each command\nimport { Hook } from \"@oclif/core\";\nimport { resolveSource } from \"../lib/config.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n // Detect project directory (current working directory)\n const projectDir = process.cwd();\n\n // Get the --source flag value if provided\n // The flag value will be available in the command's flags after parse()\n // but during init hook we need to check argv manually\n let sourceFlag: string | undefined;\n const sourceArgIndex = options.argv.indexOf(\"--source\");\n if (sourceArgIndex !== -1 && sourceArgIndex + 1 < options.argv.length) {\n sourceFlag = options.argv[sourceArgIndex + 1];\n } else {\n const sourceFlagWithEquals = options.argv.find((arg) =>\n arg.startsWith(\"--source=\"),\n );\n if (sourceFlagWithEquals) {\n sourceFlag = sourceFlagWithEquals.split(\"=\")[1];\n }\n }\n\n // Short form -s\n const sArgIndex = options.argv.indexOf(\"-s\");\n if (sArgIndex !== -1 && sArgIndex + 1 < options.argv.length) {\n sourceFlag = options.argv[sArgIndex + 1];\n }\n\n // Resolve configuration\n try {\n const resolvedConfig = await resolveSource(sourceFlag, projectDir);\n\n // Store resolved config in the oclif Config object\n // This will be available to commands via this.sourceConfig getter in BaseCommand\n (options.config as any).sourceConfig = resolvedConfig;\n } catch (error) {\n // If config loading fails, we let the command handle it\n // This ensures commands can still run even if config is invalid\n // The command can check if config.sourceConfig is undefined and handle accordingly\n }\n};\n\nexport default hook;\n"],"mappings":";;;;;;;;;;;AAAA;AAIA,IAAM,OAAqB,eAAgB,SAAS;AAElD,QAAM,aAAa,QAAQ,IAAI;AAK/B,MAAI;AACJ,QAAM,iBAAiB,QAAQ,KAAK,QAAQ,UAAU;AACtD,MAAI,mBAAmB,MAAM,iBAAiB,IAAI,QAAQ,KAAK,QAAQ;AACrE,iBAAa,QAAQ,KAAK,iBAAiB,CAAC;AAAA,EAC9C,OAAO;AACL,UAAM,uBAAuB,QAAQ,KAAK;AAAA,MAAK,CAAC,QAC9C,IAAI,WAAW,WAAW;AAAA,IAC5B;AACA,QAAI,sBAAsB;AACxB,mBAAa,qBAAqB,MAAM,GAAG,EAAE,CAAC;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,YAAY,QAAQ,KAAK,QAAQ,IAAI;AAC3C,MAAI,cAAc,MAAM,YAAY,IAAI,QAAQ,KAAK,QAAQ;AAC3D,iBAAa,QAAQ,KAAK,YAAY,CAAC;AAAA,EACzC;AAGA,MAAI;AACF,UAAM,iBAAiB,MAAM,cAAc,YAAY,UAAU;AAIjE,IAAC,QAAQ,OAAe,eAAe;AAAA,EACzC,SAAS,OAAO;AAAA,EAIhB;AACF;AAEA,IAAO,eAAQ;","names":[]}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-DHET7RCE.js";
5
+
6
+ // src/cli-v2/index.ts
7
+ init_esm_shims();
8
+ import { run, flush, Errors } from "@oclif/core";
9
+ run(void 0, import.meta.url).then(() => flush()).catch((error) => Errors.handle(error));
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-v2/index.ts"],"sourcesContent":["// oclif entry point - to be implemented\nimport { run, flush, Errors } from \"@oclif/core\";\n\nrun(undefined, import.meta.url)\n .then(() => flush())\n .catch((error) => Errors.handle(error));\n"],"mappings":";;;;;;AAAA;AACA,SAAS,KAAK,OAAO,cAAc;AAEnC,IAAI,QAAW,YAAY,GAAG,EAC3B,KAAK,MAAM,MAAM,CAAC,EAClB,MAAM,CAAC,UAAU,OAAO,OAAO,KAAK,CAAC;","names":[]}