@agents-inc/cli 0.75.1 → 0.77.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/{chunk-SXGBPQY6.js → chunk-2I5SXGXR.js} +2 -2
  3. package/dist/{chunk-SYGXJBG6.js → chunk-32HX6UYI.js} +21 -11
  4. package/dist/chunk-32HX6UYI.js.map +1 -0
  5. package/dist/{chunk-T5DJCIUP.js → chunk-3REKTRAN.js} +2 -2
  6. package/dist/{chunk-ZZJ6H6VB.js → chunk-5DDHCCEB.js} +16 -6
  7. package/dist/chunk-5DDHCCEB.js.map +1 -0
  8. package/dist/{chunk-U6A4YFOF.js → chunk-7JQIMEUX.js} +4 -4
  9. package/dist/{chunk-KDYE3AGL.js → chunk-7LBYURQR.js} +2 -2
  10. package/dist/{chunk-UFKDY45I.js → chunk-A5JSBU65.js} +4 -4
  11. package/dist/{chunk-FYYIRFYT.js → chunk-A6XMJT2Q.js} +6 -6
  12. package/dist/{chunk-CUCF5LM4.js → chunk-AQ5KP4YW.js} +5 -5
  13. package/dist/{chunk-W22IYRZV.js → chunk-B66E255O.js} +5 -5
  14. package/dist/{chunk-2PZ7LBFT.js → chunk-C22ACAL2.js} +3 -3
  15. package/dist/{chunk-JOTAIMTC.js → chunk-CTZ4GEAD.js} +18 -18
  16. package/dist/chunk-CTZ4GEAD.js.map +1 -0
  17. package/dist/{chunk-BVSWWBPE.js → chunk-CY23HPDE.js} +7 -5
  18. package/dist/chunk-CY23HPDE.js.map +1 -0
  19. package/dist/{chunk-5BGBH3KD.js → chunk-CZLXZ75E.js} +68 -36
  20. package/dist/chunk-CZLXZ75E.js.map +1 -0
  21. package/dist/{chunk-PSU42CXK.js → chunk-EO6KJI5D.js} +1194 -538
  22. package/dist/chunk-EO6KJI5D.js.map +1 -0
  23. package/dist/{chunk-CBXMOWQY.js → chunk-ERHTXNIF.js} +3 -3
  24. package/dist/{chunk-TQLDQ3XZ.js → chunk-EYFBODHL.js} +2 -2
  25. package/dist/{chunk-AUNBGZS4.js → chunk-FFMWFEUH.js} +2 -2
  26. package/dist/{chunk-EGMQ3SXN.js → chunk-FMYAYX6W.js} +1 -1
  27. package/dist/chunk-FMYAYX6W.js.map +1 -0
  28. package/dist/{chunk-HKIQA4F6.js → chunk-FSK4TQX7.js} +1730 -2390
  29. package/dist/chunk-FSK4TQX7.js.map +1 -0
  30. package/dist/{chunk-JGSPESM3.js → chunk-FUWUCKES.js} +15 -12
  31. package/dist/chunk-FUWUCKES.js.map +1 -0
  32. package/dist/{chunk-WXC2Y5TF.js → chunk-G3YSDQJ2.js} +41 -42
  33. package/dist/chunk-G3YSDQJ2.js.map +1 -0
  34. package/dist/{chunk-CBYRFAUN.js → chunk-HK53FRMU.js} +3 -1
  35. package/dist/chunk-HK53FRMU.js.map +1 -0
  36. package/dist/{chunk-XHTN56UT.js → chunk-IFCASC6R.js} +3 -3
  37. package/dist/{chunk-Q3F36QZZ.js → chunk-J5OOAKB5.js} +3 -3
  38. package/dist/{chunk-MWGDG4QN.js → chunk-K63OEZW7.js} +2 -2
  39. package/dist/{chunk-GMUOEQOY.js → chunk-KB57OPUL.js} +4 -4
  40. package/dist/{chunk-DFKNFZI2.js → chunk-KMLJCO5H.js} +7 -7
  41. package/dist/{chunk-CXRVM7BA.js → chunk-M76LNKMY.js} +2 -2
  42. package/dist/{chunk-AOZBHMYL.js → chunk-MG55NDVG.js} +4 -4
  43. package/dist/{chunk-WF5PMBIR.js → chunk-MLXAZODL.js} +2 -2
  44. package/dist/{chunk-TYM4D3OF.js → chunk-MUCQ27HV.js} +3 -3
  45. package/dist/{chunk-TYM4D3OF.js.map → chunk-MUCQ27HV.js.map} +1 -1
  46. package/dist/{chunk-U5R4M7MA.js → chunk-N4KD5PBX.js} +5 -5
  47. package/dist/{chunk-SPATQKH6.js → chunk-PDYKGJGR.js} +4 -4
  48. package/dist/{chunk-7QAVO7VN.js → chunk-R6QNVMN5.js} +18 -44
  49. package/dist/{chunk-7QAVO7VN.js.map → chunk-R6QNVMN5.js.map} +1 -1
  50. package/dist/chunk-SGKNE6EJ.js +192 -0
  51. package/dist/chunk-SGKNE6EJ.js.map +1 -0
  52. package/dist/{chunk-XMLCXRTS.js → chunk-SQ7WINEU.js} +3 -3
  53. package/dist/{chunk-Q72ZBA4X.js → chunk-U2KFFRRX.js} +3 -3
  54. package/dist/{chunk-VU4ZCRZS.js → chunk-UZHD4DBD.js} +6 -6
  55. package/dist/{chunk-QN3V3ES7.js → chunk-WMTYOK4E.js} +10 -10
  56. package/dist/{chunk-UQKCYLOA.js → chunk-XA7WF3BI.js} +9 -9
  57. package/dist/chunk-XA7WF3BI.js.map +1 -0
  58. package/dist/{chunk-FHHTDPMW.js → chunk-XU6N3OIS.js} +6 -6
  59. package/dist/{chunk-6C66NL4X.js → chunk-XYPAOBBV.js} +4 -4
  60. package/dist/chunk-XYPAOBBV.js.map +1 -0
  61. package/dist/{chunk-XZ57QYVI.js → chunk-ZIZFTSQY.js} +4 -4
  62. package/dist/commands/build/marketplace.js +5 -5
  63. package/dist/commands/build/plugins.js +9 -9
  64. package/dist/commands/build/stack.js +9 -9
  65. package/dist/commands/compile.js +10 -10
  66. package/dist/commands/config/index.js +9 -9
  67. package/dist/commands/config/path.js +8 -8
  68. package/dist/commands/config/show.js +9 -9
  69. package/dist/commands/diff.js +8 -8
  70. package/dist/commands/doctor.js +8 -8
  71. package/dist/commands/edit.js +34 -34
  72. package/dist/commands/eject.js +8 -8
  73. package/dist/commands/import/skill.js +9 -9
  74. package/dist/commands/info.js +9 -9
  75. package/dist/commands/init.js +34 -34
  76. package/dist/commands/list.js +8 -8
  77. package/dist/commands/new/agent.js +9 -9
  78. package/dist/commands/new/marketplace.js +10 -10
  79. package/dist/commands/new/skill.js +9 -9
  80. package/dist/commands/outdated.js +8 -8
  81. package/dist/commands/search.js +12 -12
  82. package/dist/commands/uninstall.js +9 -9
  83. package/dist/commands/update.js +10 -10
  84. package/dist/commands/validate.js +9 -9
  85. package/dist/components/common/select-list.js +2 -2
  86. package/dist/components/skill-search/skill-search.js +4 -4
  87. package/dist/components/wizard/category-grid.js +5 -5
  88. package/dist/components/wizard/category-grid.test.js +20 -21
  89. package/dist/components/wizard/category-grid.test.js.map +1 -1
  90. package/dist/components/wizard/checkbox-grid.js +4 -4
  91. package/dist/components/wizard/checkbox-grid.test.js +4 -4
  92. package/dist/components/wizard/domain-selection.js +13 -13
  93. package/dist/components/wizard/help-modal.js +3 -3
  94. package/dist/components/wizard/menu-item.js +1 -1
  95. package/dist/components/wizard/search-modal.js +4 -4
  96. package/dist/components/wizard/search-modal.test.js +4 -4
  97. package/dist/components/wizard/section-progress.js +2 -2
  98. package/dist/components/wizard/section-progress.test.js +2 -2
  99. package/dist/components/wizard/selection-card.js +2 -2
  100. package/dist/components/wizard/source-grid.js +7 -7
  101. package/dist/components/wizard/source-grid.test.js +16 -16
  102. package/dist/components/wizard/stack-selection.js +12 -11
  103. package/dist/components/wizard/step-agents.js +12 -12
  104. package/dist/components/wizard/step-agents.test.js +15 -15
  105. package/dist/components/wizard/step-build.js +13 -13
  106. package/dist/components/wizard/step-build.test.js +17 -15
  107. package/dist/components/wizard/step-build.test.js.map +1 -1
  108. package/dist/components/wizard/step-confirm.js +6 -6
  109. package/dist/components/wizard/step-confirm.test.js +12 -12
  110. package/dist/components/wizard/step-refine.js +3 -3
  111. package/dist/components/wizard/step-refine.test.js +3 -3
  112. package/dist/components/wizard/step-settings.js +11 -11
  113. package/dist/components/wizard/step-settings.test.js +14 -14
  114. package/dist/components/wizard/step-sources.js +15 -15
  115. package/dist/components/wizard/step-sources.test.js +18 -18
  116. package/dist/components/wizard/step-stack.js +15 -16
  117. package/dist/components/wizard/step-stack.test.js +19 -19
  118. package/dist/components/wizard/step-stack.test.js.map +1 -1
  119. package/dist/components/wizard/wizard-layout.js +12 -12
  120. package/dist/components/wizard/wizard-tabs.js +2 -2
  121. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  122. package/dist/components/wizard/wizard.js +31 -31
  123. package/dist/config-exports.js +1 -1
  124. package/dist/hooks/init.js +34 -34
  125. package/dist/{loader-TK7YS2I5.js → loader-JMOO2A7C.js} +5 -5
  126. package/dist/{source-loader-UQXJVVSO.js → source-loader-H3QLG5AE.js} +8 -8
  127. package/dist/source-manager-ZDBUHGIR.js +19 -0
  128. package/dist/src/agents/_templates/agent.liquid +24 -0
  129. package/dist/src/agents/_templates/methodologies/anti-over-engineering.liquid +121 -0
  130. package/dist/src/agents/_templates/methodologies/context-management.liquid +162 -0
  131. package/dist/src/agents/_templates/methodologies/improvement-protocol.liquid +150 -0
  132. package/dist/src/agents/_templates/methodologies/investigation-requirements.liquid +49 -0
  133. package/dist/src/agents/_templates/methodologies/success-criteria.liquid +111 -0
  134. package/dist/src/agents/_templates/methodologies/write-verification.liquid +43 -0
  135. package/dist/src/agents/meta/agent-summoner/workflow.md +2 -2
  136. package/dist/src/agents/meta/skill-summoner/workflow.md +48 -3
  137. package/dist/stores/wizard-store.js +8 -8
  138. package/dist/stores/wizard-store.test.js +36 -36
  139. package/dist/stores/wizard-store.test.js.map +1 -1
  140. package/package.json +1 -1
  141. package/src/agents/_templates/agent.liquid +24 -0
  142. package/src/agents/_templates/methodologies/anti-over-engineering.liquid +121 -0
  143. package/src/agents/_templates/methodologies/context-management.liquid +162 -0
  144. package/src/agents/_templates/methodologies/improvement-protocol.liquid +150 -0
  145. package/src/agents/_templates/methodologies/investigation-requirements.liquid +49 -0
  146. package/src/agents/_templates/methodologies/success-criteria.liquid +111 -0
  147. package/src/agents/_templates/methodologies/write-verification.liquid +43 -0
  148. package/src/agents/meta/agent-summoner/workflow.md +2 -2
  149. package/src/agents/meta/skill-summoner/workflow.md +48 -3
  150. package/dist/chunk-5BGBH3KD.js.map +0 -1
  151. package/dist/chunk-6C66NL4X.js.map +0 -1
  152. package/dist/chunk-BVSWWBPE.js.map +0 -1
  153. package/dist/chunk-CBYRFAUN.js.map +0 -1
  154. package/dist/chunk-EGMQ3SXN.js.map +0 -1
  155. package/dist/chunk-GCT7LSYW.js +0 -113
  156. package/dist/chunk-GCT7LSYW.js.map +0 -1
  157. package/dist/chunk-HKIQA4F6.js.map +0 -1
  158. package/dist/chunk-JGSPESM3.js.map +0 -1
  159. package/dist/chunk-JOTAIMTC.js.map +0 -1
  160. package/dist/chunk-PSU42CXK.js.map +0 -1
  161. package/dist/chunk-SYGXJBG6.js.map +0 -1
  162. package/dist/chunk-UQKCYLOA.js.map +0 -1
  163. package/dist/chunk-WXC2Y5TF.js.map +0 -1
  164. package/dist/chunk-ZZJ6H6VB.js.map +0 -1
  165. package/dist/source-manager-HS2ZT4XE.js +0 -19
  166. /package/dist/{chunk-SXGBPQY6.js.map → chunk-2I5SXGXR.js.map} +0 -0
  167. /package/dist/{chunk-T5DJCIUP.js.map → chunk-3REKTRAN.js.map} +0 -0
  168. /package/dist/{chunk-U6A4YFOF.js.map → chunk-7JQIMEUX.js.map} +0 -0
  169. /package/dist/{chunk-KDYE3AGL.js.map → chunk-7LBYURQR.js.map} +0 -0
  170. /package/dist/{chunk-UFKDY45I.js.map → chunk-A5JSBU65.js.map} +0 -0
  171. /package/dist/{chunk-FYYIRFYT.js.map → chunk-A6XMJT2Q.js.map} +0 -0
  172. /package/dist/{chunk-CUCF5LM4.js.map → chunk-AQ5KP4YW.js.map} +0 -0
  173. /package/dist/{chunk-W22IYRZV.js.map → chunk-B66E255O.js.map} +0 -0
  174. /package/dist/{chunk-2PZ7LBFT.js.map → chunk-C22ACAL2.js.map} +0 -0
  175. /package/dist/{chunk-CBXMOWQY.js.map → chunk-ERHTXNIF.js.map} +0 -0
  176. /package/dist/{chunk-TQLDQ3XZ.js.map → chunk-EYFBODHL.js.map} +0 -0
  177. /package/dist/{chunk-AUNBGZS4.js.map → chunk-FFMWFEUH.js.map} +0 -0
  178. /package/dist/{chunk-XHTN56UT.js.map → chunk-IFCASC6R.js.map} +0 -0
  179. /package/dist/{chunk-Q3F36QZZ.js.map → chunk-J5OOAKB5.js.map} +0 -0
  180. /package/dist/{chunk-MWGDG4QN.js.map → chunk-K63OEZW7.js.map} +0 -0
  181. /package/dist/{chunk-GMUOEQOY.js.map → chunk-KB57OPUL.js.map} +0 -0
  182. /package/dist/{chunk-DFKNFZI2.js.map → chunk-KMLJCO5H.js.map} +0 -0
  183. /package/dist/{chunk-CXRVM7BA.js.map → chunk-M76LNKMY.js.map} +0 -0
  184. /package/dist/{chunk-AOZBHMYL.js.map → chunk-MG55NDVG.js.map} +0 -0
  185. /package/dist/{chunk-WF5PMBIR.js.map → chunk-MLXAZODL.js.map} +0 -0
  186. /package/dist/{chunk-U5R4M7MA.js.map → chunk-N4KD5PBX.js.map} +0 -0
  187. /package/dist/{chunk-SPATQKH6.js.map → chunk-PDYKGJGR.js.map} +0 -0
  188. /package/dist/{chunk-XMLCXRTS.js.map → chunk-SQ7WINEU.js.map} +0 -0
  189. /package/dist/{chunk-Q72ZBA4X.js.map → chunk-U2KFFRRX.js.map} +0 -0
  190. /package/dist/{chunk-VU4ZCRZS.js.map → chunk-UZHD4DBD.js.map} +0 -0
  191. /package/dist/{chunk-QN3V3ES7.js.map → chunk-WMTYOK4E.js.map} +0 -0
  192. /package/dist/{chunk-FHHTDPMW.js.map → chunk-XU6N3OIS.js.map} +0 -0
  193. /package/dist/{chunk-XZ57QYVI.js.map → chunk-ZIZFTSQY.js.map} +0 -0
  194. /package/dist/{loader-TK7YS2I5.js.map → loader-JMOO2A7C.js.map} +0 -0
  195. /package/dist/{source-loader-UQXJVVSO.js.map → source-loader-H3QLG5AE.js.map} +0 -0
  196. /package/dist/{source-manager-HS2ZT4XE.js.map → source-manager-ZDBUHGIR.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/lib/__tests__/mock-data/mock-categories.ts"],"sourcesContent":["// Shared category definitions with domain overrides for test files.\n// Spreads from TEST_CATEGORIES in test-fixtures.ts.\n\nimport { TEST_CATEGORIES } from \"../test-fixtures.js\";\nimport type { Category, CategoryDefinition } from \"../../../types\";\n\n// ---------------------------------------------------------------------------\n// Categories from step-build.test.tsx (with domain overrides)\n// ---------------------------------------------------------------------------\n\nexport const WEB_FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.framework,\n required: true,\n};\n\nexport const WEB_STYLING_CATEGORY = {\n ...TEST_CATEGORIES.styling,\n required: true,\n order: 1,\n};\n\nexport const WEB_STATE_CATEGORY = {\n ...TEST_CATEGORIES.clientState,\n order: 2,\n};\n\nexport const API_FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.api,\n displayName: \"API Framework\",\n // Boundary cast: narrows string to Domain union\n domain: \"api\" as const,\n required: true,\n order: 0,\n};\n\nexport const API_DATABASE_CATEGORY = {\n ...TEST_CATEGORIES.database,\n // Boundary cast: narrows string to Domain union\n domain: \"api\" as const,\n order: 1,\n};\n\n// ---------------------------------------------------------------------------\n// Categories from matrix-loader.test.ts (basic, no domain override)\n// ---------------------------------------------------------------------------\n\nexport const CLI_FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.cliFramework,\n domain: \"cli\" as const,\n exclusive: false,\n};\n\nexport const FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.framework,\n description: \"Web frameworks\",\n order: 1,\n};\n\n// ---------------------------------------------------------------------------\n// Categories from skill-resolution.integration.test.ts (multi-source)\n// ---------------------------------------------------------------------------\n\nexport const MULTI_SOURCE_CATEGORIES = {\n \"web-framework\": { ...TEST_CATEGORIES.framework, exclusive: true, required: true },\n \"web-client-state\": {\n ...TEST_CATEGORIES.clientState,\n displayName: \"State\",\n description: \"State category\",\n order: 1,\n },\n \"web-styling\": { ...TEST_CATEGORIES.styling, order: 2 },\n \"web-testing\": { ...TEST_CATEGORIES.testing, exclusive: false, order: 3 },\n \"api-api\": { ...TEST_CATEGORIES.api, exclusive: true, order: 4 },\n \"api-database\": { ...TEST_CATEGORIES.database, order: 5 },\n \"shared-security\": { ...TEST_CATEGORIES.security, order: 6 },\n \"web-animation\": { ...TEST_CATEGORIES.animation, order: 7 },\n \"shared-methodology\": { ...TEST_CATEGORIES.methodology, order: 8 },\n \"web-accessibility\": { ...TEST_CATEGORIES.accessibility, order: 9 },\n \"api-observability\": { ...TEST_CATEGORIES.observability, order: 10 },\n} as Partial<Record<Category, CategoryDefinition>> as Record<Category, CategoryDefinition>;\n"],"mappings":";;;;;;;;;AAAA;AAUO,IAAM,yBAAyB;AAAA,EACpC,GAAG,gBAAgB;AAAA,EACnB,UAAU;AACZ;AAEO,IAAM,uBAAuB;AAAA,EAClC,GAAG,gBAAgB;AAAA,EACnB,UAAU;AAAA,EACV,OAAO;AACT;AAEO,IAAM,qBAAqB;AAAA,EAChC,GAAG,gBAAgB;AAAA,EACnB,OAAO;AACT;AAEO,IAAM,yBAAyB;AAAA,EACpC,GAAG,gBAAgB;AAAA,EACnB,aAAa;AAAA;AAAA,EAEb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AACT;AAEO,IAAM,wBAAwB;AAAA,EACnC,GAAG,gBAAgB;AAAA;AAAA,EAEnB,QAAQ;AAAA,EACR,OAAO;AACT;AAMO,IAAM,yBAAyB;AAAA,EACpC,GAAG,gBAAgB;AAAA,EACnB,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,IAAM,qBAAqB;AAAA,EAChC,GAAG,gBAAgB;AAAA,EACnB,aAAa;AAAA,EACb,OAAO;AACT;AAMO,IAAM,0BAA0B;AAAA,EACrC,iBAAiB,EAAE,GAAG,gBAAgB,WAAW,WAAW,MAAM,UAAU,KAAK;AAAA,EACjF,oBAAoB;AAAA,IAClB,GAAG,gBAAgB;AAAA,IACnB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,eAAe,EAAE,GAAG,gBAAgB,SAAS,OAAO,EAAE;AAAA,EACtD,eAAe,EAAE,GAAG,gBAAgB,SAAS,WAAW,OAAO,OAAO,EAAE;AAAA,EACxE,WAAW,EAAE,GAAG,gBAAgB,KAAK,WAAW,MAAM,OAAO,EAAE;AAAA,EAC/D,gBAAgB,EAAE,GAAG,gBAAgB,UAAU,OAAO,EAAE;AAAA,EACxD,mBAAmB,EAAE,GAAG,gBAAgB,UAAU,OAAO,EAAE;AAAA,EAC3D,iBAAiB,EAAE,GAAG,gBAAgB,WAAW,OAAO,EAAE;AAAA,EAC1D,sBAAsB,EAAE,GAAG,gBAAgB,aAAa,OAAO,EAAE;AAAA,EACjE,qBAAqB,EAAE,GAAG,gBAAgB,eAAe,OAAO,EAAE;AAAA,EAClE,qBAAqB,EAAE,GAAG,gBAAgB,eAAe,OAAO,GAAG;AACrE;","names":[]}
1
+ {"version":3,"sources":["../src/cli/lib/__tests__/mock-data/mock-categories.ts"],"sourcesContent":["// Shared category definitions with domain overrides for test files.\n// Spreads from TEST_CATEGORIES in test-fixtures.ts.\n\nimport { TEST_CATEGORIES } from \"../test-fixtures.js\";\nimport type { Category, CategoryDefinition } from \"../../../types\";\n\n// ---------------------------------------------------------------------------\n// Categories from step-build.test.tsx (with domain overrides)\n// ---------------------------------------------------------------------------\n\nexport const WEB_FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.framework,\n required: true,\n};\n\nexport const WEB_STYLING_CATEGORY = {\n ...TEST_CATEGORIES.styling,\n required: true,\n order: 1,\n};\n\nexport const WEB_STATE_CATEGORY = {\n ...TEST_CATEGORIES.clientState,\n order: 2,\n};\n\nexport const API_FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.api,\n displayName: \"API Framework\",\n // Boundary cast: narrows string to Domain union\n domain: \"api\" as const,\n required: true,\n order: 0,\n};\n\nexport const API_DATABASE_CATEGORY = {\n ...TEST_CATEGORIES.database,\n // Boundary cast: narrows string to Domain union\n domain: \"api\" as const,\n order: 1,\n};\n\n// ---------------------------------------------------------------------------\n// Categories from matrix-loader.test.ts (basic, no domain override)\n// ---------------------------------------------------------------------------\n\nexport const CLI_FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.cliFramework,\n domain: \"cli\" as const,\n exclusive: false,\n};\n\nexport const FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.framework,\n description: \"Web frameworks\",\n order: 1,\n};\n\n// ---------------------------------------------------------------------------\n// Categories from skill-resolution.integration.test.ts (multi-source)\n// ---------------------------------------------------------------------------\n\nexport const MULTI_SOURCE_CATEGORIES = {\n \"web-framework\": { ...TEST_CATEGORIES.framework, exclusive: true, required: true },\n \"web-client-state\": {\n ...TEST_CATEGORIES.clientState,\n displayName: \"State\",\n description: \"State category\",\n order: 1,\n },\n \"web-styling\": { ...TEST_CATEGORIES.styling, order: 2 },\n \"web-testing\": { ...TEST_CATEGORIES.testing, exclusive: false, order: 3 },\n \"api-api\": { ...TEST_CATEGORIES.api, exclusive: true, order: 4 },\n \"api-database\": { ...TEST_CATEGORIES.database, order: 5 },\n \"shared-security\": { ...TEST_CATEGORIES.security, order: 6 },\n \"web-animation\": { ...TEST_CATEGORIES.animation, order: 7 },\n \"shared-meta\": { ...TEST_CATEGORIES.methodology, order: 8 },\n \"web-accessibility\": { ...TEST_CATEGORIES.accessibility, order: 9 },\n \"api-observability\": { ...TEST_CATEGORIES.observability, order: 10 },\n} as Partial<Record<Category, CategoryDefinition>> as Record<Category, CategoryDefinition>;\n"],"mappings":";;;;;;;;;AAAA;AAUO,IAAM,yBAAyB;AAAA,EACpC,GAAG,gBAAgB;AAAA,EACnB,UAAU;AACZ;AAEO,IAAM,uBAAuB;AAAA,EAClC,GAAG,gBAAgB;AAAA,EACnB,UAAU;AAAA,EACV,OAAO;AACT;AAEO,IAAM,qBAAqB;AAAA,EAChC,GAAG,gBAAgB;AAAA,EACnB,OAAO;AACT;AAEO,IAAM,yBAAyB;AAAA,EACpC,GAAG,gBAAgB;AAAA,EACnB,aAAa;AAAA;AAAA,EAEb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AACT;AAEO,IAAM,wBAAwB;AAAA,EACnC,GAAG,gBAAgB;AAAA;AAAA,EAEnB,QAAQ;AAAA,EACR,OAAO;AACT;AAMO,IAAM,yBAAyB;AAAA,EACpC,GAAG,gBAAgB;AAAA,EACnB,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,IAAM,qBAAqB;AAAA,EAChC,GAAG,gBAAgB;AAAA,EACnB,aAAa;AAAA,EACb,OAAO;AACT;AAMO,IAAM,0BAA0B;AAAA,EACrC,iBAAiB,EAAE,GAAG,gBAAgB,WAAW,WAAW,MAAM,UAAU,KAAK;AAAA,EACjF,oBAAoB;AAAA,IAClB,GAAG,gBAAgB;AAAA,IACnB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,eAAe,EAAE,GAAG,gBAAgB,SAAS,OAAO,EAAE;AAAA,EACtD,eAAe,EAAE,GAAG,gBAAgB,SAAS,WAAW,OAAO,OAAO,EAAE;AAAA,EACxE,WAAW,EAAE,GAAG,gBAAgB,KAAK,WAAW,MAAM,OAAO,EAAE;AAAA,EAC/D,gBAAgB,EAAE,GAAG,gBAAgB,UAAU,OAAO,EAAE;AAAA,EACxD,mBAAmB,EAAE,GAAG,gBAAgB,UAAU,OAAO,EAAE;AAAA,EAC3D,iBAAiB,EAAE,GAAG,gBAAgB,WAAW,OAAO,EAAE;AAAA,EAC1D,eAAe,EAAE,GAAG,gBAAgB,aAAa,OAAO,EAAE;AAAA,EAC1D,qBAAqB,EAAE,GAAG,gBAAgB,eAAe,OAAO,EAAE;AAAA,EAClE,qBAAqB,EAAE,GAAG,gBAAgB,eAAe,OAAO,GAAG;AACrE;","names":[]}
@@ -7,11 +7,11 @@ import {
7
7
  loadConfigTypesDataInBackground,
8
8
  regenerateConfigTypes,
9
9
  resolveAuthor
10
- } from "./chunk-5BGBH3KD.js";
10
+ } from "./chunk-CZLXZ75E.js";
11
11
  import {
12
12
  BaseCommand,
13
13
  EXIT_CODES
14
- } from "./chunk-KDYE3AGL.js";
14
+ } from "./chunk-7LBYURQR.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-6C66NL4X.js";
22
+ } from "./chunk-XYPAOBBV.js";
23
23
  import {
24
24
  CLI_BIN_NAME,
25
25
  DEFAULT_VERSION,
@@ -30,7 +30,7 @@ import {
30
30
  SKILL_CATEGORIES_PATH,
31
31
  SKILL_RULES_PATH,
32
32
  STANDARD_FILES
33
- } from "./chunk-EGMQ3SXN.js";
33
+ } from "./chunk-FMYAYX6W.js";
34
34
  import {
35
35
  init_esm_shims
36
36
  } from "./chunk-DHET7RCE.js";
@@ -337,4 +337,4 @@ export {
337
337
  generateSkillRulesTs,
338
338
  NewSkill
339
339
  };
340
- //# sourceMappingURL=chunk-U5R4M7MA.js.map
340
+ //# sourceMappingURL=chunk-N4KD5PBX.js.map
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDomainDisplayName
4
- } from "./chunk-U6A4YFOF.js";
4
+ } from "./chunk-7JQIMEUX.js";
5
5
  import {
6
6
  ViewTitle
7
7
  } from "./chunk-JNQKCZA3.js";
8
8
  import {
9
9
  KEY_LABEL_ENTER,
10
10
  KEY_LABEL_ESC
11
- } from "./chunk-CBYRFAUN.js";
11
+ } from "./chunk-HK53FRMU.js";
12
12
  import {
13
13
  CLI_COLORS
14
- } from "./chunk-EGMQ3SXN.js";
14
+ } from "./chunk-FMYAYX6W.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "./chunk-DHET7RCE.js";
@@ -123,4 +123,4 @@ var StepConfirm = ({
123
123
  export {
124
124
  StepConfirm
125
125
  };
126
- //# sourceMappingURL=chunk-SPATQKH6.js.map
126
+ //# sourceMappingURL=chunk-PDYKGJGR.js.map
@@ -1,53 +1,52 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  WizardLayout
4
- } from "./chunk-ZZJ6H6VB.js";
4
+ } from "./chunk-5DDHCCEB.js";
5
5
  import {
6
6
  StepSettings
7
- } from "./chunk-FYYIRFYT.js";
7
+ } from "./chunk-A6XMJT2Q.js";
8
8
  import {
9
9
  StepSources
10
- } from "./chunk-DFKNFZI2.js";
10
+ } from "./chunk-KMLJCO5H.js";
11
11
  import {
12
12
  StepStack
13
- } from "./chunk-GMUOEQOY.js";
13
+ } from "./chunk-KB57OPUL.js";
14
14
  import {
15
15
  StepAgents
16
- } from "./chunk-FHHTDPMW.js";
16
+ } from "./chunk-XU6N3OIS.js";
17
17
  import {
18
18
  StepBuild
19
- } from "./chunk-WXC2Y5TF.js";
19
+ } from "./chunk-G3YSDQJ2.js";
20
20
  import {
21
21
  StepConfirm
22
- } from "./chunk-SPATQKH6.js";
22
+ } from "./chunk-PDYKGJGR.js";
23
23
  import {
24
24
  getStackName
25
- } from "./chunk-U6A4YFOF.js";
25
+ } from "./chunk-7JQIMEUX.js";
26
26
  import {
27
27
  useWizardStore
28
- } from "./chunk-BVSWWBPE.js";
28
+ } from "./chunk-CY23HPDE.js";
29
29
  import {
30
30
  cliTheme
31
- } from "./chunk-T5DJCIUP.js";
31
+ } from "./chunk-3REKTRAN.js";
32
32
  import {
33
33
  HOTKEY_ACCEPT_DEFAULTS,
34
34
  HOTKEY_HELP,
35
35
  HOTKEY_SCOPE,
36
36
  HOTKEY_SETTINGS,
37
37
  isHotkey
38
- } from "./chunk-CBYRFAUN.js";
38
+ } from "./chunk-HK53FRMU.js";
39
39
  import {
40
- getDependentSkills,
41
40
  resolveAlias,
42
41
  validateSelection
43
- } from "./chunk-5BGBH3KD.js";
42
+ } from "./chunk-CZLXZ75E.js";
44
43
  import {
45
44
  findStack,
46
45
  matrix
47
- } from "./chunk-HKIQA4F6.js";
46
+ } from "./chunk-FSK4TQX7.js";
48
47
  import {
49
48
  CLI_COLORS
50
- } from "./chunk-EGMQ3SXN.js";
49
+ } from "./chunk-FMYAYX6W.js";
51
50
  import {
52
51
  init_esm_shims
53
52
  } from "./chunk-DHET7RCE.js";
@@ -115,36 +114,9 @@ function useBuildStepProps({
115
114
  const domain = store.getCurrentDomain() || "web";
116
115
  const cat = matrix.categories[categoryId];
117
116
  const exclusive = cat?.exclusive ?? true;
118
- const currentCategorySelections = store.domainSelections[domain]?.[categoryId] || [];
119
- const isDeselecting = currentCategorySelections.includes(techId);
120
- if (isDeselecting) {
121
- const dependents = getDependentSkills(techId, allSelections);
122
- if (dependents.length > 0) {
123
- return;
124
- }
125
- }
126
117
  store.toggleTechnology(domain, categoryId, techId, exclusive);
127
- if (!isDeselecting) {
128
- const skill = matrix.skills[techId];
129
- if (skill) {
130
- for (const req of skill.requires) {
131
- if (req.needsAny) continue;
132
- for (const reqId of req.skillIds) {
133
- const reqSkill = matrix.skills[reqId];
134
- if (!reqSkill) continue;
135
- if (!allSelections.includes(reqId)) {
136
- const reqCategoryId = reqSkill.category;
137
- const reqCat = matrix.categories[reqCategoryId];
138
- if (!reqCat) continue;
139
- const reqDomain = reqCat.domain;
140
- store.toggleTechnology(reqDomain, reqCategoryId, reqId, reqCat.exclusive ?? true);
141
- }
142
- }
143
- }
144
- }
145
- }
146
118
  },
147
- [store, allSelections]
119
+ [store]
148
120
  );
149
121
  const onContinue = useCallback(() => {
150
122
  if (!store.nextDomain()) {
@@ -162,9 +134,11 @@ function useBuildStepProps({
162
134
  selections: store.domainSelections[activeDomain] || {},
163
135
  allSelections,
164
136
  showLabels: store.showLabels,
137
+ filterIncompatible: store.filterIncompatible,
165
138
  installedSkillIds,
166
139
  onToggle,
167
140
  onToggleLabels: store.toggleShowLabels,
141
+ onToggleFilterIncompatible: store.toggleFilterIncompatible,
168
142
  onContinue,
169
143
  onBack
170
144
  };
@@ -358,4 +332,4 @@ var Wizard = ({
358
332
  export {
359
333
  Wizard
360
334
  };
361
- //# sourceMappingURL=chunk-7QAVO7VN.js.map
335
+ //# sourceMappingURL=chunk-R6QNVMN5.js.map
@@ -1 +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 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 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 version={version} logo={logo} startupMessages={startupMessages}>\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 { Category, Domain, SkillId } from \"../../types/index.js\";\nimport type { WizardState } from \"../../stores/wizard-store.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { getDependentSkills } from \"../../lib/matrix/matrix-resolver.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 const exclusive = cat?.exclusive ?? true;\n\n // Check if this is a deselection\n const currentCategorySelections = store.domainSelections[domain]?.[categoryId] || [];\n const isDeselecting = currentCategorySelections.includes(techId);\n\n if (isDeselecting) {\n // Block deselection if other selected skills depend on this one\n const dependents = getDependentSkills(techId, allSelections);\n if (dependents.length > 0) {\n return; // Blocked — skill is required by dependents\n }\n }\n\n // Perform the toggle\n store.toggleTechnology(domain, categoryId, techId, exclusive);\n\n // After selecting: auto-select required skills that aren't yet selected\n if (!isDeselecting) {\n const skill = matrix.skills[techId];\n if (skill) {\n for (const req of skill.requires) {\n if (req.needsAny) continue; // Can't auto-select when there's a choice\n for (const reqId of req.skillIds) {\n const reqSkill = matrix.skills[reqId];\n if (!reqSkill) continue;\n // Check if already selected (across all domains)\n if (!allSelections.includes(reqId)) {\n // Boundary cast: CategoryPath includes \"local\" but matrix.categories only has Category keys\n const reqCategoryId = reqSkill.category as Category;\n const reqCat = matrix.categories[reqCategoryId];\n if (!reqCat) continue;\n const reqDomain = reqCat.domain as Domain;\n store.toggleTechnology(reqDomain, reqCategoryId, reqId, reqCat.exclusive ?? true);\n }\n }\n }\n }\n }\n },\n [store, allSelections],\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
+ {"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 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 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 version={version} logo={logo} startupMessages={startupMessages}>\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 const exclusive = cat?.exclusive ?? true;\n store.toggleTechnology(domain, categoryId, techId, exclusive);\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 filterIncompatible: store.filterIncompatible,\n installedSkillIds,\n onToggle,\n onToggleLabels: store.toggleShowLabels,\n onToggleFilterIncompatible: store.toggleFilterIncompatible,\n onContinue,\n onBack,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ useMeasuredHeight
4
+ } from "./chunk-K77I4XGL.js";
5
+ import {
6
+ useRowScroll
7
+ } from "./chunk-SQ7WINEU.js";
8
+ import {
9
+ useWizardStore
10
+ } from "./chunk-CY23HPDE.js";
11
+ import {
12
+ matrix
13
+ } from "./chunk-FSK4TQX7.js";
14
+ import {
15
+ CLI_COLORS,
16
+ DEFAULT_SCRATCH_DOMAINS,
17
+ UI_SYMBOLS
18
+ } from "./chunk-FMYAYX6W.js";
19
+ import {
20
+ init_esm_shims
21
+ } from "./chunk-DHET7RCE.js";
22
+
23
+ // src/cli/components/wizard/stack-selection.tsx
24
+ init_esm_shims();
25
+ import { Box, Text, useInput } from "ink";
26
+ import React, { useMemo, useState } from "react";
27
+ import { jsx, jsxs } from "react/jsx-runtime";
28
+ var REACT_FRAMEWORK_ID = "web-framework-react";
29
+ var SCRATCH_LABEL = "Start from scratch";
30
+ var SCRATCH_DESCRIPTION = "Select domains and skills manually";
31
+ function groupStacks(stacks) {
32
+ const reactItems = [];
33
+ const otherItems = [];
34
+ for (const stack of stacks) {
35
+ const isReact = stack.allSkillIds.some((id) => id.startsWith(REACT_FRAMEWORK_ID));
36
+ const item = { id: stack.id, name: stack.name, description: stack.description };
37
+ if (isReact) {
38
+ reactItems.push(item);
39
+ } else {
40
+ otherItems.push(item);
41
+ }
42
+ }
43
+ const groups = [];
44
+ if (reactItems.length > 0) {
45
+ groups.push({ label: "React", items: reactItems });
46
+ }
47
+ if (otherItems.length > 0) {
48
+ groups.push({ label: "Other Frameworks", items: otherItems });
49
+ }
50
+ return groups;
51
+ }
52
+ function buildFocusableIds(groups) {
53
+ return [...groups.flatMap((g) => g.items.map((i) => i.id)), "scratch"];
54
+ }
55
+ var StackSection = ({ title, items, focusedId }) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
56
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsxs(Text, { dimColor: true, bold: true, children: [
57
+ " ",
58
+ title
59
+ ] }) }),
60
+ items.map((item) => {
61
+ const isFocused = item.id === focusedId;
62
+ const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;
63
+ return /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsxs(Text, { children: [
64
+ /* @__PURE__ */ jsx(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: pointer }),
65
+ /* @__PURE__ */ jsxs(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, bold: isFocused, children: [
66
+ " ",
67
+ item.name
68
+ ] }),
69
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
70
+ " ",
71
+ item.description
72
+ ] })
73
+ ] }) }, item.id);
74
+ })
75
+ ] });
76
+ var StackSelection = ({ onCancel }) => {
77
+ const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } = useWizardStore();
78
+ const stacks = matrix.suggestedStacks;
79
+ const groups = useMemo(() => groupStacks(stacks), [stacks]);
80
+ const focusableIds = useMemo(() => buildFocusableIds(groups), [groups]);
81
+ const [focusedId, setFocusedId] = useState(focusableIds[0] ?? "scratch");
82
+ const { ref: listRef, measuredHeight: listHeight } = useMeasuredHeight();
83
+ const totalRowCount = useMemo(() => {
84
+ const groupRows = groups.reduce(
85
+ (sum, g, i) => sum + 1 + g.items.length + (i > 0 ? 1 : 0),
86
+ 0
87
+ );
88
+ return groupRows + 1 + 1;
89
+ }, [groups]);
90
+ const focusedVisualRow = useMemo(() => {
91
+ let row = 0;
92
+ for (let gi = 0; gi < groups.length; gi++) {
93
+ if (gi > 0) row++;
94
+ row++;
95
+ for (const item of groups[gi].items) {
96
+ if (item.id === focusedId) return row;
97
+ row++;
98
+ }
99
+ }
100
+ row++;
101
+ return row;
102
+ }, [groups, focusedId]);
103
+ const { scrollEnabled, scrollTop } = useRowScroll({
104
+ focusedIndex: focusedVisualRow,
105
+ itemCount: totalRowCount,
106
+ availableHeight: listHeight
107
+ });
108
+ useInput((input, key) => {
109
+ if (key.escape) {
110
+ if (onCancel) {
111
+ onCancel();
112
+ }
113
+ return;
114
+ }
115
+ const currentIdx = focusableIds.indexOf(focusedId);
116
+ if (key.upArrow || input === "k") {
117
+ const nextIdx = currentIdx <= 0 ? focusableIds.length - 1 : currentIdx - 1;
118
+ setFocusedId(focusableIds[nextIdx]);
119
+ return;
120
+ }
121
+ if (key.downArrow || input === "j") {
122
+ const nextIdx = currentIdx >= focusableIds.length - 1 ? 0 : currentIdx + 1;
123
+ setFocusedId(focusableIds[nextIdx]);
124
+ return;
125
+ }
126
+ if (key.return) {
127
+ if (focusedId === "scratch") {
128
+ selectStack(null);
129
+ setApproach("scratch");
130
+ for (const domain of DEFAULT_SCRATCH_DOMAINS) {
131
+ toggleDomain(domain);
132
+ }
133
+ return;
134
+ }
135
+ const focusedStack = stacks.find((s) => s.id === focusedId);
136
+ if (focusedStack) {
137
+ selectStack(focusedStack.id);
138
+ setStackAction("customize");
139
+ populateFromSkillIds(focusedStack.allSkillIds);
140
+ setApproach("stack");
141
+ }
142
+ }
143
+ });
144
+ const isScratchFocused = focusedId === "scratch";
145
+ const scratchPointer = isScratchFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;
146
+ return /* @__PURE__ */ jsx(Box, { ref: listRef, flexDirection: "column", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(
147
+ Box,
148
+ {
149
+ flexDirection: "column",
150
+ flexGrow: 1,
151
+ ...scrollEnabled && { overflow: "hidden" },
152
+ children: /* @__PURE__ */ jsxs(
153
+ Box,
154
+ {
155
+ flexDirection: "column",
156
+ marginTop: scrollTop > 0 ? -scrollTop : 0,
157
+ ...scrollEnabled && { flexShrink: 0 },
158
+ children: [
159
+ groups.map((group, gi) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
160
+ gi > 0 && /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { children: " " }) }),
161
+ /* @__PURE__ */ jsx(StackSection, { title: group.label, items: group.items, focusedId })
162
+ ] }, group.label)),
163
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { children: " " }) }, "scratch-spacer"),
164
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsxs(Text, { children: [
165
+ /* @__PURE__ */ jsx(Text, { color: isScratchFocused ? CLI_COLORS.PRIMARY : void 0, children: scratchPointer }),
166
+ /* @__PURE__ */ jsxs(
167
+ Text,
168
+ {
169
+ color: isScratchFocused ? CLI_COLORS.PRIMARY : void 0,
170
+ bold: isScratchFocused,
171
+ children: [
172
+ " ",
173
+ SCRATCH_LABEL
174
+ ]
175
+ }
176
+ ),
177
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
178
+ " ",
179
+ SCRATCH_DESCRIPTION
180
+ ] })
181
+ ] }) }, "scratch")
182
+ ]
183
+ }
184
+ )
185
+ }
186
+ ) });
187
+ };
188
+
189
+ export {
190
+ StackSelection
191
+ };
192
+ //# sourceMappingURL=chunk-SGKNE6EJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/stack-selection.tsx"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React, { useMemo, useState } from \"react\";\nimport { CLI_COLORS, DEFAULT_SCRATCH_DOMAINS, UI_SYMBOLS } from \"../../consts.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { useRowScroll } from \"../hooks/use-row-scroll.js\";\n\nimport type { SkillId } from \"../../types/index.js\";\n\ntype StackItem = { id: string; name: string; description: string };\ntype StackGroup = { label: string; items: StackItem[] };\ntype FocusId = string | \"scratch\";\n\nconst REACT_FRAMEWORK_ID = \"web-framework-react\";\nconst SCRATCH_LABEL = \"Start from scratch\";\nconst SCRATCH_DESCRIPTION = \"Select domains and skills manually\";\n\nfunction groupStacks(\n stacks: { id: string; name: string; description: string; allSkillIds: SkillId[] }[],\n): StackGroup[] {\n const reactItems: StackItem[] = [];\n const otherItems: StackItem[] = [];\n\n for (const stack of stacks) {\n const isReact = stack.allSkillIds.some((id) => id.startsWith(REACT_FRAMEWORK_ID));\n const item: StackItem = { id: stack.id, name: stack.name, description: stack.description };\n if (isReact) {\n reactItems.push(item);\n } else {\n otherItems.push(item);\n }\n }\n\n const groups: StackGroup[] = [];\n if (reactItems.length > 0) {\n groups.push({ label: \"React\", items: reactItems });\n }\n if (otherItems.length > 0) {\n groups.push({ label: \"Other Frameworks\", items: otherItems });\n }\n return groups;\n}\n\nfunction buildFocusableIds(groups: StackGroup[]): FocusId[] {\n return [...groups.flatMap((g) => g.items.map((i) => i.id)), \"scratch\"];\n}\n\n/** Renders a section header + stack items. Focus state is managed by the parent. */\nconst StackSection: React.FC<{\n title: string;\n items: StackItem[];\n focusedId: FocusId;\n}> = ({ title, items, focusedId }) => (\n <Box flexDirection=\"column\">\n <Box flexShrink={0}>\n <Text dimColor bold>\n {\" \"}\n {title}\n </Text>\n </Box>\n {items.map((item) => {\n const isFocused = item.id === focusedId;\n const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n return (\n <Box key={item.id} flexShrink={0}>\n <Text>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined}>{pointer}</Text>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined} bold={isFocused}>\n {\" \"}\n {item.name}\n </Text>\n <Text dimColor>\n {\" \"}\n {item.description}\n </Text>\n </Text>\n </Box>\n );\n })}\n </Box>\n);\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> = ({ onCancel }) => {\n const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } =\n useWizardStore();\n\n const stacks = matrix.suggestedStacks;\n const groups = useMemo(() => groupStacks(stacks), [stacks]);\n const focusableIds = useMemo(() => buildFocusableIds(groups), [groups]);\n\n const [focusedId, setFocusedId] = useState<FocusId>(focusableIds[0] ?? \"scratch\");\n const { ref: listRef, measuredHeight: listHeight } = useMeasuredHeight();\n\n // Compute visual row counts for scroll: header + items per group, spacers between groups, spacer + scratch row\n const totalRowCount = useMemo(() => {\n const groupRows = groups.reduce(\n (sum, g, i) =>\n sum + 1 /* header */ + g.items.length + (i > 0 ? 1 : 0) /* spacer between groups */,\n 0,\n );\n return groupRows + 1 /* spacer before scratch */ + 1 /* scratch row */;\n }, [groups]);\n\n // Map focusedId to a visual row index for scrolling\n const focusedVisualRow = useMemo(() => {\n let row = 0;\n for (let gi = 0; gi < groups.length; gi++) {\n if (gi > 0) row++; // spacer between groups\n row++; // header\n for (const item of groups[gi].items) {\n if (item.id === focusedId) return row;\n row++;\n }\n }\n row++; // spacer before scratch\n return row; // scratch row\n }, [groups, focusedId]);\n\n const { scrollEnabled, scrollTop } = useRowScroll({\n focusedIndex: focusedVisualRow,\n itemCount: totalRowCount,\n availableHeight: listHeight,\n });\n\n useInput((input, key) => {\n if (key.escape) {\n if (onCancel) {\n onCancel();\n }\n return;\n }\n\n const currentIdx = focusableIds.indexOf(focusedId);\n\n if (key.upArrow || input === \"k\") {\n const nextIdx = currentIdx <= 0 ? focusableIds.length - 1 : currentIdx - 1;\n setFocusedId(focusableIds[nextIdx]!);\n return;\n }\n if (key.downArrow || input === \"j\") {\n const nextIdx = currentIdx >= focusableIds.length - 1 ? 0 : currentIdx + 1;\n setFocusedId(focusableIds[nextIdx]!);\n return;\n }\n\n if (key.return) {\n if (focusedId === \"scratch\") {\n selectStack(null);\n setApproach(\"scratch\");\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n toggleDomain(domain);\n }\n return;\n }\n const focusedStack = stacks.find((s) => s.id === focusedId);\n if (focusedStack) {\n selectStack(focusedStack.id);\n setStackAction(\"customize\");\n populateFromSkillIds(focusedStack.allSkillIds);\n setApproach(\"stack\");\n }\n }\n });\n\n const isScratchFocused = focusedId === \"scratch\";\n const scratchPointer = isScratchFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n\n return (\n <Box ref={listRef} flexDirection=\"column\" flexGrow={1} flexBasis={0}>\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n {...(scrollEnabled && { overflow: \"hidden\" as const })}\n >\n <Box\n flexDirection=\"column\"\n marginTop={scrollTop > 0 ? -scrollTop : 0}\n {...(scrollEnabled && { flexShrink: 0 })}\n >\n {groups.map((group, gi) => (\n <React.Fragment key={group.label}>\n {gi > 0 && (\n <Box flexShrink={0}>\n <Text> </Text>\n </Box>\n )}\n <StackSection title={group.label} items={group.items} focusedId={focusedId} />\n </React.Fragment>\n ))}\n\n <Box key=\"scratch-spacer\" flexShrink={0}>\n <Text> </Text>\n </Box>\n <Box key=\"scratch\" flexShrink={0}>\n <Text>\n <Text color={isScratchFocused ? CLI_COLORS.PRIMARY : undefined}>\n {scratchPointer}\n </Text>\n <Text\n color={isScratchFocused ? CLI_COLORS.PRIMARY : undefined}\n bold={isScratchFocused}\n >\n {\" \"}\n {SCRATCH_LABEL}\n </Text>\n <Text dimColor>\n {\" \"}\n {SCRATCH_DESCRIPTION}\n </Text>\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  computeRowScrollTop
4
- } from "./chunk-AUNBGZS4.js";
4
+ } from "./chunk-FFMWFEUH.js";
5
5
  import {
6
6
  SCROLL_VIEWPORT
7
- } from "./chunk-EGMQ3SXN.js";
7
+ } from "./chunk-FMYAYX6W.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-DHET7RCE.js";
@@ -28,4 +28,4 @@ function useRowScroll({
28
28
  export {
29
29
  useRowScroll
30
30
  };
31
- //# sourceMappingURL=chunk-XMLCXRTS.js.map
31
+ //# sourceMappingURL=chunk-SQ7WINEU.js.map
@@ -8,10 +8,10 @@ import {
8
8
  verbose,
9
9
  warn,
10
10
  writeFile
11
- } from "./chunk-6C66NL4X.js";
11
+ } from "./chunk-XYPAOBBV.js";
12
12
  import {
13
13
  MAX_PLUGIN_FILE_SIZE
14
- } from "./chunk-EGMQ3SXN.js";
14
+ } from "./chunk-FMYAYX6W.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "./chunk-DHET7RCE.js";
@@ -129,4 +129,4 @@ export {
129
129
  writeMarketplace,
130
130
  getMarketplaceStats
131
131
  };
132
- //# sourceMappingURL=chunk-Q72ZBA4X.js.map
132
+ //# sourceMappingURL=chunk-U2KFFRRX.js.map
@@ -17,15 +17,15 @@ import {
17
17
  resolveAgents,
18
18
  writeContentHash,
19
19
  writePluginManifest
20
- } from "./chunk-5BGBH3KD.js";
20
+ } from "./chunk-CZLXZ75E.js";
21
21
  import {
22
22
  loadAllAgents,
23
23
  loadProjectAgents
24
- } from "./chunk-XHTN56UT.js";
24
+ } from "./chunk-IFCASC6R.js";
25
25
  import {
26
26
  typedEntries,
27
27
  typedKeys
28
- } from "./chunk-HKIQA4F6.js";
28
+ } from "./chunk-FSK4TQX7.js";
29
29
  import {
30
30
  agentFrontmatterValidationSchema,
31
31
  copy,
@@ -39,12 +39,12 @@ import {
39
39
  verbose,
40
40
  warn,
41
41
  writeFile
42
- } from "./chunk-6C66NL4X.js";
42
+ } from "./chunk-XYPAOBBV.js";
43
43
  import {
44
44
  CLAUDE_DIR,
45
45
  DIRS,
46
46
  PROJECT_ROOT
47
- } from "./chunk-EGMQ3SXN.js";
47
+ } from "./chunk-FMYAYX6W.js";
48
48
  import {
49
49
  init_esm_shims
50
50
  } from "./chunk-DHET7RCE.js";
@@ -325,4 +325,4 @@ export {
325
325
  compileAllAgentPlugins,
326
326
  printAgentCompilationSummary
327
327
  };
328
- //# sourceMappingURL=chunk-VU4ZCRZS.js.map
328
+ //# sourceMappingURL=chunk-UZHD4DBD.js.map