skannr 0.2.1 → 0.2.3
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/guard/provider.d.ts.map +1 -1
- package/dist/guard/provider.js +94 -3
- package/dist/guard/provider.js.map +1 -1
- package/dist/guard/rules-loader.d.ts +1 -1
- package/dist/guard/rules-loader.d.ts.map +1 -1
- package/dist/guard/rules-loader.js +105 -19
- package/dist/guard/rules-loader.js.map +1 -1
- package/dist/guard/schema.d.ts +3 -3
- package/dist/guard/schema.js +2 -2
- package/dist/guard/schema.js.map +1 -1
- package/dist/guard/types.d.ts +3 -3
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/scanner.d.ts +0 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +0 -7
- package/dist/scanner.js.map +1 -1
- package/package.json +1 -1
- package/src/guard/provider.ts +109 -3
- package/src/guard/rules-loader.ts +109 -20
- package/src/guard/schema.ts +2 -2
- package/src/guard/types.ts +3 -3
- package/src/index.ts +2 -2
- package/src/scanner.ts +0 -7
- package/gemini-extension/GEMINI.md +0 -26
- package/gemini-extension/gemini-extension.json +0 -12
- package/gemini-extension/package.json +0 -14
- package/gemini-extension/src/server.ts +0 -69
- package/gemini-extension/tsconfig.json +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/guard/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/guard/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA2OtF;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,SAAS,EAAE,EAClB,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,cAAc,CAAC,CAgEzB"}
|
package/dist/guard/provider.js
CHANGED
|
@@ -109,6 +109,82 @@ function extractJson(text) {
|
|
|
109
109
|
}
|
|
110
110
|
return text.slice(firstBrace, lastBrace + 1);
|
|
111
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Call a CLI-based provider (claude, gemini, kiro).
|
|
114
|
+
* These use the user's existing authenticated session — no API key needed.
|
|
115
|
+
*/
|
|
116
|
+
async function callCli(command, fullPrompt) {
|
|
117
|
+
const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
118
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
119
|
+
const path = await Promise.resolve().then(() => __importStar(require('path')));
|
|
120
|
+
const os = await Promise.resolve().then(() => __importStar(require('os')));
|
|
121
|
+
// Write prompt to a temp file (avoids ARG_MAX limits on large diffs)
|
|
122
|
+
const tmpFile = path.join(os.tmpdir(), `skannr-guard-${Date.now()}.txt`);
|
|
123
|
+
fs.writeFileSync(tmpFile, fullPrompt, 'utf-8');
|
|
124
|
+
try {
|
|
125
|
+
let result;
|
|
126
|
+
switch (command) {
|
|
127
|
+
case 'claude-cli':
|
|
128
|
+
// Claude CLI accepts prompt via stdin pipe with --print flag
|
|
129
|
+
result = execSync(`cat "${tmpFile}" | claude --print`, {
|
|
130
|
+
encoding: 'utf-8',
|
|
131
|
+
timeout: 120_000,
|
|
132
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
133
|
+
});
|
|
134
|
+
break;
|
|
135
|
+
case 'gemini-cli':
|
|
136
|
+
// Gemini CLI accepts prompt via -p flag
|
|
137
|
+
result = execSync(`gemini -p "$(cat "${tmpFile}")"`, {
|
|
138
|
+
encoding: 'utf-8',
|
|
139
|
+
timeout: 120_000,
|
|
140
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
141
|
+
});
|
|
142
|
+
break;
|
|
143
|
+
case 'kiro-cli':
|
|
144
|
+
// Kiro CLI accepts prompt via stdin in non-interactive mode
|
|
145
|
+
result = execSync(`cat "${tmpFile}" | kiro-cli chat --no-interactive "Review and respond with JSON only."`, {
|
|
146
|
+
encoding: 'utf-8',
|
|
147
|
+
timeout: 120_000,
|
|
148
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
149
|
+
});
|
|
150
|
+
break;
|
|
151
|
+
default:
|
|
152
|
+
throw new Error(`Unknown CLI provider: ${command}`);
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
try {
|
|
158
|
+
fs.unlinkSync(tmpFile);
|
|
159
|
+
}
|
|
160
|
+
catch { }
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Call Ollama local inference.
|
|
165
|
+
*/
|
|
166
|
+
async function callOllama(model, systemPrompt, userPrompt) {
|
|
167
|
+
const baseUrl = process.env.OLLAMA_BASE_URL || 'http://localhost:11434';
|
|
168
|
+
const url = `${baseUrl}/api/chat`;
|
|
169
|
+
const response = await fetch(url, {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
headers: { 'Content-Type': 'application/json' },
|
|
172
|
+
body: JSON.stringify({
|
|
173
|
+
model: model || 'llama3',
|
|
174
|
+
messages: [
|
|
175
|
+
{ role: 'system', content: systemPrompt },
|
|
176
|
+
{ role: 'user', content: userPrompt },
|
|
177
|
+
],
|
|
178
|
+
stream: false,
|
|
179
|
+
format: 'json',
|
|
180
|
+
}),
|
|
181
|
+
});
|
|
182
|
+
if (!response.ok) {
|
|
183
|
+
throw new Error(`Ollama error: ${response.status} ${response.statusText}`);
|
|
184
|
+
}
|
|
185
|
+
const data = await response.json();
|
|
186
|
+
return data.message?.content ?? '';
|
|
187
|
+
}
|
|
112
188
|
/**
|
|
113
189
|
* Call Gemini API with structured output enforcement.
|
|
114
190
|
*/
|
|
@@ -175,9 +251,24 @@ async function runLlmReview(config, rules, units) {
|
|
|
175
251
|
: `${userPrompt}\n\n[RETRY: Your last response didn't match the required schema. Error: ${lastError}. Return ONLY valid JSON matching the schema.]`;
|
|
176
252
|
let rawResponse;
|
|
177
253
|
try {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
254
|
+
switch (config.provider) {
|
|
255
|
+
case 'openai':
|
|
256
|
+
rawResponse = await callOpenAI(config, systemPrompt, prompt);
|
|
257
|
+
break;
|
|
258
|
+
case 'gemini':
|
|
259
|
+
rawResponse = await callGemini(config, systemPrompt, prompt);
|
|
260
|
+
break;
|
|
261
|
+
case 'ollama':
|
|
262
|
+
rawResponse = await callOllama(config.model, systemPrompt, prompt);
|
|
263
|
+
break;
|
|
264
|
+
case 'claude-cli':
|
|
265
|
+
case 'gemini-cli':
|
|
266
|
+
case 'kiro-cli':
|
|
267
|
+
rawResponse = await callCli(config.provider, systemPrompt + '\n\n' + prompt);
|
|
268
|
+
break;
|
|
269
|
+
default:
|
|
270
|
+
throw new Error(`Unsupported provider: ${config.provider}`);
|
|
271
|
+
}
|
|
181
272
|
}
|
|
182
273
|
catch (err) {
|
|
183
274
|
throw new Error(`Provider call failed (${config.provider}): ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/guard/provider.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/guard/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Returns validated rules or throws with a clear error message.
|
|
4
4
|
*/
|
|
5
5
|
import type { GuardRule, GuardConfig } from './types';
|
|
6
|
-
/** Load and validate rules from the project root. */
|
|
6
|
+
/** Load and validate rules from the project root. Falls back to defaults if no file exists. */
|
|
7
7
|
export declare function loadRules(root: string): GuardRule[];
|
|
8
8
|
/** Load guard provider configuration from .skannr/guard.json or env vars. */
|
|
9
9
|
export declare function loadGuardConfig(root: string): GuardConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules-loader.d.ts","sourceRoot":"","sources":["../../src/guard/rules-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"rules-loader.d.ts","sourceRoot":"","sources":["../../src/guard/rules-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwDtD,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAwBnD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CA8BzD"}
|
|
@@ -42,28 +42,62 @@ exports.loadGuardConfig = loadGuardConfig;
|
|
|
42
42
|
const fs = __importStar(require("fs"));
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
44
|
const schema_1 = require("./schema");
|
|
45
|
-
const schema_2 = require("./schema");
|
|
46
45
|
/** Default locations to search for the rules file. */
|
|
47
46
|
const RULES_PATHS = [
|
|
48
47
|
'.skannr/rules.json',
|
|
49
48
|
'.skannr/rules.yaml',
|
|
50
49
|
'.skannr/rules.yml',
|
|
51
50
|
];
|
|
52
|
-
/**
|
|
51
|
+
/** Built-in default rules used when no .skannr/rules.json exists. */
|
|
52
|
+
const DEFAULT_RULES = [
|
|
53
|
+
{
|
|
54
|
+
id: 'no-any-type',
|
|
55
|
+
description: 'Do not use the `any` type in TypeScript; use explicit types or `unknown`.',
|
|
56
|
+
severity: 'high',
|
|
57
|
+
fixable: true,
|
|
58
|
+
category: 'type-safety',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'no-console-log',
|
|
62
|
+
description: 'Remove console.log statements before committing; use a proper logger in production code.',
|
|
63
|
+
severity: 'medium',
|
|
64
|
+
fixable: true,
|
|
65
|
+
category: 'code-quality',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: 'error-handling',
|
|
69
|
+
description: 'Async functions that can throw should have error handling (try/catch or .catch()).',
|
|
70
|
+
severity: 'high',
|
|
71
|
+
fixable: false,
|
|
72
|
+
category: 'reliability',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: 'no-hardcoded-secrets',
|
|
76
|
+
description: 'Do not hardcode API keys, passwords, tokens, or connection strings. Use environment variables.',
|
|
77
|
+
severity: 'critical',
|
|
78
|
+
fixable: false,
|
|
79
|
+
category: 'security',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: 'function-complexity',
|
|
83
|
+
description: 'Functions should not exceed ~40 lines. Extract helper functions for complex logic.',
|
|
84
|
+
severity: 'medium',
|
|
85
|
+
fixable: false,
|
|
86
|
+
category: 'maintainability',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'unused-imports',
|
|
90
|
+
description: 'Remove unused imports.',
|
|
91
|
+
severity: 'low',
|
|
92
|
+
fixable: true,
|
|
93
|
+
category: 'code-quality',
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
/** Load and validate rules from the project root. Falls back to defaults if no file exists. */
|
|
53
97
|
function loadRules(root) {
|
|
54
98
|
const rulesPath = findRulesFile(root);
|
|
55
99
|
if (!rulesPath) {
|
|
56
|
-
|
|
57
|
-
`Example:\n` +
|
|
58
|
-
`{\n` +
|
|
59
|
-
` "rules": [{\n` +
|
|
60
|
-
` "id": "no-any-type",\n` +
|
|
61
|
-
` "description": "Do not use the \`any\` type in TypeScript.",\n` +
|
|
62
|
-
` "severity": "high",\n` +
|
|
63
|
-
` "fixable": true,\n` +
|
|
64
|
-
` "category": "type-safety"\n` +
|
|
65
|
-
` }]\n` +
|
|
66
|
-
`}`);
|
|
100
|
+
return DEFAULT_RULES;
|
|
67
101
|
}
|
|
68
102
|
const raw = fs.readFileSync(rulesPath, 'utf-8');
|
|
69
103
|
let parsed;
|
|
@@ -95,18 +129,70 @@ function loadGuardConfig(root) {
|
|
|
95
129
|
}
|
|
96
130
|
}
|
|
97
131
|
// Env vars override file config
|
|
98
|
-
const
|
|
99
|
-
const model = (process.env.SKANNR_GUARD_MODEL || rawConfig.model || '
|
|
132
|
+
const explicitProvider = process.env.SKANNR_GUARD_PROVIDER || rawConfig.provider;
|
|
133
|
+
const model = (process.env.SKANNR_GUARD_MODEL || rawConfig.model || '');
|
|
100
134
|
const apiKey = process.env.SKANNR_GUARD_API_KEY
|
|
101
135
|
|| process.env.GEMINI_API_KEY
|
|
102
136
|
|| process.env.OPENAI_API_KEY
|
|
103
137
|
|| rawConfig.apiKey;
|
|
104
138
|
const baseUrl = process.env.OPENAI_BASE_URL || rawConfig.baseUrl;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
139
|
+
// Auto-detect provider if not explicitly set
|
|
140
|
+
const provider = explicitProvider || autoDetectProvider(apiKey);
|
|
141
|
+
return {
|
|
142
|
+
provider: provider,
|
|
143
|
+
model: model || getDefaultModel(provider),
|
|
144
|
+
apiKey,
|
|
145
|
+
baseUrl,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Auto-detect the best available provider.
|
|
150
|
+
* Priority: existing CLI tools (free, already authenticated) > API keys.
|
|
151
|
+
*/
|
|
152
|
+
function autoDetectProvider(apiKey) {
|
|
153
|
+
const { execSync } = require('child_process');
|
|
154
|
+
// Check for CLI tools first (no API key needed)
|
|
155
|
+
const cliChecks = [
|
|
156
|
+
['claude', 'claude-cli'],
|
|
157
|
+
['gemini', 'gemini-cli'],
|
|
158
|
+
['kiro-cli', 'kiro-cli'],
|
|
159
|
+
];
|
|
160
|
+
for (const [cmd, provider] of cliChecks) {
|
|
161
|
+
try {
|
|
162
|
+
execSync(`${cmd} --version`, { stdio: 'ignore', timeout: 3000 });
|
|
163
|
+
return provider;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Not available, try next
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Check for Ollama (local, no key needed)
|
|
170
|
+
try {
|
|
171
|
+
execSync('ollama --version', { stdio: 'ignore', timeout: 3000 });
|
|
172
|
+
return 'ollama';
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Not available
|
|
176
|
+
}
|
|
177
|
+
// Fall back to API-based providers if key is available
|
|
178
|
+
if (apiKey) {
|
|
179
|
+
if (process.env.GEMINI_API_KEY)
|
|
180
|
+
return 'gemini';
|
|
181
|
+
if (process.env.OPENAI_API_KEY)
|
|
182
|
+
return 'openai';
|
|
183
|
+
return 'gemini'; // default API provider
|
|
184
|
+
}
|
|
185
|
+
// Nothing found — default to gemini-cli and let it fail with a clear error
|
|
186
|
+
return 'gemini-cli';
|
|
187
|
+
}
|
|
188
|
+
/** Get the default model for a provider. */
|
|
189
|
+
function getDefaultModel(provider) {
|
|
190
|
+
switch (provider) {
|
|
191
|
+
case 'gemini': return 'gemini-2.0-flash-exp';
|
|
192
|
+
case 'openai': return 'gpt-4o';
|
|
193
|
+
case 'ollama': return 'llama3';
|
|
194
|
+
default: return ''; // CLI providers don't need a model specified
|
|
108
195
|
}
|
|
109
|
-
return result.data;
|
|
110
196
|
}
|
|
111
197
|
/** Find the first existing rules file in the project. */
|
|
112
198
|
function findRulesFile(root) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules-loader.js","sourceRoot":"","sources":["../../src/guard/rules-loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"rules-loader.js","sourceRoot":"","sources":["../../src/guard/rules-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/guard/schema.d.ts
CHANGED
|
@@ -164,19 +164,19 @@ export declare const ReviewResponseSchema: z.ZodObject<{
|
|
|
164
164
|
summary: string;
|
|
165
165
|
}>;
|
|
166
166
|
export declare const GuardConfigSchema: z.ZodObject<{
|
|
167
|
-
provider: z.ZodDefault<z.ZodEnum<["gemini", "openai"]>>;
|
|
167
|
+
provider: z.ZodDefault<z.ZodEnum<["gemini", "openai", "claude-cli", "gemini-cli", "kiro-cli", "ollama"]>>;
|
|
168
168
|
model: z.ZodDefault<z.ZodString>;
|
|
169
169
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
170
170
|
baseUrl: z.ZodOptional<z.ZodString>;
|
|
171
171
|
}, "strip", z.ZodTypeAny, {
|
|
172
172
|
model: string;
|
|
173
|
-
provider: "gemini" | "openai";
|
|
173
|
+
provider: "gemini" | "openai" | "claude-cli" | "gemini-cli" | "kiro-cli" | "ollama";
|
|
174
174
|
apiKey?: string | undefined;
|
|
175
175
|
baseUrl?: string | undefined;
|
|
176
176
|
}, {
|
|
177
177
|
apiKey?: string | undefined;
|
|
178
178
|
model?: string | undefined;
|
|
179
|
-
provider?: "gemini" | "openai" | undefined;
|
|
179
|
+
provider?: "gemini" | "openai" | "claude-cli" | "gemini-cli" | "kiro-cli" | "ollama" | undefined;
|
|
180
180
|
baseUrl?: string | undefined;
|
|
181
181
|
}>;
|
|
182
182
|
//# sourceMappingURL=schema.d.ts.map
|
package/dist/guard/schema.js
CHANGED
|
@@ -45,8 +45,8 @@ exports.ReviewResponseSchema = zod_1.z.object({
|
|
|
45
45
|
// Guard config schema (optional .skannr/guard.json)
|
|
46
46
|
// ---------------------------------------------------------------------------
|
|
47
47
|
exports.GuardConfigSchema = zod_1.z.object({
|
|
48
|
-
provider: zod_1.z.enum(['gemini', 'openai']).default('
|
|
49
|
-
model: zod_1.z.string().default('
|
|
48
|
+
provider: zod_1.z.enum(['gemini', 'openai', 'claude-cli', 'gemini-cli', 'kiro-cli', 'ollama']).default('auto'),
|
|
49
|
+
model: zod_1.z.string().default(''),
|
|
50
50
|
apiKey: zod_1.z.string().optional(),
|
|
51
51
|
baseUrl: zod_1.z.string().optional(),
|
|
52
52
|
});
|
package/dist/guard/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/guard/schema.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6BAAwB;AAExB,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAEjE,QAAA,cAAc,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAE/D,QAAA,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,sBAAc;IACxB,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE;IACpB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5B,CAAC,CAAC;AAEU,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,kBAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAClC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAEjE,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC1C,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACxC,QAAQ,EAAE,sBAAc;IACxB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE;IACpB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEU,QAAA,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,OAAC,CAAC,KAAK,CAAC,uBAAe,CAAC;IACpC,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3B,CAAC,CAAC;AAEH,8EAA8E;AAC9E,oDAAoD;AACpD,8EAA8E;AAEjE,QAAA,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/guard/schema.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6BAAwB;AAExB,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAEjE,QAAA,cAAc,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAE/D,QAAA,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,sBAAc;IACxB,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE;IACpB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5B,CAAC,CAAC;AAEU,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,kBAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAClC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAEjE,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC1C,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACxC,QAAQ,EAAE,sBAAc;IACxB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE;IACpB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEU,QAAA,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,OAAC,CAAC,KAAK,CAAC,uBAAe,CAAC;IACpC,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3B,CAAC,CAAC;AAEH,8EAA8E;AAC9E,oDAAoD;AACpD,8EAA8E;AAEjE,QAAA,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAa,CAAC;IAC/G,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC"}
|
package/dist/guard/types.d.ts
CHANGED
|
@@ -50,11 +50,11 @@ export interface GuardResult {
|
|
|
50
50
|
}
|
|
51
51
|
/** Guard configuration (provider, model, etc.). */
|
|
52
52
|
export interface GuardConfig {
|
|
53
|
-
/** LLM provider: 'gemini' | 'openai' */
|
|
54
|
-
provider: 'gemini' | 'openai';
|
|
53
|
+
/** LLM provider: 'gemini' | 'openai' | 'claude-cli' | 'gemini-cli' | 'kiro-cli' | 'ollama' */
|
|
54
|
+
provider: 'gemini' | 'openai' | 'claude-cli' | 'gemini-cli' | 'kiro-cli' | 'ollama';
|
|
55
55
|
/** Model name (e.g. 'gemini-2.0-flash-exp', 'gpt-4o'). */
|
|
56
56
|
model: string;
|
|
57
|
-
/** API key (resolved from env if not set). */
|
|
57
|
+
/** API key (resolved from env if not set). Only needed for 'gemini' and 'openai' providers. */
|
|
58
58
|
apiKey?: string;
|
|
59
59
|
/** OpenAI-compatible base URL (for openai provider). */
|
|
60
60
|
baseUrl?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gDAAgD;AAChD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9D,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gDAAgD;AAChD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9D,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,8FAA8F;IAC9F,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;IACpF,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export declare function analyzeProject(options?: AnalyzeOptions & {
|
|
|
10
10
|
export { rankFiles } from './ranker';
|
|
11
11
|
export { rankFilesEnhanced } from './ranker-enhanced';
|
|
12
12
|
export { buildSkeletonForFile } from './skeletonizer';
|
|
13
|
-
export { scanTypeScriptFiles,
|
|
13
|
+
export { scanTypeScriptFiles, scanFiles, discoverModules } from './scanner';
|
|
14
14
|
export { countTokens } from './tokenizer';
|
|
15
15
|
export { buildSkeletonWithMapping, getSymbolDetails, saveMappingToFile, loadMappingFromFile, type SymbolMapping, type SymbolLocation, } from './mapper';
|
|
16
16
|
export type { AnalyzeOptions, AnalysisResult, FileAnalysis, RankedFile, SymbolLineRange, } from './types';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EACL,cAAc,EACd,cAAc,EAGf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAG5D,wBAAsB,cAAc,CAClC,OAAO,CAAC,EAAE,cAAc,GAAG;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACpC,GACA,OAAO,CAAC,cAAc,CAAC,CAyIzB;AA2BD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EACL,cAAc,EACd,cAAc,EAGf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAG5D,wBAAsB,cAAc,CAClC,OAAO,CAAC,EAAE,cAAc,GAAG;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACpC,GACA,OAAO,CAAC,cAAc,CAAC,CAyIzB;AA2BD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACV,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -36,7 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
36
36
|
};
|
|
37
37
|
})();
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.DEFAULT_CACHE_CONFIG = exports.initializeCacheManager = exports.getCacheManager = exports.CacheManager = exports.loadMappingFromFile = exports.saveMappingToFile = exports.getSymbolDetails = exports.buildSkeletonWithMapping = exports.countTokens = exports.discoverModules = exports.scanFiles = exports.
|
|
39
|
+
exports.DEFAULT_CACHE_CONFIG = exports.initializeCacheManager = exports.getCacheManager = exports.CacheManager = exports.loadMappingFromFile = exports.saveMappingToFile = exports.getSymbolDetails = exports.buildSkeletonWithMapping = exports.countTokens = exports.discoverModules = exports.scanFiles = exports.scanTypeScriptFiles = exports.buildSkeletonForFile = exports.rankFilesEnhanced = exports.rankFiles = void 0;
|
|
40
40
|
exports.analyzeProject = analyzeProject;
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
42
|
const scanner_1 = require("./scanner");
|
|
@@ -164,7 +164,6 @@ var skeletonizer_2 = require("./skeletonizer");
|
|
|
164
164
|
Object.defineProperty(exports, "buildSkeletonForFile", { enumerable: true, get: function () { return skeletonizer_2.buildSkeletonForFile; } });
|
|
165
165
|
var scanner_2 = require("./scanner");
|
|
166
166
|
Object.defineProperty(exports, "scanTypeScriptFiles", { enumerable: true, get: function () { return scanner_2.scanTypeScriptFiles; } });
|
|
167
|
-
Object.defineProperty(exports, "scanRocketChatFiles", { enumerable: true, get: function () { return scanner_2.scanRocketChatFiles; } });
|
|
168
167
|
Object.defineProperty(exports, "scanFiles", { enumerable: true, get: function () { return scanner_2.scanFiles; } });
|
|
169
168
|
Object.defineProperty(exports, "discoverModules", { enumerable: true, get: function () { return scanner_2.discoverModules; } });
|
|
170
169
|
var tokenizer_2 = require("./tokenizer");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBH,wCA8IC;AAlKD,2CAA6B;AAC7B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/scanner.d.ts
CHANGED
|
@@ -11,6 +11,5 @@ export interface ScanOptions {
|
|
|
11
11
|
export declare function discoverModules(root: string): string[];
|
|
12
12
|
export declare function scanFiles(rootDir: string, options?: ScanOptions): string[];
|
|
13
13
|
export declare function scanTypeScriptFiles(rootDir: string): string[];
|
|
14
|
-
export declare function scanRocketChatFiles(rootDir: string, moduleKeys?: string[]): string[];
|
|
15
14
|
export declare function readFileContent(filePath: string): string | null;
|
|
16
15
|
//# sourceMappingURL=scanner.d.ts.map
|
package/dist/scanner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,eAAO,MAAM,gBAAgB,UAe5B,CAAC;AAwCF,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC9C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBtD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,CAgD9E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAgB,
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,eAAO,MAAM,gBAAgB,UAe5B,CAAC;AAwCF,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC9C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBtD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,CAgD9E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D"}
|
package/dist/scanner.js
CHANGED
|
@@ -43,7 +43,6 @@ exports.DEFAULT_EXCLUDES = void 0;
|
|
|
43
43
|
exports.discoverModules = discoverModules;
|
|
44
44
|
exports.scanFiles = scanFiles;
|
|
45
45
|
exports.scanTypeScriptFiles = scanTypeScriptFiles;
|
|
46
|
-
exports.scanRocketChatFiles = scanRocketChatFiles;
|
|
47
46
|
exports.readFileContent = readFileContent;
|
|
48
47
|
const ignore_1 = __importDefault(require("ignore"));
|
|
49
48
|
const fs = __importStar(require("fs"));
|
|
@@ -165,12 +164,6 @@ function scanFiles(rootDir, options = {}) {
|
|
|
165
164
|
function scanTypeScriptFiles(rootDir) {
|
|
166
165
|
return scanFiles(rootDir, { extensions: ['.ts', '.tsx'] });
|
|
167
166
|
}
|
|
168
|
-
function scanRocketChatFiles(rootDir, moduleKeys) {
|
|
169
|
-
return scanFiles(rootDir, {
|
|
170
|
-
extensions: ['.ts', '.tsx'],
|
|
171
|
-
moduleKeys,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
167
|
function readFileContent(filePath) {
|
|
175
168
|
try {
|
|
176
169
|
return fs.readFileSync(filePath, 'utf-8');
|
package/dist/scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEH,0CAqBC;AAED,8BAgDC;AAED,kDAEC;AAED,
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/guard/provider.ts
CHANGED
|
@@ -79,6 +79,97 @@ function extractJson(text: string): string {
|
|
|
79
79
|
return text.slice(firstBrace, lastBrace + 1);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Call a CLI-based provider (claude, gemini, kiro).
|
|
84
|
+
* These use the user's existing authenticated session — no API key needed.
|
|
85
|
+
*/
|
|
86
|
+
async function callCli(
|
|
87
|
+
command: string,
|
|
88
|
+
fullPrompt: string,
|
|
89
|
+
): Promise<string> {
|
|
90
|
+
const { execSync } = await import('child_process');
|
|
91
|
+
const fs = await import('fs');
|
|
92
|
+
const path = await import('path');
|
|
93
|
+
const os = await import('os');
|
|
94
|
+
|
|
95
|
+
// Write prompt to a temp file (avoids ARG_MAX limits on large diffs)
|
|
96
|
+
const tmpFile = path.join(os.tmpdir(), `skannr-guard-${Date.now()}.txt`);
|
|
97
|
+
fs.writeFileSync(tmpFile, fullPrompt, 'utf-8');
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
let result: string;
|
|
101
|
+
|
|
102
|
+
switch (command) {
|
|
103
|
+
case 'claude-cli':
|
|
104
|
+
// Claude CLI accepts prompt via stdin pipe with --print flag
|
|
105
|
+
result = execSync(`cat "${tmpFile}" | claude --print`, {
|
|
106
|
+
encoding: 'utf-8',
|
|
107
|
+
timeout: 120_000,
|
|
108
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
109
|
+
});
|
|
110
|
+
break;
|
|
111
|
+
|
|
112
|
+
case 'gemini-cli':
|
|
113
|
+
// Gemini CLI accepts prompt via -p flag
|
|
114
|
+
result = execSync(`gemini -p "$(cat "${tmpFile}")"`, {
|
|
115
|
+
encoding: 'utf-8',
|
|
116
|
+
timeout: 120_000,
|
|
117
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
118
|
+
});
|
|
119
|
+
break;
|
|
120
|
+
|
|
121
|
+
case 'kiro-cli':
|
|
122
|
+
// Kiro CLI accepts prompt via stdin in non-interactive mode
|
|
123
|
+
result = execSync(`cat "${tmpFile}" | kiro-cli chat --no-interactive "Review and respond with JSON only."`, {
|
|
124
|
+
encoding: 'utf-8',
|
|
125
|
+
timeout: 120_000,
|
|
126
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
127
|
+
});
|
|
128
|
+
break;
|
|
129
|
+
|
|
130
|
+
default:
|
|
131
|
+
throw new Error(`Unknown CLI provider: ${command}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return result;
|
|
135
|
+
} finally {
|
|
136
|
+
try { fs.unlinkSync(tmpFile); } catch {}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Call Ollama local inference.
|
|
142
|
+
*/
|
|
143
|
+
async function callOllama(
|
|
144
|
+
model: string,
|
|
145
|
+
systemPrompt: string,
|
|
146
|
+
userPrompt: string,
|
|
147
|
+
): Promise<string> {
|
|
148
|
+
const baseUrl = process.env.OLLAMA_BASE_URL || 'http://localhost:11434';
|
|
149
|
+
const url = `${baseUrl}/api/chat`;
|
|
150
|
+
|
|
151
|
+
const response = await fetch(url, {
|
|
152
|
+
method: 'POST',
|
|
153
|
+
headers: { 'Content-Type': 'application/json' },
|
|
154
|
+
body: JSON.stringify({
|
|
155
|
+
model: model || 'llama3',
|
|
156
|
+
messages: [
|
|
157
|
+
{ role: 'system', content: systemPrompt },
|
|
158
|
+
{ role: 'user', content: userPrompt },
|
|
159
|
+
],
|
|
160
|
+
stream: false,
|
|
161
|
+
format: 'json',
|
|
162
|
+
}),
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
if (!response.ok) {
|
|
166
|
+
throw new Error(`Ollama error: ${response.status} ${response.statusText}`);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const data = await response.json() as any;
|
|
170
|
+
return data.message?.content ?? '';
|
|
171
|
+
}
|
|
172
|
+
|
|
82
173
|
/**
|
|
83
174
|
* Call Gemini API with structured output enforcement.
|
|
84
175
|
*/
|
|
@@ -170,9 +261,24 @@ export async function runLlmReview(
|
|
|
170
261
|
|
|
171
262
|
let rawResponse: string;
|
|
172
263
|
try {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
264
|
+
switch (config.provider) {
|
|
265
|
+
case 'openai':
|
|
266
|
+
rawResponse = await callOpenAI(config, systemPrompt, prompt);
|
|
267
|
+
break;
|
|
268
|
+
case 'gemini':
|
|
269
|
+
rawResponse = await callGemini(config, systemPrompt, prompt);
|
|
270
|
+
break;
|
|
271
|
+
case 'ollama':
|
|
272
|
+
rawResponse = await callOllama(config.model, systemPrompt, prompt);
|
|
273
|
+
break;
|
|
274
|
+
case 'claude-cli':
|
|
275
|
+
case 'gemini-cli':
|
|
276
|
+
case 'kiro-cli':
|
|
277
|
+
rawResponse = await callCli(config.provider, systemPrompt + '\n\n' + prompt);
|
|
278
|
+
break;
|
|
279
|
+
default:
|
|
280
|
+
throw new Error(`Unsupported provider: ${config.provider}`);
|
|
281
|
+
}
|
|
176
282
|
} catch (err) {
|
|
177
283
|
throw new Error(
|
|
178
284
|
`Provider call failed (${config.provider}): ${err instanceof Error ? err.message : String(err)}`,
|
|
@@ -16,23 +16,57 @@ const RULES_PATHS = [
|
|
|
16
16
|
'.skannr/rules.yml',
|
|
17
17
|
];
|
|
18
18
|
|
|
19
|
-
/**
|
|
19
|
+
/** Built-in default rules used when no .skannr/rules.json exists. */
|
|
20
|
+
const DEFAULT_RULES: GuardRule[] = [
|
|
21
|
+
{
|
|
22
|
+
id: 'no-any-type',
|
|
23
|
+
description: 'Do not use the `any` type in TypeScript; use explicit types or `unknown`.',
|
|
24
|
+
severity: 'high',
|
|
25
|
+
fixable: true,
|
|
26
|
+
category: 'type-safety',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'no-console-log',
|
|
30
|
+
description: 'Remove console.log statements before committing; use a proper logger in production code.',
|
|
31
|
+
severity: 'medium',
|
|
32
|
+
fixable: true,
|
|
33
|
+
category: 'code-quality',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'error-handling',
|
|
37
|
+
description: 'Async functions that can throw should have error handling (try/catch or .catch()).',
|
|
38
|
+
severity: 'high',
|
|
39
|
+
fixable: false,
|
|
40
|
+
category: 'reliability',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 'no-hardcoded-secrets',
|
|
44
|
+
description: 'Do not hardcode API keys, passwords, tokens, or connection strings. Use environment variables.',
|
|
45
|
+
severity: 'critical',
|
|
46
|
+
fixable: false,
|
|
47
|
+
category: 'security',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'function-complexity',
|
|
51
|
+
description: 'Functions should not exceed ~40 lines. Extract helper functions for complex logic.',
|
|
52
|
+
severity: 'medium',
|
|
53
|
+
fixable: false,
|
|
54
|
+
category: 'maintainability',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'unused-imports',
|
|
58
|
+
description: 'Remove unused imports.',
|
|
59
|
+
severity: 'low',
|
|
60
|
+
fixable: true,
|
|
61
|
+
category: 'code-quality',
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
/** Load and validate rules from the project root. Falls back to defaults if no file exists. */
|
|
20
66
|
export function loadRules(root: string): GuardRule[] {
|
|
21
67
|
const rulesPath = findRulesFile(root);
|
|
22
68
|
if (!rulesPath) {
|
|
23
|
-
|
|
24
|
-
`No rules file found. Create .skannr/rules.json with your team's review rules.\n` +
|
|
25
|
-
`Example:\n` +
|
|
26
|
-
`{\n` +
|
|
27
|
-
` "rules": [{\n` +
|
|
28
|
-
` "id": "no-any-type",\n` +
|
|
29
|
-
` "description": "Do not use the \`any\` type in TypeScript.",\n` +
|
|
30
|
-
` "severity": "high",\n` +
|
|
31
|
-
` "fixable": true,\n` +
|
|
32
|
-
` "category": "type-safety"\n` +
|
|
33
|
-
` }]\n` +
|
|
34
|
-
`}`,
|
|
35
|
-
);
|
|
69
|
+
return DEFAULT_RULES;
|
|
36
70
|
}
|
|
37
71
|
|
|
38
72
|
const raw = fs.readFileSync(rulesPath, 'utf-8');
|
|
@@ -69,20 +103,75 @@ export function loadGuardConfig(root: string): GuardConfig {
|
|
|
69
103
|
}
|
|
70
104
|
|
|
71
105
|
// Env vars override file config
|
|
72
|
-
const
|
|
73
|
-
const model = (process.env.SKANNR_GUARD_MODEL || rawConfig.model || '
|
|
106
|
+
const explicitProvider = process.env.SKANNR_GUARD_PROVIDER || rawConfig.provider as string | undefined;
|
|
107
|
+
const model = (process.env.SKANNR_GUARD_MODEL || rawConfig.model || '') as string;
|
|
74
108
|
const apiKey = process.env.SKANNR_GUARD_API_KEY
|
|
75
109
|
|| process.env.GEMINI_API_KEY
|
|
76
110
|
|| process.env.OPENAI_API_KEY
|
|
77
111
|
|| (rawConfig.apiKey as string | undefined);
|
|
78
112
|
const baseUrl = process.env.OPENAI_BASE_URL || (rawConfig.baseUrl as string | undefined);
|
|
79
113
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
114
|
+
// Auto-detect provider if not explicitly set
|
|
115
|
+
const provider = explicitProvider || autoDetectProvider(apiKey);
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
provider: provider as GuardConfig['provider'],
|
|
119
|
+
model: model || getDefaultModel(provider),
|
|
120
|
+
apiKey,
|
|
121
|
+
baseUrl,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Auto-detect the best available provider.
|
|
127
|
+
* Priority: existing CLI tools (free, already authenticated) > API keys.
|
|
128
|
+
*/
|
|
129
|
+
function autoDetectProvider(apiKey?: string): string {
|
|
130
|
+
const { execSync } = require('child_process');
|
|
131
|
+
|
|
132
|
+
// Check for CLI tools first (no API key needed)
|
|
133
|
+
const cliChecks: Array<[string, string]> = [
|
|
134
|
+
['claude', 'claude-cli'],
|
|
135
|
+
['gemini', 'gemini-cli'],
|
|
136
|
+
['kiro-cli', 'kiro-cli'],
|
|
137
|
+
];
|
|
138
|
+
|
|
139
|
+
for (const [cmd, provider] of cliChecks) {
|
|
140
|
+
try {
|
|
141
|
+
execSync(`${cmd} --version`, { stdio: 'ignore', timeout: 3000 });
|
|
142
|
+
return provider;
|
|
143
|
+
} catch {
|
|
144
|
+
// Not available, try next
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Check for Ollama (local, no key needed)
|
|
149
|
+
try {
|
|
150
|
+
execSync('ollama --version', { stdio: 'ignore', timeout: 3000 });
|
|
151
|
+
return 'ollama';
|
|
152
|
+
} catch {
|
|
153
|
+
// Not available
|
|
83
154
|
}
|
|
84
155
|
|
|
85
|
-
|
|
156
|
+
// Fall back to API-based providers if key is available
|
|
157
|
+
if (apiKey) {
|
|
158
|
+
if (process.env.GEMINI_API_KEY) return 'gemini';
|
|
159
|
+
if (process.env.OPENAI_API_KEY) return 'openai';
|
|
160
|
+
return 'gemini'; // default API provider
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Nothing found — default to gemini-cli and let it fail with a clear error
|
|
164
|
+
return 'gemini-cli';
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Get the default model for a provider. */
|
|
168
|
+
function getDefaultModel(provider: string): string {
|
|
169
|
+
switch (provider) {
|
|
170
|
+
case 'gemini': return 'gemini-2.0-flash-exp';
|
|
171
|
+
case 'openai': return 'gpt-4o';
|
|
172
|
+
case 'ollama': return 'llama3';
|
|
173
|
+
default: return ''; // CLI providers don't need a model specified
|
|
174
|
+
}
|
|
86
175
|
}
|
|
87
176
|
|
|
88
177
|
/** Find the first existing rules file in the project. */
|
package/src/guard/schema.ts
CHANGED
|
@@ -52,8 +52,8 @@ export const ReviewResponseSchema = z.object({
|
|
|
52
52
|
// ---------------------------------------------------------------------------
|
|
53
53
|
|
|
54
54
|
export const GuardConfigSchema = z.object({
|
|
55
|
-
provider: z.enum(['gemini', 'openai']).default('
|
|
56
|
-
model: z.string().default('
|
|
55
|
+
provider: z.enum(['gemini', 'openai', 'claude-cli', 'gemini-cli', 'kiro-cli', 'ollama']).default('auto' as any),
|
|
56
|
+
model: z.string().default(''),
|
|
57
57
|
apiKey: z.string().optional(),
|
|
58
58
|
baseUrl: z.string().optional(),
|
|
59
59
|
});
|
package/src/guard/types.ts
CHANGED
|
@@ -57,11 +57,11 @@ export interface GuardResult {
|
|
|
57
57
|
|
|
58
58
|
/** Guard configuration (provider, model, etc.). */
|
|
59
59
|
export interface GuardConfig {
|
|
60
|
-
/** LLM provider: 'gemini' | 'openai' */
|
|
61
|
-
provider: 'gemini' | 'openai';
|
|
60
|
+
/** LLM provider: 'gemini' | 'openai' | 'claude-cli' | 'gemini-cli' | 'kiro-cli' | 'ollama' */
|
|
61
|
+
provider: 'gemini' | 'openai' | 'claude-cli' | 'gemini-cli' | 'kiro-cli' | 'ollama';
|
|
62
62
|
/** Model name (e.g. 'gemini-2.0-flash-exp', 'gpt-4o'). */
|
|
63
63
|
model: string;
|
|
64
|
-
/** API key (resolved from env if not set). */
|
|
64
|
+
/** API key (resolved from env if not set). Only needed for 'gemini' and 'openai' providers. */
|
|
65
65
|
apiKey?: string;
|
|
66
66
|
/** OpenAI-compatible base URL (for openai provider). */
|
|
67
67
|
baseUrl?: string;
|
package/src/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import * as path from 'path';
|
|
6
|
-
import { discoverModules, readFileContent, scanFiles,
|
|
6
|
+
import { discoverModules, readFileContent, scanFiles, scanTypeScriptFiles } from './scanner';
|
|
7
7
|
import { rankFiles } from './ranker';
|
|
8
8
|
import { rankFilesEnhanced } from './ranker-enhanced';
|
|
9
9
|
import { buildSkeletonForFile } from './skeletonizer';
|
|
@@ -194,7 +194,7 @@ function resolveExtensions(
|
|
|
194
194
|
export { rankFiles } from './ranker';
|
|
195
195
|
export { rankFilesEnhanced } from './ranker-enhanced';
|
|
196
196
|
export { buildSkeletonForFile } from './skeletonizer';
|
|
197
|
-
export { scanTypeScriptFiles,
|
|
197
|
+
export { scanTypeScriptFiles, scanFiles, discoverModules } from './scanner';
|
|
198
198
|
export { countTokens } from './tokenizer';
|
|
199
199
|
export {
|
|
200
200
|
buildSkeletonWithMapping,
|
package/src/scanner.ts
CHANGED
|
@@ -145,13 +145,6 @@ export function scanTypeScriptFiles(rootDir: string): string[] {
|
|
|
145
145
|
return scanFiles(rootDir, { extensions: ['.ts', '.tsx'] });
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
export function scanRocketChatFiles(rootDir: string, moduleKeys?: string[]): string[] {
|
|
149
|
-
return scanFiles(rootDir, {
|
|
150
|
-
extensions: ['.ts', '.tsx'],
|
|
151
|
-
moduleKeys,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
148
|
export function readFileContent(filePath: string): string | null {
|
|
156
149
|
try {
|
|
157
150
|
return fs.readFileSync(filePath, 'utf-8');
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Universal Code Analyzer
|
|
2
|
-
|
|
3
|
-
You have a tool called `scan_codebase` that scans any repository and returns compressed **skeletons** — function signatures and types without the full implementation bodies.
|
|
4
|
-
|
|
5
|
-
## When to use it
|
|
6
|
-
|
|
7
|
-
Use `scan_codebase` before reading source files. It tells you which files are relevant and shows their structure without burning tokens on full file contents.
|
|
8
|
-
|
|
9
|
-
## Parameters
|
|
10
|
-
|
|
11
|
-
- `question` (**required**): what you want to understand, e.g. `"how are messages sent?"`
|
|
12
|
-
- `root` (**required**): absolute path to the repository, e.g. `/home/user/my-project`
|
|
13
|
-
- `limit`: how many files to return (default: 10)
|
|
14
|
-
- `modules`: narrow the search to specific modules or directories
|
|
15
|
-
|
|
16
|
-
## Example
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
scan_codebase({
|
|
20
|
-
question: "How does the authentication flow work?",
|
|
21
|
-
root: "/home/user/my-project",
|
|
22
|
-
modules: ["auth"]
|
|
23
|
-
})
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
The response includes each file's path, relevance score, skeleton code, and token counts so you can decide what to read in full.
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "code-analyzer",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"description": "Analyze any codebase and return token-efficient structural skeletons",
|
|
5
|
-
"mcpServers": {
|
|
6
|
-
"code-analyzer": {
|
|
7
|
-
"command": "node",
|
|
8
|
-
"args": ["${extensionPath}/dist/server.js"]
|
|
9
|
-
}
|
|
10
|
-
},
|
|
11
|
-
"contextFileName": "GEMINI.md"
|
|
12
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
-
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
-
import { analyzeProject } from '../../dist/index';
|
|
5
|
-
|
|
6
|
-
const server = new Server(
|
|
7
|
-
{ name: 'code-analyzer', version: '0.1.0' },
|
|
8
|
-
{ capabilities: { tools: {} } }
|
|
9
|
-
);
|
|
10
|
-
|
|
11
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
12
|
-
tools: [
|
|
13
|
-
{
|
|
14
|
-
name: 'scan_codebase',
|
|
15
|
-
description: 'Analyzes any codebase to answer questions about its structure and architecture. Scans files, generates structural skeletons, and ranks results using hybrid retrieval. Supports TypeScript, JavaScript, and Python. Pass the root path of any repository.',
|
|
16
|
-
inputSchema: {
|
|
17
|
-
type: 'object',
|
|
18
|
-
properties: {
|
|
19
|
-
question: {
|
|
20
|
-
type: 'string',
|
|
21
|
-
description: 'What you want to understand about the codebase',
|
|
22
|
-
},
|
|
23
|
-
root: {
|
|
24
|
-
type: 'string',
|
|
25
|
-
description: 'Absolute path to the repository root',
|
|
26
|
-
},
|
|
27
|
-
limit: {
|
|
28
|
-
type: 'number',
|
|
29
|
-
description: 'Max number of files to return (default: 10)',
|
|
30
|
-
},
|
|
31
|
-
modules: {
|
|
32
|
-
type: 'array',
|
|
33
|
-
items: { type: 'string' },
|
|
34
|
-
description: 'Optional module keys (or directory names) to narrow the search scope',
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
required: ['question', 'root'],
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
}));
|
|
42
|
-
|
|
43
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
44
|
-
if (request.params.name !== 'scan_codebase') {
|
|
45
|
-
throw new Error(`Unknown tool: ${request.params.name}`);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const { question, root, limit = 10, modules } = request.params.arguments as {
|
|
49
|
-
question: string;
|
|
50
|
-
root: string;
|
|
51
|
-
limit?: number;
|
|
52
|
-
modules?: string[];
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
const result = await analyzeProject({
|
|
56
|
-
question,
|
|
57
|
-
root,
|
|
58
|
-
limit,
|
|
59
|
-
moduleKeys: modules,
|
|
60
|
-
enhancedRanking: true,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
65
|
-
};
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
const transport = new StdioServerTransport();
|
|
69
|
-
server.connect(transport).catch(console.error);
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "commonjs",
|
|
5
|
-
"outDir": "./dist",
|
|
6
|
-
"rootDir": "./src",
|
|
7
|
-
"strict": true,
|
|
8
|
-
"esModuleInterop": true,
|
|
9
|
-
"skipLibCheck": true,
|
|
10
|
-
"moduleResolution": "node",
|
|
11
|
-
"types": ["node"]
|
|
12
|
-
},
|
|
13
|
-
"include": ["src/**/*"]
|
|
14
|
-
}
|