@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,355 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Top-level CLI dispatcher for `@wootsup/yt-builder-mcp`.
4
+ *
5
+ * Round-1 audit I5 fix (2026-05-22): the wizard implementation lives in
6
+ * `setup-wizard.ts`; this file is the thin dispatcher (`runCli`) plus
7
+ * the ESM main-guard. Both have their own deps-bag (`WizardDeps` /
8
+ * `RunCliDeps`) so unit tests can drive them independently.
9
+ *
10
+ * Subcommands:
11
+ *
12
+ * setup (default) — runWizard (see `setup-wizard.ts`)
13
+ * install-skill — copy the bundled skill into ~/.claude/skills/
14
+ * and append a marker block to ~/AGENTS.md.
15
+ * --help / help — print usage.
16
+ * --version / -v — print the package version.
17
+ *
18
+ * Re-exports `runWizard`, `majorMinor` and the wizard public types so
19
+ * existing callers (and tests that already import from `./setup-cli`)
20
+ * keep working with a one-line import.
21
+ *
22
+ * @license MIT
23
+ */
24
+ import { ALL_CLIENTS } from './clients/index.js';
25
+ import { installSkill as defaultInstallSkill } from './install-skill.js';
26
+ import { SERVER_VERSION } from './server.js';
27
+ import { DEFAULT_WIZARD_DEPS, runWizard as runWizardImpl } from './setup-wizard.js';
28
+ // Re-export the wizard surface so consumers that imported from
29
+ // `./setup-cli` before the I5 split keep working without changes.
30
+ export { DEFAULT_WIZARD_DEPS, majorMinor, runWizard, } from './setup-wizard.js';
31
+ const HELP_TEXT = `Usage: yt-builder-mcp <command> [flags]
32
+
33
+ Commands:
34
+ setup Interactive first-run wizard (default if no command)
35
+ install-skill Copy the bundled YOOtheme Builder skill into
36
+ ~/.claude/skills/ and register it in ~/AGENTS.md.
37
+ Note: ~/.claude/skills/ is the universal-marker path
38
+ recognised by Claude Desktop and other AI clients.
39
+ --version, -v Print the package version.
40
+ --help, -h, help Show this message.
41
+
42
+ Setup flags (for non-interactive / CI usage):
43
+ --non-interactive Skip all prompts; fail-fast on missing input.
44
+ --url <wp-url> WordPress base URL (required with --non-interactive).
45
+ --token <bearer> Bearer key (required with --non-interactive).
46
+ --client <id> AI client id to configure; repeatable. Valid ids:
47
+ claude-desktop, claude-code, cursor, zed, continue,
48
+ cline, roo-code, codex-cli, gemini-cli.
49
+
50
+ Example (non-interactive):
51
+ npx -y @wootsup/yt-builder-mcp setup \\
52
+ --non-interactive \\
53
+ --client cursor --client claude-desktop \\
54
+ --url https://example.com \\
55
+ --token "$YTB_TOKEN"
56
+
57
+ Pickup mode (one-click setup via wp-admin):
58
+ --pickup <url> Pickup URL revealed by the wp-admin "Setup wizard"
59
+ flow; e.g. https://example.com/wp-json/yt-builder-mcp/v1/setup/pickup
60
+ --nonce <code> One-shot nonce revealed alongside the pickup URL.
61
+ Pairs 1:1 with --pickup (both or neither).
62
+
63
+ When --pickup + --nonce are passed, the wizard fetches the freshly-minted
64
+ Bearer + canonical URL from the plugin in a single POST and skips the
65
+ URL/token prompts entirely. The pickup is IP-bound, single-use, and
66
+ expires after 5 minutes. If --url or --token are also passed they are
67
+ ignored (a warning is printed to stderr).
68
+
69
+ Example (pickup):
70
+ npx -y @wootsup/yt-builder-mcp setup \\
71
+ --pickup https://example.com/wp-json/yt-builder-mcp/v1/setup/pickup \\
72
+ --nonce "$NONCE" \\
73
+ --client claude-desktop
74
+
75
+ Environment (when launched by an AI client):
76
+ YTB_MCP_WP_URL WordPress base URL (e.g. https://example.com).
77
+ YTB_MCP_BEARER_TOKEN Bearer key from wp-admin → Tools → "YT Builder MCP".
78
+ Format: ytb_(live|test)_<payload>.<signature>
79
+ YTB_MCP_TEST_MODE=1 Skip stdio loop (used by smoke tests).
80
+
81
+ Documentation: https://github.com/wootsup/yt-builder-mcp
82
+ `;
83
+ /**
84
+ * Parse the `setup` subcommand argv tail. Pure function; does no I/O.
85
+ *
86
+ * Accepts both `--key value` and `--key=value` styles. Unknown flags
87
+ * are reported as errors so typos don't silently disable validation.
88
+ */
89
+ export function parseSetupArgs(argv) {
90
+ let nonInteractive = false;
91
+ let url = '';
92
+ let token = '';
93
+ let pickup = '';
94
+ let nonce = '';
95
+ const clients = [];
96
+ const errors = [];
97
+ const warnings = [];
98
+ function consumeValue(name, inline, i) {
99
+ if (inline !== undefined) {
100
+ return { value: inline, nextIndex: i };
101
+ }
102
+ const next = argv[i + 1];
103
+ if (next === undefined || next.startsWith('--')) {
104
+ errors.push(`Flag ${name} requires a value.`);
105
+ return { value: '', nextIndex: i };
106
+ }
107
+ return { value: next, nextIndex: i + 1 };
108
+ }
109
+ for (let i = 0; i < argv.length; i++) {
110
+ const raw = argv[i];
111
+ const eq = raw.indexOf('=');
112
+ const flag = eq >= 0 ? raw.slice(0, eq) : raw;
113
+ const inline = eq >= 0 ? raw.slice(eq + 1) : undefined;
114
+ switch (flag) {
115
+ case '--non-interactive': {
116
+ nonInteractive = true;
117
+ if (inline !== undefined) {
118
+ errors.push('Flag --non-interactive does not take a value.');
119
+ }
120
+ break;
121
+ }
122
+ case '--url': {
123
+ const { value, nextIndex } = consumeValue('--url', inline, i);
124
+ url = value.trim().replace(/\/+$/, '');
125
+ i = nextIndex;
126
+ break;
127
+ }
128
+ case '--token': {
129
+ const { value, nextIndex } = consumeValue('--token', inline, i);
130
+ token = value.trim();
131
+ i = nextIndex;
132
+ break;
133
+ }
134
+ case '--pickup': {
135
+ const { value, nextIndex } = consumeValue('--pickup', inline, i);
136
+ pickup = value.trim();
137
+ i = nextIndex;
138
+ break;
139
+ }
140
+ case '--nonce': {
141
+ const { value, nextIndex } = consumeValue('--nonce', inline, i);
142
+ nonce = value.trim();
143
+ i = nextIndex;
144
+ break;
145
+ }
146
+ case '--client': {
147
+ const { value, nextIndex } = consumeValue('--client', inline, i);
148
+ if (value !== '')
149
+ clients.push(value.trim());
150
+ i = nextIndex;
151
+ break;
152
+ }
153
+ default: {
154
+ errors.push(`Unknown setup flag: ${flag}`);
155
+ }
156
+ }
157
+ }
158
+ // Pickup mode validation (Wave C). Pickup pairs 1:1 with nonce; when
159
+ // both are present, the wizard fetches token + URL from the plugin and
160
+ // ignores --url/--token (with a warning so typos don't go silent).
161
+ const pickupMode = pickup !== '' || nonce !== '';
162
+ if (pickupMode) {
163
+ if (pickup === '')
164
+ errors.push('--pickup is required when --nonce is given.');
165
+ if (nonce === '')
166
+ errors.push('--nonce is required when --pickup is given.');
167
+ if (url !== '')
168
+ warnings.push('--url is ignored in pickup mode (the plugin returns the canonical URL).');
169
+ if (token !== '')
170
+ warnings.push('--token is ignored in pickup mode (the plugin returns the Bearer token).');
171
+ if (clients.length === 0) {
172
+ errors.push('--client is required with --pickup (at least one).');
173
+ }
174
+ const knownIds = new Set(ALL_CLIENTS.map((c) => c.id));
175
+ for (const id of clients) {
176
+ if (!knownIds.has(id)) {
177
+ errors.push(`Unknown --client id "${id}". Valid: ${[...knownIds].sort().join(', ')}.`);
178
+ }
179
+ }
180
+ }
181
+ else if (nonInteractive) {
182
+ if (url === '')
183
+ errors.push('--url is required with --non-interactive.');
184
+ if (token === '')
185
+ errors.push('--token is required with --non-interactive.');
186
+ if (clients.length === 0)
187
+ errors.push('--client is required with --non-interactive (at least one).');
188
+ const knownIds = new Set(ALL_CLIENTS.map((c) => c.id));
189
+ for (const id of clients) {
190
+ if (!knownIds.has(id)) {
191
+ errors.push(`Unknown --client id "${id}". Valid: ${[...knownIds].sort().join(', ')}.`);
192
+ }
193
+ }
194
+ }
195
+ return { nonInteractive, url, token, pickup, nonce, clients, errors, warnings };
196
+ }
197
+ /**
198
+ * Build a `WizardDeps` bag that answers prompts from CLI flags instead
199
+ * of asking a human. Reuses every other dependency (probes, writes,
200
+ * handshake) from `DEFAULT_WIZARD_DEPS` so the wizard's exit-code
201
+ * contract (0/2/3/4/5) stays identical.
202
+ *
203
+ * `confirmContinue` always returns `false` — there is no human to ask,
204
+ * so a probe failure cleanly aborts with the documented exit code.
205
+ */
206
+ export function buildNonInteractiveDeps(parsed, base = DEFAULT_WIZARD_DEPS) {
207
+ const answers = {
208
+ wpUrl: parsed.url,
209
+ bearer: parsed.token,
210
+ selectedClients: parsed.clients,
211
+ };
212
+ return {
213
+ ...base,
214
+ prompt: async () => answers,
215
+ confirmContinue: async () => false,
216
+ };
217
+ }
218
+ /**
219
+ * Build a `WizardDeps` bag for the Wave-C pickup flow. The wizard's
220
+ * `prompt` step calls `base.fetchPickup(url, nonce)` once, then
221
+ * synthesises the `WizardAnswers` from the response — the actual answers
222
+ * (token + canonical WordPress URL) come straight from the plugin via
223
+ * a 256-bit one-shot nonce, never through chat history / provider logs.
224
+ *
225
+ * On `fetchPickup` failure the prompt resolves to `null` so the wizard
226
+ * exits cleanly with code 130 (user-cancel equivalent — we treat
227
+ * an unrecoverable pickup as "the conversation ends here"). The
228
+ * thrown error is logged via the `log` dep so the operator sees why.
229
+ *
230
+ * `confirmContinue` returns `false` (same rationale as non-interactive).
231
+ */
232
+ export function buildPickupDeps(parsed, base = DEFAULT_WIZARD_DEPS) {
233
+ const pickupUrl = parsed.pickup ?? '';
234
+ const nonce = parsed.nonce ?? '';
235
+ const fetchPickup = base.fetchPickup;
236
+ const logFn = base.log;
237
+ return {
238
+ ...base,
239
+ prompt: async () => {
240
+ if (fetchPickup === undefined) {
241
+ const msg = 'Pickup mode requested but no fetchPickup is wired in this WizardDeps bag.';
242
+ if (logFn !== undefined)
243
+ logFn(msg);
244
+ else
245
+ process.stderr.write(`${msg}\n`);
246
+ return null;
247
+ }
248
+ try {
249
+ const result = await fetchPickup(pickupUrl, nonce);
250
+ return {
251
+ wpUrl: result.siteurl,
252
+ bearer: result.token,
253
+ selectedClients: parsed.clients,
254
+ };
255
+ }
256
+ catch (e) {
257
+ const msg = e instanceof Error ? e.message : String(e);
258
+ if (logFn !== undefined)
259
+ logFn(`Pickup failed: ${msg}`);
260
+ else
261
+ process.stderr.write(`Pickup failed: ${msg}\n`);
262
+ return null;
263
+ }
264
+ },
265
+ confirmContinue: async () => false,
266
+ };
267
+ }
268
+ export async function runCli(argv, deps) {
269
+ const out = deps?.log ?? ((s) => process.stdout.write(`${s}\n`));
270
+ const err = deps?.error ?? ((s) => process.stderr.write(`${s}\n`));
271
+ const wizard = deps?.runWizard ?? ((wizDeps) => runWizardImpl(wizDeps));
272
+ const install = deps?.installSkill ?? defaultInstallSkill;
273
+ const [subcommand] = argv;
274
+ if (subcommand === undefined || subcommand === 'setup') {
275
+ const setupArgs = argv[0] === 'setup' ? argv.slice(1) : argv;
276
+ const parsed = parseSetupArgs(setupArgs);
277
+ // Surface non-fatal warnings (e.g. "--url ignored in pickup mode").
278
+ for (const line of parsed.warnings)
279
+ err(`yt-builder-mcp: warning: ${line}`);
280
+ const pickupMode = (parsed.pickup ?? '') !== '' || (parsed.nonce ?? '') !== '';
281
+ if (pickupMode) {
282
+ if (parsed.errors.length > 0) {
283
+ for (const line of parsed.errors)
284
+ err(`yt-builder-mcp: ${line}`);
285
+ err(HELP_TEXT);
286
+ return 2;
287
+ }
288
+ return wizard(buildPickupDeps(parsed));
289
+ }
290
+ if (parsed.nonInteractive) {
291
+ if (parsed.errors.length > 0) {
292
+ for (const line of parsed.errors)
293
+ err(`yt-builder-mcp: ${line}`);
294
+ err(HELP_TEXT);
295
+ return 2;
296
+ }
297
+ return wizard(buildNonInteractiveDeps(parsed));
298
+ }
299
+ if (parsed.errors.length > 0) {
300
+ for (const line of parsed.errors)
301
+ err(`yt-builder-mcp: ${line}`);
302
+ err(HELP_TEXT);
303
+ return 1;
304
+ }
305
+ return wizard();
306
+ }
307
+ switch (subcommand) {
308
+ case 'install-skill':
309
+ case 'install': {
310
+ try {
311
+ const result = await install();
312
+ if (result.markerAlreadyPresent) {
313
+ out(`yt-builder-mcp: skill refreshed at ${result.skillTargetDir} (marker already in AGENTS.md).`);
314
+ }
315
+ else {
316
+ out(`yt-builder-mcp: skill installed at ${result.skillTargetDir}; ${result.agentsFile} updated.`);
317
+ }
318
+ return 0;
319
+ }
320
+ catch (e) {
321
+ const msg = e instanceof Error ? e.message : String(e);
322
+ err(`yt-builder-mcp: install-skill failed: ${msg}`);
323
+ return 2;
324
+ }
325
+ }
326
+ case '--version':
327
+ case '-v': {
328
+ out(SERVER_VERSION);
329
+ return 0;
330
+ }
331
+ case 'help':
332
+ case '--help':
333
+ case '-h': {
334
+ out(HELP_TEXT);
335
+ return 0;
336
+ }
337
+ default: {
338
+ err(`yt-builder-mcp: unknown command "${subcommand}".`);
339
+ err(HELP_TEXT);
340
+ return 1;
341
+ }
342
+ }
343
+ }
344
+ // ── direct CLI entry ────────────────────────────────────────────────────
345
+ const isMain = typeof process !== 'undefined' &&
346
+ process.argv[1] !== undefined &&
347
+ import.meta.url === `file://${process.argv[1]}`;
348
+ if (isMain) {
349
+ runCli(process.argv.slice(2)).then((code) => process.exit(code), (err) => {
350
+ const msg = err instanceof Error ? err.message : String(err);
351
+ process.stderr.write(`yt-builder-mcp: fatal: ${msg}\n`);
352
+ process.exit(99);
353
+ });
354
+ }
355
+ //# sourceMappingURL=setup-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-cli.js","sourceRoot":"","sources":["../src/setup-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `setup-prompts` — interactive clack prompts for the setup wizard.
3
+ *
4
+ * Split from `setup-wizard-defaults.ts` in Round-1.5 (replaces the
5
+ * Round-1 LoC-exception spec-amendment with a structural code-fix).
6
+ *
7
+ * Cohesion:
8
+ * - this file owns every clack/inquirer-style prompt sequence
9
+ * (`defaultPrompt`, `defaultConfirmContinue`) — pure terminal
10
+ * I/O, no REST / file-system side effects.
11
+ * - `setup-wizard-defaults.ts` retains the real-I/O implementations
12
+ * (RestClient probes, file-system writers, rollback, handshake).
13
+ *
14
+ * @license MIT
15
+ */
16
+ import { type DetectedClient } from './clients/index.js';
17
+ import type { WizardAnswers } from './setup-wizard-types.js';
18
+ /**
19
+ * Interactive multi-step prompt sequence — Wave 6.5 UX-parity with
20
+ * api-mapper:
21
+ *
22
+ * 1. password input for the Bearer key (length-validated)
23
+ * 2. decode the token's signed payload (signature-unverified) and use
24
+ * `iss` to pre-fill the URL prompt — the typical user only needs
25
+ * to press Enter here
26
+ * 3. text input for the profile name (default: `default`) — supports
27
+ * multi-site usage in a single wizard install
28
+ * 4. multiselect AI clients (pre-populates with detected clients)
29
+ *
30
+ * Returns `null` when the user cancels any prompt — `runWizard`
31
+ * treats that as a clean exit.
32
+ */
33
+ export declare function defaultPrompt(input: {
34
+ detected: readonly DetectedClient[];
35
+ }): Promise<WizardAnswers | null>;
36
+ /**
37
+ * Yes/no confirmation prompt. Returns `false` on cancel (safer default
38
+ * than `true` — the wizard treats it as "don't continue").
39
+ */
40
+ export declare function defaultConfirmContinue(message: string): Promise<boolean>;
41
+ //# sourceMappingURL=setup-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-prompts.d.ts","sourceRoot":"","sources":["../src/setup-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH,OAAO,EAEH,KAAK,cAAc,EACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACvC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACvC,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmGhC;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI9E"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * `setup-prompts` — interactive clack prompts for the setup wizard.
3
+ *
4
+ * Split from `setup-wizard-defaults.ts` in Round-1.5 (replaces the
5
+ * Round-1 LoC-exception spec-amendment with a structural code-fix).
6
+ *
7
+ * Cohesion:
8
+ * - this file owns every clack/inquirer-style prompt sequence
9
+ * (`defaultPrompt`, `defaultConfirmContinue`) — pure terminal
10
+ * I/O, no REST / file-system side effects.
11
+ * - `setup-wizard-defaults.ts` retains the real-I/O implementations
12
+ * (RestClient probes, file-system writers, rollback, handshake).
13
+ *
14
+ * @license MIT
15
+ */
16
+ import { cancel, confirm as clackConfirm, intro, isCancel, multiselect, password, text, } from '@clack/prompts';
17
+ import { ALL_CLIENTS, } from './clients/index.js';
18
+ import { SERVER_NAME, SERVER_VERSION } from './server.js';
19
+ import { decodeToken, normaliseUrl } from './setup-token.js';
20
+ /**
21
+ * Interactive multi-step prompt sequence — Wave 6.5 UX-parity with
22
+ * api-mapper:
23
+ *
24
+ * 1. password input for the Bearer key (length-validated)
25
+ * 2. decode the token's signed payload (signature-unverified) and use
26
+ * `iss` to pre-fill the URL prompt — the typical user only needs
27
+ * to press Enter here
28
+ * 3. text input for the profile name (default: `default`) — supports
29
+ * multi-site usage in a single wizard install
30
+ * 4. multiselect AI clients (pre-populates with detected clients)
31
+ *
32
+ * Returns `null` when the user cancels any prompt — `runWizard`
33
+ * treats that as a clean exit.
34
+ */
35
+ export async function defaultPrompt(input) {
36
+ intro(`${SERVER_NAME} v${SERVER_VERSION} — setup wizard`);
37
+ // 1. Bearer key first. Decoded `iss` will pre-fill the URL prompt.
38
+ const bearerRaw = await password({
39
+ message: 'Bearer key (from wp-admin → Tools → "YT Builder MCP" → Bearer Keys):',
40
+ validate: (v) => {
41
+ const trimmed = v.trim();
42
+ if (trimmed === '')
43
+ return 'Bearer key is required.';
44
+ if (trimmed.length < 16) {
45
+ return 'Bearer key looks too short — expected at least 16 chars.';
46
+ }
47
+ return undefined;
48
+ },
49
+ });
50
+ if (isCancel(bearerRaw)) {
51
+ cancel('Setup cancelled.');
52
+ return null;
53
+ }
54
+ const bearer = bearerRaw.trim();
55
+ const decoded = decodeToken(bearer);
56
+ const urlInitial = decoded?.iss ?? '';
57
+ // 2. WordPress site URL — pre-filled from the decoded `iss` claim
58
+ // when the token was decodable; the user just presses Enter.
59
+ const wpUrlRaw = await text({
60
+ message: urlInitial !== ''
61
+ ? 'WordPress site URL (pre-filled from your key — press Enter to accept):'
62
+ : 'WordPress site URL (e.g. https://example.com):',
63
+ placeholder: urlInitial !== '' ? urlInitial : 'https://example.com',
64
+ initialValue: urlInitial,
65
+ validate: (v) => {
66
+ const trimmed = v.trim();
67
+ if (trimmed === '')
68
+ return 'URL is required.';
69
+ if (!/^https?:\/\//.test(trimmed)) {
70
+ return 'URL must start with http:// or https://.';
71
+ }
72
+ try {
73
+ void new URL(trimmed);
74
+ }
75
+ catch {
76
+ return 'URL is not a valid web address.';
77
+ }
78
+ return undefined;
79
+ },
80
+ });
81
+ if (isCancel(wpUrlRaw)) {
82
+ cancel('Setup cancelled.');
83
+ return null;
84
+ }
85
+ const wpUrl = normaliseUrl(wpUrlRaw);
86
+ // 3. Profile name — multi-site switching. Default 'default'.
87
+ const profileRaw = await text({
88
+ message: 'Profile name (for switching between sites):',
89
+ placeholder: 'default',
90
+ initialValue: 'default',
91
+ validate: (v) => {
92
+ const trimmed = v.trim();
93
+ if (trimmed === '')
94
+ return 'Profile name is required.';
95
+ if (!/^[a-zA-Z0-9_-]+$/.test(trimmed)) {
96
+ return 'Use letters, digits, dashes, or underscores only.';
97
+ }
98
+ return undefined;
99
+ },
100
+ });
101
+ if (isCancel(profileRaw)) {
102
+ cancel('Setup cancelled.');
103
+ return null;
104
+ }
105
+ const profileName = profileRaw.trim();
106
+ // 4. AI client selection (multi-select; pre-checks detected ones).
107
+ const clientChoices = ALL_CLIENTS.map((c) => {
108
+ const detection = input.detected.find((d) => d.id === c.id);
109
+ return {
110
+ value: c.id,
111
+ label: detection?.detected === true ? `${c.label} (detected)` : c.label,
112
+ hint: detection?.configPath ?? '',
113
+ };
114
+ });
115
+ const selectedRaw = await multiselect({
116
+ message: 'Which AI clients should we configure?',
117
+ options: clientChoices,
118
+ initialValues: input.detected.filter((d) => d.detected).map((d) => d.id),
119
+ required: true,
120
+ });
121
+ if (isCancel(selectedRaw)) {
122
+ cancel('Setup cancelled.');
123
+ return null;
124
+ }
125
+ return {
126
+ wpUrl,
127
+ bearer,
128
+ selectedClients: selectedRaw,
129
+ profileName,
130
+ };
131
+ }
132
+ /**
133
+ * Yes/no confirmation prompt. Returns `false` on cancel (safer default
134
+ * than `true` — the wizard treats it as "don't continue").
135
+ */
136
+ export async function defaultConfirmContinue(message) {
137
+ const ans = await clackConfirm({ message, initialValue: false });
138
+ if (isCancel(ans))
139
+ return false;
140
+ return ans === true;
141
+ }
142
+ //# sourceMappingURL=setup-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-prompts.js","sourceRoot":"","sources":["../src/setup-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pure helpers for the setup wizard — token decode + URL extraction.
3
+ *
4
+ * Split out of `setup-prompts.ts` so it can be unit-tested without a TTY
5
+ * and so the `runWizard` body can decode a token without dragging in the
6
+ * @clack/prompts UI surface.
7
+ *
8
+ * The decode is intentionally signature-UNVERIFIED. The wizard cannot
9
+ * verify the HMAC signature (that requires the plugin's signing-secret
10
+ * which only the server holds). We use the decoded payload purely to
11
+ * pre-fill the URL prompt as a convenience — the canonical auth check
12
+ * happens later when `runWizard` hits `/v1/health` with the token; if
13
+ * the payload has been tampered with, that probe rejects it.
14
+ *
15
+ * @license MIT
16
+ */
17
+ import type { DecodedTokenPayload } from './setup-wizard-types.js';
18
+ /**
19
+ * Decode the base64url payload of a Bearer key.
20
+ *
21
+ * Returns `null` when the token shape is invalid OR the payload JSON is
22
+ * malformed OR the required fields (kid + scope + iss) are missing or
23
+ * the wrong type. Callers should treat `null` as "this token is unusable
24
+ * for URL pre-fill; ask the user to type the URL by hand."
25
+ */
26
+ export declare function decodeToken(token: string): DecodedTokenPayload | null;
27
+ /**
28
+ * Normalise a URL string the way the wizard wants it:
29
+ * - trim whitespace
30
+ * - strip trailing slashes
31
+ * - return empty string on null/undefined input
32
+ *
33
+ * Exposed so the prompt validator and the identity probe share one
34
+ * canonicalisation rule (otherwise drift causes "looks the same to the
35
+ * human, mismatches in code" bugs).
36
+ */
37
+ export declare function normaliseUrl(input: string | null | undefined): string;
38
+ //# sourceMappingURL=setup-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-token.d.ts","sourceRoot":"","sources":["../src/setup-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnE;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAmDrE;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGrE"}