agentinit 1.4.1 → 1.6.0
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/CHANGELOG.md +19 -0
- package/README.md +209 -0
- package/dist/agentinit-1.6.0.tgz +0 -0
- package/dist/agents/Agent.d.ts +110 -0
- package/dist/agents/Agent.d.ts.map +1 -0
- package/dist/agents/Agent.js +174 -0
- package/dist/agents/Agent.js.map +1 -0
- package/dist/agents/ClaudeAgent.d.ts +50 -0
- package/dist/agents/ClaudeAgent.d.ts.map +1 -0
- package/dist/agents/ClaudeAgent.js +249 -0
- package/dist/agents/ClaudeAgent.js.map +1 -0
- package/dist/agents/ClaudeDesktopAgent.d.ts +49 -0
- package/dist/agents/ClaudeDesktopAgent.d.ts.map +1 -0
- package/dist/agents/ClaudeDesktopAgent.js +143 -0
- package/dist/agents/ClaudeDesktopAgent.js.map +1 -0
- package/dist/agents/CodexCliAgent.d.ts +48 -0
- package/dist/agents/CodexCliAgent.d.ts.map +1 -0
- package/dist/agents/CodexCliAgent.js +262 -0
- package/dist/agents/CodexCliAgent.js.map +1 -0
- package/dist/agents/CursorAgent.d.ts +44 -0
- package/dist/agents/CursorAgent.d.ts.map +1 -0
- package/dist/agents/CursorAgent.js +231 -0
- package/dist/agents/CursorAgent.js.map +1 -0
- package/dist/agents/DroidAgent.d.ts +52 -0
- package/dist/agents/DroidAgent.d.ts.map +1 -0
- package/dist/agents/DroidAgent.js +228 -0
- package/dist/agents/DroidAgent.js.map +1 -0
- package/dist/agents/GeminiCliAgent.d.ts +40 -0
- package/dist/agents/GeminiCliAgent.d.ts.map +1 -0
- package/dist/agents/GeminiCliAgent.js +195 -0
- package/dist/agents/GeminiCliAgent.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +33365 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/apply.d.ts +2 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +468 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +6 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/detect.d.ts +6 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +55 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +105 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +8 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +127 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/subagents.d.ts +9 -0
- package/dist/commands/subagents.d.ts.map +1 -0
- package/dist/commands/subagents.js +6 -0
- package/dist/commands/subagents.js.map +1 -0
- package/dist/commands/sync.d.ts +7 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +49 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/verifyMcp.d.ts +2 -0
- package/dist/commands/verifyMcp.d.ts.map +1 -0
- package/dist/commands/verifyMcp.js +215 -0
- package/dist/commands/verifyMcp.js.map +1 -0
- package/dist/constants/index.d.ts +3 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/mcp.d.ts +9 -0
- package/dist/constants/mcp.d.ts.map +1 -0
- package/dist/constants/mcp.js +28 -0
- package/dist/constants/mcp.js.map +1 -0
- package/dist/constants/tokens.d.ts +6 -0
- package/dist/constants/tokens.d.ts.map +1 -0
- package/dist/constants/tokens.js +5 -0
- package/dist/constants/tokens.js.map +1 -0
- package/dist/core/agentDetector.d.ts +9 -0
- package/dist/core/agentDetector.d.ts.map +1 -0
- package/dist/core/agentDetector.js +51 -0
- package/dist/core/agentDetector.js.map +1 -0
- package/dist/core/agentManager.d.ts +55 -0
- package/dist/core/agentManager.d.ts.map +1 -0
- package/dist/core/agentManager.js +113 -0
- package/dist/core/agentManager.js.map +1 -0
- package/dist/core/configMerger.d.ts +49 -0
- package/dist/core/configMerger.d.ts.map +1 -0
- package/dist/core/configMerger.js +180 -0
- package/dist/core/configMerger.js.map +1 -0
- package/dist/core/mcpClient.d.ts +38 -0
- package/dist/core/mcpClient.d.ts.map +1 -0
- package/dist/core/mcpClient.js +416 -0
- package/dist/core/mcpClient.js.map +1 -0
- package/dist/core/mcpFilter.d.ts +44 -0
- package/dist/core/mcpFilter.d.ts.map +1 -0
- package/dist/core/mcpFilter.js +126 -0
- package/dist/core/mcpFilter.js.map +1 -0
- package/dist/core/mcpParser.d.ts +25 -0
- package/dist/core/mcpParser.d.ts.map +1 -0
- package/dist/core/mcpParser.js +297 -0
- package/dist/core/mcpParser.js.map +1 -0
- package/dist/core/propagator.d.ts +25 -0
- package/dist/core/propagator.d.ts.map +1 -0
- package/dist/core/propagator.js +154 -0
- package/dist/core/propagator.js.map +1 -0
- package/dist/core/rulesApplicator.d.ts +29 -0
- package/dist/core/rulesApplicator.d.ts.map +1 -0
- package/dist/core/rulesApplicator.js +181 -0
- package/dist/core/rulesApplicator.js.map +1 -0
- package/dist/core/rulesParser.d.ts +41 -0
- package/dist/core/rulesParser.d.ts.map +1 -0
- package/dist/core/rulesParser.js +260 -0
- package/dist/core/rulesParser.js.map +1 -0
- package/dist/core/rulesTemplateLoader.d.ts +31 -0
- package/dist/core/rulesTemplateLoader.d.ts.map +1 -0
- package/dist/core/rulesTemplateLoader.js +75 -0
- package/dist/core/rulesTemplateLoader.js.map +1 -0
- package/dist/core/stackDetector.d.ts +16 -0
- package/dist/core/stackDetector.d.ts.map +1 -0
- package/dist/core/stackDetector.js +234 -0
- package/dist/core/stackDetector.js.map +1 -0
- package/dist/core/templateEngine.d.ts +15 -0
- package/dist/core/templateEngine.d.ts.map +1 -0
- package/dist/core/templateEngine.js +260 -0
- package/dist/core/templateEngine.js.map +1 -0
- package/dist/core/tomlGenerator.d.ts +24 -0
- package/dist/core/tomlGenerator.d.ts.map +1 -0
- package/dist/core/tomlGenerator.js +185 -0
- package/dist/core/tomlGenerator.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -33195
- package/dist/index.js.map +1 -0
- package/dist/lib/index.d.ts +39 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +40 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/types/index.d.ts +23 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +23 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/utils/index.d.ts +18 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +21 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/verifier/index.d.ts +22 -0
- package/dist/lib/verifier/index.d.ts.map +1 -0
- package/dist/lib/verifier/index.js +22 -0
- package/dist/lib/verifier/index.js.map +1 -0
- package/dist/registry/mcpRegistry.d.ts +12 -0
- package/dist/registry/mcpRegistry.d.ts.map +1 -0
- package/dist/registry/mcpRegistry.js +114 -0
- package/dist/registry/mcpRegistry.js.map +1 -0
- package/dist/types/index.d.ts +180 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/rules.d.ts +51 -0
- package/dist/types/rules.d.ts.map +1 -0
- package/dist/types/rules.js +2 -0
- package/dist/types/rules.js.map +1 -0
- package/dist/utils/fs.d.ts +12 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +91 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +36 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +77 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +140 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +30 -6
- package/dist/agentinit-1.4.1.tgz +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import * as TOML from '@iarna/toml';
|
|
2
|
+
import { Agent } from './Agent.js';
|
|
3
|
+
import { readFileIfExists, writeFile, ensureDirectoryExists } from '../utils/fs.js';
|
|
4
|
+
/**
|
|
5
|
+
* OpenAI Codex CLI agent implementation
|
|
6
|
+
* Supports only stdio MCP servers - transforms remote servers to stdio via mcp-remote proxy
|
|
7
|
+
* Native config: .codex/config.toml
|
|
8
|
+
*/
|
|
9
|
+
export class CodexCliAgent extends Agent {
|
|
10
|
+
constructor() {
|
|
11
|
+
const definition = {
|
|
12
|
+
id: 'codex',
|
|
13
|
+
name: 'OpenAI Codex CLI',
|
|
14
|
+
capabilities: {
|
|
15
|
+
mcp: {
|
|
16
|
+
stdio: true,
|
|
17
|
+
http: false, // Supported via transformation
|
|
18
|
+
sse: false // Supported via transformation
|
|
19
|
+
},
|
|
20
|
+
rules: true,
|
|
21
|
+
hooks: false,
|
|
22
|
+
commands: false,
|
|
23
|
+
subagents: false,
|
|
24
|
+
statusline: false
|
|
25
|
+
},
|
|
26
|
+
configFiles: [
|
|
27
|
+
{
|
|
28
|
+
path: '.codex/config.toml',
|
|
29
|
+
purpose: 'mcp',
|
|
30
|
+
format: 'toml',
|
|
31
|
+
type: 'file',
|
|
32
|
+
optional: true,
|
|
33
|
+
description: 'OpenAI Codex CLI MCP server configuration'
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
nativeConfigPath: '.codex/config.toml',
|
|
37
|
+
globalConfigPath: '~/.codex/config.toml'
|
|
38
|
+
};
|
|
39
|
+
super(definition);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Apply MCP configuration to Codex CLI's native TOML format
|
|
43
|
+
*/
|
|
44
|
+
async applyMCPConfig(projectPath, servers) {
|
|
45
|
+
const tomlConfigPath = this.getNativeMcpPath(projectPath);
|
|
46
|
+
// Ensure the directory exists
|
|
47
|
+
await ensureDirectoryExists(tomlConfigPath);
|
|
48
|
+
// Read existing configuration
|
|
49
|
+
const existingContent = await readFileIfExists(tomlConfigPath);
|
|
50
|
+
let existingConfig = { mcp_servers: {} };
|
|
51
|
+
if (existingContent) {
|
|
52
|
+
try {
|
|
53
|
+
existingConfig = TOML.parse(existingContent);
|
|
54
|
+
if (!existingConfig.mcp_servers) {
|
|
55
|
+
existingConfig.mcp_servers = {};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.warn('Warning: Existing .codex/config.toml is invalid, creating new configuration');
|
|
60
|
+
existingConfig = { mcp_servers: {} };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Transform servers to stdio format and add to config
|
|
64
|
+
const transformedServers = this.transformMCPServers(servers);
|
|
65
|
+
for (const server of transformedServers) {
|
|
66
|
+
const codexServer = {};
|
|
67
|
+
// All servers should be stdio at this point after transformation
|
|
68
|
+
if (server.command) {
|
|
69
|
+
codexServer.command = server.command;
|
|
70
|
+
}
|
|
71
|
+
if (server.args && server.args.length > 0) {
|
|
72
|
+
codexServer.args = server.args;
|
|
73
|
+
}
|
|
74
|
+
if (server.env && Object.keys(server.env).length > 0) {
|
|
75
|
+
codexServer.env = server.env;
|
|
76
|
+
}
|
|
77
|
+
existingConfig.mcp_servers[server.name] = codexServer;
|
|
78
|
+
}
|
|
79
|
+
// Write the updated configuration using TOML formatting
|
|
80
|
+
const formattedToml = this.formatTOML(TOML.stringify(existingConfig));
|
|
81
|
+
await writeFile(tomlConfigPath, formattedToml);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Codex only supports stdio, so filter out others (they'll be transformed)
|
|
85
|
+
*/
|
|
86
|
+
filterMCPServers(servers) {
|
|
87
|
+
// Don't filter here - let transformMCPServers handle the conversion
|
|
88
|
+
return servers;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Transform remote (HTTP/SSE) servers to stdio using mcp-remote proxy
|
|
92
|
+
*/
|
|
93
|
+
transformMCPServers(servers) {
|
|
94
|
+
return servers.map(server => {
|
|
95
|
+
// Keep stdio servers as-is
|
|
96
|
+
if (server.type === 'stdio') {
|
|
97
|
+
return server;
|
|
98
|
+
}
|
|
99
|
+
// Transform remote servers to use mcp-remote proxy
|
|
100
|
+
const transformedServer = {
|
|
101
|
+
name: server.name,
|
|
102
|
+
type: 'stdio',
|
|
103
|
+
command: 'npx',
|
|
104
|
+
args: ['-y', 'mcp-remote@latest'],
|
|
105
|
+
env: server.env || {}
|
|
106
|
+
};
|
|
107
|
+
// Add the URL as an argument to mcp-remote
|
|
108
|
+
if (server.url) {
|
|
109
|
+
transformedServer.args.push(server.url);
|
|
110
|
+
}
|
|
111
|
+
// Add any headers as environment variables
|
|
112
|
+
if (server.headers) {
|
|
113
|
+
for (const [key, value] of Object.entries(server.headers)) {
|
|
114
|
+
transformedServer.env[`MCP_HEADER_${key.toUpperCase().replace(/-/g, '_')}`] = value;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return transformedServer;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Format TOML output for Codex CLI with proper structure and comments
|
|
122
|
+
*/
|
|
123
|
+
formatTOML(tomlString) {
|
|
124
|
+
const lines = tomlString.split('\n');
|
|
125
|
+
const formattedLines = [];
|
|
126
|
+
// Add header comment
|
|
127
|
+
formattedLines.push('# Codex CLI MCP Configuration');
|
|
128
|
+
formattedLines.push('# Generated automatically by agentinit');
|
|
129
|
+
formattedLines.push('# Remote MCPs are automatically converted to stdio via mcp-remote proxy');
|
|
130
|
+
formattedLines.push('');
|
|
131
|
+
let inServerBlock = false;
|
|
132
|
+
for (const line of lines) {
|
|
133
|
+
const trimmedLine = line.trim();
|
|
134
|
+
if (trimmedLine.startsWith('[mcp_servers.')) {
|
|
135
|
+
if (inServerBlock) {
|
|
136
|
+
formattedLines.push(''); // Add blank line between servers
|
|
137
|
+
}
|
|
138
|
+
inServerBlock = true;
|
|
139
|
+
formattedLines.push(trimmedLine);
|
|
140
|
+
}
|
|
141
|
+
else if (trimmedLine) {
|
|
142
|
+
formattedLines.push(trimmedLine);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return formattedLines.join('\n') + '\n';
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Apply rules configuration to Codex CLI's TOML format
|
|
149
|
+
*/
|
|
150
|
+
async applyRulesConfig(configPath, rules, existingContent) {
|
|
151
|
+
let config = {};
|
|
152
|
+
// Parse existing TOML if present
|
|
153
|
+
if (existingContent.trim()) {
|
|
154
|
+
try {
|
|
155
|
+
config = TOML.parse(existingContent);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
// If parsing fails, start with empty config
|
|
159
|
+
config = {};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Add or update rules section
|
|
163
|
+
if (!config.rules) {
|
|
164
|
+
config.rules = {};
|
|
165
|
+
}
|
|
166
|
+
// Convert rule sections to TOML structure
|
|
167
|
+
for (const section of rules.sections) {
|
|
168
|
+
config.rules[section.templateId] = {
|
|
169
|
+
name: section.templateName,
|
|
170
|
+
rules: section.rules
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return this.formatTOMLRules(TOML.stringify(config));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Extract existing rule texts from TOML content
|
|
177
|
+
*/
|
|
178
|
+
extractExistingRules(content) {
|
|
179
|
+
try {
|
|
180
|
+
const config = TOML.parse(content);
|
|
181
|
+
const rules = [];
|
|
182
|
+
if (config.rules) {
|
|
183
|
+
for (const [key, value] of Object.entries(config.rules)) {
|
|
184
|
+
if (value.rules && Array.isArray(value.rules)) {
|
|
185
|
+
rules.push(...value.rules);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return rules;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Extract existing rule sections from TOML content
|
|
197
|
+
*/
|
|
198
|
+
extractExistingSections(content) {
|
|
199
|
+
try {
|
|
200
|
+
const config = TOML.parse(content);
|
|
201
|
+
const sections = [];
|
|
202
|
+
if (config.rules) {
|
|
203
|
+
for (const [key, value] of Object.entries(config.rules)) {
|
|
204
|
+
if (value.name && value.rules && Array.isArray(value.rules)) {
|
|
205
|
+
sections.push({
|
|
206
|
+
templateId: key,
|
|
207
|
+
templateName: value.name,
|
|
208
|
+
rules: value.rules
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return sections;
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
return [];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Generate rules content in TOML format
|
|
221
|
+
*/
|
|
222
|
+
generateRulesContent(sections) {
|
|
223
|
+
if (!sections || sections.length === 0) {
|
|
224
|
+
return '';
|
|
225
|
+
}
|
|
226
|
+
const config = { rules: {} };
|
|
227
|
+
for (const section of sections) {
|
|
228
|
+
config.rules[section.templateId] = {
|
|
229
|
+
name: section.templateName,
|
|
230
|
+
rules: section.rules
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
return this.formatTOMLRules(TOML.stringify(config));
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Format TOML output for rules with proper structure and comments
|
|
237
|
+
*/
|
|
238
|
+
formatTOMLRules(tomlString) {
|
|
239
|
+
const lines = tomlString.split('\n');
|
|
240
|
+
const formattedLines = [];
|
|
241
|
+
// Add header comment
|
|
242
|
+
formattedLines.push('# Codex CLI Configuration with Rules');
|
|
243
|
+
formattedLines.push('# Generated automatically by agentinit');
|
|
244
|
+
formattedLines.push('');
|
|
245
|
+
let inRulesSection = false;
|
|
246
|
+
for (const line of lines) {
|
|
247
|
+
const trimmedLine = line.trim();
|
|
248
|
+
if (trimmedLine.startsWith('[rules.')) {
|
|
249
|
+
if (inRulesSection) {
|
|
250
|
+
formattedLines.push(''); // Add blank line between rule sections
|
|
251
|
+
}
|
|
252
|
+
inRulesSection = true;
|
|
253
|
+
formattedLines.push(trimmedLine);
|
|
254
|
+
}
|
|
255
|
+
else if (trimmedLine) {
|
|
256
|
+
formattedLines.push(trimmedLine);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return formattedLines.join('\n') + '\n';
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=CodexCliAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexCliAgent.js","sourceRoot":"","sources":["../../src/agents/CodexCliAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Agent } from './Agent.js';
|
|
2
|
+
import type { MCPServerConfig } from '../types/index.js';
|
|
3
|
+
import type { AppliedRules, RuleSection } from '../types/rules.js';
|
|
4
|
+
/**
|
|
5
|
+
* Cursor IDE agent implementation
|
|
6
|
+
* Supports full MCP capabilities including stdio, HTTP, and SSE servers
|
|
7
|
+
* Native config: .cursor/mcp.json
|
|
8
|
+
*/
|
|
9
|
+
export declare class CursorAgent extends Agent {
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Apply MCP configuration to Cursor's native .cursor/mcp.json format
|
|
13
|
+
*/
|
|
14
|
+
applyMCPConfig(projectPath: string, servers: MCPServerConfig[]): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Cursor supports all MCP server types, so no filtering needed
|
|
17
|
+
*/
|
|
18
|
+
filterMCPServers(servers: MCPServerConfig[]): MCPServerConfig[];
|
|
19
|
+
/**
|
|
20
|
+
* Cursor doesn't need any transformations
|
|
21
|
+
*/
|
|
22
|
+
transformMCPServers(servers: MCPServerConfig[]): MCPServerConfig[];
|
|
23
|
+
/**
|
|
24
|
+
* Apply rules configuration to Cursor's .cursorrules format
|
|
25
|
+
*/
|
|
26
|
+
applyRulesConfig(configPath: string, rules: AppliedRules, existingContent: string): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Extract existing rule texts from .cursorrules content (ignoring headers and comments)
|
|
29
|
+
*/
|
|
30
|
+
extractExistingRules(content: string): string[];
|
|
31
|
+
/**
|
|
32
|
+
* Extract existing rule sections from .cursorrules content using # headers
|
|
33
|
+
*/
|
|
34
|
+
extractExistingSections(content: string): RuleSection[];
|
|
35
|
+
/**
|
|
36
|
+
* Generate rules content in Cursor's .cursorrules format
|
|
37
|
+
*/
|
|
38
|
+
generateRulesContent(sections: RuleSection[]): string;
|
|
39
|
+
/**
|
|
40
|
+
* Extract all rule texts from file content (ignoring headers and comments)
|
|
41
|
+
*/
|
|
42
|
+
private extractAllRuleTexts;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=CursorAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CursorAgent.d.ts","sourceRoot":"","sources":["../../src/agents/CursorAgent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,mBAAmB,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,KAAK;;IA2DpC;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DpF;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE;IAI/D;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE;IAIlE;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC;IA+BlB;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAI/C;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IAkCvD;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM;IAiBrD;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAc5B"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { Agent } from './Agent.js';
|
|
2
|
+
import { readFileIfExists, writeFile, ensureDirectoryExists } from '../utils/fs.js';
|
|
3
|
+
/**
|
|
4
|
+
* Cursor IDE agent implementation
|
|
5
|
+
* Supports full MCP capabilities including stdio, HTTP, and SSE servers
|
|
6
|
+
* Native config: .cursor/mcp.json
|
|
7
|
+
*/
|
|
8
|
+
export class CursorAgent extends Agent {
|
|
9
|
+
constructor() {
|
|
10
|
+
const definition = {
|
|
11
|
+
id: 'cursor',
|
|
12
|
+
name: 'Cursor IDE',
|
|
13
|
+
url: 'https://docs.cursor.com/context/model-context-protocol',
|
|
14
|
+
capabilities: {
|
|
15
|
+
mcp: {
|
|
16
|
+
stdio: true,
|
|
17
|
+
http: true,
|
|
18
|
+
sse: true
|
|
19
|
+
},
|
|
20
|
+
rules: true,
|
|
21
|
+
hooks: false,
|
|
22
|
+
commands: false,
|
|
23
|
+
subagents: false,
|
|
24
|
+
statusline: false
|
|
25
|
+
},
|
|
26
|
+
configFiles: [
|
|
27
|
+
{
|
|
28
|
+
path: '.cursor/rules',
|
|
29
|
+
purpose: 'rules',
|
|
30
|
+
format: 'markdown',
|
|
31
|
+
type: 'folder',
|
|
32
|
+
optional: true,
|
|
33
|
+
description: 'AI behavior rules directory with MDC files'
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
path: 'AGENTS.md',
|
|
37
|
+
purpose: 'rules',
|
|
38
|
+
format: 'markdown',
|
|
39
|
+
type: 'file',
|
|
40
|
+
optional: true,
|
|
41
|
+
description: 'Simple agent instructions in markdown format'
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
path: '.cursor/settings.json',
|
|
45
|
+
purpose: 'settings',
|
|
46
|
+
format: 'json',
|
|
47
|
+
type: 'file',
|
|
48
|
+
optional: true,
|
|
49
|
+
description: 'Cursor IDE preferences and settings'
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
path: '.cursor/mcp.json',
|
|
53
|
+
purpose: 'mcp',
|
|
54
|
+
format: 'json',
|
|
55
|
+
type: 'file',
|
|
56
|
+
optional: true,
|
|
57
|
+
description: 'Model Context Protocol server configurations'
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
nativeConfigPath: '.cursor/mcp.json',
|
|
61
|
+
globalConfigPath: '~/.cursor/mcp.json'
|
|
62
|
+
};
|
|
63
|
+
super(definition);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Apply MCP configuration to Cursor's native .cursor/mcp.json format
|
|
67
|
+
*/
|
|
68
|
+
async applyMCPConfig(projectPath, servers) {
|
|
69
|
+
const mcpConfigPath = this.getNativeMcpPath(projectPath);
|
|
70
|
+
// Ensure the directory exists
|
|
71
|
+
await ensureDirectoryExists(mcpConfigPath);
|
|
72
|
+
// Read existing configuration
|
|
73
|
+
const existingContent = await readFileIfExists(mcpConfigPath);
|
|
74
|
+
let existingConfig = { mcpServers: {} };
|
|
75
|
+
if (existingContent) {
|
|
76
|
+
try {
|
|
77
|
+
existingConfig = JSON.parse(existingContent);
|
|
78
|
+
if (!existingConfig.mcpServers) {
|
|
79
|
+
existingConfig.mcpServers = {};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.warn('Warning: Existing .cursor/mcp.json is invalid, creating new configuration');
|
|
84
|
+
existingConfig = { mcpServers: {} };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Convert our MCP server configs to Cursor's format
|
|
88
|
+
for (const server of servers) {
|
|
89
|
+
const cursorServer = {};
|
|
90
|
+
switch (server.type) {
|
|
91
|
+
case 'stdio':
|
|
92
|
+
if (server.command) {
|
|
93
|
+
cursorServer.command = server.command;
|
|
94
|
+
}
|
|
95
|
+
if (server.args && server.args.length > 0) {
|
|
96
|
+
cursorServer.args = server.args;
|
|
97
|
+
}
|
|
98
|
+
if (server.env && Object.keys(server.env).length > 0) {
|
|
99
|
+
cursorServer.env = server.env;
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
case 'http':
|
|
103
|
+
case 'sse':
|
|
104
|
+
if (server.url) {
|
|
105
|
+
cursorServer.url = server.url;
|
|
106
|
+
}
|
|
107
|
+
if (server.headers && Object.keys(server.headers).length > 0) {
|
|
108
|
+
cursorServer.headers = server.headers;
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
// Add or update the server in the config
|
|
113
|
+
existingConfig.mcpServers[server.name] = cursorServer;
|
|
114
|
+
}
|
|
115
|
+
// Write the updated configuration
|
|
116
|
+
const configJson = JSON.stringify(existingConfig, null, 2);
|
|
117
|
+
await writeFile(mcpConfigPath, configJson);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Cursor supports all MCP server types, so no filtering needed
|
|
121
|
+
*/
|
|
122
|
+
filterMCPServers(servers) {
|
|
123
|
+
return servers; // Cursor supports everything
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Cursor doesn't need any transformations
|
|
127
|
+
*/
|
|
128
|
+
transformMCPServers(servers) {
|
|
129
|
+
return servers; // No transformations needed
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Apply rules configuration to Cursor's .cursorrules format
|
|
133
|
+
*/
|
|
134
|
+
async applyRulesConfig(configPath, rules, existingContent) {
|
|
135
|
+
// Extract all existing rule texts (ignore section headers)
|
|
136
|
+
const existingRules = this.extractAllRuleTexts(existingContent);
|
|
137
|
+
// Filter new sections to only include rules that don't already exist
|
|
138
|
+
const filteredSections = rules.sections.map(section => ({
|
|
139
|
+
...section,
|
|
140
|
+
rules: section.rules.filter(rule => !existingRules.includes(rule))
|
|
141
|
+
})).filter(section => section.rules.length > 0); // Remove empty sections
|
|
142
|
+
if (filteredSections.length === 0) {
|
|
143
|
+
// No new rules to add
|
|
144
|
+
return existingContent;
|
|
145
|
+
}
|
|
146
|
+
// Append new sections to existing content
|
|
147
|
+
let content = existingContent;
|
|
148
|
+
if (content && !content.endsWith('\n')) {
|
|
149
|
+
content += '\n';
|
|
150
|
+
}
|
|
151
|
+
if (content) {
|
|
152
|
+
content += '\n';
|
|
153
|
+
}
|
|
154
|
+
// Add only the new sections with unique rules
|
|
155
|
+
const sectionsContent = this.generateRulesContent(filteredSections);
|
|
156
|
+
content += sectionsContent;
|
|
157
|
+
return content.trim() + '\n';
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Extract existing rule texts from .cursorrules content (ignoring headers and comments)
|
|
161
|
+
*/
|
|
162
|
+
extractExistingRules(content) {
|
|
163
|
+
return this.extractAllRuleTexts(content);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Extract existing rule sections from .cursorrules content using # headers
|
|
167
|
+
*/
|
|
168
|
+
extractExistingSections(content) {
|
|
169
|
+
const lines = content.split('\n');
|
|
170
|
+
const sections = [];
|
|
171
|
+
let currentSection = null;
|
|
172
|
+
for (const line of lines) {
|
|
173
|
+
const trimmed = line.trim();
|
|
174
|
+
// Check if it's a section header
|
|
175
|
+
if (trimmed.startsWith('#') && trimmed.includes(' ')) {
|
|
176
|
+
// Start new section
|
|
177
|
+
if (currentSection) {
|
|
178
|
+
sections.push(currentSection);
|
|
179
|
+
}
|
|
180
|
+
const sectionName = trimmed.replace(/^#\s*/, '');
|
|
181
|
+
currentSection = {
|
|
182
|
+
templateId: sectionName.toLowerCase().replace(/\s+/g, '_'),
|
|
183
|
+
templateName: sectionName,
|
|
184
|
+
rules: []
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
else if (currentSection && trimmed && !trimmed.startsWith('#')) {
|
|
188
|
+
// Add rule to current section
|
|
189
|
+
currentSection.rules.push(trimmed);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Add the last section
|
|
193
|
+
if (currentSection) {
|
|
194
|
+
sections.push(currentSection);
|
|
195
|
+
}
|
|
196
|
+
return sections;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Generate rules content in Cursor's .cursorrules format
|
|
200
|
+
*/
|
|
201
|
+
generateRulesContent(sections) {
|
|
202
|
+
let content = '';
|
|
203
|
+
if (sections && sections.length > 0) {
|
|
204
|
+
// Group rules by sections
|
|
205
|
+
for (const ruleSection of sections) {
|
|
206
|
+
content += `# ${ruleSection.templateName}\n`;
|
|
207
|
+
for (const rule of ruleSection.rules) {
|
|
208
|
+
content += `${rule}\n`;
|
|
209
|
+
}
|
|
210
|
+
content += '\n';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return content;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract all rule texts from file content (ignoring headers and comments)
|
|
217
|
+
*/
|
|
218
|
+
extractAllRuleTexts(content) {
|
|
219
|
+
const rules = [];
|
|
220
|
+
const lines = content.split('\n');
|
|
221
|
+
for (const line of lines) {
|
|
222
|
+
const trimmed = line.trim();
|
|
223
|
+
// Skip empty lines, headers (starting with #), and other comments
|
|
224
|
+
if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('//')) {
|
|
225
|
+
rules.push(trimmed);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return rules;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=CursorAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CursorAgent.js","sourceRoot":"","sources":["../../src/agents/CursorAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Agent } from './Agent.js';
|
|
2
|
+
import type { MCPServerConfig } from '../types/index.js';
|
|
3
|
+
import type { AppliedRules, RuleSection } from '../types/rules.js';
|
|
4
|
+
/**
|
|
5
|
+
* Droid (Factory) agent implementation
|
|
6
|
+
* Supports stdio MCP servers
|
|
7
|
+
* Uses ~/.factory for global configuration
|
|
8
|
+
* MCP config: ~/.factory/mcp.json
|
|
9
|
+
* Rules: AGENTS.md in project root
|
|
10
|
+
*/
|
|
11
|
+
export declare class DroidAgent extends Agent {
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Apply MCP configuration to Droid's ~/.factory/mcp.json format
|
|
15
|
+
* Droid stores configs globally regardless of project-level or global flag
|
|
16
|
+
*/
|
|
17
|
+
applyMCPConfig(projectPath: string, servers: MCPServerConfig[]): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Apply MCP configuration to Droid's global ~/.factory/mcp.json format
|
|
20
|
+
*/
|
|
21
|
+
applyGlobalMCPConfig(servers: MCPServerConfig[]): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Filter out non-stdio servers since Droid only supports stdio
|
|
24
|
+
*/
|
|
25
|
+
filterMCPServers(servers: MCPServerConfig[]): MCPServerConfig[];
|
|
26
|
+
/**
|
|
27
|
+
* Droid doesn't need any transformations for stdio servers
|
|
28
|
+
*/
|
|
29
|
+
transformMCPServers(servers: MCPServerConfig[]): MCPServerConfig[];
|
|
30
|
+
/**
|
|
31
|
+
* Apply rules configuration to AGENTS.md
|
|
32
|
+
*/
|
|
33
|
+
applyRulesConfig(configPath: string, rules: AppliedRules, existingContent: string): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Extract existing rule texts from AGENTS.md content
|
|
36
|
+
*/
|
|
37
|
+
extractExistingRules(content: string): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Extract existing rule sections from AGENTS.md content using ## headers
|
|
40
|
+
*/
|
|
41
|
+
extractExistingSections(content: string): RuleSection[];
|
|
42
|
+
/**
|
|
43
|
+
* Generate rules content in AGENTS.md markdown format
|
|
44
|
+
*/
|
|
45
|
+
generateRulesContent(sections: RuleSection[]): string;
|
|
46
|
+
/**
|
|
47
|
+
* Get existing MCP servers from Droid's ~/.factory/mcp.json configuration
|
|
48
|
+
* Droid uses global configuration, so we read from the global path
|
|
49
|
+
*/
|
|
50
|
+
getMCPServers(projectPath: string): Promise<MCPServerConfig[]>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=DroidAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DroidAgent.d.ts","sourceRoot":"","sources":["../../src/agents/DroidAgent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAkC,MAAM,mBAAmB,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,KAAK;;IAmCnC;;;OAGG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpF;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDrE;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE;IAI/D;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE;IAIlE;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC;IAiBlB;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAM/C;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IAmCvD;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM;IAiBrD;;;OAGG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CA4CrE"}
|