@wootsup/yt-builder-mcp 1.1.6 → 1.2.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 (430) hide show
  1. package/README.md +7 -7
  2. package/bin/yt-builder-mcp.js +55 -40
  3. package/dist/auth.d.ts +137 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +244 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/cli/invocation-decision.d.ts +57 -0
  8. package/dist/cli/invocation-decision.d.ts.map +1 -0
  9. package/dist/cli/invocation-decision.js +86 -0
  10. package/dist/cli/invocation-decision.js.map +1 -0
  11. package/dist/client.d.ts +112 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +190 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/clients/claude-code.d.ts +18 -0
  16. package/dist/clients/claude-code.d.ts.map +1 -0
  17. package/dist/clients/claude-code.js +55 -0
  18. package/dist/clients/claude-code.js.map +1 -0
  19. package/dist/clients/claude-desktop.d.ts +19 -0
  20. package/dist/clients/claude-desktop.d.ts.map +1 -0
  21. package/dist/clients/claude-desktop.js +58 -0
  22. package/dist/clients/claude-desktop.js.map +1 -0
  23. package/dist/clients/cline.d.ts +26 -0
  24. package/dist/clients/cline.d.ts.map +1 -0
  25. package/dist/clients/cline.js +82 -0
  26. package/dist/clients/cline.js.map +1 -0
  27. package/dist/clients/codex-cli.d.ts +42 -0
  28. package/dist/clients/codex-cli.d.ts.map +1 -0
  29. package/dist/clients/codex-cli.js +292 -0
  30. package/dist/clients/codex-cli.js.map +1 -0
  31. package/dist/clients/continue.d.ts +13 -0
  32. package/dist/clients/continue.d.ts.map +1 -0
  33. package/dist/clients/continue.js +121 -0
  34. package/dist/clients/continue.js.map +1 -0
  35. package/dist/clients/cursor.d.ts +12 -0
  36. package/dist/clients/cursor.d.ts.map +1 -0
  37. package/dist/clients/cursor.js +40 -0
  38. package/dist/clients/cursor.js.map +1 -0
  39. package/dist/clients/gemini-cli.d.ts +18 -0
  40. package/dist/clients/gemini-cli.d.ts.map +1 -0
  41. package/dist/clients/gemini-cli.js +46 -0
  42. package/dist/clients/gemini-cli.js.map +1 -0
  43. package/dist/clients/home.d.ts +14 -0
  44. package/dist/clients/home.d.ts.map +1 -0
  45. package/dist/clients/home.js +20 -0
  46. package/dist/clients/home.js.map +1 -0
  47. package/dist/clients/index.d.ts +156 -0
  48. package/dist/clients/index.d.ts.map +1 -0
  49. package/dist/clients/index.js +213 -0
  50. package/dist/clients/index.js.map +1 -0
  51. package/dist/clients/roo-code.d.ts +23 -0
  52. package/dist/clients/roo-code.d.ts.map +1 -0
  53. package/dist/clients/roo-code.js +71 -0
  54. package/dist/clients/roo-code.js.map +1 -0
  55. package/dist/clients/zed.d.ts +12 -0
  56. package/dist/clients/zed.d.ts.map +1 -0
  57. package/dist/clients/zed.js +43 -0
  58. package/dist/clients/zed.js.map +1 -0
  59. package/dist/errors/hints.d.ts +51 -0
  60. package/dist/errors/hints.d.ts.map +1 -0
  61. package/dist/errors/hints.js +95 -0
  62. package/dist/errors/hints.js.map +1 -0
  63. package/dist/errors/mask.d.ts +35 -0
  64. package/dist/errors/mask.d.ts.map +1 -0
  65. package/dist/errors/mask.js +49 -0
  66. package/dist/errors/mask.js.map +1 -0
  67. package/dist/errors/sanitize.d.ts +31 -0
  68. package/dist/errors/sanitize.d.ts.map +1 -0
  69. package/dist/errors/sanitize.js +100 -0
  70. package/dist/errors/sanitize.js.map +1 -0
  71. package/dist/errors.d.ts +42 -0
  72. package/dist/errors.d.ts.map +1 -0
  73. package/dist/errors.js +61 -0
  74. package/dist/errors.js.map +1 -0
  75. package/dist/gateway/advanced-tool/discovery.d.ts +19 -0
  76. package/dist/gateway/advanced-tool/discovery.d.ts.map +1 -0
  77. package/dist/gateway/advanced-tool/discovery.js +53 -0
  78. package/dist/gateway/advanced-tool/discovery.js.map +1 -0
  79. package/dist/gateway/advanced-tool/domains.d.ts +47 -0
  80. package/dist/gateway/advanced-tool/domains.d.ts.map +1 -0
  81. package/dist/gateway/advanced-tool/domains.js +94 -0
  82. package/dist/gateway/advanced-tool/domains.js.map +1 -0
  83. package/dist/gateway/advanced-tool/execute.d.ts +29 -0
  84. package/dist/gateway/advanced-tool/execute.d.ts.map +1 -0
  85. package/dist/gateway/advanced-tool/execute.js +54 -0
  86. package/dist/gateway/advanced-tool/execute.js.map +1 -0
  87. package/dist/gateway/advanced-tool/index.d.ts +36 -0
  88. package/dist/gateway/advanced-tool/index.d.ts.map +1 -0
  89. package/dist/gateway/advanced-tool/index.js +39 -0
  90. package/dist/gateway/advanced-tool/index.js.map +1 -0
  91. package/dist/gateway/advanced-tool/register.d.ts +18 -0
  92. package/dist/gateway/advanced-tool/register.d.ts.map +1 -0
  93. package/dist/gateway/advanced-tool/register.js +69 -0
  94. package/dist/gateway/advanced-tool/register.js.map +1 -0
  95. package/dist/gateway/advanced-tool.d.ts +13 -0
  96. package/dist/gateway/advanced-tool.d.ts.map +1 -0
  97. package/dist/gateway/advanced-tool.js +13 -0
  98. package/dist/gateway/advanced-tool.js.map +1 -0
  99. package/dist/gateway/capturing-server.d.ts +117 -0
  100. package/dist/gateway/capturing-server.d.ts.map +1 -0
  101. package/dist/gateway/capturing-server.js +103 -0
  102. package/dist/gateway/capturing-server.js.map +1 -0
  103. package/dist/gateway/essentials.d.ts +50 -0
  104. package/dist/gateway/essentials.d.ts.map +1 -0
  105. package/dist/gateway/essentials.js +108 -0
  106. package/dist/gateway/essentials.js.map +1 -0
  107. package/dist/gateway/test-support.d.ts +41 -0
  108. package/dist/gateway/test-support.d.ts.map +1 -0
  109. package/dist/gateway/test-support.js +60 -0
  110. package/dist/gateway/test-support.js.map +1 -0
  111. package/dist/index.d.ts +30 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +119 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/install-skill.d.ts +43 -0
  116. package/dist/install-skill.d.ts.map +1 -0
  117. package/dist/install-skill.js +118 -0
  118. package/dist/install-skill.js.map +1 -0
  119. package/dist/platform/detect.d.ts +64 -0
  120. package/dist/platform/detect.d.ts.map +1 -0
  121. package/dist/platform/detect.js +98 -0
  122. package/dist/platform/detect.js.map +1 -0
  123. package/dist/platform/index.d.ts +121 -0
  124. package/dist/platform/index.d.ts.map +1 -0
  125. package/dist/platform/index.js +176 -0
  126. package/dist/platform/index.js.map +1 -0
  127. package/dist/platform/joomla.d.ts +44 -0
  128. package/dist/platform/joomla.d.ts.map +1 -0
  129. package/dist/platform/joomla.js +46 -0
  130. package/dist/platform/joomla.js.map +1 -0
  131. package/dist/server.d.ts +110 -0
  132. package/dist/server.d.ts.map +1 -0
  133. package/dist/server.js +274 -0
  134. package/dist/server.js.map +1 -0
  135. package/dist/setup-cli-confirm.d.ts +36 -0
  136. package/dist/setup-cli-confirm.d.ts.map +1 -0
  137. package/dist/setup-cli-confirm.js +59 -0
  138. package/dist/setup-cli-confirm.js.map +1 -0
  139. package/dist/setup-cli.d.ts +193 -0
  140. package/dist/setup-cli.d.ts.map +1 -0
  141. package/dist/setup-cli.js +1032 -0
  142. package/dist/setup-cli.js.map +1 -0
  143. package/dist/setup-prompts.d.ts +64 -0
  144. package/dist/setup-prompts.d.ts.map +1 -0
  145. package/dist/setup-prompts.js +221 -0
  146. package/dist/setup-prompts.js.map +1 -0
  147. package/dist/setup-token.d.ts +38 -0
  148. package/dist/setup-token.d.ts.map +1 -0
  149. package/dist/setup-token.js +106 -0
  150. package/dist/setup-token.js.map +1 -0
  151. package/dist/setup-wizard-defaults.d.ts +43 -0
  152. package/dist/setup-wizard-defaults.d.ts.map +1 -0
  153. package/dist/setup-wizard-defaults.js +160 -0
  154. package/dist/setup-wizard-defaults.js.map +1 -0
  155. package/dist/setup-wizard-handshake.d.ts +25 -0
  156. package/dist/setup-wizard-handshake.d.ts.map +1 -0
  157. package/dist/setup-wizard-handshake.js +103 -0
  158. package/dist/setup-wizard-handshake.js.map +1 -0
  159. package/dist/setup-wizard-types.d.ts +164 -0
  160. package/dist/setup-wizard-types.d.ts.map +1 -0
  161. package/dist/setup-wizard-types.js +11 -0
  162. package/dist/setup-wizard-types.js.map +1 -0
  163. package/dist/setup-wizard.d.ts +33 -0
  164. package/dist/setup-wizard.d.ts.map +1 -0
  165. package/dist/setup-wizard.js +199 -0
  166. package/dist/setup-wizard.js.map +1 -0
  167. package/dist/setup.d.ts +17 -0
  168. package/dist/setup.d.ts.map +1 -0
  169. package/dist/setup.js +33 -0
  170. package/dist/setup.js.map +1 -0
  171. package/dist/sites/bootstrap.d.ts +41 -0
  172. package/dist/sites/bootstrap.d.ts.map +1 -0
  173. package/dist/sites/bootstrap.js +58 -0
  174. package/dist/sites/bootstrap.js.map +1 -0
  175. package/dist/sites/cli/add-site.d.ts +106 -0
  176. package/dist/sites/cli/add-site.d.ts.map +1 -0
  177. package/dist/sites/cli/add-site.js +185 -0
  178. package/dist/sites/cli/add-site.js.map +1 -0
  179. package/dist/sites/cli/list-sites.d.ts +40 -0
  180. package/dist/sites/cli/list-sites.d.ts.map +1 -0
  181. package/dist/sites/cli/list-sites.js +116 -0
  182. package/dist/sites/cli/list-sites.js.map +1 -0
  183. package/dist/sites/cli/remove-site.d.ts +60 -0
  184. package/dist/sites/cli/remove-site.d.ts.map +1 -0
  185. package/dist/sites/cli/remove-site.js +120 -0
  186. package/dist/sites/cli/remove-site.js.map +1 -0
  187. package/dist/sites/cli/set-default.d.ts +47 -0
  188. package/dist/sites/cli/set-default.d.ts.map +1 -0
  189. package/dist/sites/cli/set-default.js +69 -0
  190. package/dist/sites/cli/set-default.js.map +1 -0
  191. package/dist/sites/cli/test-site.d.ts +77 -0
  192. package/dist/sites/cli/test-site.d.ts.map +1 -0
  193. package/dist/sites/cli/test-site.js +146 -0
  194. package/dist/sites/cli/test-site.js.map +1 -0
  195. package/dist/sites/client-pool.d.ts +157 -0
  196. package/dist/sites/client-pool.d.ts.map +1 -0
  197. package/dist/sites/client-pool.js +222 -0
  198. package/dist/sites/client-pool.js.map +1 -0
  199. package/dist/sites/env-bridge.d.ts +55 -0
  200. package/dist/sites/env-bridge.d.ts.map +1 -0
  201. package/dist/sites/env-bridge.js +94 -0
  202. package/dist/sites/env-bridge.js.map +1 -0
  203. package/dist/sites/paths.d.ts +21 -0
  204. package/dist/sites/paths.d.ts.map +1 -0
  205. package/dist/sites/paths.js +37 -0
  206. package/dist/sites/paths.js.map +1 -0
  207. package/dist/sites/probe.d.ts +60 -0
  208. package/dist/sites/probe.d.ts.map +1 -0
  209. package/dist/sites/probe.js +112 -0
  210. package/dist/sites/probe.js.map +1 -0
  211. package/dist/sites/registry.d.ts +142 -0
  212. package/dist/sites/registry.d.ts.map +1 -0
  213. package/dist/sites/registry.js +163 -0
  214. package/dist/sites/registry.js.map +1 -0
  215. package/dist/sites/schema.d.ts +90 -0
  216. package/dist/sites/schema.d.ts.map +1 -0
  217. package/dist/sites/schema.js +71 -0
  218. package/dist/sites/schema.js.map +1 -0
  219. package/dist/sites/secret-resolver.d.ts +115 -0
  220. package/dist/sites/secret-resolver.d.ts.map +1 -0
  221. package/dist/sites/secret-resolver.js +225 -0
  222. package/dist/sites/secret-resolver.js.map +1 -0
  223. package/dist/sites/store.d.ts +82 -0
  224. package/dist/sites/store.d.ts.map +1 -0
  225. package/dist/sites/store.js +198 -0
  226. package/dist/sites/store.js.map +1 -0
  227. package/dist/sites/tools/index.d.ts +28 -0
  228. package/dist/sites/tools/index.d.ts.map +1 -0
  229. package/dist/sites/tools/index.js +38 -0
  230. package/dist/sites/tools/index.js.map +1 -0
  231. package/dist/sites/tools/sites-list.d.ts +48 -0
  232. package/dist/sites/tools/sites-list.d.ts.map +1 -0
  233. package/dist/sites/tools/sites-list.js +137 -0
  234. package/dist/sites/tools/sites-list.js.map +1 -0
  235. package/dist/sites/tools/sites-test.d.ts +47 -0
  236. package/dist/sites/tools/sites-test.d.ts.map +1 -0
  237. package/dist/sites/tools/sites-test.js +148 -0
  238. package/dist/sites/tools/sites-test.js.map +1 -0
  239. package/dist/sites/tools/use-site.d.ts +47 -0
  240. package/dist/sites/tools/use-site.d.ts.map +1 -0
  241. package/dist/sites/tools/use-site.js +183 -0
  242. package/dist/sites/tools/use-site.js.map +1 -0
  243. package/dist/skill-loader.d.ts +111 -0
  244. package/dist/skill-loader.d.ts.map +1 -0
  245. package/dist/skill-loader.js +191 -0
  246. package/dist/skill-loader.js.map +1 -0
  247. package/dist/tools/elements/builders.d.ts +24 -0
  248. package/dist/tools/elements/builders.d.ts.map +1 -0
  249. package/dist/tools/elements/builders.js +208 -0
  250. package/dist/tools/elements/builders.js.map +1 -0
  251. package/dist/tools/elements/handlers-write.d.ts +49 -0
  252. package/dist/tools/elements/handlers-write.d.ts.map +1 -0
  253. package/dist/tools/elements/handlers-write.js +341 -0
  254. package/dist/tools/elements/handlers-write.js.map +1 -0
  255. package/dist/tools/elements/handlers.d.ts +70 -0
  256. package/dist/tools/elements/handlers.d.ts.map +1 -0
  257. package/dist/tools/elements/handlers.js +292 -0
  258. package/dist/tools/elements/handlers.js.map +1 -0
  259. package/dist/tools/elements/index.d.ts +28 -0
  260. package/dist/tools/elements/index.d.ts.map +1 -0
  261. package/dist/tools/elements/index.js +27 -0
  262. package/dist/tools/elements/index.js.map +1 -0
  263. package/dist/tools/elements.d.ts +13 -0
  264. package/dist/tools/elements.d.ts.map +1 -0
  265. package/dist/tools/elements.js +13 -0
  266. package/dist/tools/elements.js.map +1 -0
  267. package/dist/tools/elicitation.d.ts +87 -0
  268. package/dist/tools/elicitation.d.ts.map +1 -0
  269. package/dist/tools/elicitation.js +100 -0
  270. package/dist/tools/elicitation.js.map +1 -0
  271. package/dist/tools/format/elements-format.d.ts +40 -0
  272. package/dist/tools/format/elements-format.d.ts.map +1 -0
  273. package/dist/tools/format/elements-format.js +193 -0
  274. package/dist/tools/format/elements-format.js.map +1 -0
  275. package/dist/tools/format/health-format.d.ts +79 -0
  276. package/dist/tools/format/health-format.d.ts.map +1 -0
  277. package/dist/tools/format/health-format.js +181 -0
  278. package/dist/tools/format/health-format.js.map +1 -0
  279. package/dist/tools/format/inspection-format.d.ts +70 -0
  280. package/dist/tools/format/inspection-format.d.ts.map +1 -0
  281. package/dist/tools/format/inspection-format.js +359 -0
  282. package/dist/tools/format/inspection-format.js.map +1 -0
  283. package/dist/tools/format/pages-format.d.ts +57 -0
  284. package/dist/tools/format/pages-format.d.ts.map +1 -0
  285. package/dist/tools/format/pages-format.js +157 -0
  286. package/dist/tools/format/pages-format.js.map +1 -0
  287. package/dist/tools/format/sources-format.d.ts +44 -0
  288. package/dist/tools/format/sources-format.d.ts.map +1 -0
  289. package/dist/tools/format/sources-format.js +242 -0
  290. package/dist/tools/format/sources-format.js.map +1 -0
  291. package/dist/tools/health.d.ts +22 -0
  292. package/dist/tools/health.d.ts.map +1 -0
  293. package/dist/tools/health.js +220 -0
  294. package/dist/tools/health.js.map +1 -0
  295. package/dist/tools/index.d.ts +30 -0
  296. package/dist/tools/index.d.ts.map +1 -0
  297. package/dist/tools/index.js +39 -0
  298. package/dist/tools/index.js.map +1 -0
  299. package/dist/tools/inspection.d.ts +14 -0
  300. package/dist/tools/inspection.d.ts.map +1 -0
  301. package/dist/tools/inspection.js +401 -0
  302. package/dist/tools/inspection.js.map +1 -0
  303. package/dist/tools/layout-flatten.d.ts +75 -0
  304. package/dist/tools/layout-flatten.d.ts.map +1 -0
  305. package/dist/tools/layout-flatten.js +107 -0
  306. package/dist/tools/layout-flatten.js.map +1 -0
  307. package/dist/tools/multi-items/builders.d.ts +23 -0
  308. package/dist/tools/multi-items/builders.d.ts.map +1 -0
  309. package/dist/tools/multi-items/builders.js +84 -0
  310. package/dist/tools/multi-items/builders.js.map +1 -0
  311. package/dist/tools/multi-items/clean-implode-handler.d.ts +36 -0
  312. package/dist/tools/multi-items/clean-implode-handler.d.ts.map +1 -0
  313. package/dist/tools/multi-items/clean-implode-handler.js +57 -0
  314. package/dist/tools/multi-items/clean-implode-handler.js.map +1 -0
  315. package/dist/tools/multi-items/format/inspection-format.d.ts +41 -0
  316. package/dist/tools/multi-items/format/inspection-format.d.ts.map +1 -0
  317. package/dist/tools/multi-items/format/inspection-format.js +64 -0
  318. package/dist/tools/multi-items/format/inspection-format.js.map +1 -0
  319. package/dist/tools/multi-items/index.d.ts +18 -0
  320. package/dist/tools/multi-items/index.d.ts.map +1 -0
  321. package/dist/tools/multi-items/index.js +18 -0
  322. package/dist/tools/multi-items/index.js.map +1 -0
  323. package/dist/tools/multi-items/inspect-handler.d.ts +76 -0
  324. package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -0
  325. package/dist/tools/multi-items/inspect-handler.js +133 -0
  326. package/dist/tools/multi-items/inspect-handler.js.map +1 -0
  327. package/dist/tools/multi-items/inspection-cache.d.ts +85 -0
  328. package/dist/tools/multi-items/inspection-cache.d.ts.map +1 -0
  329. package/dist/tools/multi-items/inspection-cache.js +126 -0
  330. package/dist/tools/multi-items/inspection-cache.js.map +1 -0
  331. package/dist/tools/multi-items/item-container-map.d.ts +41 -0
  332. package/dist/tools/multi-items/item-container-map.d.ts.map +1 -0
  333. package/dist/tools/multi-items/item-container-map.js +73 -0
  334. package/dist/tools/multi-items/item-container-map.js.map +1 -0
  335. package/dist/tools/pages/builders.d.ts +43 -0
  336. package/dist/tools/pages/builders.d.ts.map +1 -0
  337. package/dist/tools/pages/builders.js +229 -0
  338. package/dist/tools/pages/builders.js.map +1 -0
  339. package/dist/tools/pages/handlers-read.d.ts +33 -0
  340. package/dist/tools/pages/handlers-read.d.ts.map +1 -0
  341. package/dist/tools/pages/handlers-read.js +260 -0
  342. package/dist/tools/pages/handlers-read.js.map +1 -0
  343. package/dist/tools/pages/handlers-write.d.ts +63 -0
  344. package/dist/tools/pages/handlers-write.d.ts.map +1 -0
  345. package/dist/tools/pages/handlers-write.js +127 -0
  346. package/dist/tools/pages/handlers-write.js.map +1 -0
  347. package/dist/tools/pages/index.d.ts +17 -0
  348. package/dist/tools/pages/index.d.ts.map +1 -0
  349. package/dist/tools/pages/index.js +17 -0
  350. package/dist/tools/pages/index.js.map +1 -0
  351. package/dist/tools/pages/schemas.d.ts +157 -0
  352. package/dist/tools/pages/schemas.d.ts.map +1 -0
  353. package/dist/tools/pages/schemas.js +232 -0
  354. package/dist/tools/pages/schemas.js.map +1 -0
  355. package/dist/tools/pages.d.ts +13 -0
  356. package/dist/tools/pages.d.ts.map +1 -0
  357. package/dist/tools/pages.js +13 -0
  358. package/dist/tools/pages.js.map +1 -0
  359. package/dist/tools/pool-resolve-helper.d.ts +83 -0
  360. package/dist/tools/pool-resolve-helper.d.ts.map +1 -0
  361. package/dist/tools/pool-resolve-helper.js +148 -0
  362. package/dist/tools/pool-resolve-helper.js.map +1 -0
  363. package/dist/tools/progress-phases.d.ts +46 -0
  364. package/dist/tools/progress-phases.d.ts.map +1 -0
  365. package/dist/tools/progress-phases.js +48 -0
  366. package/dist/tools/progress-phases.js.map +1 -0
  367. package/dist/tools/shared-schemas.d.ts +25 -0
  368. package/dist/tools/shared-schemas.d.ts.map +1 -0
  369. package/dist/tools/shared-schemas.js +72 -0
  370. package/dist/tools/shared-schemas.js.map +1 -0
  371. package/dist/tools/sources/builders.d.ts +13 -0
  372. package/dist/tools/sources/builders.d.ts.map +1 -0
  373. package/dist/tools/sources/builders.js +118 -0
  374. package/dist/tools/sources/builders.js.map +1 -0
  375. package/dist/tools/sources/handlers-bind.d.ts +28 -0
  376. package/dist/tools/sources/handlers-bind.d.ts.map +1 -0
  377. package/dist/tools/sources/handlers-bind.js +181 -0
  378. package/dist/tools/sources/handlers-bind.js.map +1 -0
  379. package/dist/tools/sources/handlers.d.ts +47 -0
  380. package/dist/tools/sources/handlers.d.ts.map +1 -0
  381. package/dist/tools/sources/handlers.js +108 -0
  382. package/dist/tools/sources/handlers.js.map +1 -0
  383. package/dist/tools/sources/index.d.ts +19 -0
  384. package/dist/tools/sources/index.d.ts.map +1 -0
  385. package/dist/tools/sources/index.js +18 -0
  386. package/dist/tools/sources/index.js.map +1 -0
  387. package/dist/tools/sources.d.ts +14 -0
  388. package/dist/tools/sources.d.ts.map +1 -0
  389. package/dist/tools/sources.js +14 -0
  390. package/dist/tools/sources.js.map +1 -0
  391. package/dist/tools/sparse-fields.d.ts +106 -0
  392. package/dist/tools/sparse-fields.d.ts.map +1 -0
  393. package/dist/tools/sparse-fields.js +165 -0
  394. package/dist/tools/sparse-fields.js.map +1 -0
  395. package/dist/tools/tool-builder/annotations.d.ts +55 -0
  396. package/dist/tools/tool-builder/annotations.d.ts.map +1 -0
  397. package/dist/tools/tool-builder/annotations.js +86 -0
  398. package/dist/tools/tool-builder/annotations.js.map +1 -0
  399. package/dist/tools/tool-builder/define.d.ts +31 -0
  400. package/dist/tools/tool-builder/define.d.ts.map +1 -0
  401. package/dist/tools/tool-builder/define.js +31 -0
  402. package/dist/tools/tool-builder/define.js.map +1 -0
  403. package/dist/tools/tool-builder/index.d.ts +28 -0
  404. package/dist/tools/tool-builder/index.d.ts.map +1 -0
  405. package/dist/tools/tool-builder/index.js +27 -0
  406. package/dist/tools/tool-builder/index.js.map +1 -0
  407. package/dist/tools/tool-builder/results.d.ts +104 -0
  408. package/dist/tools/tool-builder/results.d.ts.map +1 -0
  409. package/dist/tools/tool-builder/results.js +224 -0
  410. package/dist/tools/tool-builder/results.js.map +1 -0
  411. package/dist/tools/tool-builder/types.d.ts +97 -0
  412. package/dist/tools/tool-builder/types.d.ts.map +1 -0
  413. package/dist/tools/tool-builder/types.js +9 -0
  414. package/dist/tools/tool-builder/types.js.map +1 -0
  415. package/dist/tools/tool-builder.d.ts +16 -0
  416. package/dist/tools/tool-builder.d.ts.map +1 -0
  417. package/dist/tools/tool-builder.js +16 -0
  418. package/dist/tools/tool-builder.js.map +1 -0
  419. package/dist/uninstall-skill.d.ts +52 -0
  420. package/dist/uninstall-skill.d.ts.map +1 -0
  421. package/dist/uninstall-skill.js +146 -0
  422. package/dist/uninstall-skill.js.map +1 -0
  423. package/dist/uninstall.d.ts +73 -0
  424. package/dist/uninstall.d.ts.map +1 -0
  425. package/dist/uninstall.js +82 -0
  426. package/dist/uninstall.js.map +1 -0
  427. package/icon.png +0 -0
  428. package/manifest.json +10 -10
  429. package/package.json +4 -1
  430. package/skills/yt-builder-mcp/SKILL.md +30 -26
@@ -0,0 +1,185 @@
1
+ /**
2
+ * W9 — `add-site` CLI subcommand.
3
+ *
4
+ * Adds (or, with `--yes`, overwrites) a single site entry in the
5
+ * on-disk `sites.json` registry. Pure file-IO surface: loads, mutates
6
+ * in memory, and atomic-saves through {@link saveSitesFile}. NEVER
7
+ * touches the network — the optional connectivity probe lives in
8
+ * `test-site` so callers can compose the two.
9
+ *
10
+ * Design choices (per plan §W9):
11
+ * - **Mutual-exclusion `--token` vs `--token-ref`.** Exactly one
12
+ * credential field must be set; reuses the W1 SiteEntry refine() as
13
+ * the on-disk guard but also pre-checks here for an immediate CLI
14
+ * error rather than a Zod surprise at save time.
15
+ * - **Auto-default on first site.** If `sites.json` is empty (or did
16
+ * not exist), the first added entry gets `is_default: true` AND
17
+ * `default_site_id` is updated, regardless of whether `--default`
18
+ * was passed. The plan calls this out explicitly so users don't
19
+ * end up with a registry that has sites but no default.
20
+ * - **Idempotent + safe overwrite.** Re-adding the same `site_id`
21
+ * fails with exit code 2 unless `--yes` is passed; with `--yes` the
22
+ * existing entry is replaced AND its `is_default` flag is preserved
23
+ * so an overwrite of the default site stays the default.
24
+ * - **Defence-in-depth platform default.** When `--platform` is
25
+ * omitted the entry stores `'auto'`, which the W3 registry resolves
26
+ * at first use via the runtime probe.
27
+ *
28
+ * @license MIT
29
+ */
30
+ import { loadSitesFile, saveSitesFile } from '../store.js';
31
+ import { BEARER_REGEX, OP_REF_REGEX, SITE_ID_REGEX, } from '../schema.js';
32
+ /**
33
+ * Domain-tagged CLI failure. The dispatcher maps these to exit codes
34
+ * (typically 2 for "input invalid" + a friendly stderr line). Carries
35
+ * a `code` so tests / callers can branch without substring matching.
36
+ */
37
+ export class AddSiteError extends Error {
38
+ code;
39
+ constructor(code, message) {
40
+ super(message);
41
+ this.code = code;
42
+ this.name = 'AddSiteError';
43
+ }
44
+ }
45
+ /**
46
+ * Build a new {@link SiteEntryT} from validated CLI args. Pure +
47
+ * deterministic so tests can drive it directly. `added_at` uses the
48
+ * supplied `now` so snapshot tests don't drift on clock.
49
+ */
50
+ function buildEntry(args, siteId, isDefault, now) {
51
+ const base = {
52
+ site_id: siteId,
53
+ url: args.url,
54
+ platform: args.platform ?? 'auto',
55
+ is_default: isDefault,
56
+ added_at: now(),
57
+ ...(args.label !== undefined && args.label.length > 0
58
+ ? { label: args.label }
59
+ : {}),
60
+ };
61
+ if (args.token !== undefined && args.token.length > 0) {
62
+ return { ...base, bearer: args.token };
63
+ }
64
+ // token-ref guaranteed by validateArgs.
65
+ return { ...base, bearer_ref: args.tokenRef };
66
+ }
67
+ /**
68
+ * Validate the CLI arg combination before any file IO. Throws
69
+ * {@link AddSiteError} with a stable `code` on the first violation.
70
+ */
71
+ function validateArgs(args) {
72
+ if (args.url === undefined || args.url.length === 0) {
73
+ throw new AddSiteError('URL_REQUIRED', 'Flag --url is required.');
74
+ }
75
+ try {
76
+ void new URL(args.url);
77
+ }
78
+ catch {
79
+ throw new AddSiteError('URL_INVALID', `--url is not a valid web address: ${args.url}`);
80
+ }
81
+ const hasToken = args.token !== undefined && args.token.length > 0;
82
+ const hasRef = args.tokenRef !== undefined && args.tokenRef.length > 0;
83
+ if (!hasToken && !hasRef) {
84
+ throw new AddSiteError('BEARER_REQUIRED', 'Either --token <bearer> or --token-ref <op://...> is required.');
85
+ }
86
+ if (hasToken && hasRef) {
87
+ throw new AddSiteError('BEARER_MUTUAL_EXCLUSION', '--token and --token-ref are mutually exclusive. Pick one.');
88
+ }
89
+ if (hasToken && !BEARER_REGEX.test(args.token)) {
90
+ throw new AddSiteError('BEARER_INVALID', '--token does not match the expected Bearer shape ' +
91
+ '(ytb_(live|test)_<payload>.<signature>).');
92
+ }
93
+ if (hasRef && !OP_REF_REGEX.test(args.tokenRef)) {
94
+ throw new AddSiteError('TOKEN_REF_INVALID', '--token-ref does not match the expected 1Password ref shape ' +
95
+ '(op://<vault>/<item>/<field>).');
96
+ }
97
+ const siteId = args.siteId ?? 'default';
98
+ if (!SITE_ID_REGEX.test(siteId)) {
99
+ throw new AddSiteError('SITE_ID_INVALID', `--site-id "${siteId}" must match letters / digits / dash / underscore only.`);
100
+ }
101
+ if (args.platform !== undefined
102
+ && args.platform !== 'auto'
103
+ && args.platform !== 'wordpress'
104
+ && args.platform !== 'joomla') {
105
+ throw new AddSiteError('PLATFORM_INVALID', `--platform must be one of: auto, wordpress, joomla (got "${String(args.platform)}").`);
106
+ }
107
+ if (args.label !== undefined && args.label.length > 120) {
108
+ throw new AddSiteError('LABEL_TOO_LONG', `--label exceeds 120 characters (got ${String(args.label.length)}).`);
109
+ }
110
+ }
111
+ /**
112
+ * Add (or overwrite-with-`--yes`) a single site entry. See file header
113
+ * for the auto-default / mutual-exclusion / idempotency contract.
114
+ *
115
+ * @throws {AddSiteError} on any input-validation failure or when the
116
+ * site_id already exists and `--yes` was not passed.
117
+ */
118
+ export async function addSiteCommand(args, path, deps) {
119
+ validateArgs(args);
120
+ const siteId = args.siteId ?? 'default';
121
+ const now = deps.now ?? (() => new Date().toISOString());
122
+ const file = await deps.load(path);
123
+ const existingIndex = file.sites.findIndex((s) => s.site_id === siteId);
124
+ const exists = existingIndex >= 0;
125
+ if (exists && args.yes !== true) {
126
+ throw new AddSiteError('SITE_ID_EXISTS', `Site "${siteId}" already exists in ${path}. ` +
127
+ `Pass --yes to overwrite or pick a different --site-id.`);
128
+ }
129
+ // Auto-default policy:
130
+ // - first ever site → always default (regardless of --default).
131
+ // - subsequent sites with --default → flip is_default + update
132
+ // file.default_site_id.
133
+ // - overwrite of an existing site → preserve its prior is_default
134
+ // UNLESS --default was explicitly passed (then we promote it).
135
+ const isFirstEver = !exists && file.sites.length === 0;
136
+ const wantsDefault = args.default === true || isFirstEver;
137
+ let isDefault = wantsDefault;
138
+ if (exists && !wantsDefault) {
139
+ const prior = file.sites[existingIndex];
140
+ if (prior !== undefined)
141
+ isDefault = prior.is_default;
142
+ }
143
+ const entry = buildEntry(args, siteId, isDefault, now);
144
+ // Build the new sites array — replace in place on overwrite to
145
+ // preserve insertion order, append otherwise.
146
+ const nextSites = exists
147
+ ? file.sites.map((s, i) => (i === existingIndex ? entry : s))
148
+ : [...file.sites, entry];
149
+ // When this entry becomes the default, clear any other site's
150
+ // is_default flag so the W1 invariant (at most one default) holds.
151
+ const sitesWithDefaultFixed = isDefault
152
+ ? nextSites.map((s) => s.site_id === siteId ? s : { ...s, is_default: false })
153
+ : nextSites;
154
+ const defaultSiteId = isDefault
155
+ ? siteId
156
+ : file.default_site_id;
157
+ const nextFile = {
158
+ schema_version: 1,
159
+ default_site_id: defaultSiteId,
160
+ sites: sitesWithDefaultFixed,
161
+ };
162
+ await deps.save(path, nextFile);
163
+ return {
164
+ siteId,
165
+ path,
166
+ becameDefault: isFirstEver,
167
+ overwritten: exists,
168
+ defaultRequested: args.default === true,
169
+ };
170
+ }
171
+ /**
172
+ * Default IO deps wired to the real store. Exported so the dispatcher
173
+ * + the W9 wizard-internal call-site can both share them without
174
+ * duplicating the import surface.
175
+ */
176
+ export const DEFAULT_ADD_SITE_DEPS = {
177
+ // W12-R1.3 (A1-N-01): saveSitesFile is already a static import
178
+ // above; switch load to the same static binding so the runtime
179
+ // dependency graph matches the import graph and bundlers/tree-
180
+ // shakers don't have to chase a dynamic import for a path that's
181
+ // always reached.
182
+ load: loadSitesFile,
183
+ save: saveSitesFile,
184
+ };
185
+ //# sourceMappingURL=add-site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-site.js","sourceRoot":"","sources":["../../../src/sites/cli/add-site.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,aAAa,GAGhB,MAAM,cAAc,CAAC;AA8CtB;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACP;IAA5B,YAA4B,IAAY,EAAE,OAAe;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QADS,SAAI,GAAJ,IAAI,CAAQ;QAEpC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC/B,CAAC;CACJ;AAED;;;;GAIG;AACH,SAAS,UAAU,CACf,IAAiB,EACjB,MAAc,EACd,SAAkB,EAClB,GAAiB;IAEjB,MAAM,IAAI,GAAG;QACT,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM;QACjC,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,GAAG,EAAE;QACf,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACjD,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;YACvB,CAAC,CAAC,EAAE,CAAC;KACH,CAAC;IAEX,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAgB,CAAC;IACzD,CAAC;IACD,wCAAwC;IACxC,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,QAAS,EAAgB,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAiB;IACnC,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC;QACD,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,YAAY,CAClB,aAAa,EACb,qCAAqC,IAAI,CAAC,GAAG,EAAE,CAClD,CAAC;IACN,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvE,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,CAClB,iBAAiB,EACjB,gEAAgE,CACnE,CAAC;IACN,CAAC;IACD,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,YAAY,CAClB,yBAAyB,EACzB,2DAA2D,CAC9D,CAAC;IACN,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,YAAY,CAClB,gBAAgB,EAChB,mDAAmD;YAC/C,0CAA0C,CACjD,CAAC;IACN,CAAC;IACD,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAS,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,YAAY,CAClB,mBAAmB,EACnB,8DAA8D;YAC1D,gCAAgC,CACvC,CAAC;IACN,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,YAAY,CAClB,iBAAiB,EACjB,cAAc,MAAM,yDAAyD,CAChF,CAAC;IACN,CAAC;IAED,IACI,IAAI,CAAC,QAAQ,KAAK,SAAS;WACxB,IAAI,CAAC,QAAQ,KAAK,MAAM;WACxB,IAAI,CAAC,QAAQ,KAAK,WAAW;WAC7B,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAC/B,CAAC;QACC,MAAM,IAAI,YAAY,CAClB,kBAAkB,EAClB,4DAA4D,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CACzF,CAAC;IACN,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACtD,MAAM,IAAI,YAAY,CAClB,gBAAgB,EAChB,uCAAuC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CACvE,CAAC;IACN,CAAC;AACL,CAAC;AAaD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,IAAiB,EACjB,IAAY,EACZ,IAAiB;IAEjB,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAW,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,aAAa,IAAI,CAAC,CAAC;IAElC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,YAAY,CAClB,gBAAgB,EAChB,SAAS,MAAM,uBAAuB,IAAI,IAAI;YAC1C,wDAAwD,CAC/D,CAAC;IACN,CAAC;IAED,uBAAuB;IACvB,iEAAiE;IACjE,gEAAgE;IAChE,2BAA2B;IAC3B,mEAAmE;IACnE,kEAAkE;IAClE,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,WAAW,CAAC;IAE1D,IAAI,SAAS,GAAG,YAAY,CAAC;IAC7B,IAAI,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;IAC1D,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAEvD,+DAA+D;IAC/D,8CAA8C;IAC9C,MAAM,SAAS,GAAiB,MAAM;QAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE7B,8DAA8D;IAC9D,mEAAmE;IACnE,MAAM,qBAAqB,GAAiB,SAAS;QACjD,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAChB,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CACzD;QACH,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,aAAa,GAAkB,SAAS;QAC1C,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IAE3B,MAAM,QAAQ,GAAe;QACzB,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,aAAa;QAC9B,KAAK,EAAE,qBAAqB;KAC/B,CAAC;IAEF,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEhC,OAAO;QACH,MAAM;QACN,IAAI;QACJ,aAAa,EAAE,WAAW;QAC1B,WAAW,EAAE,MAAM;QACnB,gBAAgB,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI;KAC1C,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IAC9C,+DAA+D;IAC/D,+DAA+D;IAC/D,+DAA+D;IAC/D,iEAAiE;IACjE,kBAAkB;IAClB,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,aAAa;CACtB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * W9 — `list-sites` CLI subcommand.
3
+ *
4
+ * Reads `sites.json`, prints a tabular view matching the structure of
5
+ * the `yootheme_builder_sites_list` MCP tool. NEVER reaches for the
6
+ * secret-resolver — the table only exposes `bearer_source: 'plain' |
7
+ * 'op'` so an in-progress 1Password unlock cannot wedge the CLI.
8
+ *
9
+ * Output contract (verbatim columns, in order):
10
+ * SITE_ID URL PLATFORM DEFAULT LABEL BEARER
11
+ *
12
+ * Empty registry prints "(no sites configured)" + a discovery hint
13
+ * pointing at `add-site`. The exit code is always 0 on a successful
14
+ * read — even an empty registry is a normal state, not an error.
15
+ *
16
+ * @license MIT
17
+ */
18
+ import type { SitesFileT } from '../schema.js';
19
+ /** Test-injection seam — production callers use the defaults below. */
20
+ export interface ListSitesDeps {
21
+ readonly load: (path: string) => Promise<SitesFileT>;
22
+ readonly log?: (line: string) => void;
23
+ }
24
+ /**
25
+ * Render the sites registry to stdout. Returns the rendered lines so
26
+ * tests can assert without parsing captured stdout; the caller is
27
+ * still expected to print them via `deps.log` for the live CLI path.
28
+ */
29
+ export declare function listSitesCommand(path: string, deps: ListSitesDeps): Promise<readonly string[]>;
30
+ /**
31
+ * Pure renderer — exported for direct test coverage of the layout.
32
+ * Layout: fixed-width left-padded columns, header on row 0, divider on
33
+ * row 1, one row per site. Last line always carries the discovery hint
34
+ * (or empty-registry hint) so a Maria-class user always sees the next
35
+ * step.
36
+ */
37
+ export declare function renderSitesTable(file: SitesFileT): readonly string[];
38
+ /** Default deps wired to the real store. */
39
+ export declare const DEFAULT_LIST_SITES_DEPS: ListSitesDeps;
40
+ //# sourceMappingURL=list-sites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-sites.d.ts","sourceRoot":"","sources":["../../../src/sites/cli/list-sites.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAO5B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,CA8EpE;AAED,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,EAAE,aAErC,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * W9 — `list-sites` CLI subcommand.
3
+ *
4
+ * Reads `sites.json`, prints a tabular view matching the structure of
5
+ * the `yootheme_builder_sites_list` MCP tool. NEVER reaches for the
6
+ * secret-resolver — the table only exposes `bearer_source: 'plain' |
7
+ * 'op'` so an in-progress 1Password unlock cannot wedge the CLI.
8
+ *
9
+ * Output contract (verbatim columns, in order):
10
+ * SITE_ID URL PLATFORM DEFAULT LABEL BEARER
11
+ *
12
+ * Empty registry prints "(no sites configured)" + a discovery hint
13
+ * pointing at `add-site`. The exit code is always 0 on a successful
14
+ * read — even an empty registry is a normal state, not an error.
15
+ *
16
+ * @license MIT
17
+ */
18
+ import { SiteRegistry } from '../registry.js';
19
+ import { loadSitesFile } from '../store.js';
20
+ /**
21
+ * Render the sites registry to stdout. Returns the rendered lines so
22
+ * tests can assert without parsing captured stdout; the caller is
23
+ * still expected to print them via `deps.log` for the live CLI path.
24
+ */
25
+ export async function listSitesCommand(path, deps) {
26
+ const file = await deps.load(path);
27
+ const lines = renderSitesTable(file);
28
+ if (deps.log !== undefined) {
29
+ for (const line of lines)
30
+ deps.log(line);
31
+ }
32
+ return lines;
33
+ }
34
+ /**
35
+ * Pure renderer — exported for direct test coverage of the layout.
36
+ * Layout: fixed-width left-padded columns, header on row 0, divider on
37
+ * row 1, one row per site. Last line always carries the discovery hint
38
+ * (or empty-registry hint) so a Maria-class user always sees the next
39
+ * step.
40
+ */
41
+ export function renderSitesTable(file) {
42
+ if (file.sites.length === 0) {
43
+ return [
44
+ '(no sites configured)',
45
+ '',
46
+ 'Add one with: yt-builder-mcp add-site --url https://example.com --token <bearer>',
47
+ ];
48
+ }
49
+ // Build a registry purely so we can reuse listForDisplay's shape.
50
+ // The platform probe is never triggered because this CLI never
51
+ // calls platformFor().
52
+ const registry = new SiteRegistry(file);
53
+ const rows = registry.listForDisplay();
54
+ const defaultSiteId = registry.defaultSiteId();
55
+ // W12-R1.3 — bearer_source column dropped for consistency with the
56
+ // MCP `sites_list` tool + the `sites://current` resource. The CLI
57
+ // never needed it (the operator already knows which form they
58
+ // chose); keeping it here would be a divergence surface only.
59
+ const COLUMNS = [
60
+ { key: 'site_id', label: 'SITE_ID', width: 20 },
61
+ { key: 'url', label: 'URL', width: 36 },
62
+ { key: 'platform', label: 'PLATFORM', width: 11 },
63
+ { key: 'default', label: 'DEFAULT', width: 9 },
64
+ { key: 'label', label: 'LABEL', width: 24 },
65
+ ];
66
+ function pad(text, width) {
67
+ if (text.length >= width)
68
+ return text.slice(0, width);
69
+ return text + ' '.repeat(width - text.length);
70
+ }
71
+ /**
72
+ * W12-R1.3 (A2-L2): strip ANSI escape codes + control characters
73
+ * from operator-provided strings before printing. A malicious or
74
+ * accidentally-pasted label could otherwise repaint the terminal
75
+ * ("\x1b[2J\x1b[H", "\r" cursor reset, etc.) and hide other rows.
76
+ * Replaces all ESC + C0 control bytes with `?` so the cell stays
77
+ * fixed-width.
78
+ */
79
+ function sanitiseForTerminal(text) {
80
+ return text.replace(/[\x00-\x1f\x7f]/g, '?');
81
+ }
82
+ const header = COLUMNS.map((c) => pad(c.label, c.width)).join(' ');
83
+ const divider = COLUMNS.map((c) => '-'.repeat(c.width)).join(' ');
84
+ const dataLines = rows.map((row) => {
85
+ const platform = row.platform_resolved ?? row.platform_hint;
86
+ const def = row.is_default ? 'yes' : 'no';
87
+ const label = sanitiseForTerminal(row.label ?? '');
88
+ const cells = [
89
+ pad(row.site_id, COLUMNS[0].width),
90
+ pad(row.url, COLUMNS[1].width),
91
+ pad(platform, COLUMNS[2].width),
92
+ pad(def, COLUMNS[3].width),
93
+ pad(label, COLUMNS[4].width),
94
+ ];
95
+ return cells.join(' ');
96
+ });
97
+ const total = rows.length;
98
+ const summary = `${String(total)} configured site${total === 1 ? '' : 's'}` +
99
+ (defaultSiteId !== null
100
+ ? ` (default: ${defaultSiteId})`
101
+ : ' (no default configured)');
102
+ return [
103
+ summary,
104
+ '',
105
+ header,
106
+ divider,
107
+ ...dataLines,
108
+ '',
109
+ 'Use `yt-builder-mcp test-site <site_id>` to verify connectivity.',
110
+ ];
111
+ }
112
+ /** Default deps wired to the real store. */
113
+ export const DEFAULT_LIST_SITES_DEPS = {
114
+ load: loadSitesFile,
115
+ };
116
+ //# sourceMappingURL=list-sites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-sites.js","sourceRoot":"","sources":["../../../src/sites/cli/list-sites.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * W9 — `remove-site` CLI subcommand.
3
+ *
4
+ * Removes ONE site entry by `site_id`. Auto-promotion policy (per
5
+ * plan §C.3):
6
+ * - Removing a non-default site → plain delete, default_site_id and
7
+ * the other entries' is_default flags are untouched.
8
+ * - Removing the default AND there is at least one other site →
9
+ * promote the next-in-insertion-order site to default
10
+ * (`is_default:true` + `default_site_id` update).
11
+ * - Removing the only site → `default_site_id: null`, empty array.
12
+ *
13
+ * Returns a structured {@link RemoveSiteResult} so the dispatcher can
14
+ * render the "(default → promoted X)" hint and tests can assert
15
+ * promotion behaviour without parsing stdout.
16
+ *
17
+ * `--yes` skips the confirmation hook supplied by the dispatcher.
18
+ * Production callers always wire a confirm hook; tests pass yes=true
19
+ * to bypass it.
20
+ *
21
+ * @license MIT
22
+ */
23
+ import type { SitesFileT } from '../schema.js';
24
+ export interface RemoveSiteOptions {
25
+ /** Skip confirmation when true. CLI passes through from --yes. */
26
+ readonly yes?: boolean;
27
+ }
28
+ export interface RemoveSiteResult {
29
+ readonly siteId: string;
30
+ /** Path of the sites.json that was written. */
31
+ readonly path: string;
32
+ /** site_id that was promoted to default (only when removing default + ≥1 other). */
33
+ readonly promoted?: string;
34
+ /** True when the registry became empty after the remove. */
35
+ readonly nowEmpty: boolean;
36
+ /** True when no write happened because --yes was missing on confirm. */
37
+ readonly cancelled: boolean;
38
+ }
39
+ export declare class RemoveSiteError extends Error {
40
+ readonly code: string;
41
+ constructor(code: string, message: string);
42
+ }
43
+ /** Test/IO injection seam. */
44
+ export interface RemoveSiteDeps {
45
+ readonly load: (path: string) => Promise<SitesFileT>;
46
+ readonly save: (path: string, data: SitesFileT) => Promise<void>;
47
+ /**
48
+ * Confirm hook. Production dispatcher wires this to a clack
49
+ * prompt; tests pass `--yes` so this is never invoked.
50
+ */
51
+ readonly confirm?: (message: string) => Promise<boolean>;
52
+ }
53
+ /**
54
+ * Remove a site by `site_id`. See file header for the auto-promotion
55
+ * policy. Throws {@link RemoveSiteError} with code `'UNKNOWN_SITE'`
56
+ * when `siteId` is not in the registry.
57
+ */
58
+ export declare function removeSiteCommand(siteId: string, path: string, opts: RemoveSiteOptions, deps: RemoveSiteDeps): Promise<RemoveSiteResult>;
59
+ export declare const DEFAULT_REMOVE_SITE_DEPS: RemoveSiteDeps;
60
+ //# sourceMappingURL=remove-site.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-site.d.ts","sourceRoot":"","sources":["../../../src/sites/cli/remove-site.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,eAAgB,SAAQ,KAAK;aACV,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI5D;AAED,8BAA8B;AAC9B,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5D;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,cAAc,GACrB,OAAO,CAAC,gBAAgB,CAAC,CA8F3B;AAED,eAAO,MAAM,wBAAwB,EAAE,cAGtC,CAAC"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * W9 — `remove-site` CLI subcommand.
3
+ *
4
+ * Removes ONE site entry by `site_id`. Auto-promotion policy (per
5
+ * plan §C.3):
6
+ * - Removing a non-default site → plain delete, default_site_id and
7
+ * the other entries' is_default flags are untouched.
8
+ * - Removing the default AND there is at least one other site →
9
+ * promote the next-in-insertion-order site to default
10
+ * (`is_default:true` + `default_site_id` update).
11
+ * - Removing the only site → `default_site_id: null`, empty array.
12
+ *
13
+ * Returns a structured {@link RemoveSiteResult} so the dispatcher can
14
+ * render the "(default → promoted X)" hint and tests can assert
15
+ * promotion behaviour without parsing stdout.
16
+ *
17
+ * `--yes` skips the confirmation hook supplied by the dispatcher.
18
+ * Production callers always wire a confirm hook; tests pass yes=true
19
+ * to bypass it.
20
+ *
21
+ * @license MIT
22
+ */
23
+ import { saveSitesFile, loadSitesFile } from '../store.js';
24
+ export class RemoveSiteError extends Error {
25
+ code;
26
+ constructor(code, message) {
27
+ super(message);
28
+ this.code = code;
29
+ this.name = 'RemoveSiteError';
30
+ }
31
+ }
32
+ /**
33
+ * Remove a site by `site_id`. See file header for the auto-promotion
34
+ * policy. Throws {@link RemoveSiteError} with code `'UNKNOWN_SITE'`
35
+ * when `siteId` is not in the registry.
36
+ */
37
+ export async function removeSiteCommand(siteId, path, opts, deps) {
38
+ const file = await deps.load(path);
39
+ const index = file.sites.findIndex((s) => s.site_id === siteId);
40
+ if (index < 0) {
41
+ throw new RemoveSiteError('UNKNOWN_SITE', `Site "${siteId}" not found in ${path}. ` +
42
+ (file.sites.length > 0
43
+ ? `Available: ${file.sites.map((s) => s.site_id).join(', ')}.`
44
+ : '(no sites configured)'));
45
+ }
46
+ // W12-R2A (A2-H1) — fail-closed guard. Round 1's check silently
47
+ // proceeded when neither `--yes` NOR a confirm hook was supplied
48
+ // (deps.confirm === undefined). That made the destructive op a
49
+ // no-prompt delete in any non-TTY context (CI, piped stdin, MCP
50
+ // server stdio). Tighten to: if `--yes` is not set, a confirm hook
51
+ // is REQUIRED — otherwise throw a typed error so the dispatcher
52
+ // can surface "pass --yes" with a non-zero exit code.
53
+ if (opts.yes !== true) {
54
+ if (deps.confirm === undefined) {
55
+ throw new RemoveSiteError('CONFIRM_REQUIRED', `Remove of site "${siteId}" requires --yes (no interactive `
56
+ + `confirm available in this context). Re-run with --yes to skip the prompt.`);
57
+ }
58
+ const cont = await deps.confirm(`Remove site "${siteId}" from ${path}?`);
59
+ if (!cont) {
60
+ return {
61
+ siteId,
62
+ path,
63
+ nowEmpty: false,
64
+ cancelled: true,
65
+ };
66
+ }
67
+ }
68
+ const wasDefault = file.sites[index]?.is_default === true
69
+ || file.default_site_id === siteId;
70
+ // Drop the target entry, preserving insertion order.
71
+ const remaining = file.sites.filter((_, i) => i !== index);
72
+ let promoted;
73
+ let nextSites = remaining;
74
+ let nextDefaultId = file.default_site_id;
75
+ if (wasDefault) {
76
+ if (remaining.length === 0) {
77
+ nextDefaultId = null;
78
+ }
79
+ else {
80
+ const promote = remaining[0];
81
+ if (promote === undefined) {
82
+ // unreachable due to length check, but keeps TS strict.
83
+ nextDefaultId = null;
84
+ }
85
+ else {
86
+ promoted = promote.site_id;
87
+ nextDefaultId = promote.site_id;
88
+ nextSites = remaining.map((s, i) => ({
89
+ ...s,
90
+ is_default: i === 0,
91
+ }));
92
+ }
93
+ }
94
+ }
95
+ else {
96
+ // Make sure default_site_id still points at a present entry.
97
+ if (nextDefaultId !== null
98
+ && !remaining.some((s) => s.site_id === nextDefaultId)) {
99
+ nextDefaultId = null;
100
+ }
101
+ }
102
+ const nextFile = {
103
+ schema_version: 1,
104
+ default_site_id: nextDefaultId,
105
+ sites: nextSites,
106
+ };
107
+ await deps.save(path, nextFile);
108
+ return {
109
+ siteId,
110
+ path,
111
+ ...(promoted !== undefined ? { promoted } : {}),
112
+ nowEmpty: nextSites.length === 0,
113
+ cancelled: false,
114
+ };
115
+ }
116
+ export const DEFAULT_REMOVE_SITE_DEPS = {
117
+ load: loadSitesFile,
118
+ save: saveSitesFile,
119
+ };
120
+ //# sourceMappingURL=remove-site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-site.js","sourceRoot":"","sources":["../../../src/sites/cli/remove-site.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * W9 — `set-default` CLI subcommand.
3
+ *
4
+ * Flips the `is_default` flag on the target entry to `true`, clears
5
+ * it on every other entry, and updates `default_site_id` to the
6
+ * target. Fails with code `'UNKNOWN_SITE'` when the site_id is not
7
+ * present.
8
+ *
9
+ * Idempotent: setting the already-default site as default is a
10
+ * successful no-op (the file is still rewritten so any drift between
11
+ * `default_site_id` and the per-entry `is_default` flag is healed in
12
+ * the same pass).
13
+ *
14
+ * @license MIT
15
+ */
16
+ import type { SitesFileT } from '../schema.js';
17
+ export interface SetDefaultOptions {
18
+ /** Skip the confirmation prompt when true. CLI passes through from --yes. */
19
+ readonly yes?: boolean;
20
+ }
21
+ export interface SetDefaultResult {
22
+ readonly siteId: string;
23
+ readonly path: string;
24
+ /** site_id that was the default BEFORE this call (null when none). */
25
+ readonly previousDefault: string | null;
26
+ /** True when no write happened because the confirm hook rejected. */
27
+ readonly cancelled: boolean;
28
+ }
29
+ export declare class SetDefaultError extends Error {
30
+ readonly code: string;
31
+ constructor(code: string, message: string);
32
+ }
33
+ export interface SetDefaultDeps {
34
+ readonly load: (path: string) => Promise<SitesFileT>;
35
+ readonly save: (path: string, data: SitesFileT) => Promise<void>;
36
+ /**
37
+ * Confirm hook. Production dispatcher wires this to a y/N readline
38
+ * prompt; tests pass `--yes` so this is never invoked. W12-R2A:
39
+ * `set-default` is destructive in the routing sense — every
40
+ * subsequent tool call routes to the new default — so the guard
41
+ * matches the remove-site shape.
42
+ */
43
+ readonly confirm?: (message: string) => Promise<boolean>;
44
+ }
45
+ export declare function setDefaultCommand(siteId: string, path: string, opts: SetDefaultOptions, deps: SetDefaultDeps): Promise<SetDefaultResult>;
46
+ export declare const DEFAULT_SET_DEFAULT_DEPS: SetDefaultDeps;
47
+ //# sourceMappingURL=set-default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-default.d.ts","sourceRoot":"","sources":["../../../src/sites/cli/set-default.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,eAAgB,SAAQ,KAAK;aACV,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI5D;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5D;AAED,wBAAsB,iBAAiB,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,cAAc,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAqD3B;AAED,eAAO,MAAM,wBAAwB,EAAE,cAGtC,CAAC"}