@patchen0518/agentbrew 1.0.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/dist/router.js ADDED
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Router = exports.ManagedClient = exports.ClientStatus = void 0;
4
+ exports.startRouter = startRouter;
5
+ const registry_1 = require("./registry");
6
+ const dispatcher_1 = require("./dispatcher");
7
+ const state_1 = require("./state");
8
+ const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
9
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
10
+ const index_js_2 = require("@modelcontextprotocol/sdk/server/index.js");
11
+ const stdio_js_2 = require("@modelcontextprotocol/sdk/server/stdio.js");
12
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
13
+ const logger_1 = require("./logger");
14
+ var ClientStatus;
15
+ (function (ClientStatus) {
16
+ ClientStatus["DISCONNECTED"] = "DISCONNECTED";
17
+ ClientStatus["CONNECTING"] = "CONNECTING";
18
+ ClientStatus["CONNECTED"] = "CONNECTED";
19
+ ClientStatus["RETRYING"] = "RETRYING";
20
+ ClientStatus["FAILED"] = "FAILED";
21
+ })(ClientStatus || (exports.ClientStatus = ClientStatus = {}));
22
+ class ManagedClient {
23
+ prefix;
24
+ pkgPath;
25
+ serverConfig;
26
+ client = null;
27
+ transport = null;
28
+ status = ClientStatus.DISCONNECTED;
29
+ retryCount = 0;
30
+ lastError = null;
31
+ maxRetries = 3;
32
+ connectingPromise = null;
33
+ constructor(prefix, pkgPath, serverConfig) {
34
+ this.prefix = prefix;
35
+ this.pkgPath = pkgPath;
36
+ this.serverConfig = serverConfig;
37
+ }
38
+ async spawnClient(wasRetrying) {
39
+ logger_1.Logger.info(`Starting MCP server for ${this.prefix}...`);
40
+ this.transport = new stdio_js_1.StdioClientTransport({
41
+ command: this.serverConfig.command,
42
+ args: this.serverConfig.args,
43
+ env: this.serverConfig.env,
44
+ stderr: 'inherit',
45
+ cwd: this.serverConfig.cwd || this.pkgPath,
46
+ });
47
+ this.client = new index_js_1.Client({ name: "agentbrew-client", version: "1.0.0" }, { capabilities: {} });
48
+ await this.client.connect(this.transport);
49
+ this.status = ClientStatus.CONNECTED;
50
+ if (!wasRetrying) {
51
+ this.retryCount = 0;
52
+ }
53
+ // Add exit handler:
54
+ this.transport.onclose = () => {
55
+ if (this.status !== ClientStatus.DISCONNECTED) {
56
+ this.handleCrash();
57
+ }
58
+ };
59
+ return this.client;
60
+ }
61
+ async getClient() {
62
+ if (this.status === ClientStatus.FAILED) {
63
+ throw new Error(`[AgentBrew] Server '${this.prefix}' failed after ${this.maxRetries} attempts. Last error: ${this.lastError}`);
64
+ }
65
+ if (this.client && this.status === ClientStatus.CONNECTED)
66
+ return this.client;
67
+ if (this.connectingPromise)
68
+ return this.connectingPromise;
69
+ this.status = ClientStatus.CONNECTING;
70
+ this.connectingPromise = (async () => {
71
+ try {
72
+ return await this.spawnClient(false);
73
+ }
74
+ catch (e) {
75
+ this.lastError = e.message;
76
+ throw e;
77
+ }
78
+ finally {
79
+ this.connectingPromise = null;
80
+ }
81
+ })();
82
+ return this.connectingPromise;
83
+ }
84
+ async handleCrash() {
85
+ if (this.status === ClientStatus.FAILED || this.status === ClientStatus.DISCONNECTED)
86
+ return;
87
+ this.status = ClientStatus.RETRYING;
88
+ if (this.retryCount < this.maxRetries) {
89
+ this.retryCount++;
90
+ const delay = Math.pow(2, this.retryCount) * 1000;
91
+ logger_1.Logger.info(`Server ${this.prefix} crashed. Retrying ${this.retryCount}/${this.maxRetries} in ${delay / 1000}s...`);
92
+ // Set connectingPromise to represent the wait delay + reconnect sequence
93
+ this.connectingPromise = (async () => {
94
+ await new Promise(resolve => setTimeout(resolve, delay));
95
+ try {
96
+ this.client = null;
97
+ this.transport = null;
98
+ return await this.spawnClient(true);
99
+ }
100
+ catch (e) {
101
+ this.lastError = e.message;
102
+ throw e;
103
+ }
104
+ finally {
105
+ this.connectingPromise = null;
106
+ }
107
+ })();
108
+ try {
109
+ await this.connectingPromise;
110
+ }
111
+ catch (e) {
112
+ // If the reconnect failed, trigger the next retry if still applicable
113
+ const currentStatus = this.status;
114
+ if (currentStatus !== ClientStatus.DISCONNECTED && currentStatus !== ClientStatus.FAILED) {
115
+ this.handleCrash();
116
+ }
117
+ }
118
+ }
119
+ else {
120
+ this.status = ClientStatus.FAILED;
121
+ logger_1.Logger.error(`Server ${this.prefix} failed permanently after ${this.maxRetries} attempts.`);
122
+ }
123
+ }
124
+ async stop() {
125
+ this.status = ClientStatus.DISCONNECTED;
126
+ if (this.client) {
127
+ logger_1.Logger.info(`Stopping MCP server for ${this.prefix}...`);
128
+ await this.client.close();
129
+ this.client = null;
130
+ this.transport = null;
131
+ }
132
+ }
133
+ isConnected() {
134
+ return this.status === ClientStatus.CONNECTED;
135
+ }
136
+ }
137
+ exports.ManagedClient = ManagedClient;
138
+ class Router {
139
+ managedClients = new Map();
140
+ localPrompts = new Map();
141
+ mcpServer;
142
+ dispatcher;
143
+ cachedTools = new Map();
144
+ cachedPrompts = new Map();
145
+ cachedResources = new Map();
146
+ cachedResourceTemplates = new Map();
147
+ constructor() {
148
+ this.dispatcher = new dispatcher_1.CapabilityDispatch(this.managedClients, this.localPrompts);
149
+ this.mcpServer = new index_js_2.Server({
150
+ name: "agentbrew-router",
151
+ version: "1.0.0",
152
+ }, {
153
+ capabilities: {
154
+ tools: {},
155
+ prompts: {},
156
+ resources: {},
157
+ },
158
+ });
159
+ this.setupMcpHandlers();
160
+ }
161
+ setupMcpHandlers() {
162
+ this.mcpServer.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
163
+ return { tools: this.dispatcher.listAllTools(this.cachedTools) };
164
+ });
165
+ this.mcpServer.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
166
+ const fullName = request.params.name;
167
+ const { prefix, name } = this.dispatcher.parseName(fullName);
168
+ const client = await this.dispatcher.getClient(prefix);
169
+ return await client.callTool({
170
+ name: name,
171
+ arguments: request.params.arguments
172
+ });
173
+ });
174
+ this.mcpServer.setRequestHandler(types_js_1.ListPromptsRequestSchema, async () => {
175
+ return { prompts: this.dispatcher.listAllPrompts(this.cachedPrompts) };
176
+ });
177
+ this.mcpServer.setRequestHandler(types_js_1.GetPromptRequestSchema, async (request) => {
178
+ return await this.dispatcher.getPrompt(request.params.name, request.params.arguments);
179
+ });
180
+ this.mcpServer.setRequestHandler(types_js_1.ListResourcesRequestSchema, async () => {
181
+ return { resources: this.dispatcher.listAllResources(this.cachedResources) };
182
+ });
183
+ this.mcpServer.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (request) => {
184
+ return await this.dispatcher.readResource(request.params.uri);
185
+ });
186
+ this.mcpServer.setRequestHandler(types_js_1.ListResourceTemplatesRequestSchema, async () => {
187
+ return { resourceTemplates: this.dispatcher.listAllResourceTemplates(this.cachedResourceTemplates) };
188
+ });
189
+ }
190
+ async start() {
191
+ logger_1.Logger.info("AgentBrew Router starting...");
192
+ const packages = (0, registry_1.discoverPackages)();
193
+ logger_1.Logger.info(`Discovered ${packages.length} packages.`);
194
+ for (const pkg of packages) {
195
+ this.registerPackage(pkg);
196
+ }
197
+ const transport = new stdio_js_2.StdioServerTransport();
198
+ await this.mcpServer.connect(transport);
199
+ logger_1.Logger.info("AgentBrew MCP Router connected via Stdio");
200
+ return true;
201
+ }
202
+ registerPackage(pkg) {
203
+ const pkgId = pkg.subPath ? `${pkg.packageName}/${pkg.subPath}` : pkg.packageName;
204
+ const cache = pkg.manifest;
205
+ if (pkg.manifest.servers) {
206
+ for (const server of pkg.manifest.servers) {
207
+ if (!(0, state_1.isPackageEnabled)(pkg.packageName, server.name))
208
+ continue;
209
+ const sanitizedPkgId = pkgId.replace(/\//g, '_').replace(/\\/g, '_');
210
+ const prefix = `${sanitizedPkgId}_${server.name}`;
211
+ const managed = new ManagedClient(prefix, pkg.path, server);
212
+ this.managedClients.set(prefix, managed);
213
+ if (cache.discovered) {
214
+ if (cache.discovered.tools?.[server.name]) {
215
+ this.cachedTools.set(prefix, cache.discovered.tools[server.name]);
216
+ }
217
+ if (cache.discovered.prompts?.[server.name]) {
218
+ this.cachedPrompts.set(prefix, cache.discovered.prompts[server.name]);
219
+ }
220
+ if (cache.discovered.resources?.[server.name]) {
221
+ const resources = cache.discovered.resources[server.name];
222
+ this.cachedResources.set(prefix, resources);
223
+ for (const resource of resources) {
224
+ const scopedUri = this.dispatcher.scopeUri(prefix, resource.uri);
225
+ this.dispatcher.addResourceMapping(scopedUri, prefix, resource.uri);
226
+ }
227
+ }
228
+ if (cache.discovered.resourceTemplates?.[server.name]) {
229
+ this.cachedResourceTemplates.set(prefix, cache.discovered.resourceTemplates[server.name]);
230
+ }
231
+ }
232
+ }
233
+ }
234
+ if (pkg.manifest.instructions) {
235
+ for (const instruction of pkg.manifest.instructions) {
236
+ const pkgId = pkg.subPath ? `${pkg.packageName}/${pkg.subPath}` : pkg.packageName;
237
+ const uri = `mcp://agentbrew/instructions/${pkgId}/${instruction.file}`;
238
+ this.dispatcher.addLocalResource(uri, {
239
+ pkgPath: pkg.path,
240
+ file: instruction.file
241
+ });
242
+ }
243
+ }
244
+ if (pkg.manifest.prompts) {
245
+ for (const prompt of pkg.manifest.prompts) {
246
+ if (!(0, state_1.isPackageEnabled)(pkg.packageName, prompt.name))
247
+ continue;
248
+ const prefix = this.dispatcher.scopeName(pkgId, prompt.name);
249
+ this.localPrompts.set(prefix, {
250
+ pkgPath: pkg.path,
251
+ file: prompt.file,
252
+ name: prompt.name,
253
+ description: prompt.description
254
+ });
255
+ }
256
+ }
257
+ }
258
+ async stop() {
259
+ for (const managed of this.managedClients.values()) {
260
+ await managed.stop();
261
+ }
262
+ this.managedClients.clear();
263
+ await this.mcpServer.close();
264
+ }
265
+ }
266
+ exports.Router = Router;
267
+ async function startRouter() {
268
+ const router = new Router();
269
+ await router.start();
270
+ return router;
271
+ }
272
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface AgentBrewState {
2
+ disabledPackages: string[];
3
+ }
4
+ export declare function loadState(): AgentBrewState;
5
+ export declare function saveState(state: AgentBrewState): void;
6
+ export declare function enablePackage(pkgName: string): boolean;
7
+ export declare function disablePackage(pkgName: string): boolean;
8
+ export declare function isPackageEnabled(pkgName: string, capabilityName?: string): boolean;
package/dist/state.js ADDED
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadState = loadState;
7
+ exports.saveState = saveState;
8
+ exports.enablePackage = enablePackage;
9
+ exports.disablePackage = disablePackage;
10
+ exports.isPackageEnabled = isPackageEnabled;
11
+ // src/state.ts
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const config_1 = require("./config");
14
+ function loadState() {
15
+ const stateFile = (0, config_1.getStateFile)();
16
+ if (!fs_1.default.existsSync(stateFile)) {
17
+ return { disabledPackages: [] };
18
+ }
19
+ try {
20
+ const data = fs_1.default.readFileSync(stateFile, 'utf-8');
21
+ return JSON.parse(data);
22
+ }
23
+ catch (err) {
24
+ return { disabledPackages: [] };
25
+ }
26
+ }
27
+ function saveState(state) {
28
+ const brewRoot = (0, config_1.getBrewRoot)();
29
+ const stateFile = (0, config_1.getStateFile)();
30
+ if (!fs_1.default.existsSync(brewRoot)) {
31
+ fs_1.default.mkdirSync(brewRoot, { recursive: true });
32
+ }
33
+ fs_1.default.writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf-8');
34
+ }
35
+ function enablePackage(pkgName) {
36
+ const state = loadState();
37
+ if (state.disabledPackages.includes(pkgName)) {
38
+ state.disabledPackages = state.disabledPackages.filter(p => p !== pkgName);
39
+ saveState(state);
40
+ return true;
41
+ }
42
+ return false; // already enabled
43
+ }
44
+ function disablePackage(pkgName) {
45
+ const state = loadState();
46
+ if (!state.disabledPackages.includes(pkgName)) {
47
+ state.disabledPackages.push(pkgName);
48
+ saveState(state);
49
+ return true;
50
+ }
51
+ return false; // already disabled
52
+ }
53
+ function isPackageEnabled(pkgName, capabilityName) {
54
+ const state = loadState();
55
+ if (state.disabledPackages.includes(pkgName)) {
56
+ return false;
57
+ }
58
+ if (capabilityName && state.disabledPackages.includes(`${pkgName}:${capabilityName}`)) {
59
+ return false;
60
+ }
61
+ return true;
62
+ }
63
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":";;;;;AAQA,8BAWC;AAED,8BAOC;AAED,sCAQC;AAED,wCAQC;AAED,4CASC;AA3DD,eAAe;AACf,4CAAoB;AACpB,qCAAqD;AAMrD,SAAgB,SAAS;IACvB,MAAM,SAAS,GAAG,IAAA,qBAAY,GAAE,CAAC;IACjC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAgB,SAAS,CAAC,KAAqB;IAC7C,MAAM,QAAQ,GAAG,IAAA,oBAAW,GAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAA,qBAAY,GAAE,CAAC;IACjC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,aAAa,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;QAC3E,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,kBAAkB;AAClC,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,mBAAmB;AACnC,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAe,EAAE,cAAuB;IACvE,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,cAAc,IAAI,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,OAAO,IAAI,cAAc,EAAE,CAAC,EAAE,CAAC;QACtF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function updatePackage(packageName: string): Promise<boolean>;
2
+ export declare function updateAllPackages(): Promise<void>;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.updatePackage = updatePackage;
7
+ exports.updateAllPackages = updateAllPackages;
8
+ const path_1 = __importDefault(require("path"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const simple_git_1 = __importDefault(require("simple-git"));
11
+ const config_1 = require("./config");
12
+ const logger_1 = require("./logger");
13
+ const installer_1 = require("./installer");
14
+ const registry_1 = require("./registry");
15
+ async function updatePackage(packageName) {
16
+ const packagesDir = (0, config_1.getPackagesDir)();
17
+ const pkgPath = path_1.default.join(packagesDir, packageName);
18
+ if (!fs_1.default.existsSync(pkgPath)) {
19
+ throw new Error(`Package '${packageName}' not found at ${pkgPath}`);
20
+ }
21
+ if (!fs_1.default.existsSync(path_1.default.join(pkgPath, '.git'))) {
22
+ logger_1.Logger.info(`Skipping '${packageName}': Not a Git-managed package.`);
23
+ return false;
24
+ }
25
+ const git = (0, simple_git_1.default)(pkgPath);
26
+ const remotes = await git.getRemotes();
27
+ if (remotes.length === 0) {
28
+ logger_1.Logger.info(`Skipping '${packageName}': No remotes configured.`);
29
+ return false;
30
+ }
31
+ logger_1.Logger.info(`Checking for updates for '${packageName}'...`);
32
+ await git.fetch();
33
+ const status = await git.status();
34
+ const hasModifiedTrackedFiles = (status.modified && status.modified.length > 0) ||
35
+ (status.deleted && status.deleted.length > 0) ||
36
+ (status.staged && status.staged.length > 0);
37
+ if (hasModifiedTrackedFiles) {
38
+ throw new Error('Local changes detected in tracked files.');
39
+ }
40
+ const localHead = await git.revparse(['HEAD']);
41
+ const remoteHead = await git.revparse(['@{u}']);
42
+ if (localHead === remoteHead) {
43
+ logger_1.Logger.info(`Package '${packageName}' is already up to date.`);
44
+ return false;
45
+ }
46
+ logger_1.Logger.info(`Updating '${packageName}'...`);
47
+ try {
48
+ await git.pull(['--ff-only']);
49
+ }
50
+ catch (error) {
51
+ throw new Error('Branches have diverged. Manual intervention required.');
52
+ }
53
+ // Re-provision
54
+ await (0, installer_1.resolveDependencies)(pkgPath);
55
+ const manifests = (0, registry_1.findManifests)(pkgPath, 2);
56
+ for (const m of manifests) {
57
+ await (0, registry_1.generateMcpManifest)(m.path, m.manifest);
58
+ }
59
+ logger_1.Logger.info(`Successfully updated '${packageName}'.`);
60
+ return true;
61
+ }
62
+ async function updateAllPackages() {
63
+ const packagesDir = (0, config_1.getPackagesDir)();
64
+ if (!fs_1.default.existsSync(packagesDir))
65
+ return;
66
+ const dirs = fs_1.default.readdirSync(packagesDir);
67
+ for (const dir of dirs) {
68
+ try {
69
+ await updatePackage(dir);
70
+ }
71
+ catch (e) {
72
+ logger_1.Logger.error(`Failed to update '${dir}': ${e.message}`);
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@patchen0518/agentbrew",
3
+ "version": "1.0.0",
4
+ "description": "The Universal Hub and Multiplexer for AI Agent MCP Servers and Skills",
5
+ "main": "dist/cli.js",
6
+ "bin": {
7
+ "agentbrew": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "test": "jest",
17
+ "start": "ts-node src/cli.ts",
18
+ "prepublishOnly": "npm run build && npm test"
19
+ },
20
+ "keywords": [
21
+ "mcp",
22
+ "modelcontextprotocol",
23
+ "ai-agents",
24
+ "claude-code",
25
+ "gemini-cli",
26
+ "cursor",
27
+ "multiplexer"
28
+ ],
29
+ "author": "Patrick Chen",
30
+ "license": "MIT",
31
+ "type": "commonjs",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/patchen0518/AgentBrew.git"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/patchen0518/AgentBrew/issues"
38
+ },
39
+ "homepage": "https://github.com/patchen0518/AgentBrew#readme",
40
+ "devDependencies": {
41
+ "@types/commander": "^2.12.0",
42
+ "@types/jest": "^30.0.0",
43
+ "@types/node": "^25.9.1",
44
+ "jest": "^30.4.2",
45
+ "ts-jest": "^29.4.11",
46
+ "ts-node": "^10.9.2",
47
+ "typescript": "^6.0.3"
48
+ },
49
+ "dependencies": {
50
+ "@modelcontextprotocol/sdk": "^1.29.0",
51
+ "commander": "^14.0.3",
52
+ "simple-git": "^3.36.0",
53
+ "smol-toml": "^1.6.1"
54
+ }
55
+ }