@simplysf/simply-gitlab-mcp 0.7.3 → 0.7.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/docs/guides/mcp-server.md +4 -0
- package/lib/mcpClients/apply.js +35 -10
- package/lib/mcpClients/apply.js.map +1 -1
- package/lib/mcpClients/existingEntry.d.ts +10 -1
- package/lib/mcpClients/existingEntry.js +30 -18
- package/lib/mcpClients/existingEntry.js.map +1 -1
- package/lib/mcpClients/plan.d.ts +10 -0
- package/lib/mcpClients/plan.js +17 -2
- package/lib/mcpClients/plan.js.map +1 -1
- package/lib/mcpClients/types.d.ts +2 -1
- package/oclif.manifest.json +1 -1
- package/package.json +3 -3
|
@@ -85,6 +85,10 @@ Running it without `--client` lists them, and marks the ones found on this machi
|
|
|
85
85
|
- **Running it twice is safe.** An identical entry is left alone. An entry that differs is reported
|
|
86
86
|
as a conflict (exit 2) and is replaced only with `--force`. `--dry-run` shows what would be
|
|
87
87
|
written, and `--json` returns the per-client results.
|
|
88
|
+
- **Your own settings in an entry are kept.** The command owns only how the server is launched
|
|
89
|
+
(`command`, `args`, `type`). An `env` block you added, and settings such as Gemini's `trust` or
|
|
90
|
+
`timeout`, survive a `--force` replace, and an entry that differs only in them counts as
|
|
91
|
+
identical. Previews show `env` names with their values as `<kept>`.
|
|
88
92
|
|
|
89
93
|
Restart Claude Desktop or Windsurf afterwards. In Claude Code or Gemini CLI, run `/mcp`. The
|
|
90
94
|
sections below show what the command writes, for editing by hand or for any other client.
|
package/lib/mcpClients/apply.js
CHANGED
|
@@ -20,6 +20,7 @@ import { parse, printParseErrorCode } from 'jsonc-parser';
|
|
|
20
20
|
import { CLIENTS } from './clients.js';
|
|
21
21
|
import { compareClaudeEntry, compareCodexEntry } from './existingEntry.js';
|
|
22
22
|
import { setNestedEntry } from './jsonEdit.js';
|
|
23
|
+
import { cliAddArgs } from './plan.js';
|
|
23
24
|
import { formatCommandLine, runProcess } from './runner.js';
|
|
24
25
|
/**
|
|
25
26
|
* Carries out a plan: edits the file or runs the client's CLI. Every failure becomes a `failed`
|
|
@@ -48,8 +49,15 @@ export async function applyPlan(plan, options = {}) {
|
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* The keys that say how a client starts or reaches the server. They are the installer's to write;
|
|
54
|
+
* every other key in an existing entry (`env` above all, but also settings such as Gemini's `trust`
|
|
55
|
+
* or `timeout`) belongs to the user and survives a replace.
|
|
56
|
+
*/
|
|
57
|
+
const LAUNCH_KEYS = new Set(['type', 'command', 'args', 'url', 'httpUrl', 'serverUrl']);
|
|
51
58
|
async function applyFilePlan(plan, options) {
|
|
52
59
|
const dryRun = Boolean(options.dryRun);
|
|
60
|
+
let entry = plan.entry;
|
|
53
61
|
const result = (outcome, exitCode, message) => ({
|
|
54
62
|
client: plan.client,
|
|
55
63
|
name: plan.name,
|
|
@@ -58,15 +66,19 @@ async function applyFilePlan(plan, options) {
|
|
|
58
66
|
dryRun,
|
|
59
67
|
exitCode,
|
|
60
68
|
message,
|
|
61
|
-
preview: JSON.stringify({ [plan.key]: { [plan.name]:
|
|
69
|
+
preview: JSON.stringify({ [plan.key]: { [plan.name]: redactEnv(entry) } }, null, 2),
|
|
62
70
|
});
|
|
63
71
|
const config = await readConfigFile(plan);
|
|
64
72
|
if ('failure' in config)
|
|
65
73
|
return result('failed', config.exitCode, config.failure);
|
|
66
74
|
const { text, servers } = config;
|
|
67
75
|
const existing = servers?.[plan.name];
|
|
76
|
+
if (isRecord(existing)) {
|
|
77
|
+
const kept = Object.entries(existing).filter(([key]) => !LAUNCH_KEYS.has(key));
|
|
78
|
+
entry = { ...plan.entry, ...Object.fromEntries(kept) };
|
|
79
|
+
}
|
|
68
80
|
if (existing !== undefined) {
|
|
69
|
-
if (isDeepStrictEqual(existing,
|
|
81
|
+
if (isDeepStrictEqual(existing, entry))
|
|
70
82
|
return result('unchanged', 0);
|
|
71
83
|
if (!options.force)
|
|
72
84
|
return result('conflict', 2, conflictMessage(plan.name, plan.file));
|
|
@@ -75,7 +87,7 @@ async function applyFilePlan(plan, options) {
|
|
|
75
87
|
if (dryRun)
|
|
76
88
|
return result(outcome, 0);
|
|
77
89
|
try {
|
|
78
|
-
const updated = setNestedEntry(text ?? '', plan.key, plan.name,
|
|
90
|
+
const updated = setNestedEntry(text ?? '', plan.key, plan.name, entry);
|
|
79
91
|
await fs.mkdir(path.dirname(plan.file), { recursive: true });
|
|
80
92
|
if (text !== undefined)
|
|
81
93
|
await fs.copyFile(plan.file, `${plan.file}.bak`);
|
|
@@ -122,7 +134,7 @@ async function readConfigFile(plan) {
|
|
|
122
134
|
}
|
|
123
135
|
async function applyCliPlan(plan, options) {
|
|
124
136
|
const dryRun = Boolean(options.dryRun);
|
|
125
|
-
|
|
137
|
+
let addCommand = formatCommandLine(plan.executable, plan.addArgs);
|
|
126
138
|
const removeCommand = formatCommandLine(plan.executable, plan.removeArgs);
|
|
127
139
|
const result = (outcome, exitCode, message, target = addCommand) => ({
|
|
128
140
|
client: plan.client,
|
|
@@ -135,13 +147,17 @@ async function applyCliPlan(plan, options) {
|
|
|
135
147
|
preview: addCommand,
|
|
136
148
|
});
|
|
137
149
|
const existing = await readExistingCliEntry(plan);
|
|
138
|
-
if (existing === 'same')
|
|
150
|
+
if (existing.status === 'same')
|
|
139
151
|
return result('unchanged', 0);
|
|
140
|
-
if (existing === 'differs' && !options.force)
|
|
152
|
+
if (existing.status === 'differs' && !options.force)
|
|
141
153
|
return result('conflict', 2, conflictMessage(plan.name, plan.configFile));
|
|
142
|
-
|
|
143
|
-
const
|
|
144
|
-
const
|
|
154
|
+
// A replace carries the existing entry's `env` into the new one; only its names are ever shown.
|
|
155
|
+
const env = existing.status === 'absent' ? {} : existing.env;
|
|
156
|
+
const addArgs = cliAddArgs(plan.executable, plan.name, plan.launch, env);
|
|
157
|
+
addCommand = formatCommandLine(plan.executable, cliAddArgs(plan.executable, plan.name, plan.launch, redact(env)));
|
|
158
|
+
const outcome = existing.status === 'absent' ? 'added' : 'replaced';
|
|
159
|
+
const commands = existing.status === 'absent' ? [addArgs] : [plan.removeArgs, addArgs];
|
|
160
|
+
const target = existing.status === 'absent' ? addCommand : `${removeCommand} && ${addCommand}`;
|
|
145
161
|
if (dryRun)
|
|
146
162
|
return result(outcome, 0, undefined, target);
|
|
147
163
|
const run = options.runner ?? runProcess;
|
|
@@ -171,7 +187,7 @@ async function readExistingCliEntry(plan) {
|
|
|
171
187
|
}
|
|
172
188
|
catch {
|
|
173
189
|
// No file means no entry; any other read problem is the client's to report when it runs.
|
|
174
|
-
return 'absent';
|
|
190
|
+
return { status: 'absent' };
|
|
175
191
|
}
|
|
176
192
|
return plan.configFormat === 'claude-json'
|
|
177
193
|
? compareClaudeEntry(text, plan.name, plan.launch)
|
|
@@ -189,6 +205,15 @@ async function writeAtomically(file, contents) {
|
|
|
189
205
|
throw error;
|
|
190
206
|
}
|
|
191
207
|
}
|
|
208
|
+
/** An `env` value as previews show it: credentials live there, and previews reach stdout and `--json`. */
|
|
209
|
+
const REDACTED = '<kept>';
|
|
210
|
+
function redact(env) {
|
|
211
|
+
return Object.fromEntries(Object.keys(env).map((key) => [key, REDACTED]));
|
|
212
|
+
}
|
|
213
|
+
/** @returns `entry` with each `env` value replaced, for display. */
|
|
214
|
+
function redactEnv(entry) {
|
|
215
|
+
return isRecord(entry.env) ? { ...entry, env: redact(entry.env) } : entry;
|
|
216
|
+
}
|
|
192
217
|
function conflictMessage(name, file) {
|
|
193
218
|
return `An entry named "${name}" already exists in ${file} and is different. Re-run with --force to replace it.`;
|
|
194
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/mcpClients/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAmB,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU5D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAiB,EAAE,UAAwB,EAAE;IAC3E,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,KAAK,KAAK;YACR,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,KAAK,aAAa;YAChB,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW;gBACxC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC/B,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,OAAO,EAAE,EAAE;aACZ,CAAC;IACN,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAqB,EAAE,OAAqB;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,CAAC,OAAuB,EAAE,QAAmB,EAAE,OAAgB,EAAiB,EAAE,CAAC,CAAC;QACjG,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO;QACP,MAAM,EAAE,IAAI,CAAC,IAAI;QACjB,MAAM;QACN,QAAQ;QACR,OAAO;QACP,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/mcpClients/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,17 @@
|
|
|
3
3
|
* (`~/.claude.json`, `config.toml`). `differs` covers anything that isn't provably the same launch,
|
|
4
4
|
* including an entry this reader can't make sense of: `--force` is then the way through, which is
|
|
5
5
|
* the safe direction to be wrong in.
|
|
6
|
+
*
|
|
7
|
+
* `env` is the entry's environment, which the user put there and a replace carries over: it is how
|
|
8
|
+
* a client hands the server its connection settings, so an entry that differs only in `env` is
|
|
9
|
+
* still the same launch.
|
|
6
10
|
*/
|
|
7
|
-
export type ExistingEntry =
|
|
11
|
+
export type ExistingEntry = {
|
|
12
|
+
status: 'absent';
|
|
13
|
+
} | {
|
|
14
|
+
status: 'same' | 'differs';
|
|
15
|
+
env: Record<string, string>;
|
|
16
|
+
};
|
|
8
17
|
type Launch = {
|
|
9
18
|
command: string;
|
|
10
19
|
args: readonly string[];
|
|
@@ -15,53 +15,65 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { isDeepStrictEqual } from 'node:util';
|
|
17
17
|
import { parse } from 'jsonc-parser';
|
|
18
|
+
const ABSENT = { status: 'absent' };
|
|
18
19
|
/** @returns How `launch` compares with the user-scope `mcpServers` entry in Claude Code's `~/.claude.json`. */
|
|
19
20
|
export function compareClaudeEntry(text, name, launch) {
|
|
20
21
|
const errors = [];
|
|
21
22
|
const root = parse(text, errors, { allowTrailingComma: true });
|
|
22
23
|
// An unreadable file can't show an entry; `claude` itself reports whatever is wrong with it.
|
|
23
24
|
if (errors.length > 0 || !isRecord(root) || !isRecord(root.mcpServers))
|
|
24
|
-
return
|
|
25
|
+
return ABSENT;
|
|
25
26
|
const entry = root.mcpServers[name];
|
|
26
27
|
if (entry === undefined)
|
|
27
|
-
return
|
|
28
|
+
return ABSENT;
|
|
28
29
|
if (!isRecord(entry))
|
|
29
|
-
return 'differs';
|
|
30
|
+
return { status: 'differs', env: {} };
|
|
30
31
|
const { type = 'stdio', command, args = [], env = {}, ...rest } = entry;
|
|
31
32
|
const same = type === 'stdio' &&
|
|
32
33
|
command === launch.command &&
|
|
33
34
|
isDeepStrictEqual(args, launch.args) &&
|
|
34
|
-
|
|
35
|
+
isStringRecord(env) &&
|
|
35
36
|
Object.keys(rest).length === 0;
|
|
36
|
-
return same ? 'same' : 'differs';
|
|
37
|
+
return { status: same ? 'same' : 'differs', env: isStringRecord(env) ? env : {} };
|
|
37
38
|
}
|
|
38
39
|
/** @returns How `launch` compares with the `[mcp_servers.<name>]` table in Codex's `config.toml`. */
|
|
39
40
|
export function compareCodexEntry(text, name, launch) {
|
|
40
41
|
const lines = text.split(/\r?\n/);
|
|
41
42
|
const header = lines.findIndex((line) => tableName(line) === `mcp_servers.${name}`);
|
|
42
43
|
if (header === -1)
|
|
43
|
-
return
|
|
44
|
+
return ABSENT;
|
|
45
|
+
const envTable = `mcp_servers.${name}.env`;
|
|
46
|
+
const envHeader = lines.findIndex((line) => tableName(line) === envTable);
|
|
47
|
+
const envValues = envHeader === -1 ? {} : parseKeyValues(tableBody(lines, envHeader));
|
|
48
|
+
const env = envValues && isStringRecord(envValues) ? envValues : undefined;
|
|
49
|
+
// Any other sub-table, such as `[mcp_servers.<name>.tools]`, is more than a bare launch.
|
|
50
|
+
const otherSubTable = lines.some((line) => {
|
|
51
|
+
const table = tableName(line);
|
|
52
|
+
return table !== undefined && table.startsWith(`mcp_servers.${name}.`) && table !== envTable;
|
|
53
|
+
});
|
|
54
|
+
const values = parseKeyValues(tableBody(lines, header));
|
|
55
|
+
if (!values || !env || otherSubTable)
|
|
56
|
+
return { status: 'differs', env: env ?? {} };
|
|
57
|
+
const { command, args = [], ...rest } = values;
|
|
58
|
+
const same = command === launch.command && isDeepStrictEqual(args, launch.args) && Object.keys(rest).length === 0;
|
|
59
|
+
return { status: same ? 'same' : 'differs', env };
|
|
60
|
+
}
|
|
61
|
+
/** @returns The text between the `[table]` header at `header` and the next header. */
|
|
62
|
+
function tableBody(lines, header) {
|
|
44
63
|
const body = [];
|
|
45
64
|
for (const line of lines.slice(header + 1)) {
|
|
46
|
-
|
|
47
|
-
if (table !== undefined) {
|
|
48
|
-
// A sub-table such as `[mcp_servers.<name>.env]` is more than a bare launch.
|
|
49
|
-
if (table.startsWith(`mcp_servers.${name}.`))
|
|
50
|
-
return 'differs';
|
|
65
|
+
if (tableName(line) !== undefined)
|
|
51
66
|
break;
|
|
52
|
-
}
|
|
53
67
|
body.push(line);
|
|
54
68
|
}
|
|
55
|
-
|
|
56
|
-
if (!values)
|
|
57
|
-
return 'differs';
|
|
58
|
-
const { command, args = [], ...rest } = values;
|
|
59
|
-
const same = command === launch.command && isDeepStrictEqual(args, launch.args) && Object.keys(rest).length === 0;
|
|
60
|
-
return same ? 'same' : 'differs';
|
|
69
|
+
return body.join('\n');
|
|
61
70
|
}
|
|
62
71
|
function isRecord(value) {
|
|
63
72
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
64
73
|
}
|
|
74
|
+
function isStringRecord(value) {
|
|
75
|
+
return isRecord(value) && Object.values(value).every((item) => typeof item === 'string');
|
|
76
|
+
}
|
|
65
77
|
/** @returns The dotted name of a `[table]` header line, with quoted keys unquoted, or undefined. */
|
|
66
78
|
function tableName(line) {
|
|
67
79
|
const match = /^\s*\[([^[\]]+)\]\s*(#.*)?$/.exec(line);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"existingEntry.js","sourceRoot":"","sources":["../../src/mcpClients/existingEntry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAmB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"existingEntry.js","sourceRoot":"","sources":["../../src/mcpClients/existingEntry.ts"],"names":[],"mappings":"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"}
|
package/lib/mcpClients/plan.d.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import type { ClientId, InstallEnvironment, InstallPlan, InstallScope, ServerSpec } from './types.js';
|
|
2
2
|
/** @returns Whether every client accepts `name` as an entry name. */
|
|
3
3
|
export declare function isValidServerName(name: string): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* The arguments that add an entry through a client's own CLI. `env` is an existing entry's
|
|
6
|
+
* environment being carried over a replace; a new entry never has one.
|
|
7
|
+
*
|
|
8
|
+
* @returns The argv after the executable.
|
|
9
|
+
*/
|
|
10
|
+
export declare function cliAddArgs(executable: 'claude' | 'codex', name: string, launch: {
|
|
11
|
+
command: string;
|
|
12
|
+
args: readonly string[];
|
|
13
|
+
}, env?: Readonly<Record<string, string>>): string[];
|
|
4
14
|
/**
|
|
5
15
|
* Works out what installing `spec` into one client means: which file, or which CLI command. Reads
|
|
6
16
|
* nothing and writes nothing; `applyPlan` does the rest.
|
package/lib/mcpClients/plan.js
CHANGED
|
@@ -20,6 +20,21 @@ const SERVER_NAME = /^[A-Za-z0-9_-]+$/;
|
|
|
20
20
|
export function isValidServerName(name) {
|
|
21
21
|
return SERVER_NAME.test(name);
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* The arguments that add an entry through a client's own CLI. `env` is an existing entry's
|
|
25
|
+
* environment being carried over a replace; a new entry never has one.
|
|
26
|
+
*
|
|
27
|
+
* @returns The argv after the executable.
|
|
28
|
+
*/
|
|
29
|
+
export function cliAddArgs(executable, name, launch, env = {}) {
|
|
30
|
+
const hasEnv = Object.keys(env).length > 0;
|
|
31
|
+
if (executable === 'claude') {
|
|
32
|
+
const entry = { type: 'stdio', command: launch.command, args: [...launch.args], ...(hasEnv ? { env } : {}) };
|
|
33
|
+
return ['mcp', 'add-json', name, JSON.stringify(entry), '--scope', 'user'];
|
|
34
|
+
}
|
|
35
|
+
const envArgs = Object.entries(env).flatMap(([key, value]) => ['--env', `${key}=${value}`]);
|
|
36
|
+
return ['mcp', 'add', name, ...envArgs, '--', launch.command, ...launch.args];
|
|
37
|
+
}
|
|
23
38
|
/**
|
|
24
39
|
* Works out what installing `spec` into one client means: which file, or which CLI command. Reads
|
|
25
40
|
* nothing and writes nothing; `applyPlan` does the rest.
|
|
@@ -65,7 +80,7 @@ export function planInstall(spec, client, scope, environment) {
|
|
|
65
80
|
...base,
|
|
66
81
|
kind: 'cli',
|
|
67
82
|
executable: 'claude',
|
|
68
|
-
addArgs:
|
|
83
|
+
addArgs: cliAddArgs('claude', spec.name, launch),
|
|
69
84
|
removeArgs: ['mcp', 'remove', spec.name, '--scope', 'user'],
|
|
70
85
|
launch,
|
|
71
86
|
configFile: location.configFile,
|
|
@@ -76,7 +91,7 @@ export function planInstall(spec, client, scope, environment) {
|
|
|
76
91
|
...base,
|
|
77
92
|
kind: 'cli',
|
|
78
93
|
executable: 'codex',
|
|
79
|
-
addArgs:
|
|
94
|
+
addArgs: cliAddArgs('codex', spec.name, launch),
|
|
80
95
|
removeArgs: ['mcp', 'remove', spec.name],
|
|
81
96
|
launch,
|
|
82
97
|
configFile: location.configFile,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/mcpClients/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGhD,qGAAqG;AACrG,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAEvC,qEAAqE;AACrE,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACzB,IAAgB,EAChB,MAAgB,EAChB,KAAmB,EACnB,WAA+B;IAE/B,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,sEAAsE;SAC5F,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAE/D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,wDAAwD;aAC1F,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;QAChD,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC;YACzD,GAAG;YACH,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;SACrD,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtB,IAAI,QAAQ,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,KAAK;gBACX,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/mcpClients/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,7 +45,8 @@ export type CliInstallPlan = {
|
|
|
45
45
|
client: ClientId;
|
|
46
46
|
scope: InstallScope;
|
|
47
47
|
name: string;
|
|
48
|
-
executable:
|
|
48
|
+
executable: 'claude' | 'codex';
|
|
49
|
+
/** Adds the entry with no `env`; a replace rebuilds this with the existing entry's. */
|
|
49
50
|
addArgs: string[];
|
|
50
51
|
removeArgs: string[];
|
|
51
52
|
/** What the entry launches, compared with what is already configured. */
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysf/simply-gitlab-mcp",
|
|
3
3
|
"description": "Model Context Protocol server exposing GitLab to AI agents, built on @simplysf/simply-gitlab-core",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.5",
|
|
5
5
|
"author": "@ClayChipps",
|
|
6
6
|
"homepage": "https://github.com/SimplySF/simply-gitlab",
|
|
7
7
|
"bugs": "https://github.com/SimplySF/simply-gitlab/issues",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
38
38
|
"@oclif/core": "^4.11.2",
|
|
39
|
-
"@simplysf/simply-gitlab-core": "^0.
|
|
39
|
+
"@simplysf/simply-gitlab-core": "^0.6.0",
|
|
40
40
|
"cross-spawn": "^7.0.6",
|
|
41
41
|
"jsonc-parser": "^3.3.1",
|
|
42
42
|
"zod": "^4.6.7"
|
|
@@ -187,5 +187,5 @@
|
|
|
187
187
|
}
|
|
188
188
|
}
|
|
189
189
|
},
|
|
190
|
-
"gitHead": "
|
|
190
|
+
"gitHead": "4bcb59a3a8f17ef92426e5f0cf7f7a9a30da23c8"
|
|
191
191
|
}
|