@agents-inc/cli 0.90.0 → 0.91.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 (179) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/{chunk-OWPIGGPP.js → chunk-2RXDM5HN.js} +2 -2
  3. package/dist/{chunk-JI44SVMW.js → chunk-35WALWDD.js} +2 -2
  4. package/dist/{chunk-D254XO7K.js → chunk-3O57Z6Q3.js} +2 -2
  5. package/dist/{chunk-TWOHWCKS.js → chunk-3STOCHK4.js} +2 -2
  6. package/dist/{chunk-BO4JY7BT.js → chunk-5IR4QU7G.js} +24 -19
  7. package/dist/chunk-5IR4QU7G.js.map +1 -0
  8. package/dist/chunk-7QWCPF6F.js +135 -0
  9. package/dist/chunk-7QWCPF6F.js.map +1 -0
  10. package/dist/{chunk-VJBCOPMG.js → chunk-AWB6DO24.js} +16 -9
  11. package/dist/chunk-AWB6DO24.js.map +1 -0
  12. package/dist/{chunk-SB2R5KHJ.js → chunk-BGICSUQK.js} +2 -2
  13. package/dist/{chunk-HK53FRMU.js → chunk-DVBA6PGR.js} +3 -7
  14. package/dist/{chunk-HK53FRMU.js.map → chunk-DVBA6PGR.js.map} +1 -1
  15. package/dist/{chunk-I5AZKNNL.js → chunk-FEKVKYCN.js} +2 -2
  16. package/dist/{chunk-7AUGC7PK.js → chunk-G3VPBEBC.js} +2 -2
  17. package/dist/chunk-M6J5YQ3P.js +100 -0
  18. package/dist/chunk-M6J5YQ3P.js.map +1 -0
  19. package/dist/{chunk-3T5XT2VU.js → chunk-MBEXASMU.js} +3 -3
  20. package/dist/{chunk-TEA5KBIA.js → chunk-NESVWSI7.js} +2 -2
  21. package/dist/{chunk-V36FRPAU.js → chunk-ORTNQZLF.js} +4 -2
  22. package/dist/{chunk-V36FRPAU.js.map → chunk-ORTNQZLF.js.map} +1 -1
  23. package/dist/{chunk-TP6BX5M2.js → chunk-RDQBXB3Y.js} +5 -5
  24. package/dist/{chunk-VYLF4IIK.js → chunk-TJHCK4OS.js} +2 -2
  25. package/dist/{chunk-Z5FXZFX2.js → chunk-UK572773.js} +2 -2
  26. package/dist/{chunk-4ITKYWVG.js → chunk-V75HVZTB.js} +3 -3
  27. package/dist/chunk-V75HVZTB.js.map +1 -0
  28. package/dist/commands/build/marketplace.js +58 -40
  29. package/dist/commands/build/marketplace.js.map +1 -1
  30. package/dist/commands/build/plugins.js +38 -29
  31. package/dist/commands/build/plugins.js.map +1 -1
  32. package/dist/commands/build/stack.js +35 -27
  33. package/dist/commands/build/stack.js.map +1 -1
  34. package/dist/commands/compile.js +35 -32
  35. package/dist/commands/compile.js.map +1 -1
  36. package/dist/commands/diff.js +4 -3
  37. package/dist/commands/diff.js.map +1 -1
  38. package/dist/commands/doctor.js +8 -31
  39. package/dist/commands/doctor.js.map +1 -1
  40. package/dist/commands/edit.js +52 -59
  41. package/dist/commands/edit.js.map +1 -1
  42. package/dist/commands/import/skill.js +53 -43
  43. package/dist/commands/import/skill.js.map +1 -1
  44. package/dist/commands/init.js +17 -18
  45. package/dist/commands/new/marketplace.js +90 -75
  46. package/dist/commands/new/marketplace.js.map +1 -1
  47. package/dist/commands/outdated.js +82 -91
  48. package/dist/commands/outdated.js.map +1 -1
  49. package/dist/commands/search.js +2 -2
  50. package/dist/commands/uninstall.js +33 -24
  51. package/dist/commands/uninstall.js.map +1 -1
  52. package/dist/components/skill-search/skill-search.js +2 -2
  53. package/dist/components/wizard/category-grid.js +2 -2
  54. package/dist/components/wizard/category-grid.test.js +3 -3
  55. package/dist/components/wizard/domain-selection.js +2 -2
  56. package/dist/components/wizard/{help-modal.js → info-panel.js} +6 -6
  57. package/dist/components/wizard/search-modal.js +2 -2
  58. package/dist/components/wizard/search-modal.test.js +2 -2
  59. package/dist/components/wizard/source-grid.js +3 -3
  60. package/dist/components/wizard/source-grid.test.js +4 -4
  61. package/dist/components/wizard/stack-selection.js +2 -2
  62. package/dist/components/wizard/stats-panel.js +106 -5
  63. package/dist/components/wizard/stats-panel.js.map +1 -1
  64. package/dist/components/wizard/step-agents.js +2 -2
  65. package/dist/components/wizard/step-agents.test.js +2 -2
  66. package/dist/components/wizard/step-build.js +4 -5
  67. package/dist/components/wizard/step-build.test.js +4 -5
  68. package/dist/components/wizard/step-build.test.js.map +1 -1
  69. package/dist/components/wizard/step-confirm.test.js +1 -1
  70. package/dist/components/wizard/step-refine.js +2 -2
  71. package/dist/components/wizard/step-refine.test.js +2 -2
  72. package/dist/components/wizard/step-settings.js +2 -2
  73. package/dist/components/wizard/step-settings.test.js +2 -2
  74. package/dist/components/wizard/step-sources.js +6 -6
  75. package/dist/components/wizard/step-sources.test.js +6 -6
  76. package/dist/components/wizard/step-stack.js +3 -3
  77. package/dist/components/wizard/step-stack.test.js +3 -3
  78. package/dist/components/wizard/wizard-layout.js +5 -5
  79. package/dist/components/wizard/wizard.js +16 -17
  80. package/dist/hooks/init.js +17 -18
  81. package/dist/hooks/init.js.map +1 -1
  82. package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
  83. package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
  84. package/dist/src/agents/developer/ai-developer/critical-reminders.md +31 -0
  85. package/dist/src/agents/developer/ai-developer/critical-requirements.md +17 -0
  86. package/dist/src/agents/developer/ai-developer/examples.md +137 -0
  87. package/dist/src/agents/developer/ai-developer/intro.md +23 -0
  88. package/dist/src/agents/developer/ai-developer/metadata.yaml +12 -0
  89. package/dist/src/agents/developer/ai-developer/output-format.md +228 -0
  90. package/dist/src/agents/developer/ai-developer/workflow.md +464 -0
  91. package/dist/src/agents/planning/api-pm/critical-reminders.md +32 -0
  92. package/dist/src/agents/planning/api-pm/critical-requirements.md +21 -0
  93. package/dist/src/agents/planning/api-pm/examples.md +157 -0
  94. package/dist/src/agents/planning/api-pm/intro.md +14 -0
  95. package/dist/src/agents/planning/api-pm/metadata.yaml +12 -0
  96. package/dist/src/agents/planning/api-pm/output-format.md +317 -0
  97. package/dist/src/agents/planning/api-pm/workflow.md +214 -0
  98. package/dist/src/agents/reviewer/ai-reviewer/critical-reminders.md +23 -0
  99. package/dist/src/agents/reviewer/ai-reviewer/critical-requirements.md +19 -0
  100. package/dist/src/agents/reviewer/ai-reviewer/examples.md +131 -0
  101. package/dist/src/agents/reviewer/ai-reviewer/intro.md +23 -0
  102. package/dist/src/agents/reviewer/ai-reviewer/metadata.yaml +10 -0
  103. package/dist/src/agents/reviewer/ai-reviewer/output-format.md +263 -0
  104. package/dist/src/agents/reviewer/ai-reviewer/workflow.md +177 -0
  105. package/dist/src/agents/reviewer/infra-reviewer/critical-reminders.md +21 -0
  106. package/dist/src/agents/reviewer/infra-reviewer/critical-requirements.md +19 -0
  107. package/dist/src/agents/reviewer/infra-reviewer/examples.md +123 -0
  108. package/dist/src/agents/reviewer/infra-reviewer/intro.md +25 -0
  109. package/dist/src/agents/reviewer/infra-reviewer/metadata.yaml +10 -0
  110. package/dist/src/agents/reviewer/infra-reviewer/output-format.md +240 -0
  111. package/dist/src/agents/reviewer/infra-reviewer/workflow.md +250 -0
  112. package/dist/src/agents/tester/api-tester/critical-reminders.md +23 -0
  113. package/dist/src/agents/tester/api-tester/critical-requirements.md +19 -0
  114. package/dist/src/agents/tester/api-tester/examples.md +74 -0
  115. package/dist/src/agents/tester/api-tester/intro.md +21 -0
  116. package/dist/src/agents/tester/api-tester/metadata.yaml +12 -0
  117. package/dist/src/agents/tester/api-tester/output-format.md +209 -0
  118. package/dist/src/agents/tester/api-tester/workflow.md +364 -0
  119. package/dist/stores/wizard-store.js +1 -1
  120. package/dist/stores/wizard-store.test.js +17 -17
  121. package/dist/stores/wizard-store.test.js.map +1 -1
  122. package/package.json +1 -1
  123. package/src/agents/developer/ai-developer/critical-reminders.md +31 -0
  124. package/src/agents/developer/ai-developer/critical-requirements.md +17 -0
  125. package/src/agents/developer/ai-developer/examples.md +137 -0
  126. package/src/agents/developer/ai-developer/intro.md +23 -0
  127. package/src/agents/developer/ai-developer/metadata.yaml +12 -0
  128. package/src/agents/developer/ai-developer/output-format.md +228 -0
  129. package/src/agents/developer/ai-developer/workflow.md +464 -0
  130. package/src/agents/planning/api-pm/critical-reminders.md +32 -0
  131. package/src/agents/planning/api-pm/critical-requirements.md +21 -0
  132. package/src/agents/planning/api-pm/examples.md +157 -0
  133. package/src/agents/planning/api-pm/intro.md +14 -0
  134. package/src/agents/planning/api-pm/metadata.yaml +12 -0
  135. package/src/agents/planning/api-pm/output-format.md +317 -0
  136. package/src/agents/planning/api-pm/workflow.md +214 -0
  137. package/src/agents/reviewer/ai-reviewer/critical-reminders.md +23 -0
  138. package/src/agents/reviewer/ai-reviewer/critical-requirements.md +19 -0
  139. package/src/agents/reviewer/ai-reviewer/examples.md +131 -0
  140. package/src/agents/reviewer/ai-reviewer/intro.md +23 -0
  141. package/src/agents/reviewer/ai-reviewer/metadata.yaml +10 -0
  142. package/src/agents/reviewer/ai-reviewer/output-format.md +263 -0
  143. package/src/agents/reviewer/ai-reviewer/workflow.md +177 -0
  144. package/src/agents/reviewer/infra-reviewer/critical-reminders.md +21 -0
  145. package/src/agents/reviewer/infra-reviewer/critical-requirements.md +19 -0
  146. package/src/agents/reviewer/infra-reviewer/examples.md +123 -0
  147. package/src/agents/reviewer/infra-reviewer/intro.md +25 -0
  148. package/src/agents/reviewer/infra-reviewer/metadata.yaml +10 -0
  149. package/src/agents/reviewer/infra-reviewer/output-format.md +240 -0
  150. package/src/agents/reviewer/infra-reviewer/workflow.md +250 -0
  151. package/src/agents/tester/api-tester/critical-reminders.md +23 -0
  152. package/src/agents/tester/api-tester/critical-requirements.md +19 -0
  153. package/src/agents/tester/api-tester/examples.md +74 -0
  154. package/src/agents/tester/api-tester/intro.md +21 -0
  155. package/src/agents/tester/api-tester/metadata.yaml +12 -0
  156. package/src/agents/tester/api-tester/output-format.md +209 -0
  157. package/src/agents/tester/api-tester/workflow.md +364 -0
  158. package/dist/chunk-4ITKYWVG.js.map +0 -1
  159. package/dist/chunk-BO4JY7BT.js.map +0 -1
  160. package/dist/chunk-FGVCQBXH.js +0 -143
  161. package/dist/chunk-FGVCQBXH.js.map +0 -1
  162. package/dist/chunk-FQTYF3OU.js +0 -114
  163. package/dist/chunk-FQTYF3OU.js.map +0 -1
  164. package/dist/chunk-O423DMUE.js +0 -111
  165. package/dist/chunk-O423DMUE.js.map +0 -1
  166. package/dist/chunk-VJBCOPMG.js.map +0 -1
  167. /package/dist/{chunk-OWPIGGPP.js.map → chunk-2RXDM5HN.js.map} +0 -0
  168. /package/dist/{chunk-JI44SVMW.js.map → chunk-35WALWDD.js.map} +0 -0
  169. /package/dist/{chunk-D254XO7K.js.map → chunk-3O57Z6Q3.js.map} +0 -0
  170. /package/dist/{chunk-TWOHWCKS.js.map → chunk-3STOCHK4.js.map} +0 -0
  171. /package/dist/{chunk-SB2R5KHJ.js.map → chunk-BGICSUQK.js.map} +0 -0
  172. /package/dist/{chunk-I5AZKNNL.js.map → chunk-FEKVKYCN.js.map} +0 -0
  173. /package/dist/{chunk-7AUGC7PK.js.map → chunk-G3VPBEBC.js.map} +0 -0
  174. /package/dist/{chunk-3T5XT2VU.js.map → chunk-MBEXASMU.js.map} +0 -0
  175. /package/dist/{chunk-TEA5KBIA.js.map → chunk-NESVWSI7.js.map} +0 -0
  176. /package/dist/{chunk-TP6BX5M2.js.map → chunk-RDQBXB3Y.js.map} +0 -0
  177. /package/dist/{chunk-VYLF4IIK.js.map → chunk-TJHCK4OS.js.map} +0 -0
  178. /package/dist/{chunk-Z5FXZFX2.js.map → chunk-UK572773.js.map} +0 -0
  179. /package/dist/components/wizard/{help-modal.js.map → info-panel.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-build.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { indexBy } from \"remeda\";\nimport { describe, expect, it, beforeEach, afterEach, vi } from \"vitest\";\nimport { StepBuild, type StepBuildProps } from \"./step-build\";\nimport { validateBuildStep } from \"../../lib/wizard/index\";\nimport { orderDomains } from \"./utils\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n CategoryDefinition,\n Domain,\n ResolvedSkill,\n Category,\n CategorySelections,\n SkillId,\n} from \"../../types\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockSkill, createMockMatrix, SKILLS } from \"../../lib/__tests__/helpers\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport {\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n CLI_FRAMEWORK_CATEGORY,\n} from \"../../lib/__tests__/mock-data/mock-categories.js\";\n\nconst buildTestMatrix = (categories: CategoryDefinition[], skills: ResolvedSkill[]) =>\n createMockMatrix(...skills, {\n // Test data construction cast: indexBy returns generic Record\n categories: indexBy(categories, (c) => c.id) as Record<Category, CategoryDefinition>,\n });\n\nconst defaultMatrix = buildTestMatrix(\n [\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n ],\n [\n SKILLS.react,\n SKILLS.vue,\n SKILLS.tailwind,\n SKILLS.scss,\n SKILLS.zustand,\n SKILLS.hono,\n SKILLS.drizzle,\n ],\n);\n\nconst defaultProps: StepBuildProps = {\n domain: \"web\",\n selectedDomains: [\"web\"],\n selections: {},\n allSelections: [],\n showLabels: false,\n filterIncompatible: false,\n onToggle: vi.fn(),\n onToggleLabels: vi.fn(),\n onToggleFilterIncompatible: 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\ndescribe(\"StepBuild component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n initializeMatrix(defaultMatrix);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render CategoryGrid with correct categories for domain\", () => {\n // For web domain with framework-first flow, initially only shows Framework\n // To see other categories, need a framework selection\n const { lastFrame, unmount } = renderStepBuild({\n selections: { \"web-framework\": [\"web-framework-react\"] }, // Framework selected to show other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Web domain should show Framework, Styling, Client State (when framework selected)\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 // Need framework selected to see other categories in web domain\n const { lastFrame, unmount } = renderStepBuild({\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework skills\n expect(output).toContain(\"React\");\n expect(output).toContain(\"Vue\");\n // Styling skills (visible after framework selected)\n expect(output).toContain(\"Tailwind\");\n expect(output).toContain(\"Scss Modules\");\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 render categories for the domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render the domain categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"domain header\", () => {\n it(\"should render domain categories when multiple domains selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify domain content renders (title shown by wizard-layout)\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should render domain categories when only one selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should render correct categories for final domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n\n it(\"should render correct categories for domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\", \"cli\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n\n it(\"should display domains in canonical order regardless of selection order\", () => {\n // Domains selected in reverse order: CLI, Mobile, API, Web\n expect(orderDomains([\"cli\", \"mobile\", \"api\", \"web\"])).toEqual([\n \"web\",\n \"api\",\n \"mobile\",\n \"cli\",\n ]);\n });\n\n it(\"should preserve canonical order with partial domain selection\", () => {\n // Only CLI and Web selected, in reverse order\n expect(orderDomains([\"cli\", \"web\"])).toEqual([\"web\", \"cli\"]);\n });\n\n it(\"should place custom domains before built-in domains\", () => {\n expect(orderDomains([\"web\", \"gaming\" as Domain, \"api\", \"devops\" as Domain])).toEqual([\n \"devops\",\n \"gaming\",\n \"web\",\n \"api\",\n ]);\n });\n });\n\n describe(\"category filtering\", () => {\n it(\"should filter categories correctly by domain\", () => {\n // Web domain with framework selected (to bypass framework-first filter)\n const { lastFrame: webFrame, unmount: webUnmount } = renderStepBuild({\n domain: \"web\",\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\n const webOutput = webFrame();\n webUnmount();\n\n // API domain (no framework-first filter for API)\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 (with framework selected)\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 // Need framework selected to see all categories\n const { lastFrame, unmount } = renderStepBuild({\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\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 describe(\"option states\", () => {\n it(\"should show selected options correctly\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [\"web-framework-react\"],\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show selected option (no circle symbol anymore, uses background)\n // Just verify the selected label is present\n expect(output).toContain(\"React\");\n });\n\n it(\"should pass showLabels to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showLabels: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels toggle is now shown globally in wizard-layout\n // Verify component renders without error\n expect(output).toBeDefined();\n });\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 \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n 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 stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).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 });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Space should trigger toggle\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n });\n\n describe(\"toggle callbacks\", () => {\n it(\"should pass onToggleLabels to CategoryGrid\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleLabels });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\"); // 'd' key toggles compatibility labels\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\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: \"shared\",\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: [\"api-framework-hono\", \"api-database-drizzle\"], // API skills in test matrix\n selections: { \"web-framework\": [\"web-framework-react\"] }, // Need framework to see other categories\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 describe(\"multi-domain scenarios\", () => {\n it(\"should render web categories in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should render API categories for last domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n\n it(\"should render correct domain categories in three-domain flow\", () => {\n // Add cli category to matrix\n const cliFrameworkCategory = { ...CLI_FRAMEWORK_CATEGORY, required: true, order: 0 };\n // Boundary cast: fictional skill ID for testing CLI domain display\n const commanderSkill = createMockSkill(\"cli-framework-commander\" as SkillId, {\n displayName: \"commander\",\n });\n\n const matrixWithCli = buildTestMatrix(\n [\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n cliFrameworkCategory,\n ],\n [\n SKILLS.react,\n SKILLS.vue,\n SKILLS.tailwind,\n SKILLS.scss,\n SKILLS.zustand,\n SKILLS.hono,\n SKILLS.drizzle,\n commanderSkill,\n ],\n );\n\n initializeMatrix(matrixWithCli);\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\", \"cli\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n });\n\n describe(\"header and selection count\", () => {\n it(\"should render categories for the current domain\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify domain content renders (title shown by wizard-layout)\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should render categories for API domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n });\n\n describe(\"keyboard help text\", () => {\n it(\"should respond to d key for toggling compatibility labels\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleLabels });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\n });\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", state: { status: \"normal\" }, selected: true }],\n },\n ];\n const selections: CategorySelections = { \"web-framework\": [\"web-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 advisory message when required category has no selection\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", state: { status: \"normal\" }, selected: false }],\n },\n ];\n const selections: CategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\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: \"web-client-state\",\n displayName: \"State Management\",\n required: false,\n exclusive: true,\n options: [\n {\n id: \"web-state-zustand\",\n state: { status: \"normal\" },\n selected: false,\n },\n ],\n },\n ];\n const selections: CategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n });\n\n it(\"should return advisory message for first missing required category\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"web-styling\",\n displayName: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections: CategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n expect(result.message).toContain(\"Framework\"); // Should be the first one\n });\n });\n\n describe(\"validation on continue\", () => {\n it(\"should call onContinue even without required selection (advisory only)\", async () => {\n const onContinue = vi.fn();\n const { stdin, 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 stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Validation is advisory — onContinue is always called\n expect(onContinue).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 \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue with required selections\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-build.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { indexBy } from \"remeda\";\nimport { describe, expect, it, beforeEach, afterEach, vi } from \"vitest\";\nimport { StepBuild, type StepBuildProps } from \"./step-build\";\nimport { validateBuildStep } from \"../../lib/wizard/index\";\nimport { orderDomains } from \"./utils\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n CategoryDefinition,\n Domain,\n ResolvedSkill,\n Category,\n CategorySelections,\n SkillId,\n} from \"../../types\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockSkill, createMockMatrix, SKILLS } from \"../../lib/__tests__/helpers\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport {\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n CLI_FRAMEWORK_CATEGORY,\n} from \"../../lib/__tests__/mock-data/mock-categories.js\";\n\nconst buildTestMatrix = (categories: CategoryDefinition[], skills: ResolvedSkill[]) =>\n createMockMatrix(...skills, {\n // Test data construction cast: indexBy returns generic Record\n categories: indexBy(categories, (c) => c.id) as Record<Category, CategoryDefinition>,\n });\n\nconst defaultMatrix = buildTestMatrix(\n [\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n ],\n [\n SKILLS.react,\n SKILLS.vue,\n SKILLS.tailwind,\n SKILLS.scss,\n SKILLS.zustand,\n SKILLS.hono,\n SKILLS.drizzle,\n ],\n);\n\nconst defaultProps: StepBuildProps = {\n domain: \"web\",\n selectedDomains: [\"web\"],\n selections: {},\n allSelections: [],\n showLabels: false,\n filterIncompatible: false,\n onToggle: vi.fn(),\n onToggleLabels: vi.fn(),\n onToggleFilterIncompatible: 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\ndescribe(\"StepBuild component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n initializeMatrix(defaultMatrix);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render CategoryGrid with correct categories for domain\", () => {\n // For web domain with framework-first flow, initially only shows Framework\n // To see other categories, need a framework selection\n const { lastFrame, unmount } = renderStepBuild({\n selections: { \"web-framework\": [\"web-framework-react\"] }, // Framework selected to show other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Web domain should show Framework, Styling, Client State (when framework selected)\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 // Need framework selected to see other categories in web domain\n const { lastFrame, unmount } = renderStepBuild({\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework skills\n expect(output).toContain(\"React\");\n expect(output).toContain(\"Vue\");\n // Styling skills (visible after framework selected)\n expect(output).toContain(\"Tailwind\");\n expect(output).toContain(\"Scss Modules\");\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 render categories for the domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render the domain categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"domain header\", () => {\n it(\"should render domain categories when multiple domains selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify domain content renders (title shown by wizard-layout)\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should render domain categories when only one selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should render correct categories for final domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n\n it(\"should render correct categories for domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\", \"cli\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n\n it(\"should display domains in canonical order regardless of selection order\", () => {\n // Domains selected in reverse order: CLI, Mobile, API, Web\n expect(orderDomains([\"cli\", \"mobile\", \"api\", \"web\"])).toEqual([\n \"web\",\n \"api\",\n \"mobile\",\n \"cli\",\n ]);\n });\n\n it(\"should preserve canonical order with partial domain selection\", () => {\n // Only CLI and Web selected, in reverse order\n expect(orderDomains([\"cli\", \"web\"])).toEqual([\"web\", \"cli\"]);\n });\n\n it(\"should place custom domains before built-in domains\", () => {\n expect(orderDomains([\"web\", \"gaming\" as Domain, \"api\", \"devops\" as Domain])).toEqual([\n \"devops\",\n \"gaming\",\n \"web\",\n \"api\",\n ]);\n });\n });\n\n describe(\"category filtering\", () => {\n it(\"should filter categories correctly by domain\", () => {\n // Web domain with framework selected (to bypass framework-first filter)\n const { lastFrame: webFrame, unmount: webUnmount } = renderStepBuild({\n domain: \"web\",\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\n const webOutput = webFrame();\n webUnmount();\n\n // API domain (no framework-first filter for API)\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 (with framework selected)\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 // Need framework selected to see all categories\n const { lastFrame, unmount } = renderStepBuild({\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\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 describe(\"option states\", () => {\n it(\"should show selected options correctly\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [\"web-framework-react\"],\n selections: { \"web-framework\": [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show selected option (no circle symbol anymore, uses background)\n // Just verify the selected label is present\n expect(output).toContain(\"React\");\n });\n\n it(\"should pass showLabels to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showLabels: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels toggle is now shown globally in wizard-layout\n // Verify component renders without error\n expect(output).toBeDefined();\n });\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 \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n 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 stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).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 });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Space should trigger toggle\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n });\n\n describe(\"toggle callbacks\", () => {\n it(\"should pass onToggleLabels to CategoryGrid\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleLabels });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\"); // 'd' key toggles compatibility labels\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\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: \"shared\",\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: [\"api-framework-hono\", \"api-database-drizzle\"], // API skills in test matrix\n selections: { \"web-framework\": [\"web-framework-react\"] }, // Need framework to see other categories\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 describe(\"multi-domain scenarios\", () => {\n it(\"should render web categories in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should render API categories for last domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n\n it(\"should render correct domain categories in three-domain flow\", () => {\n // Add cli category to matrix\n const cliFrameworkCategory = { ...CLI_FRAMEWORK_CATEGORY, required: true, order: 0 };\n // Boundary cast: fictional skill ID for testing CLI domain display\n const commanderSkill = createMockSkill(\"cli-framework-commander\" as SkillId, {\n displayName: \"commander\",\n });\n\n const matrixWithCli = buildTestMatrix(\n [\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n cliFrameworkCategory,\n ],\n [\n SKILLS.react,\n SKILLS.vue,\n SKILLS.tailwind,\n SKILLS.scss,\n SKILLS.zustand,\n SKILLS.hono,\n SKILLS.drizzle,\n commanderSkill,\n ],\n );\n\n initializeMatrix(matrixWithCli);\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\", \"cli\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n });\n\n describe(\"header and selection count\", () => {\n it(\"should render categories for the current domain\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify domain content renders (title shown by wizard-layout)\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should render categories for API domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"API Framework\");\n });\n });\n\n describe(\"keyboard help text\", () => {\n it(\"should respond to d key for toggling compatibility labels\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleLabels });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\n });\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", state: { status: \"normal\" }, selected: true }],\n },\n ];\n const selections: CategorySelections = { \"web-framework\": [\"web-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 advisory message when required category has no selection\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", state: { status: \"normal\" }, selected: false }],\n },\n ];\n const selections: CategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\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: \"web-client-state\",\n displayName: \"State Management\",\n required: false,\n exclusive: true,\n options: [\n {\n id: \"web-state-zustand\",\n state: { status: \"normal\" },\n selected: false,\n },\n ],\n },\n ];\n const selections: CategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n });\n\n it(\"should return advisory message for first missing required category\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"web-styling\",\n displayName: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections: CategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n expect(result.message).toContain(\"Framework\"); // Should be the first one\n });\n });\n\n describe(\"validation on continue\", () => {\n it(\"should call onContinue even without required selection (advisory only)\", async () => {\n const onContinue = vi.fn();\n const { stdin, 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 stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Validation is advisory — onContinue is always called\n expect(onContinue).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 \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue with required selections\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA,SAAS,eAAe;AAwER;AAxChB,IAAM,kBAAkB,CAAC,YAAkC,WACzD,iBAAiB,GAAG,QAAQ;AAAA;AAAA,EAE1B,YAAY,QAAQ,YAAY,CAAC,MAAM,EAAE,EAAE;AAC7C,CAAC;AAEH,IAAM,gBAAgB;AAAA,EACpB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;AAEA,IAAM,eAA+B;AAAA,EACnC,QAAQ;AAAA,EACR,iBAAiB,CAAC,KAAK;AAAA,EACvB,YAAY,CAAC;AAAA,EACb,eAAe,CAAC;AAAA,EAChB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,UAAU,GAAG,GAAG;AAAA,EAChB,gBAAgB,GAAG,GAAG;AAAA,EACtB,4BAA4B,GAAG,GAAG;AAAA,EAClC,YAAY,GAAG,GAAG;AAAA,EAClB,QAAQ,GAAG,GAAG;AAChB;AAEA,IAAM,kBAAkB,CAAC,QAAiC,CAAC,MAAM;AAC/D,SAAO,OAAO,oBAAC,aAAW,GAAG,cAAe,GAAG,OAAO,CAAE;AAC1D;AAEA,SAAS,uBAAuB,MAAM;AACpC,MAAI;AAEJ,aAAW,MAAM;AACf,qBAAiB,aAAa;AAAA,EAChC,CAAC;AAED,YAAU,MAAM;AACd,cAAU;AACV,cAAU;AAAA,EACZ,CAAC;AAED,WAAS,aAAa,MAAM;AAC1B,OAAG,iEAAiE,MAAM;AAGxE,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;AAAA;AAAA,MACzD,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,WAAW;AACpC,mBAAO,MAAM,EAAE,UAAU,SAAS;AAClC,mBAAO,MAAM,EAAE,UAAU,cAAc;AAEvC,mBAAO,MAAM,EAAE,IAAI,UAAU,eAAe;AAC5C,mBAAO,MAAM,EAAE,IAAI,UAAU,UAAU;AAAA,IACzC,CAAC;AAED,OAAG,mDAAmD,MAAM;AAC1D,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,QAAQ;AAAA,MACV,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,eAAe;AACxC,mBAAO,MAAM,EAAE,UAAU,UAAU;AAEnC,mBAAO,MAAM,EAAE,IAAI,UAAU,SAAS;AACtC,mBAAO,MAAM,EAAE,IAAI,UAAU,cAAc;AAAA,IAC7C,CAAC;AAED,OAAG,mCAAmC,MAAM;AAE1C,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;AAAA,MACzD,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,OAAO;AAChC,mBAAO,MAAM,EAAE,UAAU,KAAK;AAE9B,mBAAO,MAAM,EAAE,UAAU,UAAU;AACnC,mBAAO,MAAM,EAAE,UAAU,cAAc;AAAA,IACzC,CAAC;AAED,OAAG,8DAA8D,MAAM;AACrE,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAC/C,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,GAAG;AAAA,IAC9B,CAAC;AAED,OAAG,2CAA2C,MAAM;AAClD,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;AAAA,MACzD,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,WAAW;AACpC,mBAAO,MAAM,EAAE,UAAU,SAAS;AAAA,IACpC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,iBAAiB,MAAM;AAC9B,OAAG,kEAAkE,MAAM;AACzE,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,iBAAiB,CAAC,OAAO,KAAK;AAAA,MAChC,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,WAAW;AAAA,IACtC,CAAC;AAED,OAAG,0DAA0D,MAAM;AACjE,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,iBAAiB,CAAC,KAAK;AAAA,MACzB,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AACzB,mBAAO,MAAM,EAAE,UAAU,WAAW;AAAA,IACtC,CAAC;AAED,OAAG,qDAAqD,MAAM;AAC5D,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,iBAAiB,CAAC,OAAO,KAAK;AAAA,QAC9B,QAAQ;AAAA,MACV,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AACzB,mBAAO,MAAM,EAAE,UAAU,eAAe;AAAA,IAC1C,CAAC;AAED,OAAG,+CAA+C,MAAM;AACtD,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,iBAAiB,CAAC,OAAO,OAAO,KAAK;AAAA,QACrC,QAAQ;AAAA,MACV,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AACzB,mBAAO,MAAM,EAAE,UAAU,eAAe;AAAA,IAC1C,CAAC;AAED,OAAG,2EAA2E,MAAM;AAElF,mBAAO,aAAa,CAAC,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,EAAE,QAAQ;AAAA,QAC5D;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,OAAG,iEAAiE,MAAM;AAExE,mBAAO,aAAa,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,KAAK,CAAC;AAAA,IAC7D,CAAC;AAED,OAAG,uDAAuD,MAAM;AAC9D,mBAAO,aAAa,CAAC,OAAO,UAAoB,OAAO,QAAkB,CAAC,CAAC,EAAE,QAAQ;AAAA,QACnF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,WAAS,sBAAsB,MAAM;AACnC,OAAG,gDAAgD,MAAM;AAEvD,YAAM,EAAE,WAAW,UAAU,SAAS,WAAW,IAAI,gBAAgB;AAAA,QACnE,QAAQ;AAAA,QACR,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;AAAA,MACzD,CAAC;AACD,YAAM,YAAY,SAAS;AAC3B,iBAAW;AAGX,YAAM,EAAE,WAAW,UAAU,SAAS,WAAW,IAAI,gBAAgB;AAAA,QACnE,QAAQ;AAAA,MACV,CAAC;AACD,gBAAU;AACV,YAAM,YAAY,SAAS;AAG3B,mBAAO,SAAS,EAAE,UAAU,WAAW;AACvC,mBAAO,SAAS,EAAE,UAAU,SAAS;AACrC,mBAAO,SAAS,EAAE,UAAU,cAAc;AAC1C,mBAAO,SAAS,EAAE,IAAI,UAAU,eAAe;AAG/C,mBAAO,SAAS,EAAE,UAAU,eAAe;AAC3C,mBAAO,SAAS,EAAE,UAAU,UAAU;AACtC,mBAAO,SAAS,EAAE,IAAI,UAAU,SAAS;AAAA,IAC3C,CAAC;AAED,OAAG,mCAAmC,MAAM;AAE1C,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;AAAA,MACzD,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAGzB,YAAM,iBAAiB,QAAQ,QAAQ,WAAW,KAAK;AACvD,YAAM,eAAe,QAAQ,QAAQ,SAAS,KAAK;AACnD,YAAM,aAAa,QAAQ,QAAQ,cAAc,KAAK;AAEtD,mBAAO,cAAc,EAAE,aAAa,YAAY;AAChD,mBAAO,YAAY,EAAE,aAAa,UAAU;AAAA,IAC9C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,iBAAiB,MAAM;AAC9B,OAAG,0CAA0C,MAAM;AACjD,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,eAAe,CAAC,qBAAqB;AAAA,QACrC,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;AAAA,MACzD,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAGzB,mBAAO,MAAM,EAAE,UAAU,OAAO;AAAA,IAClC,CAAC;AAED,OAAG,0CAA0C,MAAM;AACjD,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,YAAY;AAAA,MACd,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAGzB,mBAAO,MAAM,EAAE,YAAY;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;AAED,WAAS,uBAAuB,MAAM;AACpC,OAAG,sEAAsE,YAAY;AACnF,YAAM,aAAa,GAAG,GAAG;AAEzB,YAAM,EAAE,OAAO,QAAQ,IAAI,gBAAgB;AAAA,QACzC;AAAA,QACA,YAAY;AAAA,UACV,iBAAiB,CAAC,qBAAqB;AAAA,UACvC,eAAe,CAAC,sBAAsB;AAAA,QACxC;AAAA,MACF,CAAC;AACD,gBAAU;AAEV,YAAM,MAAM,eAAe;AAC3B,YAAM,MAAM,KAAK;AACjB,YAAM,MAAM,cAAc;AAE1B,mBAAO,UAAU,EAAE,iBAAiB;AAAA,IACtC,CAAC;AAED,OAAG,6CAA6C,YAAY;AAC1D,YAAM,SAAS,GAAG,GAAG;AACrB,YAAM,EAAE,OAAO,QAAQ,IAAI,gBAAgB,EAAE,OAAO,CAAC;AACrD,gBAAU;AAEV,YAAM,MAAM,eAAe;AAC3B,YAAM,MAAM,MAAM;AAClB,YAAM,MAAM,cAAc;AAE1B,mBAAO,MAAM,EAAE,iBAAiB;AAAA,IAClC,CAAC;AAED,OAAG,+CAA+C,YAAY;AAC5D,YAAM,WAAW,GAAG,GAAG;AACvB,YAAM,EAAE,OAAO,QAAQ,IAAI,gBAAgB;AAAA,QACzC;AAAA,MACF,CAAC;AACD,gBAAU;AAEV,YAAM,MAAM,eAAe;AAE3B,YAAM,MAAM,GAAG;AACf,YAAM,MAAM,cAAc;AAE1B,mBAAO,QAAQ,EAAE,iBAAiB;AAAA,IACpC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,oBAAoB,MAAM;AACjC,OAAG,8CAA8C,YAAY;AAC3D,YAAM,iBAAiB,GAAG,GAAG;AAC7B,YAAM,EAAE,OAAO,QAAQ,IAAI,gBAAgB,EAAE,eAAe,CAAC;AAC7D,gBAAU;AAEV,YAAM,MAAM,eAAe;AAC3B,YAAM,MAAM,GAAG;AACf,YAAM,MAAM,cAAc;AAE1B,mBAAO,cAAc,EAAE,iBAAiB;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,cAAc,MAAM;AAC3B,OAAG,2CAA2C,MAAM;AAClD,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,QAAQ;AAAA;AAAA,MACV,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,0BAA0B;AAAA,IACrD,CAAC;AAED,OAAG,2CAA2C,MAAM;AAClD,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,QAAQ;AAAA,MACV,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,YAAY;AAAA,IAC7B,CAAC;AAED,OAAG,qCAAqC,MAAM;AAC5C,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,eAAe,CAAC;AAAA,MAClB,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AACzB,mBAAO,MAAM,EAAE,UAAU,WAAW;AAAA,IACtC,CAAC;AAED,OAAG,8DAA8D,MAAM;AACrE,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,QAAQ;AAAA,QACR,eAAe,CAAC,sBAAsB,sBAAsB;AAAA;AAAA,QAC5D,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;AAAA;AAAA,MACzD,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,WAAW;AACpC,mBAAO,MAAM,EAAE,UAAU,SAAS;AAAA,IACpC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,0BAA0B,MAAM;AACvC,OAAG,qDAAqD,MAAM;AAC5D,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,QAAQ;AAAA,QACR,iBAAiB,CAAC,OAAO,KAAK;AAAA,MAChC,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AACzB,mBAAO,MAAM,EAAE,UAAU,WAAW;AAAA,IACtC,CAAC;AAED,OAAG,qEAAqE,MAAM;AAC5E,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,QAAQ;AAAA,QACR,iBAAiB,CAAC,OAAO,KAAK;AAAA,MAChC,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AACzB,mBAAO,MAAM,EAAE,UAAU,eAAe;AAAA,IAC1C,CAAC;AAED,OAAG,gEAAgE,MAAM;AAEvE,YAAM,uBAAuB,EAAE,GAAG,wBAAwB,UAAU,MAAM,OAAO,EAAE;AAEnF,YAAM,iBAAiB,gBAAgB,2BAAsC;AAAA,QAC3E,aAAa;AAAA,MACf,CAAC;AAED,YAAM,gBAAgB;AAAA,QACpB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAEA,uBAAiB,aAAa;AAC9B,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,QAAQ;AAAA,QACR,iBAAiB,CAAC,OAAO,OAAO,KAAK;AAAA,MACvC,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AACzB,mBAAO,MAAM,EAAE,UAAU,eAAe;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,8BAA8B,MAAM;AAC3C,OAAG,mDAAmD,MAAM;AAC1D,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAC/C,gBAAU;AAEV,YAAM,SAAS,UAAU;AAEzB,mBAAO,MAAM,EAAE,UAAU,WAAW;AAAA,IACtC,CAAC;AAED,OAAG,2CAA2C,MAAM;AAClD,YAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB;AAAA,QAC7C,QAAQ;AAAA,MACV,CAAC;AACD,gBAAU;AAEV,YAAM,SAAS,UAAU;AACzB,mBAAO,MAAM,EAAE,UAAU,eAAe;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,sBAAsB,MAAM;AACnC,OAAG,6DAA6D,YAAY;AAC1E,YAAM,iBAAiB,GAAG,GAAG;AAC7B,YAAM,EAAE,OAAO,QAAQ,IAAI,gBAAgB,EAAE,eAAe,CAAC;AAC7D,gBAAU;AAEV,YAAM,MAAM,eAAe;AAC3B,YAAM,MAAM,GAAG;AACf,YAAM,MAAM,cAAc;AAE1B,mBAAO,cAAc,EAAE,iBAAiB;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,qBAAqB,MAAM;AAClC,OAAG,gEAAgE,MAAM;AACvE,YAAM,aAAgC;AAAA,QACpC;AAAA,UACE,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS,CAAC,EAAE,IAAI,uBAAuB,OAAO,EAAE,QAAQ,SAAS,GAAG,UAAU,KAAK,CAAC;AAAA,QACtF;AAAA,MACF;AACA,YAAM,aAAiC,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;AAElF,YAAM,SAAS,kBAAkB,YAAY,UAAU;AACvD,mBAAO,OAAO,KAAK,EAAE,KAAK,IAAI;AAC9B,mBAAO,OAAO,OAAO,EAAE,cAAc;AAAA,IACvC,CAAC;AAED,OAAG,0EAA0E,MAAM;AACjF,YAAM,aAAgC;AAAA,QACpC;AAAA,UACE,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS,CAAC,EAAE,IAAI,uBAAuB,OAAO,EAAE,QAAQ,SAAS,GAAG,UAAU,MAAM,CAAC;AAAA,QACvF;AAAA,MACF;AACA,YAAM,aAAiC,CAAC;AAExC,YAAM,SAAS,kBAAkB,YAAY,UAAU;AACvD,mBAAO,OAAO,KAAK,EAAE,KAAK,IAAI;AAC9B,mBAAO,OAAO,OAAO,EAAE,UAAU,WAAW;AAAA,IAC9C,CAAC;AAED,OAAG,mEAAmE,MAAM;AAC1E,YAAM,aAAgC;AAAA,QACpC;AAAA,UACE,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS;AAAA,YACP;AAAA,cACE,IAAI;AAAA,cACJ,OAAO,EAAE,QAAQ,SAAS;AAAA,cAC1B,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,YAAM,aAAiC,CAAC;AAExC,YAAM,SAAS,kBAAkB,YAAY,UAAU;AACvD,mBAAO,OAAO,KAAK,EAAE,KAAK,IAAI;AAAA,IAChC,CAAC;AAED,OAAG,sEAAsE,MAAM;AAC7E,YAAM,aAAgC;AAAA,QACpC;AAAA,UACE,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS,CAAC;AAAA,QACZ;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS,CAAC;AAAA,QACZ;AAAA,MACF;AACA,YAAM,aAAiC,CAAC;AAExC,YAAM,SAAS,kBAAkB,YAAY,UAAU;AACvD,mBAAO,OAAO,KAAK,EAAE,KAAK,IAAI;AAC9B,mBAAO,OAAO,OAAO,EAAE,UAAU,WAAW;AAAA,IAC9C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,0BAA0B,MAAM;AACvC,OAAG,0EAA0E,YAAY;AACvF,YAAM,aAAa,GAAG,GAAG;AACzB,YAAM,EAAE,OAAO,QAAQ,IAAI,gBAAgB;AAAA,QACzC;AAAA,QACA,YAAY,CAAC;AAAA,MACf,CAAC;AACD,gBAAU;AAEV,YAAM,MAAM,eAAe;AAG3B,YAAM,MAAM,KAAK;AACjB,YAAM,MAAM,cAAc;AAG1B,mBAAO,UAAU,EAAE,iBAAiB;AAAA,IACtC,CAAC;AAED,OAAG,iDAAiD,YAAY;AAC9D,YAAM,aAAa,GAAG,GAAG;AACzB,YAAM,EAAE,OAAO,QAAQ,IAAI,gBAAgB;AAAA,QACzC;AAAA,QACA,YAAY;AAAA,UACV,iBAAiB,CAAC,qBAAqB;AAAA,UACvC,eAAe,CAAC,sBAAsB;AAAA,QACxC;AAAA,MACF,CAAC;AACD,gBAAU;AAEV,YAAM,MAAM,eAAe;AAG3B,YAAM,MAAM,KAAK;AACjB,YAAM,MAAM,cAAc;AAE1B,mBAAO,UAAU,EAAE,iBAAiB;AAAA,IACtC,CAAC;AAAA,EACH,CAAC;AACH,CAAC;","names":[]}
@@ -22,7 +22,7 @@ import {
22
22
  StepConfirm
23
23
  } from "../../chunk-OVY7IV3C.js";
24
24
  import "../../chunk-UHARXISZ.js";
25
- import "../../chunk-4ITKYWVG.js";
25
+ import "../../chunk-V75HVZTB.js";
26
26
  import "../../chunk-FVBSRBU3.js";
27
27
  import "../../chunk-XM2Y5AFQ.js";
28
28
  import "../../chunk-47HMJ4BY.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepRefine
4
- } from "../../chunk-TEA5KBIA.js";
5
- import "../../chunk-HK53FRMU.js";
4
+ } from "../../chunk-NESVWSI7.js";
5
+ import "../../chunk-DVBA6PGR.js";
6
6
  import "../../chunk-6PGL2XMY.js";
7
7
  import "../../chunk-DHET7RCE.js";
8
8
  export {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepRefine
4
- } from "../../chunk-TEA5KBIA.js";
4
+ } from "../../chunk-NESVWSI7.js";
5
5
  import {
6
6
  ARROW_DOWN,
7
7
  ARROW_UP,
@@ -21,7 +21,7 @@ import {
21
21
  it,
22
22
  vi
23
23
  } from "../../chunk-XY3XDVMI.js";
24
- import "../../chunk-HK53FRMU.js";
24
+ import "../../chunk-DVBA6PGR.js";
25
25
  import {
26
26
  DEFAULT_BRANDING
27
27
  } from "../../chunk-6PGL2XMY.js";
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepSettings
4
- } from "../../chunk-TWOHWCKS.js";
4
+ } from "../../chunk-3STOCHK4.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
6
  import "../../chunk-4QA5TIBU.js";
7
7
  import "../../chunk-WJXWYSBT.js";
8
8
  import "../../chunk-KUV24B5M.js";
9
9
  import "../../chunk-U3IGFMCY.js";
10
- import "../../chunk-HK53FRMU.js";
10
+ import "../../chunk-DVBA6PGR.js";
11
11
  import "../../chunk-FVBSRBU3.js";
12
12
  import "../../chunk-XM2Y5AFQ.js";
13
13
  import "../../chunk-47HMJ4BY.js";
@@ -19,13 +19,13 @@ import {
19
19
  } from "../../chunk-XY3XDVMI.js";
20
20
  import {
21
21
  StepSettings
22
- } from "../../chunk-TWOHWCKS.js";
22
+ } from "../../chunk-3STOCHK4.js";
23
23
  import "../../chunk-7SOPVGDV.js";
24
24
  import "../../chunk-4QA5TIBU.js";
25
25
  import "../../chunk-WJXWYSBT.js";
26
26
  import "../../chunk-KUV24B5M.js";
27
27
  import "../../chunk-U3IGFMCY.js";
28
- import "../../chunk-HK53FRMU.js";
28
+ import "../../chunk-DVBA6PGR.js";
29
29
  import "../../chunk-FVBSRBU3.js";
30
30
  import "../../chunk-XM2Y5AFQ.js";
31
31
  import "../../chunk-47HMJ4BY.js";
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepSources
4
- } from "../../chunk-TP6BX5M2.js";
5
- import "../../chunk-V36FRPAU.js";
4
+ } from "../../chunk-RDQBXB3Y.js";
5
+ import "../../chunk-ORTNQZLF.js";
6
6
  import "../../chunk-K77I4XGL.js";
7
7
  import "../../chunk-6XEZLWG5.js";
8
- import "../../chunk-JI44SVMW.js";
8
+ import "../../chunk-35WALWDD.js";
9
9
  import "../../chunk-7SOPVGDV.js";
10
- import "../../chunk-SB2R5KHJ.js";
10
+ import "../../chunk-BGICSUQK.js";
11
11
  import "../../chunk-P2FHS5IS.js";
12
12
  import "../../chunk-WJXWYSBT.js";
13
13
  import "../../chunk-XO6X5QE5.js";
14
14
  import "../../chunk-KUV24B5M.js";
15
- import "../../chunk-4ITKYWVG.js";
16
- import "../../chunk-HK53FRMU.js";
15
+ import "../../chunk-V75HVZTB.js";
16
+ import "../../chunk-DVBA6PGR.js";
17
17
  import "../../chunk-FVBSRBU3.js";
18
18
  import "../../chunk-XM2Y5AFQ.js";
19
19
  import "../../chunk-47HMJ4BY.js";
@@ -24,21 +24,21 @@ import {
24
24
  } from "../../chunk-XY3XDVMI.js";
25
25
  import {
26
26
  StepSources
27
- } from "../../chunk-TP6BX5M2.js";
28
- import "../../chunk-V36FRPAU.js";
27
+ } from "../../chunk-RDQBXB3Y.js";
28
+ import "../../chunk-ORTNQZLF.js";
29
29
  import "../../chunk-K77I4XGL.js";
30
30
  import "../../chunk-6XEZLWG5.js";
31
- import "../../chunk-JI44SVMW.js";
31
+ import "../../chunk-35WALWDD.js";
32
32
  import "../../chunk-7SOPVGDV.js";
33
- import "../../chunk-SB2R5KHJ.js";
33
+ import "../../chunk-BGICSUQK.js";
34
34
  import "../../chunk-P2FHS5IS.js";
35
35
  import "../../chunk-WJXWYSBT.js";
36
36
  import "../../chunk-XO6X5QE5.js";
37
37
  import "../../chunk-KUV24B5M.js";
38
38
  import {
39
39
  useWizardStore
40
- } from "../../chunk-4ITKYWVG.js";
41
- import "../../chunk-HK53FRMU.js";
40
+ } from "../../chunk-V75HVZTB.js";
41
+ import "../../chunk-DVBA6PGR.js";
42
42
  import "../../chunk-FVBSRBU3.js";
43
43
  import "../../chunk-XM2Y5AFQ.js";
44
44
  import {
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepStack
4
- } from "../../chunk-7AUGC7PK.js";
5
- import "../../chunk-Z5FXZFX2.js";
4
+ } from "../../chunk-G3VPBEBC.js";
5
+ import "../../chunk-UK572773.js";
6
6
  import "../../chunk-K77I4XGL.js";
7
7
  import "../../chunk-4QA5TIBU.js";
8
8
  import "../../chunk-WJXWYSBT.js";
9
- import "../../chunk-4ITKYWVG.js";
9
+ import "../../chunk-V75HVZTB.js";
10
10
  import "../../chunk-FVBSRBU3.js";
11
11
  import "../../chunk-XM2Y5AFQ.js";
12
12
  import "../../chunk-47HMJ4BY.js";
@@ -27,14 +27,14 @@ import {
27
27
  } from "../../chunk-XY3XDVMI.js";
28
28
  import {
29
29
  StepStack
30
- } from "../../chunk-7AUGC7PK.js";
31
- import "../../chunk-Z5FXZFX2.js";
30
+ } from "../../chunk-G3VPBEBC.js";
31
+ import "../../chunk-UK572773.js";
32
32
  import "../../chunk-K77I4XGL.js";
33
33
  import "../../chunk-4QA5TIBU.js";
34
34
  import "../../chunk-WJXWYSBT.js";
35
35
  import {
36
36
  useWizardStore
37
- } from "../../chunk-4ITKYWVG.js";
37
+ } from "../../chunk-V75HVZTB.js";
38
38
  import "../../chunk-FVBSRBU3.js";
39
39
  import "../../chunk-XM2Y5AFQ.js";
40
40
  import {
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  WizardLayout
4
- } from "../../chunk-VJBCOPMG.js";
4
+ } from "../../chunk-AWB6DO24.js";
5
5
  import "../../chunk-YVFGISUO.js";
6
- import "../../chunk-V36FRPAU.js";
6
+ import "../../chunk-ORTNQZLF.js";
7
7
  import "../../chunk-UHARXISZ.js";
8
- import "../../chunk-O423DMUE.js";
9
- import "../../chunk-4ITKYWVG.js";
10
- import "../../chunk-HK53FRMU.js";
8
+ import "../../chunk-7QWCPF6F.js";
9
+ import "../../chunk-V75HVZTB.js";
10
+ import "../../chunk-DVBA6PGR.js";
11
11
  import "../../chunk-FVBSRBU3.js";
12
12
  import "../../chunk-XM2Y5AFQ.js";
13
13
  import "../../chunk-47HMJ4BY.js";
@@ -1,37 +1,36 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Wizard
4
- } from "../../chunk-BO4JY7BT.js";
5
- import "../../chunk-VJBCOPMG.js";
4
+ } from "../../chunk-5IR4QU7G.js";
5
+ import "../../chunk-AWB6DO24.js";
6
6
  import "../../chunk-YVFGISUO.js";
7
- import "../../chunk-TWOHWCKS.js";
8
- import "../../chunk-TP6BX5M2.js";
9
- import "../../chunk-V36FRPAU.js";
10
- import "../../chunk-7AUGC7PK.js";
11
- import "../../chunk-Z5FXZFX2.js";
12
- import "../../chunk-VYLF4IIK.js";
13
- import "../../chunk-FGVCQBXH.js";
14
- import "../../chunk-FQTYF3OU.js";
7
+ import "../../chunk-3STOCHK4.js";
8
+ import "../../chunk-RDQBXB3Y.js";
9
+ import "../../chunk-ORTNQZLF.js";
10
+ import "../../chunk-G3VPBEBC.js";
11
+ import "../../chunk-UK572773.js";
12
+ import "../../chunk-TJHCK4OS.js";
13
+ import "../../chunk-M6J5YQ3P.js";
15
14
  import "../../chunk-K77I4XGL.js";
16
15
  import "../../chunk-OVY7IV3C.js";
17
16
  import "../../chunk-6XEZLWG5.js";
18
- import "../../chunk-JI44SVMW.js";
17
+ import "../../chunk-35WALWDD.js";
19
18
  import "../../chunk-7SOPVGDV.js";
20
- import "../../chunk-SB2R5KHJ.js";
21
- import "../../chunk-D254XO7K.js";
19
+ import "../../chunk-BGICSUQK.js";
20
+ import "../../chunk-3O57Z6Q3.js";
22
21
  import "../../chunk-P2FHS5IS.js";
23
- import "../../chunk-OWPIGGPP.js";
22
+ import "../../chunk-2RXDM5HN.js";
24
23
  import "../../chunk-UHARXISZ.js";
25
24
  import "../../chunk-HSKKGAOW.js";
26
25
  import "../../chunk-4QA5TIBU.js";
27
26
  import "../../chunk-WJXWYSBT.js";
28
- import "../../chunk-O423DMUE.js";
27
+ import "../../chunk-7QWCPF6F.js";
29
28
  import "../../chunk-XO6X5QE5.js";
30
29
  import "../../chunk-KUV24B5M.js";
31
- import "../../chunk-4ITKYWVG.js";
30
+ import "../../chunk-V75HVZTB.js";
32
31
  import "../../chunk-HEQVUIHQ.js";
33
32
  import "../../chunk-U3IGFMCY.js";
34
- import "../../chunk-HK53FRMU.js";
33
+ import "../../chunk-DVBA6PGR.js";
35
34
  import "../../chunk-FVBSRBU3.js";
36
35
  import "../../chunk-XM2Y5AFQ.js";
37
36
  import "../../chunk-47HMJ4BY.js";
@@ -1,38 +1,37 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  showDashboard
4
- } from "../chunk-3T5XT2VU.js";
5
- import "../chunk-BO4JY7BT.js";
6
- import "../chunk-VJBCOPMG.js";
4
+ } from "../chunk-MBEXASMU.js";
5
+ import "../chunk-5IR4QU7G.js";
6
+ import "../chunk-AWB6DO24.js";
7
7
  import "../chunk-YVFGISUO.js";
8
- import "../chunk-TWOHWCKS.js";
9
- import "../chunk-TP6BX5M2.js";
10
- import "../chunk-V36FRPAU.js";
11
- import "../chunk-7AUGC7PK.js";
12
- import "../chunk-Z5FXZFX2.js";
13
- import "../chunk-VYLF4IIK.js";
14
- import "../chunk-FGVCQBXH.js";
15
- import "../chunk-FQTYF3OU.js";
8
+ import "../chunk-3STOCHK4.js";
9
+ import "../chunk-RDQBXB3Y.js";
10
+ import "../chunk-ORTNQZLF.js";
11
+ import "../chunk-G3VPBEBC.js";
12
+ import "../chunk-UK572773.js";
13
+ import "../chunk-TJHCK4OS.js";
14
+ import "../chunk-M6J5YQ3P.js";
16
15
  import "../chunk-K77I4XGL.js";
17
16
  import "../chunk-OVY7IV3C.js";
18
17
  import "../chunk-6XEZLWG5.js";
19
- import "../chunk-JI44SVMW.js";
18
+ import "../chunk-35WALWDD.js";
20
19
  import "../chunk-7SOPVGDV.js";
21
- import "../chunk-SB2R5KHJ.js";
22
- import "../chunk-D254XO7K.js";
20
+ import "../chunk-BGICSUQK.js";
21
+ import "../chunk-3O57Z6Q3.js";
23
22
  import "../chunk-P2FHS5IS.js";
24
- import "../chunk-OWPIGGPP.js";
23
+ import "../chunk-2RXDM5HN.js";
25
24
  import "../chunk-UHARXISZ.js";
26
25
  import "../chunk-HSKKGAOW.js";
27
26
  import "../chunk-4QA5TIBU.js";
28
27
  import "../chunk-WJXWYSBT.js";
29
- import "../chunk-O423DMUE.js";
28
+ import "../chunk-7QWCPF6F.js";
30
29
  import "../chunk-XO6X5QE5.js";
31
30
  import "../chunk-KUV24B5M.js";
32
- import "../chunk-4ITKYWVG.js";
31
+ import "../chunk-V75HVZTB.js";
33
32
  import "../chunk-HEQVUIHQ.js";
34
33
  import "../chunk-U3IGFMCY.js";
35
- import "../chunk-HK53FRMU.js";
34
+ import "../chunk-DVBA6PGR.js";
36
35
  import "../chunk-B7KZLXHV.js";
37
36
  import "../chunk-4DZNTUK7.js";
38
37
  import "../chunk-N6A7A4RA.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/hooks/init.ts"],"sourcesContent":["import { Hook } from \"@oclif/core\";\nimport { resolveSource } from \"../lib/configuration/index.js\";\nimport { detectInstallation } from \"../lib/installation/installation.js\";\nimport { showDashboard } from \"../commands/init.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport type { ConfigWithSource } from \"../base-command.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n const projectDir = process.cwd();\n\n // When no command is given and project is already initialized, show dashboard\n if (options.id === undefined) {\n const installation = await detectInstallation(projectDir);\n\n if (installation) {\n const selectedCommand = await showDashboard(projectDir);\n if (selectedCommand) {\n await options.config.runCommand(selectedCommand);\n }\n this.exit(EXIT_CODES.SUCCESS);\n }\n }\n\n // Extract --source flag from argv (not yet parsed by oclif at this point)\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) => arg.startsWith(\"--source=\"));\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 try {\n const resolvedConfig = await resolveSource(sourceFlag, projectDir);\n // Boundary cast: oclif Config is a class (not augmentable); read in BaseCommand.sourceConfig\n (options.config as unknown as ConfigWithSource).sourceConfig = resolvedConfig;\n } catch (error) {\n // Let the command handle config failures - commands can check if sourceConfig is undefined\n }\n};\n\nexport default hook;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAOA,IAAM,OAAqB,eAAgB,SAAS;AAClD,QAAM,aAAa,QAAQ,IAAI;AAG/B,MAAI,QAAQ,OAAO,QAAW;AAC5B,UAAM,eAAe,MAAM,mBAAmB,UAAU;AAExD,QAAI,cAAc;AAChB,YAAM,kBAAkB,MAAM,cAAc,UAAU;AACtD,UAAI,iBAAiB;AACnB,cAAM,QAAQ,OAAO,WAAW,eAAe;AAAA,MACjD;AACA,WAAK,KAAK,WAAW,OAAO;AAAA,IAC9B;AAAA,EACF;AAGA,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,KAAK,CAAC,QAAQ,IAAI,WAAW,WAAW,CAAC;AACnF,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;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,cAAc,YAAY,UAAU;AAEjE,IAAC,QAAQ,OAAuC,eAAe;AAAA,EACjE,SAAS,OAAO;AAAA,EAEhB;AACF;AAEA,IAAO,eAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/hooks/init.ts"],"sourcesContent":["import { Hook } from \"@oclif/core\";\nimport { resolveSource } from \"../lib/configuration/index.js\";\nimport { detectInstallation } from \"../lib/installation/installation.js\";\nimport { showDashboard } from \"../commands/init.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport type { ConfigWithSource } from \"../base-command.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n const projectDir = process.cwd();\n\n // When no command is given and project is already initialized, show dashboard\n if (options.id === undefined) {\n const installation = await detectInstallation(projectDir);\n\n if (installation) {\n const selectedCommand = await showDashboard(projectDir);\n if (selectedCommand) {\n await options.config.runCommand(selectedCommand);\n }\n this.exit(EXIT_CODES.SUCCESS);\n }\n }\n\n // Extract --source flag from argv (not yet parsed by oclif at this point)\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) => arg.startsWith(\"--source=\"));\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 try {\n const resolvedConfig = await resolveSource(sourceFlag, projectDir);\n // Boundary cast: oclif Config is a class (not augmentable); read in BaseCommand.sourceConfig\n (options.config as unknown as ConfigWithSource).sourceConfig = resolvedConfig;\n } catch (error) {\n // Let the command handle config failures - commands can check if sourceConfig is undefined\n }\n};\n\nexport default hook;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAOA,IAAM,OAAqB,eAAgB,SAAS;AAClD,QAAM,aAAa,QAAQ,IAAI;AAG/B,MAAI,QAAQ,OAAO,QAAW;AAC5B,UAAM,eAAe,MAAM,mBAAmB,UAAU;AAExD,QAAI,cAAc;AAChB,YAAM,kBAAkB,MAAM,cAAc,UAAU;AACtD,UAAI,iBAAiB;AACnB,cAAM,QAAQ,OAAO,WAAW,eAAe;AAAA,MACjD;AACA,WAAK,KAAK,WAAW,OAAO;AAAA,IAC9B;AAAA,EACF;AAGA,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,KAAK,CAAC,QAAQ,IAAI,WAAW,WAAW,CAAC;AACnF,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;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,cAAc,YAAY,UAAU;AAEjE,IAAC,QAAQ,OAAuC,eAAe;AAAA,EACjE,SAAS,OAAO;AAAA,EAEhB;AACF;AAEA,IAAO,eAAQ;","names":[]}
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "dummy-skill",
3
+ "version": "1.0.0",
4
+ "skills": "./skills/",
5
+ "description": "Brief description of this skill",
6
+ "author": {
7
+ "name": "@dummy-author"
8
+ },
9
+ "keywords": [
10
+ "local",
11
+ "custom"
12
+ ]
13
+ }
@@ -0,0 +1,31 @@
1
+ ## ⚠️ CRITICAL REMINDERS
2
+
3
+ **CRITICAL: Make minimal and necessary changes ONLY. Do not modify anything not explicitly mentioned in the specification. Use existing utilities instead of creating new abstractions. Follow existing patterns exactly -- no invention.**
4
+
5
+ This is the most important rule. Most quality issues stem from violating it.
6
+
7
+ **(You MUST read the COMPLETE spec before writing any code - partial understanding causes spec violations)**
8
+
9
+ **(You MUST find and examine at least 2 similar existing AI modules before implementing - follow existing patterns exactly)**
10
+
11
+ **(You MUST validate ALL LLM responses with schemas - non-deterministic output breaks silently without validation)**
12
+
13
+ **(You MUST include retry logic with exponential backoff for all LLM API calls - transient failures are normal, not exceptional)**
14
+
15
+ **(You MUST check token counts before sending prompts - exceeding context windows causes silent truncation or hard errors)**
16
+
17
+ **(You MUST re-read files after editing to verify changes were written - never report success without verification)**
18
+
19
+ **(You MUST run tests and verify they pass - never claim success without test verification)**
20
+
21
+ **(You MUST write a finding to `.ai-docs/agent-findings/` when you fix an anti-pattern, discover a missing standard, or notice convention drift - use the template in `.ai-docs/agent-findings/TEMPLATE.md`)**
22
+
23
+ **AI-Specific Reminders:**
24
+
25
+ - Use config/environment variables for model names -- never hardcode
26
+ - Use parameterized templates for prompt construction -- never string concatenation
27
+ - Set explicit termination conditions on agent loops (max iterations + success criteria)
28
+ - Handle streaming connection drops and partial chunks
29
+ - Cache embeddings to avoid redundant computation
30
+
31
+ **Failure to follow these rules will produce brittle, expensive, and unpredictable AI code.**
@@ -0,0 +1,17 @@
1
+ ## CRITICAL: Before Any Work
2
+
3
+ **(You MUST read the COMPLETE spec before writing any code - partial understanding causes spec violations)**
4
+
5
+ **(You MUST find and examine at least 2 similar existing AI modules before implementing - follow existing patterns exactly)**
6
+
7
+ **(You MUST validate ALL LLM responses with schemas - non-deterministic output breaks silently without validation)**
8
+
9
+ **(You MUST include retry logic with exponential backoff for all LLM API calls - transient failures are normal, not exceptional)**
10
+
11
+ **(You MUST check token counts before sending prompts - exceeding context windows causes silent truncation or hard errors)**
12
+
13
+ **(You MUST re-read files after editing to verify changes were written - never report success without verification)**
14
+
15
+ **(You MUST run tests and verify they pass - never claim success without test verification)**
16
+
17
+ **(You MUST write a finding to `.ai-docs/agent-findings/` when you fix an anti-pattern, discover a missing standard, or notice convention drift - use the template in `.ai-docs/agent-findings/TEMPLATE.md`)**