xibecode 0.0.2 → 0.0.4
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 +192 -2
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +52 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +168 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/mcp.d.ts +11 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +217 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/punycode.d.ts +5 -0
- package/dist/commands/punycode.d.ts.map +1 -0
- package/dist/commands/punycode.js +48 -0
- package/dist/commands/punycode.js.map +1 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +24 -0
- package/dist/commands/run.js.map +1 -1
- package/dist/core/agent.d.ts +5 -1
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +317 -11
- package/dist/core/agent.js.map +1 -1
- package/dist/core/mcp-client.d.ts +80 -0
- package/dist/core/mcp-client.d.ts.map +1 -0
- package/dist/core/mcp-client.js +250 -0
- package/dist/core/mcp-client.js.map +1 -0
- package/dist/core/modes.d.ts +125 -0
- package/dist/core/modes.d.ts.map +1 -0
- package/dist/core/modes.js +459 -0
- package/dist/core/modes.js.map +1 -0
- package/dist/core/tools.d.ts +3 -0
- package/dist/core/tools.d.ts.map +1 -1
- package/dist/core/tools.js +32 -1
- package/dist/core/tools.js.map +1 -1
- package/dist/index.js +43 -2
- package/dist/index.js.map +1 -1
- package/dist/ui/enhanced-tui.d.ts.map +1 -1
- package/dist/ui/enhanced-tui.js +1 -19
- package/dist/ui/enhanced-tui.js.map +1 -1
- package/dist/utils/config.d.ts +40 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +80 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/mcp-servers-file.d.ts +39 -0
- package/dist/utils/mcp-servers-file.d.ts.map +1 -0
- package/dist/utils/mcp-servers-file.js +160 -0
- package/dist/utils/mcp-servers-file.js.map +1 -0
- package/package.json +10 -8
package/dist/utils/config.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import Conf from 'conf';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import * as os from 'os';
|
|
4
|
+
import { MCPServersFileManager } from './mcp-servers-file.js';
|
|
4
5
|
export class ConfigManager {
|
|
5
6
|
store;
|
|
6
7
|
configPath;
|
|
8
|
+
mcpFileManager;
|
|
7
9
|
constructor() {
|
|
8
10
|
this.configPath = path.join(os.homedir(), '.xibecode');
|
|
11
|
+
this.mcpFileManager = new MCPServersFileManager();
|
|
9
12
|
this.store = new Conf({
|
|
10
13
|
projectName: 'xibecode',
|
|
11
14
|
cwd: this.configPath,
|
|
@@ -17,6 +20,7 @@ export class ConfigManager {
|
|
|
17
20
|
enableDryRunByDefault: false,
|
|
18
21
|
gitCheckpointStrategy: 'stash',
|
|
19
22
|
plugins: [],
|
|
23
|
+
mcpServers: [],
|
|
20
24
|
},
|
|
21
25
|
});
|
|
22
26
|
}
|
|
@@ -144,5 +148,81 @@ export class ConfigManager {
|
|
|
144
148
|
'Config Path': this.getConfigPath(),
|
|
145
149
|
};
|
|
146
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Get all MCP server configurations
|
|
153
|
+
* Loads from mcp-servers.json file first, falls back to config store
|
|
154
|
+
*/
|
|
155
|
+
async getMCPServers() {
|
|
156
|
+
try {
|
|
157
|
+
// Try to load from file first
|
|
158
|
+
const fileServers = await this.mcpFileManager.loadMCPServers();
|
|
159
|
+
if (fileServers.length > 0 || await this.mcpFileManager.fileExists()) {
|
|
160
|
+
return fileServers;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
// If file has errors, fall back to config store
|
|
165
|
+
console.warn(`Warning: Failed to load MCP servers from file, using config store: ${error instanceof Error ? error.message : String(error)}`);
|
|
166
|
+
}
|
|
167
|
+
// Fall back to config store
|
|
168
|
+
return this.get('mcpServers') || [];
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get MCP servers synchronously (for backward compatibility)
|
|
172
|
+
* Uses config store only
|
|
173
|
+
*/
|
|
174
|
+
getMCPServersSync() {
|
|
175
|
+
return this.get('mcpServers') || [];
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get MCP servers file manager
|
|
179
|
+
*/
|
|
180
|
+
getMCPServersFileManager() {
|
|
181
|
+
return this.mcpFileManager;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Add an MCP server configuration
|
|
185
|
+
*/
|
|
186
|
+
addMCPServer(serverConfig) {
|
|
187
|
+
const servers = this.getMCPServersSync();
|
|
188
|
+
// Check if server with same name already exists
|
|
189
|
+
if (servers.some(s => s.name === serverConfig.name)) {
|
|
190
|
+
throw new Error(`MCP server with name "${serverConfig.name}" already exists`);
|
|
191
|
+
}
|
|
192
|
+
servers.push(serverConfig);
|
|
193
|
+
this.set('mcpServers', servers);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Remove an MCP server configuration
|
|
197
|
+
*/
|
|
198
|
+
removeMCPServer(serverName) {
|
|
199
|
+
const servers = this.getMCPServersSync();
|
|
200
|
+
const filtered = servers.filter(s => s.name !== serverName);
|
|
201
|
+
if (filtered.length === servers.length) {
|
|
202
|
+
return false; // Server not found
|
|
203
|
+
}
|
|
204
|
+
this.set('mcpServers', filtered);
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get a specific MCP server configuration
|
|
209
|
+
*/
|
|
210
|
+
getMCPServer(serverName) {
|
|
211
|
+
const servers = this.getMCPServersSync();
|
|
212
|
+
return servers.find(s => s.name === serverName);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Update an MCP server configuration
|
|
216
|
+
*/
|
|
217
|
+
updateMCPServer(serverName, updates) {
|
|
218
|
+
const servers = this.getMCPServersSync();
|
|
219
|
+
const index = servers.findIndex(s => s.name === serverName);
|
|
220
|
+
if (index === -1) {
|
|
221
|
+
return false; // Server not found
|
|
222
|
+
}
|
|
223
|
+
servers[index] = { ...servers[index], ...updates };
|
|
224
|
+
this.set('mcpServers', servers);
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
147
227
|
}
|
|
148
228
|
//# sourceMappingURL=config.js.map
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { MCPServerConfig } from './config.js';
|
|
2
|
+
export interface MCPServersFile {
|
|
3
|
+
servers: MCPServerConfig[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Manages MCP servers configuration file
|
|
7
|
+
*/
|
|
8
|
+
export declare class MCPServersFileManager {
|
|
9
|
+
private filePath;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Get the path to the MCP servers config file
|
|
13
|
+
*/
|
|
14
|
+
getFilePath(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Check if the file exists
|
|
17
|
+
*/
|
|
18
|
+
fileExists(): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Load MCP servers from file
|
|
21
|
+
*/
|
|
22
|
+
loadMCPServers(): Promise<MCPServerConfig[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Save MCP servers to file
|
|
25
|
+
*/
|
|
26
|
+
saveMCPServers(servers: MCPServerConfig[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Create default config file with examples
|
|
29
|
+
*/
|
|
30
|
+
createDefaultFile(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Validate the file format
|
|
33
|
+
*/
|
|
34
|
+
validateFile(): Promise<{
|
|
35
|
+
valid: boolean;
|
|
36
|
+
errors: string[];
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=mcp-servers-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-servers-file.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-servers-file.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;;IAOzB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IASpC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAmClD;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/D;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBxC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAuDpE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
/**
|
|
5
|
+
* Manages MCP servers configuration file
|
|
6
|
+
*/
|
|
7
|
+
export class MCPServersFileManager {
|
|
8
|
+
filePath;
|
|
9
|
+
constructor() {
|
|
10
|
+
const configDir = path.join(os.homedir(), '.xibecode');
|
|
11
|
+
this.filePath = path.join(configDir, 'mcp-servers.json');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the path to the MCP servers config file
|
|
15
|
+
*/
|
|
16
|
+
getFilePath() {
|
|
17
|
+
return this.filePath;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if the file exists
|
|
21
|
+
*/
|
|
22
|
+
async fileExists() {
|
|
23
|
+
try {
|
|
24
|
+
await fs.access(this.filePath);
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load MCP servers from file
|
|
33
|
+
*/
|
|
34
|
+
async loadMCPServers() {
|
|
35
|
+
try {
|
|
36
|
+
if (!(await this.fileExists())) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const content = await fs.readFile(this.filePath, 'utf-8');
|
|
40
|
+
const data = JSON.parse(content);
|
|
41
|
+
// Validate structure
|
|
42
|
+
if (!data.servers || !Array.isArray(data.servers)) {
|
|
43
|
+
throw new Error('Invalid file format: "servers" must be an array');
|
|
44
|
+
}
|
|
45
|
+
// Validate each server
|
|
46
|
+
const validatedServers = [];
|
|
47
|
+
for (const server of data.servers) {
|
|
48
|
+
if (!server.name || !server.transport || !server.command) {
|
|
49
|
+
throw new Error(`Invalid server config: missing required fields (name, transport, command)`);
|
|
50
|
+
}
|
|
51
|
+
if (server.transport !== 'stdio') {
|
|
52
|
+
throw new Error(`Invalid transport type: only "stdio" is supported`);
|
|
53
|
+
}
|
|
54
|
+
validatedServers.push(server);
|
|
55
|
+
}
|
|
56
|
+
return validatedServers;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error.code === 'ENOENT') {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`Failed to load MCP servers file: ${error.message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Save MCP servers to file
|
|
67
|
+
*/
|
|
68
|
+
async saveMCPServers(servers) {
|
|
69
|
+
try {
|
|
70
|
+
const configDir = path.dirname(this.filePath);
|
|
71
|
+
// Ensure directory exists
|
|
72
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
73
|
+
const data = {
|
|
74
|
+
servers,
|
|
75
|
+
};
|
|
76
|
+
await fs.writeFile(this.filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new Error(`Failed to save MCP servers file: ${error.message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Create default config file with examples
|
|
84
|
+
*/
|
|
85
|
+
async createDefaultFile() {
|
|
86
|
+
const defaultServers = [
|
|
87
|
+
{
|
|
88
|
+
name: 'filesystem',
|
|
89
|
+
transport: 'stdio',
|
|
90
|
+
command: 'mcp-server-filesystem',
|
|
91
|
+
args: ['--root', '/path/to/files'],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'github',
|
|
95
|
+
transport: 'stdio',
|
|
96
|
+
command: 'mcp-server-github',
|
|
97
|
+
args: ['--token', 'YOUR_GITHUB_TOKEN'],
|
|
98
|
+
},
|
|
99
|
+
];
|
|
100
|
+
await this.saveMCPServers(defaultServers);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Validate the file format
|
|
104
|
+
*/
|
|
105
|
+
async validateFile() {
|
|
106
|
+
const errors = [];
|
|
107
|
+
try {
|
|
108
|
+
if (!(await this.fileExists())) {
|
|
109
|
+
return { valid: false, errors: ['File does not exist'] };
|
|
110
|
+
}
|
|
111
|
+
const content = await fs.readFile(this.filePath, 'utf-8');
|
|
112
|
+
let data;
|
|
113
|
+
try {
|
|
114
|
+
data = JSON.parse(content);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
errors.push(`Invalid JSON: ${error.message}`);
|
|
118
|
+
return { valid: false, errors };
|
|
119
|
+
}
|
|
120
|
+
if (!data.servers) {
|
|
121
|
+
errors.push('Missing "servers" field');
|
|
122
|
+
}
|
|
123
|
+
else if (!Array.isArray(data.servers)) {
|
|
124
|
+
errors.push('"servers" must be an array');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Validate each server
|
|
128
|
+
data.servers.forEach((server, index) => {
|
|
129
|
+
if (!server.name) {
|
|
130
|
+
errors.push(`Server ${index + 1}: missing "name"`);
|
|
131
|
+
}
|
|
132
|
+
if (!server.transport) {
|
|
133
|
+
errors.push(`Server ${index + 1}: missing "transport"`);
|
|
134
|
+
}
|
|
135
|
+
else if (server.transport !== 'stdio') {
|
|
136
|
+
errors.push(`Server ${index + 1}: invalid transport "${server.transport}" (only "stdio" supported)`);
|
|
137
|
+
}
|
|
138
|
+
if (!server.command) {
|
|
139
|
+
errors.push(`Server ${index + 1}: missing "command"`);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// Check for duplicate names
|
|
143
|
+
const names = data.servers.map(s => s.name).filter(Boolean);
|
|
144
|
+
const duplicates = names.filter((name, index) => names.indexOf(name) !== index);
|
|
145
|
+
if (duplicates.length > 0) {
|
|
146
|
+
errors.push(`Duplicate server names: ${[...new Set(duplicates)].join(', ')}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
valid: errors.length === 0,
|
|
151
|
+
errors,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
errors.push(`Failed to read file: ${error.message}`);
|
|
156
|
+
return { valid: false, errors };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=mcp-servers-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-servers-file.js","sourceRoot":"","sources":["../../src/utils/mcp-servers-file.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xibecode",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "AI-powered autonomous coding assistant with test integration, git awareness, and plugin support",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -31,23 +31,25 @@
|
|
|
31
31
|
"homepage": "https://github.com/yourusername/xibecode#readme",
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@anthropic-ai/sdk": "^0.32.1",
|
|
34
|
-
"
|
|
34
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
35
35
|
"chalk": "^5.3.0",
|
|
36
|
-
"
|
|
37
|
-
"inquirer": "^9.2.12",
|
|
38
|
-
"dotenv": "^16.3.1",
|
|
36
|
+
"commander": "^12.0.0",
|
|
39
37
|
"conf": "^12.0.0",
|
|
40
38
|
"diff": "^5.1.0",
|
|
39
|
+
"dotenv": "^16.3.1",
|
|
41
40
|
"fast-glob": "^3.3.2",
|
|
41
|
+
"inquirer": "^9.2.12",
|
|
42
42
|
"node-fetch": "^3.3.2",
|
|
43
|
-
"
|
|
43
|
+
"ora": "^8.0.1",
|
|
44
|
+
"strip-ansi": "^7.1.0",
|
|
45
|
+
"zod": "^4.3.6"
|
|
44
46
|
},
|
|
45
47
|
"devDependencies": {
|
|
46
|
-
"@types/node": "^20.10.0",
|
|
47
48
|
"@types/diff": "^5.0.8",
|
|
48
49
|
"@types/inquirer": "^9.0.7",
|
|
49
|
-
"
|
|
50
|
+
"@types/node": "^20.10.0",
|
|
50
51
|
"tsx": "^4.7.0",
|
|
52
|
+
"typescript": "^5.3.3",
|
|
51
53
|
"vitest": "^1.0.4"
|
|
52
54
|
},
|
|
53
55
|
"engines": {
|