@mycelish/cli 0.1.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 (418) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/init-auto.test.d.ts +2 -0
  3. package/dist/__tests__/init-auto.test.d.ts.map +1 -0
  4. package/dist/__tests__/init-auto.test.js +60 -0
  5. package/dist/__tests__/init-auto.test.js.map +1 -0
  6. package/dist/commands/add.d.ts +20 -0
  7. package/dist/commands/add.d.ts.map +1 -0
  8. package/dist/commands/add.js +99 -0
  9. package/dist/commands/add.js.map +1 -0
  10. package/dist/commands/add.test.d.ts +25 -0
  11. package/dist/commands/add.test.d.ts.map +1 -0
  12. package/dist/commands/add.test.js +574 -0
  13. package/dist/commands/add.test.js.map +1 -0
  14. package/dist/commands/disable.d.ts +33 -0
  15. package/dist/commands/disable.d.ts.map +1 -0
  16. package/dist/commands/disable.js +201 -0
  17. package/dist/commands/disable.js.map +1 -0
  18. package/dist/commands/disable.test.d.ts +6 -0
  19. package/dist/commands/disable.test.d.ts.map +1 -0
  20. package/dist/commands/disable.test.js +290 -0
  21. package/dist/commands/disable.test.js.map +1 -0
  22. package/dist/commands/doctor.d.ts +11 -0
  23. package/dist/commands/doctor.d.ts.map +1 -0
  24. package/dist/commands/doctor.js +33 -0
  25. package/dist/commands/doctor.js.map +1 -0
  26. package/dist/commands/doctor.test.d.ts +17 -0
  27. package/dist/commands/doctor.test.d.ts.map +1 -0
  28. package/dist/commands/doctor.test.js +691 -0
  29. package/dist/commands/doctor.test.js.map +1 -0
  30. package/dist/commands/enable.d.ts +33 -0
  31. package/dist/commands/enable.d.ts.map +1 -0
  32. package/dist/commands/enable.js +199 -0
  33. package/dist/commands/enable.js.map +1 -0
  34. package/dist/commands/enable.test.d.ts +6 -0
  35. package/dist/commands/enable.test.d.ts.map +1 -0
  36. package/dist/commands/enable.test.js +301 -0
  37. package/dist/commands/enable.test.js.map +1 -0
  38. package/dist/commands/health-checks/config-check.d.ts +34 -0
  39. package/dist/commands/health-checks/config-check.d.ts.map +1 -0
  40. package/dist/commands/health-checks/config-check.js +267 -0
  41. package/dist/commands/health-checks/config-check.js.map +1 -0
  42. package/dist/commands/health-checks/formatter.d.ts +13 -0
  43. package/dist/commands/health-checks/formatter.d.ts.map +1 -0
  44. package/dist/commands/health-checks/formatter.js +72 -0
  45. package/dist/commands/health-checks/formatter.js.map +1 -0
  46. package/dist/commands/health-checks/index.d.ts +8 -0
  47. package/dist/commands/health-checks/index.d.ts.map +1 -0
  48. package/dist/commands/health-checks/index.js +7 -0
  49. package/dist/commands/health-checks/index.js.map +1 -0
  50. package/dist/commands/health-checks/mcp-check.d.ts +9 -0
  51. package/dist/commands/health-checks/mcp-check.d.ts.map +1 -0
  52. package/dist/commands/health-checks/mcp-check.js +37 -0
  53. package/dist/commands/health-checks/mcp-check.js.map +1 -0
  54. package/dist/commands/health-checks/memory-check.d.ts +15 -0
  55. package/dist/commands/health-checks/memory-check.d.ts.map +1 -0
  56. package/dist/commands/health-checks/memory-check.js +92 -0
  57. package/dist/commands/health-checks/memory-check.js.map +1 -0
  58. package/dist/commands/health-checks/runner.d.ts +9 -0
  59. package/dist/commands/health-checks/runner.d.ts.map +1 -0
  60. package/dist/commands/health-checks/runner.js +74 -0
  61. package/dist/commands/health-checks/runner.js.map +1 -0
  62. package/dist/commands/health-checks/tool-version-check.d.ts +9 -0
  63. package/dist/commands/health-checks/tool-version-check.d.ts.map +1 -0
  64. package/dist/commands/health-checks/tool-version-check.js +35 -0
  65. package/dist/commands/health-checks/tool-version-check.js.map +1 -0
  66. package/dist/commands/health-checks/types.d.ts +16 -0
  67. package/dist/commands/health-checks/types.d.ts.map +1 -0
  68. package/dist/commands/health-checks/types.js +2 -0
  69. package/dist/commands/health-checks/types.js.map +1 -0
  70. package/dist/commands/init.d.ts +120 -0
  71. package/dist/commands/init.d.ts.map +1 -0
  72. package/dist/commands/init.js +436 -0
  73. package/dist/commands/init.js.map +1 -0
  74. package/dist/commands/init.test.d.ts +16 -0
  75. package/dist/commands/init.test.d.ts.map +1 -0
  76. package/dist/commands/init.test.js +286 -0
  77. package/dist/commands/init.test.js.map +1 -0
  78. package/dist/commands/marketplace.d.ts +13 -0
  79. package/dist/commands/marketplace.d.ts.map +1 -0
  80. package/dist/commands/marketplace.js +85 -0
  81. package/dist/commands/marketplace.js.map +1 -0
  82. package/dist/commands/marketplace.test.d.ts +2 -0
  83. package/dist/commands/marketplace.test.d.ts.map +1 -0
  84. package/dist/commands/marketplace.test.js +78 -0
  85. package/dist/commands/marketplace.test.js.map +1 -0
  86. package/dist/commands/migrate.d.ts +15 -0
  87. package/dist/commands/migrate.d.ts.map +1 -0
  88. package/dist/commands/migrate.js +179 -0
  89. package/dist/commands/migrate.js.map +1 -0
  90. package/dist/commands/migrate.test.d.ts +2 -0
  91. package/dist/commands/migrate.test.d.ts.map +1 -0
  92. package/dist/commands/migrate.test.js +109 -0
  93. package/dist/commands/migrate.test.js.map +1 -0
  94. package/dist/commands/preset.d.ts +11 -0
  95. package/dist/commands/preset.d.ts.map +1 -0
  96. package/dist/commands/preset.js +99 -0
  97. package/dist/commands/preset.js.map +1 -0
  98. package/dist/commands/preset.test.d.ts +2 -0
  99. package/dist/commands/preset.test.d.ts.map +1 -0
  100. package/dist/commands/preset.test.js +106 -0
  101. package/dist/commands/preset.test.js.map +1 -0
  102. package/dist/commands/remote.d.ts +9 -0
  103. package/dist/commands/remote.d.ts.map +1 -0
  104. package/dist/commands/remote.js +212 -0
  105. package/dist/commands/remote.js.map +1 -0
  106. package/dist/commands/remote.test.d.ts +2 -0
  107. package/dist/commands/remote.test.d.ts.map +1 -0
  108. package/dist/commands/remote.test.js +125 -0
  109. package/dist/commands/remote.test.js.map +1 -0
  110. package/dist/commands/remove.d.ts +34 -0
  111. package/dist/commands/remove.d.ts.map +1 -0
  112. package/dist/commands/remove.js +296 -0
  113. package/dist/commands/remove.js.map +1 -0
  114. package/dist/commands/remove.test.d.ts +2 -0
  115. package/dist/commands/remove.test.d.ts.map +1 -0
  116. package/dist/commands/remove.test.js +109 -0
  117. package/dist/commands/remove.test.js.map +1 -0
  118. package/dist/commands/serve.d.ts +3 -0
  119. package/dist/commands/serve.d.ts.map +1 -0
  120. package/dist/commands/serve.js +29 -0
  121. package/dist/commands/serve.js.map +1 -0
  122. package/dist/commands/serve.test.d.ts +2 -0
  123. package/dist/commands/serve.test.d.ts.map +1 -0
  124. package/dist/commands/serve.test.js +74 -0
  125. package/dist/commands/serve.test.js.map +1 -0
  126. package/dist/commands/status.d.ts +49 -0
  127. package/dist/commands/status.d.ts.map +1 -0
  128. package/dist/commands/status.js +272 -0
  129. package/dist/commands/status.js.map +1 -0
  130. package/dist/commands/status.test.d.ts +11 -0
  131. package/dist/commands/status.test.d.ts.map +1 -0
  132. package/dist/commands/status.test.js +334 -0
  133. package/dist/commands/status.test.js.map +1 -0
  134. package/dist/commands/sync.d.ts +38 -0
  135. package/dist/commands/sync.d.ts.map +1 -0
  136. package/dist/commands/sync.js +286 -0
  137. package/dist/commands/sync.js.map +1 -0
  138. package/dist/commands/sync.test.d.ts +6 -0
  139. package/dist/commands/sync.test.d.ts.map +1 -0
  140. package/dist/commands/sync.test.js +341 -0
  141. package/dist/commands/sync.test.js.map +1 -0
  142. package/dist/commands/teams.d.ts +18 -0
  143. package/dist/commands/teams.d.ts.map +1 -0
  144. package/dist/commands/teams.js +68 -0
  145. package/dist/commands/teams.js.map +1 -0
  146. package/dist/commands/teams.test.d.ts +2 -0
  147. package/dist/commands/teams.test.d.ts.map +1 -0
  148. package/dist/commands/teams.test.js +94 -0
  149. package/dist/commands/teams.test.js.map +1 -0
  150. package/dist/core/adapter-base.d.ts +51 -0
  151. package/dist/core/adapter-base.d.ts.map +1 -0
  152. package/dist/core/adapter-base.js +89 -0
  153. package/dist/core/adapter-base.js.map +1 -0
  154. package/dist/core/add-helpers.d.ts +55 -0
  155. package/dist/core/add-helpers.d.ts.map +1 -0
  156. package/dist/core/add-helpers.js +273 -0
  157. package/dist/core/add-helpers.js.map +1 -0
  158. package/dist/core/agent-teams.d.ts +10 -0
  159. package/dist/core/agent-teams.d.ts.map +1 -0
  160. package/dist/core/agent-teams.js +40 -0
  161. package/dist/core/agent-teams.js.map +1 -0
  162. package/dist/core/agent-teams.test.d.ts +2 -0
  163. package/dist/core/agent-teams.test.d.ts.map +1 -0
  164. package/dist/core/agent-teams.test.js +64 -0
  165. package/dist/core/agent-teams.test.js.map +1 -0
  166. package/dist/core/auto-adapter.d.ts +27 -0
  167. package/dist/core/auto-adapter.d.ts.map +1 -0
  168. package/dist/core/auto-adapter.js +324 -0
  169. package/dist/core/auto-adapter.js.map +1 -0
  170. package/dist/core/auto-adapter.test.d.ts +2 -0
  171. package/dist/core/auto-adapter.test.d.ts.map +1 -0
  172. package/dist/core/auto-adapter.test.js +125 -0
  173. package/dist/core/auto-adapter.test.js.map +1 -0
  174. package/dist/core/config-merger.d.ts +33 -0
  175. package/dist/core/config-merger.d.ts.map +1 -0
  176. package/dist/core/config-merger.js +238 -0
  177. package/dist/core/config-merger.js.map +1 -0
  178. package/dist/core/config-merger.test.d.ts +10 -0
  179. package/dist/core/config-merger.test.d.ts.map +1 -0
  180. package/dist/core/config-merger.test.js +406 -0
  181. package/dist/core/config-merger.test.js.map +1 -0
  182. package/dist/core/conflict-detector.d.ts +23 -0
  183. package/dist/core/conflict-detector.d.ts.map +1 -0
  184. package/dist/core/conflict-detector.js +58 -0
  185. package/dist/core/conflict-detector.js.map +1 -0
  186. package/dist/core/conflict-detector.test.d.ts +2 -0
  187. package/dist/core/conflict-detector.test.d.ts.map +1 -0
  188. package/dist/core/conflict-detector.test.js +40 -0
  189. package/dist/core/conflict-detector.test.js.map +1 -0
  190. package/dist/core/env-template.d.ts +22 -0
  191. package/dist/core/env-template.d.ts.map +1 -0
  192. package/dist/core/env-template.js +125 -0
  193. package/dist/core/env-template.js.map +1 -0
  194. package/dist/core/env-template.test.d.ts +2 -0
  195. package/dist/core/env-template.test.d.ts.map +1 -0
  196. package/dist/core/env-template.test.js +145 -0
  197. package/dist/core/env-template.test.js.map +1 -0
  198. package/dist/core/fs-helpers.d.ts +8 -0
  199. package/dist/core/fs-helpers.d.ts.map +1 -0
  200. package/dist/core/fs-helpers.js +26 -0
  201. package/dist/core/fs-helpers.js.map +1 -0
  202. package/dist/core/fs-helpers.test.d.ts +2 -0
  203. package/dist/core/fs-helpers.test.d.ts.map +1 -0
  204. package/dist/core/fs-helpers.test.js +51 -0
  205. package/dist/core/fs-helpers.test.js.map +1 -0
  206. package/dist/core/machine-overrides.d.ts +13 -0
  207. package/dist/core/machine-overrides.d.ts.map +1 -0
  208. package/dist/core/machine-overrides.js +155 -0
  209. package/dist/core/machine-overrides.js.map +1 -0
  210. package/dist/core/machine-overrides.test.d.ts +2 -0
  211. package/dist/core/machine-overrides.test.d.ts.map +1 -0
  212. package/dist/core/machine-overrides.test.js +160 -0
  213. package/dist/core/machine-overrides.test.js.map +1 -0
  214. package/dist/core/marketplace-registry.d.ts +14 -0
  215. package/dist/core/marketplace-registry.d.ts.map +1 -0
  216. package/dist/core/marketplace-registry.js +215 -0
  217. package/dist/core/marketplace-registry.js.map +1 -0
  218. package/dist/core/marketplace-registry.test.d.ts +2 -0
  219. package/dist/core/marketplace-registry.test.d.ts.map +1 -0
  220. package/dist/core/marketplace-registry.test.js +232 -0
  221. package/dist/core/marketplace-registry.test.js.map +1 -0
  222. package/dist/core/marketplace-sources.d.ts +39 -0
  223. package/dist/core/marketplace-sources.d.ts.map +1 -0
  224. package/dist/core/marketplace-sources.js +199 -0
  225. package/dist/core/marketplace-sources.js.map +1 -0
  226. package/dist/core/marketplace.d.ts +18 -0
  227. package/dist/core/marketplace.d.ts.map +1 -0
  228. package/dist/core/marketplace.js +211 -0
  229. package/dist/core/marketplace.js.map +1 -0
  230. package/dist/core/marketplace.test.d.ts +2 -0
  231. package/dist/core/marketplace.test.d.ts.map +1 -0
  232. package/dist/core/marketplace.test.js +177 -0
  233. package/dist/core/marketplace.test.js.map +1 -0
  234. package/dist/core/mcp-injector.d.ts +43 -0
  235. package/dist/core/mcp-injector.d.ts.map +1 -0
  236. package/dist/core/mcp-injector.js +164 -0
  237. package/dist/core/mcp-injector.js.map +1 -0
  238. package/dist/core/mcp-injector.test.d.ts +6 -0
  239. package/dist/core/mcp-injector.test.d.ts.map +1 -0
  240. package/dist/core/mcp-injector.test.js +315 -0
  241. package/dist/core/mcp-injector.test.js.map +1 -0
  242. package/dist/core/mcp-registry.d.ts +17 -0
  243. package/dist/core/mcp-registry.d.ts.map +1 -0
  244. package/dist/core/mcp-registry.js +52 -0
  245. package/dist/core/mcp-registry.js.map +1 -0
  246. package/dist/core/mcp-registry.test.d.ts +2 -0
  247. package/dist/core/mcp-registry.test.d.ts.map +1 -0
  248. package/dist/core/mcp-registry.test.js +78 -0
  249. package/dist/core/mcp-registry.test.js.map +1 -0
  250. package/dist/core/mcp-router.d.ts +21 -0
  251. package/dist/core/mcp-router.d.ts.map +1 -0
  252. package/dist/core/mcp-router.js +67 -0
  253. package/dist/core/mcp-router.js.map +1 -0
  254. package/dist/core/mcp-router.test.d.ts +2 -0
  255. package/dist/core/mcp-router.test.d.ts.map +1 -0
  256. package/dist/core/mcp-router.test.js +40 -0
  257. package/dist/core/mcp-router.test.js.map +1 -0
  258. package/dist/core/memory-scoper.d.ts +43 -0
  259. package/dist/core/memory-scoper.d.ts.map +1 -0
  260. package/dist/core/memory-scoper.js +165 -0
  261. package/dist/core/memory-scoper.js.map +1 -0
  262. package/dist/core/memory-scoper.test.d.ts +6 -0
  263. package/dist/core/memory-scoper.test.d.ts.map +1 -0
  264. package/dist/core/memory-scoper.test.js +467 -0
  265. package/dist/core/memory-scoper.test.js.map +1 -0
  266. package/dist/core/migrator/executor.d.ts +9 -0
  267. package/dist/core/migrator/executor.d.ts.map +1 -0
  268. package/dist/core/migrator/executor.js +233 -0
  269. package/dist/core/migrator/executor.js.map +1 -0
  270. package/dist/core/migrator/index.d.ts +8 -0
  271. package/dist/core/migrator/index.d.ts.map +1 -0
  272. package/dist/core/migrator/index.js +12 -0
  273. package/dist/core/migrator/index.js.map +1 -0
  274. package/dist/core/migrator/manifest.d.ts +8 -0
  275. package/dist/core/migrator/manifest.d.ts.map +1 -0
  276. package/dist/core/migrator/manifest.js +83 -0
  277. package/dist/core/migrator/manifest.js.map +1 -0
  278. package/dist/core/migrator/planner.d.ts +6 -0
  279. package/dist/core/migrator/planner.d.ts.map +1 -0
  280. package/dist/core/migrator/planner.js +112 -0
  281. package/dist/core/migrator/planner.js.map +1 -0
  282. package/dist/core/migrator/scanners.d.ts +19 -0
  283. package/dist/core/migrator/scanners.d.ts.map +1 -0
  284. package/dist/core/migrator/scanners.js +612 -0
  285. package/dist/core/migrator/scanners.js.map +1 -0
  286. package/dist/core/migrator/scanners.test.d.ts +2 -0
  287. package/dist/core/migrator/scanners.test.d.ts.map +1 -0
  288. package/dist/core/migrator/scanners.test.js +257 -0
  289. package/dist/core/migrator/scanners.test.js.map +1 -0
  290. package/dist/core/migrator.test.d.ts +2 -0
  291. package/dist/core/migrator.test.d.ts.map +1 -0
  292. package/dist/core/migrator.test.js +451 -0
  293. package/dist/core/migrator.test.js.map +1 -0
  294. package/dist/core/plugin-scanner.d.ts +30 -0
  295. package/dist/core/plugin-scanner.d.ts.map +1 -0
  296. package/dist/core/plugin-scanner.js +174 -0
  297. package/dist/core/plugin-scanner.js.map +1 -0
  298. package/dist/core/plugin-scanner.test.d.ts +2 -0
  299. package/dist/core/plugin-scanner.test.d.ts.map +1 -0
  300. package/dist/core/plugin-scanner.test.js +279 -0
  301. package/dist/core/plugin-scanner.test.js.map +1 -0
  302. package/dist/core/presets.d.ts +55 -0
  303. package/dist/core/presets.d.ts.map +1 -0
  304. package/dist/core/presets.js +84 -0
  305. package/dist/core/presets.js.map +1 -0
  306. package/dist/core/presets.test.d.ts +2 -0
  307. package/dist/core/presets.test.d.ts.map +1 -0
  308. package/dist/core/presets.test.js +40 -0
  309. package/dist/core/presets.test.js.map +1 -0
  310. package/dist/core/skill-parser.d.ts +21 -0
  311. package/dist/core/skill-parser.d.ts.map +1 -0
  312. package/dist/core/skill-parser.js +53 -0
  313. package/dist/core/skill-parser.js.map +1 -0
  314. package/dist/core/skill-parser.test.d.ts +2 -0
  315. package/dist/core/skill-parser.test.d.ts.map +1 -0
  316. package/dist/core/skill-parser.test.js +83 -0
  317. package/dist/core/skill-parser.test.js.map +1 -0
  318. package/dist/core/smart-memory.d.ts +22 -0
  319. package/dist/core/smart-memory.d.ts.map +1 -0
  320. package/dist/core/smart-memory.js +72 -0
  321. package/dist/core/smart-memory.js.map +1 -0
  322. package/dist/core/smart-memory.test.d.ts +2 -0
  323. package/dist/core/smart-memory.test.d.ts.map +1 -0
  324. package/dist/core/smart-memory.test.js +114 -0
  325. package/dist/core/smart-memory.test.js.map +1 -0
  326. package/dist/core/snapshot.d.ts +6 -0
  327. package/dist/core/snapshot.d.ts.map +1 -0
  328. package/dist/core/snapshot.js +179 -0
  329. package/dist/core/snapshot.js.map +1 -0
  330. package/dist/core/snapshot.test.d.ts +2 -0
  331. package/dist/core/snapshot.test.d.ts.map +1 -0
  332. package/dist/core/snapshot.test.js +132 -0
  333. package/dist/core/snapshot.test.js.map +1 -0
  334. package/dist/core/symlink-manager.d.ts +78 -0
  335. package/dist/core/symlink-manager.d.ts.map +1 -0
  336. package/dist/core/symlink-manager.js +227 -0
  337. package/dist/core/symlink-manager.js.map +1 -0
  338. package/dist/core/symlink-manager.test.d.ts +8 -0
  339. package/dist/core/symlink-manager.test.d.ts.map +1 -0
  340. package/dist/core/symlink-manager.test.js +354 -0
  341. package/dist/core/symlink-manager.test.js.map +1 -0
  342. package/dist/core/sync-writer.d.ts +20 -0
  343. package/dist/core/sync-writer.d.ts.map +1 -0
  344. package/dist/core/sync-writer.js +150 -0
  345. package/dist/core/sync-writer.js.map +1 -0
  346. package/dist/core/sync-writer.test.d.ts +2 -0
  347. package/dist/core/sync-writer.test.d.ts.map +1 -0
  348. package/dist/core/sync-writer.test.js +134 -0
  349. package/dist/core/sync-writer.test.js.map +1 -0
  350. package/dist/core/toml-helpers.d.ts +9 -0
  351. package/dist/core/toml-helpers.d.ts.map +1 -0
  352. package/dist/core/toml-helpers.js +33 -0
  353. package/dist/core/toml-helpers.js.map +1 -0
  354. package/dist/core/tool-adapter.d.ts +24 -0
  355. package/dist/core/tool-adapter.d.ts.map +1 -0
  356. package/dist/core/tool-adapter.js +156 -0
  357. package/dist/core/tool-adapter.js.map +1 -0
  358. package/dist/core/tool-adapter.test.d.ts +2 -0
  359. package/dist/core/tool-adapter.test.d.ts.map +1 -0
  360. package/dist/core/tool-adapter.test.js +264 -0
  361. package/dist/core/tool-adapter.test.js.map +1 -0
  362. package/dist/core/tool-detector.d.ts +31 -0
  363. package/dist/core/tool-detector.d.ts.map +1 -0
  364. package/dist/core/tool-detector.js +67 -0
  365. package/dist/core/tool-detector.js.map +1 -0
  366. package/dist/core/tool-detector.test.d.ts +2 -0
  367. package/dist/core/tool-detector.test.d.ts.map +1 -0
  368. package/dist/core/tool-detector.test.js +126 -0
  369. package/dist/core/tool-detector.test.js.map +1 -0
  370. package/dist/core/watcher.d.ts +22 -0
  371. package/dist/core/watcher.d.ts.map +1 -0
  372. package/dist/core/watcher.js +68 -0
  373. package/dist/core/watcher.js.map +1 -0
  374. package/dist/core/watcher.test.d.ts +2 -0
  375. package/dist/core/watcher.test.d.ts.map +1 -0
  376. package/dist/core/watcher.test.js +26 -0
  377. package/dist/core/watcher.test.js.map +1 -0
  378. package/dist/index.d.ts +9 -0
  379. package/dist/index.d.ts.map +1 -0
  380. package/dist/index.js +47 -0
  381. package/dist/index.js.map +1 -0
  382. package/dist/routes/async-handler.d.ts +6 -0
  383. package/dist/routes/async-handler.d.ts.map +1 -0
  384. package/dist/routes/async-handler.js +9 -0
  385. package/dist/routes/async-handler.js.map +1 -0
  386. package/dist/routes/marketplace.d.ts +3 -0
  387. package/dist/routes/marketplace.d.ts.map +1 -0
  388. package/dist/routes/marketplace.js +51 -0
  389. package/dist/routes/marketplace.js.map +1 -0
  390. package/dist/routes/migrate.d.ts +3 -0
  391. package/dist/routes/migrate.d.ts.map +1 -0
  392. package/dist/routes/migrate.js +22 -0
  393. package/dist/routes/migrate.js.map +1 -0
  394. package/dist/routes/plugin-map.d.ts +11 -0
  395. package/dist/routes/plugin-map.d.ts.map +1 -0
  396. package/dist/routes/plugin-map.js +37 -0
  397. package/dist/routes/plugin-map.js.map +1 -0
  398. package/dist/routes/plugins.d.ts +3 -0
  399. package/dist/routes/plugins.d.ts.map +1 -0
  400. package/dist/routes/plugins.js +51 -0
  401. package/dist/routes/plugins.js.map +1 -0
  402. package/dist/routes/remove.d.ts +3 -0
  403. package/dist/routes/remove.d.ts.map +1 -0
  404. package/dist/routes/remove.js +27 -0
  405. package/dist/routes/remove.js.map +1 -0
  406. package/dist/routes/state.d.ts +3 -0
  407. package/dist/routes/state.d.ts.map +1 -0
  408. package/dist/routes/state.js +177 -0
  409. package/dist/routes/state.js.map +1 -0
  410. package/dist/routes/sync.d.ts +3 -0
  411. package/dist/routes/sync.d.ts.map +1 -0
  412. package/dist/routes/sync.js +12 -0
  413. package/dist/routes/sync.js.map +1 -0
  414. package/dist/server.d.ts +4 -0
  415. package/dist/server.d.ts.map +1 -0
  416. package/dist/server.js +59 -0
  417. package/dist/server.js.map +1 -0
  418. package/package.json +48 -0
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Plugin Scanner — scans plugin cache dirs for all component types.
3
+ *
4
+ * Convention-based with manifest enrichment (Approach D):
5
+ * 1. Read plugin.json for metadata (name, version, description)
6
+ * 2. Scan well-known dirs: skills/, agents/, commands/, hooks/, lib/
7
+ * 3. Return unified PluginComponent[] for each plugin
8
+ */
9
+ import * as fs from "node:fs/promises";
10
+ import * as path from "node:path";
11
+ import { readFileIfExists } from "./fs-helpers.js";
12
+ const COMPONENT_RULES = [
13
+ { dir: "skills", type: "skill", pattern: /SKILL\.md$/, nameFrom: "parent-dir" },
14
+ { dir: "agents", type: "agent", pattern: /\.md$/, nameFrom: "filename" },
15
+ { dir: "commands", type: "command", pattern: /\.md$/, nameFrom: "filename" },
16
+ { dir: "hooks", type: "hook", pattern: /\.(sh|cmd|js|json)$/, nameFrom: "filename" },
17
+ { dir: "lib", type: "lib", pattern: /\.(js|ts)$/, nameFrom: "filename" },
18
+ ];
19
+ // ============================================================================
20
+ // Scan helpers
21
+ // ============================================================================
22
+ async function scanDir(dir, pattern) {
23
+ const results = [];
24
+ try {
25
+ const entries = await fs.readdir(dir, { withFileTypes: true });
26
+ for (const entry of entries) {
27
+ const full = path.join(dir, entry.name);
28
+ if (entry.isDirectory()) {
29
+ const sub = await scanDir(full, pattern);
30
+ results.push(...sub);
31
+ }
32
+ else if (pattern.test(entry.name)) {
33
+ results.push(full);
34
+ }
35
+ }
36
+ }
37
+ catch {
38
+ // dir doesn't exist
39
+ }
40
+ return results;
41
+ }
42
+ function nameFromPath(filePath, mode) {
43
+ if (mode === "parent-dir") {
44
+ return path.basename(path.dirname(filePath));
45
+ }
46
+ return path.basename(filePath, path.extname(filePath));
47
+ }
48
+ async function readDescription(filePath) {
49
+ if (!filePath.endsWith(".md"))
50
+ return undefined;
51
+ const content = await readFileIfExists(filePath);
52
+ if (!content)
53
+ return undefined;
54
+ // Try frontmatter description
55
+ const fmMatch = content.match(/^---\s*\n[\s\S]*?description:\s*"?([^"\n]+)"?\s*\n[\s\S]*?---/);
56
+ if (fmMatch)
57
+ return fmMatch[1].trim();
58
+ // Fall back to first non-empty, non-heading line
59
+ const lines = content.split("\n");
60
+ for (const line of lines) {
61
+ const trimmed = line.trim();
62
+ if (trimmed && !trimmed.startsWith("#") && !trimmed.startsWith("---")) {
63
+ return trimmed.slice(0, 120);
64
+ }
65
+ }
66
+ return undefined;
67
+ }
68
+ // ============================================================================
69
+ // Public API
70
+ // ============================================================================
71
+ /**
72
+ * Read plugin.json from a plugin root to get metadata.
73
+ * Looks in `.claude-plugin/plugin.json` (Claude Code convention) and root `plugin.json`.
74
+ */
75
+ export async function readPluginManifest(pluginRoot) {
76
+ for (const candidate of [
77
+ path.join(pluginRoot, ".claude-plugin", "plugin.json"),
78
+ path.join(pluginRoot, "plugin.json"),
79
+ ]) {
80
+ const raw = await readFileIfExists(candidate);
81
+ if (raw) {
82
+ try {
83
+ const parsed = JSON.parse(raw);
84
+ return {
85
+ name: parsed.name ?? path.basename(pluginRoot),
86
+ version: parsed.version ?? "",
87
+ description: parsed.description,
88
+ author: parsed.author?.name ?? parsed.author,
89
+ components: [], // filled by scanPluginComponents
90
+ };
91
+ }
92
+ catch {
93
+ // invalid JSON
94
+ }
95
+ }
96
+ }
97
+ return null;
98
+ }
99
+ /**
100
+ * Scan a plugin directory for all component types.
101
+ * Works with convention dirs (skills/, agents/, commands/, hooks/, lib/).
102
+ */
103
+ export async function scanPluginComponents(pluginRoot, pluginName, marketplace) {
104
+ const components = [];
105
+ const name = pluginName ?? path.basename(pluginRoot);
106
+ for (const rule of COMPONENT_RULES) {
107
+ const dir = path.join(pluginRoot, rule.dir);
108
+ const files = await scanDir(dir, rule.pattern);
109
+ for (const filePath of files) {
110
+ const componentName = nameFromPath(filePath, rule.nameFrom);
111
+ const description = await readDescription(filePath);
112
+ components.push({
113
+ name: componentName,
114
+ type: rule.type,
115
+ path: filePath,
116
+ description,
117
+ pluginName: name,
118
+ marketplace,
119
+ });
120
+ }
121
+ }
122
+ return components;
123
+ }
124
+ /**
125
+ * Scan the entire Claude Code plugin cache and return all components
126
+ * from all installed plugins.
127
+ *
128
+ * Cache structure: ~/.claude/plugins/cache/{marketplace}/{plugin}/{version}/
129
+ */
130
+ export async function scanPluginCache(cacheDir) {
131
+ const allComponents = [];
132
+ try {
133
+ const marketplaces = await fs.readdir(cacheDir, { withFileTypes: true });
134
+ for (const mp of marketplaces) {
135
+ if (!mp.isDirectory())
136
+ continue;
137
+ const mpDir = path.join(cacheDir, mp.name);
138
+ try {
139
+ const plugins = await fs.readdir(mpDir, { withFileTypes: true });
140
+ for (const plugin of plugins) {
141
+ if (!plugin.isDirectory())
142
+ continue;
143
+ const pluginDir = path.join(mpDir, plugin.name);
144
+ // Find latest version dir
145
+ try {
146
+ const versions = await fs.readdir(pluginDir, { withFileTypes: true });
147
+ const versionDirs = versions.filter((v) => v.isDirectory()).map((v) => v.name).sort();
148
+ const latestVersion = versionDirs[versionDirs.length - 1];
149
+ if (!latestVersion)
150
+ continue;
151
+ const versionRoot = path.join(pluginDir, latestVersion);
152
+ const components = await scanPluginComponents(versionRoot, plugin.name, mp.name);
153
+ allComponents.push(...components);
154
+ }
155
+ catch {
156
+ // can't read versions
157
+ }
158
+ }
159
+ }
160
+ catch {
161
+ // can't read plugins
162
+ }
163
+ }
164
+ }
165
+ catch {
166
+ // cache dir doesn't exist
167
+ }
168
+ return allComponents;
169
+ }
170
+ /** Get well-known component rules (for testing/introspection) */
171
+ export function getComponentRules() {
172
+ return COMPONENT_RULES;
173
+ }
174
+ //# sourceMappingURL=plugin-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-scanner.js","sourceRoot":"","sources":["../../src/core/plugin-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin-scanner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-scanner.test.d.ts","sourceRoot":"","sources":["../../src/core/plugin-scanner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Tests for Plugin Scanner — convention-based component detection
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
5
+ import * as fs from "node:fs/promises";
6
+ import * as path from "node:path";
7
+ import * as os from "node:os";
8
+ import { scanPluginComponents, scanPluginCache, readPluginManifest, getComponentRules } from "./plugin-scanner.js";
9
+ // Use a temp dir to simulate plugin structures
10
+ let tmpDir;
11
+ beforeEach(async () => {
12
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "mycelium-plugin-test-"));
13
+ });
14
+ afterEach(async () => {
15
+ await fs.rm(tmpDir, { recursive: true, force: true });
16
+ });
17
+ // ============================================================================
18
+ // Helpers
19
+ // ============================================================================
20
+ async function mkdirpAndWrite(filePath, content) {
21
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
22
+ await fs.writeFile(filePath, content, "utf-8");
23
+ }
24
+ async function createSuperpowersPlugin(root) {
25
+ // plugin.json
26
+ await mkdirpAndWrite(path.join(root, ".claude-plugin", "plugin.json"), JSON.stringify({ name: "superpowers", version: "4.2.0", description: "Core skills library" }));
27
+ // skills
28
+ await mkdirpAndWrite(path.join(root, "skills", "brainstorming", "SKILL.md"), '---\nname: brainstorming\ndescription: "Explore ideas before coding"\n---\n# Brainstorming');
29
+ await mkdirpAndWrite(path.join(root, "skills", "tdd", "SKILL.md"), "---\nname: tdd\n---\n# TDD");
30
+ // agents
31
+ await mkdirpAndWrite(path.join(root, "agents", "code-reviewer.md"), "# Code Reviewer\nReviews completed milestones against plan");
32
+ // commands
33
+ await mkdirpAndWrite(path.join(root, "commands", "brainstorm.md"), "---\ndescription: Start brainstorming\n---\nInvoke brainstorming skill");
34
+ await mkdirpAndWrite(path.join(root, "commands", "write-plan.md"), "# Write Plan\nCreate implementation plan");
35
+ // hooks
36
+ await mkdirpAndWrite(path.join(root, "hooks", "session-start.sh"), "#!/bin/bash\necho hello");
37
+ await mkdirpAndWrite(path.join(root, "hooks", "hooks.json"), '{"hooks":{"SessionStart":[{"matcher":"startup"}]}}');
38
+ // lib
39
+ await mkdirpAndWrite(path.join(root, "lib", "skills-core.js"), "module.exports = {};");
40
+ }
41
+ // ============================================================================
42
+ // getComponentRules
43
+ // ============================================================================
44
+ describe("getComponentRules", () => {
45
+ it("returns rules for all 5 component types", () => {
46
+ const rules = getComponentRules();
47
+ const types = rules.map((r) => r.type);
48
+ expect(types).toContain("skill");
49
+ expect(types).toContain("agent");
50
+ expect(types).toContain("command");
51
+ expect(types).toContain("hook");
52
+ expect(types).toContain("lib");
53
+ });
54
+ });
55
+ // ============================================================================
56
+ // readPluginManifest
57
+ // ============================================================================
58
+ describe("readPluginManifest", () => {
59
+ it("reads from .claude-plugin/plugin.json", async () => {
60
+ const root = path.join(tmpDir, "my-plugin");
61
+ await mkdirpAndWrite(path.join(root, ".claude-plugin", "plugin.json"), JSON.stringify({ name: "test-plugin", version: "1.0.0", description: "A test" }));
62
+ const manifest = await readPluginManifest(root);
63
+ expect(manifest).not.toBeNull();
64
+ expect(manifest.name).toBe("test-plugin");
65
+ expect(manifest.version).toBe("1.0.0");
66
+ expect(manifest.description).toBe("A test");
67
+ });
68
+ it("falls back to root plugin.json", async () => {
69
+ const root = path.join(tmpDir, "fallback-plugin");
70
+ await mkdirpAndWrite(path.join(root, "plugin.json"), JSON.stringify({ name: "fallback", version: "2.0.0" }));
71
+ const manifest = await readPluginManifest(root);
72
+ expect(manifest).not.toBeNull();
73
+ expect(manifest.name).toBe("fallback");
74
+ });
75
+ it("returns null when no plugin.json exists", async () => {
76
+ const root = path.join(tmpDir, "no-manifest");
77
+ await fs.mkdir(root, { recursive: true });
78
+ const manifest = await readPluginManifest(root);
79
+ expect(manifest).toBeNull();
80
+ });
81
+ it("returns null for invalid JSON", async () => {
82
+ const root = path.join(tmpDir, "bad-json");
83
+ await mkdirpAndWrite(path.join(root, "plugin.json"), "not json{{{");
84
+ const manifest = await readPluginManifest(root);
85
+ expect(manifest).toBeNull();
86
+ });
87
+ });
88
+ // ============================================================================
89
+ // scanPluginComponents
90
+ // ============================================================================
91
+ describe("scanPluginComponents", () => {
92
+ it("finds all component types from superpowers-like structure", async () => {
93
+ const root = path.join(tmpDir, "superpowers");
94
+ await createSuperpowersPlugin(root);
95
+ const components = await scanPluginComponents(root, "superpowers", "superpowers-marketplace");
96
+ // Skills: 2
97
+ const skills = components.filter((c) => c.type === "skill");
98
+ expect(skills).toHaveLength(2);
99
+ expect(skills.map((s) => s.name).sort()).toEqual(["brainstorming", "tdd"]);
100
+ // Agents: 1
101
+ const agents = components.filter((c) => c.type === "agent");
102
+ expect(agents).toHaveLength(1);
103
+ expect(agents[0].name).toBe("code-reviewer");
104
+ // Commands: 2
105
+ const commands = components.filter((c) => c.type === "command");
106
+ expect(commands).toHaveLength(2);
107
+ expect(commands.map((c) => c.name).sort()).toEqual(["brainstorm", "write-plan"]);
108
+ // Hooks: 2 (session-start.sh + hooks.json)
109
+ const hooks = components.filter((c) => c.type === "hook");
110
+ expect(hooks).toHaveLength(2);
111
+ // Lib: 1
112
+ const libs = components.filter((c) => c.type === "lib");
113
+ expect(libs).toHaveLength(1);
114
+ expect(libs[0].name).toBe("skills-core");
115
+ });
116
+ it("sets pluginName and marketplace on all components", async () => {
117
+ const root = path.join(tmpDir, "meta-test");
118
+ await mkdirpAndWrite(path.join(root, "agents", "reviewer.md"), "# Reviewer");
119
+ const components = await scanPluginComponents(root, "my-plugin", "my-mp");
120
+ expect(components).toHaveLength(1);
121
+ expect(components[0].pluginName).toBe("my-plugin");
122
+ expect(components[0].marketplace).toBe("my-mp");
123
+ });
124
+ it("extracts description from frontmatter", async () => {
125
+ const root = path.join(tmpDir, "desc-test");
126
+ await mkdirpAndWrite(path.join(root, "skills", "tdd", "SKILL.md"), '---\nname: tdd\ndescription: "Test-driven development"\n---\n# TDD');
127
+ const components = await scanPluginComponents(root);
128
+ const skill = components.find((c) => c.name === "tdd");
129
+ expect(skill?.description).toBe("Test-driven development");
130
+ });
131
+ it("extracts description from first content line when no frontmatter", async () => {
132
+ const root = path.join(tmpDir, "desc-fallback");
133
+ await mkdirpAndWrite(path.join(root, "agents", "helper.md"), "# Helper Agent\nHelps with tasks and automation");
134
+ const components = await scanPluginComponents(root);
135
+ const agent = components.find((c) => c.name === "helper");
136
+ expect(agent?.description).toBe("Helps with tasks and automation");
137
+ });
138
+ it("returns empty array for non-existent directory", async () => {
139
+ const components = await scanPluginComponents("/does/not/exist");
140
+ expect(components).toEqual([]);
141
+ });
142
+ it("returns empty array for empty plugin dir", async () => {
143
+ const root = path.join(tmpDir, "empty-plugin");
144
+ await fs.mkdir(root, { recursive: true });
145
+ const components = await scanPluginComponents(root);
146
+ expect(components).toEqual([]);
147
+ });
148
+ it("handles nested skill dirs (skills/name/SKILL.md pattern)", async () => {
149
+ const root = path.join(tmpDir, "nested");
150
+ await mkdirpAndWrite(path.join(root, "skills", "deep", "nested", "SKILL.md"), "# Nested");
151
+ // The parent-dir naming means this gets named "nested" (parent of SKILL.md)
152
+ const components = await scanPluginComponents(root);
153
+ const skills = components.filter((c) => c.type === "skill");
154
+ expect(skills).toHaveLength(1);
155
+ expect(skills[0].name).toBe("nested");
156
+ });
157
+ });
158
+ // ============================================================================
159
+ // scanPluginCache
160
+ // ============================================================================
161
+ describe("scanPluginCache", () => {
162
+ it("scans marketplace/plugin/version structure", async () => {
163
+ const cacheDir = path.join(tmpDir, "cache");
164
+ const pluginRoot = path.join(cacheDir, "superpowers-marketplace", "superpowers", "4.2.0");
165
+ await createSuperpowersPlugin(pluginRoot);
166
+ const components = await scanPluginCache(cacheDir);
167
+ expect(components.length).toBeGreaterThan(0);
168
+ // Check marketplace and pluginName are set
169
+ for (const c of components) {
170
+ expect(c.marketplace).toBe("superpowers-marketplace");
171
+ expect(c.pluginName).toBe("superpowers");
172
+ }
173
+ // Should find agents, commands, hooks, lib, and skills
174
+ const types = new Set(components.map((c) => c.type));
175
+ expect(types.has("skill")).toBe(true);
176
+ expect(types.has("agent")).toBe(true);
177
+ expect(types.has("command")).toBe(true);
178
+ expect(types.has("hook")).toBe(true);
179
+ expect(types.has("lib")).toBe(true);
180
+ });
181
+ it("picks latest version when multiple exist", async () => {
182
+ const cacheDir = path.join(tmpDir, "cache-versions");
183
+ // Create two versions
184
+ await mkdirpAndWrite(path.join(cacheDir, "mp", "plugin", "1.0.0", "agents", "old.md"), "# Old Agent");
185
+ await mkdirpAndWrite(path.join(cacheDir, "mp", "plugin", "2.0.0", "agents", "new.md"), "# New Agent");
186
+ const components = await scanPluginCache(cacheDir);
187
+ // Should only get the 2.0.0 version (sorted alphabetically, 2.0.0 > 1.0.0)
188
+ expect(components).toHaveLength(1);
189
+ expect(components[0].name).toBe("new");
190
+ });
191
+ it("handles multiple plugins in same marketplace", async () => {
192
+ const cacheDir = path.join(tmpDir, "cache-multi");
193
+ await mkdirpAndWrite(path.join(cacheDir, "mp", "plugin-a", "1.0.0", "agents", "agent-a.md"), "# Agent A");
194
+ await mkdirpAndWrite(path.join(cacheDir, "mp", "plugin-b", "1.0.0", "commands", "cmd-b.md"), "# Command B");
195
+ const components = await scanPluginCache(cacheDir);
196
+ expect(components).toHaveLength(2);
197
+ expect(components.find((c) => c.pluginName === "plugin-a")).toBeDefined();
198
+ expect(components.find((c) => c.pluginName === "plugin-b")).toBeDefined();
199
+ });
200
+ it("returns empty for non-existent cache", async () => {
201
+ const components = await scanPluginCache("/nonexistent/cache");
202
+ expect(components).toEqual([]);
203
+ });
204
+ });
205
+ // ============================================================================
206
+ // Integration: migrator uses components
207
+ // ============================================================================
208
+ describe("migrator integration", () => {
209
+ it("generateMigrationPlan includes components from scans", async () => {
210
+ const { generateMigrationPlan } = await import("./migrator/index.js");
211
+ const scan = {
212
+ toolId: "claude-code",
213
+ toolName: "Claude Code",
214
+ installed: true,
215
+ skills: [],
216
+ mcps: [],
217
+ memory: [],
218
+ hooks: [],
219
+ components: [
220
+ { name: "code-reviewer", type: "agent", path: "/p/agent.md", pluginName: "superpowers" },
221
+ { name: "brainstorm", type: "command", path: "/p/cmd.md", pluginName: "superpowers" },
222
+ ],
223
+ };
224
+ const plan = generateMigrationPlan([scan]);
225
+ expect(plan.components).toHaveLength(2);
226
+ expect(plan.components[0].name).toBe("code-reviewer");
227
+ expect(plan.components[0].type).toBe("agent");
228
+ expect(plan.components[1].name).toBe("brainstorm");
229
+ expect(plan.components[1].type).toBe("command");
230
+ });
231
+ it("generateMigrationPlan deduplicates components by type+name", async () => {
232
+ const { generateMigrationPlan } = await import("./migrator/index.js");
233
+ const scan1 = {
234
+ toolId: "claude-code",
235
+ toolName: "Claude Code",
236
+ installed: true,
237
+ skills: [],
238
+ mcps: [],
239
+ memory: [],
240
+ hooks: [],
241
+ components: [
242
+ { name: "reviewer", type: "agent", path: "/a/reviewer.md" },
243
+ ],
244
+ };
245
+ const scan2 = {
246
+ toolId: "codex",
247
+ toolName: "Codex",
248
+ installed: true,
249
+ skills: [],
250
+ mcps: [],
251
+ memory: [],
252
+ hooks: [],
253
+ components: [
254
+ { name: "reviewer", type: "agent", path: "/b/reviewer.md" },
255
+ ],
256
+ };
257
+ const plan = generateMigrationPlan([scan1, scan2]);
258
+ expect(plan.components).toHaveLength(1);
259
+ });
260
+ it("generateMigrationPlan allows same name for different types", async () => {
261
+ const { generateMigrationPlan } = await import("./migrator/index.js");
262
+ const scan = {
263
+ toolId: "claude-code",
264
+ toolName: "Claude Code",
265
+ installed: true,
266
+ skills: [],
267
+ mcps: [],
268
+ memory: [],
269
+ hooks: [],
270
+ components: [
271
+ { name: "brainstorm", type: "agent", path: "/a.md" },
272
+ { name: "brainstorm", type: "command", path: "/b.md" },
273
+ ],
274
+ };
275
+ const plan = generateMigrationPlan([scan]);
276
+ expect(plan.components).toHaveLength(2);
277
+ });
278
+ });
279
+ //# sourceMappingURL=plugin-scanner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-scanner.test.js","sourceRoot":"","sources":["../../src/core/plugin-scanner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Presets Module
3
+ *
4
+ * One-click config switching with named presets.
5
+ * Presets store which skills, MCPs, and memory scopes should be active.
6
+ */
7
+ export interface Preset {
8
+ name: string;
9
+ skills: string[];
10
+ mcps: string[];
11
+ memory: {
12
+ scopes: string[];
13
+ };
14
+ }
15
+ export interface PresetConfig {
16
+ skills: string[];
17
+ mcps: string[];
18
+ memory: {
19
+ scopes: string[];
20
+ };
21
+ }
22
+ export interface ApplyActions {
23
+ enableSkills: string[];
24
+ disableSkills: string[];
25
+ enableMcps: string[];
26
+ disableMcps: string[];
27
+ }
28
+ /**
29
+ * Create a preset from the given config.
30
+ */
31
+ export declare function createPreset(name: string, config: PresetConfig): Preset;
32
+ /**
33
+ * Compute which items to enable/disable when applying a preset.
34
+ */
35
+ export declare function applyPreset(preset: Preset, available: {
36
+ allSkills: string[];
37
+ allMcps: string[];
38
+ }): ApplyActions;
39
+ /**
40
+ * Export a preset as YAML string for sharing.
41
+ */
42
+ export declare function exportPreset(preset: Preset): string;
43
+ /**
44
+ * Save a preset to disk.
45
+ */
46
+ export declare function savePreset(preset: Preset): Promise<void>;
47
+ /**
48
+ * Load a preset from disk.
49
+ */
50
+ export declare function loadPreset(name: string): Promise<Preset | null>;
51
+ /**
52
+ * List all saved presets.
53
+ */
54
+ export declare function listPresets(): Promise<string[]>;
55
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/core/presets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAOvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GACpD,YAAY,CAUd;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AASD;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQrE;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAUrD"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Presets Module
3
+ *
4
+ * One-click config switching with named presets.
5
+ * Presets store which skills, MCPs, and memory scopes should be active.
6
+ */
7
+ import * as fs from "node:fs/promises";
8
+ import * as path from "node:path";
9
+ import { stringify, parse } from "yaml";
10
+ import { expandPath } from "@mycelish/core";
11
+ /**
12
+ * Create a preset from the given config.
13
+ */
14
+ export function createPreset(name, config) {
15
+ return {
16
+ name,
17
+ skills: [...config.skills],
18
+ mcps: [...config.mcps],
19
+ memory: { scopes: [...config.memory.scopes] },
20
+ };
21
+ }
22
+ /**
23
+ * Compute which items to enable/disable when applying a preset.
24
+ */
25
+ export function applyPreset(preset, available) {
26
+ const presetSkills = new Set(preset.skills);
27
+ const presetMcps = new Set(preset.mcps);
28
+ return {
29
+ enableSkills: available.allSkills.filter((s) => presetSkills.has(s)),
30
+ disableSkills: available.allSkills.filter((s) => !presetSkills.has(s)),
31
+ enableMcps: available.allMcps.filter((m) => presetMcps.has(m)),
32
+ disableMcps: available.allMcps.filter((m) => !presetMcps.has(m)),
33
+ };
34
+ }
35
+ /**
36
+ * Export a preset as YAML string for sharing.
37
+ */
38
+ export function exportPreset(preset) {
39
+ return stringify(preset);
40
+ }
41
+ /**
42
+ * Get the presets directory path.
43
+ */
44
+ function getPresetsDir() {
45
+ return expandPath("~/.mycelium/presets");
46
+ }
47
+ /**
48
+ * Save a preset to disk.
49
+ */
50
+ export async function savePreset(preset) {
51
+ const dir = getPresetsDir();
52
+ await fs.mkdir(dir, { recursive: true });
53
+ const filePath = path.join(dir, `${preset.name}.yaml`);
54
+ await fs.writeFile(filePath, exportPreset(preset), "utf-8");
55
+ }
56
+ /**
57
+ * Load a preset from disk.
58
+ */
59
+ export async function loadPreset(name) {
60
+ const filePath = path.join(getPresetsDir(), `${name}.yaml`);
61
+ try {
62
+ const content = await fs.readFile(filePath, "utf-8");
63
+ return parse(content);
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * List all saved presets.
71
+ */
72
+ export async function listPresets() {
73
+ const dir = getPresetsDir();
74
+ try {
75
+ const files = await fs.readdir(dir);
76
+ return files
77
+ .filter((f) => f.endsWith(".yaml"))
78
+ .map((f) => f.replace(/\.yaml$/, ""));
79
+ }
80
+ catch {
81
+ return [];
82
+ }
83
+ }
84
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/core/presets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=presets.test.d.ts.map