@lovinka/deployik-mcp 0.1.1 → 0.1.5
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 +72 -15
- package/dist/client/http.js +36 -0
- package/dist/client/http.js.map +1 -1
- package/dist/config/audit.js +12 -1
- package/dist/config/audit.js.map +1 -1
- package/dist/config/binding.js +85 -18
- package/dist/config/binding.js.map +1 -1
- package/dist/config/cache.js +9 -1
- package/dist/config/cache.js.map +1 -1
- package/dist/index.js +119 -1
- package/dist/index.js.map +1 -1
- package/dist/install-mcp.js +133 -0
- package/dist/install-mcp.js.map +1 -0
- package/dist/install-skill.js +74 -0
- package/dist/install-skill.js.map +1 -0
- package/dist/install.js +80 -0
- package/dist/install.js.map +1 -0
- package/dist/lib/normalize.js +60 -0
- package/dist/lib/normalize.js.map +1 -0
- package/dist/resolve/project.js +26 -6
- package/dist/resolve/project.js.map +1 -1
- package/dist/server.js +3 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/env.js +17 -12
- package/dist/tools/env.js.map +1 -1
- package/dist/tools/help.js +120 -0
- package/dist/tools/help.js.map +1 -1
- package/dist/tools/secrets.js +17 -12
- package/dist/tools/secrets.js.map +1 -1
- package/dist/tools/workflows.js +176 -24
- package/dist/tools/workflows.js.map +1 -1
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Register the @lovinka/deployik-mcp server in Claude's MCP config so users
|
|
2
|
+
// don't have to hand-edit JSON. Supports two scopes:
|
|
3
|
+
//
|
|
4
|
+
// global — Claude Code's user-level `~/.claude.json` (always) and, if
|
|
5
|
+
// present, Claude Desktop's platform-specific config file. This is
|
|
6
|
+
// the recommended path because once it's set the MCP server is
|
|
7
|
+
// available in every project + every Claude window.
|
|
8
|
+
//
|
|
9
|
+
// local — Project-level `.mcp.json` in the current directory. Newer
|
|
10
|
+
// Claude Code versions auto-pick this up. Useful for a repo where
|
|
11
|
+
// you want to commit a per-project MCP config (e.g. pointed at a
|
|
12
|
+
// preview instance of Deployik).
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, copyFileSync } from "node:fs";
|
|
14
|
+
import { homedir, platform } from "node:os";
|
|
15
|
+
import { dirname, join, resolve } from "node:path";
|
|
16
|
+
function makeEntry(spec, url, token) {
|
|
17
|
+
return {
|
|
18
|
+
type: "stdio",
|
|
19
|
+
command: "npx",
|
|
20
|
+
args: ["-y", spec],
|
|
21
|
+
env: {
|
|
22
|
+
DEPLOYIK_URL: url,
|
|
23
|
+
DEPLOYIK_TOKEN: token,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The set of config files we know how to write for a given scope. For
|
|
29
|
+
* `global`, we try every install target and include the ones whose parent
|
|
30
|
+
* directory exists (so we don't materialise a Claude Desktop directory on a
|
|
31
|
+
* machine that doesn't have it installed).
|
|
32
|
+
*/
|
|
33
|
+
function targetsFor(scope, cwd) {
|
|
34
|
+
if (scope === "local") {
|
|
35
|
+
return [{ path: resolve(cwd, ".mcp.json"), mustExistDir: false, label: "project .mcp.json" }];
|
|
36
|
+
}
|
|
37
|
+
const home = homedir();
|
|
38
|
+
const out = [
|
|
39
|
+
{ path: join(home, ".claude.json"), mustExistDir: false, label: "Claude Code (~/.claude.json)" },
|
|
40
|
+
];
|
|
41
|
+
if (platform() === "darwin") {
|
|
42
|
+
out.push({
|
|
43
|
+
path: join(home, "Library", "Application Support", "Claude", "claude_desktop_config.json"),
|
|
44
|
+
mustExistDir: true,
|
|
45
|
+
label: "Claude Desktop (macOS)",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else if (platform() === "win32") {
|
|
49
|
+
const appdata = process.env.APPDATA || join(home, "AppData", "Roaming");
|
|
50
|
+
out.push({
|
|
51
|
+
path: join(appdata, "Claude", "claude_desktop_config.json"),
|
|
52
|
+
mustExistDir: true,
|
|
53
|
+
label: "Claude Desktop (Windows)",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
out.push({
|
|
58
|
+
path: join(home, ".config", "Claude", "claude_desktop_config.json"),
|
|
59
|
+
mustExistDir: true,
|
|
60
|
+
label: "Claude Desktop (Linux)",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
function readConfig(path) {
|
|
66
|
+
if (!existsSync(path))
|
|
67
|
+
return undefined;
|
|
68
|
+
try {
|
|
69
|
+
const raw = readFileSync(path, "utf8").trim();
|
|
70
|
+
if (!raw)
|
|
71
|
+
return {};
|
|
72
|
+
return JSON.parse(raw);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
throw new Error(`Failed to parse ${path} — refusing to overwrite. (${err.message})`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function backup(path) {
|
|
79
|
+
const ts = new Date().toISOString().replace(/[:.]/g, "-");
|
|
80
|
+
const bak = `${path}.bak.${ts}`;
|
|
81
|
+
copyFileSync(path, bak);
|
|
82
|
+
return bak;
|
|
83
|
+
}
|
|
84
|
+
export function installMcp(opts) {
|
|
85
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
86
|
+
const name = opts.name ?? "deployik";
|
|
87
|
+
const spec = opts.packageSpec ?? "@lovinka/deployik-mcp";
|
|
88
|
+
const entry = makeEntry(spec, opts.url, opts.token);
|
|
89
|
+
const result = { written: [], skipped: [] };
|
|
90
|
+
for (const target of targetsFor(opts.scope, cwd)) {
|
|
91
|
+
if (target.mustExistDir && !existsSync(dirname(target.path))) {
|
|
92
|
+
result.skipped.push({ path: target.path, reason: `parent dir not found (${target.label} not installed?)` });
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const existing = readConfig(target.path);
|
|
96
|
+
const created = !existsSync(target.path);
|
|
97
|
+
let backupPath;
|
|
98
|
+
if (existing && existsSync(target.path)) {
|
|
99
|
+
backupPath = backup(target.path);
|
|
100
|
+
}
|
|
101
|
+
const next = existing ?? {};
|
|
102
|
+
next.mcpServers = { ...(next.mcpServers ?? {}), [name]: entry };
|
|
103
|
+
mkdirSync(dirname(target.path), { recursive: true });
|
|
104
|
+
writeFileSync(target.path, JSON.stringify(next, null, 2) + "\n", "utf8");
|
|
105
|
+
result.written.push({ path: target.path, created, backupPath });
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
/** Symmetric uninstall — removes the named mcpServers entry from every target. */
|
|
110
|
+
export function uninstallMcp(opts) {
|
|
111
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
112
|
+
const name = opts.name ?? "deployik";
|
|
113
|
+
const result = { written: [], skipped: [] };
|
|
114
|
+
for (const target of targetsFor(opts.scope, cwd)) {
|
|
115
|
+
if (!existsSync(target.path)) {
|
|
116
|
+
result.skipped.push({ path: target.path, reason: "not present" });
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const config = readConfig(target.path);
|
|
120
|
+
if (!config?.mcpServers || !(name in config.mcpServers)) {
|
|
121
|
+
result.skipped.push({ path: target.path, reason: `no '${name}' entry` });
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const backupPath = backup(target.path);
|
|
125
|
+
const remaining = { ...config.mcpServers };
|
|
126
|
+
delete remaining[name];
|
|
127
|
+
config.mcpServers = remaining;
|
|
128
|
+
writeFileSync(target.path, JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
129
|
+
result.written.push({ path: target.path, created: false, backupPath });
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=install-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-mcp.js","sourceRoot":"","sources":["../src/install-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Copy the bundled Deployik knowledge into Claude's skills directory so the
|
|
2
|
+
// same recipes the MCP serves are also available as a regular skill (fires
|
|
3
|
+
// from `/skills` independently of any MCP tool call).
|
|
4
|
+
//
|
|
5
|
+
// Scope:
|
|
6
|
+
// global → ~/.claude/skills/deployik-howto/ (default)
|
|
7
|
+
// local → <cwd>/.claude/skills/deployik-howto/ (per-project)
|
|
8
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import { join, resolve } from "node:path";
|
|
11
|
+
import { createInterface } from "node:readline";
|
|
12
|
+
import { RECIPE_FILES } from "./knowledge/recipes.generated.js";
|
|
13
|
+
export function skillTargetDir(scope, cwd, destBase) {
|
|
14
|
+
if (destBase)
|
|
15
|
+
return resolve(destBase, "deployik-howto");
|
|
16
|
+
if (scope === "local")
|
|
17
|
+
return resolve(cwd, ".claude", "skills", "deployik-howto");
|
|
18
|
+
return join(homedir(), ".claude", "skills", "deployik-howto");
|
|
19
|
+
}
|
|
20
|
+
export async function installSkill(opts) {
|
|
21
|
+
const result = await installSkillResult(opts);
|
|
22
|
+
if (result === null)
|
|
23
|
+
return 0;
|
|
24
|
+
process.stdout.write(`\n✓ Installed Deployik skill to ${result.target}\n`);
|
|
25
|
+
process.stdout.write(` Test it: in Claude Code, type /skills and look for 'deployik-howto'.\n`);
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
export async function installSkillResult(opts) {
|
|
29
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
30
|
+
const target = skillTargetDir(opts.scope, cwd, opts.destBase);
|
|
31
|
+
if (!RECIPE_FILES.length) {
|
|
32
|
+
process.stderr.write(`No bundled recipes found in this build.\n`);
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
process.stdout.write(`Skill files (${opts.scope}) → ${target}\n`);
|
|
36
|
+
for (const f of RECIPE_FILES)
|
|
37
|
+
process.stdout.write(` - ${f.file}\n`);
|
|
38
|
+
const alreadyExisted = existsSync(target);
|
|
39
|
+
if (alreadyExisted) {
|
|
40
|
+
process.stdout.write(`Note: '${target}' already exists. Files will be overwritten.\n`);
|
|
41
|
+
}
|
|
42
|
+
if (!opts.yes) {
|
|
43
|
+
const ok = await promptYesNo("Proceed with skill install? [y/N] ");
|
|
44
|
+
if (!ok) {
|
|
45
|
+
process.stdout.write("Skipped skill install.\n");
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
mkdirSync(target, { recursive: true });
|
|
50
|
+
for (const f of RECIPE_FILES)
|
|
51
|
+
writeFileSync(join(target, f.file), f.content, "utf8");
|
|
52
|
+
return { target, files: RECIPE_FILES.map((f) => f.file), alreadyExisted };
|
|
53
|
+
}
|
|
54
|
+
export function promptYesNo(prompt) {
|
|
55
|
+
return new Promise((resolveFn) => {
|
|
56
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
57
|
+
rl.question(prompt, (answer) => {
|
|
58
|
+
rl.close();
|
|
59
|
+
resolveFn(/^y(es)?$/i.test(answer.trim()));
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export function prompt(message, defaultValue) {
|
|
64
|
+
return new Promise((resolveFn) => {
|
|
65
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
66
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : "";
|
|
67
|
+
rl.question(`${message}${suffix}: `, (answer) => {
|
|
68
|
+
rl.close();
|
|
69
|
+
const trimmed = answer.trim();
|
|
70
|
+
resolveFn(trimmed || defaultValue || "");
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=install-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../src/install-skill.ts"],"names":[],"mappings":"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"}
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// One-shot installer: registers the @lovinka/deployik-mcp MCP server in
|
|
2
|
+
// Claude's config AND copies the bundled Deployik skill into Claude's skills
|
|
3
|
+
// directory. Default scope is GLOBAL (recommended) — once installed, every
|
|
4
|
+
// project + every Claude window can use the deployik tools.
|
|
5
|
+
import { installMcp } from "./install-mcp.js";
|
|
6
|
+
import { installSkillResult, prompt, promptYesNo } from "./install-skill.js";
|
|
7
|
+
const DEFAULT_URL = "https://deployik.lovinka.com";
|
|
8
|
+
export async function installAll(opts) {
|
|
9
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
10
|
+
const scope = opts.scope;
|
|
11
|
+
process.stdout.write(`\n=== Installing @lovinka/deployik-mcp (${scope}) ===\n\n`);
|
|
12
|
+
// Resolve URL + token
|
|
13
|
+
let url = opts.url ?? process.env.DEPLOYIK_URL ?? "";
|
|
14
|
+
let token = opts.token ?? process.env.DEPLOYIK_TOKEN ?? "";
|
|
15
|
+
if (!opts.skipMcp) {
|
|
16
|
+
if (!opts.yes) {
|
|
17
|
+
if (!url)
|
|
18
|
+
url = await prompt("Deployik URL", DEFAULT_URL);
|
|
19
|
+
if (!token)
|
|
20
|
+
token = await prompt("Personal Access Token (dpk_…)");
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
if (!url)
|
|
24
|
+
url = DEFAULT_URL;
|
|
25
|
+
}
|
|
26
|
+
if (!token) {
|
|
27
|
+
process.stderr.write(`\nERROR: DEPLOYIK_TOKEN missing.\nPass --token=<dpk_...> or set DEPLOYIK_TOKEN env var.\n` +
|
|
28
|
+
`Get a token at: Account → Access tokens in your Deployik dashboard.\n`);
|
|
29
|
+
return 2;
|
|
30
|
+
}
|
|
31
|
+
if (!url)
|
|
32
|
+
url = DEFAULT_URL;
|
|
33
|
+
}
|
|
34
|
+
// Confirmation
|
|
35
|
+
if (!opts.yes) {
|
|
36
|
+
process.stdout.write(`\nAbout to perform:\n`);
|
|
37
|
+
if (!opts.skipMcp)
|
|
38
|
+
process.stdout.write(` • Register MCP server 'deployik' (${scope}) pointing at ${url}\n`);
|
|
39
|
+
if (!opts.skipSkill)
|
|
40
|
+
process.stdout.write(` • Copy Deployik skill files (${scope})\n`);
|
|
41
|
+
process.stdout.write(`\n`);
|
|
42
|
+
const ok = await promptYesNo("Proceed? [y/N] ");
|
|
43
|
+
if (!ok) {
|
|
44
|
+
process.stdout.write("Aborted.\n");
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// 1. MCP registration
|
|
49
|
+
if (!opts.skipMcp) {
|
|
50
|
+
process.stdout.write(`\n--- MCP server registration ---\n`);
|
|
51
|
+
const res = installMcp({ scope, url, token, cwd });
|
|
52
|
+
for (const w of res.written) {
|
|
53
|
+
process.stdout.write(` ✓ ${w.created ? "created" : "updated"} ${w.path}${w.backupPath ? ` (backup → ${w.backupPath})` : ""}\n`);
|
|
54
|
+
}
|
|
55
|
+
for (const s of res.skipped) {
|
|
56
|
+
process.stdout.write(` · skipped ${s.path} (${s.reason})\n`);
|
|
57
|
+
}
|
|
58
|
+
if (res.written.length === 0) {
|
|
59
|
+
process.stderr.write(` ! no MCP config targets were writable — nothing changed.\n`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// 2. Skill files
|
|
63
|
+
if (!opts.skipSkill) {
|
|
64
|
+
process.stdout.write(`\n--- Skill files ---\n`);
|
|
65
|
+
const r = await installSkillResult({ scope, yes: true, cwd });
|
|
66
|
+
if (r) {
|
|
67
|
+
process.stdout.write(` ✓ wrote ${r.files.length} files to ${r.target}${r.alreadyExisted ? " (overwrote existing)" : ""}\n`);
|
|
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`);
|
|
77
|
+
}
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Normalize user-friendly English inputs into the strict values the Deployik
|
|
2
|
+
// backend expects. Non-technical users say "prod", "live", "main site" — the
|
|
3
|
+
// AI relays those literally. Match them charitably here so a single tool call
|
|
4
|
+
// works without a clarifying round-trip.
|
|
5
|
+
const ENV_ALIASES = {
|
|
6
|
+
production: "production",
|
|
7
|
+
prod: "production",
|
|
8
|
+
live: "production",
|
|
9
|
+
"live site": "production",
|
|
10
|
+
"main site": "production",
|
|
11
|
+
main: "production",
|
|
12
|
+
release: "production",
|
|
13
|
+
public: "production",
|
|
14
|
+
preview: "preview",
|
|
15
|
+
prev: "preview",
|
|
16
|
+
staging: "preview",
|
|
17
|
+
stage: "preview",
|
|
18
|
+
dev: "preview",
|
|
19
|
+
development: "preview",
|
|
20
|
+
test: "preview",
|
|
21
|
+
testing: "preview",
|
|
22
|
+
draft: "preview",
|
|
23
|
+
};
|
|
24
|
+
const SCOPE_ALIASES = {
|
|
25
|
+
...ENV_ALIASES,
|
|
26
|
+
shared: "shared",
|
|
27
|
+
both: "shared",
|
|
28
|
+
all: "shared",
|
|
29
|
+
everywhere: "shared",
|
|
30
|
+
common: "shared",
|
|
31
|
+
global: "shared",
|
|
32
|
+
};
|
|
33
|
+
export function normalizeEnvironment(input) {
|
|
34
|
+
if (!input)
|
|
35
|
+
return undefined;
|
|
36
|
+
const key = input.toLowerCase().trim();
|
|
37
|
+
return ENV_ALIASES[key];
|
|
38
|
+
}
|
|
39
|
+
export function normalizeScope(input) {
|
|
40
|
+
if (!input)
|
|
41
|
+
return undefined;
|
|
42
|
+
const key = input.toLowerCase().trim();
|
|
43
|
+
return SCOPE_ALIASES[key];
|
|
44
|
+
}
|
|
45
|
+
/** When the AI passes a fuzzy environment we want to honor it; throw if no match. */
|
|
46
|
+
export function requireEnvironment(input) {
|
|
47
|
+
const normalized = normalizeEnvironment(input);
|
|
48
|
+
if (!normalized) {
|
|
49
|
+
throw new Error(`Unknown environment '${input}'. Use 'preview' (test / staging / dev) or 'production' (live / public).`);
|
|
50
|
+
}
|
|
51
|
+
return normalized;
|
|
52
|
+
}
|
|
53
|
+
export function requireScope(input) {
|
|
54
|
+
const normalized = normalizeScope(input);
|
|
55
|
+
if (!normalized) {
|
|
56
|
+
throw new Error(`Unknown scope '${input}'. Use 'shared' (both environments), 'preview' (test only), or 'production' (live only).`);
|
|
57
|
+
}
|
|
58
|
+
return normalized;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/lib/normalize.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,yCAAyC;AAKzC,MAAM,WAAW,GAAgC;IAC/C,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,YAAY;IACzB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,WAAW,EAAE,SAAS;IACtB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,MAAM,aAAa,GAAkC;IACnD,GAAG,WAAW;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,QAAQ;IACd,GAAG,EAAE,QAAQ;IACb,UAAU,EAAE,QAAQ;IACpB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAyB;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAyB;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,wBAAwB,KAAK,0EAA0E,CACxG,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,kBAAkB,KAAK,0FAA0F,CAClH,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/dist/resolve/project.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
|
-
import { readBinding } from "../config/binding.js";
|
|
2
|
+
import { readBinding, writeBinding } from "../config/binding.js";
|
|
3
3
|
import { readCache, writeCache, isCacheFresh } from "../config/cache.js";
|
|
4
4
|
export class ResolveError extends Error {
|
|
5
5
|
hint;
|
|
@@ -24,19 +24,39 @@ export async function resolveProject(ctx, input = {}) {
|
|
|
24
24
|
return { project: match, source: "slug" };
|
|
25
25
|
throw new ResolveError(`No project named '${input.project}' is visible to this token${input.workspace ? ` in workspace '${input.workspace}'` : ""}.`, "Call `list_projects` to see what this token can reach.");
|
|
26
26
|
}
|
|
27
|
-
// 3. binding file
|
|
28
|
-
const binding = readBinding(ctx.stateDir);
|
|
27
|
+
// 3. binding file (public .deployik.json or legacy .deployik/binding.json)
|
|
28
|
+
const binding = readBinding(ctx.stateDir, ctx.cwd);
|
|
29
29
|
if (binding?.project) {
|
|
30
30
|
const match = matchProjectByName(projects, binding.project, binding.workspace);
|
|
31
31
|
if (match)
|
|
32
32
|
return { project: match, source: "binding" };
|
|
33
33
|
}
|
|
34
|
-
// 4. git remote → cached project lookup
|
|
34
|
+
// 4. git remote → cached project lookup, AUTO-BIND if a single unambiguous match
|
|
35
35
|
const remote = readGitRemote(ctx.cwd);
|
|
36
36
|
if (remote) {
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
37
|
+
const matches = projects.filter((p) => p.github_owner.toLowerCase() === remote.owner.toLowerCase() && p.github_repo.toLowerCase() === remote.repo.toLowerCase());
|
|
38
|
+
if (matches.length === 1) {
|
|
39
|
+
const match = matches[0];
|
|
40
|
+
// Self-bind: write .deployik.json so the next call resolves via the
|
|
41
|
+
// binding (cheaper) and so teammates pulling this repo inherit the
|
|
42
|
+
// mapping. Best-effort — never block resolution.
|
|
43
|
+
try {
|
|
44
|
+
writeBinding(ctx.stateDir, ctx.cwd, {
|
|
45
|
+
project: match.name,
|
|
46
|
+
workspace: match.organization_name ?? match.organization_id,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// ignore — fall through to returning the match anyway
|
|
51
|
+
}
|
|
39
52
|
return { project: match, source: "git_remote" };
|
|
53
|
+
}
|
|
54
|
+
// Multiple repos share the same github_owner/github_repo (e.g. several
|
|
55
|
+
// projects deploying different apps from one monorepo) — too ambiguous to
|
|
56
|
+
// auto-bind, but still surface the candidates to help the AI/user.
|
|
57
|
+
if (matches.length > 1) {
|
|
58
|
+
throw new ResolveError(`This repo (${remote.owner}/${remote.repo}) maps to ${matches.length} Deployik projects: ${matches.map((m) => m.name).join(", ")}.`, "Pass `project: <slug>` to disambiguate, or run `init_in_repo` with the slug you want bound.");
|
|
59
|
+
}
|
|
40
60
|
}
|
|
41
61
|
// 5. single project visible
|
|
42
62
|
if (projects.length === 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/resolve/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/resolve/project.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -3,17 +3,18 @@ import { DeployikClient } from "./client/http.js";
|
|
|
3
3
|
import { loadEnv } from "./config/env.js";
|
|
4
4
|
import { registerKnowledgePrompts } from "./knowledge/prompts.js";
|
|
5
5
|
import { registerAllTools } from "./tools/index.js";
|
|
6
|
+
import { VERSION } from "./version.js";
|
|
6
7
|
export function buildServer(env = process.env, cwd = process.cwd()) {
|
|
7
8
|
const cfg = loadEnv(env, cwd);
|
|
8
9
|
const client = new DeployikClient({
|
|
9
10
|
baseUrl: cfg.baseUrl,
|
|
10
11
|
token: cfg.token,
|
|
11
12
|
timeoutMs: cfg.timeoutMs,
|
|
12
|
-
userAgent:
|
|
13
|
+
userAgent: `deployik-mcp/${VERSION}`,
|
|
13
14
|
});
|
|
14
15
|
const server = new McpServer({
|
|
15
16
|
name: "deployik",
|
|
16
|
-
version:
|
|
17
|
+
version: VERSION,
|
|
17
18
|
}, {
|
|
18
19
|
capabilities: {
|
|
19
20
|
tools: {},
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAOvC,MAAM,UAAU,WAAW,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,gBAAgB,OAAO,EAAE;KACrC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;SACZ;KACF,CACF,CAAC;IAEF,MAAM,GAAG,GAAgB;QACvB,MAAM;QACN,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC;IAEF,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE9B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACzB,CAAC"}
|
package/dist/tools/env.js
CHANGED
|
@@ -3,7 +3,8 @@ import { registerTool } from "./_helpers.js";
|
|
|
3
3
|
import { resolveProject } from "../resolve/project.js";
|
|
4
4
|
import { checkSafety } from "../lib/safety.js";
|
|
5
5
|
import { renderDryRun } from "../lib/format.js";
|
|
6
|
-
|
|
6
|
+
import { requireScope } from "../lib/normalize.js";
|
|
7
|
+
const SCOPE = z.string().describe("'shared' (both envs), 'preview' (test/staging/dev), or 'production' (live/prod). Aliases accepted.");
|
|
7
8
|
export function registerEnvTools(server, ctx) {
|
|
8
9
|
registerTool(server, ctx, {
|
|
9
10
|
name: "list_env_vars",
|
|
@@ -15,9 +16,10 @@ export function registerEnvTools(server, ctx) {
|
|
|
15
16
|
},
|
|
16
17
|
annotations: { readOnlyHint: true },
|
|
17
18
|
handler: async (args) => {
|
|
19
|
+
const environment = requireScope(args.environment);
|
|
18
20
|
const { project } = await resolveProject(ctx, args);
|
|
19
21
|
const vars = await ctx.client.request(`/projects/${project.id}/env`, {
|
|
20
|
-
query: { environment
|
|
22
|
+
query: { environment },
|
|
21
23
|
});
|
|
22
24
|
const text = vars.length === 0
|
|
23
25
|
? "(no env vars in this scope)"
|
|
@@ -36,12 +38,13 @@ export function registerEnvTools(server, ctx) {
|
|
|
36
38
|
value: z.string(),
|
|
37
39
|
},
|
|
38
40
|
handler: async (args) => {
|
|
41
|
+
const environment = requireScope(args.environment);
|
|
39
42
|
const { project } = await resolveProject(ctx, args);
|
|
40
43
|
await ctx.client.request(`/projects/${project.id}/env`, {
|
|
41
44
|
method: "POST",
|
|
42
|
-
body: { environment
|
|
45
|
+
body: { environment, key: args.key, value: args.value },
|
|
43
46
|
});
|
|
44
|
-
return { text: `Set ${args.key} in ${
|
|
47
|
+
return { text: `Set ${args.key} in ${environment} scope of ${project.name}.` };
|
|
45
48
|
},
|
|
46
49
|
});
|
|
47
50
|
registerTool(server, ctx, {
|
|
@@ -58,15 +61,16 @@ export function registerEnvTools(server, ctx) {
|
|
|
58
61
|
annotations: { destructiveHint: true },
|
|
59
62
|
audit: true,
|
|
60
63
|
handler: async (args) => {
|
|
64
|
+
const environment = requireScope(args.environment);
|
|
61
65
|
const { project } = await resolveProject(ctx, args);
|
|
62
|
-
const tier =
|
|
66
|
+
const tier = environment === "production" ? "destructive_production" : "destructive";
|
|
63
67
|
const safety = checkSafety({
|
|
64
68
|
toolName: "bulk_set_env_vars",
|
|
65
69
|
tier,
|
|
66
70
|
expectedName: project.name,
|
|
67
71
|
impact: {
|
|
68
72
|
project: project.name,
|
|
69
|
-
scope:
|
|
73
|
+
scope: environment,
|
|
70
74
|
replacing_with: args.variables.length,
|
|
71
75
|
note: "Existing keys not in this set will be DELETED.",
|
|
72
76
|
},
|
|
@@ -75,9 +79,9 @@ export function registerEnvTools(server, ctx) {
|
|
|
75
79
|
return { text: renderDryRun(safety.dryRun) };
|
|
76
80
|
const res = await ctx.client.request(`/projects/${project.id}/env`, {
|
|
77
81
|
method: "PUT",
|
|
78
|
-
body: { environment
|
|
82
|
+
body: { environment, variables: args.variables },
|
|
79
83
|
});
|
|
80
|
-
return { text: `Replaced ${
|
|
84
|
+
return { text: `Replaced ${environment} env vars on ${project.name} — now ${res.count} keys.` };
|
|
81
85
|
},
|
|
82
86
|
});
|
|
83
87
|
registerTool(server, ctx, {
|
|
@@ -94,21 +98,22 @@ export function registerEnvTools(server, ctx) {
|
|
|
94
98
|
annotations: { destructiveHint: true },
|
|
95
99
|
audit: true,
|
|
96
100
|
handler: async (args) => {
|
|
101
|
+
const environment = requireScope(args.environment);
|
|
97
102
|
const { project } = await resolveProject(ctx, args);
|
|
98
|
-
const tier =
|
|
103
|
+
const tier = environment === "production" ? "destructive_production" : "destructive";
|
|
99
104
|
const safety = checkSafety({
|
|
100
105
|
toolName: "delete_env_var",
|
|
101
106
|
tier,
|
|
102
107
|
expectedName: project.name,
|
|
103
|
-
impact: { project: project.name, scope:
|
|
108
|
+
impact: { project: project.name, scope: environment, key: args.key },
|
|
104
109
|
}, { confirm: args.confirm, confirm_name: args.confirm_name });
|
|
105
110
|
if (!safety.proceed)
|
|
106
111
|
return { text: renderDryRun(safety.dryRun) };
|
|
107
112
|
await ctx.client.request(`/projects/${project.id}/env/${encodeURIComponent(args.key)}`, {
|
|
108
113
|
method: "DELETE",
|
|
109
|
-
query: { environment
|
|
114
|
+
query: { environment },
|
|
110
115
|
});
|
|
111
|
-
return { text: `Deleted ${args.key} from ${
|
|
116
|
+
return { text: `Deleted ${args.key} from ${environment} scope of ${project.name}.` };
|
|
112
117
|
},
|
|
113
118
|
});
|
|
114
119
|
}
|
package/dist/tools/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/tools/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAoB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/tools/env.ts"],"names":[],"mappings":"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"}
|