superacli 1.0.1 → 1.1.2

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 (389) hide show
  1. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl +20 -0
  2. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl.meta.json +1 -0
  3. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl +21 -0
  4. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl.meta.json +1 -0
  5. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl +22 -0
  6. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl.meta.json +1 -0
  7. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl +23 -0
  8. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl.meta.json +1 -0
  9. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl +24 -0
  10. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl.meta.json +1 -0
  11. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl +24 -0
  12. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl.meta.json +1 -0
  13. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl +24 -0
  14. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl.meta.json +1 -0
  15. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl +24 -0
  16. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl.meta.json +1 -0
  17. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl +24 -0
  18. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl.meta.json +1 -0
  19. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl +24 -0
  20. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl.meta.json +1 -0
  21. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl +24 -0
  22. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl.meta.json +1 -0
  23. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl +24 -0
  24. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl.meta.json +1 -0
  25. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl +24 -0
  26. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl.meta.json +1 -0
  27. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl +25 -0
  28. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl.meta.json +1 -0
  29. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl +25 -0
  30. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl.meta.json +1 -0
  31. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl +25 -0
  32. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl.meta.json +1 -0
  33. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl +26 -0
  34. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl.meta.json +1 -0
  35. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl +27 -0
  36. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl.meta.json +1 -0
  37. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl +28 -0
  38. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl.meta.json +1 -0
  39. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl +29 -0
  40. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl.meta.json +1 -0
  41. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl +30 -0
  42. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl.meta.json +1 -0
  43. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl +31 -0
  44. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl.meta.json +1 -0
  45. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl +32 -0
  46. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl.meta.json +1 -0
  47. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl +32 -0
  48. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl.meta.json +1 -0
  49. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl +32 -0
  50. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl.meta.json +1 -0
  51. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl +32 -0
  52. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl.meta.json +1 -0
  53. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl +32 -0
  54. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl.meta.json +1 -0
  55. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl +32 -0
  56. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl.meta.json +1 -0
  57. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl +32 -0
  58. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl.meta.json +1 -0
  59. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl +32 -0
  60. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl.meta.json +1 -0
  61. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl +32 -0
  62. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl.meta.json +1 -0
  63. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl +32 -0
  64. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl.meta.json +1 -0
  65. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl +32 -0
  66. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl.meta.json +1 -0
  67. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl +32 -0
  68. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl.meta.json +1 -0
  69. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl +32 -0
  70. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl.meta.json +1 -0
  71. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl +32 -0
  72. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl.meta.json +1 -0
  73. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl +33 -0
  74. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl.meta.json +1 -0
  75. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl +33 -0
  76. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl.meta.json +1 -0
  77. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl +34 -0
  78. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl.meta.json +1 -0
  79. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl +34 -0
  80. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl.meta.json +1 -0
  81. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl +35 -0
  82. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl.meta.json +1 -0
  83. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl +36 -0
  84. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl.meta.json +1 -0
  85. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl +37 -0
  86. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl.meta.json +1 -0
  87. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl +38 -0
  88. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl.meta.json +1 -0
  89. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl +39 -0
  90. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl.meta.json +1 -0
  91. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl +40 -0
  92. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl.meta.json +1 -0
  93. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl +41 -0
  94. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl.meta.json +1 -0
  95. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl +42 -0
  96. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl.meta.json +1 -0
  97. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl +43 -0
  98. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl.meta.json +1 -0
  99. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl +44 -0
  100. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl.meta.json +1 -0
  101. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl +45 -0
  102. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl.meta.json +1 -0
  103. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl +46 -0
  104. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl.meta.json +1 -0
  105. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl +47 -0
  106. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl.meta.json +1 -0
  107. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl +48 -0
  108. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl.meta.json +1 -0
  109. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl +49 -0
  110. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl.meta.json +1 -0
  111. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl +50 -0
  112. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl.meta.json +1 -0
  113. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl +51 -0
  114. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl.meta.json +1 -0
  115. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl +52 -0
  116. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl.meta.json +1 -0
  117. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl +53 -0
  118. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl.meta.json +1 -0
  119. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl +54 -0
  120. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl.meta.json +1 -0
  121. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl +55 -0
  122. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl.meta.json +1 -0
  123. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl +56 -0
  124. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl.meta.json +1 -0
  125. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl +57 -0
  126. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl.meta.json +1 -0
  127. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl +57 -0
  128. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl.meta.json +1 -0
  129. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl +57 -0
  130. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl.meta.json +1 -0
  131. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl +57 -0
  132. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl.meta.json +1 -0
  133. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl +57 -0
  134. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl.meta.json +1 -0
  135. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl +57 -0
  136. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl.meta.json +1 -0
  137. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl +57 -0
  138. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl.meta.json +1 -0
  139. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl +57 -0
  140. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl.meta.json +1 -0
  141. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl +57 -0
  142. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl.meta.json +1 -0
  143. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +57 -0
  144. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl.meta.json +1 -0
  145. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +57 -0
  146. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl.meta.json +1 -0
  147. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +57 -0
  148. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl.meta.json +1 -0
  149. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +57 -0
  150. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl.meta.json +1 -0
  151. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +57 -0
  152. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl.meta.json +1 -0
  153. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +57 -0
  154. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl.meta.json +1 -0
  155. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +57 -0
  156. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl.meta.json +1 -0
  157. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +57 -0
  158. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl.meta.json +1 -0
  159. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +57 -0
  160. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl.meta.json +1 -0
  161. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +57 -0
  162. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl.meta.json +1 -0
  163. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +57 -0
  164. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl.meta.json +1 -0
  165. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +57 -0
  166. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl.meta.json +1 -0
  167. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +57 -0
  168. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl.meta.json +1 -0
  169. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +57 -0
  170. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl.meta.json +1 -0
  171. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +57 -0
  172. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl.meta.json +1 -0
  173. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +57 -0
  174. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl.meta.json +1 -0
  175. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +57 -0
  176. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl.meta.json +1 -0
  177. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +57 -0
  178. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl.meta.json +1 -0
  179. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +57 -0
  180. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl.meta.json +1 -0
  181. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +57 -0
  182. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl.meta.json +1 -0
  183. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +57 -0
  184. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl.meta.json +1 -0
  185. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +58 -0
  186. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl.meta.json +1 -0
  187. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +59 -0
  188. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl.meta.json +1 -0
  189. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +60 -0
  190. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl.meta.json +1 -0
  191. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +60 -0
  192. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl.meta.json +1 -0
  193. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +60 -0
  194. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl.meta.json +1 -0
  195. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +60 -0
  196. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl.meta.json +1 -0
  197. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +60 -0
  198. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl.meta.json +1 -0
  199. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +60 -0
  200. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl.meta.json +1 -0
  201. package/.beads/config.yaml +4 -0
  202. package/.beads/issues.jsonl +60 -0
  203. package/.beads/metadata.json +4 -0
  204. package/README.md +226 -43
  205. package/__tests__/adapter-schema.test.js +119 -0
  206. package/__tests__/ask.test.js +327 -0
  207. package/__tests__/aws-plugin.test.js +84 -0
  208. package/__tests__/az-plugin.test.js +84 -0
  209. package/__tests__/builtin-adapter.test.js +29 -0
  210. package/__tests__/cline-plugin.test.js +109 -0
  211. package/__tests__/cline-skill.test.js +49 -0
  212. package/__tests__/config.test.js +297 -0
  213. package/__tests__/docker-plugin.test.js +95 -0
  214. package/__tests__/executor.test.js +303 -0
  215. package/__tests__/eza-plugin.test.js +81 -0
  216. package/__tests__/gcloud-plugin.test.js +86 -0
  217. package/__tests__/gh-plugin.test.js +86 -0
  218. package/__tests__/helm-plugin.test.js +81 -0
  219. package/__tests__/help-json.test.js +19 -0
  220. package/__tests__/http-adapter.test.js +118 -0
  221. package/__tests__/just-plugin.test.js +82 -0
  222. package/__tests__/kubectl-plugin.test.js +83 -0
  223. package/__tests__/linear-plugin.test.js +81 -0
  224. package/__tests__/mcp-adapter.test.js +187 -0
  225. package/__tests__/mcp-local.test.js +105 -0
  226. package/__tests__/namespace-passthrough.test.js +69 -0
  227. package/__tests__/nextest-plugin.test.js +82 -0
  228. package/__tests__/npm-plugin.test.js +81 -0
  229. package/__tests__/nullclaw-plugin.test.js +157 -0
  230. package/__tests__/openapi-adapter.test.js +199 -0
  231. package/__tests__/plan-runtime.test.js +43 -0
  232. package/__tests__/planner.test.js +47 -0
  233. package/__tests__/plugin-agency-agents.test.js +62 -0
  234. package/__tests__/plugin-nullclaw.test.js +78 -0
  235. package/__tests__/plugin-visual-explainer.test.js +62 -0
  236. package/__tests__/plugins-command.test.js +220 -0
  237. package/__tests__/plugins-manager.test.js +353 -0
  238. package/__tests__/plugins-registry.test.js +114 -0
  239. package/__tests__/plugins-store.test.js +115 -0
  240. package/__tests__/pnpm-plugin.test.js +81 -0
  241. package/__tests__/poetry-plugin.test.js +83 -0
  242. package/__tests__/process-adapter.test.js +143 -0
  243. package/__tests__/pulumi-plugin.test.js +81 -0
  244. package/__tests__/railway-plugin.test.js +84 -0
  245. package/__tests__/server-app.test.js +67 -0
  246. package/__tests__/server-config-service.test.js +79 -0
  247. package/__tests__/server-routes-ask.test.js +89 -0
  248. package/__tests__/server-routes-commands.test.js +55 -0
  249. package/__tests__/server-routes-config.test.js +87 -0
  250. package/__tests__/server-routes-jobs.test.js +53 -0
  251. package/__tests__/server-routes-misc.test.js +112 -0
  252. package/__tests__/server-storage-adapter.test.js +40 -0
  253. package/__tests__/server-storage-file.test.js +73 -0
  254. package/__tests__/server-storage-mongo.test.js +74 -0
  255. package/__tests__/shell-adapter.test.js +90 -0
  256. package/__tests__/skills-catalog.test.js +98 -0
  257. package/__tests__/skills.test.js +442 -0
  258. package/__tests__/stripe-plugin.test.js +81 -0
  259. package/__tests__/supabase-plugin.test.js +86 -0
  260. package/__tests__/terraform-plugin.test.js +83 -0
  261. package/__tests__/uv-plugin.test.js +81 -0
  262. package/__tests__/vercel-plugin.test.js +81 -0
  263. package/__tests__/watchexec-plugin.test.js +80 -0
  264. package/cli/adapter-schema.js +108 -0
  265. package/cli/adapters/builtin.js +43 -0
  266. package/cli/adapters/process.js +262 -0
  267. package/cli/adapters/shell.js +82 -0
  268. package/cli/config.js +12 -9
  269. package/cli/executor.js +6 -1
  270. package/cli/help-json.js +3 -1
  271. package/cli/namespace-passthrough.js +38 -0
  272. package/cli/plugin-install-guidance.js +320 -0
  273. package/cli/plugins-command.js +138 -0
  274. package/cli/plugins-manager.js +552 -0
  275. package/cli/plugins-registry.js +80 -0
  276. package/cli/plugins-store.js +56 -0
  277. package/cli/skills-catalog.js +237 -0
  278. package/cli/skills.js +180 -6
  279. package/cli/supercli.js +150 -58
  280. package/docs/docs.html +224 -0
  281. package/docs/feature-gaps.md +16 -0
  282. package/docs/index.html +164 -0
  283. package/docs/plugin-examples.md +397 -0
  284. package/docs/plugin-harness-guide.md +452 -0
  285. package/docs/plugins.md +44 -0
  286. package/docs/skills/cline-non-interactive/SKILL.md +59 -0
  287. package/docs/skills-catalog.md +81 -0
  288. package/docs/supported-harnesses.md +277 -0
  289. package/docs/visual-overview.md +21 -0
  290. package/jest.config.js +25 -0
  291. package/package.json +9 -3
  292. package/plugins/agency-agents/plugin.json +15 -0
  293. package/plugins/agency-agents/scripts/post-install.js +122 -0
  294. package/plugins/aws/README.md +46 -0
  295. package/plugins/aws/plugin.json +42 -0
  296. package/plugins/az/README.md +46 -0
  297. package/plugins/az/plugin.json +42 -0
  298. package/plugins/beads/plugin.json +202 -0
  299. package/plugins/clickup/plugin.json +38 -0
  300. package/plugins/clickup/scripts/post-install.js +107 -0
  301. package/plugins/clickup/scripts/post-uninstall.js +30 -0
  302. package/plugins/cline/README.md +48 -0
  303. package/plugins/cline/plugin.json +92 -0
  304. package/plugins/commiat/plugin.json +36 -0
  305. package/plugins/docker/MANIFEST.md +39 -0
  306. package/plugins/docker/README.md +35 -0
  307. package/plugins/docker/examples/build-image.sh +7 -0
  308. package/plugins/docker/examples/inspect-container.sh +6 -0
  309. package/plugins/docker/examples/list-containers.sh +4 -0
  310. package/plugins/docker/examples/multi-step-workflow.sh +10 -0
  311. package/plugins/docker/examples/run-container.sh +7 -0
  312. package/plugins/docker/plugin.json +266 -0
  313. package/plugins/eza/README.md +40 -0
  314. package/plugins/eza/plugin.json +42 -0
  315. package/plugins/gcloud/README.md +46 -0
  316. package/plugins/gcloud/plugin.json +42 -0
  317. package/plugins/gh/README.md +46 -0
  318. package/plugins/gh/plugin.json +43 -0
  319. package/plugins/gwc/plugin.json +35 -0
  320. package/plugins/helm/README.md +42 -0
  321. package/plugins/helm/plugin.json +42 -0
  322. package/plugins/just/README.md +42 -0
  323. package/plugins/just/plugin.json +42 -0
  324. package/plugins/kubectl/README.md +46 -0
  325. package/plugins/kubectl/plugin.json +42 -0
  326. package/plugins/linear/README.md +60 -0
  327. package/plugins/linear/plugin.json +42 -0
  328. package/plugins/nextest/README.md +42 -0
  329. package/plugins/nextest/plugin.json +42 -0
  330. package/plugins/npm/README.md +46 -0
  331. package/plugins/npm/plugin.json +42 -0
  332. package/plugins/nullclaw/README.md +45 -0
  333. package/plugins/nullclaw/plugin.json +64 -0
  334. package/plugins/nullclaw/scripts/post-install.js +189 -0
  335. package/plugins/nullclaw/scripts/post-uninstall.js +25 -0
  336. package/plugins/openfang/plugin.json +37 -0
  337. package/plugins/openfang/scripts/post-install.js +163 -0
  338. package/plugins/openfang/scripts/post-uninstall.js +30 -0
  339. package/plugins/plugins.json +295 -0
  340. package/plugins/pnpm/README.md +46 -0
  341. package/plugins/pnpm/plugin.json +42 -0
  342. package/plugins/poetry/README.md +46 -0
  343. package/plugins/poetry/plugin.json +42 -0
  344. package/plugins/pulumi/README.md +46 -0
  345. package/plugins/pulumi/plugin.json +42 -0
  346. package/plugins/railway/README.md +58 -0
  347. package/plugins/railway/plugin.json +43 -0
  348. package/plugins/stripe/README.md +49 -0
  349. package/plugins/stripe/plugin.json +52 -0
  350. package/plugins/supabase/README.md +55 -0
  351. package/plugins/supabase/plugin.json +42 -0
  352. package/plugins/superpowers/plugin.json +22 -0
  353. package/plugins/superpowers/scripts/post-install.js +124 -0
  354. package/plugins/superpowers/scripts/post-uninstall.js +30 -0
  355. package/plugins/terraform/README.md +46 -0
  356. package/plugins/terraform/plugin.json +42 -0
  357. package/plugins/uv/README.md +46 -0
  358. package/plugins/uv/plugin.json +42 -0
  359. package/plugins/vercel/README.md +47 -0
  360. package/plugins/vercel/plugin.json +42 -0
  361. package/plugins/visual-explainer/plugin.json +15 -0
  362. package/plugins/visual-explainer/scripts/post-install.js +111 -0
  363. package/plugins/watchexec/README.md +40 -0
  364. package/plugins/watchexec/plugin.json +42 -0
  365. package/tests/test-aws-smoke.sh +56 -0
  366. package/tests/test-az-smoke.sh +56 -0
  367. package/tests/test-cli.js +116 -2
  368. package/tests/test-cline-smoke.sh +37 -0
  369. package/tests/test-eza-smoke.sh +33 -0
  370. package/tests/test-gcloud-smoke.sh +56 -0
  371. package/tests/test-gh-smoke.sh +56 -0
  372. package/tests/test-helm-smoke.sh +33 -0
  373. package/tests/test-just-smoke.sh +40 -0
  374. package/tests/test-kubectl-smoke.sh +37 -0
  375. package/tests/test-linear-smoke.sh +97 -0
  376. package/tests/test-nextest-smoke.sh +33 -0
  377. package/tests/test-npm-smoke.sh +32 -0
  378. package/tests/test-nullclaw-smoke.sh +51 -0
  379. package/tests/test-plugins-registry.js +212 -0
  380. package/tests/test-pnpm-smoke.sh +33 -0
  381. package/tests/test-poetry-smoke.sh +33 -0
  382. package/tests/test-pulumi-smoke.sh +33 -0
  383. package/tests/test-railway-smoke.sh +95 -0
  384. package/tests/test-stripe-smoke.sh +55 -0
  385. package/tests/test-supabase-smoke.sh +95 -0
  386. package/tests/test-terraform-smoke.sh +33 -0
  387. package/tests/test-uv-smoke.sh +33 -0
  388. package/tests/test-vercel-smoke.sh +55 -0
  389. package/tests/test-watchexec-smoke.sh +33 -0
@@ -0,0 +1,237 @@
1
+ const fs = require("fs")
2
+ const os = require("os")
3
+ const path = require("path")
4
+ const { spawnSync } = require("child_process")
5
+
6
+ function dcliDir() {
7
+ return process.env.SUPERCLI_HOME || path.join(os.homedir(), ".dcli")
8
+ }
9
+
10
+ function providersFile() {
11
+ return path.join(dcliDir(), "skills-providers.json")
12
+ }
13
+
14
+ function indexFile() {
15
+ return path.join(dcliDir(), "skills-index.json")
16
+ }
17
+
18
+ function ensureDir() {
19
+ const dir = dcliDir()
20
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })
21
+ }
22
+
23
+ function defaultProviders() {
24
+ const home = os.homedir()
25
+ const cwd = process.cwd()
26
+ return [
27
+ { name: "opencode", type: "local_fs", roots: [path.join(home, ".config", "opencode", "skills")], enabled: true },
28
+ { name: "codex", type: "local_fs", roots: [path.join(home, ".config", "codex", "skills")], enabled: true },
29
+ { name: "windsurf", type: "local_fs", roots: [path.join(home, ".config", "windsurf", "skills")], enabled: true },
30
+ { name: "cursor", type: "local_fs", roots: [path.join(home, ".config", "cursor", "skills")], enabled: true },
31
+ { name: "repo", type: "repo_fs", roots: [path.join(cwd, ".agents", "skills"), path.join(cwd, "docs", "skills")], enabled: true }
32
+ ]
33
+ }
34
+
35
+ function readJson(file, fallback) {
36
+ try {
37
+ if (!fs.existsSync(file)) return fallback
38
+ return JSON.parse(fs.readFileSync(file, "utf-8"))
39
+ } catch {
40
+ return fallback
41
+ }
42
+ }
43
+
44
+ function writeJson(file, value) {
45
+ ensureDir()
46
+ fs.writeFileSync(file, JSON.stringify(value, null, 2))
47
+ return value
48
+ }
49
+
50
+ function listProviders() {
51
+ const providers = readJson(providersFile(), defaultProviders())
52
+ return Array.isArray(providers) ? providers : defaultProviders()
53
+ }
54
+
55
+ function setProviders(providers) {
56
+ return writeJson(providersFile(), providers)
57
+ }
58
+
59
+ function addProvider(entry) {
60
+ const providers = listProviders()
61
+ const idx = providers.findIndex(p => p.name === entry.name)
62
+ if (idx >= 0) providers[idx] = entry
63
+ else providers.push(entry)
64
+ setProviders(providers)
65
+ return entry
66
+ }
67
+
68
+ function removeProvider(name) {
69
+ const providers = listProviders()
70
+ const next = providers.filter(p => p.name !== name)
71
+ const removed = next.length !== providers.length
72
+ setProviders(next)
73
+ return removed
74
+ }
75
+
76
+ function getProvider(name) {
77
+ return listProviders().find(p => p.name === name) || null
78
+ }
79
+
80
+ function readIndex() {
81
+ const empty = { version: 1, updated_at: null, skills: [] }
82
+ const idx = readJson(indexFile(), empty)
83
+ if (!idx || typeof idx !== "object") return empty
84
+ if (!Array.isArray(idx.skills)) idx.skills = []
85
+ return idx
86
+ }
87
+
88
+ function walkDir(dir) {
89
+ const files = []
90
+ if (!fs.existsSync(dir)) return files
91
+ const entries = fs.readdirSync(dir, { withFileTypes: true })
92
+ for (const entry of entries) {
93
+ const full = path.join(dir, entry.name)
94
+ if (entry.isDirectory()) {
95
+ files.push(...walkDir(full))
96
+ continue
97
+ }
98
+ if (entry.isFile() && entry.name === "SKILL.md") files.push(full)
99
+ }
100
+ return files
101
+ }
102
+
103
+ function parseFrontmatter(markdown) {
104
+ if (!markdown.startsWith("---\n")) return { frontmatter: {}, body: markdown }
105
+ const end = markdown.indexOf("\n---\n", 4)
106
+ if (end < 0) return { frontmatter: {}, body: markdown }
107
+ const raw = markdown.slice(4, end)
108
+ const body = markdown.slice(end + 5)
109
+ const frontmatter = {}
110
+ for (const line of raw.split("\n")) {
111
+ const idx = line.indexOf(":")
112
+ if (idx < 0) continue
113
+ const key = line.slice(0, idx).trim()
114
+ const value = line.slice(idx + 1).trim().replace(/^"|"$/g, "")
115
+ if (key) frontmatter[key] = value
116
+ }
117
+ return { frontmatter, body }
118
+ }
119
+
120
+ function baseSkillId(filePath, frontmatter, root) {
121
+ if (frontmatter.skill_name) return frontmatter.skill_name
122
+ const rel = path.relative(root, filePath)
123
+ return rel.replace(/\\/g, "/").replace(/\/SKILL\.md$/, "").replace(/\//g, ".")
124
+ }
125
+
126
+ function syncCatalog() {
127
+ const providers = listProviders()
128
+ const skills = []
129
+
130
+ for (const provider of providers) {
131
+ if (!provider.enabled) continue
132
+
133
+ if (provider.type === "remote_static") {
134
+ const entries = Array.isArray(provider.entries) ? provider.entries : []
135
+ for (const entry of entries) {
136
+ if (!entry || !entry.id || !entry.source_url) continue
137
+ skills.push({
138
+ id: `${provider.name}:${entry.id}`,
139
+ provider: provider.name,
140
+ name: entry.name || entry.id,
141
+ description: entry.description || "",
142
+ source_url: entry.source_url,
143
+ tags: Array.isArray(entry.tags) ? entry.tags : [],
144
+ updated_at: new Date().toISOString()
145
+ })
146
+ }
147
+ continue
148
+ }
149
+
150
+ const roots = Array.isArray(provider.roots) ? provider.roots : []
151
+ for (const root of roots) {
152
+ const files = walkDir(root)
153
+ for (const filePath of files) {
154
+ const markdown = fs.readFileSync(filePath, "utf-8")
155
+ const { frontmatter, body } = parseFrontmatter(markdown)
156
+ const baseId = baseSkillId(filePath, frontmatter, root)
157
+ const heading = body.split("\n").find(l => l.startsWith("# "))
158
+ const name = frontmatter.skill_name || (heading ? heading.slice(2).trim() : baseId)
159
+ const description = frontmatter.description || ""
160
+ const tags = typeof frontmatter.tags === "string" ? frontmatter.tags.split(",").map(t => t.trim()).filter(Boolean) : []
161
+
162
+ skills.push({
163
+ id: `${provider.name}:${baseId}`,
164
+ provider: provider.name,
165
+ name,
166
+ description,
167
+ source_path: filePath,
168
+ tags,
169
+ updated_at: new Date().toISOString()
170
+ })
171
+ }
172
+ }
173
+ }
174
+
175
+ skills.sort((a, b) => a.id.localeCompare(b.id))
176
+ const next = {
177
+ version: 1,
178
+ updated_at: new Date().toISOString(),
179
+ providers: providers.map(p => p.name),
180
+ skills
181
+ }
182
+ writeJson(indexFile(), next)
183
+ return next
184
+ }
185
+
186
+ function listCatalogSkills(options = {}) {
187
+ const idx = readIndex()
188
+ let items = idx.skills || []
189
+ if (options.provider) items = items.filter(s => s.provider === options.provider)
190
+ return items.map(s => ({ id: s.id, name: s.name, description: s.description, provider: s.provider }))
191
+ }
192
+
193
+ function searchCatalog(query, options = {}) {
194
+ const q = String(query || "").trim().toLowerCase()
195
+ if (!q) return []
196
+ const items = listCatalogSkills(options)
197
+ return items.filter(s =>
198
+ s.id.toLowerCase().includes(q) ||
199
+ s.name.toLowerCase().includes(q) ||
200
+ String(s.description || "").toLowerCase().includes(q)
201
+ )
202
+ }
203
+
204
+ function getCatalogSkill(providerId) {
205
+ const idx = readIndex()
206
+ const hit = (idx.skills || []).find(s => s.id === providerId)
207
+ if (!hit) return null
208
+ let markdown = null
209
+
210
+ if (hit.source_path) {
211
+ if (!fs.existsSync(hit.source_path)) return null
212
+ markdown = fs.readFileSync(hit.source_path, "utf-8")
213
+ } else if (hit.source_url) {
214
+ const res = spawnSync("curl", ["-fsSL", hit.source_url], { encoding: "utf-8", timeout: 15000 })
215
+ if (res.error || res.status !== 0) return null
216
+ markdown = (res.stdout || "").trim()
217
+ }
218
+
219
+ if (!markdown) return null
220
+
221
+ return {
222
+ ...hit,
223
+ markdown
224
+ }
225
+ }
226
+
227
+ module.exports = {
228
+ listProviders,
229
+ addProvider,
230
+ removeProvider,
231
+ getProvider,
232
+ readIndex,
233
+ syncCatalog,
234
+ listCatalogSkills,
235
+ searchCatalog,
236
+ getCatalogSkill
237
+ }
package/cli/skills.js CHANGED
@@ -1,5 +1,18 @@
1
1
  const { createPlan } = require("./planner")
2
2
 
3
+ const PLUGINS_USAGE_SKILL_ID = "plugins.registry.usage"
4
+ const {
5
+ listProviders,
6
+ addProvider,
7
+ removeProvider,
8
+ getProvider,
9
+ readIndex,
10
+ syncCatalog,
11
+ listCatalogSkills,
12
+ searchCatalog,
13
+ getCatalogSkill
14
+ } = require("./skills-catalog")
15
+
3
16
  function normalizeSkillId(input) {
4
17
  if (!input || typeof input !== "string") return null
5
18
  const parts = input.trim().split(".")
@@ -163,14 +176,61 @@ function buildTeachSkillMarkdown(options = {}) {
163
176
  ]
164
177
  }
165
178
 
166
- return `---\n${renderYamlObject(frontmatter)}\n---\n\n# Instruction\n\nThis skill teaches LLMs how to discover and use SuperCLI skills:\n\n1. List available skills:\n\n\`\`\`bash\nsupercli skills list --json\n\`\`\`\n\n2. Fetch a specific skill:\n\n\`\`\`bash\nsupercli skills get <namespace.resource.action> --format skill.md\n\`\`\`\n\n3. Parse YAML frontmatter to understand command, arguments, output schema, and metadata.\n\n4. Execute the command with validated arguments:\n\n\`\`\`bash\nsupercli <namespace> <resource> <action> --arg value --json\n\`\`\`\n\n# Examples\n\n\`\`\`bash\nsupercli skills teach --format skill.md\nsupercli skills teach --format skill.md --show-dag\n\`\`\``
179
+ return `---\n${renderYamlObject(frontmatter)}\n---\n\n# Instruction\n\nThis skill teaches LLMs how to discover and use SuperCLI skills:\n\n1. List available skills:\n\n\`\`\`bash\nsupercli skills list --json\n\`\`\`\n\n2. Fetch a specific skill:\n\n\`\`\`bash\nsupercli skills get <namespace.resource.action> --format skill.md\n\`\`\`\n\n3. Parse YAML frontmatter to understand command, arguments, output schema, and metadata.\n\n4. Execute the command with validated arguments:\n\n\`\`\`bash\nsupercli <namespace> <resource> <action> --arg value --json\n\`\`\`\n\n5. For plugin discovery and remote plugin installs, use:\n\n\`\`\`bash\nsupercli skills get ${PLUGINS_USAGE_SKILL_ID} --format skill.md\n\`\`\`\n\n6. To index skills from a local directory (e.g., a project with docs/skills):\n\n\`\`\`bash\n# List current providers\nsupercli skills providers list --json\n\n# Add a local provider for a project\nsupercli skills providers add --name myproject --type local_fs --roots ./myproject/docs/skills\n\n# Sync the catalog to index new skills\nsupercli skills sync\n\n# Search skills from the new provider\nsupercli skills search <query> --provider myproject\n\n# Remove a provider if needed\nsupercli skills providers remove --name myproject\n\`\`\`\n\n# Examples\n\n\`\`\`bash\nsupercli skills teach --format skill.md\nsupercli skills teach --format skill.md --show-dag\nsupercli skills providers add --name myproject --type local_fs --roots ./myproject/docs/skills\nsupercli skills sync\nsupercli skills search btc --provider myproject\n\`\`\``
180
+ }
181
+
182
+ function buildPluginsUsageSkillMarkdown(options = {}) {
183
+ const includeDag = !!options.showDag
184
+ const frontmatter = {
185
+ skill_name: "plugins_registry_usage",
186
+ description: "Explains plugin discovery from plugins/plugins.json and local/remote plugin installation flows.",
187
+ command: `skills get ${PLUGINS_USAGE_SKILL_ID}`,
188
+ arguments: [
189
+ {
190
+ name: "format",
191
+ type: "string",
192
+ required: false,
193
+ description: "Output format, default skill.md"
194
+ },
195
+ {
196
+ name: "show-dag",
197
+ type: "boolean",
198
+ required: false,
199
+ description: "Include internal DAG for agent reasoning"
200
+ }
201
+ ],
202
+ output_schema: {
203
+ instruction: "string",
204
+ examples: "array"
205
+ },
206
+ metadata: {
207
+ side_effects: false,
208
+ risk_level: "safe",
209
+ dag_supported: true
210
+ }
211
+ }
212
+
213
+ if (includeDag) {
214
+ frontmatter.dag = [
215
+ { id: 1, type: "load_plugin_registry" },
216
+ { id: 2, type: "resolve_install_method", depends_on: [1] },
217
+ { id: 3, type: "emit_plugin_usage_instructions", depends_on: [2] }
218
+ ]
219
+ }
220
+
221
+ return `---\n${renderYamlObject(frontmatter)}\n---\n\n# Instruction\n\nUse this workflow for plugin discovery and installation:\n\n1. Explore registry metadata (name/description/tags):\n\n\`\`\`bash\nsupercli plugins explore --json\nsupercli plugins explore --name commiat --json\nsupercli plugins explore --tags git,ai --json\n\`\`\`\n\n2. Install by registry name:\n\n\`\`\`bash\nsupercli plugins install commiat --json\n\`\`\`\n\n3. Install directly from a remote git repository:\n\n\`\`\`bash\nsupercli plugins install --git https://github.com/org/repo.git --manifest-path plugins/supercli/plugin.json --ref main --json\n\`\`\`\n\n4. Validate installed plugin health and guidance:\n\n\`\`\`bash\nsupercli plugins doctor commiat --json\nsupercli plugins show commiat --json\n\`\`\`\n\n5. Use the namespace command exposed by the plugin.\n\n# Examples\n\n\`\`\`bash\nsupercli skills get ${PLUGINS_USAGE_SKILL_ID} --format skill.md\nsupercli skills get ${PLUGINS_USAGE_SKILL_ID} --format skill.md --show-dag\n\`\`\``
167
222
  }
168
223
 
169
224
  function listSkillsMetadata(config) {
170
- return (config.commands || []).map(cmd => ({
225
+ const commandSkills = (config.commands || []).map(cmd => ({
171
226
  name: `${cmd.namespace}.${cmd.resource}.${cmd.action}`,
172
227
  description: cmd.description || ""
173
228
  }))
229
+ commandSkills.push({
230
+ name: PLUGINS_USAGE_SKILL_ID,
231
+ description: "Discover and install plugins from the registry or remote git repos"
232
+ })
233
+ return commandSkills
174
234
  }
175
235
 
176
236
  function handleSkillsCommand(options) {
@@ -178,8 +238,102 @@ function handleSkillsCommand(options) {
178
238
  const subcommand = positional[1]
179
239
  const format = flags.format || "skill.md"
180
240
 
241
+ if (subcommand === "providers") {
242
+ const action = positional[2]
243
+ if (action === "list") {
244
+ const providers = listProviders()
245
+ if (humanMode && !flags.json) {
246
+ console.log("\n ⚡ Skill Providers\n")
247
+ outputHumanTable(providers, [
248
+ { key: "name", label: "Name" },
249
+ { key: "type", label: "Type" },
250
+ { key: "enabled", label: "Enabled" }
251
+ ])
252
+ console.log("")
253
+ } else {
254
+ output({ providers })
255
+ }
256
+ return true
257
+ }
258
+
259
+ if (action === "add") {
260
+ const name = flags.name || positional[3]
261
+ const type = flags.type || "local_fs"
262
+ const rootsRaw = flags.roots || flags.root
263
+ if (!name || !rootsRaw) {
264
+ outputError({ code: 85, type: "invalid_argument", message: "Usage: supercli skills providers add --name <provider> --roots <path1,path2> [--type local_fs|repo_fs]", recoverable: false })
265
+ return true
266
+ }
267
+ const roots = String(rootsRaw).split(",").map(r => r.trim()).filter(Boolean)
268
+ const provider = addProvider({ name, type, roots, enabled: flags.enabled !== "false" })
269
+ output({ ok: true, provider })
270
+ return true
271
+ }
272
+
273
+ if (action === "remove") {
274
+ const name = flags.name || positional[3]
275
+ if (!name) {
276
+ outputError({ code: 85, type: "invalid_argument", message: "Usage: supercli skills providers remove --name <provider>", recoverable: false })
277
+ return true
278
+ }
279
+ output({ ok: true, removed: removeProvider(name) })
280
+ return true
281
+ }
282
+
283
+ if (action === "show") {
284
+ const name = flags.name || positional[3]
285
+ if (!name) {
286
+ outputError({ code: 85, type: "invalid_argument", message: "Usage: supercli skills providers show --name <provider>", recoverable: false })
287
+ return true
288
+ }
289
+ const provider = getProvider(name)
290
+ if (!provider) {
291
+ outputError({ code: 92, type: "resource_not_found", message: `Provider '${name}' not found`, suggestions: ["Run: supercli skills providers list"] })
292
+ return true
293
+ }
294
+ output({ provider })
295
+ return true
296
+ }
297
+
298
+ outputError({ code: 85, type: "invalid_argument", message: "Unknown providers subcommand. Use: list, add, remove, show", recoverable: false })
299
+ return true
300
+ }
301
+
302
+ if (subcommand === "sync") {
303
+ const index = syncCatalog()
304
+ output({ ok: true, updated_at: index.updated_at, providers: index.providers, skills: index.skills.length })
305
+ return true
306
+ }
307
+
308
+ if (subcommand === "search") {
309
+ const query = flags.query || positional.slice(2).join(" ")
310
+ if (!query) {
311
+ outputError({ code: 85, type: "invalid_argument", message: "Usage: supercli skills search --query <text> [--provider <provider>]", recoverable: false })
312
+ return true
313
+ }
314
+ const skills = searchCatalog(query, { provider: flags.provider })
315
+ output({ skills })
316
+ return true
317
+ }
318
+
181
319
  if (subcommand === "list") {
182
- const skills = listSkillsMetadata(config)
320
+ const useCatalog = flags.catalog === true || flags.catalog === "true" || !!flags.provider
321
+ if (flags["no-catalog"] || flags.catalog === false || flags.catalog === "false" || !useCatalog) {
322
+ const skills = listSkillsMetadata(config)
323
+ if (humanMode && !flags.json) {
324
+ console.log("\n ⚡ Skills (command-level only)\n")
325
+ outputHumanTable(skills, [
326
+ { key: "name", label: "Name" },
327
+ { key: "description", label: "Description" }
328
+ ])
329
+ console.log("")
330
+ } else {
331
+ output({ skills })
332
+ }
333
+ return true
334
+ }
335
+
336
+ const skills = listCatalogSkills({ provider: flags.provider })
183
337
  if (humanMode && !flags.json) {
184
338
  console.log("\n ⚡ Skills\n")
185
339
  outputHumanTable(skills, [
@@ -188,7 +342,8 @@ function handleSkillsCommand(options) {
188
342
  ])
189
343
  console.log("")
190
344
  } else {
191
- output({ skills })
345
+ const index = readIndex() || {}
346
+ output({ skills, index: { updated_at: index.updated_at || null } })
192
347
  }
193
348
  return true
194
349
  }
@@ -208,6 +363,17 @@ function handleSkillsCommand(options) {
208
363
  return true
209
364
  }
210
365
 
366
+ const skillId = positional[2] || ""
367
+ if (skillId.includes(":")) {
368
+ const skill = getCatalogSkill(skillId)
369
+ if (!skill) {
370
+ outputError({ code: 92, type: "resource_not_found", message: `Skill ${skillId} not found in local catalog`, suggestions: ["Run: supercli skills sync", "Run: supercli skills list --catalog --json"] })
371
+ return true
372
+ }
373
+ console.log(skill.markdown)
374
+ return true
375
+ }
376
+
211
377
  const dottedId = positional[2] || (positional[3] && positional[4] ? `${positional[2]}.${positional[3]}.${positional[4]}` : "")
212
378
  const parsed = normalizeSkillId(dottedId)
213
379
  if (!parsed) {
@@ -215,6 +381,11 @@ function handleSkillsCommand(options) {
215
381
  return true
216
382
  }
217
383
 
384
+ if (parsed.id === PLUGINS_USAGE_SKILL_ID) {
385
+ console.log(buildPluginsUsageSkillMarkdown({ showDag: !!flags["show-dag"] }))
386
+ return true
387
+ }
388
+
218
389
  const cmd = config.commands.find(c =>
219
390
  c.namespace === parsed.namespace && c.resource === parsed.resource && c.action === parsed.action
220
391
  )
@@ -227,14 +398,17 @@ function handleSkillsCommand(options) {
227
398
  return true
228
399
  }
229
400
 
230
- outputError({ code: 85, type: "invalid_argument", message: "Unknown skills subcommand. Use: list, get, teach", recoverable: false })
401
+ outputError({ code: 85, type: "invalid_argument", message: "Unknown skills subcommand. Use: list, get, teach, sync, search, providers", recoverable: false })
231
402
  return true
232
403
  }
233
404
 
234
405
  module.exports = {
406
+ PLUGINS_USAGE_SKILL_ID,
235
407
  normalizeSkillId,
236
408
  buildCommandSkillMarkdown,
237
409
  buildTeachSkillMarkdown,
410
+ buildPluginsUsageSkillMarkdown,
238
411
  listSkillsMetadata,
239
- handleSkillsCommand
412
+ handleSkillsCommand,
413
+ renderYamlObject // Export for testing coverage
240
414
  }