@agents-inc/cli 0.76.0 → 0.77.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 (144) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/{chunk-Q4PJSAMP.js → chunk-32HX6UYI.js} +2 -1
  3. package/dist/chunk-32HX6UYI.js.map +1 -0
  4. package/dist/{chunk-CBJTSEI2.js → chunk-5DDHCCEB.js} +14 -4
  5. package/dist/chunk-5DDHCCEB.js.map +1 -0
  6. package/dist/{chunk-UBNHVBSV.js → chunk-7JQIMEUX.js} +3 -3
  7. package/dist/{chunk-XYZ7B5BY.js → chunk-7LBYURQR.js} +2 -2
  8. package/dist/{chunk-NWW3OJH5.js → chunk-A5JSBU65.js} +2 -2
  9. package/dist/{chunk-LO5QGAP2.js → chunk-A6XMJT2Q.js} +4 -4
  10. package/dist/{chunk-36YW5E7G.js → chunk-AQ5KP4YW.js} +4 -4
  11. package/dist/{chunk-I2SUTL7S.js → chunk-B66E255O.js} +3 -3
  12. package/dist/{chunk-IDN2OZJY.js → chunk-C22ACAL2.js} +2 -2
  13. package/dist/{chunk-7NACNRFG.js → chunk-CTZ4GEAD.js} +16 -16
  14. package/dist/chunk-CTZ4GEAD.js.map +1 -0
  15. package/dist/{chunk-PRG7PKZM.js → chunk-CY23HPDE.js} +6 -4
  16. package/dist/chunk-CY23HPDE.js.map +1 -0
  17. package/dist/{chunk-WS3TL2AO.js → chunk-CZLXZ75E.js} +67 -35
  18. package/dist/chunk-CZLXZ75E.js.map +1 -0
  19. package/dist/{chunk-7XUKTYVD.js → chunk-EO6KJI5D.js} +1038 -270
  20. package/dist/chunk-EO6KJI5D.js.map +1 -0
  21. package/dist/{chunk-JWMYAJHD.js → chunk-FSK4TQX7.js} +1236 -354
  22. package/dist/chunk-FSK4TQX7.js.map +1 -0
  23. package/dist/{chunk-WMMU5FOO.js → chunk-FUWUCKES.js} +2 -2
  24. package/dist/{chunk-WMMU5FOO.js.map → chunk-FUWUCKES.js.map} +1 -1
  25. package/dist/{chunk-AE2QHAFO.js → chunk-G3YSDQJ2.js} +40 -41
  26. package/dist/chunk-G3YSDQJ2.js.map +1 -0
  27. package/dist/{chunk-CBYRFAUN.js → chunk-HK53FRMU.js} +3 -1
  28. package/dist/chunk-HK53FRMU.js.map +1 -0
  29. package/dist/{chunk-I534EWJQ.js → chunk-IFCASC6R.js} +2 -2
  30. package/dist/{chunk-R7F5YQMI.js → chunk-J5OOAKB5.js} +2 -2
  31. package/dist/{chunk-7PZFDI46.js → chunk-KB57OPUL.js} +4 -4
  32. package/dist/{chunk-WZ5S4LGX.js → chunk-KMLJCO5H.js} +5 -5
  33. package/dist/{chunk-CCSU4R65.js → chunk-MG55NDVG.js} +2 -2
  34. package/dist/{chunk-M4ZDKHJV.js → chunk-MUCQ27HV.js} +2 -2
  35. package/dist/{chunk-O5CPXIC4.js → chunk-N4KD5PBX.js} +4 -4
  36. package/dist/{chunk-7PMFIL5L.js → chunk-PDYKGJGR.js} +3 -3
  37. package/dist/{chunk-ODVQXXEO.js → chunk-R6QNVMN5.js} +16 -42
  38. package/dist/{chunk-ODVQXXEO.js.map → chunk-R6QNVMN5.js.map} +1 -1
  39. package/dist/chunk-SGKNE6EJ.js +192 -0
  40. package/dist/chunk-SGKNE6EJ.js.map +1 -0
  41. package/dist/{chunk-KPRCP3MZ.js → chunk-U2KFFRRX.js} +2 -2
  42. package/dist/{chunk-VQV3DSHD.js → chunk-UZHD4DBD.js} +5 -5
  43. package/dist/{chunk-EEZSCHS2.js → chunk-WMTYOK4E.js} +7 -7
  44. package/dist/{chunk-6F3CZLD6.js → chunk-XA7WF3BI.js} +3 -3
  45. package/dist/{chunk-S6DKM6MJ.js → chunk-XU6N3OIS.js} +4 -4
  46. package/dist/{chunk-WN2TUP4M.js → chunk-XYPAOBBV.js} +2 -2
  47. package/dist/{chunk-CKU7FJNV.js → chunk-ZIZFTSQY.js} +3 -3
  48. package/dist/commands/build/marketplace.js +4 -4
  49. package/dist/commands/build/plugins.js +8 -8
  50. package/dist/commands/build/stack.js +8 -8
  51. package/dist/commands/compile.js +8 -8
  52. package/dist/commands/config/index.js +8 -8
  53. package/dist/commands/config/path.js +7 -7
  54. package/dist/commands/config/show.js +8 -8
  55. package/dist/commands/diff.js +7 -7
  56. package/dist/commands/doctor.js +7 -7
  57. package/dist/commands/edit.js +25 -25
  58. package/dist/commands/eject.js +7 -7
  59. package/dist/commands/import/skill.js +7 -7
  60. package/dist/commands/info.js +7 -7
  61. package/dist/commands/init.js +25 -25
  62. package/dist/commands/list.js +7 -7
  63. package/dist/commands/new/agent.js +8 -8
  64. package/dist/commands/new/marketplace.js +9 -9
  65. package/dist/commands/new/skill.js +8 -8
  66. package/dist/commands/outdated.js +7 -7
  67. package/dist/commands/search.js +9 -9
  68. package/dist/commands/uninstall.js +7 -7
  69. package/dist/commands/update.js +8 -8
  70. package/dist/commands/validate.js +7 -7
  71. package/dist/components/skill-search/skill-search.js +2 -2
  72. package/dist/components/wizard/category-grid.js +3 -3
  73. package/dist/components/wizard/category-grid.test.js +18 -19
  74. package/dist/components/wizard/category-grid.test.js.map +1 -1
  75. package/dist/components/wizard/domain-selection.js +9 -9
  76. package/dist/components/wizard/help-modal.js +2 -2
  77. package/dist/components/wizard/search-modal.js +2 -2
  78. package/dist/components/wizard/search-modal.test.js +2 -2
  79. package/dist/components/wizard/source-grid.js +4 -4
  80. package/dist/components/wizard/source-grid.test.js +13 -13
  81. package/dist/components/wizard/stack-selection.js +10 -9
  82. package/dist/components/wizard/step-agents.js +9 -9
  83. package/dist/components/wizard/step-agents.test.js +12 -12
  84. package/dist/components/wizard/step-build.js +11 -11
  85. package/dist/components/wizard/step-build.test.js +15 -13
  86. package/dist/components/wizard/step-build.test.js.map +1 -1
  87. package/dist/components/wizard/step-confirm.js +5 -5
  88. package/dist/components/wizard/step-confirm.test.js +11 -11
  89. package/dist/components/wizard/step-refine.js +2 -2
  90. package/dist/components/wizard/step-refine.test.js +2 -2
  91. package/dist/components/wizard/step-settings.js +8 -8
  92. package/dist/components/wizard/step-settings.test.js +11 -11
  93. package/dist/components/wizard/step-sources.js +11 -11
  94. package/dist/components/wizard/step-sources.test.js +14 -14
  95. package/dist/components/wizard/step-stack.js +11 -12
  96. package/dist/components/wizard/step-stack.test.js +15 -15
  97. package/dist/components/wizard/step-stack.test.js.map +1 -1
  98. package/dist/components/wizard/wizard-layout.js +10 -10
  99. package/dist/components/wizard/wizard.js +23 -23
  100. package/dist/config-exports.js +1 -1
  101. package/dist/hooks/init.js +25 -25
  102. package/dist/{loader-7RQ4G4TH.js → loader-JMOO2A7C.js} +4 -4
  103. package/dist/{source-loader-CXCIDGWV.js → source-loader-H3QLG5AE.js} +7 -7
  104. package/dist/source-manager-ZDBUHGIR.js +19 -0
  105. package/dist/stores/wizard-store.js +7 -7
  106. package/dist/stores/wizard-store.test.js +10 -10
  107. package/package.json +1 -1
  108. package/dist/chunk-7NACNRFG.js.map +0 -1
  109. package/dist/chunk-7XUKTYVD.js.map +0 -1
  110. package/dist/chunk-AE2QHAFO.js.map +0 -1
  111. package/dist/chunk-CBJTSEI2.js.map +0 -1
  112. package/dist/chunk-CBYRFAUN.js.map +0 -1
  113. package/dist/chunk-EWBNSS5Y.js +0 -113
  114. package/dist/chunk-EWBNSS5Y.js.map +0 -1
  115. package/dist/chunk-JWMYAJHD.js.map +0 -1
  116. package/dist/chunk-PRG7PKZM.js.map +0 -1
  117. package/dist/chunk-Q4PJSAMP.js.map +0 -1
  118. package/dist/chunk-WS3TL2AO.js.map +0 -1
  119. package/dist/source-manager-TPLO2DVS.js +0 -19
  120. /package/dist/{chunk-UBNHVBSV.js.map → chunk-7JQIMEUX.js.map} +0 -0
  121. /package/dist/{chunk-XYZ7B5BY.js.map → chunk-7LBYURQR.js.map} +0 -0
  122. /package/dist/{chunk-NWW3OJH5.js.map → chunk-A5JSBU65.js.map} +0 -0
  123. /package/dist/{chunk-LO5QGAP2.js.map → chunk-A6XMJT2Q.js.map} +0 -0
  124. /package/dist/{chunk-36YW5E7G.js.map → chunk-AQ5KP4YW.js.map} +0 -0
  125. /package/dist/{chunk-I2SUTL7S.js.map → chunk-B66E255O.js.map} +0 -0
  126. /package/dist/{chunk-IDN2OZJY.js.map → chunk-C22ACAL2.js.map} +0 -0
  127. /package/dist/{chunk-I534EWJQ.js.map → chunk-IFCASC6R.js.map} +0 -0
  128. /package/dist/{chunk-R7F5YQMI.js.map → chunk-J5OOAKB5.js.map} +0 -0
  129. /package/dist/{chunk-7PZFDI46.js.map → chunk-KB57OPUL.js.map} +0 -0
  130. /package/dist/{chunk-WZ5S4LGX.js.map → chunk-KMLJCO5H.js.map} +0 -0
  131. /package/dist/{chunk-CCSU4R65.js.map → chunk-MG55NDVG.js.map} +0 -0
  132. /package/dist/{chunk-M4ZDKHJV.js.map → chunk-MUCQ27HV.js.map} +0 -0
  133. /package/dist/{chunk-O5CPXIC4.js.map → chunk-N4KD5PBX.js.map} +0 -0
  134. /package/dist/{chunk-7PMFIL5L.js.map → chunk-PDYKGJGR.js.map} +0 -0
  135. /package/dist/{chunk-KPRCP3MZ.js.map → chunk-U2KFFRRX.js.map} +0 -0
  136. /package/dist/{chunk-VQV3DSHD.js.map → chunk-UZHD4DBD.js.map} +0 -0
  137. /package/dist/{chunk-EEZSCHS2.js.map → chunk-WMTYOK4E.js.map} +0 -0
  138. /package/dist/{chunk-6F3CZLD6.js.map → chunk-XA7WF3BI.js.map} +0 -0
  139. /package/dist/{chunk-S6DKM6MJ.js.map → chunk-XU6N3OIS.js.map} +0 -0
  140. /package/dist/{chunk-WN2TUP4M.js.map → chunk-XYPAOBBV.js.map} +0 -0
  141. /package/dist/{chunk-CKU7FJNV.js.map → chunk-ZIZFTSQY.js.map} +0 -0
  142. /package/dist/{loader-7RQ4G4TH.js.map → loader-JMOO2A7C.js.map} +0 -0
  143. /package/dist/{source-loader-CXCIDGWV.js.map → source-loader-H3QLG5AE.js.map} +0 -0
  144. /package/dist/{source-manager-TPLO2DVS.js.map → source-manager-ZDBUHGIR.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/category-grid.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, beforeEach, afterEach, vi } from \"vitest\";\nimport {\n CategoryGrid,\n type CategoryGridProps,\n type CategoryRow,\n type CategoryOption,\n} from \"./category-grid\";\nimport type { SkillId, Category } from \"../../types\";\nimport {\n ARROW_UP,\n ARROW_DOWN,\n ARROW_LEFT,\n ARROW_RIGHT,\n TAB,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { CATEGORY_GRID_MATRIX } from \"../../lib/__tests__/mock-data/mock-matrices\";\nimport { BUILT_IN_MATRIX } from \"../../types/generated/matrix\";\n\nconst createOption = (id: SkillId, overrides: Partial<CategoryOption> = {}): CategoryOption => ({\n id,\n state: { status: \"normal\" },\n selected: false,\n ...overrides,\n});\n\nconst createCategory = (\n id: Category,\n displayName: string,\n options: CategoryOption[],\n overrides: Partial<CategoryRow> = {},\n): CategoryRow => ({\n id,\n displayName,\n required: false,\n exclusive: true,\n options,\n ...overrides,\n});\n\nconst defaultCategories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", {\n state: { status: \"recommended\", reason: \"Popular choice\" },\n }),\n createOption(\"web-framework-vue-composition-api\"),\n createOption(\"web-framework-angular-standalone\"),\n createOption(\"web-framework-solidjs\"),\n ],\n { required: true },\n ),\n createCategory(\n \"web-styling\",\n \"Styling\",\n [\n createOption(\"web-styling-scss-modules\", { selected: true }),\n createOption(\"web-styling-tailwind\", {\n state: { status: \"recommended\", reason: \"Modern utility-first CSS\" },\n }),\n createOption(\"web-styling-cva\"),\n createOption(\"web-meta-framework-nuxt\"),\n ],\n { required: true },\n ),\n createCategory(\"web-client-state\", \"Client State\", [\n createOption(\"web-state-zustand\", {\n state: { status: \"recommended\", reason: \"Simple and performant\" },\n }),\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-redux-toolkit\", {\n state: { status: \"discouraged\", reason: \"Complex for most apps\" },\n }),\n createOption(\"web-state-mobx\"),\n ]),\n createCategory(\"web-server-state\", \"Server State\", [\n createOption(\"web-server-state-react-query\", { selected: true }),\n createOption(\"web-data-fetching-swr\"),\n createOption(\"web-data-fetching-graphql-apollo\"),\n ]),\n createCategory(\"api-analytics\", \"Analytics\", [createOption(\"api-analytics-posthog-analytics\")]),\n];\n\nconst categoriesWithFramework: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", {\n state: { status: \"recommended\", reason: \"Popular choice\" },\n selected: true, // Framework selected\n }),\n createOption(\"web-framework-vue-composition-api\"),\n createOption(\"web-framework-angular-standalone\"),\n createOption(\"web-framework-solidjs\"),\n ],\n { required: true },\n ),\n createCategory(\n \"web-styling\",\n \"Styling\",\n [\n createOption(\"web-styling-scss-modules\"),\n createOption(\"web-styling-tailwind\", {\n state: { status: \"recommended\", reason: \"Modern utility-first CSS\" },\n }),\n createOption(\"web-styling-cva\"),\n createOption(\"web-meta-framework-nuxt\"),\n ],\n { required: true },\n ),\n createCategory(\"web-client-state\", \"Client State\", [\n createOption(\"web-state-zustand\", {\n state: { status: \"recommended\", reason: \"Simple and performant\" },\n }),\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-redux-toolkit\", {\n state: { status: \"discouraged\", reason: \"Complex for most apps\" },\n }),\n createOption(\"web-state-mobx\"),\n ]),\n];\n\nconst manyCategories: CategoryRow[] = [\n createCategory(\"web-framework\", \"Category 0\", [\n createOption(\"web-framework-react\"),\n createOption(\"web-framework-vue-composition-api\"),\n createOption(\"web-framework-angular-standalone\"),\n ]),\n createCategory(\"web-styling\", \"Category 1\", [\n createOption(\"web-styling-tailwind\"),\n createOption(\"web-styling-scss-modules\"),\n createOption(\"web-styling-cva\"),\n ]),\n createCategory(\"web-client-state\", \"Category 2\", [\n createOption(\"web-state-zustand\"),\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-mobx\"),\n ]),\n createCategory(\"web-server-state\", \"Category 3\", [\n createOption(\"web-server-state-react-query\"),\n createOption(\"web-data-fetching-swr\"),\n createOption(\"web-data-fetching-graphql-apollo\"),\n ]),\n createCategory(\"web-forms\", \"Category 4\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\"),\n createOption(\"web-forms-zod-validation\"),\n ]),\n createCategory(\"web-testing\", \"Category 5\", [\n createOption(\"web-testing-vitest\"),\n createOption(\"web-testing-playwright-e2e\"),\n createOption(\"web-testing-cypress-e2e\"),\n ]),\n createCategory(\"web-mocking\", \"Category 6\", [\n createOption(\"web-mocks-msw\"),\n createOption(\"web-testing-react-testing-library\"),\n createOption(\"web-testing-vue-test-utils\"),\n ]),\n createCategory(\"web-i18n\", \"Category 7\", [\n createOption(\"web-i18n-next-intl\"),\n createOption(\"web-i18n-react-intl\"),\n createOption(\"web-i18n-vue-i18n\"),\n ]),\n];\n\nconst navCategories: CategoryRow[] = [\n createCategory(\"web-framework\", \"Category 0\", [createOption(\"web-framework-react\")]),\n createCategory(\"web-styling\", \"Category 1\", [createOption(\"web-styling-tailwind\")]),\n createCategory(\"web-client-state\", \"Category 2\", [createOption(\"web-state-zustand\")]),\n createCategory(\"web-server-state\", \"Category 3\", [createOption(\"web-server-state-react-query\")]),\n createCategory(\"web-forms\", \"Category 4\", [createOption(\"web-forms-react-hook-form\")]),\n createCategory(\"web-testing\", \"Category 5\", [createOption(\"web-testing-vitest\")]),\n];\n\nconst defaultProps: CategoryGridProps = {\n categories: defaultCategories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n showLabels: false,\n onToggle: vi.fn(),\n onFocusChange: vi.fn(),\n onToggleLabels: vi.fn(),\n};\n\nconst renderGrid = (props: Partial<CategoryGridProps> = {}) => {\n return render(<CategoryGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"CategoryGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n initializeMatrix(CATEGORY_GRID_MATRIX);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n initializeMatrix(BUILT_IN_MATRIX);\n });\n\n describe(\"rendering\", () => {\n it(\"should render all categories as sections\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n expect(output).toContain(\"Server State\");\n expect(output).toContain(\"Analytics\");\n });\n\n it(\"should render all options in each category\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework options\n expect(output).toContain(\"React\");\n expect(output).toContain(\"Vue\");\n expect(output).toContain(\"Angular\");\n expect(output).toContain(\"SolidJS\");\n // Styling options\n expect(output).toContain(\"SCSS Modules\");\n expect(output).toContain(\"Tailwind\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n // The * should appear after their names\n expect(output).toContain(\"*\");\n });\n\n it(\"should NOT show (optional) for non-required categories\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Optional is assumed by default, so we don't show the label\n expect(output).not.toContain(\"(optional)\");\n });\n\n it(\"should handle empty categories array\", () => {\n const { lastFrame, unmount } = renderGrid({ categories: [] });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should render section underlines\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Unicode horizontal line character used for underlines\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"visual states\", () => {\n it(\"should show selected options with display name\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // scss-mod and react-query are selected in defaultCategories\n expect(output).toContain(\"SCSS Modules\");\n expect(output).toContain(\"React Query\");\n });\n\n it(\"should show unselected options with display name\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Unselected options should display their names from the store\n expect(output).toContain(\"Vue\");\n expect(output).toContain(\"Angular\");\n });\n\n it(\"should NOT show star indicator for recommended options (uses background instead)\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain star (⭐) for recommended\n expect(output).not.toContain(\"\\u2B50\");\n });\n\n it(\"should NOT show warning indicator for discouraged options (uses color instead)\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain warning (⚠) for discouraged\n expect(output).not.toContain(\"\\u26A0\");\n });\n\n it(\"should show discouraged options with warning styling\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n // Discouraged options should show display name\n expect(output).toContain(\"Vee Validate\");\n });\n\n it(\"should render selected skills with display name\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { selected: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render unselected skills with display name\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"normal\" },\n selected: false,\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render discouraged skills with display name\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render discouraged+selected skills with display name\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n selected: true,\n }),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n selected: false,\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n expect(output).toContain(\"Vee Validate\");\n });\n\n it(\"should render discouraged skills with display name from store\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render both selected and unselected skills with display names\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { selected: true }),\n createOption(\"web-forms-vee-validate\", { selected: false }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n expect(output).toContain(\"Vee Validate\");\n });\n\n it(\"should render skill display name regardless of selection state\", () => {\n const categories1: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { selected: false }),\n ]),\n ];\n\n const { lastFrame: frame1, unmount: unmount1 } = renderGrid({ categories: categories1 });\n const output1 = frame1();\n unmount1();\n\n // Second render: same option selected\n const categories2: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { selected: true }),\n ]),\n ];\n\n const { lastFrame: frame2, unmount: unmount2 } = renderGrid({ categories: categories2 });\n cleanup = unmount2;\n const output2 = frame2();\n\n // Both states should render the display name\n expect(output1).toContain(\"React Hook Form\");\n expect(output2).toContain(\"React Hook Form\");\n });\n });\n\n describe(\"locked sections\", () => {\n it(\"should show all categories including locked ones\", () => {\n // No framework selected, so non-framework sections should be locked but visible\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n });\n\n it(\"should unlock sections when framework is selected\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // All sections should be visible and navigable\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n });\n\n it(\"should not lock any sections when no framework category exists\", () => {\n const categoriesNoFramework: CategoryRow[] = [\n createCategory(\"web-styling\", \"Styling\", [\n createOption(\"web-styling-scss-modules\"),\n createOption(\"web-styling-tailwind\"),\n ]),\n createCategory(\"web-client-state\", \"State\", [createOption(\"web-state-zustand\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesNoFramework,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"State\");\n });\n });\n\n describe(\"focus indicator\", () => {\n it(\"should render focused option with display name\", () => {\n const { lastFrame, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Focused option should be visible (background highlighting is visual-only)\n expect(output).toContain(\"React\");\n });\n\n it(\"should render correctly when focusedRow changes\", () => {\n const { lastFrame: frame1, unmount: unmount1 } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n });\n const output1 = frame1();\n unmount1();\n\n const { lastFrame: frame2, unmount: unmount2 } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n });\n cleanup = unmount2;\n const output2 = frame2();\n\n // Both should render the focused category options\n expect(output1).toContain(\"Framework\");\n expect(output2).toContain(\"Styling\");\n });\n\n it(\"should highlight focused category name\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Styling row should be focused (index 1)\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"keyboard navigation - arrow keys\", () => {\n it(\"should call onFocusChange when pressing left arrow\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should call onFocusChange when pressing right arrow\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should call onFocusChange when pressing up arrow (wraps to framework when locked)\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, so navigation stays on framework row\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should stay on row 0 (framework) since other rows are locked\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should navigate between sections when unlocked\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should move to row 1 (Styling) since framework is selected\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should wrap horizontally when pressing left at first column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last column (index 3 for framework with 4 options)\n expect(onFocusChange).toHaveBeenCalledWith(0, 3);\n });\n\n it(\"should wrap horizontally when pressing right at last column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 3, // Last option in framework\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to first column\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap vertically when all sections are unlocked\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last row (index 2 for 3 categories)\n expect(onFocusChange).toHaveBeenCalledWith(2, 0);\n });\n });\n\n describe(\"keyboard navigation - vim keys\", () => {\n it(\"should move left with h key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"h\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should move right with l key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"l\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should move up with k key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"k\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should move down with j key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"j\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"selection toggle\", () => {\n it(\"should call onToggle when pressing space on a normal option\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1, // vue (normal state)\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \"); // Space\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"web-framework\", \"web-framework-vue-composition-api\");\n });\n\n it(\"should call onToggle when pressing space on a selected option\", async () => {\n const onToggle = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", { selected: true }),\n createOption(\"web-framework-vue-composition-api\"),\n ],\n { required: true },\n ),\n ];\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0, // react (selected)\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"web-framework\", \"web-framework-react\");\n });\n\n it(\"should call onToggle for discouraged options (still selectable)\", async () => {\n const onToggle = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n\n it(\"should bounce focus away from locked sections on mount\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, styling section is locked\n const { unmount } = renderGrid({\n defaultFocusedRow: 1, // Styling (locked)\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Focus should have bounced from locked row 1 to unlocked row 0 (framework)\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n });\n\n describe(\"discouraged options navigation\", () => {\n it(\"should navigate to discouraged options when navigating right\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-zod-validation\"),\n ]),\n ];\n\n // Options stay in original order: [opt1, opt2(discouraged), opt3]\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Navigating right from index 0 goes to index 1 (opt2, discouraged but hoverable)\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should navigate to discouraged options when navigating left\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-zod-validation\"),\n ]),\n ];\n\n // Options stay in original order: [opt1, opt2(discouraged), opt3]\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 2, // Start at opt3 (index 2)\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n // Discouraged options are hoverable — navigates to index 1 (opt2)\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should navigate between all-discouraged options in a row\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Discouraged options are hoverable — navigates to index 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n });\n\n describe(\"exclusive categories\", () => {\n it(\"should render exclusive category correctly\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // All default categories are exclusive, should render normally\n expect(output).toContain(\"Framework\");\n });\n\n // Note: The actual exclusivity logic (only one selection) is handled\n // by the parent component via onToggle. CategoryGrid just displays\n // the current state.\n });\n\n describe(\"tab navigation\", () => {\n it(\"should jump to next section when pressing Tab\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(TAB);\n await delay(INPUT_DELAY_MS);\n\n // Should jump to next section (row 1)\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should only jump to unlocked sections\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, so Tab should stay on framework\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(TAB);\n await delay(INPUT_DELAY_MS);\n\n // Should NOT call onFocusChange since there's nowhere to go (all others locked)\n expect(onFocusChange).not.toHaveBeenCalled();\n });\n });\n\n describe(\"compatibility labels toggle\", () => {\n it(\"should call onToggleLabels when pressing d key\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderGrid({\n onToggleLabels,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\n\n it(\"should show compatibility labels when showLabels is true\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show compatibility label suffixes on skill tags\n expect(output).toContain(\"(recommended)\"); // react has state: { status: \"recommended\", reason: \"Recommended choice\" }\n });\n\n it(\"should not show label for selected skills when showLabels is true\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n // Selected skills show no label — selection is visually obvious from color\n expect(output).not.toContain(\"(selected)\");\n });\n\n it(\"should show Discouraged label when showLabels is true and skill is focused\", () => {\n // Use categoriesWithFramework so Client State section is unlocked\n // Redux (discouraged) is at row 2, col 2\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n showLabels: true,\n defaultFocusedRow: 2,\n defaultFocusedCol: 2,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(discouraged)\");\n });\n\n it(\"should hide compatibility labels when showLabels is false\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: false });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels should not be visible when toggle is off\n expect(output).not.toContain(\"(recommended)\");\n expect(output).not.toContain(\"(selected)\");\n expect(output).not.toContain(\"(discouraged)\");\n });\n\n it(\"should show discouraged label for focused discouraged option when showLabels is true\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-react-hook-form\"),\n ]),\n ];\n\n // First option is focused by default — make it the discouraged one\n const { lastFrame, unmount } = renderGrid({ categories, showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(discouraged)\");\n });\n });\n\n describe(\"option ordering\", () => {\n it(\"should preserve original order regardless of state\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\", {\n state: { status: \"recommended\", reason: \"Recommended choice\" },\n }),\n createOption(\"web-state-redux-toolkit\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-state-mobx\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame()!;\n const jotaiIdx = output.indexOf(\"Jotai\");\n const zustandIdx = output.indexOf(\"Zustand\");\n const reduxIdx = output.indexOf(\"Redux\");\n const mobxIdx = output.indexOf(\"MobX\");\n\n // Order should match the input array, not be sorted by state\n expect(jotaiIdx).toBeLessThan(zustandIdx);\n expect(zustandIdx).toBeLessThan(reduxIdx);\n expect(reduxIdx).toBeLessThan(mobxIdx);\n });\n\n it(\"should not change order when a skill is selected\", () => {\n const categoriesBefore: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\"),\n createOption(\"web-state-redux-toolkit\"),\n ]),\n ];\n\n const categoriesAfter: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\", { selected: true }),\n createOption(\"web-state-redux-toolkit\"),\n ]),\n ];\n\n const { lastFrame: frameBefore, unmount: unmountBefore } = renderGrid({\n categories: categoriesBefore,\n });\n const outputBefore = frameBefore()!;\n unmountBefore();\n\n const { lastFrame: frameAfter, unmount: unmountAfter } = renderGrid({\n categories: categoriesAfter,\n });\n cleanup = unmountAfter;\n const outputAfter = frameAfter()!;\n\n // Verify order is preserved: Jotai < Zustand < Redux in both\n expect(outputBefore.indexOf(\"Jotai\")).toBeLessThan(outputBefore.indexOf(\"Zustand\"));\n expect(outputBefore.indexOf(\"Zustand\")).toBeLessThan(outputBefore.indexOf(\"Redux\"));\n expect(outputAfter.indexOf(\"Jotai\")).toBeLessThan(outputAfter.indexOf(\"Zustand\"));\n expect(outputAfter.indexOf(\"Zustand\")).toBeLessThan(outputAfter.indexOf(\"Redux\"));\n });\n\n it(\"should not change order when a skill state changes from normal to discouraged\", () => {\n const categoriesBefore: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\"),\n createOption(\"web-state-redux-toolkit\"),\n ]),\n ];\n\n const categoriesAfter: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-state-redux-toolkit\"),\n ]),\n ];\n\n const { lastFrame: frameBefore, unmount: unmountBefore } = renderGrid({\n categories: categoriesBefore,\n });\n const outputBefore = frameBefore()!;\n unmountBefore();\n\n const { lastFrame: frameAfter, unmount: unmountAfter } = renderGrid({\n categories: categoriesAfter,\n });\n cleanup = unmountAfter;\n const outputAfter = frameAfter()!;\n\n // Zustand stays in the middle even after becoming discouraged\n expect(outputBefore.indexOf(\"Jotai\")).toBeLessThan(outputBefore.indexOf(\"Zustand\"));\n expect(outputBefore.indexOf(\"Zustand\")).toBeLessThan(outputBefore.indexOf(\"Redux\"));\n expect(outputAfter.indexOf(\"Jotai\")).toBeLessThan(outputAfter.indexOf(\"Zustand\"));\n expect(outputAfter.indexOf(\"Zustand\")).toBeLessThan(outputAfter.indexOf(\"Redux\"));\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle single category\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Single Category\", [createOption(\"web-forms-react-hook-form\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Single Category\");\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should handle single option in category\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Single\", [createOption(\"web-forms-react-hook-form\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should handle category with many options (flows naturally)\", () => {\n const manySkillIds: SkillId[] = [\n \"web-framework-react\",\n \"web-framework-vue-composition-api\",\n \"web-framework-angular-standalone\",\n \"web-framework-solidjs\",\n \"web-meta-framework-nuxt\",\n \"web-meta-framework-remix\",\n \"web-meta-framework-nextjs\",\n \"web-styling-tailwind\",\n \"web-styling-scss-modules\",\n ];\n const options = manySkillIds.map((id) => createOption(id));\n const categories: CategoryRow[] = [createCategory(\"web-mocking\", \"Many Options\", options)];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Many Options\");\n // All options should be present (no fixed row limit)\n expect(output).toContain(\"React\");\n expect(output).toContain(\"SCSS Modules\");\n });\n\n it(\"should handle long display names\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-i18n\", \"Long Labels\", [\n createOption(\"web-i18n-next-intl\"),\n createOption(\"web-i18n-react-intl\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n // Display names should be rendered (flowing layout handles long names)\n expect(output).toContain(\"Next Intl\");\n });\n\n it(\"should handle categories with different option counts\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-framework\", \"Category 1\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\"),\n ]),\n createCategory(\"web-styling\", \"Category 2\", [createOption(\"web-forms-zod-validation\")]),\n createCategory(\"web-client-state\", \"Category 3\", [\n createOption(\"web-testing-vitest\"),\n createOption(\"web-testing-playwright-e2e\"),\n createOption(\"web-testing-react-testing-library\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Category 1\");\n expect(output).toContain(\"Category 2\");\n expect(output).toContain(\"Category 3\");\n });\n });\n\n describe(\"column adjustment\", () => {\n it(\"should adjust focusedCol when changing to row with fewer options\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-forms-react-hook-form\", { selected: true }), // Framework selected\n createOption(\"web-forms-vee-validate\"),\n createOption(\"web-forms-zod-validation\"),\n ],\n { required: true },\n ),\n createCategory(\"web-styling\", \"Category 2\", [createOption(\"web-testing-vitest\")]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 2, // Last option in first row\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should move to row 1, and col should be clamped to 0 (only option)\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"installed skills\", () => {\n it(\"should render installed skill with display name (no checkmark icon)\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { installed: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render installed and selected skill with display name only\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n installed: true,\n selected: true,\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render local installed skill without L badge or checkmark\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { local: true, installed: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"React Hook Form\");\n });\n });\n\n describe(\"natural flow (no virtual scroll)\", () => {\n it(\"should render all categories without scroll indicators\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n expect(output).toContain(\"Server State\");\n expect(output).toContain(\"Analytics\");\n expect(output).not.toContain(\"more categories\");\n });\n\n it(\"should render all categories even with many entries\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: manyCategories,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n for (const category of manyCategories) {\n expect(output).toContain(category.displayName);\n }\n expect(output).not.toContain(\"more categories\");\n });\n\n it(\"should keep focused category visible when navigating down\", async () => {\n const onFocusChange = vi.fn();\n\n const { stdin, lastFrame, unmount } = renderGrid({\n categories: navCategories,\n defaultFocusedRow: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Category 3\");\n });\n });\n\n describe(\"selection counter\", () => {\n it(\"should show 'X of 1' for exclusive categories with no selection\", () => {\n const categories = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [createOption(\"web-framework-react\"), createOption(\"web-framework-vue-composition-api\")],\n { exclusive: true },\n ),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(0 of 1)\");\n });\n\n it(\"should show '1 of 1' for exclusive categories with one selection\", () => {\n const categories = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", { selected: true }),\n createOption(\"web-framework-vue-composition-api\"),\n ],\n { exclusive: true },\n ),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(1 of 1)\");\n });\n\n it(\"should not show counter for non-exclusive categories\", () => {\n const categories = [\n createCategory(\n \"web-testing\",\n \"Testing\",\n [\n createOption(\"web-testing-vitest\", { selected: true }),\n createOption(\"web-testing-playwright-e2e\", { selected: true }),\n createOption(\"web-testing-cypress-e2e\"),\n ],\n { exclusive: false },\n ),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"selected)\");\n expect(output).not.toContain(\"of 1)\");\n });\n\n it(\"should only show counter for exclusive categories in mixed layout\", () => {\n const categories = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", { selected: true }),\n createOption(\"web-framework-vue-composition-api\"),\n ],\n { exclusive: true },\n ),\n createCategory(\n \"web-testing\",\n \"Testing\",\n [\n createOption(\"web-testing-vitest\", { selected: true }),\n createOption(\"web-testing-playwright-e2e\", { selected: true }),\n createOption(\"web-testing-cypress-e2e\"),\n ],\n { exclusive: false },\n ),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(1 of 1)\");\n expect(output).not.toContain(\"selected)\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/category-grid.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, beforeEach, afterEach, vi } from \"vitest\";\nimport {\n CategoryGrid,\n type CategoryGridProps,\n type CategoryRow,\n type CategoryOption,\n} from \"./category-grid\";\nimport type { SkillId, Category } from \"../../types\";\nimport {\n ARROW_UP,\n ARROW_DOWN,\n ARROW_LEFT,\n ARROW_RIGHT,\n TAB,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { CATEGORY_GRID_MATRIX } from \"../../lib/__tests__/mock-data/mock-matrices\";\nimport { BUILT_IN_MATRIX } from \"../../types/generated/matrix\";\n\nconst createOption = (id: SkillId, overrides: Partial<CategoryOption> = {}): CategoryOption => ({\n id,\n state: { status: \"normal\" },\n selected: false,\n ...overrides,\n});\n\nconst createCategory = (\n id: Category,\n displayName: string,\n options: CategoryOption[],\n overrides: Partial<CategoryRow> = {},\n): CategoryRow => ({\n id,\n displayName,\n required: false,\n exclusive: true,\n options,\n ...overrides,\n});\n\nconst defaultCategories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", {\n state: { status: \"recommended\", reason: \"Popular choice\" },\n }),\n createOption(\"web-framework-vue-composition-api\"),\n createOption(\"web-framework-angular-standalone\"),\n createOption(\"web-framework-solidjs\"),\n ],\n { required: true },\n ),\n createCategory(\n \"web-styling\",\n \"Styling\",\n [\n createOption(\"web-styling-scss-modules\", { selected: true }),\n createOption(\"web-styling-tailwind\", {\n state: { status: \"recommended\", reason: \"Modern utility-first CSS\" },\n }),\n createOption(\"web-styling-cva\"),\n createOption(\"web-meta-framework-nuxt\"),\n ],\n { required: true },\n ),\n createCategory(\"web-client-state\", \"Client State\", [\n createOption(\"web-state-zustand\", {\n state: { status: \"recommended\", reason: \"Simple and performant\" },\n }),\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-redux-toolkit\", {\n state: { status: \"discouraged\", reason: \"Complex for most apps\" },\n }),\n createOption(\"web-state-mobx\"),\n ]),\n createCategory(\"web-server-state\", \"Server State\", [\n createOption(\"web-server-state-react-query\", { selected: true }),\n createOption(\"web-data-fetching-swr\"),\n createOption(\"web-data-fetching-graphql-apollo\"),\n ]),\n createCategory(\"api-analytics\", \"Analytics\", [createOption(\"api-analytics-posthog-analytics\")]),\n];\n\nconst categoriesWithFramework: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", {\n state: { status: \"recommended\", reason: \"Popular choice\" },\n selected: true, // Framework selected\n }),\n createOption(\"web-framework-vue-composition-api\"),\n createOption(\"web-framework-angular-standalone\"),\n createOption(\"web-framework-solidjs\"),\n ],\n { required: true },\n ),\n createCategory(\n \"web-styling\",\n \"Styling\",\n [\n createOption(\"web-styling-scss-modules\"),\n createOption(\"web-styling-tailwind\", {\n state: { status: \"recommended\", reason: \"Modern utility-first CSS\" },\n }),\n createOption(\"web-styling-cva\"),\n createOption(\"web-meta-framework-nuxt\"),\n ],\n { required: true },\n ),\n createCategory(\"web-client-state\", \"Client State\", [\n createOption(\"web-state-zustand\", {\n state: { status: \"recommended\", reason: \"Simple and performant\" },\n }),\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-redux-toolkit\", {\n state: { status: \"discouraged\", reason: \"Complex for most apps\" },\n }),\n createOption(\"web-state-mobx\"),\n ]),\n];\n\nconst manyCategories: CategoryRow[] = [\n createCategory(\"web-framework\", \"Category 0\", [\n createOption(\"web-framework-react\"),\n createOption(\"web-framework-vue-composition-api\"),\n createOption(\"web-framework-angular-standalone\"),\n ]),\n createCategory(\"web-styling\", \"Category 1\", [\n createOption(\"web-styling-tailwind\"),\n createOption(\"web-styling-scss-modules\"),\n createOption(\"web-styling-cva\"),\n ]),\n createCategory(\"web-client-state\", \"Category 2\", [\n createOption(\"web-state-zustand\"),\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-mobx\"),\n ]),\n createCategory(\"web-server-state\", \"Category 3\", [\n createOption(\"web-server-state-react-query\"),\n createOption(\"web-data-fetching-swr\"),\n createOption(\"web-data-fetching-graphql-apollo\"),\n ]),\n createCategory(\"web-forms\", \"Category 4\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\"),\n createOption(\"web-forms-zod-validation\"),\n ]),\n createCategory(\"web-testing\", \"Category 5\", [\n createOption(\"web-testing-vitest\"),\n createOption(\"web-testing-playwright-e2e\"),\n createOption(\"web-testing-cypress-e2e\"),\n ]),\n createCategory(\"web-mocking\", \"Category 6\", [\n createOption(\"web-mocks-msw\"),\n createOption(\"web-testing-react-testing-library\"),\n createOption(\"web-testing-vue-test-utils\"),\n ]),\n createCategory(\"web-i18n\", \"Category 7\", [\n createOption(\"web-i18n-next-intl\"),\n createOption(\"web-i18n-react-intl\"),\n createOption(\"web-i18n-vue-i18n\"),\n ]),\n];\n\nconst navCategories: CategoryRow[] = [\n createCategory(\"web-framework\", \"Category 0\", [createOption(\"web-framework-react\")]),\n createCategory(\"web-styling\", \"Category 1\", [createOption(\"web-styling-tailwind\")]),\n createCategory(\"web-client-state\", \"Category 2\", [createOption(\"web-state-zustand\")]),\n createCategory(\"web-server-state\", \"Category 3\", [createOption(\"web-server-state-react-query\")]),\n createCategory(\"web-forms\", \"Category 4\", [createOption(\"web-forms-react-hook-form\")]),\n createCategory(\"web-testing\", \"Category 5\", [createOption(\"web-testing-vitest\")]),\n];\n\nconst defaultProps: CategoryGridProps = {\n categories: defaultCategories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n showLabels: false,\n onToggle: vi.fn(),\n onFocusChange: vi.fn(),\n onToggleLabels: vi.fn(),\n};\n\nconst renderGrid = (props: Partial<CategoryGridProps> = {}) => {\n return render(<CategoryGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"CategoryGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n initializeMatrix(CATEGORY_GRID_MATRIX);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n initializeMatrix(BUILT_IN_MATRIX);\n });\n\n describe(\"rendering\", () => {\n it(\"should render all categories as sections\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n expect(output).toContain(\"Server State\");\n expect(output).toContain(\"Analytics\");\n });\n\n it(\"should render all options in each category\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework options\n expect(output).toContain(\"React\");\n expect(output).toContain(\"Vue\");\n expect(output).toContain(\"Angular\");\n expect(output).toContain(\"SolidJS\");\n // Styling options\n expect(output).toContain(\"SCSS Modules\");\n expect(output).toContain(\"Tailwind\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n // The * should appear after their names\n expect(output).toContain(\"*\");\n });\n\n it(\"should NOT show (optional) for non-required categories\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Optional is assumed by default, so we don't show the label\n expect(output).not.toContain(\"(optional)\");\n });\n\n it(\"should handle empty categories array\", () => {\n const { lastFrame, unmount } = renderGrid({ categories: [] });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should render section underlines\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Unicode horizontal line character used for underlines\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"visual states\", () => {\n it(\"should show selected options with display name\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // scss-mod and react-query are selected in defaultCategories\n expect(output).toContain(\"SCSS Modules\");\n expect(output).toContain(\"React Query\");\n });\n\n it(\"should show unselected options with display name\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Unselected options should display their names from the store\n expect(output).toContain(\"Vue\");\n expect(output).toContain(\"Angular\");\n });\n\n it(\"should NOT show star indicator for recommended options (uses background instead)\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain star (⭐) for recommended\n expect(output).not.toContain(\"\\u2B50\");\n });\n\n it(\"should NOT show warning indicator for discouraged options (uses color instead)\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain warning (⚠) for discouraged\n expect(output).not.toContain(\"\\u26A0\");\n });\n\n it(\"should show discouraged options with warning styling\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n // Discouraged options should show display name\n expect(output).toContain(\"Vee Validate\");\n });\n\n it(\"should render selected skills with display name\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { selected: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render unselected skills with display name\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"normal\" },\n selected: false,\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render discouraged skills with display name\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render discouraged+selected skills with display name\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n selected: true,\n }),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n selected: false,\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n expect(output).toContain(\"Vee Validate\");\n });\n\n it(\"should render discouraged skills with display name from store\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render both selected and unselected skills with display names\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { selected: true }),\n createOption(\"web-forms-vee-validate\", { selected: false }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n expect(output).toContain(\"Vee Validate\");\n });\n\n it(\"should render skill display name regardless of selection state\", () => {\n const categories1: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { selected: false }),\n ]),\n ];\n\n const { lastFrame: frame1, unmount: unmount1 } = renderGrid({ categories: categories1 });\n const output1 = frame1();\n unmount1();\n\n // Second render: same option selected\n const categories2: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { selected: true }),\n ]),\n ];\n\n const { lastFrame: frame2, unmount: unmount2 } = renderGrid({ categories: categories2 });\n cleanup = unmount2;\n const output2 = frame2();\n\n // Both states should render the display name\n expect(output1).toContain(\"React Hook Form\");\n expect(output2).toContain(\"React Hook Form\");\n });\n });\n\n describe(\"locked sections\", () => {\n it(\"should show all categories including locked ones\", () => {\n // No framework selected, so non-framework sections should be locked but visible\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n });\n\n it(\"should unlock sections when framework is selected\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // All sections should be visible and navigable\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n });\n\n it(\"should not lock any sections when no framework category exists\", () => {\n const categoriesNoFramework: CategoryRow[] = [\n createCategory(\"web-styling\", \"Styling\", [\n createOption(\"web-styling-scss-modules\"),\n createOption(\"web-styling-tailwind\"),\n ]),\n createCategory(\"web-client-state\", \"State\", [createOption(\"web-state-zustand\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesNoFramework,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"State\");\n });\n });\n\n describe(\"focus indicator\", () => {\n it(\"should render focused option with display name\", () => {\n const { lastFrame, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Focused option should be visible (background highlighting is visual-only)\n expect(output).toContain(\"React\");\n });\n\n it(\"should render correctly when focusedRow changes\", () => {\n const { lastFrame: frame1, unmount: unmount1 } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n });\n const output1 = frame1();\n unmount1();\n\n const { lastFrame: frame2, unmount: unmount2 } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n });\n cleanup = unmount2;\n const output2 = frame2();\n\n // Both should render the focused category options\n expect(output1).toContain(\"Framework\");\n expect(output2).toContain(\"Styling\");\n });\n\n it(\"should highlight focused category name\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Styling row should be focused (index 1)\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"keyboard navigation - arrow keys\", () => {\n it(\"should call onFocusChange when pressing left arrow\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should call onFocusChange when pressing right arrow\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should call onFocusChange when pressing up arrow (wraps to last row)\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last row (4) since no sections are locked\n expect(onFocusChange).toHaveBeenCalledWith(4, 0);\n });\n\n it(\"should navigate between sections when unlocked\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should move to row 1 (Styling) since framework is selected\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should wrap horizontally when pressing left at first column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last column (index 3 for framework with 4 options)\n expect(onFocusChange).toHaveBeenCalledWith(0, 3);\n });\n\n it(\"should wrap horizontally when pressing right at last column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 3, // Last option in framework\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to first column\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap vertically when all sections are unlocked\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last row (index 2 for 3 categories)\n expect(onFocusChange).toHaveBeenCalledWith(2, 0);\n });\n });\n\n describe(\"keyboard navigation - vim keys\", () => {\n it(\"should move left with h key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"h\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should move right with l key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"l\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should move up with k key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"k\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should move down with j key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"j\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"selection toggle\", () => {\n it(\"should call onToggle when pressing space on a normal option\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1, // vue (normal state)\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \"); // Space\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"web-framework\", \"web-framework-vue-composition-api\");\n });\n\n it(\"should call onToggle when pressing space on a selected option\", async () => {\n const onToggle = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", { selected: true }),\n createOption(\"web-framework-vue-composition-api\"),\n ],\n { required: true },\n ),\n ];\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0, // react (selected)\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"web-framework\", \"web-framework-react\");\n });\n\n it(\"should call onToggle for discouraged options (still selectable)\", async () => {\n const onToggle = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n\n it(\"should keep focus on initial row when no sections are locked\", async () => {\n const onFocusChange = vi.fn();\n const { unmount } = renderGrid({\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Focus stays on row 1 since no sections are locked\n expect(onFocusChange).not.toHaveBeenCalled();\n });\n });\n\n describe(\"discouraged options navigation\", () => {\n it(\"should navigate to discouraged options when navigating right\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-zod-validation\"),\n ]),\n ];\n\n // Options stay in original order: [opt1, opt2(discouraged), opt3]\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Navigating right from index 0 goes to index 1 (opt2, discouraged but hoverable)\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should navigate to discouraged options when navigating left\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-zod-validation\"),\n ]),\n ];\n\n // Options stay in original order: [opt1, opt2(discouraged), opt3]\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 2, // Start at opt3 (index 2)\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n // Discouraged options are hoverable — navigates to index 1 (opt2)\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should navigate between all-discouraged options in a row\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-react-hook-form\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n ]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Discouraged options are hoverable — navigates to index 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n });\n\n describe(\"exclusive categories\", () => {\n it(\"should render exclusive category correctly\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // All default categories are exclusive, should render normally\n expect(output).toContain(\"Framework\");\n });\n\n // Note: The actual exclusivity logic (only one selection) is handled\n // by the parent component via onToggle. CategoryGrid just displays\n // the current state.\n });\n\n describe(\"tab navigation\", () => {\n it(\"should jump to next section when pressing Tab\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(TAB);\n await delay(INPUT_DELAY_MS);\n\n // Should jump to next section (row 1)\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should jump to next section on Tab\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(TAB);\n await delay(INPUT_DELAY_MS);\n\n // Should jump to next section since no sections are locked\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"compatibility labels toggle\", () => {\n it(\"should call onToggleLabels when pressing d key\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderGrid({\n onToggleLabels,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\n\n it(\"should show compatibility labels when showLabels is true\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show compatibility label suffixes on skill tags\n expect(output).toContain(\"(recommended)\"); // react has state: { status: \"recommended\", reason: \"Recommended choice\" }\n });\n\n it(\"should not show label for selected skills when showLabels is true\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n // Selected skills show no label — selection is visually obvious from color\n expect(output).not.toContain(\"(selected)\");\n });\n\n it(\"should show Discouraged label when showLabels is true and skill is focused\", () => {\n // Use categoriesWithFramework so Client State section is unlocked\n // Redux (discouraged) is at row 2, col 2\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n showLabels: true,\n defaultFocusedRow: 2,\n defaultFocusedCol: 2,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(discouraged)\");\n });\n\n it(\"should hide compatibility labels when showLabels is false\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: false });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels should not be visible when toggle is off\n expect(output).not.toContain(\"(recommended)\");\n expect(output).not.toContain(\"(selected)\");\n expect(output).not.toContain(\"(discouraged)\");\n });\n\n it(\"should show discouraged label for focused discouraged option when showLabels is true\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-forms-vee-validate\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-forms-react-hook-form\"),\n ]),\n ];\n\n // First option is focused by default — make it the discouraged one\n const { lastFrame, unmount } = renderGrid({ categories, showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(discouraged)\");\n });\n });\n\n describe(\"option ordering\", () => {\n it(\"should preserve original order regardless of state\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\", {\n state: { status: \"recommended\", reason: \"Recommended choice\" },\n }),\n createOption(\"web-state-redux-toolkit\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-state-mobx\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame()!;\n const jotaiIdx = output.indexOf(\"Jotai\");\n const zustandIdx = output.indexOf(\"Zustand\");\n const reduxIdx = output.indexOf(\"Redux\");\n const mobxIdx = output.indexOf(\"MobX\");\n\n // Order should match the input array, not be sorted by state\n expect(jotaiIdx).toBeLessThan(zustandIdx);\n expect(zustandIdx).toBeLessThan(reduxIdx);\n expect(reduxIdx).toBeLessThan(mobxIdx);\n });\n\n it(\"should not change order when a skill is selected\", () => {\n const categoriesBefore: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\"),\n createOption(\"web-state-redux-toolkit\"),\n ]),\n ];\n\n const categoriesAfter: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\", { selected: true }),\n createOption(\"web-state-redux-toolkit\"),\n ]),\n ];\n\n const { lastFrame: frameBefore, unmount: unmountBefore } = renderGrid({\n categories: categoriesBefore,\n });\n const outputBefore = frameBefore()!;\n unmountBefore();\n\n const { lastFrame: frameAfter, unmount: unmountAfter } = renderGrid({\n categories: categoriesAfter,\n });\n cleanup = unmountAfter;\n const outputAfter = frameAfter()!;\n\n // Verify order is preserved: Jotai < Zustand < Redux in both\n expect(outputBefore.indexOf(\"Jotai\")).toBeLessThan(outputBefore.indexOf(\"Zustand\"));\n expect(outputBefore.indexOf(\"Zustand\")).toBeLessThan(outputBefore.indexOf(\"Redux\"));\n expect(outputAfter.indexOf(\"Jotai\")).toBeLessThan(outputAfter.indexOf(\"Zustand\"));\n expect(outputAfter.indexOf(\"Zustand\")).toBeLessThan(outputAfter.indexOf(\"Redux\"));\n });\n\n it(\"should not change order when a skill state changes from normal to discouraged\", () => {\n const categoriesBefore: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\"),\n createOption(\"web-state-redux-toolkit\"),\n ]),\n ];\n\n const categoriesAfter: CategoryRow[] = [\n createCategory(\"web-client-state\", \"State\", [\n createOption(\"web-state-jotai\"),\n createOption(\"web-state-zustand\", {\n state: { status: \"discouraged\", reason: \"Not recommended\" },\n }),\n createOption(\"web-state-redux-toolkit\"),\n ]),\n ];\n\n const { lastFrame: frameBefore, unmount: unmountBefore } = renderGrid({\n categories: categoriesBefore,\n });\n const outputBefore = frameBefore()!;\n unmountBefore();\n\n const { lastFrame: frameAfter, unmount: unmountAfter } = renderGrid({\n categories: categoriesAfter,\n });\n cleanup = unmountAfter;\n const outputAfter = frameAfter()!;\n\n // Zustand stays in the middle even after becoming discouraged\n expect(outputBefore.indexOf(\"Jotai\")).toBeLessThan(outputBefore.indexOf(\"Zustand\"));\n expect(outputBefore.indexOf(\"Zustand\")).toBeLessThan(outputBefore.indexOf(\"Redux\"));\n expect(outputAfter.indexOf(\"Jotai\")).toBeLessThan(outputAfter.indexOf(\"Zustand\"));\n expect(outputAfter.indexOf(\"Zustand\")).toBeLessThan(outputAfter.indexOf(\"Redux\"));\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle single category\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Single Category\", [createOption(\"web-forms-react-hook-form\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Single Category\");\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should handle single option in category\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Single\", [createOption(\"web-forms-react-hook-form\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should handle category with many options (flows naturally)\", () => {\n const manySkillIds: SkillId[] = [\n \"web-framework-react\",\n \"web-framework-vue-composition-api\",\n \"web-framework-angular-standalone\",\n \"web-framework-solidjs\",\n \"web-meta-framework-nuxt\",\n \"web-meta-framework-remix\",\n \"web-meta-framework-nextjs\",\n \"web-styling-tailwind\",\n \"web-styling-scss-modules\",\n ];\n const options = manySkillIds.map((id) => createOption(id));\n const categories: CategoryRow[] = [createCategory(\"web-mocking\", \"Many Options\", options)];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Many Options\");\n // All options should be present (no fixed row limit)\n expect(output).toContain(\"React\");\n expect(output).toContain(\"SCSS Modules\");\n });\n\n it(\"should handle long display names\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-i18n\", \"Long Labels\", [\n createOption(\"web-i18n-next-intl\"),\n createOption(\"web-i18n-react-intl\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n // Display names should be rendered (flowing layout handles long names)\n expect(output).toContain(\"Next Intl\");\n });\n\n it(\"should handle categories with different option counts\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-framework\", \"Category 1\", [\n createOption(\"web-forms-react-hook-form\"),\n createOption(\"web-forms-vee-validate\"),\n ]),\n createCategory(\"web-styling\", \"Category 2\", [createOption(\"web-forms-zod-validation\")]),\n createCategory(\"web-client-state\", \"Category 3\", [\n createOption(\"web-testing-vitest\"),\n createOption(\"web-testing-playwright-e2e\"),\n createOption(\"web-testing-react-testing-library\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Category 1\");\n expect(output).toContain(\"Category 2\");\n expect(output).toContain(\"Category 3\");\n });\n });\n\n describe(\"column adjustment\", () => {\n it(\"should adjust focusedCol when changing to row with fewer options\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-forms-react-hook-form\", { selected: true }), // Framework selected\n createOption(\"web-forms-vee-validate\"),\n createOption(\"web-forms-zod-validation\"),\n ],\n { required: true },\n ),\n createCategory(\"web-styling\", \"Category 2\", [createOption(\"web-testing-vitest\")]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 2, // Last option in first row\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should move to row 1, and col should be clamped to 0 (only option)\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"installed skills\", () => {\n it(\"should render installed skill with display name (no checkmark icon)\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { installed: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render installed and selected skill with display name only\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", {\n installed: true,\n selected: true,\n }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"React Hook Form\");\n });\n\n it(\"should render local installed skill without L badge or checkmark\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-forms-react-hook-form\", { local: true, installed: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"React Hook Form\");\n });\n });\n\n describe(\"natural flow (no virtual scroll)\", () => {\n it(\"should render all categories without scroll indicators\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n expect(output).toContain(\"Server State\");\n expect(output).toContain(\"Analytics\");\n expect(output).not.toContain(\"more categories\");\n });\n\n it(\"should render all categories even with many entries\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: manyCategories,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n for (const category of manyCategories) {\n expect(output).toContain(category.displayName);\n }\n expect(output).not.toContain(\"more categories\");\n });\n\n it(\"should keep focused category visible when navigating down\", async () => {\n const onFocusChange = vi.fn();\n\n const { stdin, lastFrame, unmount } = renderGrid({\n categories: navCategories,\n defaultFocusedRow: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Category 3\");\n });\n });\n\n describe(\"selection counter\", () => {\n it(\"should show 'X of 1' for exclusive categories with no selection\", () => {\n const categories = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [createOption(\"web-framework-react\"), createOption(\"web-framework-vue-composition-api\")],\n { exclusive: true },\n ),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(0 of 1)\");\n });\n\n it(\"should show '1 of 1' for exclusive categories with one selection\", () => {\n const categories = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", { selected: true }),\n createOption(\"web-framework-vue-composition-api\"),\n ],\n { exclusive: true },\n ),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(1 of 1)\");\n });\n\n it(\"should not show counter for non-exclusive categories\", () => {\n const categories = [\n createCategory(\n \"web-testing\",\n \"Testing\",\n [\n createOption(\"web-testing-vitest\", { selected: true }),\n createOption(\"web-testing-playwright-e2e\", { selected: true }),\n createOption(\"web-testing-cypress-e2e\"),\n ],\n { exclusive: false },\n ),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"selected)\");\n expect(output).not.toContain(\"of 1)\");\n });\n\n it(\"should only show counter for exclusive categories in mixed layout\", () => {\n const categories = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-framework-react\", { selected: true }),\n createOption(\"web-framework-vue-composition-api\"),\n ],\n { exclusive: true },\n ),\n createCategory(\n \"web-testing\",\n \"Testing\",\n [\n createOption(\"web-testing-vitest\", { selected: true }),\n createOption(\"web-testing-playwright-e2e\", { selected: true }),\n createOption(\"web-testing-cypress-e2e\"),\n ],\n { exclusive: false },\n ),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(1 of 1)\");\n expect(output).not.toContain(\"selected)\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DomainSelection
4
- } from "../../chunk-36YW5E7G.js";
5
- import "../../chunk-UBNHVBSV.js";
4
+ } from "../../chunk-AQ5KP4YW.js";
5
+ import "../../chunk-7JQIMEUX.js";
6
6
  import "../../chunk-ERHTXNIF.js";
7
7
  import "../../chunk-SQ7WINEU.js";
8
8
  import "../../chunk-JNQKCZA3.js";
9
9
  import "../../chunk-FFMWFEUH.js";
10
- import "../../chunk-PRG7PKZM.js";
11
- import "../../chunk-WS3TL2AO.js";
12
- import "../../chunk-I534EWJQ.js";
13
- import "../../chunk-JWMYAJHD.js";
14
- import "../../chunk-WN2TUP4M.js";
15
- import "../../chunk-Q4PJSAMP.js";
10
+ import "../../chunk-CY23HPDE.js";
11
+ import "../../chunk-CZLXZ75E.js";
12
+ import "../../chunk-IFCASC6R.js";
13
+ import "../../chunk-FSK4TQX7.js";
14
+ import "../../chunk-XYPAOBBV.js";
15
+ import "../../chunk-32HX6UYI.js";
16
16
  import "../../chunk-FMYAYX6W.js";
17
- import "../../chunk-7XUKTYVD.js";
17
+ import "../../chunk-EO6KJI5D.js";
18
18
  import "../../chunk-DHET7RCE.js";
19
19
  export {
20
20
  DomainSelection
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  HelpModal
4
- } from "../../chunk-IDN2OZJY.js";
5
- import "../../chunk-CBYRFAUN.js";
4
+ } from "../../chunk-C22ACAL2.js";
5
+ import "../../chunk-HK53FRMU.js";
6
6
  import "../../chunk-FMYAYX6W.js";
7
7
  import "../../chunk-DHET7RCE.js";
8
8
  export {
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SearchModal
4
- } from "../../chunk-NWW3OJH5.js";
4
+ } from "../../chunk-A5JSBU65.js";
5
5
  import "../../chunk-MLXAZODL.js";
6
6
  import "../../chunk-KUV24B5M.js";
7
- import "../../chunk-CBYRFAUN.js";
7
+ import "../../chunk-HK53FRMU.js";
8
8
  import "../../chunk-FMYAYX6W.js";
9
9
  import "../../chunk-DHET7RCE.js";
10
10
  export {
@@ -20,10 +20,10 @@ import {
20
20
  } from "../../chunk-XY3XDVMI.js";
21
21
  import {
22
22
  SearchModal
23
- } from "../../chunk-NWW3OJH5.js";
23
+ } from "../../chunk-A5JSBU65.js";
24
24
  import "../../chunk-MLXAZODL.js";
25
25
  import "../../chunk-KUV24B5M.js";
26
- import "../../chunk-CBYRFAUN.js";
26
+ import "../../chunk-HK53FRMU.js";
27
27
  import "../../chunk-FMYAYX6W.js";
28
28
  import {
29
29
  init_esm_shims
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SourceGrid
4
- } from "../../chunk-I2SUTL7S.js";
4
+ } from "../../chunk-B66E255O.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
- import "../../chunk-NWW3OJH5.js";
6
+ import "../../chunk-A5JSBU65.js";
7
7
  import "../../chunk-P2FHS5IS.js";
8
8
  import "../../chunk-FFMWFEUH.js";
9
9
  import "../../chunk-MLXAZODL.js";
10
10
  import "../../chunk-KUV24B5M.js";
11
- import "../../chunk-CBYRFAUN.js";
12
- import "../../chunk-JWMYAJHD.js";
11
+ import "../../chunk-HK53FRMU.js";
12
+ import "../../chunk-FSK4TQX7.js";
13
13
  import "../../chunk-FMYAYX6W.js";
14
14
  import "../../chunk-DHET7RCE.js";
15
15
  export {
@@ -16,12 +16,12 @@ import {
16
16
  } from "../../chunk-66UDJBF6.js";
17
17
  import {
18
18
  WEB_TRIO_MATRIX
19
- } from "../../chunk-6F3CZLD6.js";
20
- import "../../chunk-M4ZDKHJV.js";
19
+ } from "../../chunk-XA7WF3BI.js";
20
+ import "../../chunk-MUCQ27HV.js";
21
21
  import {
22
22
  createMockMatrix,
23
23
  createMockSkill
24
- } from "../../chunk-WMMU5FOO.js";
24
+ } from "../../chunk-FUWUCKES.js";
25
25
  import {
26
26
  afterEach,
27
27
  beforeEach,
@@ -32,25 +32,25 @@ import {
32
32
  } from "../../chunk-XY3XDVMI.js";
33
33
  import {
34
34
  SourceGrid
35
- } from "../../chunk-I2SUTL7S.js";
35
+ } from "../../chunk-B66E255O.js";
36
36
  import "../../chunk-7SOPVGDV.js";
37
- import "../../chunk-NWW3OJH5.js";
37
+ import "../../chunk-A5JSBU65.js";
38
38
  import "../../chunk-P2FHS5IS.js";
39
39
  import "../../chunk-FFMWFEUH.js";
40
40
  import "../../chunk-MLXAZODL.js";
41
41
  import "../../chunk-KUV24B5M.js";
42
- import "../../chunk-PRG7PKZM.js";
43
- import "../../chunk-CBYRFAUN.js";
44
- import "../../chunk-WS3TL2AO.js";
45
- import "../../chunk-I534EWJQ.js";
42
+ import "../../chunk-CY23HPDE.js";
43
+ import "../../chunk-HK53FRMU.js";
44
+ import "../../chunk-CZLXZ75E.js";
45
+ import "../../chunk-IFCASC6R.js";
46
46
  import {
47
47
  BUILT_IN_MATRIX,
48
48
  initializeMatrix
49
- } from "../../chunk-JWMYAJHD.js";
50
- import "../../chunk-WN2TUP4M.js";
51
- import "../../chunk-Q4PJSAMP.js";
49
+ } from "../../chunk-FSK4TQX7.js";
50
+ import "../../chunk-XYPAOBBV.js";
51
+ import "../../chunk-32HX6UYI.js";
52
52
  import "../../chunk-FMYAYX6W.js";
53
- import "../../chunk-7XUKTYVD.js";
53
+ import "../../chunk-EO6KJI5D.js";
54
54
  import {
55
55
  init_esm_shims
56
56
  } from "../../chunk-DHET7RCE.js";
@@ -1,17 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "../../chunk-EWBNSS5Y.js";
5
- import "../../chunk-K63OEZW7.js";
4
+ } from "../../chunk-SGKNE6EJ.js";
5
+ import "../../chunk-K77I4XGL.js";
6
+ import "../../chunk-SQ7WINEU.js";
6
7
  import "../../chunk-FFMWFEUH.js";
7
- import "../../chunk-PRG7PKZM.js";
8
- import "../../chunk-WS3TL2AO.js";
9
- import "../../chunk-I534EWJQ.js";
10
- import "../../chunk-JWMYAJHD.js";
11
- import "../../chunk-WN2TUP4M.js";
12
- import "../../chunk-Q4PJSAMP.js";
8
+ import "../../chunk-CY23HPDE.js";
9
+ import "../../chunk-CZLXZ75E.js";
10
+ import "../../chunk-IFCASC6R.js";
11
+ import "../../chunk-FSK4TQX7.js";
12
+ import "../../chunk-XYPAOBBV.js";
13
+ import "../../chunk-32HX6UYI.js";
13
14
  import "../../chunk-FMYAYX6W.js";
14
- import "../../chunk-7XUKTYVD.js";
15
+ import "../../chunk-EO6KJI5D.js";
15
16
  import "../../chunk-DHET7RCE.js";
16
17
  export {
17
18
  StackSelection
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepAgents
4
- } from "../../chunk-S6DKM6MJ.js";
4
+ } from "../../chunk-XU6N3OIS.js";
5
5
  import "../../chunk-K77I4XGL.js";
6
- import "../../chunk-UBNHVBSV.js";
6
+ import "../../chunk-7JQIMEUX.js";
7
7
  import "../../chunk-SQ7WINEU.js";
8
8
  import "../../chunk-JNQKCZA3.js";
9
9
  import "../../chunk-FFMWFEUH.js";
10
- import "../../chunk-PRG7PKZM.js";
11
- import "../../chunk-WS3TL2AO.js";
12
- import "../../chunk-I534EWJQ.js";
13
- import "../../chunk-JWMYAJHD.js";
14
- import "../../chunk-WN2TUP4M.js";
15
- import "../../chunk-Q4PJSAMP.js";
10
+ import "../../chunk-CY23HPDE.js";
11
+ import "../../chunk-CZLXZ75E.js";
12
+ import "../../chunk-IFCASC6R.js";
13
+ import "../../chunk-FSK4TQX7.js";
14
+ import "../../chunk-XYPAOBBV.js";
15
+ import "../../chunk-32HX6UYI.js";
16
16
  import "../../chunk-FMYAYX6W.js";
17
- import "../../chunk-7XUKTYVD.js";
17
+ import "../../chunk-EO6KJI5D.js";
18
18
  import "../../chunk-DHET7RCE.js";
19
19
  export {
20
20
  StepAgents