@agents-inc/cli 0.71.0 → 0.73.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 (181) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +172 -23
  3. package/dist/{chunk-V5L532ZH.js → chunk-3K6FSET7.js} +6 -6
  4. package/dist/{chunk-HWVRHPXR.js → chunk-3REVX6S5.js} +11 -11
  5. package/dist/chunk-3REVX6S5.js.map +1 -0
  6. package/dist/{chunk-CADG5WWP.js → chunk-3VNQPCOE.js} +2511 -2688
  7. package/dist/chunk-3VNQPCOE.js.map +1 -0
  8. package/dist/{chunk-KANNRFY7.js → chunk-4KLUOFP6.js} +6 -7
  9. package/dist/chunk-4KLUOFP6.js.map +1 -0
  10. package/dist/{chunk-FCF4WQEI.js → chunk-6JRQPSKV.js} +2 -2
  11. package/dist/chunk-6JRQPSKV.js.map +1 -0
  12. package/dist/{chunk-ZYUASJUN.js → chunk-BH4LN7XV.js} +8 -6
  13. package/dist/chunk-BH4LN7XV.js.map +1 -0
  14. package/dist/{chunk-6YMW4HMX.js → chunk-DNPJ5GUK.js} +6 -6
  15. package/dist/chunk-DNPJ5GUK.js.map +1 -0
  16. package/dist/chunk-E74Q7GUE.js +5132 -0
  17. package/dist/chunk-E74Q7GUE.js.map +1 -0
  18. package/dist/{chunk-XYRVAEI6.js → chunk-EMWP363L.js} +8 -10
  19. package/dist/chunk-EMWP363L.js.map +1 -0
  20. package/dist/chunk-EMX7PA2I.js +39 -0
  21. package/dist/chunk-EMX7PA2I.js.map +1 -0
  22. package/dist/{chunk-KSAGOKWT.js → chunk-G23HPF6K.js} +3 -3
  23. package/dist/chunk-GDUOOT3J.js +689 -0
  24. package/dist/chunk-GDUOOT3J.js.map +1 -0
  25. package/dist/{chunk-X4RIMJNY.js → chunk-GSFZDUV2.js} +4 -4
  26. package/dist/chunk-GSFZDUV2.js.map +1 -0
  27. package/dist/{chunk-XB3TYSPL.js → chunk-H4ETXZVL.js} +6 -6
  28. package/dist/{chunk-XMZNHLV3.js → chunk-JHMECCBN.js} +4 -5
  29. package/dist/chunk-JHMECCBN.js.map +1 -0
  30. package/dist/{chunk-UDAHHJIM.js → chunk-K7WYMQQB.js} +18 -20
  31. package/dist/chunk-K7WYMQQB.js.map +1 -0
  32. package/dist/{chunk-AX6MMYAZ.js → chunk-KE2EAVFQ.js} +4 -4
  33. package/dist/{chunk-CKPJTMNC.js → chunk-KSMT5FVM.js} +4 -4
  34. package/dist/chunk-KSMT5FVM.js.map +1 -0
  35. package/dist/{chunk-KWB3B2HS.js → chunk-NKKYTCBH.js} +109 -86
  36. package/dist/chunk-NKKYTCBH.js.map +1 -0
  37. package/dist/{chunk-52THXN5G.js → chunk-NUJHWYCR.js} +2 -2
  38. package/dist/{chunk-QOJAZI72.js → chunk-OLWGGD4G.js} +20 -15
  39. package/dist/chunk-OLWGGD4G.js.map +1 -0
  40. package/dist/{chunk-UQM5YPPJ.js → chunk-PNZCVOCE.js} +5 -5
  41. package/dist/chunk-PNZCVOCE.js.map +1 -0
  42. package/dist/chunk-SRIH4U5Y.js +159 -0
  43. package/dist/chunk-SRIH4U5Y.js.map +1 -0
  44. package/dist/{chunk-6BXKF5GP.js → chunk-T7QY777F.js} +2 -2
  45. package/dist/{chunk-DHBRWGRZ.js → chunk-TNSVPZHP.js} +20 -2
  46. package/dist/chunk-TNSVPZHP.js.map +1 -0
  47. package/dist/{chunk-J2D6OBIX.js → chunk-V5HR77EY.js} +117 -13
  48. package/dist/chunk-V5HR77EY.js.map +1 -0
  49. package/dist/{chunk-R3AR4VLZ.js → chunk-WJL4KU5V.js} +70 -240
  50. package/dist/chunk-WJL4KU5V.js.map +1 -0
  51. package/dist/{chunk-VUUGWE6G.js → chunk-Y47CLMWE.js} +2 -2
  52. package/dist/{chunk-2VT2DMD7.js → chunk-Y4VUU5BT.js} +12 -14
  53. package/dist/chunk-Y4VUU5BT.js.map +1 -0
  54. package/dist/{chunk-L6MTIQ2U.js → chunk-ZBLSWJFM.js} +2 -2
  55. package/dist/chunk-ZBLSWJFM.js.map +1 -0
  56. package/dist/commands/build/marketplace.js +4 -3
  57. package/dist/commands/build/marketplace.js.map +1 -1
  58. package/dist/commands/build/plugins.js +9 -8
  59. package/dist/commands/build/plugins.js.map +1 -1
  60. package/dist/commands/build/stack.js +9 -8
  61. package/dist/commands/build/stack.js.map +1 -1
  62. package/dist/commands/compile.js +14 -10
  63. package/dist/commands/compile.js.map +1 -1
  64. package/dist/commands/config/index.js +9 -8
  65. package/dist/commands/config/index.js.map +1 -1
  66. package/dist/commands/config/path.js +8 -7
  67. package/dist/commands/config/path.js.map +1 -1
  68. package/dist/commands/config/show.js +9 -8
  69. package/dist/commands/diff.js +8 -7
  70. package/dist/commands/diff.js.map +1 -1
  71. package/dist/commands/doctor.js +13 -14
  72. package/dist/commands/doctor.js.map +1 -1
  73. package/dist/commands/edit.js +33 -35
  74. package/dist/commands/edit.js.map +1 -1
  75. package/dist/commands/eject.js +15 -13
  76. package/dist/commands/eject.js.map +1 -1
  77. package/dist/commands/import/skill.js +8 -7
  78. package/dist/commands/import/skill.js.map +1 -1
  79. package/dist/commands/info.js +12 -11
  80. package/dist/commands/info.js.map +1 -1
  81. package/dist/commands/init.js +28 -27
  82. package/dist/commands/list.js +8 -7
  83. package/dist/commands/list.js.map +1 -1
  84. package/dist/commands/new/agent.js +9 -8
  85. package/dist/commands/new/agent.js.map +1 -1
  86. package/dist/commands/new/marketplace.js +12 -15
  87. package/dist/commands/new/marketplace.js.map +1 -1
  88. package/dist/commands/new/skill.js +9 -8
  89. package/dist/commands/outdated.js +8 -7
  90. package/dist/commands/outdated.js.map +1 -1
  91. package/dist/commands/search.js +9 -10
  92. package/dist/commands/search.js.map +1 -1
  93. package/dist/commands/uninstall.js +8 -7
  94. package/dist/commands/uninstall.js.map +1 -1
  95. package/dist/commands/update.js +10 -10
  96. package/dist/commands/update.js.map +1 -1
  97. package/dist/commands/validate.js +16 -18
  98. package/dist/commands/validate.js.map +1 -1
  99. package/dist/components/wizard/category-grid.js +2 -2
  100. package/dist/components/wizard/category-grid.test.js +17 -66
  101. package/dist/components/wizard/category-grid.test.js.map +1 -1
  102. package/dist/components/wizard/domain-selection.js +10 -9
  103. package/dist/components/wizard/search-modal.test.js.map +1 -1
  104. package/dist/components/wizard/source-grid.js +4 -4
  105. package/dist/components/wizard/source-grid.test.js +22 -20
  106. package/dist/components/wizard/source-grid.test.js.map +1 -1
  107. package/dist/components/wizard/stack-selection.js +9 -8
  108. package/dist/components/wizard/step-agents.js +10 -9
  109. package/dist/components/wizard/step-agents.test.js +15 -14
  110. package/dist/components/wizard/step-agents.test.js.map +1 -1
  111. package/dist/components/wizard/step-build.js +11 -10
  112. package/dist/components/wizard/step-build.test.js +17 -16
  113. package/dist/components/wizard/step-build.test.js.map +1 -1
  114. package/dist/components/wizard/step-confirm.js +5 -4
  115. package/dist/components/wizard/step-confirm.test.js +11 -10
  116. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  117. package/dist/components/wizard/step-settings.js +9 -8
  118. package/dist/components/wizard/step-settings.test.js +12 -11
  119. package/dist/components/wizard/step-settings.test.js.map +1 -1
  120. package/dist/components/wizard/step-sources.js +14 -13
  121. package/dist/components/wizard/step-sources.test.js +19 -18
  122. package/dist/components/wizard/step-sources.test.js.map +1 -1
  123. package/dist/components/wizard/step-stack.js +12 -11
  124. package/dist/components/wizard/step-stack.test.js +16 -15
  125. package/dist/components/wizard/step-stack.test.js.map +1 -1
  126. package/dist/components/wizard/wizard-layout.js +9 -8
  127. package/dist/components/wizard/wizard.js +26 -25
  128. package/dist/config-exports.js +1 -1
  129. package/dist/hooks/init.js +28 -27
  130. package/dist/hooks/init.js.map +1 -1
  131. package/dist/{loader-CMSC3RAO.js → loader-XQ3WBTVP.js} +4 -3
  132. package/dist/source-loader-F4PGP6LH.js +18 -0
  133. package/dist/source-manager-QCIO4XZK.js +20 -0
  134. package/dist/stores/wizard-store.js +8 -7
  135. package/dist/stores/wizard-store.test.js +34 -33
  136. package/dist/stores/wizard-store.test.js.map +1 -1
  137. package/package.json +2 -1
  138. package/src/schemas/custom-metadata.schema.json +81 -0
  139. package/src/schemas/metadata.schema.json +127 -41
  140. package/src/schemas/stacks.schema.json +3 -45
  141. package/dist/chunk-2VT2DMD7.js.map +0 -1
  142. package/dist/chunk-6YMW4HMX.js.map +0 -1
  143. package/dist/chunk-BKL3DF2Q.js +0 -45
  144. package/dist/chunk-BKL3DF2Q.js.map +0 -1
  145. package/dist/chunk-CADG5WWP.js.map +0 -1
  146. package/dist/chunk-CKPJTMNC.js.map +0 -1
  147. package/dist/chunk-DA3WIZ4C.js +0 -253
  148. package/dist/chunk-DA3WIZ4C.js.map +0 -1
  149. package/dist/chunk-DHBRWGRZ.js.map +0 -1
  150. package/dist/chunk-FCF4WQEI.js.map +0 -1
  151. package/dist/chunk-HWVRHPXR.js.map +0 -1
  152. package/dist/chunk-J2D6OBIX.js.map +0 -1
  153. package/dist/chunk-KANNRFY7.js.map +0 -1
  154. package/dist/chunk-KWB3B2HS.js.map +0 -1
  155. package/dist/chunk-L6MTIQ2U.js.map +0 -1
  156. package/dist/chunk-QOJAZI72.js.map +0 -1
  157. package/dist/chunk-R3AR4VLZ.js.map +0 -1
  158. package/dist/chunk-T4EXUIBY.js +0 -19
  159. package/dist/chunk-T4EXUIBY.js.map +0 -1
  160. package/dist/chunk-UDAHHJIM.js.map +0 -1
  161. package/dist/chunk-UQM5YPPJ.js.map +0 -1
  162. package/dist/chunk-X4RIMJNY.js.map +0 -1
  163. package/dist/chunk-XMZNHLV3.js.map +0 -1
  164. package/dist/chunk-XYRVAEI6.js.map +0 -1
  165. package/dist/chunk-ZYUASJUN.js.map +0 -1
  166. package/dist/source-loader-3MZ2MBOF.js +0 -17
  167. package/dist/source-manager-NEH6QXE5.js +0 -19
  168. package/dist/stores/matrix-store.js +0 -15
  169. package/dist/stores/matrix-store.js.map +0 -1
  170. package/dist/stores/matrix-store.test.js +0 -127
  171. package/dist/stores/matrix-store.test.js.map +0 -1
  172. /package/dist/{chunk-V5L532ZH.js.map → chunk-3K6FSET7.js.map} +0 -0
  173. /package/dist/{chunk-KSAGOKWT.js.map → chunk-G23HPF6K.js.map} +0 -0
  174. /package/dist/{chunk-XB3TYSPL.js.map → chunk-H4ETXZVL.js.map} +0 -0
  175. /package/dist/{chunk-AX6MMYAZ.js.map → chunk-KE2EAVFQ.js.map} +0 -0
  176. /package/dist/{chunk-52THXN5G.js.map → chunk-NUJHWYCR.js.map} +0 -0
  177. /package/dist/{chunk-6BXKF5GP.js.map → chunk-T7QY777F.js.map} +0 -0
  178. /package/dist/{chunk-VUUGWE6G.js.map → chunk-Y47CLMWE.js.map} +0 -0
  179. /package/dist/{loader-CMSC3RAO.js.map → loader-XQ3WBTVP.js.map} +0 -0
  180. /package/dist/{source-loader-3MZ2MBOF.js.map → source-loader-F4PGP6LH.js.map} +0 -0
  181. /package/dist/{source-manager-NEH6QXE5.js.map → source-manager-QCIO4XZK.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/__tests__/mock-data/mock-matrices.ts","../src/cli/lib/__tests__/mock-data/mock-skills.ts"],"sourcesContent":["// Shared matrix configs and compile configs for test files.\n// Uses createMockMatrixConfig/createMockCompileConfig from helpers.ts.\n\nimport { groupBy, mapValues } from \"remeda\";\n\nimport {\n createMockMatrixConfig,\n createMockCompileConfig,\n createMockCategory,\n createMockMatrix,\n createMockMultiSourceSkill,\n createMockSkill,\n testSkillToResolvedSkill,\n} from \"../helpers.js\";\nimport { SKILLS, TEST_CATEGORIES } from \"../test-fixtures.js\";\nimport { FRAMEWORK_CATEGORY, MULTI_SOURCE_CATEGORIES } from \"./mock-categories.js\";\nimport {\n CATEGORY_GRID_SKILLS,\n HEALTH_ALL_REFS_RESOLVED_SKILL,\n HEALTH_MULTIPLE_UNRESOLVED_REFS_SKILL,\n HEALTH_ORPHAN_SKILL,\n HEALTH_PARTIAL_UNRESOLVED_REQUIRES_SKILL,\n HEALTH_UNRESOLVED_COMPATIBLE_WITH_SKILL,\n HEALTH_UNRESOLVED_CONFLICTS_WITH_SKILL,\n HEALTH_UNRESOLVED_REQUIRES_SKILL,\n HEALTH_ZUSTAND_RECOMMENDED,\n MULTI_SOURCE_PUBLIC_SKILLS,\n MULTI_SOURCE_ACME_SKILLS,\n MULTI_SOURCE_INTERNAL_SKILLS,\n PIPELINE_TEST_SKILLS,\n} from \"./mock-skills.js\";\nimport type { MultiSourceSkillEntry } from \"./mock-skills.js\";\nimport { PUBLIC_SOURCE, ACME_SOURCE, INTERNAL_SOURCE } from \"./mock-sources.js\";\nimport type {\n Category,\n CategoryDefinition,\n CategoryPath,\n MergedSkillsMatrix,\n SkillId,\n SkillSlug,\n SkillSource,\n} from \"../../../types\";\n\n// ---------------------------------------------------------------------------\n// Canonical matrix shapes — use these instead of inline createMockMatrix() calls\n// ---------------------------------------------------------------------------\n\nexport const EMPTY_MATRIX = createMockMatrix();\nexport const SINGLE_REACT_MATRIX = createMockMatrix(SKILLS.react);\nexport const WEB_PAIR_MATRIX = createMockMatrix(SKILLS.react, SKILLS.zustand);\nexport const FULLSTACK_PAIR_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono);\nexport const WEB_TRIO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.vitest);\nexport const FULLSTACK_TRIO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono, SKILLS.vitest);\nexport const VITEST_REACT_HONO_MATRIX = createMockMatrix(SKILLS.vitest, SKILLS.react, SKILLS.hono);\nexport const REACT_SCSS_MATRIX = createMockMatrix(SKILLS.react, SKILLS.scss);\nexport const REACT_SCSS_HONO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.scss, SKILLS.hono);\nexport const SCSS_HONO_REACT_MATRIX = createMockMatrix(SKILLS.scss, SKILLS.hono, SKILLS.react);\nexport const HONO_REACT_MATRIX = createMockMatrix(SKILLS.hono, SKILLS.react);\nexport const REACT_ZUSTAND_HONO_MATRIX = createMockMatrix(\n SKILLS.react,\n SKILLS.zustand,\n SKILLS.hono,\n);\n\nexport const CATEGORY_GRID_MATRIX = createMockMatrix(\n ...CATEGORY_GRID_SKILLS.map(({ id, displayName, category }) =>\n createMockSkill(id, { displayName, category }),\n ),\n);\n\n// ---------------------------------------------------------------------------\n// All-skills matrices with category overrides — for wizard store tests\n// ---------------------------------------------------------------------------\n\nexport const ALL_SKILLS_TEST_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: TEST_CATEGORIES as unknown as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_FRAMEWORK_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_PAIR_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"web-client-state\": { domain: \"web\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"web-client-state\": { domain: \"web\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_AND_API_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_METHODOLOGY_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"shared-methodology\": { domain: \"shared\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_METHODOLOGY_BARE_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"shared-methodology\": {},\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_MULTI_DOMAIN_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"shared-methodology\": { domain: \"shared\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const REACT_HONO_FRAMEWORK_API_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"api-api\": TEST_CATEGORIES.api,\n } as Record<Category, CategoryDefinition>,\n});\n\n// ---------------------------------------------------------------------------\n// Matrix configs from matrix-loader.test.ts\n// ---------------------------------------------------------------------------\n\nexport const MERGE_BASIC_MATRIX = createMockMatrixConfig({ \"web-framework\": FRAMEWORK_CATEGORY });\n\nexport const CONFLICT_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n conflicts: [{ skills: [\"react\", \"vue-composition-api\"], reason: \"Pick one framework\" }],\n },\n },\n);\n\nexport const ALTERNATIVES_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n alternatives: [\n {\n purpose: \"State management\",\n skills: [\"zustand\", \"jotai\"],\n },\n ],\n },\n },\n);\n\nexport const REQUIRES_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n requires: [\n {\n skill: \"zustand\",\n needs: [\"react\"],\n reason: \"Zustand needs React\",\n },\n ],\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// MergedSkillsMatrix instances from config-generator.test.ts\n// ---------------------------------------------------------------------------\n\nexport const LOCAL_SKILL_MATRIX = createMockMatrix(\n // Boundary cast: fictional skill ID for testing local skill matrix\n createMockSkill(\"web-local-skill\" as SkillId, {\n local: true,\n localPath: \".claude/skills/my-local-skill/\",\n }),\n);\n\nexport const MIXED_LOCAL_REMOTE_MATRIX = createMockMatrix(\n SKILLS.react,\n // Boundary cast: fictional skill ID for testing mixed local/remote matrix\n createMockSkill(\"meta-company-patterns\" as SkillId, {\n local: true,\n localPath: \".claude/skills/company-patterns/\",\n }),\n);\n\nexport const METHODOLOGY_MATRIX = createMockMatrix(SKILLS.antiOverEng);\n\nexport const VITEST_MATRIX = createMockMatrix(SKILLS.vitest);\n\n// ---------------------------------------------------------------------------\n// Compile configs from resolver.test.ts\n// ---------------------------------------------------------------------------\n\nexport const WEB_AND_API_COMPILE_CONFIG = createMockCompileConfig({\n \"web-developer\": {},\n \"api-developer\": {},\n});\n\nexport const WEB_ONLY_COMPILE_CONFIG = createMockCompileConfig({\n \"web-developer\": {},\n});\n\n// ---------------------------------------------------------------------------\n// Matrix configs from consumer-stacks-matrix.integration.test.ts\n// ---------------------------------------------------------------------------\n\nexport const TOOLING_AND_FRAMEWORK_CONFIG = createMockMatrixConfig({\n \"shared-tooling\": {\n ...TEST_CATEGORIES.tooling,\n description: \"Development tooling and infrastructure\",\n domain: \"shared\" as const,\n exclusive: false,\n order: 20,\n },\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n});\n\nexport const CI_CD_CONFIG = createMockMatrixConfig({\n \"shared-ci-cd\": createMockCategory(\"shared-ci-cd\", \"CI/CD\", {\n description: \"Continuous integration and deployment\",\n domain: \"shared\",\n exclusive: true,\n required: false,\n order: 30,\n }),\n});\n\nexport const FRAMEWORK_AND_STYLING_CONFIG = createMockMatrixConfig(\n {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n \"web-styling\": {\n ...TEST_CATEGORIES.styling,\n description: \"CSS approach\",\n exclusive: false,\n order: 2,\n },\n },\n {\n relationships: {\n discourages: [\n {\n skills: [\"react\", \"scss-modules\"],\n reason: \"These tools have conflicting design philosophies\",\n },\n ],\n recommends: [\n {\n skill: \"vue-composition-api\",\n reason: \"These work great together\",\n },\n ],\n },\n },\n);\n\nexport const OBSERVABILITY_CONFIG = createMockMatrixConfig({\n \"api-observability\": createMockCategory(\"api-observability\", \"Observability\", {\n description: \"Monitoring and observability tools\",\n domain: \"api\",\n exclusive: false,\n required: false,\n order: 15,\n }),\n});\n\nexport const FRAMEWORK_AND_TESTING_CONFIG = createMockMatrixConfig(\n {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n description: \"Testing tools\",\n domain: \"shared\" as const,\n exclusive: false,\n order: 10,\n },\n },\n {\n relationships: {\n requires: [\n {\n skill: \"vitest\",\n needs: [\"react\"],\n reason: \"RTL requires React to function\",\n },\n ],\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Matrix configs from skill-resolution.test.ts\n// ---------------------------------------------------------------------------\n\nexport const EMPTY_MATRIX_CONFIG = createMockMatrixConfig({});\n\nexport const UNRESOLVED_CONFLICT_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n conflicts: [\n {\n // Boundary cast: deliberately invalid slug to test unresolved reference handling\n skills: [\"react\", \"nonexistent\" as SkillSlug],\n reason: \"Conflict with missing skill\",\n },\n ],\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Pipeline matrix from wizard-init-compile-pipeline.test.ts\n// ---------------------------------------------------------------------------\n\nexport const PIPELINE_MATRIX = createMockMatrix(\n Object.fromEntries(\n PIPELINE_TEST_SKILLS.map((skill) => [skill.id, testSkillToResolvedSkill(skill)]),\n ),\n);\n\n// ---------------------------------------------------------------------------\n// Health-check matrices from matrix-health-check.test.ts\n// ---------------------------------------------------------------------------\n\nconst HEALTH_MISSING_DOMAIN_FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.framework,\n domain: undefined,\n};\n\nconst HEALTH_MISSING_DOMAIN_STYLING_CATEGORY = {\n ...TEST_CATEGORIES.styling,\n domain: undefined,\n};\n\nexport const HEALTH_HEALTHY_MATRIX = createMockMatrix(SKILLS.react, HEALTH_ZUSTAND_RECOMMENDED, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n});\n\nexport const HEALTH_SINGLE_SKILL_MATRIX = createMockMatrix(SKILLS.react, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n },\n});\n\nexport const HEALTH_MISSING_DOMAIN_MATRIX = createMockMatrix(SKILLS.react, {\n categories: {\n \"web-framework\": HEALTH_MISSING_DOMAIN_FRAMEWORK_CATEGORY,\n },\n});\n\nexport const HEALTH_MULTIPLE_MISSING_DOMAINS_MATRIX = createMockMatrix(\n {},\n {\n categories: {\n \"web-framework\": HEALTH_MISSING_DOMAIN_FRAMEWORK_CATEGORY,\n \"web-styling\": HEALTH_MISSING_DOMAIN_STYLING_CATEGORY,\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n },\n);\n\nexport const HEALTH_UNKNOWN_CATEGORY_MATRIX = createMockMatrix(HEALTH_ORPHAN_SKILL, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n },\n});\n\nexport const HEALTH_ORPHAN_SKILL_WITH_MISSING_DOMAIN_MATRIX = createMockMatrix(\n HEALTH_ORPHAN_SKILL,\n {\n categories: {\n \"web-framework\": HEALTH_MISSING_DOMAIN_FRAMEWORK_CATEGORY,\n },\n },\n);\n\nexport const HEALTH_UNRESOLVED_COMPATIBLE_WITH_MATRIX = createMockMatrix(\n HEALTH_UNRESOLVED_COMPATIBLE_WITH_SKILL,\n {\n categories: {\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n },\n);\n\nexport const HEALTH_UNRESOLVED_CONFLICTS_WITH_MATRIX = createMockMatrix(\n HEALTH_UNRESOLVED_CONFLICTS_WITH_SKILL,\n {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n },\n },\n);\n\nexport const HEALTH_UNRESOLVED_REQUIRES_MATRIX = createMockMatrix(\n HEALTH_UNRESOLVED_REQUIRES_SKILL,\n {\n categories: {\n \"web-testing\": TEST_CATEGORIES.testing,\n },\n },\n);\n\nexport const HEALTH_MULTIPLE_UNRESOLVED_REFS_MATRIX = createMockMatrix(\n HEALTH_MULTIPLE_UNRESOLVED_REFS_SKILL,\n {\n categories: {\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n },\n);\n\nexport const HEALTH_ALL_REFS_RESOLVED_MATRIX = createMockMatrix(\n SKILLS.react,\n HEALTH_ALL_REFS_RESOLVED_SKILL,\n {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n },\n);\n\nexport const HEALTH_PARTIAL_UNRESOLVED_REQUIRES_MATRIX = createMockMatrix(\n SKILLS.react,\n HEALTH_PARTIAL_UNRESOLVED_REQUIRES_SKILL,\n {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"web-testing\": TEST_CATEGORIES.testing,\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Multi-source matrix from skill-resolution.integration.test.ts\n// ---------------------------------------------------------------------------\n\ntype TaggedMultiSourceEntry = MultiSourceSkillEntry & { source: SkillSource };\n\nexport function buildMultiSourceMatrix(\n overrides?: Partial<MergedSkillsMatrix>,\n): MergedSkillsMatrix {\n const taggedEntries: TaggedMultiSourceEntry[] = [\n ...MULTI_SOURCE_PUBLIC_SKILLS.map((s) => ({ ...s, source: { ...PUBLIC_SOURCE } })),\n ...MULTI_SOURCE_ACME_SKILLS.map((s) => ({ ...s, source: { ...ACME_SOURCE } })),\n ...MULTI_SOURCE_INTERNAL_SKILLS.map((s) => ({ ...s, source: { ...INTERNAL_SOURCE } })),\n ];\n const grouped = groupBy(taggedEntries, (e) => e.id);\n const skills = mapValues(grouped, (entries) => {\n const first = entries[0]!;\n const sources = entries.map((e) => e.source);\n // Boundary cast: MultiSourceSkillEntry.id is string, but contains valid skill IDs\n return createMockMultiSourceSkill(first.id as SkillId, sources, {\n category: first.category as CategoryPath,\n description: first.description,\n });\n });\n\n return createMockMatrix(skills, {\n categories: MULTI_SOURCE_CATEGORIES,\n ...overrides,\n });\n}\n","// Shared skill entries and TestSkill arrays for test files.\n// Uses createMockSkillEntry from helpers.ts.\n\nimport type { Category, CategoryPath, ResolvedSkill, Skill, SkillId } from \"../../../types\";\nimport type { TestSkill } from \"../fixtures/create-test-source\";\nimport {\n createMockExtractedSkill,\n createMockSkill,\n createMockSkillEntry,\n createTestSkill,\n SKILLS,\n} from \"../helpers.js\";\nimport { renderSkillMd } from \"../content-generators\";\n\n// Skill entries from compiler.test.ts\n\nexport const REACT_SKILL_PRELOADED = createMockSkillEntry(\"web-framework-react\", true);\n\nexport const REACT_SKILL = createMockSkillEntry(\"web-framework-react\");\n\nexport const VITEST_SKILL = createMockSkillEntry(\"web-testing-vitest\");\n\nexport const VITEST_SINGLE_FILE_SKILL: Skill = {\n ...VITEST_SKILL,\n path: \"skills/web-testing-vitest.md\",\n};\n\nconst METHODOLOGY_TEST_SKILLS: TestSkill[] = [\n {\n id: \"meta-methodology-anti-over-engineering\",\n slug: \"anti-over-engineering\",\n displayName: \"Anti Over-Engineering\",\n description: \"Surgical implementation, not architectural innovation\",\n category: \"shared-methodology\",\n author: \"@test\",\n domain: \"shared\",\n tags: [\"methodology\", \"foundational\"],\n },\n];\n\n// Individual TestSkill constants — each skill defined exactly once\n\nconst reactSkill = createTestSkill(\n \"web-framework-react\",\n \"React framework for building user interfaces\",\n {\n tags: [\"react\", \"web\", \"ui\"],\n },\n);\n\nconst zustandSkill = createTestSkill(\"web-state-zustand\", \"Bear necessities state management\", {\n tags: [\"state\", \"react\", \"zustand\"],\n});\n\nconst vitestSkill = createTestSkill(\"web-testing-vitest\", \"Next generation testing framework\", {\n tags: [\"testing\", \"vitest\", \"unit\"],\n});\n\nconst honoSkill = createTestSkill(\"api-framework-hono\", \"Lightweight web framework for the edge\", {\n tags: [\"api\", \"hono\", \"edge\"],\n});\n\nconst vueSkill = createTestSkill(\n \"web-framework-vue-composition-api\",\n \"Progressive JavaScript framework\",\n {\n tags: [\"vue\", \"web\"],\n },\n);\n\nconst scssSkill = createTestSkill(\"web-styling-scss-modules\", \"CSS Modules with SCSS\", {\n displayName: \"SCSS Modules\",\n tags: [\"css\", \"scss\"],\n});\n\nconst drizzleSkill = createTestSkill(\"api-database-drizzle\", \"TypeScript ORM for SQL databases\", {\n tags: [\"database\", \"orm\"],\n});\n\n// Composed TestSkill arrays\n\nexport const EXTRA_DOMAIN_TEST_SKILLS: TestSkill[] = [vueSkill, scssSkill, drizzleSkill];\n\nexport const COMPILE_LOCAL_SKILL: TestSkill = createTestSkill(\n // Boundary cast: fictional skill ID for testing local skill compilation\n \"web-tooling-local-skill\" as SkillId,\n \"A local project skill\",\n { slug: \"tooling\", displayName: \"Local Skill\", tags: [\"local\", \"custom\"] },\n);\n\nexport const DEFAULT_TEST_SKILLS: TestSkill[] = [reactSkill, zustandSkill, vitestSkill, honoSkill];\n\nexport const PIPELINE_TEST_SKILLS: TestSkill[] = [\n ...DEFAULT_TEST_SKILLS,\n ...EXTRA_DOMAIN_TEST_SKILLS,\n];\n\n// TestSkill constants from consumer-stacks-matrix.integration.test.ts\n\nexport const DOCKER_TOOLING_SKILL: TestSkill = createTestSkill(\n // Boundary cast: fictional skill ID for testing infra tooling\n \"infra-tooling-docker\" as SkillId,\n \"Docker containerization patterns\",\n {\n slug: \"tooling\",\n displayName: \"Docker\",\n domain: \"shared\",\n tags: [\"docker\", \"devops\", \"containers\"],\n },\n);\n\nexport const CI_CD_SKILLS: TestSkill[] = [\n // Boundary cast: fictional skill ID for testing CI/CD skills\n createTestSkill(\"infra-ci-cd-github-actions\" as SkillId, \"github-actions CI/CD pipeline\", {\n slug: \"github-actions\",\n displayName: \"GitHub Actions\",\n category: \"infra-ci-cd\",\n domain: \"shared\",\n tags: [\"ci-cd\", \"github-actions\"],\n }),\n // Boundary cast: fictional skill ID for testing CI/CD skills\n createTestSkill(\"infra-ci-cd-gitlab-ci\" as SkillId, \"gitlab-ci CI/CD pipeline\", {\n slug: \"gitlab-ci\",\n displayName: \"GitLab CI\",\n category: \"infra-ci-cd\",\n domain: \"shared\",\n tags: [\"ci-cd\", \"gitlab-ci\"],\n }),\n];\n\nexport const DISCOURAGES_RELATIONSHIP_SKILLS: TestSkill[] = [reactSkill, scssSkill, vueSkill];\n\nexport const DATADOG_OBSERVABILITY_SKILL: TestSkill = createTestSkill(\n // Boundary cast: fictional skill ID for testing observability skills\n \"api-observability-datadog\" as SkillId,\n \"Datadog APM integration\",\n { tags: [\"monitoring\", \"observability\", \"apm\", \"custom-tag\"] },\n);\n\nexport const REQUIRES_RELATIONSHIP_SKILLS: TestSkill[] = [reactSkill, vitestSkill];\n\n// Source-switching TestSkill arrays (with rendered SKILL.md content)\n\n/** Creates a TestSkill with rendered SKILL.md content for source-switching tests */\nfunction contentSkill(\n id: SkillId,\n description: string,\n tags: string[],\n body: string,\n author?: string,\n): TestSkill {\n return createTestSkill(id, description, {\n ...(author ? { author } : {}),\n tags,\n content: renderSkillMd(id, description, body),\n });\n}\n\nexport const SWITCHABLE_SKILLS: TestSkill[] = [\n contentSkill(\n \"web-framework-react\",\n \"React framework for building user interfaces\",\n [\"react\", \"web\"],\n \"# React (Marketplace Version)\\n\\nReact is a JavaScript library for building user interfaces.\\nUse component-based architecture with JSX.\",\n ),\n contentSkill(\n \"web-state-zustand\",\n \"Bear necessities state management\",\n [\"state\", \"zustand\"],\n \"# Zustand (Marketplace Version)\\n\\nZustand is a minimal state management library for React.\",\n ),\n contentSkill(\n \"api-framework-hono\",\n \"Lightweight web framework for the edge\",\n [\"api\", \"hono\"],\n \"# Hono (Marketplace Version)\\n\\nHono is a fast web framework for the edge.\",\n ),\n contentSkill(\n \"web-testing-vitest\",\n \"Next generation testing framework\",\n [\"testing\", \"vitest\"],\n \"# Vitest (Marketplace Version)\\n\\nVitest is a fast unit test framework powered by Vite.\",\n ),\n];\n\nexport const LOCAL_SKILL_VARIANTS: TestSkill[] = [\n contentSkill(\n \"web-framework-react\",\n \"React framework (local customized version)\",\n [\"react\", \"web\"],\n \"# React (Local Version)\\n\\nThis is my customized React skill with project-specific patterns.\",\n \"@local-user\",\n ),\n contentSkill(\n \"web-state-zustand\",\n \"Zustand state management (local customized version)\",\n [\"state\", \"zustand\"],\n \"# Zustand (Local Version)\\n\\nMy customized Zustand patterns with project-specific stores.\",\n \"@local-user\",\n ),\n];\n\nexport const RESOLUTION_PIPELINE_SKILLS: TestSkill[] = [\n createTestSkill(\"web-framework-react\", \"React framework (public source)\", {\n tags: [\"react\", \"web\"],\n }),\n createTestSkill(\"api-framework-hono\", \"Hono framework (acme source)\", {\n author: \"@acme\",\n tags: [\"api\", \"hono\"],\n }),\n // Boundary cast: fictional skill ID for testing multi-source resolution\n createTestSkill(\"web-animation-framer\" as SkillId, \"Framer Motion (internal source)\", {\n slug: \"framer-motion\",\n displayName: \"Framer Motion\",\n author: \"@internal\",\n tags: [\"animation\"],\n }),\n createTestSkill(\"api-database-drizzle\", \"Drizzle ORM (acme source)\", {\n author: \"@acme\",\n tags: [\"database\"],\n }),\n createTestSkill(\"web-testing-vitest\", \"Vitest testing (public source)\", {\n tags: [\"testing\"],\n }),\n];\n\n// Composed skill ID collections\n\nexport const ALL_TEST_SKILLS = [\n ...DEFAULT_TEST_SKILLS,\n ...EXTRA_DOMAIN_TEST_SKILLS,\n ...METHODOLOGY_TEST_SKILLS,\n];\n\nexport const INIT_SKILL_IDS: SkillId[] = [\n \"web-framework-react\",\n \"api-framework-hono\",\n \"web-testing-vitest\",\n];\n\nexport const INIT_TEST_SKILLS = DEFAULT_TEST_SKILLS.filter((s) =>\n INIT_SKILL_IDS.includes(s.id as SkillId),\n);\n\n// ExtractedSkillMetadata constants for skill-resolution tests\n\nexport const REACT_EXTRACTED = createMockExtractedSkill(\"web-framework-react\", {\n description: \"React framework\",\n author: \"@vince\",\n tags: [\"react\"],\n});\n\nexport const REACT_EXTRACTED_BASIC = createMockExtractedSkill(\"web-framework-react\", {\n description: \"React\",\n});\n\nexport const VUE_EXTRACTED_BASIC = createMockExtractedSkill(\"web-framework-vue-composition-api\", {\n description: \"Vue\",\n});\n\nexport const ZUSTAND_EXTRACTED = createMockExtractedSkill(\"web-state-zustand\", {\n description: \"Zustand\",\n category: \"web-client-state\",\n});\n\nexport const JOTAI_EXTRACTED = createMockExtractedSkill(\"web-state-jotai\", {\n description: \"Jotai\",\n category: \"web-client-state\",\n});\n\n// ---------------------------------------------------------------------------\n// Health-check skill variants (matrix-health-check.test.ts)\n// ---------------------------------------------------------------------------\n\nexport const HEALTH_ZUSTAND_RECOMMENDED = {\n ...SKILLS.zustand,\n isRecommended: true,\n recommendedReason: \"Works well with React\",\n};\n\nexport const HEALTH_ORPHAN_SKILL = {\n ...SKILLS.react,\n category: \"nonexistent-category\" as Category,\n};\n\nexport const HEALTH_UNRESOLVED_COMPATIBLE_WITH_SKILL = {\n ...SKILLS.zustand,\n // Boundary cast: fake SkillId for unresolved-ref testing\n compatibleWith: [\"web-framework-nonexistent\" as SkillId],\n};\n\nexport const HEALTH_UNRESOLVED_CONFLICTS_WITH_SKILL = {\n ...SKILLS.react,\n // Boundary cast: fake SkillId for unresolved-ref testing\n conflictsWith: [{ skillId: \"web-framework-ghost\" as SkillId, reason: \"Conflicts\" }],\n};\n\nexport const HEALTH_UNRESOLVED_REQUIRES_SKILL = createMockSkill(\"web-testing-cypress-e2e\", {\n requires: [\n {\n skillIds: [\"web-framework-missing\" as SkillId],\n needsAny: false,\n reason: \"Needs a framework\",\n },\n ],\n});\n\nexport const HEALTH_MULTIPLE_UNRESOLVED_REFS_SKILL = {\n ...SKILLS.zustand,\n // Boundary casts: fake SkillIds for unresolved-ref testing\n compatibleWith: [\"web-framework-missing\" as SkillId],\n conflictsWith: [{ skillId: \"web-state-ghost\" as SkillId, reason: \"Conflicts\" }],\n};\n\nexport const HEALTH_ALL_REFS_RESOLVED_SKILL: ResolvedSkill = {\n ...SKILLS.zustand,\n conflictsWith: [{ skillId: \"web-framework-react\", reason: \"Test\" }],\n requires: [\n {\n skillIds: [\"web-framework-react\"],\n needsAny: false,\n reason: \"Needs React\",\n },\n ],\n};\n\nexport const HEALTH_PARTIAL_UNRESOLVED_REQUIRES_SKILL = createMockSkill(\"web-testing-cypress-e2e\", {\n requires: [\n {\n skillIds: [\"web-framework-react\", \"web-framework-missing\" as SkillId],\n needsAny: true,\n reason: \"Needs one framework\",\n },\n ],\n});\n\n// ---------------------------------------------------------------------------\n// Category grid test skills (category-grid.test.tsx)\n// ---------------------------------------------------------------------------\n\nexport const CATEGORY_GRID_SKILLS: {\n id: SkillId;\n displayName: string;\n category: CategoryPath;\n}[] = [\n { id: \"web-framework-react\", displayName: \"React\", category: \"web-framework\" },\n { id: \"web-framework-vue-composition-api\", displayName: \"Vue\", category: \"web-framework\" },\n { id: \"web-framework-angular-standalone\", displayName: \"Angular\", category: \"web-framework\" },\n { id: \"web-framework-solidjs\", displayName: \"SolidJS\", category: \"web-framework\" },\n { id: \"web-framework-nuxt\", displayName: \"Nuxt\", category: \"web-framework\" },\n { id: \"web-framework-remix\", displayName: \"Remix\", category: \"web-framework\" },\n {\n id: \"web-framework-nextjs-app-router\",\n displayName: \"Next.js App Router\",\n category: \"web-framework\",\n },\n {\n id: \"web-framework-nextjs-server-actions\",\n displayName: \"Next.js Server Actions\",\n category: \"web-framework\",\n },\n { id: \"web-styling-scss-modules\", displayName: \"SCSS Modules\", category: \"web-styling\" },\n { id: \"web-styling-tailwind\", displayName: \"Tailwind\", category: \"web-styling\" },\n { id: \"web-styling-cva\", displayName: \"CVA\", category: \"web-styling\" },\n { id: \"web-state-zustand\", displayName: \"Zustand\", category: \"web-client-state\" },\n { id: \"web-state-jotai\", displayName: \"Jotai\", category: \"web-client-state\" },\n { id: \"web-state-redux-toolkit\", displayName: \"Redux\", category: \"web-client-state\" },\n { id: \"web-state-mobx\", displayName: \"MobX\", category: \"web-client-state\" },\n { id: \"web-server-state-react-query\", displayName: \"React Query\", category: \"web-server-state\" },\n { id: \"web-data-fetching-swr\", displayName: \"SWR\", category: \"web-server-state\" },\n { id: \"web-data-fetching-graphql-apollo\", displayName: \"Apollo\", category: \"web-server-state\" },\n { id: \"api-analytics-posthog-analytics\", displayName: \"PostHog\", category: \"api-analytics\" },\n { id: \"web-forms-react-hook-form\", displayName: \"React Hook Form\", category: \"web-forms\" },\n { id: \"web-forms-vee-validate\", displayName: \"Vee Validate\", category: \"web-forms\" },\n { id: \"web-forms-zod-validation\", displayName: \"Zod Validation\", category: \"web-forms\" },\n { id: \"web-testing-vitest\", displayName: \"Vitest\", category: \"web-testing\" },\n { id: \"web-testing-playwright-e2e\", displayName: \"Playwright\", category: \"web-testing\" },\n { id: \"web-testing-cypress-e2e\", displayName: \"Cypress\", category: \"web-testing\" },\n { id: \"web-mocks-msw\", displayName: \"MSW\", category: \"web-mocking\" },\n {\n id: \"web-testing-react-testing-library\",\n displayName: \"React Testing Library\",\n category: \"web-testing\",\n },\n { id: \"web-testing-vue-test-utils\", displayName: \"Vue Test Utils\", category: \"web-testing\" },\n { id: \"web-i18n-next-intl\", displayName: \"Next Intl\", category: \"web-i18n\" },\n { id: \"web-i18n-react-intl\", displayName: \"React Intl\", category: \"web-i18n\" },\n { id: \"web-i18n-vue-i18n\", displayName: \"Vue I18n\", category: \"web-i18n\" },\n];\n\n// ---------------------------------------------------------------------------\n// Multi-source integration test skill entries (skill-resolution.integration.test.ts)\n// ---------------------------------------------------------------------------\n\ntype MultiSourceSkillEntry = { id: string; category: string; description: string };\n\nexport const MULTI_SOURCE_PUBLIC_SKILLS: MultiSourceSkillEntry[] = [\n { id: \"web-framework-react\", category: \"web-framework\", description: \"React framework\" },\n {\n id: \"web-framework-vue-composition-api\",\n category: \"web-framework\",\n description: \"Vue.js framework\",\n },\n {\n id: \"web-state-zustand\",\n category: \"web-client-state\",\n description: \"Zustand state management\",\n },\n { id: \"web-styling-scss-modules\", category: \"web-styling\", description: \"SCSS Modules styling\" },\n { id: \"web-testing-vitest\", category: \"web-testing\", description: \"Vitest testing framework\" },\n];\n\nexport const MULTI_SOURCE_ACME_SKILLS: MultiSourceSkillEntry[] = [\n { id: \"web-framework-react\", category: \"web-framework\", description: \"React (acme custom fork)\" },\n { id: \"api-framework-hono\", category: \"api-api\", description: \"Hono web framework\" },\n { id: \"api-database-drizzle\", category: \"api-database\", description: \"Drizzle ORM\" },\n { id: \"api-security-auth-patterns\", category: \"shared-security\", description: \"Auth patterns\" },\n { id: \"web-testing-vitest\", category: \"web-testing\", description: \"Vitest (acme custom)\" },\n];\n\nexport const MULTI_SOURCE_INTERNAL_SKILLS: MultiSourceSkillEntry[] = [\n { id: \"web-framework-react\", category: \"web-framework\", description: \"React (internal build)\" },\n { id: \"web-animation-framer\", category: \"web-animation\", description: \"Framer Motion\" },\n {\n id: \"meta-methodology-investigation\",\n category: \"shared-methodology\",\n description: \"Investigation first\",\n },\n { id: \"web-accessibility-a11y\", category: \"web-accessibility\", description: \"Web accessibility\" },\n {\n id: \"api-monitoring-sentry\",\n category: \"api-observability\",\n description: \"Sentry error tracking\",\n },\n];\n\nexport type { MultiSourceSkillEntry };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAGA,SAAS,SAAS,iBAAiB;;;ACHnC;AAgBO,IAAM,wBAAwB,qBAAqB,uBAAuB,IAAI;AAE9E,IAAM,cAAc,qBAAqB,qBAAqB;AAE9D,IAAM,eAAe,qBAAqB,oBAAoB;AAE9D,IAAM,2BAAkC;AAAA,EAC7C,GAAG;AAAA,EACH,MAAM;AACR;AAEA,IAAM,0BAAuC;AAAA,EAC3C;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM,CAAC,eAAe,cAAc;AAAA,EACtC;AACF;AAIA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,IACE,MAAM,CAAC,SAAS,OAAO,IAAI;AAAA,EAC7B;AACF;AAEA,IAAM,eAAe,gBAAgB,qBAAqB,qCAAqC;AAAA,EAC7F,MAAM,CAAC,SAAS,SAAS,SAAS;AACpC,CAAC;AAED,IAAM,cAAc,gBAAgB,sBAAsB,qCAAqC;AAAA,EAC7F,MAAM,CAAC,WAAW,UAAU,MAAM;AACpC,CAAC;AAED,IAAM,YAAY,gBAAgB,sBAAsB,0CAA0C;AAAA,EAChG,MAAM,CAAC,OAAO,QAAQ,MAAM;AAC9B,CAAC;AAED,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,IACE,MAAM,CAAC,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,IAAM,YAAY,gBAAgB,4BAA4B,yBAAyB;AAAA,EACrF,aAAa;AAAA,EACb,MAAM,CAAC,OAAO,MAAM;AACtB,CAAC;AAED,IAAM,eAAe,gBAAgB,wBAAwB,oCAAoC;AAAA,EAC/F,MAAM,CAAC,YAAY,KAAK;AAC1B,CAAC;AAIM,IAAM,2BAAwC,CAAC,UAAU,WAAW,YAAY;AAEhF,IAAM,sBAAiC;AAAA;AAAA,EAE5C;AAAA,EACA;AAAA,EACA,EAAE,MAAM,WAAW,aAAa,eAAe,MAAM,CAAC,SAAS,QAAQ,EAAE;AAC3E;AAEO,IAAM,sBAAmC,CAAC,YAAY,cAAc,aAAa,SAAS;AAE1F,IAAM,uBAAoC;AAAA,EAC/C,GAAG;AAAA,EACH,GAAG;AACL;AAIO,IAAM,uBAAkC;AAAA;AAAA,EAE7C;AAAA,EACA;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,MAAM,CAAC,UAAU,UAAU,YAAY;AAAA,EACzC;AACF;AAEO,IAAM,eAA4B;AAAA;AAAA,EAEvC,gBAAgB,8BAAyC,iCAAiC;AAAA,IACxF,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM,CAAC,SAAS,gBAAgB;AAAA,EAClC,CAAC;AAAA;AAAA,EAED,gBAAgB,yBAAoC,4BAA4B;AAAA,IAC9E,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM,CAAC,SAAS,WAAW;AAAA,EAC7B,CAAC;AACH;AAIO,IAAM,8BAAyC;AAAA;AAAA,EAEpD;AAAA,EACA;AAAA,EACA,EAAE,MAAM,CAAC,cAAc,iBAAiB,OAAO,YAAY,EAAE;AAC/D;AAOA,SAAS,aACP,IACA,aACA,MACA,MACA,QACW;AACX,SAAO,gBAAgB,IAAI,aAAa;AAAA,IACtC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3B;AAAA,IACA,SAAS,cAAc,IAAI,aAAa,IAAI;AAAA,EAC9C,CAAC;AACH;AAEO,IAAM,oBAAiC;AAAA,EAC5C;AAAA,IACE;AAAA,IACA;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,IACf;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,CAAC,SAAS,SAAS;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,CAAC,OAAO,MAAM;AAAA,IACd;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,CAAC,WAAW,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;AAEO,IAAM,uBAAoC;AAAA,EAC/C;AAAA,IACE;AAAA,IACA;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,CAAC,SAAS,SAAS;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,6BAA0C;AAAA,EACrD,gBAAgB,uBAAuB,mCAAmC;AAAA,IACxE,MAAM,CAAC,SAAS,KAAK;AAAA,EACvB,CAAC;AAAA,EACD,gBAAgB,sBAAsB,gCAAgC;AAAA,IACpE,QAAQ;AAAA,IACR,MAAM,CAAC,OAAO,MAAM;AAAA,EACtB,CAAC;AAAA;AAAA,EAED,gBAAgB,wBAAmC,mCAAmC;AAAA,IACpF,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,MAAM,CAAC,WAAW;AAAA,EACpB,CAAC;AAAA,EACD,gBAAgB,wBAAwB,6BAA6B;AAAA,IACnE,QAAQ;AAAA,IACR,MAAM,CAAC,UAAU;AAAA,EACnB,CAAC;AAAA,EACD,gBAAgB,sBAAsB,kCAAkC;AAAA,IACtE,MAAM,CAAC,SAAS;AAAA,EAClB,CAAC;AACH;AAIO,IAAM,kBAAkB;AAAA,EAC7B,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEO,IAAM,iBAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,mBAAmB,oBAAoB;AAAA,EAAO,CAAC,MAC1D,eAAe,SAAS,EAAE,EAAa;AACzC;AAIO,IAAM,kBAAkB,yBAAyB,uBAAuB;AAAA,EAC7E,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,MAAM,CAAC,OAAO;AAChB,CAAC;AAEM,IAAM,wBAAwB,yBAAyB,uBAAuB;AAAA,EACnF,aAAa;AACf,CAAC;AAEM,IAAM,sBAAsB,yBAAyB,qCAAqC;AAAA,EAC/F,aAAa;AACf,CAAC;AAEM,IAAM,oBAAoB,yBAAyB,qBAAqB;AAAA,EAC7E,aAAa;AAAA,EACb,UAAU;AACZ,CAAC;AAEM,IAAM,kBAAkB,yBAAyB,mBAAmB;AAAA,EACzE,aAAa;AAAA,EACb,UAAU;AACZ,CAAC;AAMM,IAAM,6BAA6B;AAAA,EACxC,GAAG,OAAO;AAAA,EACV,eAAe;AAAA,EACf,mBAAmB;AACrB;AAEO,IAAM,sBAAsB;AAAA,EACjC,GAAG,OAAO;AAAA,EACV,UAAU;AACZ;AAEO,IAAM,0CAA0C;AAAA,EACrD,GAAG,OAAO;AAAA;AAAA,EAEV,gBAAgB,CAAC,2BAAsC;AACzD;AAEO,IAAM,yCAAyC;AAAA,EACpD,GAAG,OAAO;AAAA;AAAA,EAEV,eAAe,CAAC,EAAE,SAAS,uBAAkC,QAAQ,YAAY,CAAC;AACpF;AAEO,IAAM,mCAAmC,gBAAgB,2BAA2B;AAAA,EACzF,UAAU;AAAA,IACR;AAAA,MACE,UAAU,CAAC,uBAAkC;AAAA,MAC7C,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,IAAM,wCAAwC;AAAA,EACnD,GAAG,OAAO;AAAA;AAAA,EAEV,gBAAgB,CAAC,uBAAkC;AAAA,EACnD,eAAe,CAAC,EAAE,SAAS,mBAA8B,QAAQ,YAAY,CAAC;AAChF;AAEO,IAAM,iCAAgD;AAAA,EAC3D,GAAG,OAAO;AAAA,EACV,eAAe,CAAC,EAAE,SAAS,uBAAuB,QAAQ,OAAO,CAAC;AAAA,EAClE,UAAU;AAAA,IACR;AAAA,MACE,UAAU,CAAC,qBAAqB;AAAA,MAChC,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,IAAM,2CAA2C,gBAAgB,2BAA2B;AAAA,EACjG,UAAU;AAAA,IACR;AAAA,MACE,UAAU,CAAC,uBAAuB,uBAAkC;AAAA,MACpE,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAMM,IAAM,uBAIP;AAAA,EACJ,EAAE,IAAI,uBAAuB,aAAa,SAAS,UAAU,gBAAgB;AAAA,EAC7E,EAAE,IAAI,qCAAqC,aAAa,OAAO,UAAU,gBAAgB;AAAA,EACzF,EAAE,IAAI,oCAAoC,aAAa,WAAW,UAAU,gBAAgB;AAAA,EAC5F,EAAE,IAAI,yBAAyB,aAAa,WAAW,UAAU,gBAAgB;AAAA,EACjF,EAAE,IAAI,sBAAsB,aAAa,QAAQ,UAAU,gBAAgB;AAAA,EAC3E,EAAE,IAAI,uBAAuB,aAAa,SAAS,UAAU,gBAAgB;AAAA,EAC7E;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,EAAE,IAAI,4BAA4B,aAAa,gBAAgB,UAAU,cAAc;AAAA,EACvF,EAAE,IAAI,wBAAwB,aAAa,YAAY,UAAU,cAAc;AAAA,EAC/E,EAAE,IAAI,mBAAmB,aAAa,OAAO,UAAU,cAAc;AAAA,EACrE,EAAE,IAAI,qBAAqB,aAAa,WAAW,UAAU,mBAAmB;AAAA,EAChF,EAAE,IAAI,mBAAmB,aAAa,SAAS,UAAU,mBAAmB;AAAA,EAC5E,EAAE,IAAI,2BAA2B,aAAa,SAAS,UAAU,mBAAmB;AAAA,EACpF,EAAE,IAAI,kBAAkB,aAAa,QAAQ,UAAU,mBAAmB;AAAA,EAC1E,EAAE,IAAI,gCAAgC,aAAa,eAAe,UAAU,mBAAmB;AAAA,EAC/F,EAAE,IAAI,yBAAyB,aAAa,OAAO,UAAU,mBAAmB;AAAA,EAChF,EAAE,IAAI,oCAAoC,aAAa,UAAU,UAAU,mBAAmB;AAAA,EAC9F,EAAE,IAAI,mCAAmC,aAAa,WAAW,UAAU,gBAAgB;AAAA,EAC3F,EAAE,IAAI,6BAA6B,aAAa,mBAAmB,UAAU,YAAY;AAAA,EACzF,EAAE,IAAI,0BAA0B,aAAa,gBAAgB,UAAU,YAAY;AAAA,EACnF,EAAE,IAAI,4BAA4B,aAAa,kBAAkB,UAAU,YAAY;AAAA,EACvF,EAAE,IAAI,sBAAsB,aAAa,UAAU,UAAU,cAAc;AAAA,EAC3E,EAAE,IAAI,8BAA8B,aAAa,cAAc,UAAU,cAAc;AAAA,EACvF,EAAE,IAAI,2BAA2B,aAAa,WAAW,UAAU,cAAc;AAAA,EACjF,EAAE,IAAI,iBAAiB,aAAa,OAAO,UAAU,cAAc;AAAA,EACnE;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,EAAE,IAAI,8BAA8B,aAAa,kBAAkB,UAAU,cAAc;AAAA,EAC3F,EAAE,IAAI,sBAAsB,aAAa,aAAa,UAAU,WAAW;AAAA,EAC3E,EAAE,IAAI,uBAAuB,aAAa,cAAc,UAAU,WAAW;AAAA,EAC7E,EAAE,IAAI,qBAAqB,aAAa,YAAY,UAAU,WAAW;AAC3E;;;ADrVO,IAAM,eAAe,iBAAiB;AACtC,IAAM,sBAAsB,iBAAiB,OAAO,KAAK;AACzD,IAAM,kBAAkB,iBAAiB,OAAO,OAAO,OAAO,OAAO;AACrE,IAAM,wBAAwB,iBAAiB,OAAO,OAAO,OAAO,IAAI;AACxE,IAAM,kBAAkB,iBAAiB,OAAO,OAAO,OAAO,SAAS,OAAO,MAAM;AACpF,IAAM,wBAAwB,iBAAiB,OAAO,OAAO,OAAO,MAAM,OAAO,MAAM;AACvF,IAAM,2BAA2B,iBAAiB,OAAO,QAAQ,OAAO,OAAO,OAAO,IAAI;AAC1F,IAAM,oBAAoB,iBAAiB,OAAO,OAAO,OAAO,IAAI;AACpE,IAAM,yBAAyB,iBAAiB,OAAO,OAAO,OAAO,MAAM,OAAO,IAAI;AACtF,IAAM,yBAAyB,iBAAiB,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK;AACtF,IAAM,oBAAoB,iBAAiB,OAAO,MAAM,OAAO,KAAK;AACpE,IAAM,4BAA4B;AAAA,EACvC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT;AAEO,IAAM,uBAAuB;AAAA,EAClC,GAAG,qBAAqB;AAAA,IAAI,CAAC,EAAE,IAAI,aAAa,SAAS,MACvD,gBAAgB,IAAI,EAAE,aAAa,SAAS,CAAC;AAAA,EAC/C;AACF;AAMO,IAAM,oCAAoC,iBAAiB,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,EAC1F,YAAY;AACd,CAAC;AAEM,IAAM,kCAAkC,iBAAiB,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,EACxF,YAAY;AAAA,IACV,iBAAiB,EAAE,QAAQ,MAAM;AAAA,EACnC;AACF,CAAC;AAEM,IAAM,wCAAwC,iBAAiB,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,EAC9F,YAAY;AAAA,IACV,iBAAiB,EAAE,QAAQ,MAAM;AAAA,IACjC,oBAAoB,EAAE,QAAQ,MAAM;AAAA,EACtC;AACF,CAAC;AAEM,IAAM,yCAAyC,iBAAiB,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,EAC/F,YAAY;AAAA,IACV,iBAAiB,EAAE,QAAQ,MAAM;AAAA,IACjC,oBAAoB,EAAE,QAAQ,MAAM;AAAA,IACpC,WAAW,EAAE,QAAQ,MAAM;AAAA,EAC7B;AACF,CAAC;AAEM,IAAM,gCAAgC,iBAAiB,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,EACtF,YAAY;AAAA,IACV,iBAAiB,EAAE,QAAQ,MAAM;AAAA,IACjC,WAAW,EAAE,QAAQ,MAAM;AAAA,EAC7B;AACF,CAAC;AAEM,IAAM,gCAAgC,iBAAiB,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,EACtF,YAAY;AAAA,IACV,sBAAsB,EAAE,QAAQ,SAAS;AAAA,EAC3C;AACF,CAAC;AAEM,IAAM,qCAAqC,iBAAiB,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,EAC3F,YAAY;AAAA,IACV,sBAAsB,CAAC;AAAA,EACzB;AACF,CAAC;AAEM,IAAM,iCAAiC,iBAAiB,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,EACvF,YAAY;AAAA,IACV,iBAAiB,EAAE,QAAQ,MAAM;AAAA,IACjC,sBAAsB,EAAE,QAAQ,SAAS;AAAA,IACzC,WAAW,EAAE,QAAQ,MAAM;AAAA,EAC7B;AACF,CAAC;AAEM,IAAM,kCAAkC,iBAAiB,OAAO,OAAO,OAAO,MAAM;AAAA,EACzF,YAAY;AAAA,IACV,iBAAiB,gBAAgB;AAAA,IACjC,WAAW,gBAAgB;AAAA,EAC7B;AACF,CAAC;AAMM,IAAM,qBAAqB,uBAAuB,EAAE,iBAAiB,mBAAmB,CAAC;AAEzF,IAAM,kBAAkB;AAAA,EAC7B,CAAC;AAAA,EACD;AAAA,IACE,eAAe;AAAA,MACb,WAAW,CAAC,EAAE,QAAQ,CAAC,SAAS,qBAAqB,GAAG,QAAQ,qBAAqB,CAAC;AAAA,IACxF;AAAA,EACF;AACF;AAEO,IAAM,sBAAsB;AAAA,EACjC,CAAC;AAAA,EACD;AAAA,IACE,eAAe;AAAA,MACb,cAAc;AAAA,QACZ;AAAA,UACE,SAAS;AAAA,UACT,QAAQ,CAAC,WAAW,OAAO;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,kBAAkB;AAAA,EAC7B,CAAC;AAAA,EACD;AAAA,IACE,eAAe;AAAA,MACb,UAAU;AAAA,QACR;AAAA,UACE,OAAO;AAAA,UACP,OAAO,CAAC,OAAO;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,qBAAqB;AAAA;AAAA,EAEhC,gBAAgB,mBAA8B;AAAA,IAC5C,OAAO;AAAA,IACP,WAAW;AAAA,EACb,CAAC;AACH;AAEO,IAAM,4BAA4B;AAAA,EACvC,OAAO;AAAA;AAAA,EAEP,gBAAgB,yBAAoC;AAAA,IAClD,OAAO;AAAA,IACP,WAAW;AAAA,EACb,CAAC;AACH;AAEO,IAAM,qBAAqB,iBAAiB,OAAO,WAAW;AAE9D,IAAM,gBAAgB,iBAAiB,OAAO,MAAM;AAMpD,IAAM,6BAA6B,wBAAwB;AAAA,EAChE,iBAAiB,CAAC;AAAA,EAClB,iBAAiB,CAAC;AACpB,CAAC;AAEM,IAAM,0BAA0B,wBAAwB;AAAA,EAC7D,iBAAiB,CAAC;AACpB,CAAC;AAMM,IAAM,+BAA+B,uBAAuB;AAAA,EACjE,kBAAkB;AAAA,IAChB,GAAG,gBAAgB;AAAA,IACnB,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AAAA,IACf,GAAG,gBAAgB;AAAA,IACnB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AACF,CAAC;AAEM,IAAM,eAAe,uBAAuB;AAAA,EACjD,gBAAgB,mBAAmB,gBAAgB,SAAS;AAAA,IAC1D,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACH,CAAC;AAEM,IAAM,+BAA+B;AAAA,EAC1C;AAAA,IACE,iBAAiB;AAAA,MACf,GAAG,gBAAgB;AAAA,MACnB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,GAAG,gBAAgB;AAAA,MACnB,aAAa;AAAA,MACb,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,eAAe;AAAA,MACb,aAAa;AAAA,QACX;AAAA,UACE,QAAQ,CAAC,SAAS,cAAc;AAAA,UAChC,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV;AAAA,UACE,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,uBAAuB,uBAAuB;AAAA,EACzD,qBAAqB,mBAAmB,qBAAqB,iBAAiB;AAAA,IAC5E,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACH,CAAC;AAEM,IAAM,+BAA+B;AAAA,EAC1C;AAAA,IACE,iBAAiB;AAAA,MACf,GAAG,gBAAgB;AAAA,MACnB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,GAAG,gBAAgB;AAAA,MACnB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,eAAe;AAAA,MACb,UAAU;AAAA,QACR;AAAA,UACE,OAAO;AAAA,UACP,OAAO,CAAC,OAAO;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,sBAAsB,uBAAuB,CAAC,CAAC;AAErD,IAAM,6BAA6B;AAAA,EACxC,CAAC;AAAA,EACD;AAAA,IACE,eAAe;AAAA,MACb,WAAW;AAAA,QACT;AAAA;AAAA,UAEE,QAAQ,CAAC,SAAS,aAA0B;AAAA,UAC5C,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,kBAAkB;AAAA,EAC7B,OAAO;AAAA,IACL,qBAAqB,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,yBAAyB,KAAK,CAAC,CAAC;AAAA,EACjF;AACF;AAMA,IAAM,2CAA2C;AAAA,EAC/C,GAAG,gBAAgB;AAAA,EACnB,QAAQ;AACV;AAEA,IAAM,yCAAyC;AAAA,EAC7C,GAAG,gBAAgB;AAAA,EACnB,QAAQ;AACV;AAEO,IAAM,wBAAwB,iBAAiB,OAAO,OAAO,4BAA4B;AAAA,EAC9F,YAAY;AAAA,IACV,iBAAiB,gBAAgB;AAAA,IACjC,oBAAoB,gBAAgB;AAAA,EACtC;AACF,CAAC;AAEM,IAAM,6BAA6B,iBAAiB,OAAO,OAAO;AAAA,EACvE,YAAY;AAAA,IACV,iBAAiB,gBAAgB;AAAA,EACnC;AACF,CAAC;AAEM,IAAM,+BAA+B,iBAAiB,OAAO,OAAO;AAAA,EACzE,YAAY;AAAA,IACV,iBAAiB;AAAA,EACnB;AACF,CAAC;AAEM,IAAM,yCAAyC;AAAA,EACpD,CAAC;AAAA,EACD;AAAA,IACE,YAAY;AAAA,MACV,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,oBAAoB,gBAAgB;AAAA,IACtC;AAAA,EACF;AACF;AAEO,IAAM,iCAAiC,iBAAiB,qBAAqB;AAAA,EAClF,YAAY;AAAA,IACV,iBAAiB,gBAAgB;AAAA,EACnC;AACF,CAAC;AAEM,IAAM,iDAAiD;AAAA,EAC5D;AAAA,EACA;AAAA,IACE,YAAY;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF;AACF;AAEO,IAAM,2CAA2C;AAAA,EACtD;AAAA,EACA;AAAA,IACE,YAAY;AAAA,MACV,oBAAoB,gBAAgB;AAAA,IACtC;AAAA,EACF;AACF;AAEO,IAAM,0CAA0C;AAAA,EACrD;AAAA,EACA;AAAA,IACE,YAAY;AAAA,MACV,iBAAiB,gBAAgB;AAAA,IACnC;AAAA,EACF;AACF;AAEO,IAAM,oCAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,IACE,YAAY;AAAA,MACV,eAAe,gBAAgB;AAAA,IACjC;AAAA,EACF;AACF;AAEO,IAAM,yCAAyC;AAAA,EACpD;AAAA,EACA;AAAA,IACE,YAAY;AAAA,MACV,oBAAoB,gBAAgB;AAAA,IACtC;AAAA,EACF;AACF;AAEO,IAAM,kCAAkC;AAAA,EAC7C,OAAO;AAAA,EACP;AAAA,EACA;AAAA,IACE,YAAY;AAAA,MACV,iBAAiB,gBAAgB;AAAA,MACjC,oBAAoB,gBAAgB;AAAA,IACtC;AAAA,EACF;AACF;AAEO,IAAM,4CAA4C;AAAA,EACvD,OAAO;AAAA,EACP;AAAA,EACA;AAAA,IACE,YAAY;AAAA,MACV,iBAAiB,gBAAgB;AAAA,MACjC,eAAe,gBAAgB;AAAA,IACjC;AAAA,EACF;AACF;","names":[]}
@@ -7,11 +7,11 @@ import {
7
7
  loadConfigTypesDataInBackground,
8
8
  regenerateConfigTypes,
9
9
  resolveAuthor
10
- } from "./chunk-CADG5WWP.js";
10
+ } from "./chunk-3VNQPCOE.js";
11
11
  import {
12
12
  BaseCommand,
13
13
  EXIT_CODES
14
- } from "./chunk-FCF4WQEI.js";
14
+ } from "./chunk-6JRQPSKV.js";
15
15
  import {
16
16
  directoryExists,
17
17
  ensureDir,
@@ -19,7 +19,7 @@ import {
19
19
  getErrorMessage,
20
20
  verbose,
21
21
  writeFile
22
- } from "./chunk-R3AR4VLZ.js";
22
+ } from "./chunk-WJL4KU5V.js";
23
23
  import {
24
24
  CLI_BIN_NAME,
25
25
  DEFAULT_VERSION,
@@ -339,4 +339,4 @@ export {
339
339
  generateSkillRulesTs,
340
340
  NewSkill
341
341
  };
342
- //# sourceMappingURL=chunk-X4RIMJNY.js.map
342
+ //# sourceMappingURL=chunk-GSFZDUV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/new/skill.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { resolveAuthor } from \"../../lib/configuration/index.js\";\nimport {\n loadConfigTypesDataInBackground,\n regenerateConfigTypes,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { loadConfig } from \"../../lib/configuration/config-loader.js\";\nimport { writeFile, directoryExists, fileExists, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { verbose } from \"../../utils/logger.js\";\nimport {\n CLI_BIN_NAME,\n DEFAULT_VERSION,\n KEBAB_CASE_PATTERN,\n LOCAL_SKILLS_PATH,\n PLUGIN_MANIFEST_DIR,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STANDARD_FILES,\n} from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { detectInstallation } from \"../../lib/installation/index.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { computeSkillFolderHash } from \"../../lib/versioning.js\";\nimport type { CategoryPath } from \"../../types/index.js\";\n\nexport function validateSkillName(name: string): string | null {\n if (!name || name.trim() === \"\") {\n return \"Skill name is required\";\n }\n\n if (!KEBAB_CASE_PATTERN.test(name)) {\n return \"Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)\";\n }\n\n return null;\n}\n\nexport function toTitleCase(kebabCase: string): string {\n return kebabCase\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport function generateSkillMd(name: string): string {\n const titleName = toTitleCase(name);\n\n return `---\nname: ${name}\ndescription: Brief description of this skill\n---\n\n# ${titleName}\n\n> **Quick Guide:** Add a brief summary of what this skill teaches.\n\n---\n\n<critical_requirements>\n\n## CRITICAL: Before Using This Skill\n\n**(Add critical requirements here)**\n\n</critical_requirements>\n\n---\n\n**When to use:**\n\n- Add use cases here\n\n**Key patterns covered:**\n\n- Add patterns here\n\n---\n\n<patterns>\n\n## Core Patterns\n\n### Pattern 1: Example Pattern\n\nAdd your patterns here.\n\n</patterns>\n\n---\n\n<critical_reminders>\n\n## CRITICAL REMINDERS\n\n**(Repeat critical requirements here)**\n\n</critical_reminders>\n`;\n}\n\nexport function generateMetadataYaml(\n name: string,\n author: string,\n category: CategoryPath,\n contentHash: string,\n domain: string,\n): string {\n const titleName = toTitleCase(name);\n\n return `custom: true\ndomain: ${domain}\ncategory: ${category}\nauthor: \"${author}\"\ndisplayName: ${titleName}\nslug: ${name}\ncliDescription: Brief description\nusageGuidance: Use when <guidance>.\ncontentHash: ${contentHash}\ntags:\n - local\n - custom\n`;\n}\n\nconst DEFAULT_CATEGORY_ORDER = 99;\n\nconst CATEGORIES_TS_COMMENT = \"// Skill category definitions\";\nconst RULES_TS_COMMENT = \"// Skill rules configuration\";\n\nfunction formatTsExport(comment: string, data: unknown): string {\n const body = JSON.stringify(data, null, 2);\n return `${comment}\\nexport default ${body};\\n`;\n}\n\nfunction buildCategoryEntry(category: CategoryPath, domain: string): Record<string, unknown> {\n const categoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n const entry: Record<string, unknown> = {\n id: category,\n displayName: toTitleCase(categoryPart),\n description: `Skills for ${toTitleCase(categoryPart)}`,\n exclusive: true,\n required: false,\n order: DEFAULT_CATEGORY_ORDER,\n custom: true,\n };\n entry.domain = domain;\n return entry;\n}\n\nexport function generateSkillCategoriesTs(category: CategoryPath, domain: string): string {\n const entry = buildCategoryEntry(category, domain);\n const data = {\n version: DEFAULT_VERSION,\n categories: {\n [category]: entry,\n },\n };\n return formatTsExport(CATEGORIES_TS_COMMENT, data);\n}\n\nexport function generateSkillRulesTs(): string {\n const data = {\n version: DEFAULT_VERSION,\n relationships: {\n conflicts: [],\n discourages: [],\n recommends: [],\n requires: [],\n alternatives: [],\n },\n };\n return formatTsExport(RULES_TS_COMMENT, data);\n}\n\nexport default class NewSkill extends BaseCommand {\n static summary = \"Create a new local skill with proper structure\";\n static description = \"Create a new local skill scaffold with SKILL.md and metadata.yaml files\";\n\n static args = {\n name: Args.string({\n description: \"Name of the skill to create (kebab-case)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n author: Flags.string({\n char: \"a\",\n description: \"Author identifier (e.g., @myhandle)\",\n required: false,\n }),\n category: Flags.string({\n char: \"c\",\n description: \"Skill category\",\n default: LOCAL_DEFAULTS.CATEGORY,\n }),\n domain: Flags.string({\n char: \"d\",\n description: \"Domain for the skill (e.g., web, api, cli)\",\n required: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skill directory\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Output directory for the skill (overrides marketplace detection)\",\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewSkill);\n const projectDir = process.cwd();\n\n if (!flags.output) {\n const installation = await detectInstallation(projectDir);\n if (!installation) {\n this.error(`No installation found. Run '${CLI_BIN_NAME} init' first.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n // Kick off background loading for config-types.ts regeneration (non-blocking)\n const configTypesReady = flags.output\n ? null\n : loadConfigTypesDataInBackground(flags.source, projectDir);\n\n this.log(\"\");\n this.log(\"Create New Skill\");\n this.log(\"\");\n\n const validationError = validateSkillName(args.name);\n if (validationError) {\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n // Determine author: flag > project config > default\n let author = flags.author;\n if (!author) {\n author = (await resolveAuthor(projectDir)) || LOCAL_DEFAULTS.AUTHOR;\n }\n\n // Boundary cast: CLI flag accepts custom category values not in the generated union\n const category = flags.category as CategoryPath;\n\n const domain = flags.domain ?? LOCAL_DEFAULTS.DOMAIN;\n\n // Determine skill output path: --output flag > marketplace detection > local default\n let skillsBasePath: string;\n if (flags.output) {\n skillsBasePath = path.resolve(flags.output);\n } else {\n const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, \"marketplace.json\");\n if (await fileExists(marketplacePath)) {\n this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);\n skillsBasePath = path.join(projectDir, SKILLS_DIR_PATH);\n } else {\n skillsBasePath = path.join(projectDir, LOCAL_SKILLS_PATH);\n }\n }\n\n const skillDir = path.join(skillsBasePath, args.name);\n\n if (await directoryExists(skillDir)) {\n if (!flags.force) {\n this.error(`Skill directory already exists: ${skillDir}\\nUse --force to overwrite.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n this.warn(`Overwriting existing skill at ${skillDir}`);\n }\n\n this.log(`Skill name: ${args.name}`);\n this.log(`Author: ${author}`);\n this.log(`Category: ${category}`);\n this.log(`Directory: ${skillDir}`);\n this.log(\"\");\n\n this.log(\"Creating skill files...\");\n\n try {\n const skillMdContent = generateSkillMd(args.name);\n\n const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n\n await writeFile(skillMdPath, skillMdContent);\n\n const contentHash = await computeSkillFolderHash(skillDir);\n const metadataContent = generateMetadataYaml(\n args.name,\n author,\n category,\n contentHash,\n domain,\n );\n await writeFile(metadataPath, metadataContent);\n\n this.log(\"\");\n this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${skillMdPath}`);\n this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${metadataPath}`);\n\n // Update config files when in marketplace context\n if (!flags.output) {\n const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, \"marketplace.json\");\n if (await fileExists(marketplacePath)) {\n try {\n await this.updateConfigFiles(projectDir, args.name, category, domain);\n } catch (error) {\n this.warn(`Could not update config files: ${getErrorMessage(error)}`);\n }\n }\n }\n\n // Regenerate config-types.ts to include the new skill\n if (configTypesReady) {\n try {\n await regenerateConfigTypes(projectDir, configTypesReady, {\n extraSkillIds: [args.name],\n extraDomains: [domain],\n extraCategories: [category],\n });\n } catch (error) {\n this.warn(\n `Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n this.log(\"\");\n this.log(\n `Skill created successfully! Run '${CLI_BIN_NAME} compile' to include it in your agents.`,\n );\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async updateConfigFiles(\n projectRoot: string,\n skillName: string,\n category: CategoryPath,\n domain: string,\n ): Promise<void> {\n const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_PATH);\n const rulesPath = path.join(projectRoot, SKILL_RULES_PATH);\n\n // Update skill-categories.ts\n if (await fileExists(categoriesPath)) {\n // Boundary cast: loadConfig returns unknown structure from TS file\n const parsed = (await loadConfig<Record<string, unknown>>(categoriesPath)) ?? {};\n const categories = (parsed.categories ?? {}) as Record<string, unknown>;\n if (!categories[category]) {\n categories[category] = buildCategoryEntry(category, domain);\n parsed.categories = categories;\n await writeFile(categoriesPath, formatTsExport(CATEGORIES_TS_COMMENT, parsed));\n verbose(`Added category '${category}' to ${SKILL_CATEGORIES_PATH}`);\n }\n } else {\n await ensureDir(path.dirname(categoriesPath));\n await writeFile(categoriesPath, generateSkillCategoriesTs(category, domain));\n verbose(`Created ${SKILL_CATEGORIES_PATH}`);\n }\n\n // Create skill-rules.ts if it doesn't exist (no aliases to update — slugs are in metadata.yaml)\n if (!(await fileExists(rulesPath))) {\n await ensureDir(path.dirname(rulesPath));\n await writeFile(rulesPath, generateSkillRulesTs());\n verbose(`Created ${SKILL_RULES_PATH}`);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -2,15 +2,15 @@
2
2
  import {
3
3
  useModalState
4
4
  } from "./chunk-7SOPVGDV.js";
5
- import {
6
- useKeyboardNavigation
7
- } from "./chunk-KUV24B5M.js";
8
5
  import {
9
6
  useRowScroll
10
7
  } from "./chunk-XMLCXRTS.js";
11
8
  import {
12
9
  ViewTitle
13
10
  } from "./chunk-AQYAVLZK.js";
11
+ import {
12
+ useKeyboardNavigation
13
+ } from "./chunk-KUV24B5M.js";
14
14
  import {
15
15
  useTextInput
16
16
  } from "./chunk-U3IGFMCY.js";
@@ -27,11 +27,11 @@ import {
27
27
  addSource,
28
28
  getSourceSummary,
29
29
  removeSource
30
- } from "./chunk-CADG5WWP.js";
30
+ } from "./chunk-3VNQPCOE.js";
31
31
  import {
32
32
  getErrorMessage,
33
33
  verbose
34
- } from "./chunk-R3AR4VLZ.js";
34
+ } from "./chunk-WJL4KU5V.js";
35
35
  import {
36
36
  CLI_COLORS
37
37
  } from "./chunk-EGMQ3SXN.js";
@@ -270,4 +270,4 @@ var StepSettings = ({
270
270
  export {
271
271
  StepSettings
272
272
  };
273
- //# sourceMappingURL=chunk-XB3TYSPL.js.map
273
+ //# sourceMappingURL=chunk-H4ETXZVL.js.map
@@ -7,10 +7,10 @@ import {
7
7
  } from "./chunk-AUNBGZS4.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-QOJAZI72.js";
10
+ } from "./chunk-OLWGGD4G.js";
11
11
  import {
12
- useMatrixStore
13
- } from "./chunk-BKL3DF2Q.js";
12
+ matrix
13
+ } from "./chunk-E74Q7GUE.js";
14
14
  import {
15
15
  DEFAULT_SCRATCH_DOMAINS
16
16
  } from "./chunk-EGMQ3SXN.js";
@@ -32,7 +32,6 @@ var StackSelection = ({
32
32
  onCancel
33
33
  }) => {
34
34
  const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } = useWizardStore();
35
- const matrix = useMatrixStore((s) => s.matrix);
36
35
  const [focusedIndex, setFocusedIndex] = useState(INITIAL_FOCUSED_INDEX);
37
36
  const stacks = matrix.suggestedStacks;
38
37
  const stackCount = stacks.length;
@@ -111,4 +110,4 @@ var StackSelection = ({
111
110
  export {
112
111
  StackSelection
113
112
  };
114
- //# sourceMappingURL=chunk-XMZNHLV3.js.map
113
+ //# sourceMappingURL=chunk-JHMECCBN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/stack-selection.tsx"],"sourcesContent":["import { Box, useInput } from \"ink\";\nimport React, { useState } from \"react\";\nimport { DEFAULT_SCRATCH_DOMAINS } from \"../../consts.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\nimport { SelectionCard } from \"./selection-card.js\";\n\nconst INITIAL_FOCUSED_INDEX = 0;\nconst SCRATCH_LABEL = \"Start from scratch\";\nconst SCRATCH_DESCRIPTION = \"Select domains and skills manually\";\n\n/** Number of extra items after the stack list (scratch option) */\nconst EXTRA_ITEMS_COUNT = 1;\n\nexport type StackSelectionProps = {\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onCancel?: () => void;\n};\n\nexport const StackSelection: React.FC<StackSelectionProps> = ({\n availableHeight = 0,\n onCancel,\n}) => {\n const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } =\n useWizardStore();\n\n const [focusedIndex, setFocusedIndex] = useState(INITIAL_FOCUSED_INDEX);\n\n const stacks = matrix.suggestedStacks;\n const stackCount = stacks.length;\n const scratchIndex = stackCount;\n const totalItems = stackCount + EXTRA_ITEMS_COUNT;\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: totalItems,\n focusedIndex,\n availableHeight,\n });\n\n useInput((input, key) => {\n if (key.escape) {\n if (onCancel) {\n onCancel();\n }\n return;\n }\n\n if (key.return) {\n if (focusedIndex === scratchIndex) {\n selectStack(null);\n setApproach(\"scratch\");\n\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n toggleDomain(domain);\n }\n return;\n }\n\n const focusedStack = stacks[focusedIndex];\n if (focusedStack) {\n selectStack(focusedStack.id);\n setStackAction(\"customize\");\n populateFromSkillIds(focusedStack.allSkillIds);\n setApproach(\"stack\");\n }\n return;\n }\n\n if (key.upArrow || input === \"k\") {\n setFocusedIndex((prev) => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow || input === \"j\") {\n setFocusedIndex((prev) => Math.min(totalItems - 1, prev + 1));\n }\n });\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = stacks.map((stack, index) => (\n <Box key={stack.id} ref={(el) => setSectionRef(index, el)} width=\"100%\" {...noShrink}>\n <SelectionCard\n label={stack.name}\n description={stack.description}\n isFocused={index === focusedIndex}\n marginBottom={1}\n />\n </Box>\n ));\n\n const scratchElement = (\n <Box ref={(el) => setSectionRef(scratchIndex, el)} width=\"100%\" {...noShrink}>\n <SelectionCard\n label={SCRATCH_LABEL}\n description={SCRATCH_DESCRIPTION}\n isFocused={focusedIndex === scratchIndex}\n />\n </Box>\n );\n\n return (\n <Box\n flexDirection=\"column\"\n width=\"100%\"\n {...(scrollEnabled\n ? { height: availableHeight, overflow: \"hidden\" as const }\n : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n {scratchElement}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,gBAAgB;AAC9B,SAAgB,gBAAgB;AAkF1B,cA2BA,YA3BA;AA3EN,IAAM,wBAAwB;AAC9B,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAG5B,IAAM,oBAAoB;AAQnB,IAAM,iBAAgD,CAAC;AAAA,EAC5D,kBAAkB;AAAA,EAClB;AACF,MAAM;AACJ,QAAM,EAAE,aAAa,aAAa,gBAAgB,sBAAsB,aAAa,IACnF,eAAe;AAEjB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,qBAAqB;AAEtE,QAAM,SAAS,OAAO;AACtB,QAAM,aAAa,OAAO;AAC1B,QAAM,eAAe;AACrB,QAAM,aAAa,aAAa;AAEhC,QAAM,EAAE,eAAe,eAAe,YAAY,IAAI,iBAAiB;AAAA,IACrE,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,CAAC;AAED,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,UAAI,iBAAiB,cAAc;AACjC,oBAAY,IAAI;AAChB,oBAAY,SAAS;AAErB,mBAAW,UAAU,yBAAyB;AAC5C,uBAAa,MAAM;AAAA,QACrB;AACA;AAAA,MACF;AAEA,YAAM,eAAe,OAAO,YAAY;AACxC,UAAI,cAAc;AAChB,oBAAY,aAAa,EAAE;AAC3B,uBAAe,WAAW;AAC1B,6BAAqB,aAAa,WAAW;AAC7C,oBAAY,OAAO;AAAA,MACrB;AACA;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,sBAAgB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAC/C;AAAA,IACF;AACA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,sBAAgB,CAAC,SAAS,KAAK,IAAI,aAAa,GAAG,OAAO,CAAC,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,QAAM,WAAW,gBAAgB,EAAE,YAAY,EAAE,IAAI,CAAC;AAEtD,QAAM,kBAAkB,OAAO,IAAI,CAAC,OAAO,UACzC,oBAAC,OAAmB,KAAK,CAAC,OAAO,cAAc,OAAO,EAAE,GAAG,OAAM,QAAQ,GAAG,UAC1E;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,WAAW,UAAU;AAAA,MACrB,cAAc;AAAA;AAAA,EAChB,KANQ,MAAM,EAOhB,CACD;AAED,QAAM,iBACJ,oBAAC,OAAI,KAAK,CAAC,OAAO,cAAc,cAAc,EAAE,GAAG,OAAM,QAAQ,GAAG,UAClE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW,iBAAiB;AAAA;AAAA,EAC9B,GACF;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,OAAM;AAAA,MACL,GAAI,gBACD,EAAE,QAAQ,iBAAiB,UAAU,SAAkB,IACvD,EAAE,UAAU,EAAE;AAAA,MAElB,+BAAC,OAAI,eAAc,UAAS,WAAW,cAAc,IAAI,CAAC,cAAc,GAAI,GAAG,UAC5E;AAAA;AAAA,QACA;AAAA,SACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1,31 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  WizardLayout
4
- } from "./chunk-VUUGWE6G.js";
4
+ } from "./chunk-Y47CLMWE.js";
5
5
  import {
6
6
  StepSettings
7
- } from "./chunk-XB3TYSPL.js";
7
+ } from "./chunk-H4ETXZVL.js";
8
8
  import {
9
9
  StepSources
10
- } from "./chunk-V5L532ZH.js";
10
+ } from "./chunk-3K6FSET7.js";
11
11
  import {
12
12
  StepStack
13
- } from "./chunk-AX6MMYAZ.js";
13
+ } from "./chunk-KE2EAVFQ.js";
14
14
  import {
15
15
  StepAgents
16
- } from "./chunk-HWVRHPXR.js";
16
+ } from "./chunk-3REVX6S5.js";
17
17
  import {
18
18
  StepBuild
19
- } from "./chunk-2VT2DMD7.js";
19
+ } from "./chunk-Y4VUU5BT.js";
20
20
  import {
21
21
  StepConfirm
22
- } from "./chunk-52THXN5G.js";
22
+ } from "./chunk-NUJHWYCR.js";
23
23
  import {
24
24
  getStackName
25
- } from "./chunk-ZYUASJUN.js";
25
+ } from "./chunk-BH4LN7XV.js";
26
26
  import {
27
27
  useWizardStore
28
- } from "./chunk-QOJAZI72.js";
28
+ } from "./chunk-OLWGGD4G.js";
29
29
  import {
30
30
  cliTheme
31
31
  } from "./chunk-T5DJCIUP.js";
@@ -39,13 +39,11 @@ import {
39
39
  import {
40
40
  resolveAlias,
41
41
  validateSelection
42
- } from "./chunk-CADG5WWP.js";
42
+ } from "./chunk-3VNQPCOE.js";
43
43
  import {
44
- getMatrix
45
- } from "./chunk-BKL3DF2Q.js";
46
- import {
47
- warn
48
- } from "./chunk-R3AR4VLZ.js";
44
+ findStack,
45
+ matrix
46
+ } from "./chunk-E74Q7GUE.js";
49
47
  import {
50
48
  CLI_COLORS
51
49
  } from "./chunk-EGMQ3SXN.js";
@@ -114,7 +112,7 @@ function useBuildStepProps({
114
112
  const onToggle = useCallback(
115
113
  (categoryId, techId) => {
116
114
  const domain = store.getCurrentDomain() || "web";
117
- const cat = getMatrix().categories[categoryId];
115
+ const cat = matrix.categories[categoryId];
118
116
  store.toggleTechnology(domain, categoryId, techId, cat?.exclusive ?? true);
119
117
  },
120
118
  [store]
@@ -232,11 +230,11 @@ var Wizard = ({
232
230
  const handleComplete = useCallback2(() => {
233
231
  let allSkills;
234
232
  if (store.selectedStackId && store.stackAction === "defaults") {
235
- const stack = getMatrix().suggestedStacks.find((s) => s.id === store.selectedStackId);
233
+ const stack = findStack(store.selectedStackId);
236
234
  if (!stack) {
237
- warn(`Stack not found in matrix: '${store.selectedStackId}'`);
235
+ throw new Error(`Stack not found: ${store.selectedStackId}`);
238
236
  }
239
- allSkills = [...stack?.allSkillIds || []];
237
+ allSkills = [...stack.allSkillIds];
240
238
  } else {
241
239
  const techNames = store.getAllSelectedTechnologies();
242
240
  allSkills = techNames.map((tech) => resolveAlias(tech));
@@ -341,4 +339,4 @@ var Wizard = ({
341
339
  export {
342
340
  Wizard
343
341
  };
344
- //# sourceMappingURL=chunk-UDAHHJIM.js.map
342
+ //# sourceMappingURL=chunk-K7WYMQQB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard.tsx","../src/cli/components/hooks/use-wizard-initialization.ts","../src/cli/components/hooks/use-build-step-props.ts"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text, useApp, useInput, useStdout } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { cliTheme } from \"../themes/default.js\";\nimport { WizardLayout } from \"./wizard-layout.js\";\nimport { StepStack } from \"./step-stack.js\";\nimport { StepBuild } from \"./step-build.js\";\nimport { StepConfirm } from \"./step-confirm.js\";\nimport { StepSources } from \"./step-sources.js\";\nimport { StepSettings } from \"./step-settings.js\";\nimport { StepAgents } from \"./step-agents.js\";\nimport { resolveAlias, validateSelection } from \"../../lib/matrix/index.js\";\nimport { matrix, findStack } from \"../../lib/matrix/matrix-provider.js\";\nimport {\n HOTKEY_ACCEPT_DEFAULTS,\n HOTKEY_HELP,\n HOTKEY_SCOPE,\n HOTKEY_SETTINGS,\n isHotkey,\n} from \"./hotkeys.js\";\nimport type { AgentName, Domain, DomainSelections, SkillId } from \"../../types/index.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport { getStackName } from \"./utils.js\";\nimport type { StartupMessage } from \"../../utils/logger.js\";\nimport { useWizardInitialization } from \"../hooks/use-wizard-initialization.js\";\nimport { useBuildStepProps } from \"../hooks/use-build-step-props.js\";\n\nexport type WizardResultV2 = {\n skills: SkillConfig[];\n selectedAgents: AgentName[];\n agentConfigs: AgentScopeConfig[];\n selectedStackId: string | null;\n domainSelections: DomainSelections;\n selectedDomains: Domain[];\n cancelled: boolean;\n validation: {\n valid: boolean;\n errors: Array<{ message: string }>;\n warnings: Array<{ message: string }>;\n };\n};\n\ntype WizardProps = {\n onComplete: (result: WizardResultV2) => void;\n onCancel: () => void;\n version?: string;\n marketplaceLabel?: string;\n logo?: string;\n initialStep?: WizardStep;\n initialDomains?: Domain[];\n initialAgents?: AgentName[];\n installedSkillIds?: SkillId[];\n installedSkillConfigs?: SkillConfig[];\n installedAgentConfigs?: AgentScopeConfig[];\n lockedSkillIds?: SkillId[];\n lockedAgentNames?: AgentName[];\n projectDir?: string;\n startupMessages?: StartupMessage[];\n};\n\nconst MIN_TERMINAL_WIDTH = 80;\nconst MIN_TERMINAL_HEIGHT = 15;\n\nexport const Wizard: React.FC<WizardProps> = ({\n onComplete,\n onCancel,\n version,\n marketplaceLabel,\n logo,\n initialStep,\n initialDomains,\n initialAgents,\n installedSkillIds,\n installedSkillConfigs,\n installedAgentConfigs,\n lockedSkillIds,\n lockedAgentNames,\n projectDir,\n startupMessages,\n}) => {\n const store = useWizardStore();\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;\n const terminalHeight = stdout.rows || MIN_TERMINAL_HEIGHT;\n const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;\n const isShortTerminal = terminalHeight < MIN_TERMINAL_HEIGHT;\n\n useWizardInitialization({\n initialStep,\n initialDomains,\n initialAgents,\n installedSkillIds,\n installedSkillConfigs,\n installedAgentConfigs,\n lockedSkillIds,\n lockedAgentNames,\n });\n\n const buildStepProps = useBuildStepProps({ store, installedSkillIds });\n\n useInput((input, key) => {\n // ESC is handled by step-settings.tsx's own useKeyboardNavigation hook\n if (store.showSettings) {\n if (isHotkey(input, HOTKEY_SETTINGS)) {\n store.toggleSettings();\n }\n return;\n }\n\n if (store.showHelp) {\n if (key.escape || isHotkey(input, HOTKEY_HELP)) {\n store.toggleHelp();\n }\n return;\n }\n\n if (isHotkey(input, HOTKEY_HELP)) {\n store.toggleHelp();\n return;\n }\n\n if (key.escape) {\n // At the initial stack/scratch selection (approach not yet set), ESC cancels the wizard.\n // StackSelection handles its own ESC via the onCancel prop.\n // Other steps that don't have their own escape handler use goBack.\n if (\n store.step !== \"build\" &&\n store.step !== \"confirm\" &&\n store.step !== \"sources\" &&\n store.step !== \"agents\" &&\n store.step !== \"stack\"\n ) {\n store.goBack();\n }\n return;\n }\n\n if (\n isHotkey(input, HOTKEY_ACCEPT_DEFAULTS) &&\n store.step === \"build\" &&\n store.selectedStackId\n ) {\n store.setStackAction(\"defaults\");\n store.setStep(\"confirm\");\n return;\n }\n\n if (isHotkey(input, HOTKEY_SCOPE) && store.step === \"build\") {\n const focused = store.focusedSkillId;\n if (focused) {\n store.toggleSkillScope(focused);\n }\n return;\n }\n\n if (isHotkey(input, HOTKEY_SCOPE) && store.step === \"agents\") {\n const focused = store.focusedAgentId;\n if (focused) {\n store.toggleAgentScope(focused);\n }\n return;\n }\n\n if (isHotkey(input, HOTKEY_SETTINGS) && store.step === \"sources\") {\n store.toggleSettings();\n return;\n }\n });\n\n const handleComplete = useCallback(() => {\n let allSkills: SkillId[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = findStack(store.selectedStackId);\n if (!stack) {\n throw new Error(`Stack not found: ${store.selectedStackId}`);\n }\n allSkills = [...stack.allSkillIds];\n } else {\n const techNames = store.getAllSelectedTechnologies();\n allSkills = techNames.map((tech) => resolveAlias(tech));\n }\n\n const skillConfigs: SkillConfig[] = allSkills.map((id) => {\n const existing = store.skillConfigs.find((sc) => sc.id === id);\n return existing ?? { id, scope: \"global\" as const, source: \"local\" };\n });\n\n const validation = validateSelection(allSkills);\n\n const result: WizardResultV2 = {\n skills: skillConfigs,\n selectedAgents: store.selectedAgents,\n agentConfigs: store.agentConfigs,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n selectedDomains: store.selectedDomains,\n cancelled: false,\n validation,\n };\n\n onComplete(result);\n exit();\n }, [store, onComplete, exit]);\n\n const handleCancel = useCallback(() => {\n onCancel();\n exit();\n }, [onCancel, exit]);\n\n const renderStep = () => {\n switch (store.step) {\n case \"stack\":\n return <StepStack onCancel={handleCancel} />;\n\n case \"build\":\n return <StepBuild {...buildStepProps} />;\n\n case \"sources\": {\n if (store.showSettings) {\n return (\n <StepSettings\n projectDir={projectDir || process.cwd()}\n onClose={() => store.toggleSettings()}\n />\n );\n }\n return (\n <StepSources\n projectDir={projectDir}\n onContinue={() => {\n if (!initialAgents?.length) {\n store.preselectAgentsFromDomains();\n }\n store.setStep(\"agents\");\n }}\n onBack={store.goBack}\n />\n );\n }\n\n case \"agents\":\n return <StepAgents />;\n\n case \"confirm\": {\n const stackName = getStackName(store.selectedStackId);\n const selectedSkills = store.getAllSelectedTechnologies();\n return (\n <StepConfirm\n onComplete={handleComplete}\n stackName={stackName}\n selectedDomains={store.selectedDomains}\n domainSelections={store.domainSelections}\n technologyCount={selectedSkills.length}\n skillCount={selectedSkills.length}\n agentCount={store.selectedAgents.length}\n skillConfigs={store.skillConfigs}\n agentConfigs={store.agentConfigs}\n onBack={store.goBack}\n />\n );\n }\n\n default:\n return null;\n }\n };\n\n if (isNarrowTerminal || isShortTerminal) {\n const issue = isNarrowTerminal\n ? `too narrow (${terminalWidth} columns, need ${MIN_TERMINAL_WIDTH})`\n : `too short (${terminalHeight} rows, need ${MIN_TERMINAL_HEIGHT})`;\n\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\" padding={1}>\n <Text color={CLI_COLORS.WARNING}>Terminal {issue}. Please resize your terminal.</Text>\n </Box>\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={cliTheme}>\n <WizardLayout\n version={version}\n marketplaceLabel={marketplaceLabel}\n logo={logo}\n startupMessages={startupMessages}\n >\n {renderStep()}\n </WizardLayout>\n </ThemeProvider>\n );\n};\n","import { useRef } from \"react\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport type { AgentName, Domain, SkillId } from \"../../types/index.js\";\n\ntype UseWizardInitializationOptions = {\n initialStep?: WizardStep;\n initialDomains?: Domain[];\n initialAgents?: AgentName[];\n installedSkillIds?: SkillId[];\n installedSkillConfigs?: SkillConfig[];\n installedAgentConfigs?: AgentScopeConfig[];\n lockedSkillIds?: SkillId[];\n lockedAgentNames?: AgentName[];\n};\n\n/**\n * Runs one-time wizard store initialization before the first render.\n * Populates step, approach, and skill selections from props.\n */\nexport function useWizardInitialization({\n initialStep,\n initialDomains,\n initialAgents,\n installedSkillIds,\n installedSkillConfigs,\n installedAgentConfigs,\n lockedSkillIds,\n lockedAgentNames,\n}: UseWizardInitializationOptions): void {\n const initialized = useRef(false);\n\n if (!initialized.current) {\n initialized.current = true;\n\n if (initialStep) {\n if (installedSkillIds?.length) {\n useWizardStore.getState().populateFromSkillIds(installedSkillIds, installedSkillConfigs);\n }\n useWizardStore.setState({ step: initialStep, approach: \"scratch\" });\n }\n // Restore saved domains from config, overriding the domains\n // derived by populateFromSkillIds\n if (initialDomains?.length) {\n useWizardStore.setState({ selectedDomains: initialDomains });\n }\n // Restore saved agents from config, overriding the default empty array\n if (initialAgents?.length) {\n useWizardStore.setState({ selectedAgents: initialAgents });\n }\n // Restore saved agent scope configs (project vs global)\n if (initialAgents?.length && installedAgentConfigs?.length) {\n useWizardStore.setState({ agentConfigs: installedAgentConfigs });\n }\n // Set locked IDs (D9: global items read-only in project context)\n if (lockedSkillIds?.length || lockedAgentNames?.length) {\n useWizardStore.setState({\n ...(lockedSkillIds?.length && { lockedSkillIds }),\n ...(lockedAgentNames?.length && { lockedAgentNames }),\n });\n }\n }\n}\n","import { useCallback } from \"react\";\nimport type { Domain, SkillId } from \"../../types/index.js\";\nimport type { WizardState } from \"../../stores/wizard-store.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport type { StepBuildProps } from \"../wizard/step-build.js\";\n\ntype UseBuildStepPropsOptions = {\n store: WizardState;\n installedSkillIds?: SkillId[];\n};\n\nexport function useBuildStepProps({\n store,\n installedSkillIds,\n}: UseBuildStepPropsOptions): StepBuildProps {\n const currentDomain = store.getCurrentDomain();\n const defaultDomains: Domain[] = [\"web\"];\n const effectiveDomains =\n store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;\n\n const allSelections = store.getAllSelectedTechnologies();\n\n const activeDomain: Domain = currentDomain || effectiveDomains[0] || \"web\";\n\n const onToggle = useCallback(\n (categoryId: Parameters<StepBuildProps[\"onToggle\"]>[0], techId: SkillId) => {\n const domain: Domain = store.getCurrentDomain() || \"web\";\n const cat = matrix.categories[categoryId];\n store.toggleTechnology(domain, categoryId, techId, cat?.exclusive ?? true);\n },\n [store],\n );\n\n const onContinue = useCallback(() => {\n if (!store.nextDomain()) {\n store.setStep(\"sources\");\n }\n }, [store]);\n\n const onBack = useCallback(() => {\n if (!store.prevDomain()) {\n store.goBack();\n }\n }, [store]);\n\n return {\n domain: activeDomain,\n selectedDomains: effectiveDomains,\n selections: store.domainSelections[activeDomain] || {},\n allSelections,\n showLabels: store.showLabels,\n installedSkillIds,\n onToggle,\n onToggleLabels: store.toggleShowLabels,\n onContinue,\n onBack,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "./chunk-XMZNHLV3.js";
4
+ } from "./chunk-JHMECCBN.js";
5
5
  import {
6
6
  useMeasuredHeight
7
7
  } from "./chunk-K77I4XGL.js";
8
8
  import {
9
9
  DomainSelection
10
- } from "./chunk-KANNRFY7.js";
10
+ } from "./chunk-4KLUOFP6.js";
11
11
  import {
12
12
  ViewTitle
13
13
  } from "./chunk-AQYAVLZK.js";
14
14
  import {
15
15
  useWizardStore
16
- } from "./chunk-QOJAZI72.js";
16
+ } from "./chunk-OLWGGD4G.js";
17
17
  import {
18
18
  init_esm_shims
19
19
  } from "./chunk-DHET7RCE.js";
@@ -37,4 +37,4 @@ var StepStack = ({ onCancel }) => {
37
37
  export {
38
38
  StepStack
39
39
  };
40
- //# sourceMappingURL=chunk-AX6MMYAZ.js.map
40
+ //# sourceMappingURL=chunk-KE2EAVFQ.js.map
@@ -10,8 +10,8 @@ import {
10
10
  isHotkey
11
11
  } from "./chunk-6VIOO74O.js";
12
12
  import {
13
- getSkill
14
- } from "./chunk-BKL3DF2Q.js";
13
+ getSkillById
14
+ } from "./chunk-E74Q7GUE.js";
15
15
  import {
16
16
  CLI_COLORS
17
17
  } from "./chunk-EGMQ3SXN.js";
@@ -186,7 +186,7 @@ var SkillTag = ({ option, isFocused, isLocked, showLabels }) => {
186
186
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
187
187
  /* @__PURE__ */ jsxs(Text, { color: textColor, bold: true, children: [
188
188
  " ",
189
- getSkill(option.id).displayName,
189
+ getSkillById(option.id).displayName,
190
190
  " "
191
191
  ] }),
192
192
  option.scope && /* @__PURE__ */ jsx(Text, { dimColor: true, children: option.scope === "global" ? "G " : "P " }),
@@ -341,4 +341,4 @@ var CategoryGrid = ({
341
341
  export {
342
342
  CategoryGrid
343
343
  };
344
- //# sourceMappingURL=chunk-CKPJTMNC.js.map
344
+ //# sourceMappingURL=chunk-KSMT5FVM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/category-grid.tsx","../src/cli/components/hooks/use-category-grid-input.ts"],"sourcesContent":["import React, { useCallback, useMemo, useRef } from \"react\";\n\nimport { Box, Text } from \"ink\";\n\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { getSkillById } from \"../../lib/matrix/matrix-provider.js\";\nimport type { SkillId, Category } from \"../../types/index.js\";\nimport { isSectionLocked, useCategoryGridInput } from \"../hooks/use-category-grid-input.js\";\nimport { useFocusedListItem } from \"../hooks/use-focused-list-item.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\n\nexport type OptionState = \"normal\" | \"recommended\" | \"discouraged\";\n\nexport type CategoryOption = {\n id: SkillId;\n state: OptionState;\n stateReason?: string;\n selected: boolean;\n local?: boolean;\n installed?: boolean;\n scope?: \"project\" | \"global\";\n};\n\nexport type CategoryRow = {\n id: Category;\n displayName: string;\n required: boolean;\n exclusive: boolean;\n options: CategoryOption[];\n};\n\nexport type CategoryGridProps = {\n categories: CategoryRow[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n showLabels: boolean;\n onToggle: (categoryId: Category, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n /** Optional initial focus row (default: 0). Use with React `key` to reset. */\n defaultFocusedRow?: number;\n /** Optional initial focus col (default: 0). Use with React `key` to reset. */\n defaultFocusedCol?: number;\n /** Optional callback fired whenever the focused position changes */\n onFocusChange?: (row: number, col: number) => void;\n /** Optional callback fired with the resolved SkillId of the focused cell */\n onFocusedSkillChange?: (skillId: SkillId | null) => void;\n};\n\nconst SYMBOL_REQUIRED = \"*\";\n\nconst findNextValidOption = (\n options: CategoryOption[],\n currentIndex: number,\n direction: 1 | -1,\n wrap = true,\n): number => {\n const length = options.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex + direction;\n\n if (wrap) {\n if (index < 0) index = length - 1;\n if (index >= length) index = 0;\n } else {\n if (index < 0) index = 0;\n if (index >= length) index = length - 1;\n }\n\n return index;\n};\n\ntype SkillTagProps = {\n option: CategoryOption;\n isFocused: boolean;\n isLocked: boolean;\n showLabels: boolean;\n};\n\nconst getCompatibilityLabel = (option: CategoryOption, isLocked: boolean): string | null => {\n if (option.selected) return \"(selected)\";\n if (isLocked) return \"(disabled)\";\n if (option.state === \"recommended\") return \"(recommended)\";\n if (option.state === \"discouraged\") return \"(discouraged)\";\n return null;\n};\n\nconst SkillTag: React.FC<SkillTagProps> = ({ option, isFocused, isLocked, showLabels }) => {\n const getTextColor = (): string => {\n if (isLocked) return CLI_COLORS.NEUTRAL;\n if (option.selected) return CLI_COLORS.PRIMARY;\n if (option.state === \"recommended\") return CLI_COLORS.UNFOCUSED;\n if (option.state === \"discouraged\") return CLI_COLORS.WARNING;\n\n return CLI_COLORS.NEUTRAL;\n };\n\n const getStateBorderColor = (): string => {\n if (isLocked) return CLI_COLORS.NEUTRAL;\n if (option.selected) return CLI_COLORS.PRIMARY;\n if (option.state === \"recommended\") return CLI_COLORS.UNFOCUSED;\n if (option.state === \"discouraged\") return CLI_COLORS.WARNING;\n return CLI_COLORS.UNFOCUSED;\n };\n\n const textColor = getTextColor();\n const compatibilityLabel = showLabels ? getCompatibilityLabel(option, isLocked) : null;\n\n return (\n <Box\n marginRight={1}\n borderColor={isFocused ? getStateBorderColor() : CLI_COLORS.NEUTRAL}\n borderStyle=\"single\"\n flexShrink={0}\n >\n <>\n <Text color={textColor} bold>\n {\" \"}\n {getSkillById(option.id).displayName}{\" \"}\n </Text>\n {option.scope && <Text dimColor>{option.scope === \"global\" ? \"G \" : \"P \"}</Text>}\n {compatibilityLabel && <Text dimColor>{compatibilityLabel} </Text>}\n </>\n </Box>\n );\n};\n\ntype CategorySectionProps = {\n isFirst: boolean;\n category: CategoryRow;\n options: CategoryOption[];\n isLocked: boolean;\n isFocused: boolean;\n focusedOptionIndex: number;\n showLabels: boolean;\n};\n\nconst CategorySection: React.FC<CategorySectionProps> = ({\n isFirst,\n category,\n options,\n isLocked,\n isFocused,\n focusedOptionIndex,\n showLabels,\n}) => {\n const selectedCount = options.filter((o) => o.selected).length;\n\n const selectionCounter = category.exclusive\n ? `(${selectedCount} of 1)`\n : `(${selectedCount} selected)`;\n\n return (\n <Box flexDirection=\"column\" marginTop={isFirst ? 0 : 1}>\n <Box flexDirection=\"row\">\n <Text dimColor={isLocked} color={isFocused ? \"#fff\" : \"gray\"}>\n {category.displayName}\n </Text>\n {category.required && (\n <Text color={isLocked ? CLI_COLORS.NEUTRAL : CLI_COLORS.ERROR} dimColor={isLocked}>\n {\" \"}\n {SYMBOL_REQUIRED}\n </Text>\n )}\n {selectionCounter && <Text dimColor> {selectionCounter}</Text>}\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {options.map((option, index) => (\n <SkillTag\n key={option.id}\n option={option}\n isFocused={isFocused && index === focusedOptionIndex && !isLocked}\n isLocked={isLocked}\n showLabels={showLabels}\n />\n ))}\n </Box>\n </Box>\n );\n};\n\ntype ProcessedCategory = CategoryRow & { sortedOptions: CategoryOption[] };\n\nexport const CategoryGrid: React.FC<CategoryGridProps> = ({\n categories,\n availableHeight = 0,\n showLabels,\n onToggle,\n onToggleLabels,\n defaultFocusedRow = 0,\n defaultFocusedCol = 0,\n onFocusChange,\n onFocusedSkillChange,\n}) => {\n const processedCategories = useMemo(\n () => categories.map((category) => ({ ...category, sortedOptions: category.options })),\n [categories],\n );\n\n const getColCount = useCallback(\n (row: number): number => processedCategories[row]?.sortedOptions.length ?? 0,\n [processedCategories],\n );\n\n const isRowLocked = useCallback(\n (row: number): boolean => {\n const cat = processedCategories[row];\n return cat ? isSectionLocked(cat.id, categories) : false;\n },\n [processedCategories, categories],\n );\n\n const findValidCol = useCallback(\n (row: number, currentCol: number, direction: 1 | -1): number => {\n const options = processedCategories[row]?.sortedOptions || [];\n const catId = processedCategories[row]?.id;\n if (catId && isSectionLocked(catId, categories)) return currentCol;\n return findNextValidOption(options, currentCol, direction, true);\n },\n [processedCategories, categories],\n );\n\n const handleFocusChange = useCallback(\n (row: number, col: number) => {\n onFocusChange?.(row, col);\n const skill = processedCategories[row]?.sortedOptions[col];\n onFocusedSkillChange?.(skill?.id ?? null);\n },\n [onFocusChange, processedCategories, onFocusedSkillChange],\n );\n\n const { focusedRow, focusedCol, setFocused, moveFocus } = useFocusedListItem(\n processedCategories.length,\n getColCount,\n {\n wrap: true,\n isRowLocked,\n findValidCol,\n onChange: handleFocusChange,\n initialRow: defaultFocusedRow,\n initialCol: defaultFocusedCol,\n },\n );\n\n const mountedRef = useRef(false);\n if (!mountedRef.current) {\n mountedRef.current = true;\n const skill = processedCategories[defaultFocusedRow]?.sortedOptions[defaultFocusedCol];\n onFocusedSkillChange?.(skill?.id ?? null);\n }\n\n useCategoryGridInput({\n processedCategories,\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n });\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: processedCategories.length,\n focusedIndex: focusedRow,\n availableHeight,\n });\n\n if (categories.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No categories to display.</Text>\n </Box>\n );\n }\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = processedCategories.map((category, index) => {\n const isLocked = isSectionLocked(category.id, categories);\n\n return (\n <Box key={category.id} ref={(el) => setSectionRef(index, el)} {...noShrink}>\n <CategorySection\n category={category}\n options={category.sortedOptions}\n isLocked={isLocked}\n isFocused={index === focusedRow}\n focusedOptionIndex={focusedCol}\n showLabels={showLabels}\n isFirst={index === 0}\n />\n </Box>\n );\n });\n\n return (\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled\n ? { height: availableHeight, overflow: \"hidden\" as const }\n : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n </Box>\n </Box>\n );\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { useInput } from \"ink\";\n\nimport type { Category, SkillId } from \"../../types/index.js\";\nimport type { CategoryOption, CategoryRow } from \"../wizard/category-grid.js\";\nimport { HOTKEY_TOGGLE_LABELS, isHotkey } from \"../wizard/hotkeys.js\";\n\nconst FRAMEWORK_CATEGORY_ID = \"web-framework\";\n\n// Locked = non-framework section when no framework is selected\nexport const isSectionLocked = (categoryId: Category, categories: CategoryRow[]): boolean => {\n if (categoryId === FRAMEWORK_CATEGORY_ID) {\n return false;\n }\n\n const frameworkCategory = categories.find((cat) => cat.id === FRAMEWORK_CATEGORY_ID);\n if (!frameworkCategory) return false;\n\n return !frameworkCategory.options.some((opt) => opt.selected);\n};\n\nexport const findValidStartColumn = (_options: CategoryOption[]): number => {\n return 0;\n};\n\n/** Find next unlocked section index (wrapping, direction: forward) */\nexport const findNextUnlockedIndex = (\n processed: { id: Category; sortedOptions: CategoryOption[] }[],\n currentIndex: number,\n allCategories: CategoryRow[],\n): number => {\n const length = processed.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex;\n let attempts = 0;\n\n while (attempts < length) {\n index += 1;\n if (index >= length) index = 0;\n\n const category = processed[index];\n if (category && !isSectionLocked(category.id, allCategories)) {\n return index;\n }\n\n attempts++;\n }\n\n return currentIndex;\n};\n\ntype ProcessedCategory = CategoryRow & { sortedOptions: CategoryOption[] };\n\ntype UseCategoryGridInputOptions = {\n processedCategories: ProcessedCategory[];\n categories: CategoryRow[];\n focusedRow: number;\n focusedCol: number;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: \"up\" | \"down\" | \"left\" | \"right\") => void;\n onToggle: (categoryId: Category, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n};\n\nexport function useCategoryGridInput({\n processedCategories,\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n}: UseCategoryGridInputOptions): void {\n const currentRow = processedCategories[focusedRow];\n const currentOptions = currentRow?.sortedOptions || [];\n const currentLocked = currentRow ? isSectionLocked(currentRow.id, categories) : false;\n\n // Adjust column when current row's options change externally (e.g. option becomes disabled)\n useEffect(() => {\n if (!currentRow) return;\n\n const maxCol = currentOptions.length - 1;\n if (focusedCol > maxCol) {\n const newCol = Math.max(0, maxCol);\n setFocused(focusedRow, newCol);\n }\n }, [focusedRow, currentOptions, focusedCol, setFocused, currentRow]);\n\n // Bounce off locked sections when a section becomes locked (e.g. framework deselected)\n useEffect(() => {\n if (currentRow && currentLocked) {\n const nextUnlocked = findNextUnlockedIndex(processedCategories, focusedRow, categories);\n if (nextUnlocked !== focusedRow) {\n const newRowOptions = processedCategories[nextUnlocked]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n setFocused(nextUnlocked, newCol);\n }\n }\n }, [currentRow, currentLocked, focusedRow, processedCategories, categories, setFocused]);\n\n // Store the latest handler in a ref so that the useInput effect never needs to\n // re-register on the event emitter. This avoids a stale-closure race condition\n // where, after a domain switch (CategoryGrid remount via key={activeDomain}),\n // the useInput effect may not yet have re-registered the updated handler when\n // the first keypress arrives — causing the first space press to be silently lost.\n type InputKey = {\n leftArrow: boolean;\n rightArrow: boolean;\n upArrow: boolean;\n downArrow: boolean;\n tab: boolean;\n shift: boolean;\n };\n\n const handlerRef = useRef<((input: string, key: InputKey) => void) | null>(null);\n handlerRef.current = (input: string, key: InputKey) => {\n if (key.tab && key.shift) {\n onToggleLabels();\n return;\n }\n\n if (key.tab && !key.shift) {\n const nextSection = findNextUnlockedIndex(processedCategories, focusedRow, categories);\n if (nextSection !== focusedRow) {\n const newRowOptions = processedCategories[nextSection]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n setFocused(nextSection, newCol);\n }\n return;\n }\n\n if (isHotkey(input, HOTKEY_TOGGLE_LABELS)) {\n onToggleLabels();\n return;\n }\n\n if (input === \" \") {\n if (currentLocked) return;\n const currentOption = currentOptions[focusedCol];\n if (currentOption) {\n onToggle(currentRow.id, currentOption.id);\n }\n return;\n }\n\n const isLeft = key.leftArrow || input === \"h\";\n const isRight = key.rightArrow || input === \"l\";\n const isUp = key.upArrow || input === \"k\";\n const isDown = key.downArrow || input === \"j\";\n\n if (isLeft) {\n if (currentLocked) return;\n moveFocus(\"left\");\n } else if (isRight) {\n if (currentLocked) return;\n moveFocus(\"right\");\n } else if (isUp) {\n moveFocus(\"up\");\n } else if (isDown) {\n moveFocus(\"down\");\n }\n };\n\n // Stable handler reference — never changes, so useInput's effect registers once\n const stableHandler = useCallback((input: string, key: InputKey) => {\n handlerRef.current?.(input, key);\n }, []);\n\n useInput(stableHandler);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,eAAAA,cAAa,SAAS,UAAAC,eAAc;AAEpD,SAAS,KAAK,YAAY;;;ACF1B;AAAA,SAAS,aAAa,WAAW,cAAc;AAC/C,SAAS,gBAAgB;AAMzB,IAAM,wBAAwB;AAGvB,IAAM,kBAAkB,CAAC,YAAsB,eAAuC;AAC3F,MAAI,eAAe,uBAAuB;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,WAAW,KAAK,CAAC,QAAQ,IAAI,OAAO,qBAAqB;AACnF,MAAI,CAAC,kBAAmB,QAAO;AAE/B,SAAO,CAAC,kBAAkB,QAAQ,KAAK,CAAC,QAAQ,IAAI,QAAQ;AAC9D;AAEO,IAAM,uBAAuB,CAAC,aAAuC;AAC1E,SAAO;AACT;AAGO,IAAM,wBAAwB,CACnC,WACA,cACA,kBACW;AACX,QAAM,SAAS,UAAU;AACzB,MAAI,WAAW,EAAG,QAAO;AAEzB,MAAI,QAAQ;AACZ,MAAI,WAAW;AAEf,SAAO,WAAW,QAAQ;AACxB,aAAS;AACT,QAAI,SAAS,OAAQ,SAAQ;AAE7B,UAAM,WAAW,UAAU,KAAK;AAChC,QAAI,YAAY,CAAC,gBAAgB,SAAS,IAAI,aAAa,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA;AAAA,EACF;AAEA,SAAO;AACT;AAeO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsC;AACpC,QAAM,aAAa,oBAAoB,UAAU;AACjD,QAAM,iBAAiB,YAAY,iBAAiB,CAAC;AACrD,QAAM,gBAAgB,aAAa,gBAAgB,WAAW,IAAI,UAAU,IAAI;AAGhF,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AAEjB,UAAM,SAAS,eAAe,SAAS;AACvC,QAAI,aAAa,QAAQ;AACvB,YAAM,SAAS,KAAK,IAAI,GAAG,MAAM;AACjC,iBAAW,YAAY,MAAM;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,YAAY,gBAAgB,YAAY,YAAY,UAAU,CAAC;AAGnE,YAAU,MAAM;AACd,QAAI,cAAc,eAAe;AAC/B,YAAM,eAAe,sBAAsB,qBAAqB,YAAY,UAAU;AACtF,UAAI,iBAAiB,YAAY;AAC/B,cAAM,gBAAgB,oBAAoB,YAAY,GAAG,iBAAiB,CAAC;AAC3E,cAAM,SAAS,qBAAqB,aAAa;AACjD,mBAAW,cAAc,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,YAAY,eAAe,YAAY,qBAAqB,YAAY,UAAU,CAAC;AAgBvF,QAAM,aAAa,OAAwD,IAAI;AAC/E,aAAW,UAAU,CAAC,OAAe,QAAkB;AACrD,QAAI,IAAI,OAAO,IAAI,OAAO;AACxB,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,IAAI,OAAO,CAAC,IAAI,OAAO;AACzB,YAAM,cAAc,sBAAsB,qBAAqB,YAAY,UAAU;AACrF,UAAI,gBAAgB,YAAY;AAC9B,cAAM,gBAAgB,oBAAoB,WAAW,GAAG,iBAAiB,CAAC;AAC1E,cAAM,SAAS,qBAAqB,aAAa;AACjD,mBAAW,aAAa,MAAM;AAAA,MAChC;AACA;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,oBAAoB,GAAG;AACzC,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,UAAU,KAAK;AACjB,UAAI,cAAe;AACnB,YAAM,gBAAgB,eAAe,UAAU;AAC/C,UAAI,eAAe;AACjB,iBAAS,WAAW,IAAI,cAAc,EAAE;AAAA,MAC1C;AACA;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,aAAa,UAAU;AAC1C,UAAM,UAAU,IAAI,cAAc,UAAU;AAC5C,UAAM,OAAO,IAAI,WAAW,UAAU;AACtC,UAAM,SAAS,IAAI,aAAa,UAAU;AAE1C,QAAI,QAAQ;AACV,UAAI,cAAe;AACnB,gBAAU,MAAM;AAAA,IAClB,WAAW,SAAS;AAClB,UAAI,cAAe;AACnB,gBAAU,OAAO;AAAA,IACnB,WAAW,MAAM;AACf,gBAAU,IAAI;AAAA,IAChB,WAAW,QAAQ;AACjB,gBAAU,MAAM;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,gBAAgB,YAAY,CAAC,OAAe,QAAkB;AAClE,eAAW,UAAU,OAAO,GAAG;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,WAAS,aAAa;AACxB;;;ADxDM,mBAKmB,KAJjB,YADF;AAnEN,IAAM,kBAAkB;AAExB,IAAM,sBAAsB,CAC1B,SACA,cACA,WACA,OAAO,SACI;AACX,QAAM,SAAS,QAAQ;AACvB,MAAI,WAAW,EAAG,QAAO;AAEzB,MAAI,QAAQ,eAAe;AAE3B,MAAI,MAAM;AACR,QAAI,QAAQ,EAAG,SAAQ,SAAS;AAChC,QAAI,SAAS,OAAQ,SAAQ;AAAA,EAC/B,OAAO;AACL,QAAI,QAAQ,EAAG,SAAQ;AACvB,QAAI,SAAS,OAAQ,SAAQ,SAAS;AAAA,EACxC;AAEA,SAAO;AACT;AASA,IAAM,wBAAwB,CAAC,QAAwB,aAAqC;AAC1F,MAAI,OAAO,SAAU,QAAO;AAC5B,MAAI,SAAU,QAAO;AACrB,MAAI,OAAO,UAAU,cAAe,QAAO;AAC3C,MAAI,OAAO,UAAU,cAAe,QAAO;AAC3C,SAAO;AACT;AAEA,IAAM,WAAoC,CAAC,EAAE,QAAQ,WAAW,UAAU,WAAW,MAAM;AACzF,QAAM,eAAe,MAAc;AACjC,QAAI,SAAU,QAAO,WAAW;AAChC,QAAI,OAAO,SAAU,QAAO,WAAW;AACvC,QAAI,OAAO,UAAU,cAAe,QAAO,WAAW;AACtD,QAAI,OAAO,UAAU,cAAe,QAAO,WAAW;AAEtD,WAAO,WAAW;AAAA,EACpB;AAEA,QAAM,sBAAsB,MAAc;AACxC,QAAI,SAAU,QAAO,WAAW;AAChC,QAAI,OAAO,SAAU,QAAO,WAAW;AACvC,QAAI,OAAO,UAAU,cAAe,QAAO,WAAW;AACtD,QAAI,OAAO,UAAU,cAAe,QAAO,WAAW;AACtD,WAAO,WAAW;AAAA,EACpB;AAEA,QAAM,YAAY,aAAa;AAC/B,QAAM,qBAAqB,aAAa,sBAAsB,QAAQ,QAAQ,IAAI;AAElF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAa;AAAA,MACb,aAAa,YAAY,oBAAoB,IAAI,WAAW;AAAA,MAC5D,aAAY;AAAA,MACZ,YAAY;AAAA,MAEZ,2CACE;AAAA,6BAAC,QAAK,OAAO,WAAW,MAAI,MACzB;AAAA;AAAA,UACA,aAAa,OAAO,EAAE,EAAE;AAAA,UAAa;AAAA,WACxC;AAAA,QACC,OAAO,SAAS,oBAAC,QAAK,UAAQ,MAAE,iBAAO,UAAU,WAAW,OAAO,MAAK;AAAA,QACxE,sBAAsB,qBAAC,QAAK,UAAQ,MAAE;AAAA;AAAA,UAAmB;AAAA,WAAC;AAAA,SAC7D;AAAA;AAAA,EACF;AAEJ;AAYA,IAAM,kBAAkD,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,gBAAgB,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE;AAExD,QAAM,mBAAmB,SAAS,YAC9B,IAAI,aAAa,WACjB,IAAI,aAAa;AAErB,SACE,qBAAC,OAAI,eAAc,UAAS,WAAW,UAAU,IAAI,GACnD;AAAA,yBAAC,OAAI,eAAc,OACjB;AAAA,0BAAC,QAAK,UAAU,UAAU,OAAO,YAAY,SAAS,QACnD,mBAAS,aACZ;AAAA,MACC,SAAS,YACR,qBAAC,QAAK,OAAO,WAAW,WAAW,UAAU,WAAW,OAAO,UAAU,UACtE;AAAA;AAAA,QACA;AAAA,SACH;AAAA,MAED,oBAAoB,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,QAAE;AAAA,SAAiB;AAAA,OACzD;AAAA,IAEA,oBAAC,OAAI,eAAc,OAAM,UAAS,QAAO,WAAW,GACjD,kBAAQ,IAAI,CAAC,QAAQ,UACpB;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA,WAAW,aAAa,UAAU,sBAAsB,CAAC;AAAA,QACzD;AAAA,QACA;AAAA;AAAA,MAJK,OAAO;AAAA,IAKd,CACD,GACH;AAAA,KACF;AAEJ;AAIO,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB;AAAA,EACA;AACF,MAAM;AACJ,QAAM,sBAAsB;AAAA,IAC1B,MAAM,WAAW,IAAI,CAAC,cAAc,EAAE,GAAG,UAAU,eAAe,SAAS,QAAQ,EAAE;AAAA,IACrF,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,cAAcC;AAAA,IAClB,CAAC,QAAwB,oBAAoB,GAAG,GAAG,cAAc,UAAU;AAAA,IAC3E,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,cAAcA;AAAA,IAClB,CAAC,QAAyB;AACxB,YAAM,MAAM,oBAAoB,GAAG;AACnC,aAAO,MAAM,gBAAgB,IAAI,IAAI,UAAU,IAAI;AAAA,IACrD;AAAA,IACA,CAAC,qBAAqB,UAAU;AAAA,EAClC;AAEA,QAAM,eAAeA;AAAA,IACnB,CAAC,KAAa,YAAoB,cAA8B;AAC9D,YAAM,UAAU,oBAAoB,GAAG,GAAG,iBAAiB,CAAC;AAC5D,YAAM,QAAQ,oBAAoB,GAAG,GAAG;AACxC,UAAI,SAAS,gBAAgB,OAAO,UAAU,EAAG,QAAO;AACxD,aAAO,oBAAoB,SAAS,YAAY,WAAW,IAAI;AAAA,IACjE;AAAA,IACA,CAAC,qBAAqB,UAAU;AAAA,EAClC;AAEA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,KAAa,QAAgB;AAC5B,sBAAgB,KAAK,GAAG;AACxB,YAAM,QAAQ,oBAAoB,GAAG,GAAG,cAAc,GAAG;AACzD,6BAAuB,OAAO,MAAM,IAAI;AAAA,IAC1C;AAAA,IACA,CAAC,eAAe,qBAAqB,oBAAoB;AAAA,EAC3D;AAEA,QAAM,EAAE,YAAY,YAAY,YAAY,UAAU,IAAI;AAAA,IACxD,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAaC,QAAO,KAAK;AAC/B,MAAI,CAAC,WAAW,SAAS;AACvB,eAAW,UAAU;AACrB,UAAM,QAAQ,oBAAoB,iBAAiB,GAAG,cAAc,iBAAiB;AACrF,2BAAuB,OAAO,MAAM,IAAI;AAAA,EAC1C;AAEA,uBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,EAAE,eAAe,eAAe,YAAY,IAAI,iBAAiB;AAAA,IACrE,cAAc,oBAAoB;AAAA,IAClC,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AAED,MAAI,WAAW,WAAW,GAAG;AAC3B,WACE,oBAAC,OAAI,eAAc,UACjB,8BAAC,QAAK,UAAQ,MAAC,uCAAyB,GAC1C;AAAA,EAEJ;AAEA,QAAM,WAAW,gBAAgB,EAAE,YAAY,EAAE,IAAI,CAAC;AAEtD,QAAM,kBAAkB,oBAAoB,IAAI,CAAC,UAAU,UAAU;AACnE,UAAM,WAAW,gBAAgB,SAAS,IAAI,UAAU;AAExD,WACE,oBAAC,OAAsB,KAAK,CAAC,OAAO,cAAc,OAAO,EAAE,GAAI,GAAG,UAChE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAS,SAAS;AAAA,QAClB;AAAA,QACA,WAAW,UAAU;AAAA,QACrB,oBAAoB;AAAA,QACpB;AAAA,QACA,SAAS,UAAU;AAAA;AAAA,IACrB,KATQ,SAAS,EAUnB;AAAA,EAEJ,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACb,GAAI,gBACD,EAAE,QAAQ,iBAAiB,UAAU,SAAkB,IACvD,EAAE,UAAU,EAAE;AAAA,MAElB,8BAAC,OAAI,eAAc,UAAS,WAAW,cAAc,IAAI,CAAC,cAAc,GAAI,GAAG,UAC5E,2BACH;AAAA;AAAA,EACF;AAEJ;","names":["useCallback","useRef","useCallback","useRef"]}