@agents-dev/cli 0.7.7
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/AGENTS.md +400 -0
- package/CHANGELOG.md +297 -0
- package/CONTRIBUTING.md +164 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/bin/agents +24 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +282 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/connect.d.ts +7 -0
- package/dist/commands/connect.js +48 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/disconnect.d.ts +7 -0
- package/dist/commands/disconnect.js +47 -0
- package/dist/commands/disconnect.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.js +430 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.js +24 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp-add.d.ts +20 -0
- package/dist/commands/mcp-add.js +250 -0
- package/dist/commands/mcp-add.js.map +1 -0
- package/dist/commands/mcp-import.d.ts +13 -0
- package/dist/commands/mcp-import.js +207 -0
- package/dist/commands/mcp-import.js.map +1 -0
- package/dist/commands/mcp-list.d.ts +5 -0
- package/dist/commands/mcp-list.js +34 -0
- package/dist/commands/mcp-list.js.map +1 -0
- package/dist/commands/mcp-remove.d.ts +7 -0
- package/dist/commands/mcp-remove.js +34 -0
- package/dist/commands/mcp-remove.js.map +1 -0
- package/dist/commands/mcp-test.d.ts +8 -0
- package/dist/commands/mcp-test.js +402 -0
- package/dist/commands/mcp-test.js.map +1 -0
- package/dist/commands/reset.d.ts +6 -0
- package/dist/commands/reset.js +76 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/start.d.ts +6 -0
- package/dist/commands/start.js +292 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +278 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.js +22 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/watch.d.ts +7 -0
- package/dist/commands/watch.js +117 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/core/claudeCli.d.ts +7 -0
- package/dist/core/claudeCli.js +35 -0
- package/dist/core/claudeCli.js.map +1 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.js +121 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/cursorCli.d.ts +9 -0
- package/dist/core/cursorCli.js +60 -0
- package/dist/core/cursorCli.js.map +1 -0
- package/dist/core/fs.d.ts +11 -0
- package/dist/core/fs.js +76 -0
- package/dist/core/fs.js.map +1 -0
- package/dist/core/gitignore.d.ts +3 -0
- package/dist/core/gitignore.js +54 -0
- package/dist/core/gitignore.js.map +1 -0
- package/dist/core/mcp.d.ts +8 -0
- package/dist/core/mcp.js +134 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/mcpCrud.d.ts +34 -0
- package/dist/core/mcpCrud.js +105 -0
- package/dist/core/mcpCrud.js.map +1 -0
- package/dist/core/mcpImport.d.ts +14 -0
- package/dist/core/mcpImport.js +507 -0
- package/dist/core/mcpImport.js.map +1 -0
- package/dist/core/mcpSecrets.d.ts +27 -0
- package/dist/core/mcpSecrets.js +144 -0
- package/dist/core/mcpSecrets.js.map +1 -0
- package/dist/core/mcpValidation.d.ts +19 -0
- package/dist/core/mcpValidation.js +78 -0
- package/dist/core/mcpValidation.js.map +1 -0
- package/dist/core/paths.d.ts +37 -0
- package/dist/core/paths.js +43 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/project.d.ts +16 -0
- package/dist/core/project.js +34 -0
- package/dist/core/project.js.map +1 -0
- package/dist/core/renderers.d.ts +14 -0
- package/dist/core/renderers.js +113 -0
- package/dist/core/renderers.js.map +1 -0
- package/dist/core/shell.d.ts +8 -0
- package/dist/core/shell.js +21 -0
- package/dist/core/shell.js.map +1 -0
- package/dist/core/shellWords.d.ts +1 -0
- package/dist/core/shellWords.js +84 -0
- package/dist/core/shellWords.js.map +1 -0
- package/dist/core/skills.d.ts +8 -0
- package/dist/core/skills.js +150 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/skillsValidation.d.ts +1 -0
- package/dist/core/skillsValidation.js +68 -0
- package/dist/core/skillsValidation.js.map +1 -0
- package/dist/core/sync.d.ts +2 -0
- package/dist/core/sync.js +427 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/syncLock.d.ts +1 -0
- package/dist/core/syncLock.js +84 -0
- package/dist/core/syncLock.js.map +1 -0
- package/dist/core/templates.d.ts +1 -0
- package/dist/core/templates.js +38 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/core/trust.d.ts +7 -0
- package/dist/core/trust.js +51 -0
- package/dist/core/trust.js.map +1 -0
- package/dist/core/vscodeSettings.d.ts +17 -0
- package/dist/core/vscodeSettings.js +212 -0
- package/dist/core/vscodeSettings.js.map +1 -0
- package/dist/core/warnings.d.ts +2 -0
- package/dist/core/warnings.js +26 -0
- package/dist/core/warnings.js.map +1 -0
- package/dist/integrations/antigravity.d.ts +9 -0
- package/dist/integrations/antigravity.js +13 -0
- package/dist/integrations/antigravity.js.map +1 -0
- package/dist/integrations/claude.d.ts +1 -0
- package/dist/integrations/claude.js +4 -0
- package/dist/integrations/claude.js.map +1 -0
- package/dist/integrations/codex.d.ts +5 -0
- package/dist/integrations/codex.js +5 -0
- package/dist/integrations/codex.js.map +1 -0
- package/dist/integrations/copilotVscode.d.ts +7 -0
- package/dist/integrations/copilotVscode.js +9 -0
- package/dist/integrations/copilotVscode.js.map +1 -0
- package/dist/integrations/cursor.d.ts +7 -0
- package/dist/integrations/cursor.js +9 -0
- package/dist/integrations/cursor.js.map +1 -0
- package/dist/integrations/gemini.d.ts +12 -0
- package/dist/integrations/gemini.js +15 -0
- package/dist/integrations/gemini.js.map +1 -0
- package/dist/integrations/registry.d.ts +9 -0
- package/dist/integrations/registry.js +21 -0
- package/dist/integrations/registry.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/EXAMPLES.md +211 -0
- package/docs/README.md +26 -0
- package/docs/agents-system.md +178 -0
- package/package.json +77 -0
- package/templates/agents/AGENTS.md +23 -0
- package/templates/agents/README.md +25 -0
- package/templates/agents/skills/README.md +27 -0
- package/templates/agents/skills/skill-guide/SKILL.md +29 -0
package/dist/core/mcp.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { loadAgentsConfig } from './config.js';
|
|
2
|
+
import { pathExists, readJson } from './fs.js';
|
|
3
|
+
import { getProjectPaths } from './paths.js';
|
|
4
|
+
const ALL_INTEGRATIONS = ['codex', 'claude', 'gemini', 'copilot_vscode', 'cursor', 'antigravity'];
|
|
5
|
+
const LEGACY_INTEGRATIONS = ['codex', 'claude', 'gemini', 'copilot_vscode'];
|
|
6
|
+
export async function loadLocalOverrides(projectRoot) {
|
|
7
|
+
const paths = getProjectPaths(projectRoot);
|
|
8
|
+
if (!(await pathExists(paths.agentsLocal))) {
|
|
9
|
+
return { mcpServers: {} };
|
|
10
|
+
}
|
|
11
|
+
return readJson(paths.agentsLocal);
|
|
12
|
+
}
|
|
13
|
+
export async function loadResolvedRegistry(projectRoot) {
|
|
14
|
+
const config = await loadAgentsConfig(projectRoot);
|
|
15
|
+
const local = await loadLocalOverrides(projectRoot);
|
|
16
|
+
return resolveFromConfigAndLocal({
|
|
17
|
+
projectRoot,
|
|
18
|
+
servers: config.mcp.servers,
|
|
19
|
+
local
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function resolveFromConfigAndLocal(input) {
|
|
23
|
+
const { projectRoot, servers, local } = input;
|
|
24
|
+
const warnings = [];
|
|
25
|
+
const missingRequiredEnv = [];
|
|
26
|
+
const serversByTarget = {
|
|
27
|
+
codex: [],
|
|
28
|
+
claude: [],
|
|
29
|
+
gemini: [],
|
|
30
|
+
copilot_vscode: [],
|
|
31
|
+
cursor: [],
|
|
32
|
+
antigravity: []
|
|
33
|
+
};
|
|
34
|
+
const selectedServerNames = [];
|
|
35
|
+
const localOverrides = local?.mcpServers ?? {};
|
|
36
|
+
for (const name of Object.keys(servers).sort((a, b) => a.localeCompare(b))) {
|
|
37
|
+
const base = servers[name];
|
|
38
|
+
const override = localOverrides[name];
|
|
39
|
+
const merged = deepMerge(base ?? {}, override ?? {});
|
|
40
|
+
if (!merged.transport) {
|
|
41
|
+
warnings.push(`MCP server "${name}" is invalid: missing transport.`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (merged.enabled === false)
|
|
45
|
+
continue;
|
|
46
|
+
const missing = (merged.requiredEnv ?? []).filter((envName) => !process.env[envName]);
|
|
47
|
+
if (missing.length > 0) {
|
|
48
|
+
missingRequiredEnv.push(`${name}: ${missing.join(', ')}`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const resolved = resolveServer(name, merged, projectRoot, warnings);
|
|
52
|
+
selectedServerNames.push(name);
|
|
53
|
+
const targets = normalizeTargets(merged.targets);
|
|
54
|
+
for (const target of targets) {
|
|
55
|
+
if (!ALL_INTEGRATIONS.includes(target)) {
|
|
56
|
+
warnings.push(`MCP server "${name}" has unsupported target "${target}"; ignored for that target.`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
serversByTarget[target].push(resolved);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
for (const target of ALL_INTEGRATIONS) {
|
|
63
|
+
serversByTarget[target].sort((a, b) => a.name.localeCompare(b.name));
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
serversByTarget,
|
|
67
|
+
warnings,
|
|
68
|
+
missingRequiredEnv,
|
|
69
|
+
selectedServerNames
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function normalizeTargets(targets) {
|
|
73
|
+
if (!targets || targets.length === 0) {
|
|
74
|
+
return ALL_INTEGRATIONS;
|
|
75
|
+
}
|
|
76
|
+
const unique = [...new Set(targets)];
|
|
77
|
+
const hasLegacySet = LEGACY_INTEGRATIONS.every((id) => unique.includes(id));
|
|
78
|
+
if (!hasLegacySet) {
|
|
79
|
+
return unique;
|
|
80
|
+
}
|
|
81
|
+
const out = [...unique];
|
|
82
|
+
for (const id of ALL_INTEGRATIONS) {
|
|
83
|
+
if (!out.includes(id)) {
|
|
84
|
+
out.push(id);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
function resolveServer(name, server, projectRoot, warnings) {
|
|
90
|
+
const resolveValue = (value) => {
|
|
91
|
+
if (!value)
|
|
92
|
+
return value;
|
|
93
|
+
return value.replace(/\$\{([A-Z0-9_]+)\}/g, (_full, key) => {
|
|
94
|
+
if (key === 'PROJECT_ROOT')
|
|
95
|
+
return projectRoot;
|
|
96
|
+
const envValue = process.env[key];
|
|
97
|
+
if (envValue === undefined) {
|
|
98
|
+
warnings.push(`Environment variable "${key}" is not set (server: ${name}).`);
|
|
99
|
+
return `\${${key}}`;
|
|
100
|
+
}
|
|
101
|
+
return envValue;
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
return {
|
|
105
|
+
name,
|
|
106
|
+
transport: server.transport,
|
|
107
|
+
command: resolveValue(server.command),
|
|
108
|
+
args: server.args?.map((item) => resolveValue(item) ?? item),
|
|
109
|
+
url: resolveValue(server.url),
|
|
110
|
+
headers: server.headers
|
|
111
|
+
? Object.fromEntries(Object.entries(server.headers).map(([k, v]) => [k, resolveValue(v) ?? v]))
|
|
112
|
+
: undefined,
|
|
113
|
+
env: server.env
|
|
114
|
+
? Object.fromEntries(Object.entries(server.env).map(([k, v]) => [k, resolveValue(v) ?? v]))
|
|
115
|
+
: undefined,
|
|
116
|
+
cwd: resolveValue(server.cwd)
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function isObject(value) {
|
|
120
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
121
|
+
}
|
|
122
|
+
function deepMerge(base, override) {
|
|
123
|
+
if (Array.isArray(base) && Array.isArray(override))
|
|
124
|
+
return override;
|
|
125
|
+
if (isObject(base) && isObject(override)) {
|
|
126
|
+
const out = { ...base };
|
|
127
|
+
for (const [key, value] of Object.entries(override)) {
|
|
128
|
+
out[key] = key in out ? deepMerge(out[key], value) : value;
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
return override === undefined ? base : override;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AgentsConfig, LocalOverridesFile, McpServerDefinition } from '../types.js';
|
|
2
|
+
export interface McpState {
|
|
3
|
+
config: AgentsConfig;
|
|
4
|
+
local: LocalOverridesFile;
|
|
5
|
+
}
|
|
6
|
+
export interface McpServerEntry {
|
|
7
|
+
name: string;
|
|
8
|
+
server: McpServerDefinition;
|
|
9
|
+
mergedServer: McpServerDefinition;
|
|
10
|
+
localOverride?: Partial<McpServerDefinition>;
|
|
11
|
+
hasLocalOverride: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface McpServerUpsertInput {
|
|
14
|
+
name: string;
|
|
15
|
+
server: McpServerDefinition;
|
|
16
|
+
localOverride?: Partial<McpServerDefinition>;
|
|
17
|
+
}
|
|
18
|
+
export declare function loadMcpState(projectRoot: string): Promise<McpState>;
|
|
19
|
+
export declare function saveMcpState(projectRoot: string, state: McpState): Promise<void>;
|
|
20
|
+
export declare function upsertMcpServers(args: {
|
|
21
|
+
projectRoot: string;
|
|
22
|
+
updates: McpServerUpsertInput[];
|
|
23
|
+
replace: boolean;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
created: string[];
|
|
26
|
+
updated: string[];
|
|
27
|
+
}>;
|
|
28
|
+
export declare function removeMcpServer(args: {
|
|
29
|
+
projectRoot: string;
|
|
30
|
+
name: string;
|
|
31
|
+
ignoreMissing: boolean;
|
|
32
|
+
}): Promise<boolean>;
|
|
33
|
+
export declare function listMcpEntries(state: McpState): McpServerEntry[];
|
|
34
|
+
export declare function mergeServerWithLocal(server: McpServerDefinition, localOverride: Partial<McpServerDefinition> | undefined): McpServerDefinition;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { loadAgentsConfig, saveAgentsConfig } from './config.js';
|
|
2
|
+
import { pathExists, readJson, writeJsonAtomic } from './fs.js';
|
|
3
|
+
import { getProjectPaths } from './paths.js';
|
|
4
|
+
export async function loadMcpState(projectRoot) {
|
|
5
|
+
const config = await loadAgentsConfig(projectRoot);
|
|
6
|
+
const paths = getProjectPaths(projectRoot);
|
|
7
|
+
let local = { mcpServers: {} };
|
|
8
|
+
if (await pathExists(paths.agentsLocal)) {
|
|
9
|
+
local = await readJson(paths.agentsLocal);
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
config,
|
|
13
|
+
local: {
|
|
14
|
+
mcpServers: typeof local.mcpServers === 'object' && local.mcpServers !== null ? local.mcpServers : {}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export async function saveMcpState(projectRoot, state) {
|
|
19
|
+
await saveAgentsConfig(projectRoot, state.config);
|
|
20
|
+
const paths = getProjectPaths(projectRoot);
|
|
21
|
+
await writeJsonAtomic(paths.agentsLocal, state.local);
|
|
22
|
+
}
|
|
23
|
+
export async function upsertMcpServers(args) {
|
|
24
|
+
const state = await loadMcpState(args.projectRoot);
|
|
25
|
+
const created = [];
|
|
26
|
+
const updated = [];
|
|
27
|
+
for (const update of args.updates) {
|
|
28
|
+
const exists = Object.prototype.hasOwnProperty.call(state.config.mcp.servers, update.name);
|
|
29
|
+
if (exists && !args.replace) {
|
|
30
|
+
throw new Error(`MCP server "${update.name}" already exists. Use --replace to overwrite.`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
for (const update of args.updates) {
|
|
34
|
+
const exists = Object.prototype.hasOwnProperty.call(state.config.mcp.servers, update.name);
|
|
35
|
+
state.config.mcp.servers[update.name] = update.server;
|
|
36
|
+
if (hasMeaningfulOverride(update.localOverride)) {
|
|
37
|
+
state.local.mcpServers[update.name] = update.localOverride;
|
|
38
|
+
}
|
|
39
|
+
else if (exists) {
|
|
40
|
+
delete state.local.mcpServers[update.name];
|
|
41
|
+
}
|
|
42
|
+
if (exists) {
|
|
43
|
+
updated.push(update.name);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
created.push(update.name);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
await saveMcpState(args.projectRoot, state);
|
|
50
|
+
return {
|
|
51
|
+
created: created.sort((a, b) => a.localeCompare(b)),
|
|
52
|
+
updated: updated.sort((a, b) => a.localeCompare(b))
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export async function removeMcpServer(args) {
|
|
56
|
+
const state = await loadMcpState(args.projectRoot);
|
|
57
|
+
const exists = Object.prototype.hasOwnProperty.call(state.config.mcp.servers, args.name);
|
|
58
|
+
if (!exists) {
|
|
59
|
+
if (args.ignoreMissing)
|
|
60
|
+
return false;
|
|
61
|
+
throw new Error(`MCP server "${args.name}" does not exist.`);
|
|
62
|
+
}
|
|
63
|
+
delete state.config.mcp.servers[args.name];
|
|
64
|
+
delete state.local.mcpServers[args.name];
|
|
65
|
+
await saveMcpState(args.projectRoot, state);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
export function listMcpEntries(state) {
|
|
69
|
+
const names = Object.keys(state.config.mcp.servers).sort((a, b) => a.localeCompare(b));
|
|
70
|
+
return names.map((name) => {
|
|
71
|
+
const server = state.config.mcp.servers[name];
|
|
72
|
+
const localOverride = state.local.mcpServers[name];
|
|
73
|
+
return {
|
|
74
|
+
name,
|
|
75
|
+
server,
|
|
76
|
+
mergedServer: mergeServerWithLocal(server, localOverride),
|
|
77
|
+
localOverride,
|
|
78
|
+
hasLocalOverride: hasMeaningfulOverride(localOverride)
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
export function mergeServerWithLocal(server, localOverride) {
|
|
83
|
+
return deepMerge(server, localOverride ?? {});
|
|
84
|
+
}
|
|
85
|
+
function hasMeaningfulOverride(value) {
|
|
86
|
+
if (!value || typeof value !== 'object')
|
|
87
|
+
return false;
|
|
88
|
+
return Object.entries(value).some(([, entry]) => entry !== undefined);
|
|
89
|
+
}
|
|
90
|
+
function isObject(value) {
|
|
91
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
92
|
+
}
|
|
93
|
+
function deepMerge(base, override) {
|
|
94
|
+
if (Array.isArray(base) && Array.isArray(override))
|
|
95
|
+
return override;
|
|
96
|
+
if (isObject(base) && isObject(override)) {
|
|
97
|
+
const out = { ...base };
|
|
98
|
+
for (const [key, value] of Object.entries(override)) {
|
|
99
|
+
out[key] = key in out ? deepMerge(out[key], value) : value;
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
return override === undefined ? base : override;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=mcpCrud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpCrud.js","sourceRoot":"","sources":["../../src/core/mcpCrud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { McpServerDefinition } from '../types.js';
|
|
2
|
+
interface ImportedServer {
|
|
3
|
+
name: string;
|
|
4
|
+
server: McpServerDefinition;
|
|
5
|
+
}
|
|
6
|
+
export declare function readImportInput(args: {
|
|
7
|
+
filePath?: string;
|
|
8
|
+
jsonText?: string;
|
|
9
|
+
url?: string;
|
|
10
|
+
}): Promise<string>;
|
|
11
|
+
export declare function parseImportedServers(rawInput: string, explicitName?: string): ImportedServer[];
|
|
12
|
+
export declare function extractImportPayloadFromHtml(html: string): string | null;
|
|
13
|
+
export declare function extractImportPayloadFromMarkdown(markdown: string): string | null;
|
|
14
|
+
export {};
|