@maxanatsko/llm-cli-bridge 3.1.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/LICENSE +26 -0
- package/README.md +203 -0
- package/dist/backends/codex.d.ts +37 -0
- package/dist/backends/codex.d.ts.map +1 -0
- package/dist/backends/codex.js +438 -0
- package/dist/backends/codex.js.map +1 -0
- package/dist/backends/gemini.d.ts +17 -0
- package/dist/backends/gemini.d.ts.map +1 -0
- package/dist/backends/gemini.js +174 -0
- package/dist/backends/gemini.js.map +1 -0
- package/dist/backends/index.d.ts +8 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +9 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/registry.d.ts +33 -0
- package/dist/backends/registry.d.ts.map +1 -0
- package/dist/backends/registry.js +80 -0
- package/dist/backends/registry.js.map +1 -0
- package/dist/backends/types.d.ts +61 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +5 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/constants.d.ts +223 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +228 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +192 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask.tool.d.ts +4 -0
- package/dist/tools/ask.tool.d.ts.map +1 -0
- package/dist/tools/ask.tool.js +113 -0
- package/dist/tools/ask.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +250 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +42 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +85 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/review-code.tool.d.ts +3 -0
- package/dist/tools/review-code.tool.d.ts.map +1 -0
- package/dist/tools/review-code.tool.js +279 -0
- package/dist/tools/review-code.tool.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +38 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/askSessionManager.d.ts +59 -0
- package/dist/utils/askSessionManager.d.ts.map +1 -0
- package/dist/utils/askSessionManager.js +123 -0
- package/dist/utils/askSessionManager.js.map +1 -0
- package/dist/utils/brainstormSessionManager.d.ts +67 -0
- package/dist/utils/brainstormSessionManager.d.ts.map +1 -0
- package/dist/utils/brainstormSessionManager.js +174 -0
- package/dist/utils/brainstormSessionManager.js.map +1 -0
- package/dist/utils/changeModeInstructions.d.ts +17 -0
- package/dist/utils/changeModeInstructions.d.ts.map +1 -0
- package/dist/utils/changeModeInstructions.js +100 -0
- package/dist/utils/changeModeInstructions.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +81 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +4 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +42 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +2 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +76 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/envAllowlist.d.ts +17 -0
- package/dist/utils/envAllowlist.d.ts.map +1 -0
- package/dist/utils/envAllowlist.js +54 -0
- package/dist/utils/envAllowlist.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +3 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +94 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/gitStateDetector.d.ts +32 -0
- package/dist/utils/gitStateDetector.d.ts.map +1 -0
- package/dist/utils/gitStateDetector.js +68 -0
- package/dist/utils/gitStateDetector.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +42 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/reviewFormatter.d.ts +35 -0
- package/dist/utils/reviewFormatter.d.ts.map +1 -0
- package/dist/utils/reviewFormatter.js +201 -0
- package/dist/utils/reviewFormatter.js.map +1 -0
- package/dist/utils/reviewPromptBuilder.d.ts +43 -0
- package/dist/utils/reviewPromptBuilder.d.ts.map +1 -0
- package/dist/utils/reviewPromptBuilder.js +170 -0
- package/dist/utils/reviewPromptBuilder.js.map +1 -0
- package/dist/utils/reviewResponseParser.d.ts +20 -0
- package/dist/utils/reviewResponseParser.d.ts.map +1 -0
- package/dist/utils/reviewResponseParser.js +149 -0
- package/dist/utils/reviewResponseParser.js.map +1 -0
- package/dist/utils/reviewSessionCache.d.ts +81 -0
- package/dist/utils/reviewSessionCache.d.ts.map +1 -0
- package/dist/utils/reviewSessionCache.js +220 -0
- package/dist/utils/reviewSessionCache.js.map +1 -0
- package/dist/utils/reviewSessionManager.d.ts +52 -0
- package/dist/utils/reviewSessionManager.d.ts.map +1 -0
- package/dist/utils/reviewSessionManager.js +65 -0
- package/dist/utils/reviewSessionManager.js.map +1 -0
- package/dist/utils/sessionManager.d.ts +95 -0
- package/dist/utils/sessionManager.d.ts.map +1 -0
- package/dist/utils/sessionManager.js +382 -0
- package/dist/utils/sessionManager.js.map +1 -0
- package/dist/utils/sessionSchemas.d.ts +140 -0
- package/dist/utils/sessionSchemas.d.ts.map +1 -0
- package/dist/utils/sessionSchemas.js +2 -0
- package/dist/utils/sessionSchemas.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Logger } from '../utils/logger.js';
|
|
3
|
+
import { getBackend } from '../backends/index.js';
|
|
4
|
+
import { brainstormSessionManager } from '../utils/brainstormSessionManager.js';
|
|
5
|
+
function buildBrainstormPrompt(config) {
|
|
6
|
+
const { prompt, methodology, domain, constraints, existingContext, ideaCount, includeAnalysis } = config;
|
|
7
|
+
// Select methodology framework
|
|
8
|
+
let frameworkInstructions = getMethodologyInstructions(methodology, domain);
|
|
9
|
+
let enhancedPrompt = `# BRAINSTORMING SESSION
|
|
10
|
+
|
|
11
|
+
## Core Challenge
|
|
12
|
+
${prompt}
|
|
13
|
+
|
|
14
|
+
## Methodology Framework
|
|
15
|
+
${frameworkInstructions}
|
|
16
|
+
|
|
17
|
+
## Context Engineering
|
|
18
|
+
*Use the following context to inform your reasoning:*
|
|
19
|
+
${domain ? `**Domain Focus:** ${domain} - Apply domain-specific knowledge, terminology, and best practices.` : ''}
|
|
20
|
+
${constraints ? `**Constraints & Boundaries:** ${constraints}` : ''}
|
|
21
|
+
${existingContext ? `**Background Context:** ${existingContext}` : ''}
|
|
22
|
+
|
|
23
|
+
## Output Requirements
|
|
24
|
+
- Generate ${ideaCount} distinct, creative ideas
|
|
25
|
+
- Each idea should be unique and non-obvious
|
|
26
|
+
- Focus on actionable, implementable concepts
|
|
27
|
+
- Use clear, descriptive naming
|
|
28
|
+
- Provide brief explanations for each idea
|
|
29
|
+
|
|
30
|
+
${includeAnalysis ? `
|
|
31
|
+
## Analysis Framework
|
|
32
|
+
For each idea, provide:
|
|
33
|
+
- **Feasibility:** Implementation difficulty (1-5 scale)
|
|
34
|
+
- **Impact:** Potential value/benefit (1-5 scale)
|
|
35
|
+
- **Innovation:** Uniqueness/creativity (1-5 scale)
|
|
36
|
+
- **Quick Assessment:** One-sentence evaluation
|
|
37
|
+
` : ''}
|
|
38
|
+
|
|
39
|
+
## Format
|
|
40
|
+
Present ideas in a structured format:
|
|
41
|
+
|
|
42
|
+
### Idea [N]: [Creative Name]
|
|
43
|
+
**Description:** [2-3 sentence explanation]
|
|
44
|
+
${includeAnalysis ? '**Feasibility:** [1-5] | **Impact:** [1-5] | **Innovation:** [1-5]\n**Assessment:** [Brief evaluation]' : ''}
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
**Before finalizing, review the list: remove near-duplicates and ensure each idea satisfies the constraints.**
|
|
49
|
+
|
|
50
|
+
Begin brainstorming session:`;
|
|
51
|
+
return enhancedPrompt;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Returns methodology-specific instructions for structured brainstorming
|
|
55
|
+
*/
|
|
56
|
+
function getMethodologyInstructions(methodology, domain) {
|
|
57
|
+
const methodologies = {
|
|
58
|
+
'divergent': `**Divergent Thinking Approach:**
|
|
59
|
+
- Generate maximum quantity of ideas without self-censoring
|
|
60
|
+
- Build on wild or seemingly impractical ideas
|
|
61
|
+
- Combine unrelated concepts for unexpected solutions
|
|
62
|
+
- Use "Yes, and..." thinking to expand each concept
|
|
63
|
+
- Postpone evaluation until all ideas are generated`,
|
|
64
|
+
'convergent': `**Convergent Thinking Approach:**
|
|
65
|
+
- Focus on refining and improving existing concepts
|
|
66
|
+
- Synthesize related ideas into stronger solutions
|
|
67
|
+
- Apply critical evaluation criteria
|
|
68
|
+
- Prioritize based on feasibility and impact
|
|
69
|
+
- Develop implementation pathways for top ideas`,
|
|
70
|
+
'scamper': `**SCAMPER Creative Triggers:**
|
|
71
|
+
- **Substitute:** What can be substituted or replaced?
|
|
72
|
+
- **Combine:** What can be combined or merged?
|
|
73
|
+
- **Adapt:** What can be adapted from other domains?
|
|
74
|
+
- **Modify:** What can be magnified, minimized, or altered?
|
|
75
|
+
- **Put to other use:** How else can this be used?
|
|
76
|
+
- **Eliminate:** What can be removed or simplified?
|
|
77
|
+
- **Reverse:** What can be rearranged or reversed?`,
|
|
78
|
+
'design-thinking': `**Human-Centered Design Thinking:**
|
|
79
|
+
- **Empathize:** Consider user needs, pain points, and contexts
|
|
80
|
+
- **Define:** Frame problems from user perspective
|
|
81
|
+
- **Ideate:** Generate user-focused solutions
|
|
82
|
+
- **Consider Journey:** Think through complete user experience
|
|
83
|
+
- **Prototype Mindset:** Focus on testable, iterative concepts`,
|
|
84
|
+
'lateral': `**Lateral Thinking Approach:**
|
|
85
|
+
- Make unexpected connections between unrelated fields
|
|
86
|
+
- Challenge fundamental assumptions
|
|
87
|
+
- Use random word association to trigger new directions
|
|
88
|
+
- Apply metaphors and analogies from other domains
|
|
89
|
+
- Reverse conventional thinking patterns`,
|
|
90
|
+
'auto': `**AI-Optimized Approach:**
|
|
91
|
+
${domain ? `Given the ${domain} domain, I'll apply the most effective combination of:` : 'I\'ll intelligently combine multiple methodologies:'}
|
|
92
|
+
- Divergent exploration with domain-specific knowledge
|
|
93
|
+
- SCAMPER triggers and lateral thinking
|
|
94
|
+
- Human-centered perspective for practical value`
|
|
95
|
+
};
|
|
96
|
+
return methodologies[methodology] || methodologies['auto'];
|
|
97
|
+
}
|
|
98
|
+
const brainstormArgsSchema = z.object({
|
|
99
|
+
prompt: z.string().min(1).describe("Primary brainstorming challenge or question to explore"),
|
|
100
|
+
backend: z.enum(['gemini', 'codex']).optional().describe("AI backend to use: 'gemini' (default) or 'codex'. Gemini offers 1M+ token context, Codex integrates with OpenAI models."),
|
|
101
|
+
session: z.string().optional().describe("Session ID for tracking ideas across rounds (e.g., 'feature-ideas'). Enables iterative brainstorming with context."),
|
|
102
|
+
model: z.string().optional().describe("Model override. Gemini: 'gemini-3.1-pro' (default), 'gemini-3-flash', 'gemini-2.5-pro', 'gemini-2.5-flash'. Codex: 'gpt-5.4' (default), 'gpt-5.4-mini', 'gpt-5.3-codex', 'gpt-5.2-codex', 'gpt-5.2'"),
|
|
103
|
+
methodology: z.enum(['divergent', 'convergent', 'scamper', 'design-thinking', 'lateral', 'auto']).default('auto').describe("Brainstorming framework: 'divergent' (generate many ideas), 'convergent' (refine existing), 'scamper' (systematic triggers), 'design-thinking' (human-centered), 'lateral' (unexpected connections), 'auto' (AI selects best)"),
|
|
104
|
+
domain: z.string().optional().describe("Domain context for specialized brainstorming (e.g., 'software', 'business', 'creative', 'research', 'product', 'marketing')"),
|
|
105
|
+
constraints: z.string().optional().describe("Known limitations, requirements, or boundaries (budget, time, technical, legal, etc.)"),
|
|
106
|
+
existingContext: z.string().optional().describe("Background information, previous attempts, or current state to build upon"),
|
|
107
|
+
ideaCount: z.number().int().positive().default(12).describe("Target number of ideas to generate (default: 10-15)"),
|
|
108
|
+
includeAnalysis: z.boolean().default(true).describe("Include feasibility, impact, and implementation analysis for generated ideas"),
|
|
109
|
+
includeHistory: z.boolean().default(true).describe("Include previously generated ideas in context (only applies when session is provided). Default: true"),
|
|
110
|
+
reasoningEffort: z.enum(['low', 'medium', 'high', 'xhigh']).optional().describe("Reasoning effort level (Codex only): 'low', 'medium' (default), 'high', 'xhigh'. Use 'high'/'xhigh' for complex tasks."),
|
|
111
|
+
allowedTools: z.array(z.string()).optional().describe("Tools that AI can auto-approve without confirmation (e.g., ['run_shell_command']). Use sparingly for security."),
|
|
112
|
+
cwd: z.string().optional().describe("Working directory for CLI execution. Use this to match your IDE workspace directory if you get 'Directory mismatch' errors."),
|
|
113
|
+
});
|
|
114
|
+
export const brainstormTool = {
|
|
115
|
+
name: "brainstorm",
|
|
116
|
+
description: "Generate novel ideas with dynamic context gathering. --> Creative frameworks (SCAMPER, Design Thinking, etc.), domain context integration, idea clustering, feasibility analysis, and iterative refinement.",
|
|
117
|
+
zodSchema: brainstormArgsSchema,
|
|
118
|
+
annotations: {
|
|
119
|
+
readOnlyHint: false, // Can modify state via sessions
|
|
120
|
+
destructiveHint: false, // Doesn't delete data
|
|
121
|
+
idempotentHint: false, // Same input yields different AI responses
|
|
122
|
+
openWorldHint: true, // Interacts with external AI APIs
|
|
123
|
+
},
|
|
124
|
+
prompt: {
|
|
125
|
+
description: "Generate structured brainstorming prompt with methodology-driven ideation, domain context integration, and analytical evaluation framework",
|
|
126
|
+
},
|
|
127
|
+
category: 'ai',
|
|
128
|
+
execute: async (args, onProgress) => {
|
|
129
|
+
const { prompt, backend: backendChoice, session, model, methodology = 'auto', domain, constraints, existingContext, ideaCount = 12, includeAnalysis = true, includeHistory = true, reasoningEffort, allowedTools, cwd } = args;
|
|
130
|
+
if (!prompt?.trim()) {
|
|
131
|
+
throw new Error("You must provide a valid brainstorming challenge or question to explore");
|
|
132
|
+
}
|
|
133
|
+
// Session handling
|
|
134
|
+
let sessionData = null;
|
|
135
|
+
let contextualizedExistingContext = existingContext;
|
|
136
|
+
if (session) {
|
|
137
|
+
try {
|
|
138
|
+
sessionData = await brainstormSessionManager.getOrCreate(session, prompt.trim(), methodology, domain, constraints);
|
|
139
|
+
// Build context from previous rounds
|
|
140
|
+
if (includeHistory && sessionData.rounds.length > 0) {
|
|
141
|
+
const previousIdeas = brainstormSessionManager.buildIdeasContext(sessionData, true);
|
|
142
|
+
contextualizedExistingContext = existingContext
|
|
143
|
+
? `${existingContext}\n\n${previousIdeas}`
|
|
144
|
+
: previousIdeas;
|
|
145
|
+
}
|
|
146
|
+
onProgress?.(`🧠 Session '${session}' (Round ${sessionData.rounds.length + 1})`);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
onProgress?.(`⚠️ Session loading failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
150
|
+
Logger.error(`Failed to load session '${session}': ${error}`);
|
|
151
|
+
// Continue without session
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
let enhancedPrompt = buildBrainstormPrompt({
|
|
155
|
+
prompt: prompt.trim(),
|
|
156
|
+
methodology: methodology,
|
|
157
|
+
domain: domain,
|
|
158
|
+
constraints: constraints,
|
|
159
|
+
existingContext: contextualizedExistingContext,
|
|
160
|
+
ideaCount: ideaCount,
|
|
161
|
+
includeAnalysis: includeAnalysis
|
|
162
|
+
});
|
|
163
|
+
Logger.debug(`Brainstorm: Using methodology '${methodology}' for domain '${domain || 'general'}'`);
|
|
164
|
+
// Get the appropriate backend (defaults to session's last backend, then Gemini)
|
|
165
|
+
const backendType = backendChoice || sessionData?.lastBackend || 'gemini';
|
|
166
|
+
const backend = await getBackend(backendType);
|
|
167
|
+
// Report progress to user
|
|
168
|
+
onProgress?.(`🤖 Using ${backend.name} backend...`);
|
|
169
|
+
onProgress?.(`Generating ${ideaCount} ideas via ${methodology} methodology...`);
|
|
170
|
+
// Execute via the selected backend
|
|
171
|
+
// Pass existing codexThreadId for native session resume when using Codex
|
|
172
|
+
const result = await backend.execute(enhancedPrompt, {
|
|
173
|
+
provider: backendType,
|
|
174
|
+
model: model,
|
|
175
|
+
sandbox: false,
|
|
176
|
+
changeMode: false,
|
|
177
|
+
allowedTools: allowedTools,
|
|
178
|
+
cwd: cwd,
|
|
179
|
+
codexThreadId: sessionData?.codexThreadId, // For Codex native session resume
|
|
180
|
+
reasoningEffort: reasoningEffort,
|
|
181
|
+
}, onProgress);
|
|
182
|
+
// Save to session if provided
|
|
183
|
+
if (session && sessionData) {
|
|
184
|
+
try {
|
|
185
|
+
// Parse ideas from response (simple extraction)
|
|
186
|
+
const ideas = parseIdeasFromResponse(result.response);
|
|
187
|
+
brainstormSessionManager.addRound(sessionData, prompt, result.response, ideas, backendType, result.codexThreadId // Store Codex thread ID for native session resume
|
|
188
|
+
);
|
|
189
|
+
await brainstormSessionManager.save(sessionData);
|
|
190
|
+
onProgress?.(`💾 Saved to session '${session}' (${sessionData.totalIdeas} total ideas, ${sessionData.activeIdeas} active)`);
|
|
191
|
+
if (result.codexThreadId && result.codexThreadId.length > 0) {
|
|
192
|
+
const threadPreview = result.codexThreadId.slice(0, 8);
|
|
193
|
+
onProgress?.(`🔗 Codex thread: ${threadPreview}...`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
onProgress?.(`⚠️ Session save failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
198
|
+
Logger.error(`Failed to save session '${session}': ${error}`);
|
|
199
|
+
// Continue - result is still valid even if session save failed
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Use backend-aware response prefix
|
|
203
|
+
const backendName = backend.name.charAt(0).toUpperCase() + backend.name.slice(1);
|
|
204
|
+
return `${backendName} response:\n${result.response}`;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* Escapes special regex characters in a string to prevent ReDoS attacks
|
|
209
|
+
*/
|
|
210
|
+
function escapeRegex(str) {
|
|
211
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Safely parses an integer score, returning undefined for invalid values
|
|
215
|
+
*/
|
|
216
|
+
function parseScore(matchResult) {
|
|
217
|
+
if (!matchResult)
|
|
218
|
+
return undefined;
|
|
219
|
+
const parsed = parseInt(matchResult[1], 10);
|
|
220
|
+
return !isNaN(parsed) && parsed >= 1 && parsed <= 10 ? parsed : undefined;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Parses ideas from brainstorm response
|
|
224
|
+
* Extracts idea names, descriptions, and scores
|
|
225
|
+
*/
|
|
226
|
+
function parseIdeasFromResponse(response) {
|
|
227
|
+
const ideas = [];
|
|
228
|
+
// Pattern: ### Idea [N]: [Name]
|
|
229
|
+
const ideaPattern = /###\s+Idea\s+\d+:\s*(.+?)\n\*\*Description:\*\*\s*(.+?)(?=\n###|\n\*\*Feasibility|\n---|$)/gis;
|
|
230
|
+
let match;
|
|
231
|
+
while ((match = ideaPattern.exec(response)) !== null) {
|
|
232
|
+
const name = match[1].trim();
|
|
233
|
+
const description = match[2].trim();
|
|
234
|
+
// Escape regex metacharacters to prevent ReDoS attacks
|
|
235
|
+
const escapedName = escapeRegex(name);
|
|
236
|
+
// Try to extract scores with escaped name
|
|
237
|
+
const feasibilityMatch = response.match(new RegExp(`${escapedName}[\\s\\S]{0,300}\\*\\*Feasibility:\\*\\*\\s*(\\d+)`, 'i'));
|
|
238
|
+
const impactMatch = response.match(new RegExp(`${escapedName}[\\s\\S]{0,300}\\*\\*Impact:\\*\\*\\s*(\\d+)`, 'i'));
|
|
239
|
+
const innovationMatch = response.match(new RegExp(`${escapedName}[\\s\\S]{0,300}\\*\\*Innovation:\\*\\*\\s*(\\d+)`, 'i'));
|
|
240
|
+
ideas.push({
|
|
241
|
+
name,
|
|
242
|
+
description,
|
|
243
|
+
feasibility: parseScore(feasibilityMatch),
|
|
244
|
+
impact: parseScore(impactMatch),
|
|
245
|
+
innovation: parseScore(innovationMatch)
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return ideas;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=brainstorm.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brainstorm.tool.js","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAaA,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Tool Registry Index - Registers all tools
|
|
2
|
+
import { toolRegistry } from './registry.js';
|
|
3
|
+
import { askTool } from './ask.tool.js';
|
|
4
|
+
import { brainstormTool } from './brainstorm.tool.js';
|
|
5
|
+
import { reviewCodeTool } from './review-code.tool.js';
|
|
6
|
+
// Register tools
|
|
7
|
+
toolRegistry.push(askTool, brainstormTool, reviewCodeTool);
|
|
8
|
+
export * from './registry.js';
|
|
9
|
+
// Re-export tools for direct access
|
|
10
|
+
export { askTool } from './ask.tool.js';
|
|
11
|
+
export { brainstormTool } from './brainstorm.tool.js';
|
|
12
|
+
export { reviewCodeTool } from './review-code.tool.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,iBAAiB;AACjB,YAAY,CAAC,IAAI,CACf,OAAO,EACP,cAAc,EACd,cAAc,CACf,CAAC;AAEF,cAAc,eAAe,CAAC;AAE9B,oCAAoC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Tool, Prompt } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { ToolArguments } from "../constants.js";
|
|
3
|
+
import { ZodTypeAny } from "zod";
|
|
4
|
+
/**
|
|
5
|
+
* MCP Tool Annotations
|
|
6
|
+
* @see https://spec.modelcontextprotocol.io/specification/server/tools/#annotations
|
|
7
|
+
*/
|
|
8
|
+
export interface ToolAnnotations {
|
|
9
|
+
/** If true, the tool does not modify any external state */
|
|
10
|
+
readOnlyHint?: boolean;
|
|
11
|
+
/** If true, the tool may perform destructive updates (e.g., deleting data) */
|
|
12
|
+
destructiveHint?: boolean;
|
|
13
|
+
/** If true, calling the tool with the same inputs may yield different results */
|
|
14
|
+
idempotentHint?: boolean;
|
|
15
|
+
/** If true, the tool interacts with external entities (APIs, internet, etc.) */
|
|
16
|
+
openWorldHint?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface UnifiedTool {
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
zodSchema: ZodTypeAny;
|
|
22
|
+
outputSchema?: ZodTypeAny;
|
|
23
|
+
/** MCP tool annotations for client behavior hints */
|
|
24
|
+
annotations?: ToolAnnotations;
|
|
25
|
+
prompt?: {
|
|
26
|
+
description: string;
|
|
27
|
+
arguments?: Array<{
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
required: boolean;
|
|
31
|
+
}>;
|
|
32
|
+
};
|
|
33
|
+
execute: (args: ToolArguments, onProgress?: (newOutput: string) => void) => Promise<string>;
|
|
34
|
+
category?: 'simple' | 'ai' | 'utility';
|
|
35
|
+
}
|
|
36
|
+
export declare const toolRegistry: UnifiedTool[];
|
|
37
|
+
export declare function toolExists(toolName: string): boolean;
|
|
38
|
+
export declare function getToolDefinitions(): Tool[];
|
|
39
|
+
export declare function getPromptDefinitions(): Prompt[];
|
|
40
|
+
export declare function executeTool(toolName: string, args: ToolArguments, onProgress?: (newOutput: string) => void): Promise<string>;
|
|
41
|
+
export declare function getPromptMessage(toolName: string, args: Record<string, any>): string;
|
|
42
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAY,MAAM,KAAK,CAAC;AAG3C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iFAAiF;IACjF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;IACtB,YAAY,CAAC,EAAE,UAAU,CAAC;IAE1B,qDAAqD;IACrD,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B,MAAM,CAAC,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC;IAEF,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5F,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;CACxC;AAED,eAAO,MAAM,YAAY,EAAE,WAAW,EAAO,CAAC;AAC9C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AACD,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAuB3C;AAcD,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAQ/C;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlI;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAsBpF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ZodError } from "zod";
|
|
2
|
+
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
3
|
+
export const toolRegistry = [];
|
|
4
|
+
export function toolExists(toolName) {
|
|
5
|
+
return toolRegistry.some(t => t.name === toolName);
|
|
6
|
+
}
|
|
7
|
+
export function getToolDefinitions() {
|
|
8
|
+
return toolRegistry.map(tool => {
|
|
9
|
+
const raw = zodToJsonSchema(tool.zodSchema, tool.name);
|
|
10
|
+
const def = raw.definitions?.[tool.name] ?? raw;
|
|
11
|
+
const inputSchema = {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: def.properties || {},
|
|
14
|
+
required: def.required || [],
|
|
15
|
+
};
|
|
16
|
+
const result = {
|
|
17
|
+
name: tool.name,
|
|
18
|
+
description: tool.description,
|
|
19
|
+
inputSchema,
|
|
20
|
+
};
|
|
21
|
+
// Include annotations if defined (MCP spec compliance)
|
|
22
|
+
if (tool.annotations) {
|
|
23
|
+
result.annotations = tool.annotations;
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function extractPromptArguments(zodSchema) {
|
|
29
|
+
const jsonSchema = zodToJsonSchema(zodSchema);
|
|
30
|
+
const properties = jsonSchema.properties || {};
|
|
31
|
+
const required = jsonSchema.required || [];
|
|
32
|
+
return Object.entries(properties).map(([name, prop]) => ({
|
|
33
|
+
name,
|
|
34
|
+
description: prop.description || `${name} parameter`,
|
|
35
|
+
required: required.includes(name)
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
export function getPromptDefinitions() {
|
|
39
|
+
return toolRegistry
|
|
40
|
+
.filter(tool => tool.prompt)
|
|
41
|
+
.map(tool => ({
|
|
42
|
+
name: tool.name,
|
|
43
|
+
description: tool.prompt.description,
|
|
44
|
+
arguments: tool.prompt.arguments || extractPromptArguments(tool.zodSchema),
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
export async function executeTool(toolName, args, onProgress) {
|
|
48
|
+
const tool = toolRegistry.find(t => t.name === toolName);
|
|
49
|
+
if (!tool) {
|
|
50
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const validatedArgs = tool.zodSchema.parse(args);
|
|
54
|
+
return tool.execute(validatedArgs, onProgress);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof ZodError) {
|
|
58
|
+
const issues = error.issues.map(issue => `${issue.path.join('.')}: ${issue.message}`).join(', ');
|
|
59
|
+
throw new Error(`Invalid arguments for ${toolName}: ${issues}`);
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function getPromptMessage(toolName, args) {
|
|
65
|
+
const tool = toolRegistry.find(t => t.name === toolName);
|
|
66
|
+
if (!tool?.prompt) {
|
|
67
|
+
throw new Error(`No prompt defined for tool: ${toolName}`);
|
|
68
|
+
}
|
|
69
|
+
const paramStrings = [];
|
|
70
|
+
if (args.prompt) {
|
|
71
|
+
paramStrings.push(args.prompt);
|
|
72
|
+
}
|
|
73
|
+
Object.entries(args).forEach(([key, value]) => {
|
|
74
|
+
if (key !== 'prompt' && value !== undefined && value !== null && value !== false) {
|
|
75
|
+
if (typeof value === 'boolean' && value) {
|
|
76
|
+
paramStrings.push(`[${key}]`);
|
|
77
|
+
}
|
|
78
|
+
else if (typeof value !== 'boolean') {
|
|
79
|
+
paramStrings.push(`(${key}: ${value})`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return `Use the ${toolName} tool${paramStrings.length > 0 ? ': ' + paramStrings.join(' ') : ''}`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-code.tool.d.ts","sourceRoot":"","sources":["../../src/tools/review-code.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkG5C,eAAO,MAAM,cAAc,EAAE,WAgN5B,CAAC"}
|