@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.
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/bin/yt-builder-mcp.js +59 -0
- package/dist/auth.d.ts +39 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +93 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +84 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +151 -0
- package/dist/client.js.map +1 -0
- package/dist/clients/claude-code.d.ts +18 -0
- package/dist/clients/claude-code.d.ts.map +1 -0
- package/dist/clients/claude-code.js +53 -0
- package/dist/clients/claude-code.js.map +1 -0
- package/dist/clients/claude-desktop.d.ts +19 -0
- package/dist/clients/claude-desktop.d.ts.map +1 -0
- package/dist/clients/claude-desktop.js +56 -0
- package/dist/clients/claude-desktop.js.map +1 -0
- package/dist/clients/cline.d.ts +26 -0
- package/dist/clients/cline.d.ts.map +1 -0
- package/dist/clients/cline.js +80 -0
- package/dist/clients/cline.js.map +1 -0
- package/dist/clients/codex-cli.d.ts +42 -0
- package/dist/clients/codex-cli.d.ts.map +1 -0
- package/dist/clients/codex-cli.js +194 -0
- package/dist/clients/codex-cli.js.map +1 -0
- package/dist/clients/continue.d.ts +13 -0
- package/dist/clients/continue.d.ts.map +1 -0
- package/dist/clients/continue.js +52 -0
- package/dist/clients/continue.js.map +1 -0
- package/dist/clients/cursor.d.ts +12 -0
- package/dist/clients/cursor.d.ts.map +1 -0
- package/dist/clients/cursor.js +38 -0
- package/dist/clients/cursor.js.map +1 -0
- package/dist/clients/gemini-cli.d.ts +18 -0
- package/dist/clients/gemini-cli.d.ts.map +1 -0
- package/dist/clients/gemini-cli.js +44 -0
- package/dist/clients/gemini-cli.js.map +1 -0
- package/dist/clients/home.d.ts +14 -0
- package/dist/clients/home.d.ts.map +1 -0
- package/dist/clients/home.js +20 -0
- package/dist/clients/home.js.map +1 -0
- package/dist/clients/index.d.ts +52 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +72 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/roo-code.d.ts +23 -0
- package/dist/clients/roo-code.d.ts.map +1 -0
- package/dist/clients/roo-code.js +69 -0
- package/dist/clients/roo-code.js.map +1 -0
- package/dist/clients/zed.d.ts +12 -0
- package/dist/clients/zed.d.ts.map +1 -0
- package/dist/clients/zed.js +41 -0
- package/dist/clients/zed.js.map +1 -0
- package/dist/errors/hints.d.ts +51 -0
- package/dist/errors/hints.d.ts.map +1 -0
- package/dist/errors/hints.js +95 -0
- package/dist/errors/hints.js.map +1 -0
- package/dist/errors/mask.d.ts +35 -0
- package/dist/errors/mask.d.ts.map +1 -0
- package/dist/errors/mask.js +49 -0
- package/dist/errors/mask.js.map +1 -0
- package/dist/errors/sanitize.d.ts +31 -0
- package/dist/errors/sanitize.d.ts.map +1 -0
- package/dist/errors/sanitize.js +90 -0
- package/dist/errors/sanitize.js.map +1 -0
- package/dist/errors.d.ts +42 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -0
- package/dist/gateway/advanced-tool/discovery.d.ts +19 -0
- package/dist/gateway/advanced-tool/discovery.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/discovery.js +53 -0
- package/dist/gateway/advanced-tool/discovery.js.map +1 -0
- package/dist/gateway/advanced-tool/domains.d.ts +42 -0
- package/dist/gateway/advanced-tool/domains.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/domains.js +88 -0
- package/dist/gateway/advanced-tool/domains.js.map +1 -0
- package/dist/gateway/advanced-tool/execute.d.ts +29 -0
- package/dist/gateway/advanced-tool/execute.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/execute.js +54 -0
- package/dist/gateway/advanced-tool/execute.js.map +1 -0
- package/dist/gateway/advanced-tool/index.d.ts +36 -0
- package/dist/gateway/advanced-tool/index.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/index.js +39 -0
- package/dist/gateway/advanced-tool/index.js.map +1 -0
- package/dist/gateway/advanced-tool/register.d.ts +18 -0
- package/dist/gateway/advanced-tool/register.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/register.js +62 -0
- package/dist/gateway/advanced-tool/register.js.map +1 -0
- package/dist/gateway/advanced-tool.d.ts +13 -0
- package/dist/gateway/advanced-tool.d.ts.map +1 -0
- package/dist/gateway/advanced-tool.js +13 -0
- package/dist/gateway/advanced-tool.js.map +1 -0
- package/dist/gateway/capturing-server.d.ts +117 -0
- package/dist/gateway/capturing-server.d.ts.map +1 -0
- package/dist/gateway/capturing-server.js +103 -0
- package/dist/gateway/capturing-server.js.map +1 -0
- package/dist/gateway/essentials.d.ts +49 -0
- package/dist/gateway/essentials.d.ts.map +1 -0
- package/dist/gateway/essentials.js +62 -0
- package/dist/gateway/essentials.js.map +1 -0
- package/dist/gateway/test-support.d.ts +41 -0
- package/dist/gateway/test-support.d.ts.map +1 -0
- package/dist/gateway/test-support.js +60 -0
- package/dist/gateway/test-support.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/install-skill.d.ts +35 -0
- package/dist/install-skill.d.ts.map +1 -0
- package/dist/install-skill.js +107 -0
- package/dist/install-skill.js.map +1 -0
- package/dist/platform/index.d.ts +49 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +38 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/server.d.ts +50 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +117 -0
- package/dist/server.js.map +1 -0
- package/dist/setup-cli.d.ts +100 -0
- package/dist/setup-cli.d.ts.map +1 -0
- package/dist/setup-cli.js +355 -0
- package/dist/setup-cli.js.map +1 -0
- package/dist/setup-prompts.d.ts +41 -0
- package/dist/setup-prompts.d.ts.map +1 -0
- package/dist/setup-prompts.js +142 -0
- package/dist/setup-prompts.js.map +1 -0
- package/dist/setup-token.d.ts +38 -0
- package/dist/setup-token.d.ts.map +1 -0
- package/dist/setup-token.js +106 -0
- package/dist/setup-token.js.map +1 -0
- package/dist/setup-wizard-defaults.d.ts +43 -0
- package/dist/setup-wizard-defaults.d.ts.map +1 -0
- package/dist/setup-wizard-defaults.js +160 -0
- package/dist/setup-wizard-defaults.js.map +1 -0
- package/dist/setup-wizard-handshake.d.ts +25 -0
- package/dist/setup-wizard-handshake.d.ts.map +1 -0
- package/dist/setup-wizard-handshake.js +103 -0
- package/dist/setup-wizard-handshake.js.map +1 -0
- package/dist/setup-wizard-types.d.ts +148 -0
- package/dist/setup-wizard-types.d.ts.map +1 -0
- package/dist/setup-wizard-types.js +11 -0
- package/dist/setup-wizard-types.js.map +1 -0
- package/dist/setup-wizard.d.ts +33 -0
- package/dist/setup-wizard.d.ts.map +1 -0
- package/dist/setup-wizard.js +166 -0
- package/dist/setup-wizard.js.map +1 -0
- package/dist/setup.d.ts +17 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +33 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/elements/builders.d.ts +24 -0
- package/dist/tools/elements/builders.d.ts.map +1 -0
- package/dist/tools/elements/builders.js +150 -0
- package/dist/tools/elements/builders.js.map +1 -0
- package/dist/tools/elements/handlers-write.d.ts +48 -0
- package/dist/tools/elements/handlers-write.d.ts.map +1 -0
- package/dist/tools/elements/handlers-write.js +141 -0
- package/dist/tools/elements/handlers-write.js.map +1 -0
- package/dist/tools/elements/handlers.d.ts +56 -0
- package/dist/tools/elements/handlers.d.ts.map +1 -0
- package/dist/tools/elements/handlers.js +113 -0
- package/dist/tools/elements/handlers.js.map +1 -0
- package/dist/tools/elements/index.d.ts +28 -0
- package/dist/tools/elements/index.d.ts.map +1 -0
- package/dist/tools/elements/index.js +27 -0
- package/dist/tools/elements/index.js.map +1 -0
- package/dist/tools/elements.d.ts +13 -0
- package/dist/tools/elements.d.ts.map +1 -0
- package/dist/tools/elements.js +13 -0
- package/dist/tools/elements.js.map +1 -0
- package/dist/tools/elicitation.d.ts +87 -0
- package/dist/tools/elicitation.d.ts.map +1 -0
- package/dist/tools/elicitation.js +100 -0
- package/dist/tools/elicitation.js.map +1 -0
- package/dist/tools/format/elements-format.d.ts +34 -0
- package/dist/tools/format/elements-format.d.ts.map +1 -0
- package/dist/tools/format/elements-format.js +112 -0
- package/dist/tools/format/elements-format.js.map +1 -0
- package/dist/tools/format/health-format.d.ts +73 -0
- package/dist/tools/format/health-format.d.ts.map +1 -0
- package/dist/tools/format/health-format.js +178 -0
- package/dist/tools/format/health-format.js.map +1 -0
- package/dist/tools/format/inspection-format.d.ts +45 -0
- package/dist/tools/format/inspection-format.d.ts.map +1 -0
- package/dist/tools/format/inspection-format.js +125 -0
- package/dist/tools/format/inspection-format.js.map +1 -0
- package/dist/tools/format/pages-format.d.ts +39 -0
- package/dist/tools/format/pages-format.d.ts.map +1 -0
- package/dist/tools/format/pages-format.js +110 -0
- package/dist/tools/format/pages-format.js.map +1 -0
- package/dist/tools/format/sources-format.d.ts +25 -0
- package/dist/tools/format/sources-format.d.ts.map +1 -0
- package/dist/tools/format/sources-format.js +113 -0
- package/dist/tools/format/sources-format.js.map +1 -0
- package/dist/tools/health.d.ts +22 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +147 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/index.d.ts +23 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +23 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inspection.d.ts +14 -0
- package/dist/tools/inspection.d.ts.map +1 -0
- package/dist/tools/inspection.js +115 -0
- package/dist/tools/inspection.js.map +1 -0
- package/dist/tools/layout-flatten.d.ts +63 -0
- package/dist/tools/layout-flatten.d.ts.map +1 -0
- package/dist/tools/layout-flatten.js +95 -0
- package/dist/tools/layout-flatten.js.map +1 -0
- package/dist/tools/pages/builders.d.ts +14 -0
- package/dist/tools/pages/builders.d.ts.map +1 -0
- package/dist/tools/pages/builders.js +97 -0
- package/dist/tools/pages/builders.js.map +1 -0
- package/dist/tools/pages/handlers-read.d.ts +24 -0
- package/dist/tools/pages/handlers-read.d.ts.map +1 -0
- package/dist/tools/pages/handlers-read.js +141 -0
- package/dist/tools/pages/handlers-read.js.map +1 -0
- package/dist/tools/pages/handlers-write.d.ts +21 -0
- package/dist/tools/pages/handlers-write.d.ts.map +1 -0
- package/dist/tools/pages/handlers-write.js +52 -0
- package/dist/tools/pages/handlers-write.js.map +1 -0
- package/dist/tools/pages/index.d.ts +17 -0
- package/dist/tools/pages/index.d.ts.map +1 -0
- package/dist/tools/pages/index.js +17 -0
- package/dist/tools/pages/index.js.map +1 -0
- package/dist/tools/pages/schemas.d.ts +30 -0
- package/dist/tools/pages/schemas.d.ts.map +1 -0
- package/dist/tools/pages/schemas.js +30 -0
- package/dist/tools/pages/schemas.js.map +1 -0
- package/dist/tools/pages.d.ts +13 -0
- package/dist/tools/pages.d.ts.map +1 -0
- package/dist/tools/pages.js +13 -0
- package/dist/tools/pages.js.map +1 -0
- package/dist/tools/progress-phases.d.ts +46 -0
- package/dist/tools/progress-phases.d.ts.map +1 -0
- package/dist/tools/progress-phases.js +48 -0
- package/dist/tools/progress-phases.js.map +1 -0
- package/dist/tools/shared-schemas.d.ts +15 -0
- package/dist/tools/shared-schemas.d.ts.map +1 -0
- package/dist/tools/shared-schemas.js +30 -0
- package/dist/tools/shared-schemas.js.map +1 -0
- package/dist/tools/sources/builders.d.ts +13 -0
- package/dist/tools/sources/builders.d.ts.map +1 -0
- package/dist/tools/sources/builders.js +88 -0
- package/dist/tools/sources/builders.js.map +1 -0
- package/dist/tools/sources/handlers-bind.d.ts +26 -0
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -0
- package/dist/tools/sources/handlers-bind.js +123 -0
- package/dist/tools/sources/handlers-bind.js.map +1 -0
- package/dist/tools/sources/handlers.d.ts +45 -0
- package/dist/tools/sources/handlers.d.ts.map +1 -0
- package/dist/tools/sources/handlers.js +84 -0
- package/dist/tools/sources/handlers.js.map +1 -0
- package/dist/tools/sources/index.d.ts +19 -0
- package/dist/tools/sources/index.d.ts.map +1 -0
- package/dist/tools/sources/index.js +18 -0
- package/dist/tools/sources/index.js.map +1 -0
- package/dist/tools/sources.d.ts +14 -0
- package/dist/tools/sources.d.ts.map +1 -0
- package/dist/tools/sources.js +14 -0
- package/dist/tools/sources.js.map +1 -0
- package/dist/tools/sparse-fields.d.ts +80 -0
- package/dist/tools/sparse-fields.d.ts.map +1 -0
- package/dist/tools/sparse-fields.js +144 -0
- package/dist/tools/sparse-fields.js.map +1 -0
- package/dist/tools/tool-builder/annotations.d.ts +22 -0
- package/dist/tools/tool-builder/annotations.d.ts.map +1 -0
- package/dist/tools/tool-builder/annotations.js +35 -0
- package/dist/tools/tool-builder/annotations.js.map +1 -0
- package/dist/tools/tool-builder/define.d.ts +31 -0
- package/dist/tools/tool-builder/define.d.ts.map +1 -0
- package/dist/tools/tool-builder/define.js +31 -0
- package/dist/tools/tool-builder/define.js.map +1 -0
- package/dist/tools/tool-builder/index.d.ts +28 -0
- package/dist/tools/tool-builder/index.d.ts.map +1 -0
- package/dist/tools/tool-builder/index.js +27 -0
- package/dist/tools/tool-builder/index.js.map +1 -0
- package/dist/tools/tool-builder/results.d.ts +59 -0
- package/dist/tools/tool-builder/results.d.ts.map +1 -0
- package/dist/tools/tool-builder/results.js +125 -0
- package/dist/tools/tool-builder/results.js.map +1 -0
- package/dist/tools/tool-builder/types.d.ts +82 -0
- package/dist/tools/tool-builder/types.d.ts.map +1 -0
- package/dist/tools/tool-builder/types.js +9 -0
- package/dist/tools/tool-builder/types.js.map +1 -0
- package/dist/tools/tool-builder.d.ts +16 -0
- package/dist/tools/tool-builder.d.ts.map +1 -0
- package/dist/tools/tool-builder.js +16 -0
- package/dist/tools/tool-builder.js.map +1 -0
- package/icon.png +0 -0
- package/manifest.json +63 -0
- package/package.json +81 -0
- 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"}
|