cat-gemini-mcp 1.2.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.
Files changed (75) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +192 -0
  3. package/dist/constants.d.ts +74 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +73 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +188 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  12. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  13. package/dist/tools/ask-gemini.tool.js +36 -0
  14. package/dist/tools/ask-gemini.tool.js.map +1 -0
  15. package/dist/tools/brainstorm.tool.d.ts +3 -0
  16. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  17. package/dist/tools/brainstorm.tool.js +136 -0
  18. package/dist/tools/brainstorm.tool.js.map +1 -0
  19. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  20. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  21. package/dist/tools/fetch-chunk.tool.js +62 -0
  22. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  23. package/dist/tools/index.d.ts +2 -0
  24. package/dist/tools/index.d.ts.map +1 -0
  25. package/dist/tools/index.js +10 -0
  26. package/dist/tools/index.js.map +1 -0
  27. package/dist/tools/registry.d.ts +25 -0
  28. package/dist/tools/registry.d.ts.map +1 -0
  29. package/dist/tools/registry.js +80 -0
  30. package/dist/tools/registry.js.map +1 -0
  31. package/dist/tools/simple-tools.d.ts +4 -0
  32. package/dist/tools/simple-tools.d.ts.map +1 -0
  33. package/dist/tools/simple-tools.js +32 -0
  34. package/dist/tools/simple-tools.js.map +1 -0
  35. package/dist/tools/test-tool.example.d.ts +13 -0
  36. package/dist/tools/test-tool.example.d.ts.map +1 -0
  37. package/dist/tools/test-tool.example.js +32 -0
  38. package/dist/tools/test-tool.example.js.map +1 -0
  39. package/dist/tools/timeout-test.tool.d.ts +3 -0
  40. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  41. package/dist/tools/timeout-test.tool.js +32 -0
  42. package/dist/tools/timeout-test.tool.js.map +1 -0
  43. package/dist/utils/changeModeChunker.d.ts +11 -0
  44. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  45. package/dist/utils/changeModeChunker.js +89 -0
  46. package/dist/utils/changeModeChunker.js.map +1 -0
  47. package/dist/utils/changeModeParser.d.ts +15 -0
  48. package/dist/utils/changeModeParser.d.ts.map +1 -0
  49. package/dist/utils/changeModeParser.js +67 -0
  50. package/dist/utils/changeModeParser.js.map +1 -0
  51. package/dist/utils/changeModeTranslator.d.ts +8 -0
  52. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  53. package/dist/utils/changeModeTranslator.js +70 -0
  54. package/dist/utils/changeModeTranslator.js.map +1 -0
  55. package/dist/utils/chunkCache.d.ts +22 -0
  56. package/dist/utils/chunkCache.d.ts.map +1 -0
  57. package/dist/utils/chunkCache.js +161 -0
  58. package/dist/utils/chunkCache.js.map +1 -0
  59. package/dist/utils/commandExecutor.d.ts +2 -0
  60. package/dist/utils/commandExecutor.d.ts.map +1 -0
  61. package/dist/utils/commandExecutor.js +77 -0
  62. package/dist/utils/commandExecutor.js.map +1 -0
  63. package/dist/utils/geminiExecutor.d.ts +3 -0
  64. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  65. package/dist/utils/geminiExecutor.js +181 -0
  66. package/dist/utils/geminiExecutor.js.map +1 -0
  67. package/dist/utils/logger.d.ts +13 -0
  68. package/dist/utils/logger.d.ts.map +1 -0
  69. package/dist/utils/logger.js +42 -0
  70. package/dist/utils/logger.js.map +1 -0
  71. package/dist/utils/timeoutManager.d.ts +2 -0
  72. package/dist/utils/timeoutManager.d.ts.map +1 -0
  73. package/dist/utils/timeoutManager.js +2 -0
  74. package/dist/utils/timeoutManager.js.map +1 -0
  75. package/package.json +71 -0
@@ -0,0 +1,181 @@
1
+ import { executeCommand } from './commandExecutor.js';
2
+ import { Logger } from './logger.js';
3
+ import { ERROR_MESSAGES, STATUS_MESSAGES, MODELS, CLI } from '../constants.js';
4
+ import { parseChangeModeOutput, validateChangeModeEdits } from './changeModeParser.js';
5
+ import { formatChangeModeResponse, summarizeChangeModeEdits } from './changeModeTranslator.js';
6
+ import { chunkChangeModeEdits } from './changeModeChunker.js';
7
+ import { cacheChunks, getChunks } from './chunkCache.js';
8
+ /**
9
+ * Get the default model from environment variable or fallback to constant.
10
+ * Supports GEMINI_DEFAULT_MODEL or DEFAULT_MODEL environment variables.
11
+ */
12
+ function getDefaultModel() {
13
+ return process.env.GEMINI_DEFAULT_MODEL || process.env.DEFAULT_MODEL || MODELS.PRO;
14
+ }
15
+ export async function executeGeminiCLI(prompt, model, sandbox, changeMode, onProgress) {
16
+ let prompt_processed = prompt;
17
+ if (changeMode) {
18
+ prompt_processed = prompt.replace(/file:(\S+)/g, '@$1');
19
+ const changeModeInstructions = `
20
+ [CHANGEMODE INSTRUCTIONS]
21
+ You are generating code modifications that will be processed by an automated system. The output format is critical because it enables programmatic application of changes without human intervention.
22
+
23
+ INSTRUCTIONS:
24
+ 1. Analyze each provided file thoroughly
25
+ 2. Identify locations requiring changes based on the user request
26
+ 3. For each change, output in the exact format specified
27
+ 4. The OLD section must be EXACTLY what appears in the file (copy-paste exact match)
28
+ 5. Provide complete, directly replacing code blocks
29
+ 6. Verify line numbers are accurate
30
+
31
+ CRITICAL REQUIREMENTS:
32
+ 1. Output edits in the EXACT format specified below - no deviations
33
+ 2. The OLD string MUST be findable with Ctrl+F - it must be a unique, exact match
34
+ 3. Include enough surrounding lines to make the OLD string unique
35
+ 4. If a string appears multiple times (like </div>), include enough context lines above and below to make it unique
36
+ 5. Copy the OLD content EXACTLY as it appears - including all whitespace, indentation, line breaks
37
+ 6. Never use partial lines - always include complete lines from start to finish
38
+
39
+ OUTPUT FORMAT (follow exactly):
40
+ **FILE: [filename]:[line_number]**
41
+ \`\`\`
42
+ OLD:
43
+ [exact code to be replaced - must match file content precisely]
44
+ NEW:
45
+ [new code to insert - complete and functional]
46
+ \`\`\`
47
+
48
+ EXAMPLE 1 - Simple unique match:
49
+ **FILE: src/utils/helper.js:100**
50
+ \`\`\`
51
+ OLD:
52
+ function getMessage() {
53
+ return "Hello World";
54
+ }
55
+ NEW:
56
+ function getMessage() {
57
+ return "Hello Universe!";
58
+ }
59
+ \`\`\`
60
+
61
+ EXAMPLE 2 - Common tag needing context:
62
+ **FILE: index.html:245**
63
+ \`\`\`
64
+ OLD:
65
+ </div>
66
+ </div>
67
+ </section>
68
+ NEW:
69
+ </div>
70
+ </footer>
71
+ </section>
72
+ \`\`\`
73
+
74
+ IMPORTANT: The OLD section must be an EXACT copy from the file that can be found with Ctrl+F!
75
+
76
+ USER REQUEST:
77
+ ${prompt_processed}
78
+ `;
79
+ prompt_processed = changeModeInstructions;
80
+ }
81
+ const args = [];
82
+ // Use environment variable default if no model specified
83
+ const effectiveModel = model || getDefaultModel();
84
+ if (effectiveModel) {
85
+ args.push(CLI.FLAGS.MODEL, effectiveModel);
86
+ }
87
+ if (sandbox) {
88
+ args.push(CLI.FLAGS.SANDBOX);
89
+ }
90
+ // Ensure @ symbols work cross-platform by wrapping in quotes if needed
91
+ const finalPrompt = prompt_processed.includes('@') && !prompt_processed.startsWith('"')
92
+ ? `"${prompt_processed}"`
93
+ : prompt_processed;
94
+ // Use positional argument instead of deprecated -p flag (Gemini CLI v0.23.0+)
95
+ args.push(finalPrompt);
96
+ try {
97
+ return await executeCommand(CLI.COMMANDS.GEMINI, args, onProgress);
98
+ }
99
+ catch (error) {
100
+ const errorMessage = error instanceof Error ? error.message : String(error);
101
+ if (errorMessage.includes(ERROR_MESSAGES.QUOTA_EXCEEDED) && model !== MODELS.FLASH) {
102
+ Logger.warn(`${ERROR_MESSAGES.QUOTA_EXCEEDED}. Falling back to ${MODELS.FLASH}.`);
103
+ await sendStatusMessage(STATUS_MESSAGES.FLASH_RETRY);
104
+ const fallbackArgs = [];
105
+ fallbackArgs.push(CLI.FLAGS.MODEL, MODELS.FLASH);
106
+ if (sandbox) {
107
+ fallbackArgs.push(CLI.FLAGS.SANDBOX);
108
+ }
109
+ // Same @ symbol handling for fallback
110
+ const fallbackPrompt = prompt_processed.includes('@') && !prompt_processed.startsWith('"')
111
+ ? `"${prompt_processed}"`
112
+ : prompt_processed;
113
+ // Use positional argument instead of deprecated -p flag (Gemini CLI v0.23.0+)
114
+ fallbackArgs.push(fallbackPrompt);
115
+ try {
116
+ const result = await executeCommand(CLI.COMMANDS.GEMINI, fallbackArgs, onProgress);
117
+ Logger.warn(`Successfully executed with ${MODELS.FLASH} fallback.`);
118
+ await sendStatusMessage(STATUS_MESSAGES.FLASH_SUCCESS);
119
+ return result;
120
+ }
121
+ catch (fallbackError) {
122
+ const fallbackErrorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
123
+ throw new Error(`${MODELS.PRO} quota exceeded, ${MODELS.FLASH} fallback also failed: ${fallbackErrorMessage}`);
124
+ }
125
+ }
126
+ else {
127
+ throw error;
128
+ }
129
+ }
130
+ }
131
+ export async function processChangeModeOutput(rawResult, chunkIndex, chunkCacheKey, prompt) {
132
+ // Check for cached chunks first
133
+ if (chunkIndex && chunkCacheKey) {
134
+ const cachedChunks = getChunks(chunkCacheKey);
135
+ if (cachedChunks && chunkIndex > 0 && chunkIndex <= cachedChunks.length) {
136
+ Logger.debug(`Using cached chunk ${chunkIndex} of ${cachedChunks.length}`);
137
+ const chunk = cachedChunks[chunkIndex - 1];
138
+ let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: cachedChunks.length, cacheKey: chunkCacheKey });
139
+ // Add summary for first chunk only
140
+ if (chunkIndex === 1 && chunk.edits.length > 5) {
141
+ const allEdits = cachedChunks.flatMap(c => c.edits);
142
+ result = summarizeChangeModeEdits(allEdits) + '\n\n' + result;
143
+ }
144
+ return result;
145
+ }
146
+ Logger.debug(`Cache miss or invalid chunk index, processing new result`);
147
+ }
148
+ // Parse OLD/NEW format
149
+ const edits = parseChangeModeOutput(rawResult);
150
+ if (edits.length === 0) {
151
+ return `No edits found in Gemini's response. Please ensure Gemini uses the OLD/NEW format. \n\n+ ${rawResult}`;
152
+ }
153
+ // Validate edits
154
+ const validation = validateChangeModeEdits(edits);
155
+ if (!validation.valid) {
156
+ return `Edit validation failed:\n${validation.errors.join('\n')}`;
157
+ }
158
+ const chunks = chunkChangeModeEdits(edits);
159
+ // Cache if multiple chunks and we have the original prompt
160
+ let cacheKey;
161
+ if (chunks.length > 1 && prompt) {
162
+ cacheKey = cacheChunks(prompt, chunks);
163
+ Logger.debug(`Cached ${chunks.length} chunks with key: ${cacheKey}`);
164
+ }
165
+ // Return requested chunk or first chunk
166
+ const returnChunkIndex = (chunkIndex && chunkIndex > 0 && chunkIndex <= chunks.length) ? chunkIndex : 1;
167
+ const returnChunk = chunks[returnChunkIndex - 1];
168
+ // Format the response
169
+ let result = formatChangeModeResponse(returnChunk.edits, chunks.length > 1 ? { current: returnChunkIndex, total: chunks.length, cacheKey } : undefined);
170
+ // Add summary if helpful (only for first chunk)
171
+ if (returnChunkIndex === 1 && edits.length > 5) {
172
+ result = summarizeChangeModeEdits(edits, chunks.length > 1) + '\n\n' + result;
173
+ }
174
+ Logger.debug(`ChangeMode: Parsed ${edits.length} edits, ${chunks.length} chunks, returning chunk ${returnChunkIndex}`);
175
+ return result;
176
+ }
177
+ // Placeholder
178
+ async function sendStatusMessage(message) {
179
+ Logger.debug(`Status: ${message}`);
180
+ }
181
+ //# sourceMappingURL=geminiExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geminiExecutor.js","sourceRoot":"","sources":["../../src/utils/geminiExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare class Logger {
2
+ private static formatMessage;
3
+ static log(message: string, ...args: any[]): void;
4
+ static warn(message: string, ...args: any[]): void;
5
+ static error(message: string, ...args: any[]): void;
6
+ static debug(message: string, ...args: any[]): void;
7
+ static toolInvocation(toolName: string, args: any): void;
8
+ static toolParsedArgs(prompt: string, model?: string, sandbox?: boolean, changeMode?: boolean): void;
9
+ static commandExecution(command: string, args: string[], startTime: number): void;
10
+ private static _commandStartTimes;
11
+ static commandComplete(startTime: number, exitCode: number | null, outputLength?: number): void;
12
+ }
13
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIjD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIlD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAIxD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAIpG,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAQjF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA6E;IAE9G,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;CAUhG"}
@@ -0,0 +1,42 @@
1
+ // WIP
2
+ import { LOG_PREFIX } from "../constants.js";
3
+ export class Logger {
4
+ static formatMessage(message) {
5
+ return `${LOG_PREFIX} ${message}` + "\n";
6
+ }
7
+ static log(message, ...args) {
8
+ console.warn(this.formatMessage(message), ...args);
9
+ }
10
+ static warn(message, ...args) {
11
+ console.warn(this.formatMessage(message), ...args);
12
+ }
13
+ static error(message, ...args) {
14
+ console.error(this.formatMessage(message), ...args);
15
+ }
16
+ static debug(message, ...args) {
17
+ console.warn(this.formatMessage(message), ...args);
18
+ }
19
+ static toolInvocation(toolName, args) {
20
+ this.warn("Raw:", JSON.stringify(args, null, 2));
21
+ }
22
+ static toolParsedArgs(prompt, model, sandbox, changeMode) {
23
+ this.warn(`Parsed prompt: "${prompt}"\nchangeMode: ${changeMode || false}`);
24
+ }
25
+ static commandExecution(command, args, startTime) {
26
+ this.warn(`[${startTime}] Starting: ${command} ${args.map((arg) => `"${arg}"`).join(" ")}`);
27
+ // Store command execution start for timing analysis
28
+ this._commandStartTimes.set(startTime, { command, args, startTime });
29
+ }
30
+ // Track command start times for duration calculation
31
+ static _commandStartTimes = new Map();
32
+ static commandComplete(startTime, exitCode, outputLength) {
33
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
34
+ this.warn(`[${elapsed}s] Process finished with exit code: ${exitCode}`);
35
+ if (outputLength !== undefined) {
36
+ this.warn(`Response: ${outputLength} chars`);
37
+ }
38
+ // Clean up command tracking
39
+ this._commandStartTimes.delete(startTime);
40
+ }
41
+ }
42
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM;AACN,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,MAAM;IACT,MAAM,CAAC,aAAa,CAAC,OAAe;QAC1C,OAAO,GAAG,UAAU,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW;QACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,QAAgB,EAAE,IAAS;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAc,EAAE,KAAc,EAAE,OAAiB,EAAE,UAAoB;QAC3F,IAAI,CAAC,IAAI,CAAC,mBAAmB,MAAM,kBAAkB,UAAU,IAAI,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAe,EAAE,IAAc,EAAE,SAAiB;QACxE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,eAAe,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5F,oDAAoD;QACpD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,qDAAqD;IAC7C,MAAM,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAkE,CAAC;IAE9G,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,QAAuB,EAAE,YAAqB;QACtF,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QACxE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,QAAQ,CAAC,CAAC;QAC/C,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timeoutManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeoutManager.d.ts","sourceRoot":"","sources":["../../src/utils/timeoutManager.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timeoutManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeoutManager.js","sourceRoot":"","sources":["../../src/utils/timeoutManager.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "cat-gemini-mcp",
3
+ "version": "1.2.0",
4
+ "description": "MCP server for Gemini CLI integration",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "gemini-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "start": "node dist/index.js",
13
+ "dev": "tsc && node dist/index.js",
14
+ "test": "echo \"No tests yet\" && exit 0",
15
+ "lint": "tsc --noEmit",
16
+ "contribute": "tsx src/contribute.ts",
17
+ "prepublishOnly": "echo '⚠️ Remember to test locally first!' && npm run build",
18
+ "docs:dev": "vitepress dev docs",
19
+ "docs:build": "vitepress build docs",
20
+ "docs:preview": "vitepress preview docs"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "modelcontextprotocol",
25
+ "gemini",
26
+ "cli",
27
+ "ai",
28
+ "llm"
29
+ ],
30
+ "author": "jamubc",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/imWildCat/gemini-mcp-tool.git"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/imWildCat/gemini-mcp-tool/issues"
38
+ },
39
+ "homepage": "https://github.com/imWildCat/gemini-mcp-tool#readme",
40
+ "engines": {
41
+ "node": ">=16.0.0"
42
+ },
43
+ "files": [
44
+ "dist/",
45
+ "README.md",
46
+ "LICENSE"
47
+ ],
48
+ "dependencies": {
49
+ "@modelcontextprotocol/sdk": "^0.5.0",
50
+ "ai": "^4.3.17",
51
+ "chalk": "^5.0.0",
52
+ "d3-shape": "^3.2.0",
53
+ "inquirer": "^9.0.0",
54
+ "prismjs": "^1.30.0",
55
+ "zod": "^3.25.76",
56
+ "zod-to-json-schema": "^3.24.6"
57
+ },
58
+ "devDependencies": {
59
+ "@types/inquirer": "^9.0.0",
60
+ "@types/node": "^20.0.0",
61
+ "archiver": "^7.0.1",
62
+ "mermaid": "^11.9.0",
63
+ "tsx": "^4.0.0",
64
+ "typescript": "^5.0.0",
65
+ "vitepress": "^1.6.3",
66
+ "vitepress-plugin-mermaid": "^2.0.17"
67
+ },
68
+ "publishConfig": {
69
+ "access": "public"
70
+ }
71
+ }