unity-mcp-cli 0.56.0 → 0.57.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 +108 -40
- package/dist/commands/run-system-tool.d.ts +2 -0
- package/dist/commands/run-system-tool.js +132 -0
- package/dist/commands/run-system-tool.js.map +1 -0
- package/dist/commands/run-tool.js +36 -84
- package/dist/commands/run-tool.js.map +1 -1
- package/dist/commands/setup-mcp.d.ts +2 -0
- package/dist/commands/setup-mcp.js +119 -0
- package/dist/commands/setup-mcp.js.map +1 -0
- package/dist/commands/setup-skills.d.ts +2 -0
- package/dist/commands/setup-skills.js +113 -0
- package/dist/commands/setup-skills.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/agents.d.ts +22 -0
- package/dist/utils/agents.js +546 -0
- package/dist/utils/agents.js.map +1 -0
- package/dist/utils/connection.d.ts +34 -0
- package/dist/utils/connection.js +77 -0
- package/dist/utils/connection.js.map +1 -0
- package/dist/utils/input.d.ts +13 -0
- package/dist/utils/input.js +72 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/json-parse.d.ts +36 -0
- package/dist/utils/json-parse.js +103 -0
- package/dist/utils/json-parse.js.map +1 -0
- package/docs/README.es.md +206 -98
- package/docs/README.ja.md +205 -97
- package/docs/README.zh-CN.md +204 -96
- package/package.json +1 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as ui from '../utils/ui.js';
|
|
5
|
+
import { verbose } from '../utils/ui.js';
|
|
6
|
+
import { generatePortFromDirectory } from '../utils/port.js';
|
|
7
|
+
import { readConfig, resolveConnectionFromConfig } from '../utils/config.js';
|
|
8
|
+
import { getAgentById, getAgentIds, listAgentTable, resolveServerBinaryPath, writeJsonAgentConfig, writeTomlAgentConfig, MCP_SERVER_NAME, } from '../utils/agents.js';
|
|
9
|
+
function listAgents() {
|
|
10
|
+
listAgentTable('Available AI Agents', 'Config Path', (a) => a.configPathDisplay);
|
|
11
|
+
}
|
|
12
|
+
export const setupMcpCommand = new Command('setup-mcp')
|
|
13
|
+
.description('Write MCP config for an AI agent')
|
|
14
|
+
.argument('[agent-id]', 'Agent to configure (use --list to see all)')
|
|
15
|
+
.argument('[path]', 'Unity project path (defaults to cwd)')
|
|
16
|
+
.option('--transport <transport>', 'Transport method: stdio or http (default: http)', 'http')
|
|
17
|
+
.option('--url <url>', 'Server URL override (for http transport)')
|
|
18
|
+
.option('--token <token>', 'Auth token override')
|
|
19
|
+
.option('--list', 'List all available agent IDs')
|
|
20
|
+
.action(async (agentId, positionalPath, options) => {
|
|
21
|
+
if (options.list) {
|
|
22
|
+
listAgents();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!agentId) {
|
|
26
|
+
ui.error('Missing required argument: agent-id');
|
|
27
|
+
ui.info(`Available agent IDs: ${getAgentIds().join(', ')}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const agent = getAgentById(agentId);
|
|
31
|
+
if (!agent) {
|
|
32
|
+
ui.error(`Unknown agent: "${agentId}"`);
|
|
33
|
+
ui.info(`Available agent IDs: ${getAgentIds().join(', ')}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const transport = options.transport ?? 'http';
|
|
37
|
+
if (transport !== 'stdio' && transport !== 'http') {
|
|
38
|
+
ui.error(`Invalid transport: "${transport}". Must be "stdio" or "http".`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
// Resolve project path
|
|
42
|
+
const projectPath = path.resolve(positionalPath ?? process.cwd());
|
|
43
|
+
if (positionalPath && !fs.existsSync(projectPath)) {
|
|
44
|
+
ui.error(`Project path does not exist: ${projectPath}`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
verbose(`Project path: ${projectPath}`);
|
|
48
|
+
// Read project config for port, timeout, auth, token
|
|
49
|
+
const config = readConfig(projectPath);
|
|
50
|
+
const fromConfig = config
|
|
51
|
+
? resolveConnectionFromConfig(config)
|
|
52
|
+
: { url: undefined, token: undefined };
|
|
53
|
+
const port = (() => {
|
|
54
|
+
if (!config?.host)
|
|
55
|
+
return generatePortFromDirectory(projectPath);
|
|
56
|
+
try {
|
|
57
|
+
return parseInt(new URL(config.host).port, 10) || generatePortFromDirectory(projectPath);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return generatePortFromDirectory(projectPath);
|
|
61
|
+
}
|
|
62
|
+
})();
|
|
63
|
+
const timeout = config?.timeoutMs ?? 10000;
|
|
64
|
+
const auth = config?.authOption ?? 'none';
|
|
65
|
+
const token = options.token ?? fromConfig.token ?? '';
|
|
66
|
+
const authRequired = auth === 'required';
|
|
67
|
+
// Resolve server binary path
|
|
68
|
+
const serverPath = resolveServerBinaryPath(projectPath).replace(/\\/g, '/');
|
|
69
|
+
verbose(`Server binary: ${serverPath}`);
|
|
70
|
+
// Resolve URL for HTTP
|
|
71
|
+
let serverUrl;
|
|
72
|
+
if (options.url) {
|
|
73
|
+
serverUrl = options.url.replace(/\/$/, '');
|
|
74
|
+
}
|
|
75
|
+
else if (fromConfig.url) {
|
|
76
|
+
serverUrl = fromConfig.url.replace(/\/$/, '');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
serverUrl = `http://localhost:${port}`;
|
|
80
|
+
}
|
|
81
|
+
// Get config path and build properties
|
|
82
|
+
const configPath = agent.getConfigPath(projectPath);
|
|
83
|
+
verbose(`Config file: ${configPath}`);
|
|
84
|
+
let props;
|
|
85
|
+
let removeKeys;
|
|
86
|
+
if (transport === 'stdio') {
|
|
87
|
+
props = agent.getStdioProps(serverPath, port, timeout, auth, token);
|
|
88
|
+
removeKeys = agent.stdioRemoveKeys;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
props = agent.getHttpProps(serverUrl, token, authRequired);
|
|
92
|
+
removeKeys = agent.httpRemoveKeys;
|
|
93
|
+
}
|
|
94
|
+
// Write config
|
|
95
|
+
const spinner = ui.startSpinner(`Configuring ${agent.name} (${transport})...`);
|
|
96
|
+
try {
|
|
97
|
+
if (agent.configFormat === 'toml') {
|
|
98
|
+
writeTomlAgentConfig(configPath, agent.bodyPath, MCP_SERVER_NAME, props, removeKeys);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
writeJsonAgentConfig(configPath, agent.bodyPath, MCP_SERVER_NAME, props, removeKeys);
|
|
102
|
+
}
|
|
103
|
+
spinner.success(`${agent.name} configured successfully`);
|
|
104
|
+
console.log('');
|
|
105
|
+
ui.label('Config file', configPath);
|
|
106
|
+
ui.label('Transport', transport);
|
|
107
|
+
ui.label('Server name', MCP_SERVER_NAME);
|
|
108
|
+
if (transport === 'stdio' && !fs.existsSync(serverPath.replace(/\//g, path.sep))) {
|
|
109
|
+
console.log('');
|
|
110
|
+
ui.warn('Server binary not found. Open Unity with the MCP plugin to download it automatically.');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
spinner.error('Failed to write config');
|
|
115
|
+
ui.error(err instanceof Error ? err.message : String(err));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=setup-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/commands/setup-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as ui from '../utils/ui.js';
|
|
4
|
+
import { verbose } from '../utils/ui.js';
|
|
5
|
+
import { resolveAndValidateProjectPath, resolveConnection } from '../utils/connection.js';
|
|
6
|
+
import { getAgentById, getAgentIds, listAgentTable } from '../utils/agents.js';
|
|
7
|
+
function listAgentsWithSkills() {
|
|
8
|
+
listAgentTable('AI Agents \u2014 Skills Support', 'Skills Path', (a) => a.skillsPath ?? '\u2014');
|
|
9
|
+
}
|
|
10
|
+
export const setupSkillsCommand = new Command('setup-skills')
|
|
11
|
+
.description('Generate skill files for an AI agent')
|
|
12
|
+
.argument('[agent-id]', 'Agent to generate skills for (use --list to see all)')
|
|
13
|
+
.argument('[path]', 'Unity project path (defaults to cwd)')
|
|
14
|
+
.option('--url <url>', 'Server URL override')
|
|
15
|
+
.option('--token <token>', 'Auth token override')
|
|
16
|
+
.option('--list', 'List all agents with skills support status')
|
|
17
|
+
.option('--timeout <ms>', 'Request timeout in milliseconds (default: 60000)', '60000')
|
|
18
|
+
.action(async (agentId, positionalPath, options) => {
|
|
19
|
+
if (options.list) {
|
|
20
|
+
listAgentsWithSkills();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!agentId) {
|
|
24
|
+
ui.error('Missing required argument: agent-id');
|
|
25
|
+
ui.info(`Available agent IDs: ${getAgentIds().join(', ')}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const agent = getAgentById(agentId);
|
|
29
|
+
if (!agent) {
|
|
30
|
+
ui.error(`Unknown agent: "${agentId}"`);
|
|
31
|
+
ui.info(`Available agent IDs: ${getAgentIds().join(', ')}`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
if (!agent.skillsPath) {
|
|
35
|
+
ui.error(`Agent "${agent.name}" does not support skills.`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Resolve project path and validate it is a Unity project
|
|
39
|
+
const projectPath = resolveAndValidateProjectPath(positionalPath, options);
|
|
40
|
+
verbose(`Project path: ${projectPath}`);
|
|
41
|
+
// Resolve skills path (absolute)
|
|
42
|
+
const skillsPath = path.join(projectPath, agent.skillsPath);
|
|
43
|
+
verbose(`Skills path: ${skillsPath}`);
|
|
44
|
+
// Resolve server connection
|
|
45
|
+
const { url: serverUrl, token } = resolveConnection(projectPath, options);
|
|
46
|
+
// Call the MCP server to generate skills
|
|
47
|
+
const endpoint = `${serverUrl}/api/system-tools/unity-skill-generate`;
|
|
48
|
+
verbose(`Endpoint: ${endpoint}`);
|
|
49
|
+
const headers = {
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
};
|
|
52
|
+
if (token) {
|
|
53
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
54
|
+
}
|
|
55
|
+
const body = JSON.stringify({ path: skillsPath });
|
|
56
|
+
ui.heading('Generate Skills');
|
|
57
|
+
ui.label('Agent', agent.name);
|
|
58
|
+
ui.label('Skills path', skillsPath);
|
|
59
|
+
ui.label('Server', serverUrl);
|
|
60
|
+
ui.divider();
|
|
61
|
+
const timeoutMs = parseInt(options.timeout ?? '60000', 10);
|
|
62
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
63
|
+
ui.error(`Invalid timeout value: "${options.timeout}". Must be a positive integer (milliseconds).`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
const spinner = ui.startSpinner(`Generating skills for ${agent.name}...`);
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
const fetchTimeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
69
|
+
try {
|
|
70
|
+
const response = await fetch(endpoint, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers,
|
|
73
|
+
body,
|
|
74
|
+
signal: controller.signal,
|
|
75
|
+
});
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
spinner.stop();
|
|
78
|
+
const text = await response.text();
|
|
79
|
+
if (response.status === 404) {
|
|
80
|
+
ui.error('The unity-skill-generate tool is not yet available. Please update the Unity-MCP plugin to the latest version.');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
ui.error(`HTTP ${response.status}: ${response.statusText}`);
|
|
84
|
+
if (text) {
|
|
85
|
+
ui.info(text);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
spinner.success(`Skills generated for ${agent.name}`);
|
|
91
|
+
ui.label('Output path', skillsPath);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
spinner.stop();
|
|
95
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
96
|
+
const isTimeout = err instanceof Error && err.name === 'AbortError';
|
|
97
|
+
const isConnectionRefused = message.includes('ECONNREFUSED') || message.includes('fetch failed');
|
|
98
|
+
if (isTimeout) {
|
|
99
|
+
ui.error(`Request timed out after ${timeoutMs / 1000} seconds.`);
|
|
100
|
+
}
|
|
101
|
+
else if (isConnectionRefused) {
|
|
102
|
+
ui.error('MCP Server is not running. Please start Unity Editor with the Unity-MCP plugin installed, then retry.');
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
ui.error(`Failed to generate skills: ${message}`);
|
|
106
|
+
}
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
clearTimeout(fetchTimeout);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=setup-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-skills.js","sourceRoot":"","sources":["../../src/commands/setup-skills.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,9 @@ import { installPluginCommand } from './commands/install-plugin.js';
|
|
|
7
7
|
import { configureCommand } from './commands/configure.js';
|
|
8
8
|
import { removePluginCommand } from './commands/remove-plugin.js';
|
|
9
9
|
import { runToolCommand } from './commands/run-tool.js';
|
|
10
|
+
import { runSystemToolCommand } from './commands/run-system-tool.js';
|
|
11
|
+
import { setupMcpCommand } from './commands/setup-mcp.js';
|
|
12
|
+
import { setupSkillsCommand } from './commands/setup-skills.js';
|
|
10
13
|
import { configureStyledHelp, error as uiError, setVerbose } from './utils/ui.js';
|
|
11
14
|
const require = createRequire(import.meta.url);
|
|
12
15
|
const pkg = require('../package.json');
|
|
@@ -25,6 +28,9 @@ const subcommands = [
|
|
|
25
28
|
openCommand,
|
|
26
29
|
removePluginCommand,
|
|
27
30
|
runToolCommand,
|
|
31
|
+
runSystemToolCommand,
|
|
32
|
+
setupMcpCommand,
|
|
33
|
+
setupSkillsCommand,
|
|
28
34
|
];
|
|
29
35
|
for (const cmd of subcommands) {
|
|
30
36
|
cmd.option('-v, --verbose', 'Enable verbose diagnostic output');
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAElF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;AAE/D,2BAA2B;AAC3B,MAAM,WAAW,GAAG;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,WAAW;IACX,mBAAmB;IACnB,cAAc;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAElF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;AAE/D,2BAA2B;AAC3B,MAAM,WAAW,GAAG;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,WAAW;IACX,mBAAmB;IACnB,cAAc;IACd,oBAAoB;IACpB,eAAe;IACf,kBAAkB;CACnB,CAAC;AAEF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;IAChE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAE1C,gDAAgD;AAChD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,EAA2B,CAAC;IACtE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,qCAAqC;AACrC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjC,OAAO,CAAE,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface AgentDefinition {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
skillsPath: string | null;
|
|
5
|
+
configPathDisplay: string;
|
|
6
|
+
configFormat: 'json' | 'toml';
|
|
7
|
+
bodyPath: string;
|
|
8
|
+
getConfigPath(projectPath: string): string;
|
|
9
|
+
getStdioProps(serverPath: string, port: number, timeout: number, auth: string, token: string): Record<string, unknown>;
|
|
10
|
+
getHttpProps(url: string, token: string, authRequired: boolean): Record<string, unknown>;
|
|
11
|
+
stdioRemoveKeys: string[];
|
|
12
|
+
httpRemoveKeys: string[];
|
|
13
|
+
}
|
|
14
|
+
declare const MCP_SERVER_NAME = "ai-game-developer";
|
|
15
|
+
export declare const agentRegistry: readonly AgentDefinition[];
|
|
16
|
+
export declare function getAgentById(id: string): AgentDefinition | undefined;
|
|
17
|
+
export declare function getAgentIds(): string[];
|
|
18
|
+
export declare function listAgentTable(heading: string, locationLabel: string, locationFn: (agent: AgentDefinition) => string): void;
|
|
19
|
+
export declare function resolveServerBinaryPath(projectPath: string): string;
|
|
20
|
+
export declare function writeJsonAgentConfig(configPath: string, bodyPath: string, serverName: string, props: Record<string, unknown>, removeKeys: string[]): void;
|
|
21
|
+
export declare function writeTomlAgentConfig(configPath: string, bodyPath: string, serverName: string, props: Record<string, unknown>, removeKeys: string[]): void;
|
|
22
|
+
export { MCP_SERVER_NAME };
|