@lovinka/deployik-mcp 0.1.6 → 0.3.1
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/README.md +3 -3
- package/dist/client/errors.js +1 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/http.js +9 -0
- package/dist/client/http.js.map +1 -1
- package/dist/install-skill.js +71 -18
- package/dist/install-skill.js.map +1 -1
- package/dist/install.js +163 -55
- package/dist/install.js.map +1 -1
- package/dist/knowledge/recipes.generated.js +2 -2
- package/dist/knowledge/recipes.generated.js.map +1 -1
- package/dist/lib/browser.js +31 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/format.js +1 -1
- package/dist/lib/groups.js +43 -0
- package/dist/lib/groups.js.map +1 -0
- package/dist/lib/safety.js +4 -1
- package/dist/lib/safety.js.map +1 -1
- package/dist/lib/term.js +22 -0
- package/dist/lib/term.js.map +1 -0
- package/dist/resolve/project.js +27 -14
- package/dist/resolve/project.js.map +1 -1
- package/dist/tools/groups.js +141 -0
- package/dist/tools/groups.js.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/projects.js +64 -25
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/services.js +218 -0
- package/dist/tools/services.js.map +1 -0
- package/dist/tools/workflows.js +240 -9
- package/dist/tools/workflows.js.map +1 -1
- package/dist/tools/workspaces.js +4 -6
- package/dist/tools/workspaces.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -68,10 +68,10 @@ Get a token at **Account → Access tokens** in Deployik. The token is shown onc
|
|
|
68
68
|
|
|
69
69
|
## What it does
|
|
70
70
|
|
|
71
|
-
- **~
|
|
71
|
+
- **~37 thin tools** — one per Deployik HTTP endpoint (projects, deployments, env vars, secrets, domains, auto-build, password protection, volumes, analytics, email, dashboard groups, tokens, GitHub).
|
|
72
72
|
- **12 workflow tools** — `setup_project_from_repo`, `deploy_project`, `set_secret`, `tail_latest_logs`, `debug_failed_deployment`, `get_project_health`, `init_in_repo`, `whats_my_url`, `whats_broken`, `redeploy`, and more.
|
|
73
73
|
- **Bundled knowledge** — Deployik's how-to recipes ship as MCP prompts (`deployik_recipe_*`), plus three tools: `list_recipes`, `get_recipe(topic)`, and **`find_help(question)`** which routes free-form English ("where do I set the Stripe key for the live site?") to the right recipe automatically.
|
|
74
|
-
- **Repo binding** — first call inside a git repo with a unique-match `origin` auto-writes `.deployik.json` (committed, just project +
|
|
74
|
+
- **Repo binding** — first call inside a git repo with a unique-match `origin` auto-writes `.deployik.json` (committed, just project + dashboard group + schema URL) and gitignores the private `.deployik/` directory. Self-healing `.gitignore`.
|
|
75
75
|
- **Tiered safety** — destructive operations require `confirm: true`; production-touching operations also require `confirm_name: <project>`. Every destructive call is logged to `.deployik/audit.log`.
|
|
76
76
|
- **Loose English** — `prod` / `live` / `staging` / `dev` / `both` / `everywhere` all normalize to the right scope automatically.
|
|
77
77
|
|
|
@@ -99,7 +99,7 @@ Project ↔ repo state is split into two layers — **public** (commit it) and
|
|
|
99
99
|
│ Deployik project this folder deploys to.
|
|
100
100
|
└── .deployik/ PRIVATE. Auto-added to .gitignore (and re-added on every
|
|
101
101
|
MCP call if a teammate clobbers the .gitignore line).
|
|
102
|
-
├── cache.json Project +
|
|
102
|
+
├── cache.json Project + dashboard group list (1h TTL).
|
|
103
103
|
├── token Optional token fallback (mode 0600) — only used if
|
|
104
104
|
DEPLOYIK_TOKEN env var is unset.
|
|
105
105
|
└── audit.log Append-only ledger of destructive calls (secret values
|
package/dist/client/errors.js
CHANGED
|
@@ -17,7 +17,7 @@ export function hintForStatus(status, endpoint) {
|
|
|
17
17
|
return "Token is missing, expired, or revoked. Set DEPLOYIK_TOKEN to a fresh `dpk_…` token from Account → Access tokens.";
|
|
18
18
|
}
|
|
19
19
|
if (status === 403) {
|
|
20
|
-
return "Token is valid but the owner cannot access this resource. Check the project's
|
|
20
|
+
return "Token is valid but the owner cannot access this resource. Check the project's dashboard group membership.";
|
|
21
21
|
}
|
|
22
22
|
if (status === 404) {
|
|
23
23
|
if (endpoint.includes("/projects/")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,IAAI,CAAU;IACd,IAAI,CAAU;IAEvB,YAAY,IAAyF;QACnG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB;IAC5D,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,kHAAkH,CAAC;IAC5H,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,IAAI,CAAU;IACd,IAAI,CAAU;IAEvB,YAAY,IAAyF;QACnG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB;IAC5D,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,kHAAkH,CAAC;IAC5H,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,2GAA2G,CAAC;IACrH,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,OAAO,2JAA2J,CAAC;QACrK,CAAC;QACD,OAAO,iCAAiC,CAAC;IAC3C,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,qIAAqI,CAAC;IAC/I,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,oDAAoD,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClB,OAAO,+EAA+E,CAAC;IACzF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
package/dist/client/http.js
CHANGED
|
@@ -125,6 +125,15 @@ export class DeployikClient {
|
|
|
125
125
|
screenshotUrl(deploymentId) {
|
|
126
126
|
return `${this.baseUrl}/api/deployments/${encodeURIComponent(deploymentId)}/screenshot`;
|
|
127
127
|
}
|
|
128
|
+
/** Build a ws://… / wss://… URL for a `/ws/...` path. */
|
|
129
|
+
wsUrl(path) {
|
|
130
|
+
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
131
|
+
return `${this.baseUrl.replace(/^http/, "ws")}${normalized}`;
|
|
132
|
+
}
|
|
133
|
+
/** Authorization header value for WS handshakes — PATs are gated to Bearer. */
|
|
134
|
+
bearerHeader() {
|
|
135
|
+
return `Bearer ${this.token}`;
|
|
136
|
+
}
|
|
128
137
|
}
|
|
129
138
|
function retryableMethod(method, path) {
|
|
130
139
|
// GET / PUT / DELETE are HTTP-idempotent.
|
package/dist/client/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"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"}
|
package/dist/install-skill.js
CHANGED
|
@@ -10,6 +10,54 @@ import { homedir } from "node:os";
|
|
|
10
10
|
import { join, resolve } from "node:path";
|
|
11
11
|
import { createInterface } from "node:readline";
|
|
12
12
|
import { RECIPE_FILES } from "./knowledge/recipes.generated.js";
|
|
13
|
+
// Two read modes, chosen at first prompt by checking whether stdin is a TTY:
|
|
14
|
+
//
|
|
15
|
+
// TTY → singleton readline; user is typing interactively.
|
|
16
|
+
// pipe → drain stdin once into a line buffer (piped input EOFs as soon as
|
|
17
|
+
// it drains, which auto-closes readline mid-wizard with ERR_USE_AFTER_CLOSE).
|
|
18
|
+
//
|
|
19
|
+
// Same async API for both — callers don't care which mode is active.
|
|
20
|
+
let sharedRl = null;
|
|
21
|
+
let pipedLines = null;
|
|
22
|
+
let pipeReadPromise = null;
|
|
23
|
+
function isPipedStdin() {
|
|
24
|
+
return process.stdin.isTTY !== true;
|
|
25
|
+
}
|
|
26
|
+
function ensurePipedLines() {
|
|
27
|
+
if (pipeReadPromise)
|
|
28
|
+
return pipeReadPromise;
|
|
29
|
+
pipeReadPromise = new Promise((resolveFn) => {
|
|
30
|
+
let data = "";
|
|
31
|
+
process.stdin.setEncoding("utf8");
|
|
32
|
+
process.stdin.on("data", (chunk) => { data += chunk; });
|
|
33
|
+
process.stdin.on("end", () => {
|
|
34
|
+
pipedLines = data.split(/\r?\n/);
|
|
35
|
+
resolveFn();
|
|
36
|
+
});
|
|
37
|
+
process.stdin.on("error", () => { pipedLines = []; resolveFn(); });
|
|
38
|
+
});
|
|
39
|
+
return pipeReadPromise;
|
|
40
|
+
}
|
|
41
|
+
async function readLine(promptText) {
|
|
42
|
+
if (isPipedStdin()) {
|
|
43
|
+
process.stdout.write(promptText);
|
|
44
|
+
await ensurePipedLines();
|
|
45
|
+
const line = pipedLines.shift() ?? "";
|
|
46
|
+
process.stdout.write(line + "\n");
|
|
47
|
+
return line;
|
|
48
|
+
}
|
|
49
|
+
if (!sharedRl)
|
|
50
|
+
sharedRl = createInterface({ input: process.stdin, output: process.stdout });
|
|
51
|
+
return new Promise((resolveFn) => {
|
|
52
|
+
sharedRl.question(promptText, (answer) => resolveFn(answer));
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export function closeReadline() {
|
|
56
|
+
if (sharedRl) {
|
|
57
|
+
sharedRl.close();
|
|
58
|
+
sharedRl = null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
13
61
|
export function skillTargetDir(scope, cwd, destBase) {
|
|
14
62
|
if (destBase)
|
|
15
63
|
return resolve(destBase, "deployik-howto");
|
|
@@ -51,24 +99,29 @@ export async function installSkillResult(opts) {
|
|
|
51
99
|
writeFileSync(join(target, f.file), f.content, "utf8");
|
|
52
100
|
return { target, files: RECIPE_FILES.map((f) => f.file), alreadyExisted };
|
|
53
101
|
}
|
|
54
|
-
export function promptYesNo(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
rl.question(prompt, (answer) => {
|
|
58
|
-
rl.close();
|
|
59
|
-
resolveFn(/^y(es)?$/i.test(answer.trim()));
|
|
60
|
-
});
|
|
61
|
-
});
|
|
102
|
+
export async function promptYesNo(promptText) {
|
|
103
|
+
const answer = await readLine(promptText);
|
|
104
|
+
return /^y(es)?$/i.test(answer.trim());
|
|
62
105
|
}
|
|
63
|
-
export function prompt(message, defaultValue) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
106
|
+
export async function prompt(message, defaultValue) {
|
|
107
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : "";
|
|
108
|
+
const answer = await readLine(`${message}${suffix}: `);
|
|
109
|
+
const trimmed = answer.trim();
|
|
110
|
+
return trimmed || defaultValue || "";
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Single-letter choice prompt, e.g. promptChoice("Scope", [["g","global"],["l","local"]], "g").
|
|
114
|
+
* Returns the chosen letter (lowercased).
|
|
115
|
+
*/
|
|
116
|
+
export async function promptChoice(message, choices, defaultLetter) {
|
|
117
|
+
const display = choices
|
|
118
|
+
.map(([l, lab]) => (l === defaultLetter ? l.toUpperCase() : l) + "=" + lab)
|
|
119
|
+
.join(" / ");
|
|
120
|
+
const answer = await readLine(`${message} [${display}]: `);
|
|
121
|
+
const a = answer.trim().toLowerCase();
|
|
122
|
+
if (!a)
|
|
123
|
+
return defaultLetter.toLowerCase();
|
|
124
|
+
const match = choices.find(([l]) => l.toLowerCase() === a[0]);
|
|
125
|
+
return match ? match[0].toLowerCase() : defaultLetter.toLowerCase();
|
|
73
126
|
}
|
|
74
127
|
//# sourceMappingURL=install-skill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../src/install-skill.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,sDAAsD;AACtD,EAAE;AACF,SAAS;AACT,+DAA+D;AAC/D,mEAAmE;AAEnE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../src/install-skill.ts"],"names":[],"mappings":"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"}
|
package/dist/install.js
CHANGED
|
@@ -1,80 +1,188 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// Interactive 4-step installer: URL → token → scope → confirm.
|
|
2
|
+
// Each step validates before moving on so the user gets immediate feedback
|
|
3
|
+
// (server reachable? token authenticates? scope chosen?) instead of a silent
|
|
4
|
+
// failure at the end.
|
|
5
|
+
//
|
|
6
|
+
// `--yes` skips prompts but still runs validations — bad token / unreachable
|
|
7
|
+
// URL still aborts, since installing a config that can't authenticate would
|
|
8
|
+
// be a footgun.
|
|
5
9
|
import { installMcp } from "./install-mcp.js";
|
|
6
|
-
import { installSkillResult, prompt, promptYesNo } from "./install-skill.js";
|
|
10
|
+
import { installSkillResult, prompt, promptYesNo, promptChoice, closeReadline } from "./install-skill.js";
|
|
11
|
+
import { openInBrowser } from "./lib/browser.js";
|
|
12
|
+
import { box, dim, fail, info, ok, section, warn, bold, cyan } from "./lib/term.js";
|
|
13
|
+
import { VERSION } from "./version.js";
|
|
7
14
|
const DEFAULT_URL = "https://deployik.lovinka.com";
|
|
8
15
|
export async function installAll(opts) {
|
|
9
16
|
const cwd = opts.cwd ?? process.cwd();
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
17
|
+
if (!opts.yes) {
|
|
18
|
+
process.stdout.write("\n" + box(`@lovinka/deployik-mcp installer (${VERSION})`, [
|
|
19
|
+
`${dim("Wires the Deployik MCP server into Claude's config and copies")}`,
|
|
20
|
+
`${dim("the bundled how-to recipes into ~/.claude/skills/.")}`,
|
|
21
|
+
]) + "\n");
|
|
22
|
+
}
|
|
23
|
+
// ─── Step 1: URL ──────────────────────────────────────────────
|
|
13
24
|
let url = opts.url ?? process.env.DEPLOYIK_URL ?? "";
|
|
14
|
-
let token = opts.token ?? process.env.DEPLOYIK_TOKEN ?? "";
|
|
15
25
|
if (!opts.skipMcp) {
|
|
16
|
-
if (!opts.yes) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
if (!opts.yes && !url) {
|
|
27
|
+
process.stdout.write(section(1, 4, "Deployik server URL"));
|
|
28
|
+
process.stdout.write(`\n${dim("Public default works for the lovinka.com instance. For VPN-only")}\n`);
|
|
29
|
+
process.stdout.write(`${dim("installs, point at the internal hostname (e.g. http://10.x.x.x:8080).")}\n\n`);
|
|
30
|
+
url = await prompt("Deployik URL", DEFAULT_URL);
|
|
31
|
+
}
|
|
32
|
+
if (!url)
|
|
33
|
+
url = DEFAULT_URL;
|
|
34
|
+
const reach = await probeHealth(url);
|
|
35
|
+
if (reach.ok) {
|
|
36
|
+
process.stdout.write(" " + ok(`reachable${reach.version ? ` (deployik ${reach.version})` : ""}\n`));
|
|
21
37
|
}
|
|
22
38
|
else {
|
|
23
|
-
|
|
24
|
-
|
|
39
|
+
process.stdout.write(" " + warn(`unreachable: ${reach.error}\n`));
|
|
40
|
+
if (!opts.yes) {
|
|
41
|
+
const cont = await promptYesNo(" Continue anyway? [y/N] ");
|
|
42
|
+
if (!cont)
|
|
43
|
+
return abort("Install aborted at URL step.");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// ─── Step 2: Token ────────────────────────────────────────────
|
|
48
|
+
let token = opts.token ?? process.env.DEPLOYIK_TOKEN ?? "";
|
|
49
|
+
let user;
|
|
50
|
+
if (!opts.skipMcp) {
|
|
51
|
+
process.stdout.write(section(2, 4, "Personal Access Token"));
|
|
52
|
+
if (!token && !opts.yes) {
|
|
53
|
+
const tokensUrl = `${url.replace(/\/+$/, "")}/account/tokens`;
|
|
54
|
+
process.stdout.write(`\n${dim("Create a token at:")} ${cyan(tokensUrl)}\n`);
|
|
55
|
+
const open = await promptYesNo(`Open the page in your browser? [Y/n] `);
|
|
56
|
+
const yes = open === true || open;
|
|
57
|
+
if (yes) {
|
|
58
|
+
const opened = openInBrowser(tokensUrl);
|
|
59
|
+
process.stdout.write(` ${opened ? ok("opening browser…") : warn("couldn't auto-open — visit the URL manually")}\n\n`);
|
|
60
|
+
}
|
|
61
|
+
token = await prompt("Paste the token (starts with dpk_)");
|
|
25
62
|
}
|
|
26
63
|
if (!token) {
|
|
27
|
-
process.stderr.write(
|
|
28
|
-
|
|
64
|
+
process.stderr.write("\n" + fail("DEPLOYIK_TOKEN missing.") +
|
|
65
|
+
`\n Pass ${bold("--token=<dpk_...>")} or set ${bold("DEPLOYIK_TOKEN")} env var.\n` +
|
|
66
|
+
` Get a token at ${cyan(`${url.replace(/\/+$/, "")}/account/tokens`)}\n`);
|
|
29
67
|
return 2;
|
|
30
68
|
}
|
|
31
|
-
if (!
|
|
32
|
-
|
|
69
|
+
if (!token.startsWith("dpk_")) {
|
|
70
|
+
process.stdout.write(" " + warn(`token doesn't start with 'dpk_' — Deployik PATs always do. Continuing anyway.\n`));
|
|
71
|
+
}
|
|
72
|
+
const auth = await probeWhoami(url, token);
|
|
73
|
+
if (auth.ok) {
|
|
74
|
+
user = auth.user;
|
|
75
|
+
process.stdout.write(" " + ok(`authenticated as ${bold(auth.user.username ?? "?")} (${auth.user.role ?? "?"})\n`));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
process.stdout.write(" " + fail(`token rejected: ${auth.error}\n`));
|
|
79
|
+
// 401 (token actually rejected) is a hard abort even with --yes — installing
|
|
80
|
+
// a known-broken token gives the user a silently-failing MCP. Network errors
|
|
81
|
+
// (timeout / DNS) only abort interactively, since VPN-only installs may
|
|
82
|
+
// legitimately fail to reach the URL from the install machine.
|
|
83
|
+
const isAuthFailure = (auth.error || "").includes("401");
|
|
84
|
+
if (isAuthFailure)
|
|
85
|
+
return abort("Install aborted — token did not authenticate.");
|
|
86
|
+
if (!opts.yes)
|
|
87
|
+
return abort("Install aborted — fix the token and re-run.");
|
|
88
|
+
process.stdout.write(" " + warn("continuing anyway (--yes); make sure DEPLOYIK_TOKEN is valid before using.\n"));
|
|
89
|
+
}
|
|
33
90
|
}
|
|
34
|
-
//
|
|
91
|
+
// ─── Step 3: Scope ────────────────────────────────────────────
|
|
92
|
+
let scope = opts.scope;
|
|
35
93
|
if (!opts.yes) {
|
|
36
|
-
process.stdout.write(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
94
|
+
process.stdout.write(section(3, 4, "Install scope"));
|
|
95
|
+
process.stdout.write(`\n ${bold("g")} = global ${dim("(recommended) — every project + every Claude window")}`);
|
|
96
|
+
process.stdout.write(`\n ${bold("l")} = local ${dim("— only when Claude is opened in this folder (writes ./.mcp.json)")}\n\n`);
|
|
97
|
+
const def = scope === "local" ? "l" : "g";
|
|
98
|
+
const picked = await promptChoice("Scope", [["g", "global"], ["l", "local"]], def);
|
|
99
|
+
scope = picked === "l" ? "local" : "global";
|
|
100
|
+
process.stdout.write(" " + ok(`scope: ${bold(scope)}\n`));
|
|
101
|
+
}
|
|
102
|
+
// ─── Step 4: Confirm ──────────────────────────────────────────
|
|
103
|
+
if (!opts.yes) {
|
|
104
|
+
process.stdout.write(section(4, 4, "Confirm"));
|
|
105
|
+
process.stdout.write(`\n ${info("About to:")}`);
|
|
106
|
+
if (!opts.skipMcp) {
|
|
107
|
+
process.stdout.write(`\n • register MCP server '${bold("deployik")}' (${scope}) → ${url}`);
|
|
108
|
+
if (user?.username)
|
|
109
|
+
process.stdout.write(`\n authenticated as ${user.username}`);
|
|
110
|
+
}
|
|
111
|
+
if (!opts.skipSkill) {
|
|
112
|
+
process.stdout.write(`\n • copy Deployik skill files (${scope})`);
|
|
46
113
|
}
|
|
114
|
+
if (scope === "global")
|
|
115
|
+
process.stdout.write(`\n ${dim("Backups of any existing config files will be made automatically.")}`);
|
|
116
|
+
process.stdout.write(`\n\n`);
|
|
117
|
+
// Treat empty input (just Enter) as Y since the prompt explicitly says [Y/n].
|
|
118
|
+
const answer = (await prompt("Proceed?", "y")).toLowerCase();
|
|
119
|
+
if (answer === "n" || answer === "no")
|
|
120
|
+
return abort("Aborted.");
|
|
47
121
|
}
|
|
48
|
-
//
|
|
122
|
+
// ─── Execute ─────────────────────────────────────────────────
|
|
123
|
+
process.stdout.write(`\n${dim("─".repeat(60))}\n`);
|
|
49
124
|
if (!opts.skipMcp) {
|
|
50
|
-
process.stdout.write(
|
|
125
|
+
process.stdout.write(`${bold("Writing MCP config…")}\n`);
|
|
51
126
|
const res = installMcp({ scope, url, token, cwd });
|
|
52
|
-
for (const w of res.written)
|
|
53
|
-
process.stdout.write(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (res.written.length === 0) {
|
|
59
|
-
process.stderr.write(` ! no MCP config targets were writable — nothing changed.\n`);
|
|
60
|
-
}
|
|
127
|
+
for (const w of res.written)
|
|
128
|
+
process.stdout.write(" " + ok(`${w.created ? "created" : "updated"} ${w.path}${w.backupPath ? ` ${dim("backup → " + w.backupPath)}` : ""}\n`));
|
|
129
|
+
for (const s of res.skipped)
|
|
130
|
+
process.stdout.write(" " + dim(`skipped ${s.path} (${s.reason})\n`));
|
|
131
|
+
if (res.written.length === 0)
|
|
132
|
+
process.stderr.write(" " + fail("no MCP config targets were writable\n"));
|
|
61
133
|
}
|
|
62
|
-
// 2. Skill files
|
|
63
134
|
if (!opts.skipSkill) {
|
|
64
|
-
process.stdout.write(
|
|
135
|
+
process.stdout.write(`${bold("Writing skill files…")}\n`);
|
|
65
136
|
const r = await installSkillResult({ scope, yes: true, cwd });
|
|
66
|
-
if (r)
|
|
67
|
-
process.stdout.write(
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
process.stdout.write(` · skill install was skipped\n`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
process.stdout.write(`\nDone. Restart Claude Code / Claude Desktop to pick up the new MCP server.\n`);
|
|
74
|
-
if (scope === "local") {
|
|
75
|
-
process.stdout.write(`\nNote: with --local scope, the .mcp.json and .claude/skills/deployik-howto/ are written into\n` +
|
|
76
|
-
`the current directory. The MCP server only fires when Claude is opened in this folder.\n`);
|
|
137
|
+
if (r)
|
|
138
|
+
process.stdout.write(" " + ok(`wrote ${r.files.length} files to ${r.target}${r.alreadyExisted ? dim(" (overwrote existing)") : ""}\n`));
|
|
77
139
|
}
|
|
140
|
+
process.stdout.write(`\n${ok("Done.")} Restart Claude Code or Claude Desktop to load the MCP server.\n`);
|
|
141
|
+
if (scope === "local")
|
|
142
|
+
process.stdout.write(`\n${dim("Note: with --local, the MCP only fires when Claude is opened in this folder.")}\n`);
|
|
143
|
+
closeReadline();
|
|
78
144
|
return 0;
|
|
79
145
|
}
|
|
146
|
+
function abort(msg) {
|
|
147
|
+
process.stdout.write(`\n${fail(msg)}\n`);
|
|
148
|
+
closeReadline();
|
|
149
|
+
return 1;
|
|
150
|
+
}
|
|
151
|
+
async function probeHealth(url) {
|
|
152
|
+
const target = url.replace(/\/+$/, "") + "/api/health";
|
|
153
|
+
try {
|
|
154
|
+
const ctrl = new AbortController();
|
|
155
|
+
const t = setTimeout(() => ctrl.abort(), 5000);
|
|
156
|
+
const res = await fetch(target, { signal: ctrl.signal });
|
|
157
|
+
clearTimeout(t);
|
|
158
|
+
if (!res.ok)
|
|
159
|
+
return { ok: false, error: `HTTP ${res.status}` };
|
|
160
|
+
const body = (await res.json().catch(() => null));
|
|
161
|
+
return { ok: true, version: body?.version?.git_sha?.slice(0, 7) };
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
return { ok: false, error: err.name === "AbortError" ? "timeout (5s)" : err.message };
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async function probeWhoami(url, token) {
|
|
168
|
+
const target = url.replace(/\/+$/, "") + "/api/auth/me";
|
|
169
|
+
try {
|
|
170
|
+
const ctrl = new AbortController();
|
|
171
|
+
const t = setTimeout(() => ctrl.abort(), 8000);
|
|
172
|
+
const res = await fetch(target, {
|
|
173
|
+
headers: { Authorization: `Bearer ${token}`, Accept: "application/json" },
|
|
174
|
+
signal: ctrl.signal,
|
|
175
|
+
});
|
|
176
|
+
clearTimeout(t);
|
|
177
|
+
if (res.status === 401)
|
|
178
|
+
return { ok: false, user: {}, error: "401 unauthorized — token revoked, expired, or wrong" };
|
|
179
|
+
if (!res.ok)
|
|
180
|
+
return { ok: false, user: {}, error: `HTTP ${res.status}` };
|
|
181
|
+
const body = (await res.json().catch(() => null));
|
|
182
|
+
return { ok: true, user: { username: body?.username, role: body?.role } };
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
return { ok: false, user: {}, error: err.name === "AbortError" ? "timeout (8s)" : err.message };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
80
188
|
//# sourceMappingURL=install.js.map
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|