@wootsup/yt-builder-mcp 0.2.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/bin/yt-builder-mcp.js +59 -0
  4. package/dist/auth.d.ts +39 -0
  5. package/dist/auth.d.ts.map +1 -0
  6. package/dist/auth.js +93 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/client.d.ts +84 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +151 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/clients/claude-code.d.ts +18 -0
  13. package/dist/clients/claude-code.d.ts.map +1 -0
  14. package/dist/clients/claude-code.js +53 -0
  15. package/dist/clients/claude-code.js.map +1 -0
  16. package/dist/clients/claude-desktop.d.ts +19 -0
  17. package/dist/clients/claude-desktop.d.ts.map +1 -0
  18. package/dist/clients/claude-desktop.js +56 -0
  19. package/dist/clients/claude-desktop.js.map +1 -0
  20. package/dist/clients/cline.d.ts +26 -0
  21. package/dist/clients/cline.d.ts.map +1 -0
  22. package/dist/clients/cline.js +80 -0
  23. package/dist/clients/cline.js.map +1 -0
  24. package/dist/clients/codex-cli.d.ts +42 -0
  25. package/dist/clients/codex-cli.d.ts.map +1 -0
  26. package/dist/clients/codex-cli.js +194 -0
  27. package/dist/clients/codex-cli.js.map +1 -0
  28. package/dist/clients/continue.d.ts +13 -0
  29. package/dist/clients/continue.d.ts.map +1 -0
  30. package/dist/clients/continue.js +52 -0
  31. package/dist/clients/continue.js.map +1 -0
  32. package/dist/clients/cursor.d.ts +12 -0
  33. package/dist/clients/cursor.d.ts.map +1 -0
  34. package/dist/clients/cursor.js +38 -0
  35. package/dist/clients/cursor.js.map +1 -0
  36. package/dist/clients/gemini-cli.d.ts +18 -0
  37. package/dist/clients/gemini-cli.d.ts.map +1 -0
  38. package/dist/clients/gemini-cli.js +44 -0
  39. package/dist/clients/gemini-cli.js.map +1 -0
  40. package/dist/clients/home.d.ts +14 -0
  41. package/dist/clients/home.d.ts.map +1 -0
  42. package/dist/clients/home.js +20 -0
  43. package/dist/clients/home.js.map +1 -0
  44. package/dist/clients/index.d.ts +52 -0
  45. package/dist/clients/index.d.ts.map +1 -0
  46. package/dist/clients/index.js +72 -0
  47. package/dist/clients/index.js.map +1 -0
  48. package/dist/clients/roo-code.d.ts +23 -0
  49. package/dist/clients/roo-code.d.ts.map +1 -0
  50. package/dist/clients/roo-code.js +69 -0
  51. package/dist/clients/roo-code.js.map +1 -0
  52. package/dist/clients/zed.d.ts +12 -0
  53. package/dist/clients/zed.d.ts.map +1 -0
  54. package/dist/clients/zed.js +41 -0
  55. package/dist/clients/zed.js.map +1 -0
  56. package/dist/errors/hints.d.ts +51 -0
  57. package/dist/errors/hints.d.ts.map +1 -0
  58. package/dist/errors/hints.js +95 -0
  59. package/dist/errors/hints.js.map +1 -0
  60. package/dist/errors/mask.d.ts +35 -0
  61. package/dist/errors/mask.d.ts.map +1 -0
  62. package/dist/errors/mask.js +49 -0
  63. package/dist/errors/mask.js.map +1 -0
  64. package/dist/errors/sanitize.d.ts +31 -0
  65. package/dist/errors/sanitize.d.ts.map +1 -0
  66. package/dist/errors/sanitize.js +90 -0
  67. package/dist/errors/sanitize.js.map +1 -0
  68. package/dist/errors.d.ts +42 -0
  69. package/dist/errors.d.ts.map +1 -0
  70. package/dist/errors.js +61 -0
  71. package/dist/errors.js.map +1 -0
  72. package/dist/gateway/advanced-tool/discovery.d.ts +19 -0
  73. package/dist/gateway/advanced-tool/discovery.d.ts.map +1 -0
  74. package/dist/gateway/advanced-tool/discovery.js +53 -0
  75. package/dist/gateway/advanced-tool/discovery.js.map +1 -0
  76. package/dist/gateway/advanced-tool/domains.d.ts +42 -0
  77. package/dist/gateway/advanced-tool/domains.d.ts.map +1 -0
  78. package/dist/gateway/advanced-tool/domains.js +88 -0
  79. package/dist/gateway/advanced-tool/domains.js.map +1 -0
  80. package/dist/gateway/advanced-tool/execute.d.ts +29 -0
  81. package/dist/gateway/advanced-tool/execute.d.ts.map +1 -0
  82. package/dist/gateway/advanced-tool/execute.js +54 -0
  83. package/dist/gateway/advanced-tool/execute.js.map +1 -0
  84. package/dist/gateway/advanced-tool/index.d.ts +36 -0
  85. package/dist/gateway/advanced-tool/index.d.ts.map +1 -0
  86. package/dist/gateway/advanced-tool/index.js +39 -0
  87. package/dist/gateway/advanced-tool/index.js.map +1 -0
  88. package/dist/gateway/advanced-tool/register.d.ts +18 -0
  89. package/dist/gateway/advanced-tool/register.d.ts.map +1 -0
  90. package/dist/gateway/advanced-tool/register.js +62 -0
  91. package/dist/gateway/advanced-tool/register.js.map +1 -0
  92. package/dist/gateway/advanced-tool.d.ts +13 -0
  93. package/dist/gateway/advanced-tool.d.ts.map +1 -0
  94. package/dist/gateway/advanced-tool.js +13 -0
  95. package/dist/gateway/advanced-tool.js.map +1 -0
  96. package/dist/gateway/capturing-server.d.ts +117 -0
  97. package/dist/gateway/capturing-server.d.ts.map +1 -0
  98. package/dist/gateway/capturing-server.js +103 -0
  99. package/dist/gateway/capturing-server.js.map +1 -0
  100. package/dist/gateway/essentials.d.ts +49 -0
  101. package/dist/gateway/essentials.d.ts.map +1 -0
  102. package/dist/gateway/essentials.js +62 -0
  103. package/dist/gateway/essentials.js.map +1 -0
  104. package/dist/gateway/test-support.d.ts +41 -0
  105. package/dist/gateway/test-support.d.ts.map +1 -0
  106. package/dist/gateway/test-support.js +60 -0
  107. package/dist/gateway/test-support.js.map +1 -0
  108. package/dist/index.d.ts +25 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +77 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/install-skill.d.ts +35 -0
  113. package/dist/install-skill.d.ts.map +1 -0
  114. package/dist/install-skill.js +107 -0
  115. package/dist/install-skill.js.map +1 -0
  116. package/dist/platform/index.d.ts +49 -0
  117. package/dist/platform/index.d.ts.map +1 -0
  118. package/dist/platform/index.js +38 -0
  119. package/dist/platform/index.js.map +1 -0
  120. package/dist/server.d.ts +50 -0
  121. package/dist/server.d.ts.map +1 -0
  122. package/dist/server.js +117 -0
  123. package/dist/server.js.map +1 -0
  124. package/dist/setup-cli.d.ts +100 -0
  125. package/dist/setup-cli.d.ts.map +1 -0
  126. package/dist/setup-cli.js +355 -0
  127. package/dist/setup-cli.js.map +1 -0
  128. package/dist/setup-prompts.d.ts +41 -0
  129. package/dist/setup-prompts.d.ts.map +1 -0
  130. package/dist/setup-prompts.js +142 -0
  131. package/dist/setup-prompts.js.map +1 -0
  132. package/dist/setup-token.d.ts +38 -0
  133. package/dist/setup-token.d.ts.map +1 -0
  134. package/dist/setup-token.js +106 -0
  135. package/dist/setup-token.js.map +1 -0
  136. package/dist/setup-wizard-defaults.d.ts +43 -0
  137. package/dist/setup-wizard-defaults.d.ts.map +1 -0
  138. package/dist/setup-wizard-defaults.js +160 -0
  139. package/dist/setup-wizard-defaults.js.map +1 -0
  140. package/dist/setup-wizard-handshake.d.ts +25 -0
  141. package/dist/setup-wizard-handshake.d.ts.map +1 -0
  142. package/dist/setup-wizard-handshake.js +103 -0
  143. package/dist/setup-wizard-handshake.js.map +1 -0
  144. package/dist/setup-wizard-types.d.ts +148 -0
  145. package/dist/setup-wizard-types.d.ts.map +1 -0
  146. package/dist/setup-wizard-types.js +11 -0
  147. package/dist/setup-wizard-types.js.map +1 -0
  148. package/dist/setup-wizard.d.ts +33 -0
  149. package/dist/setup-wizard.d.ts.map +1 -0
  150. package/dist/setup-wizard.js +166 -0
  151. package/dist/setup-wizard.js.map +1 -0
  152. package/dist/setup.d.ts +17 -0
  153. package/dist/setup.d.ts.map +1 -0
  154. package/dist/setup.js +33 -0
  155. package/dist/setup.js.map +1 -0
  156. package/dist/tools/elements/builders.d.ts +24 -0
  157. package/dist/tools/elements/builders.d.ts.map +1 -0
  158. package/dist/tools/elements/builders.js +150 -0
  159. package/dist/tools/elements/builders.js.map +1 -0
  160. package/dist/tools/elements/handlers-write.d.ts +48 -0
  161. package/dist/tools/elements/handlers-write.d.ts.map +1 -0
  162. package/dist/tools/elements/handlers-write.js +141 -0
  163. package/dist/tools/elements/handlers-write.js.map +1 -0
  164. package/dist/tools/elements/handlers.d.ts +56 -0
  165. package/dist/tools/elements/handlers.d.ts.map +1 -0
  166. package/dist/tools/elements/handlers.js +113 -0
  167. package/dist/tools/elements/handlers.js.map +1 -0
  168. package/dist/tools/elements/index.d.ts +28 -0
  169. package/dist/tools/elements/index.d.ts.map +1 -0
  170. package/dist/tools/elements/index.js +27 -0
  171. package/dist/tools/elements/index.js.map +1 -0
  172. package/dist/tools/elements.d.ts +13 -0
  173. package/dist/tools/elements.d.ts.map +1 -0
  174. package/dist/tools/elements.js +13 -0
  175. package/dist/tools/elements.js.map +1 -0
  176. package/dist/tools/elicitation.d.ts +87 -0
  177. package/dist/tools/elicitation.d.ts.map +1 -0
  178. package/dist/tools/elicitation.js +100 -0
  179. package/dist/tools/elicitation.js.map +1 -0
  180. package/dist/tools/format/elements-format.d.ts +34 -0
  181. package/dist/tools/format/elements-format.d.ts.map +1 -0
  182. package/dist/tools/format/elements-format.js +112 -0
  183. package/dist/tools/format/elements-format.js.map +1 -0
  184. package/dist/tools/format/health-format.d.ts +73 -0
  185. package/dist/tools/format/health-format.d.ts.map +1 -0
  186. package/dist/tools/format/health-format.js +178 -0
  187. package/dist/tools/format/health-format.js.map +1 -0
  188. package/dist/tools/format/inspection-format.d.ts +45 -0
  189. package/dist/tools/format/inspection-format.d.ts.map +1 -0
  190. package/dist/tools/format/inspection-format.js +125 -0
  191. package/dist/tools/format/inspection-format.js.map +1 -0
  192. package/dist/tools/format/pages-format.d.ts +39 -0
  193. package/dist/tools/format/pages-format.d.ts.map +1 -0
  194. package/dist/tools/format/pages-format.js +110 -0
  195. package/dist/tools/format/pages-format.js.map +1 -0
  196. package/dist/tools/format/sources-format.d.ts +25 -0
  197. package/dist/tools/format/sources-format.d.ts.map +1 -0
  198. package/dist/tools/format/sources-format.js +113 -0
  199. package/dist/tools/format/sources-format.js.map +1 -0
  200. package/dist/tools/health.d.ts +22 -0
  201. package/dist/tools/health.d.ts.map +1 -0
  202. package/dist/tools/health.js +147 -0
  203. package/dist/tools/health.js.map +1 -0
  204. package/dist/tools/index.d.ts +23 -0
  205. package/dist/tools/index.d.ts.map +1 -0
  206. package/dist/tools/index.js +23 -0
  207. package/dist/tools/index.js.map +1 -0
  208. package/dist/tools/inspection.d.ts +14 -0
  209. package/dist/tools/inspection.d.ts.map +1 -0
  210. package/dist/tools/inspection.js +115 -0
  211. package/dist/tools/inspection.js.map +1 -0
  212. package/dist/tools/layout-flatten.d.ts +63 -0
  213. package/dist/tools/layout-flatten.d.ts.map +1 -0
  214. package/dist/tools/layout-flatten.js +95 -0
  215. package/dist/tools/layout-flatten.js.map +1 -0
  216. package/dist/tools/pages/builders.d.ts +14 -0
  217. package/dist/tools/pages/builders.d.ts.map +1 -0
  218. package/dist/tools/pages/builders.js +97 -0
  219. package/dist/tools/pages/builders.js.map +1 -0
  220. package/dist/tools/pages/handlers-read.d.ts +24 -0
  221. package/dist/tools/pages/handlers-read.d.ts.map +1 -0
  222. package/dist/tools/pages/handlers-read.js +141 -0
  223. package/dist/tools/pages/handlers-read.js.map +1 -0
  224. package/dist/tools/pages/handlers-write.d.ts +21 -0
  225. package/dist/tools/pages/handlers-write.d.ts.map +1 -0
  226. package/dist/tools/pages/handlers-write.js +52 -0
  227. package/dist/tools/pages/handlers-write.js.map +1 -0
  228. package/dist/tools/pages/index.d.ts +17 -0
  229. package/dist/tools/pages/index.d.ts.map +1 -0
  230. package/dist/tools/pages/index.js +17 -0
  231. package/dist/tools/pages/index.js.map +1 -0
  232. package/dist/tools/pages/schemas.d.ts +30 -0
  233. package/dist/tools/pages/schemas.d.ts.map +1 -0
  234. package/dist/tools/pages/schemas.js +30 -0
  235. package/dist/tools/pages/schemas.js.map +1 -0
  236. package/dist/tools/pages.d.ts +13 -0
  237. package/dist/tools/pages.d.ts.map +1 -0
  238. package/dist/tools/pages.js +13 -0
  239. package/dist/tools/pages.js.map +1 -0
  240. package/dist/tools/progress-phases.d.ts +46 -0
  241. package/dist/tools/progress-phases.d.ts.map +1 -0
  242. package/dist/tools/progress-phases.js +48 -0
  243. package/dist/tools/progress-phases.js.map +1 -0
  244. package/dist/tools/shared-schemas.d.ts +15 -0
  245. package/dist/tools/shared-schemas.d.ts.map +1 -0
  246. package/dist/tools/shared-schemas.js +30 -0
  247. package/dist/tools/shared-schemas.js.map +1 -0
  248. package/dist/tools/sources/builders.d.ts +13 -0
  249. package/dist/tools/sources/builders.d.ts.map +1 -0
  250. package/dist/tools/sources/builders.js +88 -0
  251. package/dist/tools/sources/builders.js.map +1 -0
  252. package/dist/tools/sources/handlers-bind.d.ts +26 -0
  253. package/dist/tools/sources/handlers-bind.d.ts.map +1 -0
  254. package/dist/tools/sources/handlers-bind.js +123 -0
  255. package/dist/tools/sources/handlers-bind.js.map +1 -0
  256. package/dist/tools/sources/handlers.d.ts +45 -0
  257. package/dist/tools/sources/handlers.d.ts.map +1 -0
  258. package/dist/tools/sources/handlers.js +84 -0
  259. package/dist/tools/sources/handlers.js.map +1 -0
  260. package/dist/tools/sources/index.d.ts +19 -0
  261. package/dist/tools/sources/index.d.ts.map +1 -0
  262. package/dist/tools/sources/index.js +18 -0
  263. package/dist/tools/sources/index.js.map +1 -0
  264. package/dist/tools/sources.d.ts +14 -0
  265. package/dist/tools/sources.d.ts.map +1 -0
  266. package/dist/tools/sources.js +14 -0
  267. package/dist/tools/sources.js.map +1 -0
  268. package/dist/tools/sparse-fields.d.ts +80 -0
  269. package/dist/tools/sparse-fields.d.ts.map +1 -0
  270. package/dist/tools/sparse-fields.js +144 -0
  271. package/dist/tools/sparse-fields.js.map +1 -0
  272. package/dist/tools/tool-builder/annotations.d.ts +22 -0
  273. package/dist/tools/tool-builder/annotations.d.ts.map +1 -0
  274. package/dist/tools/tool-builder/annotations.js +35 -0
  275. package/dist/tools/tool-builder/annotations.js.map +1 -0
  276. package/dist/tools/tool-builder/define.d.ts +31 -0
  277. package/dist/tools/tool-builder/define.d.ts.map +1 -0
  278. package/dist/tools/tool-builder/define.js +31 -0
  279. package/dist/tools/tool-builder/define.js.map +1 -0
  280. package/dist/tools/tool-builder/index.d.ts +28 -0
  281. package/dist/tools/tool-builder/index.d.ts.map +1 -0
  282. package/dist/tools/tool-builder/index.js +27 -0
  283. package/dist/tools/tool-builder/index.js.map +1 -0
  284. package/dist/tools/tool-builder/results.d.ts +59 -0
  285. package/dist/tools/tool-builder/results.d.ts.map +1 -0
  286. package/dist/tools/tool-builder/results.js +125 -0
  287. package/dist/tools/tool-builder/results.js.map +1 -0
  288. package/dist/tools/tool-builder/types.d.ts +82 -0
  289. package/dist/tools/tool-builder/types.d.ts.map +1 -0
  290. package/dist/tools/tool-builder/types.js +9 -0
  291. package/dist/tools/tool-builder/types.js.map +1 -0
  292. package/dist/tools/tool-builder.d.ts +16 -0
  293. package/dist/tools/tool-builder.d.ts.map +1 -0
  294. package/dist/tools/tool-builder.js +16 -0
  295. package/dist/tools/tool-builder.js.map +1 -0
  296. package/icon.png +0 -0
  297. package/manifest.json +63 -0
  298. package/package.json +81 -0
  299. package/skills/yootheme-builder/SKILL.md +582 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Interactive setup wizard for `@wootsup/yt-builder-mcp`.
3
+ *
4
+ * `runWizard()` accepts a {@link WizardDeps} bag so unit tests can drive
5
+ * a deterministic prompt → validate → probe → write → handshake sequence
6
+ * without touching real subprocesses or filesystems.
7
+ *
8
+ * After the Round-1 audit I5 fix, this file is the wizard ALGORITHM only:
9
+ * - `WizardDeps` and its result types live in `setup-wizard-types.ts`.
10
+ * - Default real-I/O implementations + `rollbackWrites` + `majorMinor`
11
+ * live in `setup-wizard-defaults.ts`.
12
+ * - The CLI dispatcher + main-guard live in `setup-cli.ts`.
13
+ *
14
+ * @license MIT
15
+ */
16
+ import type { AuthProbeResult, HandshakeResult, HealthProbeResult, WizardAnswers, WizardDeps, WriteResult } from './setup-wizard-types.js';
17
+ export { DEFAULT_WIZARD_DEPS, majorMinor } from './setup-wizard-defaults.js';
18
+ export type { AuthProbeResult, HandshakeResult, HealthProbeResult, WizardAnswers, WizardDeps, WriteResult, };
19
+ /**
20
+ * Run the interactive setup wizard. Returns a process exit-code so the
21
+ * outer dispatcher can `process.exit(rc)` cleanly.
22
+ *
23
+ * Exit codes:
24
+ * 0 — success (configs written, handshake OK)
25
+ * 1 — invalid input that prevents proceeding
26
+ * 2 — health probe failed and user declined to continue
27
+ * 3 — auth probe failed and user declined to continue
28
+ * 4 — write failed; configs rolled back
29
+ * 5 — handshake failed; configs rolled back
30
+ * 130 — user cancelled (matches the SIGINT convention)
31
+ */
32
+ export declare function runWizard(deps?: WizardDeps): Promise<number>;
33
+ //# sourceMappingURL=setup-wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,KAAK,EACR,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,WAAW,EACd,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7E,YAAY,EACR,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,WAAW,GACd,CAAC;AAIF;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC3B,IAAI,GAAE,UAAgC,GACvC,OAAO,CAAC,MAAM,CAAC,CAyJjB"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Interactive setup wizard for `@wootsup/yt-builder-mcp`.
3
+ *
4
+ * `runWizard()` accepts a {@link WizardDeps} bag so unit tests can drive
5
+ * a deterministic prompt → validate → probe → write → handshake sequence
6
+ * without touching real subprocesses or filesystems.
7
+ *
8
+ * After the Round-1 audit I5 fix, this file is the wizard ALGORITHM only:
9
+ * - `WizardDeps` and its result types live in `setup-wizard-types.ts`.
10
+ * - Default real-I/O implementations + `rollbackWrites` + `majorMinor`
11
+ * live in `setup-wizard-defaults.ts`.
12
+ * - The CLI dispatcher + main-guard live in `setup-cli.ts`.
13
+ *
14
+ * @license MIT
15
+ */
16
+ import { cancel, log, note, outro, spinner } from '@clack/prompts';
17
+ import { SERVER_NAME, SERVER_VERSION } from './server.js';
18
+ import { DEFAULT_WIZARD_DEPS, rollbackWrites, } from './setup-wizard-defaults.js';
19
+ // Re-export the public surface so `import { runWizard, WizardDeps } from
20
+ // './setup-wizard.js'` continues to work without touching the split files.
21
+ export { DEFAULT_WIZARD_DEPS, majorMinor } from './setup-wizard-defaults.js';
22
+ const SERVER_KEY = 'yootheme-builder';
23
+ /**
24
+ * Run the interactive setup wizard. Returns a process exit-code so the
25
+ * outer dispatcher can `process.exit(rc)` cleanly.
26
+ *
27
+ * Exit codes:
28
+ * 0 — success (configs written, handshake OK)
29
+ * 1 — invalid input that prevents proceeding
30
+ * 2 — health probe failed and user declined to continue
31
+ * 3 — auth probe failed and user declined to continue
32
+ * 4 — write failed; configs rolled back
33
+ * 5 — handshake failed; configs rolled back
34
+ * 130 — user cancelled (matches the SIGINT convention)
35
+ */
36
+ export async function runWizard(deps = DEFAULT_WIZARD_DEPS) {
37
+ const logFn = deps.log ?? ((line) => process.stderr.write(`${line}\n`));
38
+ // 1. Detect clients + collect answers.
39
+ const detected = deps.detectClients();
40
+ const answers = await deps.prompt({ detected });
41
+ if (answers === null)
42
+ return 130;
43
+ if (answers.wpUrl === '' || answers.bearer === '') {
44
+ logFn('Both the WordPress URL and the Bearer key are required.');
45
+ return 1;
46
+ }
47
+ // 2a. Identity probe (no auth) — confirms the URL hosts our plugin
48
+ // and cross-checks against the URL the user entered. Optional
49
+ // dep for back-compat: missing field = skip (older WizardDeps
50
+ // bags + pre-6.5 plugins don't expose it).
51
+ if (deps.probeIdentity !== undefined) {
52
+ const idSpinner = spinner();
53
+ idSpinner.start('Verifying plugin identity…');
54
+ const identity = await deps.probeIdentity(answers.wpUrl);
55
+ if (identity.ok) {
56
+ const summary = identity.siteurl !== undefined
57
+ ? `Plugin identified at ${identity.siteurl}.`
58
+ : 'Plugin identified.';
59
+ idSpinner.stop(summary);
60
+ if (identity.siteurl !== undefined && identity.siteurl !== answers.wpUrl) {
61
+ log.warn(`URL mismatch: you entered ${answers.wpUrl} but the plugin reports its canonical URL as ${identity.siteurl}. ` +
62
+ `Using the URL you entered — fix the mismatch if you get auth errors.`);
63
+ }
64
+ }
65
+ else {
66
+ idSpinner.stop('Identity probe failed.');
67
+ log.warn(`Identity probe: ${identity.error ?? 'unknown'} (continuing — older plugins lack this endpoint).`);
68
+ }
69
+ }
70
+ // 2b. Health probe (no auth).
71
+ const healthSpinner = spinner();
72
+ healthSpinner.start('Probing plugin health…');
73
+ const health = await deps.probeHealth(answers.wpUrl);
74
+ if (health.ok) {
75
+ healthSpinner.stop(health.pluginVersion !== undefined
76
+ ? `Plugin reachable (v${health.pluginVersion}).`
77
+ : 'Plugin reachable.');
78
+ }
79
+ else {
80
+ healthSpinner.stop('Plugin probe failed.');
81
+ log.error(`Could not reach the plugin: ${health.error ?? 'unknown'}`);
82
+ const cont = await deps.confirmContinue('Continue anyway and write the config? (You can fix this later.)');
83
+ if (!cont) {
84
+ cancel('Setup cancelled.');
85
+ return 2;
86
+ }
87
+ }
88
+ // 3. Auth probe (Bearer).
89
+ const authSpinner = spinner();
90
+ authSpinner.start('Verifying Bearer key…');
91
+ const auth = await deps.probeAuth(answers.wpUrl, answers.bearer);
92
+ const authOk = auth.ok;
93
+ if (authOk) {
94
+ authSpinner.stop('Bearer key accepted.');
95
+ }
96
+ else {
97
+ authSpinner.stop('Bearer probe failed.');
98
+ log.warn(`Auth probe failed: ${auth.error ?? 'unknown'}`);
99
+ const cont = await deps.confirmContinue('Continue anyway and write the config?');
100
+ if (!cont) {
101
+ cancel('Setup cancelled.');
102
+ return 3;
103
+ }
104
+ }
105
+ // 4. Write configs. Track previous content for rollback.
106
+ const serverConfig = {
107
+ command: 'npx',
108
+ args: ['-y', SERVER_NAME],
109
+ env: {
110
+ YTB_MCP_WP_URL: answers.wpUrl,
111
+ YTB_MCP_BEARER_TOKEN: answers.bearer,
112
+ },
113
+ };
114
+ const writes = [];
115
+ let writeFailed = false;
116
+ for (const id of answers.selectedClients) {
117
+ const result = await deps.writeClient(id, SERVER_KEY, serverConfig);
118
+ writes.push(result);
119
+ if (!result.ok) {
120
+ writeFailed = true;
121
+ break;
122
+ }
123
+ }
124
+ const summary = writes
125
+ .map((r) => r.ok
126
+ ? ` ✓ ${r.label}: configured`
127
+ : ` ✗ ${r.label}: FAILED (${r.error ?? 'unknown'})`)
128
+ .join('\n');
129
+ note(summary, 'Results');
130
+ if (writeFailed) {
131
+ log.error('Write failed — rolling back any partial writes.');
132
+ await rollbackWrites(writes, logFn);
133
+ return 4;
134
+ }
135
+ // 5. Dist-tag handshake (only when auth probe succeeded — there's
136
+ // no point handshaking with a known-bad token).
137
+ if (authOk) {
138
+ const hsSpinner = spinner();
139
+ hsSpinner.start('Verifying dist-tag handshake…');
140
+ const hs = await deps.handshake(answers.wpUrl, answers.bearer, SERVER_VERSION);
141
+ if (!hs.ok) {
142
+ hsSpinner.stop('Handshake failed.');
143
+ log.error(`Handshake failed after writing configs: ${hs.error ?? 'unknown'}. Rolling back.`);
144
+ await rollbackWrites(writes, logFn);
145
+ return 5;
146
+ }
147
+ if (hs.warning !== undefined) {
148
+ hsSpinner.stop('Handshake OK (with warning).');
149
+ log.warn(hs.warning);
150
+ }
151
+ else {
152
+ hsSpinner.stop('Handshake OK.');
153
+ }
154
+ }
155
+ else {
156
+ log.warn('Skipping handshake because the Bearer probe failed.');
157
+ }
158
+ if (writes.every((r) => r.ok) && authOk) {
159
+ outro('Done — restart your AI client to load the new MCP server.');
160
+ }
161
+ else {
162
+ outro('Setup finished with warnings. See the messages above.');
163
+ }
164
+ return 0;
165
+ }
166
+ //# sourceMappingURL=setup-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Backwards-compat entry point for `npx -y @wootsup/yt-builder-mcp setup`.
3
+ *
4
+ * The Wave G.7 refactor moved the wizard implementation into
5
+ * {@link runWizard} (with dependency injection so it's unit-testable)
6
+ * and the subcommand dispatcher into {@link runCli}, both in
7
+ * `./setup-cli.ts`. This file remains so the published `bin/`
8
+ * shim that does `import('../dist/setup.js')` still works after a
9
+ * partial deploy where only the published tarball is updated; it
10
+ * simply forwards to `runWizard()`.
11
+ *
12
+ * `YTB_MCP_TEST_MODE=1` short-circuits the wizard for smoke tests.
13
+ *
14
+ * @license MIT
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
package/dist/setup.js ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Backwards-compat entry point for `npx -y @wootsup/yt-builder-mcp setup`.
3
+ *
4
+ * The Wave G.7 refactor moved the wizard implementation into
5
+ * {@link runWizard} (with dependency injection so it's unit-testable)
6
+ * and the subcommand dispatcher into {@link runCli}, both in
7
+ * `./setup-cli.ts`. This file remains so the published `bin/`
8
+ * shim that does `import('../dist/setup.js')` still works after a
9
+ * partial deploy where only the published tarball is updated; it
10
+ * simply forwards to `runWizard()`.
11
+ *
12
+ * `YTB_MCP_TEST_MODE=1` short-circuits the wizard for smoke tests.
13
+ *
14
+ * @license MIT
15
+ */
16
+ import { runWizard } from './setup-cli.js';
17
+ const TEST_MODE = process.env.YTB_MCP_TEST_MODE === '1';
18
+ async function run() {
19
+ if (TEST_MODE) {
20
+ process.stderr.write('[yt-builder-mcp setup] Test mode — exiting after banner.\n');
21
+ return;
22
+ }
23
+ const code = await runWizard();
24
+ if (code !== 0) {
25
+ process.exit(code);
26
+ }
27
+ }
28
+ run().catch((e) => {
29
+ const message = e instanceof Error ? e.message : String(e);
30
+ process.stderr.write(`[yt-builder-mcp setup] fatal: ${message}\n`);
31
+ process.exit(1);
32
+ });
33
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,CAAC;AAExD,KAAK,UAAU,GAAG;IACd,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACnF,OAAO;IACX,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;IAC/B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;AACL,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;IACvB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,OAAO,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Element-tool builders — pure `defineTool` factory list.
3
+ *
4
+ * Split out of the original `src/tools/elements.ts` (Wave G.4.0). Each
5
+ * entry pairs a Zod input-schema with the matching handler in
6
+ * `./handlers.ts`. Keeping builders + handlers in separate files lets
7
+ * each file stay under the 200-LoC budget.
8
+ *
9
+ * The exported `buildElementsTools(client, [opts])` is the single public
10
+ * entry-point — see `./index.ts` for the consumer-facing re-export.
11
+ *
12
+ * @license MIT
13
+ */
14
+ import type { RestClient } from '../../client.js';
15
+ import { type AnyToolDefinition } from '../tool-builder.js';
16
+ import { type ElementsHandlerDeps } from './handlers.js';
17
+ /**
18
+ * Build the 7 element tools. The optional `deps` carries the
19
+ * elicitation capability used by `element_delete` (Wave G.4.1). When
20
+ * omitted, the destructive tool falls back to the explicit
21
+ * `confirm: true` parameter.
22
+ */
23
+ export declare function buildElementsTools(client: RestClient, deps?: Partial<ElementsHandlerDeps>): readonly AnyToolDefinition[];
24
+ //# sourceMappingURL=builders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../../src/tools/elements/builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAMH,KAAK,iBAAiB,EACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGH,KAAK,mBAAmB,EAQ3B,MAAM,eAAe,CAAC;AAEvB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,UAAU,EAClB,IAAI,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,SAAS,iBAAiB,EAAE,CAgJ9B"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Element-tool builders — pure `defineTool` factory list.
3
+ *
4
+ * Split out of the original `src/tools/elements.ts` (Wave G.4.0). Each
5
+ * entry pairs a Zod input-schema with the matching handler in
6
+ * `./handlers.ts`. Keeping builders + handlers in separate files lets
7
+ * each file stay under the 200-LoC budget.
8
+ *
9
+ * The exported `buildElementsTools(client, [opts])` is the single public
10
+ * entry-point — see `./index.ts` for the consumer-facing re-export.
11
+ *
12
+ * @license MIT
13
+ */
14
+ import { z } from 'zod';
15
+ import { ELEMENT_PATH, ETAG, PROPS, TEMPLATE_ID } from '../shared-schemas.js';
16
+ import { FIELDS } from '../sparse-fields.js';
17
+ import { creating, defineTool, destructive, mutating, readOnly, } from '../tool-builder.js';
18
+ import { ELEMENT_GET_OUTPUT_SCHEMA, ELEMENT_LIST_OUTPUT_SCHEMA, handleElementAdd, handleElementClone, handleElementDelete, handleElementGet, handleElementList, handleElementMove, handleElementUpdateSettings, } from './handlers.js';
19
+ /**
20
+ * Build the 7 element tools. The optional `deps` carries the
21
+ * elicitation capability used by `element_delete` (Wave G.4.1). When
22
+ * omitted, the destructive tool falls back to the explicit
23
+ * `confirm: true` parameter.
24
+ */
25
+ export function buildElementsTools(client, deps) {
26
+ const handlerDeps = {
27
+ client,
28
+ elicitation: deps?.elicitation,
29
+ };
30
+ return [
31
+ defineTool({
32
+ name: 'yootheme_builder_element_list',
33
+ description: 'List all elements in a template as a flat array with JSON-Pointer paths + ' +
34
+ 'element types. Best starting-point for "find the element I want to edit". ' +
35
+ 'Pass `fields:["path","element_type"]` to narrow each row.',
36
+ inputSchema: {
37
+ template_id: TEMPLATE_ID,
38
+ fields: FIELDS,
39
+ },
40
+ outputSchema: ELEMENT_LIST_OUTPUT_SCHEMA,
41
+ annotations: readOnly('List Elements'),
42
+ handler: (input) => handleElementList(handlerDeps, input),
43
+ }),
44
+ defineTool({
45
+ name: 'yootheme_builder_element_get',
46
+ description: 'Get the full element object at a specific JSON-Pointer path, including props ' +
47
+ 'and children. Use yootheme_builder_element_list to discover paths.',
48
+ inputSchema: {
49
+ template_id: TEMPLATE_ID,
50
+ element_path: ELEMENT_PATH,
51
+ },
52
+ outputSchema: ELEMENT_GET_OUTPUT_SCHEMA,
53
+ annotations: readOnly('Get Element'),
54
+ handler: (input) => handleElementGet(handlerDeps, input),
55
+ }),
56
+ defineTool({
57
+ name: 'yootheme_builder_element_add',
58
+ description: 'Add a new element to a template. Provide `parent_path` (or "" for root), ' +
59
+ '`element_type` (e.g. "headline", "text", "grid"), and optional `props` / ' +
60
+ '`children`. Returns the new element\'s JSON-Pointer path. Requires ETag.',
61
+ inputSchema: {
62
+ template_id: TEMPLATE_ID,
63
+ parent_path: z
64
+ .string()
65
+ .default('')
66
+ .describe('JSON-Pointer of the parent node ("" for template root, ' +
67
+ '"/0/children/2" for nested). Use yootheme_builder_element_list to find.'),
68
+ element_type: z
69
+ .string()
70
+ .min(1)
71
+ .describe('Type of element to create (e.g. "headline", "text", "grid"). ' +
72
+ 'Use yootheme_builder_element_types_list for the catalogue.'),
73
+ props: PROPS.optional(),
74
+ children: z
75
+ .array(z.record(z.string(), z.unknown()))
76
+ .optional()
77
+ .describe('Optional initial children — array of element objects.'),
78
+ etag: ETAG,
79
+ },
80
+ annotations: creating('Add Element'),
81
+ handler: (input, extra) => handleElementAdd(handlerDeps, input, extra),
82
+ }),
83
+ defineTool({
84
+ name: 'yootheme_builder_element_update_settings',
85
+ description: 'Replace the `props` on an element. Use this for any setting change — title, ' +
86
+ 'margins, classes, sources, etc. Requires ETag. Existing props NOT in the ' +
87
+ 'request are removed.',
88
+ inputSchema: {
89
+ template_id: TEMPLATE_ID,
90
+ element_path: ELEMENT_PATH,
91
+ props: PROPS,
92
+ etag: ETAG,
93
+ },
94
+ annotations: mutating('Update Element Settings'),
95
+ handler: (input, extra) => handleElementUpdateSettings(handlerDeps, input, extra),
96
+ }),
97
+ defineTool({
98
+ name: 'yootheme_builder_element_move',
99
+ description: 'Move an element to a new parent + index in the tree. Useful for reordering or ' +
100
+ 'reparenting (e.g. moving a card from one grid column to another). Requires ETag.',
101
+ inputSchema: {
102
+ template_id: TEMPLATE_ID,
103
+ element_path: ELEMENT_PATH,
104
+ to_parent_path: z
105
+ .string()
106
+ .describe('Destination parent JSON-Pointer ("" for template root).'),
107
+ to_index: z
108
+ .number()
109
+ .int()
110
+ .min(0)
111
+ .describe('Zero-based index within the destination parent.'),
112
+ etag: ETAG,
113
+ },
114
+ annotations: mutating('Move Element'),
115
+ handler: (input, extra) => handleElementMove(handlerDeps, input, extra),
116
+ }),
117
+ defineTool({
118
+ name: 'yootheme_builder_element_clone',
119
+ description: 'Clone an element as a sibling (same parent, immediately after the source). ' +
120
+ 'Returns the new element\'s path. Requires ETag.',
121
+ inputSchema: {
122
+ template_id: TEMPLATE_ID,
123
+ element_path: ELEMENT_PATH,
124
+ etag: ETAG,
125
+ },
126
+ annotations: creating('Clone Element'),
127
+ handler: (input, extra) => handleElementClone(handlerDeps, input, extra),
128
+ }),
129
+ defineTool({
130
+ name: 'yootheme_builder_element_delete',
131
+ description: 'PERMANENTLY delete an element and all its children. Cannot be undone. Always ' +
132
+ 'ask the user to confirm first, then call again with `confirm: true`. Requires ' +
133
+ 'ETag.',
134
+ inputSchema: {
135
+ template_id: TEMPLATE_ID,
136
+ element_path: ELEMENT_PATH,
137
+ etag: ETAG,
138
+ confirm: z
139
+ .boolean()
140
+ .optional()
141
+ .describe('Must be true to execute. On supporting hosts the agent is prompted ' +
142
+ 'via MCP elicitation when omitted; otherwise the call returns a ' +
143
+ 'preview and the agent must retry with `confirm: true`.'),
144
+ },
145
+ annotations: destructive('Delete Element'),
146
+ handler: (input, extra) => handleElementDelete(handlerDeps, input, extra),
147
+ }),
148
+ ];
149
+ }
150
+ //# sourceMappingURL=builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/tools/elements/builders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Element-tool write handlers (add/update/move/clone/delete).
3
+ *
4
+ * Wave G.4.0 split: read handlers + shared types in `./handlers.ts`.
5
+ * Wave G.4.1: `handleElementDelete` consults `deps.elicitation` when
6
+ * `confirm` is undefined — falls back to the explicit preview when
7
+ * elicitation is unavailable.
8
+ * Wave G.5: every handler emits 2-phase client-side progress
9
+ * (`PHASE_SEND` → `PHASE_CONFIRM`) when the caller supplied a
10
+ * `progressToken` — see `../progress-phases.ts` for the contract.
11
+ *
12
+ * @license MIT
13
+ */
14
+ import { type HandlerExtra, type ToolResult } from '../tool-builder.js';
15
+ import type { ElementsHandlerDeps } from './handlers.js';
16
+ export declare function handleElementAdd({ client }: ElementsHandlerDeps, input: {
17
+ template_id: string;
18
+ parent_path: string;
19
+ element_type: string;
20
+ props?: Record<string, unknown>;
21
+ children?: Record<string, unknown>[];
22
+ etag: string;
23
+ }, extra?: HandlerExtra): Promise<ToolResult>;
24
+ export declare function handleElementUpdateSettings({ client }: ElementsHandlerDeps, input: {
25
+ template_id: string;
26
+ element_path: string;
27
+ props: Record<string, unknown>;
28
+ etag: string;
29
+ }, extra?: HandlerExtra): Promise<ToolResult>;
30
+ export declare function handleElementMove({ client }: ElementsHandlerDeps, input: {
31
+ template_id: string;
32
+ element_path: string;
33
+ to_parent_path: string;
34
+ to_index: number;
35
+ etag: string;
36
+ }, extra?: HandlerExtra): Promise<ToolResult>;
37
+ export declare function handleElementClone({ client }: ElementsHandlerDeps, input: {
38
+ template_id: string;
39
+ element_path: string;
40
+ etag: string;
41
+ }, extra?: HandlerExtra): Promise<ToolResult>;
42
+ export declare function handleElementDelete({ client, elicitation }: ElementsHandlerDeps, input: {
43
+ template_id: string;
44
+ element_path: string;
45
+ etag: string;
46
+ confirm?: boolean;
47
+ }, extra?: HandlerExtra): Promise<ToolResult>;
48
+ //# sourceMappingURL=handlers-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers-write.d.ts","sourceRoot":"","sources":["../../../src/tools/elements/handlers-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAKH,KAAK,YAAY,EACjB,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAIzD,wBAAsB,gBAAgB,CAClC,EAAE,MAAM,EAAE,EAAE,mBAAmB,EAC/B,KAAK,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;CAChB,EACD,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAoBrB;AAID,wBAAsB,2BAA2B,CAC7C,EAAE,MAAM,EAAE,EAAE,mBAAmB,EAC/B,KAAK,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;CAChB,EACD,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAsBrB;AAID,wBAAsB,iBAAiB,CACnC,EAAE,MAAM,EAAE,EAAE,mBAAmB,EAC/B,KAAK,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CAChB,EACD,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAID,wBAAsB,kBAAkB,CACpC,EAAE,MAAM,EAAE,EAAE,mBAAmB,EAC/B,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAClE,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAiCD,wBAAsB,mBAAmB,CACrC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,mBAAmB,EAC5C,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EACrF,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Element-tool write handlers (add/update/move/clone/delete).
3
+ *
4
+ * Wave G.4.0 split: read handlers + shared types in `./handlers.ts`.
5
+ * Wave G.4.1: `handleElementDelete` consults `deps.elicitation` when
6
+ * `confirm` is undefined — falls back to the explicit preview when
7
+ * elicitation is unavailable.
8
+ * Wave G.5: every handler emits 2-phase client-side progress
9
+ * (`PHASE_SEND` → `PHASE_CONFIRM`) when the caller supplied a
10
+ * `progressToken` — see `../progress-phases.ts` for the contract.
11
+ *
12
+ * @license MIT
13
+ */
14
+ import { elicitConfirmation } from '@getimo/mcp-toolkit';
15
+ import { encodeElementPath } from '../../client.js';
16
+ import { PHASE_CONFIRM, PHASE_SEND } from '../progress-phases.js';
17
+ import { confirmGuard, createProgressReporter, errorResult, jsonResult, } from '../tool-builder.js';
18
+ // ─── element_add ─────────────────────────────────────────────────────
19
+ export async function handleElementAdd({ client }, input, extra) {
20
+ const { template_id, etag, ...body } = input;
21
+ const progress = extra ? createProgressReporter(extra) : null;
22
+ await progress?.report(0, 2, PHASE_SEND);
23
+ try {
24
+ const data = await client.post(`/pages/${encodeURIComponent(template_id)}/elements`, { body, etag });
25
+ await progress?.report(2, 2, PHASE_CONFIRM);
26
+ return jsonResult(data);
27
+ }
28
+ catch (e) {
29
+ return errorResult({
30
+ error: e,
31
+ context: input,
32
+ hint: 'On 412 refresh via yootheme_builder_get_etag and retry. On 400 ' +
33
+ 'check `element_type` is valid via yootheme_builder_element_types_list.',
34
+ });
35
+ }
36
+ }
37
+ // ─── element_update_settings ─────────────────────────────────────────
38
+ export async function handleElementUpdateSettings({ client }, input, extra) {
39
+ const { template_id, element_path, props, etag } = input;
40
+ const encoded = encodeElementPath(element_path);
41
+ const progress = extra ? createProgressReporter(extra) : null;
42
+ await progress?.report(0, 2, PHASE_SEND);
43
+ try {
44
+ const data = await client.put(`/pages/${encodeURIComponent(template_id)}/elements/${encoded}/settings`, { body: { props }, etag });
45
+ await progress?.report(2, 2, PHASE_CONFIRM);
46
+ return jsonResult(data);
47
+ }
48
+ catch (e) {
49
+ return errorResult({
50
+ error: e,
51
+ context: { template_id, element_path },
52
+ hint: 'On 412 refresh via yootheme_builder_get_etag and retry. To merge ' +
53
+ 'props instead of replacing, fetch via yootheme_builder_element_get ' +
54
+ 'first and pass the merged result.',
55
+ });
56
+ }
57
+ }
58
+ // ─── element_move ────────────────────────────────────────────────────
59
+ export async function handleElementMove({ client }, input, extra) {
60
+ const { template_id, element_path, to_parent_path, to_index, etag } = input;
61
+ const encoded = encodeElementPath(element_path);
62
+ const progress = extra ? createProgressReporter(extra) : null;
63
+ await progress?.report(0, 2, PHASE_SEND);
64
+ try {
65
+ const data = await client.post(`/pages/${encodeURIComponent(template_id)}/elements/${encoded}/move`, { body: { to_parent_path, to_index }, etag });
66
+ await progress?.report(2, 2, PHASE_CONFIRM);
67
+ return jsonResult(data);
68
+ }
69
+ catch (e) {
70
+ return errorResult({
71
+ error: e,
72
+ context: { template_id, element_path, to_parent_path, to_index },
73
+ hint: 'Verify destination parent accepts the element type. On 412 refresh ' +
74
+ 'ETag and retry.',
75
+ });
76
+ }
77
+ }
78
+ // ─── element_clone ───────────────────────────────────────────────────
79
+ export async function handleElementClone({ client }, input, extra) {
80
+ const { template_id, element_path, etag } = input;
81
+ const encoded = encodeElementPath(element_path);
82
+ const progress = extra ? createProgressReporter(extra) : null;
83
+ await progress?.report(0, 2, PHASE_SEND);
84
+ try {
85
+ const data = await client.post(`/pages/${encodeURIComponent(template_id)}/elements/${encoded}/clone`, { etag });
86
+ await progress?.report(2, 2, PHASE_CONFIRM);
87
+ return jsonResult(data);
88
+ }
89
+ catch (e) {
90
+ return errorResult({
91
+ error: e,
92
+ context: { template_id, element_path },
93
+ hint: 'On 412 refresh via yootheme_builder_get_etag and retry.',
94
+ });
95
+ }
96
+ }
97
+ // ─── element_delete (destructive — elicitation + confirm-guard) ─────
98
+ //
99
+ // Wave G.4.1 — destructive confirm via MCP elicitation. Progress
100
+ // reports (Wave G.5) only start AFTER the confirm gate clears.
101
+ async function resolveDeleteConfirm(elicitation, template_id, element_path, confirm) {
102
+ if (confirm === true)
103
+ return null;
104
+ if (confirm === false || !elicitation) {
105
+ return confirmGuard({
106
+ operation: 'delete element',
107
+ details: { template_id, element_path },
108
+ });
109
+ }
110
+ const accepted = await elicitConfirmation(elicitation, `Permanently delete element at "${element_path}" in template ` +
111
+ `"${template_id}"? This cannot be undone.`);
112
+ return accepted
113
+ ? null
114
+ : confirmGuard({
115
+ operation: 'delete element',
116
+ details: { template_id, element_path },
117
+ });
118
+ }
119
+ export async function handleElementDelete({ client, elicitation }, input, extra) {
120
+ const { template_id, element_path, etag, confirm } = input;
121
+ const blocked = await resolveDeleteConfirm(elicitation, template_id, element_path, confirm);
122
+ if (blocked)
123
+ return blocked;
124
+ const encoded = encodeElementPath(element_path);
125
+ const progress = extra ? createProgressReporter(extra) : null;
126
+ await progress?.report(0, 2, PHASE_SEND);
127
+ try {
128
+ const data = await client.delete(`/pages/${encodeURIComponent(template_id)}/elements/${encoded}`, { etag });
129
+ await progress?.report(2, 2, PHASE_CONFIRM);
130
+ return jsonResult(data);
131
+ }
132
+ catch (e) {
133
+ return errorResult({
134
+ error: e,
135
+ context: { template_id, element_path },
136
+ hint: 'On 412 refresh via yootheme_builder_get_etag and retry. On 404 the ' +
137
+ 'element may already be gone — verify with yootheme_builder_element_list.',
138
+ });
139
+ }
140
+ }
141
+ //# sourceMappingURL=handlers-write.js.map