@mintlify/cli 4.0.1761 → 4.0.1763
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 +18 -0
- package/__test__/agent-deployment.test.ts +11 -0
- package/__test__/agent-setup-config.test.ts +314 -0
- package/__test__/agent-setup.test.ts +207 -0
- package/bin/agent-deployment.js +1 -1
- package/bin/agent-setup-config.js +141 -0
- package/bin/agent-setup.js +146 -0
- package/bin/cli.js +30 -0
- package/bin/tsconfig.build.tsbuildinfo +1 -1
- package/bin/welcome.js +1 -0
- package/package.json +4 -2
- package/src/agent-deployment.ts +1 -1
- package/src/agent-setup-config.ts +144 -0
- package/src/agent-setup.ts +165 -0
- package/src/cli.tsx +44 -0
- package/src/welcome.ts +1 -0
package/bin/welcome.js
CHANGED
|
@@ -44,6 +44,7 @@ const GROUPS = [
|
|
|
44
44
|
{
|
|
45
45
|
title: 'CLI',
|
|
46
46
|
commands: [
|
|
47
|
+
{ name: 'agent setup', description: 'Install Mintlify skills and configure Admin MCP' },
|
|
47
48
|
{ name: 'config', description: 'Manage CLI configuration' },
|
|
48
49
|
{ name: 'update', description: 'Update to the latest version' },
|
|
49
50
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mintlify/cli",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.1763",
|
|
4
4
|
"description": "The Mintlify CLI",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=18.0.0"
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"ink": "6.3.0",
|
|
62
62
|
"inquirer": "12.3.0",
|
|
63
63
|
"js-yaml": "4.3.1",
|
|
64
|
+
"jsonc-parser": "3.3.1",
|
|
64
65
|
"katex": "0.16.47",
|
|
65
66
|
"mdast-util-mdx-jsx": "3.2.0",
|
|
66
67
|
"open": "8.4.2",
|
|
@@ -75,6 +76,7 @@
|
|
|
75
76
|
"remark-mdx": "3.1.1",
|
|
76
77
|
"remark-smartypants": "3.0.2",
|
|
77
78
|
"remark-stringify": "11.0.0",
|
|
79
|
+
"smol-toml": "1.6.0",
|
|
78
80
|
"unified": "11.0.5",
|
|
79
81
|
"unist-util-visit": "5.0.0",
|
|
80
82
|
"yaml": "2.8.3",
|
|
@@ -104,5 +106,5 @@
|
|
|
104
106
|
"vitest": "2.1.9",
|
|
105
107
|
"vitest-mock-process": "1.0.4"
|
|
106
108
|
},
|
|
107
|
-
"gitHead": "
|
|
109
|
+
"gitHead": "d6eeac40a96827ff665321df5a7d42af749f575d"
|
|
108
110
|
}
|
package/src/agent-deployment.ts
CHANGED
|
@@ -21,7 +21,7 @@ const existingSchema = z.discriminatedUnion('status', [
|
|
|
21
21
|
}),
|
|
22
22
|
z.object({
|
|
23
23
|
status: z.literal('expired'),
|
|
24
|
-
code: z.
|
|
24
|
+
code: z.enum(['deployment_already_exists', 'deployment_claim_expired']),
|
|
25
25
|
deploymentId: z.string(),
|
|
26
26
|
subdomain: z.string(),
|
|
27
27
|
expiresAt: z.iso.datetime().optional(),
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { applyEdits, modify, parse, type ParseError } from 'jsonc-parser';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { parse as parseToml } from 'smol-toml';
|
|
6
|
+
|
|
7
|
+
export type SetupAgent = 'claude-code' | 'codex' | 'cursor';
|
|
8
|
+
|
|
9
|
+
export const ADMIN_MCP_NAME = 'mintlify-admin';
|
|
10
|
+
export const ADMIN_MCP_URL = 'https://mcp.mintlify.com';
|
|
11
|
+
|
|
12
|
+
type ConfigLocation = {
|
|
13
|
+
cwd: string;
|
|
14
|
+
homeDir: string;
|
|
15
|
+
global: boolean;
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
type McpConfigPlan = {
|
|
20
|
+
path: string;
|
|
21
|
+
original: string | undefined;
|
|
22
|
+
contents: string | undefined;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
26
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function readConfig(file: string): Promise<string | undefined> {
|
|
30
|
+
try {
|
|
31
|
+
return await fs.readFile(file, 'utf8');
|
|
32
|
+
} catch (error) {
|
|
33
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return undefined;
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function configPath(agent: SetupAgent, options: ConfigLocation): string {
|
|
39
|
+
const env = options.env ?? process.env;
|
|
40
|
+
if (agent === 'codex') {
|
|
41
|
+
let directory = path.join(options.cwd, '.codex');
|
|
42
|
+
if (options.global) directory = env.CODEX_HOME || path.join(options.homeDir, '.codex');
|
|
43
|
+
return path.join(directory, 'config.toml');
|
|
44
|
+
}
|
|
45
|
+
if (agent === 'cursor') {
|
|
46
|
+
const directory = options.global ? options.homeDir : options.cwd;
|
|
47
|
+
return path.join(directory, '.cursor', 'mcp.json');
|
|
48
|
+
}
|
|
49
|
+
if (options.global) {
|
|
50
|
+
if (env.CLAUDE_CONFIG_DIR) {
|
|
51
|
+
throw new Error(
|
|
52
|
+
'CLAUDE_CONFIG_DIR is set. Configure Claude Code with: claude mcp add --scope user --transport http mintlify-admin https://mcp.mintlify.com'
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
return path.join(options.homeDir, '.claude.json');
|
|
56
|
+
}
|
|
57
|
+
return path.join(options.cwd, '.mcp.json');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function prepareMcpConfig(
|
|
61
|
+
agent: SetupAgent,
|
|
62
|
+
options: ConfigLocation
|
|
63
|
+
): Promise<McpConfigPlan> {
|
|
64
|
+
const requestedPath = configPath(agent, options);
|
|
65
|
+
const file = await fs.realpath(requestedPath).catch((error: unknown) => {
|
|
66
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return requestedPath;
|
|
67
|
+
throw error;
|
|
68
|
+
});
|
|
69
|
+
const original = await readConfig(file);
|
|
70
|
+
const source = original ?? '';
|
|
71
|
+
const key = agent === 'codex' ? 'mcp_servers' : 'mcpServers';
|
|
72
|
+
let config: unknown;
|
|
73
|
+
try {
|
|
74
|
+
if (agent === 'codex') {
|
|
75
|
+
config = parseToml(source);
|
|
76
|
+
} else {
|
|
77
|
+
const errors: ParseError[] = [];
|
|
78
|
+
config = parse(source || '{}', errors, { allowTrailingComma: true });
|
|
79
|
+
if (errors.length > 0) throw new Error('Invalid JSON');
|
|
80
|
+
}
|
|
81
|
+
} catch {
|
|
82
|
+
throw new Error(`Cannot parse ${file}. Fix its configuration before running setup.`);
|
|
83
|
+
}
|
|
84
|
+
if (!isRecord(config)) throw new Error(`Expected an object in ${file}.`);
|
|
85
|
+
const servers = config[key];
|
|
86
|
+
if (servers !== undefined && !isRecord(servers)) {
|
|
87
|
+
throw new Error(`Expected ${key} to be an object in ${file}.`);
|
|
88
|
+
}
|
|
89
|
+
const existing = servers?.[ADMIN_MCP_NAME];
|
|
90
|
+
if (existing !== undefined) {
|
|
91
|
+
if (!isRecord(existing) || existing.url !== ADMIN_MCP_URL || existing.command !== undefined) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`${ADMIN_MCP_NAME} already has a different configuration in ${file}. Rename or remove that entry before running setup.`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
if (agent === 'claude-code' && existing.type !== 'http') {
|
|
97
|
+
throw new Error(`Set type to "http" for ${ADMIN_MCP_NAME} in ${file} before running setup.`);
|
|
98
|
+
}
|
|
99
|
+
return { path: file, original, contents: undefined };
|
|
100
|
+
}
|
|
101
|
+
const newline = source.includes('\r\n') ? '\r\n' : '\n';
|
|
102
|
+
let contents: string;
|
|
103
|
+
if (agent === 'codex') {
|
|
104
|
+
contents = `${source}${newline}[mcp_servers.${ADMIN_MCP_NAME}]${newline}url = "${ADMIN_MCP_URL}"${newline}`;
|
|
105
|
+
try {
|
|
106
|
+
parseToml(contents);
|
|
107
|
+
} catch {
|
|
108
|
+
throw new Error(
|
|
109
|
+
`Cannot safely extend ${file}. Add [mcp_servers.${ADMIN_MCP_NAME}] with url = "${ADMIN_MCP_URL}" manually.`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
const server: Record<string, string> = { url: ADMIN_MCP_URL };
|
|
114
|
+
if (agent === 'claude-code') server.type = 'http';
|
|
115
|
+
contents = applyEdits(
|
|
116
|
+
source || '{}',
|
|
117
|
+
modify(source || '{}', [key, ADMIN_MCP_NAME], server, {
|
|
118
|
+
formattingOptions: { insertSpaces: true, tabSize: 2, eol: newline },
|
|
119
|
+
})
|
|
120
|
+
);
|
|
121
|
+
if (!contents.endsWith(newline)) contents += newline;
|
|
122
|
+
}
|
|
123
|
+
return { path: file, original, contents };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export async function writeMcpConfig(plan: McpConfigPlan): Promise<void> {
|
|
127
|
+
if ((await readConfig(plan.path)) !== plan.original) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`${plan.path} changed during setup. Run setup again to preserve those changes.`
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
if (plan.contents === undefined) return;
|
|
133
|
+
await fs.mkdir(path.dirname(plan.path), { recursive: true, mode: 0o700 });
|
|
134
|
+
let mode = 0o600;
|
|
135
|
+
if (plan.original !== undefined) mode = (await fs.stat(plan.path)).mode;
|
|
136
|
+
const temporaryPath = `${plan.path}.${randomUUID()}.tmp`;
|
|
137
|
+
try {
|
|
138
|
+
await fs.writeFile(temporaryPath, plan.contents, { mode, flag: 'wx' });
|
|
139
|
+
if (plan.original !== undefined) await fs.chmod(temporaryPath, mode);
|
|
140
|
+
await fs.rename(temporaryPath, plan.path);
|
|
141
|
+
} finally {
|
|
142
|
+
await fs.rm(temporaryPath, { force: true });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { checkbox } from '@inquirer/prompts';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { stripVTControlCharacters } from 'node:util';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
ADMIN_MCP_NAME,
|
|
10
|
+
ADMIN_MCP_URL,
|
|
11
|
+
prepareMcpConfig,
|
|
12
|
+
writeMcpConfig,
|
|
13
|
+
type SetupAgent,
|
|
14
|
+
} from './agent-setup-config.js';
|
|
15
|
+
import { detectAgent } from './agent.js';
|
|
16
|
+
|
|
17
|
+
export const SETUP_AGENTS: SetupAgent[] = ['claude-code', 'codex', 'cursor'];
|
|
18
|
+
|
|
19
|
+
const AGENT_LABELS: Record<SetupAgent, string> = {
|
|
20
|
+
'claude-code': 'Claude Code',
|
|
21
|
+
codex: 'Codex',
|
|
22
|
+
cursor: 'Cursor',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
type SetupOptions = {
|
|
26
|
+
agents?: string[];
|
|
27
|
+
global: boolean;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
function isSetupAgent(value: string): value is SetupAgent {
|
|
31
|
+
return SETUP_AGENTS.some((agent) => agent === value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function detectedAgents(): SetupAgent[] {
|
|
35
|
+
const homeDir = os.homedir();
|
|
36
|
+
const current = detectAgent();
|
|
37
|
+
return SETUP_AGENTS.filter((agent) => {
|
|
38
|
+
if (agent === 'codex') {
|
|
39
|
+
return (
|
|
40
|
+
current === 'codex_cli' ||
|
|
41
|
+
existsSync(process.env.CODEX_HOME || path.join(homeDir, '.codex'))
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
if (agent === 'claude-code') {
|
|
45
|
+
return (
|
|
46
|
+
current === 'claude_code' ||
|
|
47
|
+
existsSync(process.env.CLAUDE_CONFIG_DIR || path.join(homeDir, '.claude'))
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return (
|
|
51
|
+
current === 'cursor' || current === 'cursor-cli' || existsSync(path.join(homeDir, '.cursor'))
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function installSkills(agents: SetupAgent[], global: boolean): Promise<void> {
|
|
57
|
+
const args = [
|
|
58
|
+
'--yes',
|
|
59
|
+
'skills@1.7.4',
|
|
60
|
+
'add',
|
|
61
|
+
'https://mintlify.com/docs',
|
|
62
|
+
'--agent',
|
|
63
|
+
...agents,
|
|
64
|
+
'--yes',
|
|
65
|
+
];
|
|
66
|
+
if (global) args.push('--global');
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const child = spawn('npx', args, {
|
|
69
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
70
|
+
shell: process.platform === 'win32',
|
|
71
|
+
});
|
|
72
|
+
let output = '';
|
|
73
|
+
const recordOutput = (chunk: Buffer) => {
|
|
74
|
+
output = (output + chunk.toString()).slice(-65_536);
|
|
75
|
+
};
|
|
76
|
+
child.stdout.on('data', (chunk: Buffer) => {
|
|
77
|
+
recordOutput(chunk);
|
|
78
|
+
process.stdout.write(chunk.toString());
|
|
79
|
+
});
|
|
80
|
+
child.stderr.on('data', (chunk: Buffer) => {
|
|
81
|
+
recordOutput(chunk);
|
|
82
|
+
process.stderr.write(chunk.toString());
|
|
83
|
+
});
|
|
84
|
+
child.on('error', () =>
|
|
85
|
+
reject(new Error('Could not run npx. Install npm and run setup again.'))
|
|
86
|
+
);
|
|
87
|
+
child.on('close', (code, signal) => {
|
|
88
|
+
if (code !== 0 || /Failed to install\s+\d+/.test(stripVTControlCharacters(output))) {
|
|
89
|
+
reject(
|
|
90
|
+
new Error(
|
|
91
|
+
`Skills installation failed (${signal ?? code}). Review the installer output and run setup again.`
|
|
92
|
+
)
|
|
93
|
+
);
|
|
94
|
+
} else {
|
|
95
|
+
resolve();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export async function setupAgent(options: SetupOptions): Promise<void> {
|
|
102
|
+
const [major = 0, minor = 0] = process.versions.node.split('.').map(Number);
|
|
103
|
+
if (major < 22 || (major === 22 && minor < 20)) {
|
|
104
|
+
throw new Error(
|
|
105
|
+
'mint agent setup requires Node.js 22.20 or later to install skills. Upgrade Node.js and try again.'
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
109
|
+
let agents: SetupAgent[] = [];
|
|
110
|
+
for (const agent of options.agents ?? []) {
|
|
111
|
+
if (!isSetupAgent(agent)) throw new Error(`Unsupported agent: ${agent}`);
|
|
112
|
+
if (!agents.includes(agent)) agents.push(agent);
|
|
113
|
+
}
|
|
114
|
+
if (agents.length === 0) {
|
|
115
|
+
const detected = detectedAgents();
|
|
116
|
+
if (!interactive) {
|
|
117
|
+
agents = detected;
|
|
118
|
+
} else {
|
|
119
|
+
agents = await checkbox({
|
|
120
|
+
message: 'Which agents should use Mintlify?',
|
|
121
|
+
choices: SETUP_AGENTS.map((agent) => ({
|
|
122
|
+
name: AGENT_LABELS[agent],
|
|
123
|
+
value: agent,
|
|
124
|
+
checked: detected.includes(agent),
|
|
125
|
+
})),
|
|
126
|
+
required: true,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (agents.length === 0) {
|
|
131
|
+
throw new Error('No supported agents detected. Pass --agent claude-code, codex, or cursor.');
|
|
132
|
+
}
|
|
133
|
+
const location = { cwd: process.cwd(), homeDir: os.homedir(), global: options.global };
|
|
134
|
+
const plans = await Promise.all(agents.map((agent) => prepareMcpConfig(agent, location)));
|
|
135
|
+
const scope = options.global ? 'your user account' : 'this project';
|
|
136
|
+
process.stdout.write(`Setting up Mintlify skills and Admin MCP for ${scope}.\n`);
|
|
137
|
+
await installSkills(agents, options.global);
|
|
138
|
+
for (const plan of plans) {
|
|
139
|
+
await writeMcpConfig(plan);
|
|
140
|
+
const action = plan.contents === undefined ? 'Already configured' : 'Configured';
|
|
141
|
+
process.stdout.write(`${action}: ${plan.path}\n`);
|
|
142
|
+
}
|
|
143
|
+
process.stdout.write(
|
|
144
|
+
'\nAdmin MCP is configured. Complete OAuth sign-in to grant account and project access:\n'
|
|
145
|
+
);
|
|
146
|
+
for (const agent of agents) {
|
|
147
|
+
if (agent === 'codex') {
|
|
148
|
+
let command = `codex mcp login ${ADMIN_MCP_NAME}`;
|
|
149
|
+
if (!options.global) {
|
|
150
|
+
const config = `mcp_servers.${ADMIN_MCP_NAME}.url='${ADMIN_MCP_URL}'`;
|
|
151
|
+
command = `codex -c "${config}" mcp login ${ADMIN_MCP_NAME}`;
|
|
152
|
+
}
|
|
153
|
+
process.stdout.write(
|
|
154
|
+
` Codex: run ${command}. Trust the project before using its MCP configuration.\n`
|
|
155
|
+
);
|
|
156
|
+
} else if (agent === 'claude-code') {
|
|
157
|
+
process.stdout.write(
|
|
158
|
+
` Claude Code: open /mcp and authenticate ${ADMIN_MCP_NAME}. Approve the project server if prompted.\n`
|
|
159
|
+
);
|
|
160
|
+
} else {
|
|
161
|
+
process.stdout.write(` Cursor: open MCP settings and connect ${ADMIN_MCP_NAME}.\n`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
process.stdout.write('Setup: https://mintlify.com/docs/ai/mintlify-mcp\n');
|
|
165
|
+
}
|
package/src/cli.tsx
CHANGED
|
@@ -15,6 +15,7 @@ import { hideBin } from 'yargs/helpers';
|
|
|
15
15
|
import { accessibilityCheck } from './accessibilityCheck.js';
|
|
16
16
|
import { addDomain } from './addDomain.js';
|
|
17
17
|
import { claimDeployment, createAgentClaimLink } from './agent-claim.js';
|
|
18
|
+
import { SETUP_AGENTS, setupAgent } from './agent-setup.js';
|
|
18
19
|
import { analyticsBuilder } from './analytics/index.js';
|
|
19
20
|
import { brokenLinksHandler } from './brokenLinks.js';
|
|
20
21
|
import { comingSoon } from './comingSoon.js';
|
|
@@ -113,6 +114,49 @@ export const cli = ({ packageName = 'mint' }: { packageName?: string }) => {
|
|
|
113
114
|
.middleware(checkNodeVersion)
|
|
114
115
|
.middleware(suppressConsoleWarnings)
|
|
115
116
|
.middleware(telemetryMiddleware)
|
|
117
|
+
.command('agent', 'Set up AI coding agents for Mintlify', (yargs) =>
|
|
118
|
+
yargs
|
|
119
|
+
.command(
|
|
120
|
+
'setup',
|
|
121
|
+
'Install Mintlify skills and configure Admin MCP',
|
|
122
|
+
(yargs) =>
|
|
123
|
+
yargs
|
|
124
|
+
.exitProcess(false)
|
|
125
|
+
.option('agent', {
|
|
126
|
+
alias: 'a',
|
|
127
|
+
type: 'string',
|
|
128
|
+
array: true,
|
|
129
|
+
choices: SETUP_AGENTS,
|
|
130
|
+
description: 'Agents to configure (defaults to interactive selection)',
|
|
131
|
+
})
|
|
132
|
+
.option('global', {
|
|
133
|
+
alias: 'g',
|
|
134
|
+
type: 'boolean',
|
|
135
|
+
default: false,
|
|
136
|
+
description: 'Set up agents for your user account instead of this project',
|
|
137
|
+
})
|
|
138
|
+
.example('$0 agent setup', 'Choose agents and set up the current project')
|
|
139
|
+
.example(
|
|
140
|
+
'$0 agent setup --agent codex --global',
|
|
141
|
+
'Set up Codex for your user account'
|
|
142
|
+
)
|
|
143
|
+
.epilog(
|
|
144
|
+
'Requires Node.js 22.20 or later and npm. Admin MCP requires a separate OAuth sign-in in each agent.'
|
|
145
|
+
),
|
|
146
|
+
async (argv) => {
|
|
147
|
+
try {
|
|
148
|
+
await setupAgent({ agents: argv.agent, global: argv.global });
|
|
149
|
+
await terminate(0);
|
|
150
|
+
} catch (error) {
|
|
151
|
+
process.stderr.write(
|
|
152
|
+
`${error instanceof Error ? error.message : 'Agent setup failed.'}\n`
|
|
153
|
+
);
|
|
154
|
+
await terminate(1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
.demandCommand(1, 'Run mint agent setup to configure your coding agents.')
|
|
159
|
+
)
|
|
116
160
|
.command(
|
|
117
161
|
'claim',
|
|
118
162
|
'Claim a site created with mint deploy',
|
package/src/welcome.ts
CHANGED
|
@@ -57,6 +57,7 @@ const GROUPS: CommandGroup[] = [
|
|
|
57
57
|
{
|
|
58
58
|
title: 'CLI',
|
|
59
59
|
commands: [
|
|
60
|
+
{ name: 'agent setup', description: 'Install Mintlify skills and configure Admin MCP' },
|
|
60
61
|
{ name: 'config', description: 'Manage CLI configuration' },
|
|
61
62
|
{ name: 'update', description: 'Update to the latest version' },
|
|
62
63
|
],
|