agents-inc 0.150.0 → 0.152.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 (255) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/{chunk-FWT3CBLL.js → chunk-5GUOIJSG.js} +3 -7
  3. package/dist/{chunk-FWT3CBLL.js.map → chunk-5GUOIJSG.js.map} +1 -1
  4. package/dist/{chunk-MC5DUZ3V.js → chunk-5UWKOOIS.js} +6 -26
  5. package/dist/chunk-5UWKOOIS.js.map +1 -0
  6. package/dist/{chunk-O5ASLZ2K.js → chunk-76ADG7LQ.js} +1 -5
  7. package/dist/{chunk-O5ASLZ2K.js.map → chunk-76ADG7LQ.js.map} +1 -1
  8. package/dist/{chunk-7URSGJLE.js → chunk-BNSRA6HL.js} +13 -18
  9. package/dist/{chunk-7URSGJLE.js.map → chunk-BNSRA6HL.js.map} +1 -1
  10. package/dist/{chunk-FYPUUYSG.js → chunk-DTSG5XZB.js} +3 -7
  11. package/dist/{chunk-FYPUUYSG.js.map → chunk-DTSG5XZB.js.map} +1 -1
  12. package/dist/{chunk-YKKIJHZB.js → chunk-E5X6RJ4E.js} +5 -15
  13. package/dist/chunk-E5X6RJ4E.js.map +1 -0
  14. package/dist/{chunk-KH7MOIM5.js → chunk-EEPELKOM.js} +3665 -3737
  15. package/dist/chunk-EEPELKOM.js.map +1 -0
  16. package/dist/{chunk-NIKUMXE7.js → chunk-F7T5AFFN.js} +1 -5
  17. package/dist/{chunk-NIKUMXE7.js.map → chunk-F7T5AFFN.js.map} +1 -1
  18. package/dist/{chunk-4GL2F5AB.js → chunk-FVDKAVOL.js} +57 -48
  19. package/dist/chunk-FVDKAVOL.js.map +1 -0
  20. package/dist/{chunk-UZRISDBZ.js → chunk-GRVKW3CC.js} +2 -6
  21. package/dist/{chunk-UZRISDBZ.js.map → chunk-GRVKW3CC.js.map} +1 -1
  22. package/dist/{chunk-CDMHSHBN.js → chunk-IHUY4M22.js} +4 -8
  23. package/dist/{chunk-CDMHSHBN.js.map → chunk-IHUY4M22.js.map} +1 -1
  24. package/dist/{chunk-OZZGXBCN.js → chunk-IUQBOCSU.js} +1 -5
  25. package/dist/{chunk-OZZGXBCN.js.map → chunk-IUQBOCSU.js.map} +1 -1
  26. package/dist/{chunk-LYYXX2W5.js → chunk-J27W6TXS.js} +4 -6
  27. package/dist/{chunk-LYYXX2W5.js.map → chunk-J27W6TXS.js.map} +1 -1
  28. package/dist/chunk-JFLVEFFP.js +16 -0
  29. package/dist/chunk-JFLVEFFP.js.map +1 -0
  30. package/dist/{chunk-4LPJZNT7.js → chunk-KFB5CRXZ.js} +7 -12
  31. package/dist/{chunk-4LPJZNT7.js.map → chunk-KFB5CRXZ.js.map} +1 -1
  32. package/dist/{chunk-SYUOXSPU.js → chunk-KR65TPKC.js} +168 -14
  33. package/dist/chunk-KR65TPKC.js.map +1 -0
  34. package/dist/{chunk-KOPEM3Q7.js → chunk-KXYVJGJP.js} +2 -6
  35. package/dist/{chunk-KOPEM3Q7.js.map → chunk-KXYVJGJP.js.map} +1 -1
  36. package/dist/{chunk-ZHTXPFDK.js → chunk-L7SZXUBJ.js} +9 -14
  37. package/dist/{chunk-ZHTXPFDK.js.map → chunk-L7SZXUBJ.js.map} +1 -1
  38. package/dist/{chunk-LRYNF3J7.js → chunk-LASI35KT.js} +4 -9
  39. package/dist/{chunk-LRYNF3J7.js.map → chunk-LASI35KT.js.map} +1 -1
  40. package/dist/{chunk-VG2TVBFN.js → chunk-LDP5ASDM.js} +2 -6
  41. package/dist/{chunk-VG2TVBFN.js.map → chunk-LDP5ASDM.js.map} +1 -1
  42. package/dist/{chunk-GRPSDKIS.js → chunk-LZ52XEPR.js} +4 -8
  43. package/dist/{chunk-GRPSDKIS.js.map → chunk-LZ52XEPR.js.map} +1 -1
  44. package/dist/{chunk-CFQT72MJ.js → chunk-M7HO7NBK.js} +4 -8
  45. package/dist/{chunk-CFQT72MJ.js.map → chunk-M7HO7NBK.js.map} +1 -1
  46. package/dist/{chunk-XA57SX4T.js → chunk-MJ2KHG24.js} +4 -8
  47. package/dist/{chunk-XA57SX4T.js.map → chunk-MJ2KHG24.js.map} +1 -1
  48. package/dist/{chunk-DAG2ULNF.js → chunk-MM7CTTAV.js} +2 -6
  49. package/dist/chunk-MM7CTTAV.js.map +1 -0
  50. package/dist/{chunk-F3756A5B.js → chunk-MQ7FLIYS.js} +2 -6
  51. package/dist/{chunk-F3756A5B.js.map → chunk-MQ7FLIYS.js.map} +1 -1
  52. package/dist/{chunk-NUIZ6ZUO.js → chunk-MVR3SYMN.js} +6 -8
  53. package/dist/chunk-MVR3SYMN.js.map +1 -0
  54. package/dist/{chunk-ZKJAJWK6.js → chunk-MWG4VU64.js} +12 -17
  55. package/dist/{chunk-ZKJAJWK6.js.map → chunk-MWG4VU64.js.map} +1 -1
  56. package/dist/{chunk-ES3NJZON.js → chunk-NR3OZGL4.js} +1 -5
  57. package/dist/{chunk-ES3NJZON.js.map → chunk-NR3OZGL4.js.map} +1 -1
  58. package/dist/{chunk-GYG5SE2D.js → chunk-ODNDXQH2.js} +2 -6
  59. package/dist/{chunk-GYG5SE2D.js.map → chunk-ODNDXQH2.js.map} +1 -1
  60. package/dist/{chunk-2RSNKBXC.js → chunk-P44SXVH3.js} +6 -10
  61. package/dist/{chunk-2RSNKBXC.js.map → chunk-P44SXVH3.js.map} +1 -1
  62. package/dist/{chunk-3LIU2ZEF.js → chunk-PMM2MYMA.js} +3 -16
  63. package/dist/{chunk-3LIU2ZEF.js.map → chunk-PMM2MYMA.js.map} +1 -1
  64. package/dist/{chunk-6I6RZHYP.js → chunk-PZIZNMHK.js} +24 -36
  65. package/dist/chunk-PZIZNMHK.js.map +1 -0
  66. package/dist/{chunk-C55DN7GE.js → chunk-Q2KG7UV3.js} +3 -5
  67. package/dist/chunk-Q2KG7UV3.js.map +1 -0
  68. package/dist/{chunk-QQLRX4KI.js → chunk-Q45ZU6HD.js} +2 -6
  69. package/dist/{chunk-QQLRX4KI.js.map → chunk-Q45ZU6HD.js.map} +1 -1
  70. package/dist/{chunk-HIPGKIT3.js → chunk-QRDTLVXG.js} +9 -14
  71. package/dist/{chunk-HIPGKIT3.js.map → chunk-QRDTLVXG.js.map} +1 -1
  72. package/dist/{chunk-VIFZ6NFH.js → chunk-QZZJFYUQ.js} +3 -7
  73. package/dist/{chunk-VIFZ6NFH.js.map → chunk-QZZJFYUQ.js.map} +1 -1
  74. package/dist/{chunk-E4FT2KFV.js → chunk-R5NOI2LP.js} +13 -17
  75. package/dist/{chunk-E4FT2KFV.js.map → chunk-R5NOI2LP.js.map} +1 -1
  76. package/dist/{chunk-DUVWGO6E.js → chunk-RNJWAKMO.js} +3 -7
  77. package/dist/{chunk-DUVWGO6E.js.map → chunk-RNJWAKMO.js.map} +1 -1
  78. package/dist/{chunk-N4IZ6GBO.js → chunk-SBHBBZKF.js} +7 -23
  79. package/dist/chunk-SBHBBZKF.js.map +1 -0
  80. package/dist/{chunk-EN2GCPW7.js → chunk-SKQWRUPX.js} +10 -14
  81. package/dist/{chunk-EN2GCPW7.js.map → chunk-SKQWRUPX.js.map} +1 -1
  82. package/dist/{chunk-DDG4F3FE.js → chunk-STMHDOZD.js} +4 -21
  83. package/dist/chunk-STMHDOZD.js.map +1 -0
  84. package/dist/{chunk-5K5RBRTD.js → chunk-SX5H6TSC.js} +7 -11
  85. package/dist/chunk-SX5H6TSC.js.map +1 -0
  86. package/dist/{chunk-RBHYLCUB.js → chunk-TJJPWUMA.js} +2 -6
  87. package/dist/{chunk-RBHYLCUB.js.map → chunk-TJJPWUMA.js.map} +1 -1
  88. package/dist/{chunk-IOJR5TOY.js → chunk-TSIU7DME.js} +1 -5
  89. package/dist/{chunk-IOJR5TOY.js.map → chunk-TSIU7DME.js.map} +1 -1
  90. package/dist/{chunk-RP7R73JO.js → chunk-TUPYW2IQ.js} +3 -7
  91. package/dist/{chunk-RP7R73JO.js.map → chunk-TUPYW2IQ.js.map} +1 -1
  92. package/dist/{chunk-YU2VGX5R.js → chunk-UBEDZ4FD.js} +1 -8
  93. package/dist/{chunk-YU2VGX5R.js.map → chunk-UBEDZ4FD.js.map} +1 -1
  94. package/dist/{chunk-VEP23B5W.js → chunk-VASLW636.js} +1 -5
  95. package/dist/{chunk-VEP23B5W.js.map → chunk-VASLW636.js.map} +1 -1
  96. package/dist/{chunk-PG4G4IIK.js → chunk-VY6MNOXL.js} +2 -6
  97. package/dist/{chunk-PG4G4IIK.js.map → chunk-VY6MNOXL.js.map} +1 -1
  98. package/dist/{chunk-IHO75PMZ.js → chunk-WBCPLH66.js} +15 -13
  99. package/dist/chunk-WBCPLH66.js.map +1 -0
  100. package/dist/{chunk-DJAZE4PD.js → chunk-WKTHWQKM.js} +297 -302
  101. package/dist/chunk-WKTHWQKM.js.map +1 -0
  102. package/dist/{chunk-RJN7W2C7.js → chunk-XHUODHZ4.js} +19 -25
  103. package/dist/{chunk-RJN7W2C7.js.map → chunk-XHUODHZ4.js.map} +1 -1
  104. package/dist/{chunk-KIR7VYQD.js → chunk-XVAQG2CV.js} +1 -5
  105. package/dist/{chunk-KIR7VYQD.js.map → chunk-XVAQG2CV.js.map} +1 -1
  106. package/dist/{chunk-P3PN5SVI.js → chunk-ZL7PFNHN.js} +2 -6
  107. package/dist/{chunk-P3PN5SVI.js.map → chunk-ZL7PFNHN.js.map} +1 -1
  108. package/dist/{chunk-ZDLTLNU2.js → chunk-ZPPHXXAP.js} +9 -15
  109. package/dist/{chunk-ZDLTLNU2.js.map → chunk-ZPPHXXAP.js.map} +1 -1
  110. package/dist/commands/build/marketplace.js +10 -15
  111. package/dist/commands/build/marketplace.js.map +1 -1
  112. package/dist/commands/build/plugins.js +9 -14
  113. package/dist/commands/build/plugins.js.map +1 -1
  114. package/dist/commands/compile.js +14 -19
  115. package/dist/commands/compile.js.map +1 -1
  116. package/dist/commands/doctor.js +13 -18
  117. package/dist/commands/doctor.js.map +1 -1
  118. package/dist/commands/edit.js +51 -55
  119. package/dist/commands/edit.js.map +1 -1
  120. package/dist/commands/eject.js +13 -18
  121. package/dist/commands/eject.js.map +1 -1
  122. package/dist/commands/import/skill.js +9 -14
  123. package/dist/commands/import/skill.js.map +1 -1
  124. package/dist/commands/init.js +50 -51
  125. package/dist/commands/list.js +14 -16
  126. package/dist/commands/list.js.map +1 -1
  127. package/dist/commands/new/agent.js +12 -16
  128. package/dist/commands/new/agent.js.map +1 -1
  129. package/dist/commands/new/marketplace.js +15 -20
  130. package/dist/commands/new/marketplace.js.map +1 -1
  131. package/dist/commands/new/skill.js +11 -13
  132. package/dist/commands/search.js +14 -19
  133. package/dist/commands/search.js.map +1 -1
  134. package/dist/commands/uninstall.js +17 -21
  135. package/dist/commands/uninstall.js.map +1 -1
  136. package/dist/commands/update.js +17 -21
  137. package/dist/commands/update.js.map +1 -1
  138. package/dist/commands/validate.js +10 -16
  139. package/dist/commands/validate.js.map +1 -1
  140. package/dist/components/common/confirm.js +1 -2
  141. package/dist/components/common/prompt-confirm.js +2 -2
  142. package/dist/components/common/select-list.js +3 -4
  143. package/dist/components/common/spinner.js +1 -2
  144. package/dist/components/wizard/category-grid.js +8 -9
  145. package/dist/components/wizard/checkbox-grid.js +6 -7
  146. package/dist/components/wizard/domain-selection.js +14 -15
  147. package/dist/components/wizard/run-wizard-session.js +40 -40
  148. package/dist/components/wizard/scroll-affordance.js +2 -3
  149. package/dist/components/wizard/search-modal.js +6 -7
  150. package/dist/components/wizard/selection-card.js +2 -3
  151. package/dist/components/wizard/skill-agent-summary.js +8 -9
  152. package/dist/components/wizard/source-grid.js +13 -14
  153. package/dist/components/wizard/stack-selection.js +12 -13
  154. package/dist/components/wizard/step-agents.js +14 -15
  155. package/dist/components/wizard/step-build.js +14 -15
  156. package/dist/components/wizard/step-confirm.js +13 -14
  157. package/dist/components/wizard/step-settings.js +11 -12
  158. package/dist/components/wizard/step-sources.js +20 -21
  159. package/dist/components/wizard/step-stack.js +13 -14
  160. package/dist/components/wizard/summary-panel.js +12 -13
  161. package/dist/components/wizard/toast.js +2 -3
  162. package/dist/components/wizard/wizard-layout.js +18 -19
  163. package/dist/components/wizard/wizard-tabs.js +8 -9
  164. package/dist/components/wizard/wizard.js +38 -39
  165. package/dist/config-exports.js +1 -7
  166. package/dist/config-exports.js.map +1 -1
  167. package/dist/copy-local-skills-6EMVN7RB.js +14 -0
  168. package/dist/hooks/init.js +50 -54
  169. package/dist/hooks/init.js.map +1 -1
  170. package/dist/index.js +0 -4
  171. package/dist/index.js.map +1 -1
  172. package/dist/load-agent-defs-BWOUVEAR.js +15 -0
  173. package/dist/{loader-E2ERJYVA.js → loader-5JP4S7CJ.js} +4 -5
  174. package/dist/recompile-project-agents-6DL45TDI.js +19 -0
  175. package/dist/{source-loader-VVHMQEX5.js → source-loader-MZYCPL2S.js} +7 -8
  176. package/dist/stores/wizard-store.js +7 -8
  177. package/package.json +22 -21
  178. package/dist/chunk-4GL2F5AB.js.map +0 -1
  179. package/dist/chunk-5K5RBRTD.js.map +0 -1
  180. package/dist/chunk-6I6RZHYP.js.map +0 -1
  181. package/dist/chunk-C55DN7GE.js.map +0 -1
  182. package/dist/chunk-DAG2ULNF.js.map +0 -1
  183. package/dist/chunk-DDG4F3FE.js.map +0 -1
  184. package/dist/chunk-DIBCRIMR.js +0 -36
  185. package/dist/chunk-DIBCRIMR.js.map +0 -1
  186. package/dist/chunk-DJAZE4PD.js.map +0 -1
  187. package/dist/chunk-EKWAUOQB.js +0 -96
  188. package/dist/chunk-EKWAUOQB.js.map +0 -1
  189. package/dist/chunk-I3XKEGHM.js +0 -16383
  190. package/dist/chunk-I3XKEGHM.js.map +0 -1
  191. package/dist/chunk-IHO75PMZ.js.map +0 -1
  192. package/dist/chunk-K3OU6TGX.js +0 -77
  193. package/dist/chunk-K3OU6TGX.js.map +0 -1
  194. package/dist/chunk-KH7MOIM5.js.map +0 -1
  195. package/dist/chunk-KSZ6PCY4.js +0 -43
  196. package/dist/chunk-KSZ6PCY4.js.map +0 -1
  197. package/dist/chunk-MC5DUZ3V.js.map +0 -1
  198. package/dist/chunk-N4IZ6GBO.js.map +0 -1
  199. package/dist/chunk-NUIZ6ZUO.js.map +0 -1
  200. package/dist/chunk-OA5SUEQD.js +0 -181
  201. package/dist/chunk-OA5SUEQD.js.map +0 -1
  202. package/dist/chunk-P56WJ5FA.js +0 -50
  203. package/dist/chunk-P56WJ5FA.js.map +0 -1
  204. package/dist/chunk-SYUOXSPU.js.map +0 -1
  205. package/dist/chunk-THKIOI32.js +0 -939
  206. package/dist/chunk-THKIOI32.js.map +0 -1
  207. package/dist/chunk-V7QOSGQA.js +0 -298
  208. package/dist/chunk-V7QOSGQA.js.map +0 -1
  209. package/dist/chunk-YKKIJHZB.js.map +0 -1
  210. package/dist/components/common/confirm.test.js +0 -203
  211. package/dist/components/common/confirm.test.js.map +0 -1
  212. package/dist/components/wizard/category-grid.test.js +0 -1253
  213. package/dist/components/wizard/category-grid.test.js.map +0 -1
  214. package/dist/components/wizard/checkbox-grid.test.js +0 -264
  215. package/dist/components/wizard/checkbox-grid.test.js.map +0 -1
  216. package/dist/components/wizard/search-modal.test.js +0 -212
  217. package/dist/components/wizard/search-modal.test.js.map +0 -1
  218. package/dist/components/wizard/source-grid.test.js +0 -1094
  219. package/dist/components/wizard/source-grid.test.js.map +0 -1
  220. package/dist/components/wizard/step-agents.test.js +0 -204
  221. package/dist/components/wizard/step-agents.test.js.map +0 -1
  222. package/dist/components/wizard/step-build.test.js +0 -552
  223. package/dist/components/wizard/step-build.test.js.map +0 -1
  224. package/dist/components/wizard/step-confirm.test.js +0 -744
  225. package/dist/components/wizard/step-confirm.test.js.map +0 -1
  226. package/dist/components/wizard/step-settings.test.js +0 -244
  227. package/dist/components/wizard/step-settings.test.js.map +0 -1
  228. package/dist/components/wizard/step-sources.test.js +0 -155
  229. package/dist/components/wizard/step-sources.test.js.map +0 -1
  230. package/dist/components/wizard/step-stack.test.js +0 -262
  231. package/dist/components/wizard/step-stack.test.js.map +0 -1
  232. package/dist/components/wizard/summary-panel.test.js +0 -317
  233. package/dist/components/wizard/summary-panel.test.js.map +0 -1
  234. package/dist/components/wizard/wizard-layout.test.js +0 -200
  235. package/dist/components/wizard/wizard-layout.test.js.map +0 -1
  236. package/dist/components/wizard/wizard-tabs.test.js +0 -290
  237. package/dist/components/wizard/wizard-tabs.test.js.map +0 -1
  238. package/dist/copy-local-skills-CA7P73RZ.js +0 -15
  239. package/dist/dist-VNJNNJK7.js +0 -550
  240. package/dist/dist-VNJNNJK7.js.map +0 -1
  241. package/dist/load-agent-defs-6MAY5ABI.js +0 -16
  242. package/dist/magic-string.es-5TV73NJD.js +0 -1316
  243. package/dist/magic-string.es-5TV73NJD.js.map +0 -1
  244. package/dist/recompile-project-agents-VYQJ6UZB.js +0 -20
  245. package/dist/source-manager-TPDXV5FO.js +0 -18
  246. package/dist/source-manager-TPDXV5FO.js.map +0 -1
  247. package/dist/stores/d227-same-scope-tombstone-duplicate.test.js +0 -118
  248. package/dist/stores/d227-same-scope-tombstone-duplicate.test.js.map +0 -1
  249. package/dist/stores/wizard-store.test.js +0 -3053
  250. package/dist/stores/wizard-store.test.js.map +0 -1
  251. /package/dist/{copy-local-skills-CA7P73RZ.js.map → copy-local-skills-6EMVN7RB.js.map} +0 -0
  252. /package/dist/{load-agent-defs-6MAY5ABI.js.map → load-agent-defs-BWOUVEAR.js.map} +0 -0
  253. /package/dist/{loader-E2ERJYVA.js.map → loader-5JP4S7CJ.js.map} +0 -0
  254. /package/dist/{recompile-project-agents-VYQJ6UZB.js.map → recompile-project-agents-6DL45TDI.js.map} +0 -0
  255. /package/dist/{source-loader-VVHMQEX5.js.map → source-loader-MZYCPL2S.js.map} +0 -0
@@ -1,10 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- init_esm_shims
4
- } from "./chunk-P56WJ5FA.js";
5
2
 
6
3
  // src/cli/components/hooks/use-modal-state.ts
7
- init_esm_shims();
8
4
  import { useState, useCallback } from "react";
9
5
  function useModalState() {
10
6
  const [context, setContext] = useState(null);
@@ -21,4 +17,4 @@ function useModalState() {
21
17
  export {
22
18
  useModalState
23
19
  };
24
- //# sourceMappingURL=chunk-NIKUMXE7.js.map
20
+ //# sourceMappingURL=chunk-F7T5AFFN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/components/hooks/use-modal-state.ts"],"sourcesContent":["import { useState, useCallback } from \"react\";\n\ntype UseModalStateResult<T> = {\n isOpen: boolean;\n context: T | null;\n open: (ctx: T) => void;\n close: () => void;\n};\n\n/**\n * Manages modal open/close lifecycle with optional typed context.\n * `open(ctx)` stores context and sets isOpen; `close()` resets both.\n */\nexport function useModalState<T = boolean>(): UseModalStateResult<T> {\n const [context, setContext] = useState<T | null>(null);\n\n const isOpen = context !== null;\n\n const open = useCallback((ctx: T) => {\n setContext(ctx);\n }, []);\n\n const close = useCallback(() => {\n setContext(null);\n }, []);\n\n return { isOpen, context, open, close };\n}\n"],"mappings":";;;;;;AAAA;AAAA,SAAS,UAAU,mBAAmB;AAa/B,SAAS,gBAAqD;AACnE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAmB,IAAI;AAErD,QAAM,SAAS,YAAY;AAE3B,QAAM,OAAO,YAAY,CAAC,QAAW;AACnC,eAAW,GAAG;AAAA,EAChB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,MAAM;AAC9B,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,QAAQ,SAAS,MAAM,MAAM;AACxC;","names":[]}
1
+ {"version":3,"sources":["../src/cli/components/hooks/use-modal-state.ts"],"sourcesContent":["import { useState, useCallback } from \"react\";\n\ntype UseModalStateResult<T> = {\n isOpen: boolean;\n context: T | null;\n open: (ctx: T) => void;\n close: () => void;\n};\n\n/**\n * Manages modal open/close lifecycle with optional typed context.\n * `open(ctx)` stores context and sets isOpen; `close()` resets both.\n */\nexport function useModalState<T = boolean>(): UseModalStateResult<T> {\n const [context, setContext] = useState<T | null>(null);\n\n const isOpen = context !== null;\n\n const open = useCallback((ctx: T) => {\n setContext(ctx);\n }, []);\n\n const close = useCallback(() => {\n setContext(null);\n }, []);\n\n return { isOpen, context, open, close };\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,mBAAmB;AAa/B,SAAS,gBAAqD;AACnE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAmB,IAAI;AAErD,QAAM,SAAS,YAAY;AAE3B,QAAM,OAAO,YAAY,CAAC,QAAW;AACnC,eAAW,GAAG;AAAA,EAChB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,MAAM;AAC9B,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,QAAQ,SAAS,MAAM,MAAM;AACxC;","names":[]}
@@ -1,33 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  useMeasuredHeight
4
- } from "./chunk-IOJR5TOY.js";
5
- import {
6
- useKeyboardNavigation
7
- } from "./chunk-KIR7VYQD.js";
4
+ } from "./chunk-TSIU7DME.js";
8
5
  import {
9
6
  useRowScroll
10
- } from "./chunk-FYPUUYSG.js";
7
+ } from "./chunk-DTSG5XZB.js";
8
+ import {
9
+ useKeyboardNavigation
10
+ } from "./chunk-XVAQG2CV.js";
11
11
  import {
12
12
  useWizardStore
13
- } from "./chunk-MC5DUZ3V.js";
13
+ } from "./chunk-5UWKOOIS.js";
14
14
  import {
15
15
  matrix
16
- } from "./chunk-DJAZE4PD.js";
16
+ } from "./chunk-WKTHWQKM.js";
17
17
  import {
18
18
  typedKeys
19
- } from "./chunk-VEP23B5W.js";
19
+ } from "./chunk-VASLW636.js";
20
20
  import {
21
21
  CLI_COLORS,
22
22
  DEFAULT_SCRATCH_DOMAINS,
23
23
  UI_SYMBOLS
24
- } from "./chunk-O5ASLZ2K.js";
25
- import {
26
- init_esm_shims
27
- } from "./chunk-P56WJ5FA.js";
24
+ } from "./chunk-76ADG7LQ.js";
28
25
 
29
26
  // src/cli/components/wizard/stack-selection.tsx
30
- init_esm_shims();
31
27
  import { groupBy } from "remeda";
32
28
  import { Box, Text } from "ink";
33
29
  import { useMemo } from "react";
@@ -132,45 +128,58 @@ var StackSelection = ({ onCancel }) => {
132
128
  itemCount: rows.length,
133
129
  availableHeight: listHeight
134
130
  });
131
+ function restoreGlobalAgentPreselections() {
132
+ const globalAgentPre = useWizardStore.getState().globalAgentPreselections;
133
+ if (globalAgentPre) {
134
+ useWizardStore.setState({
135
+ selectedAgents: globalAgentPre.agents,
136
+ agentConfigs: globalAgentPre.configs
137
+ });
138
+ }
139
+ }
140
+ function preselectGlobalSkills() {
141
+ const globalPreselections = useWizardStore.getState().globalPreselections;
142
+ if (globalPreselections?.length) {
143
+ populateFromSkillIds(
144
+ globalPreselections.map((s) => s.id),
145
+ globalPreselections
146
+ );
147
+ }
148
+ }
149
+ function addScratchDomains() {
150
+ for (const domain of DEFAULT_SCRATCH_DOMAINS) {
151
+ if (!useWizardStore.getState().selectedDomains.includes(domain)) {
152
+ toggleDomain(domain);
153
+ }
154
+ }
155
+ }
156
+ function startFromScratch() {
157
+ selectStack(null);
158
+ setApproach("scratch");
159
+ restoreGlobalAgentPreselections();
160
+ preselectGlobalSkills();
161
+ addScratchDomains();
162
+ setStep("domains");
163
+ }
164
+ function applyStack(stack) {
165
+ selectStack(stack.id);
166
+ setStackAction("customize");
167
+ const stackAgents = typedKeys(stack.skills);
168
+ preselectAgentsFromStack(stackAgents);
169
+ const globalPreselections = useWizardStore.getState().globalPreselections;
170
+ const globalIds = globalPreselections?.map((s) => s.id) ?? [];
171
+ const mergedIds = [.../* @__PURE__ */ new Set([...stack.allSkillIds, ...globalIds])];
172
+ populateFromSkillIds(mergedIds, globalPreselections ?? void 0);
173
+ setApproach("stack");
174
+ setStep("domains");
175
+ }
135
176
  function handleSelect(selectedId) {
136
177
  if (selectedId === "scratch") {
137
- selectStack(null);
138
- setApproach("scratch");
139
- const globalAgentPre = useWizardStore.getState().globalAgentPreselections;
140
- if (globalAgentPre) {
141
- useWizardStore.setState({
142
- selectedAgents: globalAgentPre.agents,
143
- agentConfigs: globalAgentPre.configs
144
- });
145
- }
146
- const globalPreselections = useWizardStore.getState().globalPreselections;
147
- if (globalPreselections?.length) {
148
- populateFromSkillIds(
149
- globalPreselections.map((s) => s.id),
150
- globalPreselections
151
- );
152
- }
153
- for (const domain of DEFAULT_SCRATCH_DOMAINS) {
154
- if (!useWizardStore.getState().selectedDomains.includes(domain)) {
155
- toggleDomain(domain);
156
- }
157
- }
158
- setStep("domains");
178
+ startFromScratch();
159
179
  return;
160
180
  }
161
181
  const focusedStack = stacks.find((s) => s.id === selectedId);
162
- if (focusedStack) {
163
- selectStack(focusedStack.id);
164
- setStackAction("customize");
165
- const stackAgents = typedKeys(focusedStack.skills);
166
- preselectAgentsFromStack(stackAgents);
167
- const globalPreselections = useWizardStore.getState().globalPreselections;
168
- const globalIds = globalPreselections?.map((s) => s.id) ?? [];
169
- const mergedIds = [.../* @__PURE__ */ new Set([...focusedStack.allSkillIds, ...globalIds])];
170
- populateFromSkillIds(mergedIds, globalPreselections ?? void 0);
171
- setApproach("stack");
172
- setStep("domains");
173
- }
182
+ if (focusedStack) applyStack(focusedStack);
174
183
  }
175
184
  return /* @__PURE__ */ jsx(Box, { ref: listRef, flexDirection: "column", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(
176
185
  Box,
@@ -219,4 +228,4 @@ var StackSelection = ({ onCancel }) => {
219
228
  export {
220
229
  StackSelection
221
230
  };
222
- //# sourceMappingURL=chunk-4GL2F5AB.js.map
231
+ //# sourceMappingURL=chunk-FVDKAVOL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/stack-selection.tsx"],"sourcesContent":["import { groupBy } from \"remeda\";\nimport { useKeyboardNavigation } from \"../hooks/use-keyboard-navigation.js\";\nimport { Box, Text } from \"ink\";\nimport React, { useMemo } 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 { AgentName, ResolvedStack } from \"../../types/index.js\";\nimport { typedKeys } from \"../../utils/typed-object.js\";\n\ntype StackItem = Pick<ResolvedStack, \"id\" | \"name\" | \"description\">;\ntype StackGroup = { label: string; items: StackItem[] };\n/** A focusable row id: a stack id, or the \"scratch\" sentinel for the \"Start from scratch\" row. */\ntype FocusId = string;\n\nconst OTHER_FRAMEWORKS_LABEL = \"Other Frameworks\";\nconst GROUP_ORDER: string[] = [\"React\", \"CLI\"];\nconst SCRATCH_LABEL = \"Start from scratch\";\nconst SCRATCH_DESCRIPTION = \"Select domains and skills manually\";\n\ntype GroupableStack = Pick<ResolvedStack, \"id\" | \"name\" | \"description\" | \"group\">;\n\nfunction toStackItem(stack: GroupableStack): StackItem {\n return { id: stack.id, name: stack.name, description: stack.description };\n}\n\n/** GROUP_ORDER labels first (in order), then unknown labels alphabetically. */\nfunction compareGroupLabels(a: string, b: string): number {\n const ai = GROUP_ORDER.indexOf(a);\n const bi = GROUP_ORDER.indexOf(b);\n if (ai !== -1 && bi !== -1) return ai - bi;\n if (ai !== -1) return -1;\n if (bi !== -1) return 1;\n return a.localeCompare(b);\n}\n\nfunction groupStacks(stacks: GroupableStack[]): StackGroup[] {\n // `|| undefined` keeps an empty-string group ungrouped; groupBy drops undefined keys.\n const byLabel = groupBy(stacks, (stack) => stack.group || undefined);\n const ungrouped = stacks.filter((stack) => !stack.group).map(toStackItem);\n\n // No explicit groups — flat list, no headers\n const sortedLabels = Object.keys(byLabel).sort(compareGroupLabels);\n if (sortedLabels.length === 0) {\n return [{ label: \"\", items: ungrouped }];\n }\n\n const groups = sortedLabels.map((label) => ({\n label,\n items: byLabel[label].map(toStackItem),\n }));\n return ungrouped.length > 0\n ? [...groups, { label: OTHER_FRAMEWORKS_LABEL, items: ungrouped }]\n : groups;\n}\n\nfunction buildFocusableIds(groups: StackGroup[]): FocusId[] {\n return [...groups.flatMap((g) => g.items.map((i) => i.id)), \"scratch\"];\n}\n\ntype StackListRow =\n | { type: \"header\"; label: string }\n | { type: \"spacer\" }\n | { type: \"stack\"; item: StackItem }\n | { type: \"scratch\" };\n\n/** One row per rendered line — headers, spacers, stack items, then the scratch row. */\nfunction buildStackRows(groups: StackGroup[]): StackListRow[] {\n const groupRows = groups.flatMap((group, groupIndex): StackListRow[] => [\n ...(groupIndex > 0 ? [{ type: \"spacer\" as const }] : []),\n ...(group.label ? [{ type: \"header\" as const, label: group.label }] : []),\n ...group.items.map((item): StackListRow => ({ type: \"stack\", item })),\n ]);\n return [...groupRows, { type: \"spacer\" }, { type: \"scratch\" }];\n}\n\nfunction isRowFocused(row: StackListRow, focusedId: FocusId): boolean {\n if (row.type === \"stack\") return row.item.id === focusedId;\n return row.type === \"scratch\" && focusedId === \"scratch\";\n}\n\nconst StackRow: React.FC<{ item: StackItem; isFocused: boolean }> = ({ item, isFocused }) => {\n const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n return (\n <Box 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\nconst ScratchRow: React.FC<{ isFocused: boolean }> = ({ isFocused }) => {\n const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n return (\n <Box 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 {SCRATCH_LABEL}\n </Text>\n <Text dimColor>\n {\" \"}\n {SCRATCH_DESCRIPTION}\n </Text>\n </Text>\n </Box>\n );\n};\n\nexport type StackSelectionProps = {\n onCancel?: () => void;\n};\n\nexport const StackSelection: React.FC<StackSelectionProps> = ({ onCancel }) => {\n const {\n selectStack,\n setApproach,\n setStackAction,\n populateFromSkillIds,\n preselectAgentsFromStack,\n toggleDomain,\n setStep,\n } = useWizardStore();\n\n const stacks = matrix.suggestedStacks;\n const groups = useMemo(() => groupStacks(stacks), [stacks]);\n const rows = useMemo(() => buildStackRows(groups), [groups]);\n const focusableIds = useMemo(() => buildFocusableIds(groups), [groups]);\n\n const { focusedIndex } = useKeyboardNavigation(focusableIds.length, {\n onEscape: onCancel,\n onEnter: (index) => handleSelect(focusableIds[index] ?? \"scratch\"),\n });\n const focusedId: FocusId = focusableIds[focusedIndex] ?? \"scratch\";\n const { ref: listRef, measuredHeight: listHeight } = useMeasuredHeight();\n\n const focusedVisualRow = useMemo(\n () => rows.findIndex((row) => isRowFocused(row, focusedId)),\n [rows, focusedId],\n );\n\n const { scrollEnabled, scrollTop } = useRowScroll({\n focusedIndex: focusedVisualRow,\n itemCount: rows.length,\n availableHeight: listHeight,\n });\n\n // Restore global agent preselections (selectStack wipes selectedAgents/agentConfigs).\n function restoreGlobalAgentPreselections(): void {\n const globalAgentPre = useWizardStore.getState().globalAgentPreselections;\n if (globalAgentPre) {\n useWizardStore.setState({\n selectedAgents: globalAgentPre.agents,\n agentConfigs: globalAgentPre.configs,\n });\n }\n }\n\n // Pre-select global skills (sets selectedDomains to the global skills' domains).\n function preselectGlobalSkills(): void {\n const globalPreselections = useWizardStore.getState().globalPreselections;\n if (globalPreselections?.length) {\n populateFromSkillIds(\n globalPreselections.map((s) => s.id),\n globalPreselections,\n );\n }\n }\n\n // Additive — adds any scratch domain not already selected.\n function addScratchDomains(): void {\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n if (!useWizardStore.getState().selectedDomains.includes(domain)) {\n toggleDomain(domain);\n }\n }\n }\n\n function startFromScratch(): void {\n selectStack(null);\n setApproach(\"scratch\");\n restoreGlobalAgentPreselections();\n preselectGlobalSkills();\n addScratchDomains();\n setStep(\"domains\");\n }\n\n // The stack's own skills merged with the global preselections, and its agent\n // keys merged with the global agent preselections.\n function applyStack(stack: ResolvedStack): void {\n selectStack(stack.id);\n setStackAction(\"customize\");\n\n const stackAgents = typedKeys<AgentName>(stack.skills);\n preselectAgentsFromStack(stackAgents);\n\n const globalPreselections = useWizardStore.getState().globalPreselections;\n const globalIds = globalPreselections?.map((s) => s.id) ?? [];\n const mergedIds = [...new Set([...stack.allSkillIds, ...globalIds])];\n populateFromSkillIds(mergedIds, globalPreselections ?? undefined);\n\n setApproach(\"stack\");\n setStep(\"domains\");\n }\n\n function handleSelect(selectedId: FocusId): void {\n if (selectedId === \"scratch\") {\n startFromScratch();\n return;\n }\n\n const focusedStack = stacks.find((s) => s.id === selectedId);\n if (focusedStack) applyStack(focusedStack);\n }\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 {rows.map((row, index) => {\n switch (row.type) {\n case \"spacer\":\n return (\n <Box key={`spacer-${index}`} flexShrink={0}>\n <Text> </Text>\n </Box>\n );\n case \"header\":\n return (\n <Box key={`header-${row.label}`} flexShrink={0}>\n <Text dimColor bold>\n {\" \"}\n {row.label}\n </Text>\n </Box>\n );\n case \"stack\":\n return (\n <StackRow\n key={row.item.id}\n item={row.item}\n isFocused={row.item.id === focusedId}\n />\n );\n case \"scratch\":\n return <ScratchRow key=\"scratch\" isFocused={focusedId === \"scratch\"} />;\n default: {\n const _exhaustive: never = row;\n return _exhaustive;\n }\n }\n })}\n </Box>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,13 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SummaryPanel
4
- } from "./chunk-ZHTXPFDK.js";
5
- import {
6
- init_esm_shims
7
- } from "./chunk-P56WJ5FA.js";
4
+ } from "./chunk-L7SZXUBJ.js";
8
5
 
9
6
  // src/cli/components/wizard/step-confirm.tsx
10
- init_esm_shims();
11
7
  import { useInput } from "ink";
12
8
  import { jsx } from "react/jsx-runtime";
13
9
  var StepConfirm = ({ onComplete, onBack }) => {
@@ -25,4 +21,4 @@ var StepConfirm = ({ onComplete, onBack }) => {
25
21
  export {
26
22
  StepConfirm
27
23
  };
28
- //# sourceMappingURL=chunk-UZRISDBZ.js.map
24
+ //# sourceMappingURL=chunk-GRVKW3CC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/components/wizard/step-confirm.tsx"],"sourcesContent":["import { useInput } from \"ink\";\nimport React from \"react\";\nimport { SummaryPanel } from \"./summary-panel.js\";\n\ntype StepConfirmProps = {\n onComplete: () => void;\n onBack: () => void;\n};\n\n/**\n * Final step: the shared `SummaryPanel`, which owns the scroll and the `↑`/`↓`\n * keys. This claims only the two keys that leave the step, so both `useInput`\n * hooks stay on disjoint keys.\n */\nexport const StepConfirm: React.FC<StepConfirmProps> = ({ onComplete, onBack }) => {\n useInput((_input, key) => {\n if (key.return) {\n onComplete();\n }\n if (key.escape) {\n onBack();\n }\n });\n\n return <SummaryPanel />;\n};\n"],"mappings":";;;;;;;;;AAAA;AAAA,SAAS,gBAAgB;AAwBhB;AAVF,IAAM,cAA0C,CAAC,EAAE,YAAY,OAAO,MAAM;AACjF,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,iBAAW;AAAA,IACb;AACA,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO,oBAAC,gBAAa;AACvB;","names":[]}
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-confirm.tsx"],"sourcesContent":["import { useInput } from \"ink\";\nimport React from \"react\";\nimport { SummaryPanel } from \"./summary-panel.js\";\n\ntype StepConfirmProps = {\n onComplete: () => void;\n onBack: () => void;\n};\n\n/**\n * Final step: the shared `SummaryPanel`, which owns the scroll and the `↑`/`↓`\n * keys. This claims only the two keys that leave the step, so both `useInput`\n * hooks stay on disjoint keys.\n */\nexport const StepConfirm: React.FC<StepConfirmProps> = ({ onComplete, onBack }) => {\n useInput((_input, key) => {\n if (key.return) {\n onComplete();\n }\n if (key.escape) {\n onBack();\n }\n });\n\n return <SummaryPanel />;\n};\n"],"mappings":";;;;;;AAAA,SAAS,gBAAgB;AAwBhB;AAVF,IAAM,cAA0C,CAAC,EAAE,YAAY,OAAO,MAAM;AACjF,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,iBAAW;AAAA,IACb;AACA,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO,oBAAC,gBAAa;AACvB;","names":[]}
@@ -3,20 +3,16 @@ import {
3
3
  copySkillsToLocalFlattened,
4
4
  deleteLocalSkill,
5
5
  resolveInstallPaths
6
- } from "./chunk-KH7MOIM5.js";
6
+ } from "./chunk-EEPELKOM.js";
7
7
  import {
8
8
  ensureDir,
9
9
  verbose
10
- } from "./chunk-3LIU2ZEF.js";
10
+ } from "./chunk-PMM2MYMA.js";
11
11
  import {
12
12
  EJECT_SOURCE
13
- } from "./chunk-O5ASLZ2K.js";
14
- import {
15
- init_esm_shims
16
- } from "./chunk-P56WJ5FA.js";
13
+ } from "./chunk-76ADG7LQ.js";
17
14
 
18
15
  // src/cli/lib/operations/skills/copy-local-skills.ts
19
- init_esm_shims();
20
16
  import os from "os";
21
17
  async function copyScopedLocalSkills(scopeSkills, baseDir, skillsDir, sourceResult, deleteAlternateSource) {
22
18
  if (scopeSkills.length === 0) return [];
@@ -65,4 +61,4 @@ async function copyLocalSkills(skills, projectDir, sourceResult, options = {}) {
65
61
  export {
66
62
  copyLocalSkills
67
63
  };
68
- //# sourceMappingURL=chunk-CDMHSHBN.js.map
64
+ //# sourceMappingURL=chunk-IHUY4M22.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/lib/operations/skills/copy-local-skills.ts"],"sourcesContent":["import os from \"os\";\nimport { resolveInstallPaths } from \"../../installation/index.js\";\nimport {\n copySkillsToLocalFlattened,\n deleteLocalSkill,\n type CopiedSkill,\n} from \"../../skills/index.js\";\nimport { ensureDir } from \"../../../utils/fs.js\";\nimport { verbose } from \"../../../utils/logger.js\";\nimport { EJECT_SOURCE } from \"../../../consts.js\";\nimport type { SkillConfig } from \"../../../types/config.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type SkillCopyResult = {\n projectCopied: CopiedSkill[];\n globalCopied: CopiedSkill[];\n totalCopied: number;\n};\n\nexport type CopyLocalSkillsOptions = {\n /**\n * Before copying, delete any already-present local skill whose config names an\n * alternate (non-eject) source, so a stale ejected copy is replaced. Used by the\n * eject installer; init/edit leave it off.\n */\n deleteAlternateSourceSkills?: boolean;\n};\n\n/** Copies one scope's local skills into its skills directory, deleting stale eject copies first when requested. */\nasync function copyScopedLocalSkills(\n scopeSkills: SkillConfig[],\n baseDir: string,\n skillsDir: string,\n sourceResult: SourceLoadResult,\n deleteAlternateSource: boolean,\n): Promise<CopiedSkill[]> {\n if (scopeSkills.length === 0) return [];\n\n await ensureDir(skillsDir);\n\n if (deleteAlternateSource) {\n for (const skill of scopeSkills) {\n if (skill.source !== EJECT_SOURCE) {\n verbose(`Using alternate source '${skill.source}' for ${skill.id}`);\n await deleteLocalSkill(baseDir, skill.id);\n }\n }\n }\n\n return copySkillsToLocalFlattened(\n scopeSkills.map((s) => s.id),\n skillsDir,\n sourceResult,\n );\n}\n\n/**\n * Copies local-source skills to their scope-appropriate directories.\n *\n * Splits skills by scope (project vs global), resolves install paths,\n * ensures directories exist, and copies from source. With\n * `deleteAlternateSourceSkills`, an already-present local copy of a skill now\n * sourced from a marketplace is removed before copying (eject installer).\n */\nexport async function copyLocalSkills(\n skills: SkillConfig[],\n projectDir: string,\n sourceResult: SourceLoadResult,\n options: CopyLocalSkillsOptions = {},\n): Promise<SkillCopyResult> {\n const projectLocalSkills = skills.filter((s) => s.scope !== \"global\");\n const globalLocalSkills = skills.filter((s) => s.scope === \"global\");\n\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n const globalPaths = resolveInstallPaths(projectDir, \"global\");\n\n const deleteAlternateSource = options.deleteAlternateSourceSkills ?? false;\n\n const projectCopied = await copyScopedLocalSkills(\n projectLocalSkills,\n projectDir,\n projectPaths.skillsDir,\n sourceResult,\n deleteAlternateSource,\n );\n const globalCopied = await copyScopedLocalSkills(\n globalLocalSkills,\n os.homedir(),\n globalPaths.skillsDir,\n sourceResult,\n deleteAlternateSource,\n );\n\n return {\n projectCopied,\n globalCopied,\n totalCopied: projectCopied.length + globalCopied.length,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA,OAAO,QAAQ;AA6Bf,eAAe,sBACb,aACA,SACA,WACA,cACA,uBACwB;AACxB,MAAI,YAAY,WAAW,EAAG,QAAO,CAAC;AAEtC,QAAM,UAAU,SAAS;AAEzB,MAAI,uBAAuB;AACzB,eAAW,SAAS,aAAa;AAC/B,UAAI,MAAM,WAAW,cAAc;AACjC,gBAAQ,2BAA2B,MAAM,MAAM,SAAS,MAAM,EAAE,EAAE;AAClE,cAAM,iBAAiB,SAAS,MAAM,EAAE;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAUA,eAAsB,gBACpB,QACA,YACA,cACA,UAAkC,CAAC,GACT;AAC1B,QAAM,qBAAqB,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ;AACpE,QAAM,oBAAoB,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ;AAEnE,QAAM,eAAe,oBAAoB,YAAY,SAAS;AAC9D,QAAM,cAAc,oBAAoB,YAAY,QAAQ;AAE5D,QAAM,wBAAwB,QAAQ,+BAA+B;AAErE,QAAM,gBAAgB,MAAM;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA,GAAG,QAAQ;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,cAAc,SAAS,aAAa;AAAA,EACnD;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/cli/lib/operations/skills/copy-local-skills.ts"],"sourcesContent":["import os from \"os\";\nimport { resolveInstallPaths } from \"../../installation/index.js\";\nimport {\n copySkillsToLocalFlattened,\n deleteLocalSkill,\n type CopiedSkill,\n} from \"../../skills/index.js\";\nimport { ensureDir } from \"../../../utils/fs.js\";\nimport { verbose } from \"../../../utils/logger.js\";\nimport { EJECT_SOURCE } from \"../../../consts.js\";\nimport type { SkillConfig } from \"../../../types/config.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type SkillCopyResult = {\n projectCopied: CopiedSkill[];\n globalCopied: CopiedSkill[];\n totalCopied: number;\n};\n\nexport type CopyLocalSkillsOptions = {\n /**\n * Before copying, delete any already-present local skill whose config names an\n * alternate (non-eject) source, so a stale ejected copy is replaced. Used by the\n * eject installer; init/edit leave it off.\n */\n deleteAlternateSourceSkills?: boolean;\n};\n\n/** Copies one scope's local skills into its skills directory, deleting stale eject copies first when requested. */\nasync function copyScopedLocalSkills(\n scopeSkills: SkillConfig[],\n baseDir: string,\n skillsDir: string,\n sourceResult: SourceLoadResult,\n deleteAlternateSource: boolean,\n): Promise<CopiedSkill[]> {\n if (scopeSkills.length === 0) return [];\n\n await ensureDir(skillsDir);\n\n if (deleteAlternateSource) {\n for (const skill of scopeSkills) {\n if (skill.source !== EJECT_SOURCE) {\n verbose(`Using alternate source '${skill.source}' for ${skill.id}`);\n await deleteLocalSkill(baseDir, skill.id);\n }\n }\n }\n\n return copySkillsToLocalFlattened(\n scopeSkills.map((s) => s.id),\n skillsDir,\n sourceResult,\n );\n}\n\n/**\n * Copies local-source skills to their scope-appropriate directories.\n *\n * Splits skills by scope (project vs global), resolves install paths,\n * ensures directories exist, and copies from source. With\n * `deleteAlternateSourceSkills`, an already-present local copy of a skill now\n * sourced from a marketplace is removed before copying (eject installer).\n */\nexport async function copyLocalSkills(\n skills: SkillConfig[],\n projectDir: string,\n sourceResult: SourceLoadResult,\n options: CopyLocalSkillsOptions = {},\n): Promise<SkillCopyResult> {\n const projectLocalSkills = skills.filter((s) => s.scope !== \"global\");\n const globalLocalSkills = skills.filter((s) => s.scope === \"global\");\n\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n const globalPaths = resolveInstallPaths(projectDir, \"global\");\n\n const deleteAlternateSource = options.deleteAlternateSourceSkills ?? false;\n\n const projectCopied = await copyScopedLocalSkills(\n projectLocalSkills,\n projectDir,\n projectPaths.skillsDir,\n sourceResult,\n deleteAlternateSource,\n );\n const globalCopied = await copyScopedLocalSkills(\n globalLocalSkills,\n os.homedir(),\n globalPaths.skillsDir,\n sourceResult,\n deleteAlternateSource,\n );\n\n return {\n projectCopied,\n globalCopied,\n totalCopied: projectCopied.length + globalCopied.length,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AA6Bf,eAAe,sBACb,aACA,SACA,WACA,cACA,uBACwB;AACxB,MAAI,YAAY,WAAW,EAAG,QAAO,CAAC;AAEtC,QAAM,UAAU,SAAS;AAEzB,MAAI,uBAAuB;AACzB,eAAW,SAAS,aAAa;AAC/B,UAAI,MAAM,WAAW,cAAc;AACjC,gBAAQ,2BAA2B,MAAM,MAAM,SAAS,MAAM,EAAE,EAAE;AAClE,cAAM,iBAAiB,SAAS,MAAM,EAAE;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAUA,eAAsB,gBACpB,QACA,YACA,cACA,UAAkC,CAAC,GACT;AAC1B,QAAM,qBAAqB,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ;AACpE,QAAM,oBAAoB,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ;AAEnE,QAAM,eAAe,oBAAoB,YAAY,SAAS;AAC9D,QAAM,cAAc,oBAAoB,YAAY,QAAQ;AAE5D,QAAM,wBAAwB,QAAQ,+BAA+B;AAErE,QAAM,gBAAgB,MAAM;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA,GAAG,QAAQ;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,cAAc,SAAS,aAAa;AAAA,EACnD;AACF;","names":[]}
@@ -1,10 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- init_esm_shims
4
- } from "./chunk-P56WJ5FA.js";
5
2
 
6
3
  // src/cli/components/common/spinner.tsx
7
- init_esm_shims();
8
4
  import { Spinner as InkSpinner } from "@inkjs/ui";
9
5
  import { jsx } from "react/jsx-runtime";
10
6
  var Spinner = ({ label }) => /* @__PURE__ */ jsx(InkSpinner, { label });
@@ -12,4 +8,4 @@ var Spinner = ({ label }) => /* @__PURE__ */ jsx(InkSpinner, { label });
12
8
  export {
13
9
  Spinner
14
10
  };
15
- //# sourceMappingURL=chunk-OZZGXBCN.js.map
11
+ //# sourceMappingURL=chunk-IUQBOCSU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/components/common/spinner.tsx"],"sourcesContent":["import React from \"react\";\nimport { Spinner as InkSpinner } from \"@inkjs/ui\";\n\ntype SpinnerProps = {\n label: string;\n};\n\nexport const Spinner: React.FC<SpinnerProps> = ({ label }) => <InkSpinner label={label} />;\n"],"mappings":";;;;;;AAAA;AACA,SAAS,WAAW,kBAAkB;AAMwB;AAAvD,IAAM,UAAkC,CAAC,EAAE,MAAM,MAAM,oBAAC,cAAW,OAAc;","names":[]}
1
+ {"version":3,"sources":["../src/cli/components/common/spinner.tsx"],"sourcesContent":["import React from \"react\";\nimport { Spinner as InkSpinner } from \"@inkjs/ui\";\n\ntype SpinnerProps = {\n label: string;\n};\n\nexport const Spinner: React.FC<SpinnerProps> = ({ label }) => <InkSpinner label={label} />;\n"],"mappings":";;;AACA,SAAS,WAAW,kBAAkB;AAMwB;AAAvD,IAAM,UAAkC,CAAC,EAAE,MAAM,MAAM,oBAAC,cAAW,OAAc;","names":[]}
@@ -1,10 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- init_esm_shims
4
- } from "./chunk-P56WJ5FA.js";
5
2
 
6
3
  // src/cli/components/hooks/use-focused-list-item.ts
7
- init_esm_shims();
8
4
  import { useState, useCallback, useRef } from "react";
9
5
  function useFocusedListItem(rowCount, getColCount, options = {}) {
10
6
  const {
@@ -76,7 +72,9 @@ function useFocusedListItem(rowCount, getColCount, options = {}) {
76
72
  applyFocus(newRow, finalCol);
77
73
  }
78
74
  },
79
- [getColCount, wrap, findValidCol, adjustCol, findNextRow, applyFocus, skipRow]
75
+ // skipRow is reached only through findNextRow, whose identity already
76
+ // tracks it — naming it again here just churned this callback's identity.
77
+ [getColCount, wrap, findValidCol, adjustCol, findNextRow, applyFocus]
80
78
  );
81
79
  return { focusedRow, focusedCol, setFocused, moveFocus };
82
80
  }
@@ -84,4 +82,4 @@ function useFocusedListItem(rowCount, getColCount, options = {}) {
84
82
  export {
85
83
  useFocusedListItem
86
84
  };
87
- //# sourceMappingURL=chunk-LYYXX2W5.js.map
85
+ //# sourceMappingURL=chunk-J27W6TXS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/components/hooks/use-focused-list-item.ts"],"sourcesContent":["import { useState, useCallback, useRef } from \"react\";\n\nexport type Direction = \"up\" | \"down\" | \"left\" | \"right\";\n\ntype UseFocusedListItemOptions = {\n /** Wrap around when reaching boundaries (default: true) */\n wrap?: boolean;\n /** Custom column finder for skipping disabled items on horizontal nav.\n * Receives the row, current column, and direction (+1 right, -1 left).\n * Should return the next valid column index. */\n findValidCol?: (row: number, currentCol: number, direction: 1 | -1) => number;\n /** Called after vertical navigation to adjust the clamped column\n * (e.g. to skip disabled items). Returns the adjusted column index. */\n adjustCol?: (row: number, clampedCol: number) => number;\n /** Called whenever focused position changes */\n onChange?: (row: number, col: number) => void;\n /** Initial row index (default: 0) */\n initialRow?: number;\n /** Initial col index (default: 0) */\n initialCol?: number;\n /** Optional predicate: when it returns true for a row index, that row is skipped during vertical navigation. */\n skipRow?: (row: number) => boolean;\n};\n\ntype UseFocusedListItemResult = {\n focusedRow: number;\n focusedCol: number;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: Direction) => void;\n};\n\n/**\n * 2D grid focus management: tracks (row, col) position and handles\n * directional movement with wrapping, column clamping,\n * and optional disabled-column skipping.\n */\nexport function useFocusedListItem(\n rowCount: number,\n getColCount: (row: number) => number,\n options: UseFocusedListItemOptions = {},\n): UseFocusedListItemResult {\n const {\n wrap = true,\n findValidCol,\n adjustCol,\n onChange,\n initialRow = 0,\n initialCol = 0,\n skipRow,\n } = options;\n\n const [focusedRow, setFocusedRow] = useState(initialRow);\n const [focusedCol, setFocusedCol] = useState(initialCol);\n\n // Refs for stable callback access without stale closures.\n // Synced during render (not via useEffect) to prevent a timing gap where\n // the ref holds stale values when an input event arrives between render\n // and effect execution (e.g. after a domain-switch remount).\n const focusedRowRef = useRef(focusedRow);\n focusedRowRef.current = focusedRow;\n\n const focusedColRef = useRef(focusedCol);\n focusedColRef.current = focusedCol;\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const applyFocus = useCallback((row: number, col: number) => {\n setFocusedRow(row);\n setFocusedCol(col);\n onChangeRef.current?.(row, col);\n }, []);\n\n const setFocused = applyFocus;\n\n const findNextRow = useCallback(\n (fromRow: number, direction: 1 | -1): number => {\n if (rowCount === 0) return fromRow;\n let next = fromRow;\n for (let i = 0; i < rowCount; i++) {\n if (wrap) {\n next = (next + direction + rowCount) % rowCount;\n } else {\n next = next + direction;\n if (next < 0 || next >= rowCount) return fromRow;\n }\n if (!skipRow || !skipRow(next)) return next;\n }\n return fromRow; // All rows skipped — stay put\n },\n [rowCount, wrap, skipRow],\n );\n\n const moveFocus = useCallback(\n (direction: Direction) => {\n const currentRow = focusedRowRef.current;\n const currentCol = focusedColRef.current;\n\n if (direction === \"left\" || direction === \"right\") {\n const colCount = getColCount(currentRow);\n if (colCount === 0) return;\n\n const step = direction === \"right\" ? 1 : -1;\n\n if (findValidCol) {\n const newCol = findValidCol(currentRow, currentCol, step);\n applyFocus(currentRow, newCol);\n } else if (wrap) {\n const newCol = (currentCol + step + colCount) % colCount;\n applyFocus(currentRow, newCol);\n } else {\n const newCol = Math.max(0, Math.min(colCount - 1, currentCol + step));\n applyFocus(currentRow, newCol);\n }\n } else {\n const step = direction === \"down\" ? 1 : -1;\n const newRow = findNextRow(currentRow, step);\n const newColCount = getColCount(newRow);\n let finalCol = Math.min(currentCol, Math.max(0, newColCount - 1));\n\n if (adjustCol) {\n finalCol = adjustCol(newRow, finalCol);\n }\n\n applyFocus(newRow, finalCol);\n }\n },\n [getColCount, wrap, findValidCol, adjustCol, findNextRow, applyFocus, skipRow],\n );\n\n return { focusedRow, focusedCol, setFocused, moveFocus };\n}\n"],"mappings":";;;;;;AAAA;AAAA,SAAS,UAAU,aAAa,cAAc;AAoCvC,SAAS,mBACd,UACA,aACA,UAAqC,CAAC,GACZ;AAC1B,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU;AAMvD,QAAM,gBAAgB,OAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,QAAM,gBAAgB,OAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,aAAa,YAAY,CAAC,KAAa,QAAgB;AAC3D,kBAAc,GAAG;AACjB,kBAAc,GAAG;AACjB,gBAAY,UAAU,KAAK,GAAG;AAAA,EAChC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa;AAEnB,QAAM,cAAc;AAAA,IAClB,CAAC,SAAiB,cAA8B;AAC9C,UAAI,aAAa,EAAG,QAAO;AAC3B,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,YAAI,MAAM;AACR,kBAAQ,OAAO,YAAY,YAAY;AAAA,QACzC,OAAO;AACL,iBAAO,OAAO;AACd,cAAI,OAAO,KAAK,QAAQ,SAAU,QAAO;AAAA,QAC3C;AACA,YAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAG,QAAO;AAAA,MACzC;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,MAAM,OAAO;AAAA,EAC1B;AAEA,QAAM,YAAY;AAAA,IAChB,CAAC,cAAyB;AACxB,YAAM,aAAa,cAAc;AACjC,YAAM,aAAa,cAAc;AAEjC,UAAI,cAAc,UAAU,cAAc,SAAS;AACjD,cAAM,WAAW,YAAY,UAAU;AACvC,YAAI,aAAa,EAAG;AAEpB,cAAM,OAAO,cAAc,UAAU,IAAI;AAEzC,YAAI,cAAc;AAChB,gBAAM,SAAS,aAAa,YAAY,YAAY,IAAI;AACxD,qBAAW,YAAY,MAAM;AAAA,QAC/B,WAAW,MAAM;AACf,gBAAM,UAAU,aAAa,OAAO,YAAY;AAChD,qBAAW,YAAY,MAAM;AAAA,QAC/B,OAAO;AACL,gBAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,aAAa,IAAI,CAAC;AACpE,qBAAW,YAAY,MAAM;AAAA,QAC/B;AAAA,MACF,OAAO;AACL,cAAM,OAAO,cAAc,SAAS,IAAI;AACxC,cAAM,SAAS,YAAY,YAAY,IAAI;AAC3C,cAAM,cAAc,YAAY,MAAM;AACtC,YAAI,WAAW,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AAEhE,YAAI,WAAW;AACb,qBAAW,UAAU,QAAQ,QAAQ;AAAA,QACvC;AAEA,mBAAW,QAAQ,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,aAAa,MAAM,cAAc,WAAW,aAAa,YAAY,OAAO;AAAA,EAC/E;AAEA,SAAO,EAAE,YAAY,YAAY,YAAY,UAAU;AACzD;","names":[]}
1
+ {"version":3,"sources":["../src/cli/components/hooks/use-focused-list-item.ts"],"sourcesContent":["import { useState, useCallback, useRef } from \"react\";\n\nexport type Direction = \"up\" | \"down\" | \"left\" | \"right\";\n\ntype UseFocusedListItemOptions = {\n /** Wrap around when reaching boundaries (default: true) */\n wrap?: boolean;\n /** Custom column finder for skipping disabled items on horizontal nav.\n * Receives the row, current column, and direction (+1 right, -1 left).\n * Should return the next valid column index. */\n findValidCol?: (row: number, currentCol: number, direction: 1 | -1) => number;\n /** Called after vertical navigation to adjust the clamped column\n * (e.g. to skip disabled items). Returns the adjusted column index. */\n adjustCol?: (row: number, clampedCol: number) => number;\n /** Called whenever focused position changes */\n onChange?: (row: number, col: number) => void;\n /** Initial row index (default: 0) */\n initialRow?: number;\n /** Initial col index (default: 0) */\n initialCol?: number;\n /** Optional predicate: when it returns true for a row index, that row is skipped during vertical navigation. */\n skipRow?: (row: number) => boolean;\n};\n\ntype UseFocusedListItemResult = {\n focusedRow: number;\n focusedCol: number;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: Direction) => void;\n};\n\n/**\n * 2D grid focus management: tracks (row, col) position and handles\n * directional movement with wrapping, column clamping,\n * and optional disabled-column skipping.\n */\nexport function useFocusedListItem(\n rowCount: number,\n getColCount: (row: number) => number,\n options: UseFocusedListItemOptions = {},\n): UseFocusedListItemResult {\n const {\n wrap = true,\n findValidCol,\n adjustCol,\n onChange,\n initialRow = 0,\n initialCol = 0,\n skipRow,\n } = options;\n\n const [focusedRow, setFocusedRow] = useState(initialRow);\n const [focusedCol, setFocusedCol] = useState(initialCol);\n\n // Refs for stable callback access without stale closures.\n // Synced during render (not via useEffect) to prevent a timing gap where\n // the ref holds stale values when an input event arrives between render\n // and effect execution (e.g. after a domain-switch remount).\n const focusedRowRef = useRef(focusedRow);\n focusedRowRef.current = focusedRow;\n\n const focusedColRef = useRef(focusedCol);\n focusedColRef.current = focusedCol;\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const applyFocus = useCallback((row: number, col: number) => {\n setFocusedRow(row);\n setFocusedCol(col);\n onChangeRef.current?.(row, col);\n }, []);\n\n const setFocused = applyFocus;\n\n const findNextRow = useCallback(\n (fromRow: number, direction: 1 | -1): number => {\n if (rowCount === 0) return fromRow;\n let next = fromRow;\n for (let i = 0; i < rowCount; i++) {\n if (wrap) {\n next = (next + direction + rowCount) % rowCount;\n } else {\n next = next + direction;\n if (next < 0 || next >= rowCount) return fromRow;\n }\n if (!skipRow || !skipRow(next)) return next;\n }\n return fromRow; // All rows skipped — stay put\n },\n [rowCount, wrap, skipRow],\n );\n\n const moveFocus = useCallback(\n (direction: Direction) => {\n const currentRow = focusedRowRef.current;\n const currentCol = focusedColRef.current;\n\n if (direction === \"left\" || direction === \"right\") {\n const colCount = getColCount(currentRow);\n if (colCount === 0) return;\n\n const step = direction === \"right\" ? 1 : -1;\n\n if (findValidCol) {\n const newCol = findValidCol(currentRow, currentCol, step);\n applyFocus(currentRow, newCol);\n } else if (wrap) {\n const newCol = (currentCol + step + colCount) % colCount;\n applyFocus(currentRow, newCol);\n } else {\n const newCol = Math.max(0, Math.min(colCount - 1, currentCol + step));\n applyFocus(currentRow, newCol);\n }\n } else {\n const step = direction === \"down\" ? 1 : -1;\n const newRow = findNextRow(currentRow, step);\n const newColCount = getColCount(newRow);\n let finalCol = Math.min(currentCol, Math.max(0, newColCount - 1));\n\n if (adjustCol) {\n finalCol = adjustCol(newRow, finalCol);\n }\n\n applyFocus(newRow, finalCol);\n }\n },\n // skipRow is reached only through findNextRow, whose identity already\n // tracks it — naming it again here just churned this callback's identity.\n [getColCount, wrap, findValidCol, adjustCol, findNextRow, applyFocus],\n );\n\n return { focusedRow, focusedCol, setFocused, moveFocus };\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,aAAa,cAAc;AAoCvC,SAAS,mBACd,UACA,aACA,UAAqC,CAAC,GACZ;AAC1B,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU;AAMvD,QAAM,gBAAgB,OAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,QAAM,gBAAgB,OAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,aAAa,YAAY,CAAC,KAAa,QAAgB;AAC3D,kBAAc,GAAG;AACjB,kBAAc,GAAG;AACjB,gBAAY,UAAU,KAAK,GAAG;AAAA,EAChC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa;AAEnB,QAAM,cAAc;AAAA,IAClB,CAAC,SAAiB,cAA8B;AAC9C,UAAI,aAAa,EAAG,QAAO;AAC3B,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,YAAI,MAAM;AACR,kBAAQ,OAAO,YAAY,YAAY;AAAA,QACzC,OAAO;AACL,iBAAO,OAAO;AACd,cAAI,OAAO,KAAK,QAAQ,SAAU,QAAO;AAAA,QAC3C;AACA,YAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAG,QAAO;AAAA,MACzC;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,MAAM,OAAO;AAAA,EAC1B;AAEA,QAAM,YAAY;AAAA,IAChB,CAAC,cAAyB;AACxB,YAAM,aAAa,cAAc;AACjC,YAAM,aAAa,cAAc;AAEjC,UAAI,cAAc,UAAU,cAAc,SAAS;AACjD,cAAM,WAAW,YAAY,UAAU;AACvC,YAAI,aAAa,EAAG;AAEpB,cAAM,OAAO,cAAc,UAAU,IAAI;AAEzC,YAAI,cAAc;AAChB,gBAAM,SAAS,aAAa,YAAY,YAAY,IAAI;AACxD,qBAAW,YAAY,MAAM;AAAA,QAC/B,WAAW,MAAM;AACf,gBAAM,UAAU,aAAa,OAAO,YAAY;AAChD,qBAAW,YAAY,MAAM;AAAA,QAC/B,OAAO;AACL,gBAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,aAAa,IAAI,CAAC;AACpE,qBAAW,YAAY,MAAM;AAAA,QAC/B;AAAA,MACF,OAAO;AACL,cAAM,OAAO,cAAc,SAAS,IAAI;AACxC,cAAM,SAAS,YAAY,YAAY,IAAI;AAC3C,cAAM,cAAc,YAAY,MAAM;AACtC,YAAI,WAAW,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AAEhE,YAAI,WAAW;AACb,qBAAW,UAAU,QAAQ,QAAQ;AAAA,QACvC;AAEA,mBAAW,QAAQ,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,CAAC,aAAa,MAAM,cAAc,WAAW,aAAa,UAAU;AAAA,EACtE;AAEA,SAAO,EAAE,YAAY,YAAY,YAAY,UAAU;AACzD;","names":[]}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli/components/render.ts
4
+ import { render as inkRender } from "ink";
5
+ function render(node, options) {
6
+ const stdout = options?.stdout ?? process.stdout;
7
+ return inkRender(node, {
8
+ ...stdout.isTTY && { interactive: true },
9
+ ...options
10
+ });
11
+ }
12
+
13
+ export {
14
+ render
15
+ };
16
+ //# sourceMappingURL=chunk-JFLVEFFP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/render.ts"],"sourcesContent":["import { render as inkRender, type Instance, type RenderOptions } from \"ink\";\nimport type { ReactNode } from \"react\";\n\n/**\n * Every Ink render in the CLI goes through here, for one rule: a real terminal\n * is not a guess.\n *\n * Ink decides whether it is interactive by consulting CI environment variables\n * (`is-in-ci`) before it looks at the stream it was handed, and under CI it\n * buffers every frame and writes only at exit. For a spinner that is cosmetic;\n * for anything awaiting input it is fatal — the screen the user must answer is\n * never painted. That exact failure ran one CI suite for 49 minutes, because\n * the e2e harness hands the child a genuine pseudo-terminal while the runner's\n * environment says CI.\n *\n * So: when the destination stream is a TTY, say `interactive: true` out loud\n * and the CI guess never happens. When it is not — piped output, redirected\n * logs, genuine CI without a terminal — pass nothing and Ink's own detection\n * keeps its non-interactive behaviour. An explicit `interactive` from a caller\n * always wins; the spread order is what guarantees it.\n */\nexport function render(node: ReactNode, options?: RenderOptions): Instance {\n const stdout = options?.stdout ?? process.stdout;\n return inkRender(node, {\n ...(stdout.isTTY && { interactive: true }),\n ...options,\n });\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,iBAAoD;AAqBhE,SAAS,OAAO,MAAiB,SAAmC;AACzE,QAAM,SAAS,SAAS,UAAU,QAAQ;AAC1C,SAAO,UAAU,MAAM;AAAA,IACrB,GAAI,OAAO,SAAS,EAAE,aAAa,KAAK;AAAA,IACxC,GAAG;AAAA,EACL,CAAC;AACH;","names":[]}
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  validateKebabCaseName
4
- } from "./chunk-PG4G4IIK.js";
4
+ } from "./chunk-VY6MNOXL.js";
5
5
  import {
6
6
  FEATURE_FLAGS,
7
7
  featureDisabledError
8
- } from "./chunk-IHO75PMZ.js";
8
+ } from "./chunk-WBCPLH66.js";
9
9
  import {
10
10
  BaseCommand,
11
11
  EXIT_CODES
12
- } from "./chunk-OA5SUEQD.js";
12
+ } from "./chunk-KR65TPKC.js";
13
13
  import {
14
14
  LOCAL_DEFAULTS,
15
15
  computeSkillFolderHash,
@@ -20,7 +20,7 @@ import {
20
20
  toTitleCase,
21
21
  writeScaffoldedEntityTypes,
22
22
  yamlSchemaComment
23
- } from "./chunk-KH7MOIM5.js";
23
+ } from "./chunk-EEPELKOM.js";
24
24
  import {
25
25
  ensureDir,
26
26
  fileExists,
@@ -28,7 +28,7 @@ import {
28
28
  skillCategoriesFileSchema,
29
29
  verbose,
30
30
  writeFile
31
- } from "./chunk-3LIU2ZEF.js";
31
+ } from "./chunk-PMM2MYMA.js";
32
32
  import {
33
33
  CLI_INVOKE_COMMAND,
34
34
  DEFAULT_VERSION,
@@ -39,18 +39,13 @@ import {
39
39
  SKILL_RULES_PATH,
40
40
  STANDARD_FILES,
41
41
  marketplaceManifestPath
42
- } from "./chunk-O5ASLZ2K.js";
43
- import {
44
- init_esm_shims
45
- } from "./chunk-P56WJ5FA.js";
42
+ } from "./chunk-76ADG7LQ.js";
46
43
 
47
44
  // src/cli/commands/new/skill.ts
48
- init_esm_shims();
49
45
  import { Args, Flags } from "@oclif/core";
50
46
  import path from "path";
51
47
 
52
48
  // src/cli/lib/skills/generators.ts
53
- init_esm_shims();
54
49
  var DEFAULT_CATEGORY_ORDER = 99;
55
50
  var CATEGORIES_TS_COMMENT = "// Skill category definitions";
56
51
  var RULES_TS_COMMENT = "// Skill rules configuration";
@@ -379,4 +374,4 @@ export {
379
374
  generateMetadataYaml,
380
375
  scaffoldSkillFiles
381
376
  };
382
- //# sourceMappingURL=chunk-4LPJZNT7.js.map
377
+ //# sourceMappingURL=chunk-KFB5CRXZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/new/skill.ts","../src/cli/lib/skills/generators.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 { loadConfig } from \"../../lib/configuration/config-loader.js\";\nimport { skillCategoriesFileSchema } from \"../../lib/schemas.js\";\nimport { loadConfigTypesDataInBackground } from \"../../lib/configuration/config-types-writer.js\";\nimport { writeScaffoldedEntityTypes } from \"../../lib/config-gate/index.js\";\nimport { fileExists, writeFile, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { verbose } from \"../../utils/logger.js\";\nimport { computeSkillFolderHash } from \"../../lib/versioning.js\";\nimport { validateKebabCaseName } from \"../../lib/validate-kebab-name.js\";\nimport {\n CLI_INVOKE_COMMAND,\n LOCAL_SKILLS_PATH,\n marketplaceManifestPath,\n SCHEMA_PATHS,\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 { FEATURE_FLAGS, featureDisabledError } from \"../../lib/feature-flags.js\";\nimport { yamlSchemaComment } from \"../../utils/yaml-schema.js\";\nimport { detectInstallation } from \"../../lib/installation/index.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport type { CategoryDefinition, CategoryPath } from \"../../types/index.js\";\nimport {\n generateSkillCategoriesTs,\n generateSkillRulesTs,\n buildCategoryEntry,\n formatTsExport,\n} from \"../../lib/skills/generators.js\";\nimport { toTitleCase } from \"../../utils/string.js\";\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 examples = [\n {\n description: \"Scaffold a skill in the local marketplace\",\n command: \"<%= config.bin %> <%= command.id %> my-skill\",\n },\n {\n description: \"Scaffold with explicit category and domain\",\n command: \"<%= config.bin %> <%= command.id %> my-skill --category web/forms --domain web\",\n },\n {\n description: \"Overwrite an existing skill\",\n command: \"<%= config.bin %> <%= command.id %> my-skill --force\",\n },\n ];\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 // Override parent baseFlags to drop --source (new skill auto-detects marketplace context)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {\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\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n if (!FEATURE_FLAGS.NEW_SKILL_COMMAND) {\n this.error(featureDisabledError(\"new skill\"), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const { args, flags } = await this.parse(NewSkill);\n const projectDir = process.cwd();\n\n await this.ensureInstallation(projectDir);\n const configTypesReady = loadConfigTypesDataInBackground(undefined, projectDir);\n\n this.printHeader();\n this.validateName(args.name);\n\n const author = await resolveAuthorOrDefault(flags.author, projectDir);\n // Boundary cast: CLI flag accepts custom category values not in the generated union\n const category = flags.category as CategoryPath;\n const domain = flags.domain ?? LOCAL_DEFAULTS.DOMAIN;\n const skillsBasePath = await this.resolveSkillsBasePath(projectDir);\n const skillDir = path.join(skillsBasePath, args.name);\n\n await this.checkExistingDir(skillDir, flags.force);\n this.logSkillInfo(args.name, author, category, skillDir);\n await this.createSkillFiles(\n args.name,\n author,\n category,\n domain,\n skillDir,\n projectDir,\n configTypesReady,\n );\n }\n\n private async ensureInstallation(projectDir: string): Promise<void> {\n const installation = await detectInstallation(projectDir);\n if (!installation) {\n this.error(`No installation found. Run '${CLI_INVOKE_COMMAND} init' first.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(\"Create New Skill\");\n this.log(\"\");\n }\n\n private validateName(name: string): void {\n const validationError = validateKebabCaseName(name, \"Skill\");\n if (validationError) {\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n }\n\n private async resolveSkillsBasePath(projectDir: string): Promise<string> {\n const marketplacePath = marketplaceManifestPath(projectDir);\n if (await fileExists(marketplacePath)) {\n this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);\n return path.join(projectDir, SKILLS_DIR_PATH);\n }\n return path.join(projectDir, LOCAL_SKILLS_PATH);\n }\n\n private async checkExistingDir(skillDir: string, force: boolean): Promise<void> {\n await this.ensureDirOverwritable(skillDir, force, {\n exists: `Skill directory already exists: ${skillDir}`,\n overwriting: `Overwriting existing skill at ${skillDir}`,\n });\n }\n\n private logSkillInfo(\n name: string,\n author: string,\n category: CategoryPath,\n skillDir: string,\n ): void {\n this.log(`Skill name: ${name}`);\n this.log(`Author: ${author}`);\n this.log(`Category: ${category}`);\n this.log(`Directory: ${skillDir}`);\n this.log(\"\");\n }\n\n private async createSkillFiles(\n name: string,\n author: string,\n category: CategoryPath,\n domain: string,\n skillDir: string,\n projectDir: string,\n configTypesReady: ReturnType<typeof loadConfigTypesDataInBackground>,\n ): Promise<void> {\n this.log(\"Creating skill files...\");\n\n try {\n const result = await scaffoldSkillFiles({\n name,\n author,\n category,\n domain,\n skillDir,\n });\n\n this.log(\"\");\n this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${result.skillMdPath}`);\n this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${result.metadataPath}`);\n\n const marketplacePath = marketplaceManifestPath(projectDir);\n if (await fileExists(marketplacePath)) {\n try {\n await updateSkillRegistryConfig({ projectRoot: projectDir, category, domain });\n } catch (error) {\n this.warn(`Could not update config files: ${getErrorMessage(error)}`);\n }\n }\n\n try {\n await writeScaffoldedEntityTypes(projectDir, configTypesReady, {\n extraSkillIds: [name],\n extraDomains: [domain],\n extraCategories: [category],\n });\n } catch (error) {\n this.warn(`Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`);\n }\n\n this.log(\"\");\n this.log(\n `Skill created successfully! Run '${CLI_INVOKE_COMMAND} compile' to include it in your agents.`,\n );\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n\ntype ScaffoldSkillOptions = {\n name: string;\n author: string;\n category: CategoryPath;\n domain: string;\n skillDir: string;\n};\n\ntype ScaffoldSkillResult = {\n skillMdPath: string;\n metadataPath: string;\n contentHash: string;\n};\n\ntype RegistryUpdateOptions = {\n projectRoot: string;\n category: CategoryPath;\n domain: string;\n};\n\nexport async function resolveAuthorOrDefault(\n authorFlag: string | undefined,\n projectDir: string,\n): Promise<string> {\n if (authorFlag) return authorFlag;\n return (await resolveAuthor(projectDir)) || LOCAL_DEFAULTS.AUTHOR;\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 `${yamlSchemaComment(SCHEMA_PATHS.customMetadata)}\ncustom: true\ndomain: ${domain}\ncategory: ${category}\nauthor: \"${author}\"\ndisplayName: ${titleName}\nslug: ${name}\ncliDescription: Brief description\nusageGuidance: Use when <guidance>.\ncontentHash: ${contentHash}\n`;\n}\n\nexport async function scaffoldSkillFiles(\n options: ScaffoldSkillOptions,\n): Promise<ScaffoldSkillResult> {\n const { name, author, category, domain, skillDir } = options;\n\n const skillMdContent = generateSkillMd(name);\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(name, author, category, contentHash, domain);\n await writeFile(metadataPath, metadataContent);\n\n return { skillMdPath, metadataPath, contentHash };\n}\n\nasync function updateSkillRegistryConfig(options: RegistryUpdateOptions): Promise<void> {\n const { projectRoot, category, domain } = options;\n\n const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_PATH);\n const rulesPath = path.join(projectRoot, SKILL_RULES_PATH);\n\n if (await fileExists(categoriesPath)) {\n const parsed = await loadConfig(categoriesPath, skillCategoriesFileSchema);\n if (!parsed) {\n throw new Error(\n `Config at ${categoriesPath} has no default export — delete the file or add \\`export default { version, categories: {} }\\``,\n );\n }\n // Boundary cast: CategoryMap keys are strict Category; CLI flag may introduce custom category IDs\n const categories = parsed.categories as Record<string, CategoryDefinition>;\n if (!categories[category]) {\n const updated = {\n ...parsed,\n categories: { ...categories, [category]: buildCategoryEntry(category, domain) },\n };\n await writeFile(categoriesPath, formatTsExport(CATEGORIES_TS_COMMENT, updated));\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 if (!(await fileExists(rulesPath))) {\n await ensureDir(path.dirname(rulesPath));\n await writeFile(rulesPath, generateSkillRulesTs());\n verbose(`Created ${SKILL_RULES_PATH}`);\n }\n}\n\nconst CATEGORIES_TS_COMMENT = \"// Skill category definitions\";\n","import { DEFAULT_VERSION } from \"../../consts\";\nimport { toTitleCase } from \"../../utils/string\";\nimport type { CategoryPath } from \"../../types/index\";\n\nconst DEFAULT_CATEGORY_ORDER = 99;\n\nconst CATEGORIES_TS_COMMENT = \"// Skill category definitions\";\nconst RULES_TS_COMMENT = \"// Skill rules configuration\";\n\nexport function formatTsExport(comment: string, data: unknown): string {\n const body = JSON.stringify(data, null, 2);\n return `${comment}\\nexport default ${body};\\n`;\n}\n\nexport function buildCategoryEntry(\n category: CategoryPath,\n domain: string,\n): Record<string, unknown> {\n const categoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n return {\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 domain,\n };\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"],"mappings":"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","names":["CATEGORIES_TS_COMMENT"]}
1
+ {"version":3,"sources":["../src/cli/commands/new/skill.ts","../src/cli/lib/skills/generators.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 { loadConfig } from \"../../lib/configuration/config-loader.js\";\nimport { skillCategoriesFileSchema } from \"../../lib/schemas.js\";\nimport { loadConfigTypesDataInBackground } from \"../../lib/configuration/config-types-writer.js\";\nimport { writeScaffoldedEntityTypes } from \"../../lib/config-gate/index.js\";\nimport { fileExists, writeFile, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { verbose } from \"../../utils/logger.js\";\nimport { computeSkillFolderHash } from \"../../lib/versioning.js\";\nimport { validateKebabCaseName } from \"../../lib/validate-kebab-name.js\";\nimport {\n CLI_INVOKE_COMMAND,\n LOCAL_SKILLS_PATH,\n marketplaceManifestPath,\n SCHEMA_PATHS,\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 { FEATURE_FLAGS, featureDisabledError } from \"../../lib/feature-flags.js\";\nimport { yamlSchemaComment } from \"../../utils/yaml-schema.js\";\nimport { detectInstallation } from \"../../lib/installation/index.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport type { CategoryDefinition, CategoryPath } from \"../../types/index.js\";\nimport {\n generateSkillCategoriesTs,\n generateSkillRulesTs,\n buildCategoryEntry,\n formatTsExport,\n} from \"../../lib/skills/generators.js\";\nimport { toTitleCase } from \"../../utils/string.js\";\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 examples = [\n {\n description: \"Scaffold a skill in the local marketplace\",\n command: \"<%= config.bin %> <%= command.id %> my-skill\",\n },\n {\n description: \"Scaffold with explicit category and domain\",\n command: \"<%= config.bin %> <%= command.id %> my-skill --category web/forms --domain web\",\n },\n {\n description: \"Overwrite an existing skill\",\n command: \"<%= config.bin %> <%= command.id %> my-skill --force\",\n },\n ];\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 // Override parent baseFlags to drop --source (new skill auto-detects marketplace context)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {\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\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n if (!FEATURE_FLAGS.NEW_SKILL_COMMAND) {\n this.error(featureDisabledError(\"new skill\"), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const { args, flags } = await this.parse(NewSkill);\n const projectDir = process.cwd();\n\n await this.ensureInstallation(projectDir);\n const configTypesReady = loadConfigTypesDataInBackground(undefined, projectDir);\n\n this.printHeader();\n this.validateName(args.name);\n\n const author = await resolveAuthorOrDefault(flags.author, projectDir);\n // Boundary cast: CLI flag accepts custom category values not in the generated union\n const category = flags.category as CategoryPath;\n const domain = flags.domain ?? LOCAL_DEFAULTS.DOMAIN;\n const skillsBasePath = await this.resolveSkillsBasePath(projectDir);\n const skillDir = path.join(skillsBasePath, args.name);\n\n await this.checkExistingDir(skillDir, flags.force);\n this.logSkillInfo(args.name, author, category, skillDir);\n await this.createSkillFiles(\n args.name,\n author,\n category,\n domain,\n skillDir,\n projectDir,\n configTypesReady,\n );\n }\n\n private async ensureInstallation(projectDir: string): Promise<void> {\n const installation = await detectInstallation(projectDir);\n if (!installation) {\n this.error(`No installation found. Run '${CLI_INVOKE_COMMAND} init' first.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(\"Create New Skill\");\n this.log(\"\");\n }\n\n private validateName(name: string): void {\n const validationError = validateKebabCaseName(name, \"Skill\");\n if (validationError) {\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n }\n\n private async resolveSkillsBasePath(projectDir: string): Promise<string> {\n const marketplacePath = marketplaceManifestPath(projectDir);\n if (await fileExists(marketplacePath)) {\n this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);\n return path.join(projectDir, SKILLS_DIR_PATH);\n }\n return path.join(projectDir, LOCAL_SKILLS_PATH);\n }\n\n private async checkExistingDir(skillDir: string, force: boolean): Promise<void> {\n await this.ensureDirOverwritable(skillDir, force, {\n exists: `Skill directory already exists: ${skillDir}`,\n overwriting: `Overwriting existing skill at ${skillDir}`,\n });\n }\n\n private logSkillInfo(\n name: string,\n author: string,\n category: CategoryPath,\n skillDir: string,\n ): void {\n this.log(`Skill name: ${name}`);\n this.log(`Author: ${author}`);\n this.log(`Category: ${category}`);\n this.log(`Directory: ${skillDir}`);\n this.log(\"\");\n }\n\n private async createSkillFiles(\n name: string,\n author: string,\n category: CategoryPath,\n domain: string,\n skillDir: string,\n projectDir: string,\n configTypesReady: ReturnType<typeof loadConfigTypesDataInBackground>,\n ): Promise<void> {\n this.log(\"Creating skill files...\");\n\n try {\n const result = await scaffoldSkillFiles({\n name,\n author,\n category,\n domain,\n skillDir,\n });\n\n this.log(\"\");\n this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${result.skillMdPath}`);\n this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${result.metadataPath}`);\n\n const marketplacePath = marketplaceManifestPath(projectDir);\n if (await fileExists(marketplacePath)) {\n try {\n await updateSkillRegistryConfig({ projectRoot: projectDir, category, domain });\n } catch (error) {\n this.warn(`Could not update config files: ${getErrorMessage(error)}`);\n }\n }\n\n try {\n await writeScaffoldedEntityTypes(projectDir, configTypesReady, {\n extraSkillIds: [name],\n extraDomains: [domain],\n extraCategories: [category],\n });\n } catch (error) {\n this.warn(`Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`);\n }\n\n this.log(\"\");\n this.log(\n `Skill created successfully! Run '${CLI_INVOKE_COMMAND} compile' to include it in your agents.`,\n );\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n\ntype ScaffoldSkillOptions = {\n name: string;\n author: string;\n category: CategoryPath;\n domain: string;\n skillDir: string;\n};\n\ntype ScaffoldSkillResult = {\n skillMdPath: string;\n metadataPath: string;\n contentHash: string;\n};\n\ntype RegistryUpdateOptions = {\n projectRoot: string;\n category: CategoryPath;\n domain: string;\n};\n\nexport async function resolveAuthorOrDefault(\n authorFlag: string | undefined,\n projectDir: string,\n): Promise<string> {\n if (authorFlag) return authorFlag;\n return (await resolveAuthor(projectDir)) || LOCAL_DEFAULTS.AUTHOR;\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 `${yamlSchemaComment(SCHEMA_PATHS.customMetadata)}\ncustom: true\ndomain: ${domain}\ncategory: ${category}\nauthor: \"${author}\"\ndisplayName: ${titleName}\nslug: ${name}\ncliDescription: Brief description\nusageGuidance: Use when <guidance>.\ncontentHash: ${contentHash}\n`;\n}\n\nexport async function scaffoldSkillFiles(\n options: ScaffoldSkillOptions,\n): Promise<ScaffoldSkillResult> {\n const { name, author, category, domain, skillDir } = options;\n\n const skillMdContent = generateSkillMd(name);\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(name, author, category, contentHash, domain);\n await writeFile(metadataPath, metadataContent);\n\n return { skillMdPath, metadataPath, contentHash };\n}\n\nasync function updateSkillRegistryConfig(options: RegistryUpdateOptions): Promise<void> {\n const { projectRoot, category, domain } = options;\n\n const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_PATH);\n const rulesPath = path.join(projectRoot, SKILL_RULES_PATH);\n\n if (await fileExists(categoriesPath)) {\n const parsed = await loadConfig(categoriesPath, skillCategoriesFileSchema);\n if (!parsed) {\n throw new Error(\n `Config at ${categoriesPath} has no default export — delete the file or add \\`export default { version, categories: {} }\\``,\n );\n }\n // Boundary cast: CategoryMap keys are strict Category; CLI flag may introduce custom category IDs\n const categories = parsed.categories as Record<string, CategoryDefinition>;\n if (!categories[category]) {\n const updated = {\n ...parsed,\n categories: { ...categories, [category]: buildCategoryEntry(category, domain) },\n };\n await writeFile(categoriesPath, formatTsExport(CATEGORIES_TS_COMMENT, updated));\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 if (!(await fileExists(rulesPath))) {\n await ensureDir(path.dirname(rulesPath));\n await writeFile(rulesPath, generateSkillRulesTs());\n verbose(`Created ${SKILL_RULES_PATH}`);\n }\n}\n\nconst CATEGORIES_TS_COMMENT = \"// Skill category definitions\";\n","import { DEFAULT_VERSION } from \"../../consts\";\nimport { toTitleCase } from \"../../utils/string\";\nimport type { CategoryPath } from \"../../types/index\";\n\nconst DEFAULT_CATEGORY_ORDER = 99;\n\nconst CATEGORIES_TS_COMMENT = \"// Skill category definitions\";\nconst RULES_TS_COMMENT = \"// Skill rules configuration\";\n\nexport function formatTsExport(comment: string, data: unknown): string {\n const body = JSON.stringify(data, null, 2);\n return `${comment}\\nexport default ${body};\\n`;\n}\n\nexport function buildCategoryEntry(\n category: CategoryPath,\n domain: string,\n): Record<string, unknown> {\n const categoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n return {\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 domain,\n };\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"],"mappings":"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","names":["CATEGORIES_TS_COMMENT"]}