skannr 0.1.1
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/.eslintrc.js +22 -0
- package/README.md +109 -0
- package/dist/agent-cli.d.ts +7 -0
- package/dist/agent-cli.d.ts.map +1 -0
- package/dist/agent-cli.js +364 -0
- package/dist/agent-cli.js.map +1 -0
- package/dist/agent.d.ts +115 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +340 -0
- package/dist/agent.js.map +1 -0
- package/dist/benchmark.d.ts +53 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +307 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cache.d.ts +97 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +284 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +238 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +52 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +176 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/GenericAdapter.d.ts +10 -0
- package/dist/languages/GenericAdapter.d.ts.map +1 -0
- package/dist/languages/GenericAdapter.js +41 -0
- package/dist/languages/GenericAdapter.js.map +1 -0
- package/dist/languages/LanguageAdapter.d.ts +14 -0
- package/dist/languages/LanguageAdapter.d.ts.map +1 -0
- package/dist/languages/LanguageAdapter.js +3 -0
- package/dist/languages/LanguageAdapter.js.map +1 -0
- package/dist/languages/PythonAdapter.d.ts +10 -0
- package/dist/languages/PythonAdapter.d.ts.map +1 -0
- package/dist/languages/PythonAdapter.js +98 -0
- package/dist/languages/PythonAdapter.js.map +1 -0
- package/dist/languages/TypeScriptAdapter.d.ts +17 -0
- package/dist/languages/TypeScriptAdapter.d.ts.map +1 -0
- package/dist/languages/TypeScriptAdapter.js +321 -0
- package/dist/languages/TypeScriptAdapter.js.map +1 -0
- package/dist/languages/registry.d.ts +4 -0
- package/dist/languages/registry.d.ts.map +1 -0
- package/dist/languages/registry.js +86 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/mapper.d.ts +49 -0
- package/dist/mapper.d.ts.map +1 -0
- package/dist/mapper.js +386 -0
- package/dist/mapper.js.map +1 -0
- package/dist/ranker-enhanced.d.ts +37 -0
- package/dist/ranker-enhanced.d.ts.map +1 -0
- package/dist/ranker-enhanced.js +395 -0
- package/dist/ranker-enhanced.js.map +1 -0
- package/dist/ranker.d.ts +14 -0
- package/dist/ranker.d.ts.map +1 -0
- package/dist/ranker.js +105 -0
- package/dist/ranker.js.map +1 -0
- package/dist/rocket-chat-scope.d.ts +7 -0
- package/dist/rocket-chat-scope.d.ts.map +1 -0
- package/dist/rocket-chat-scope.js +95 -0
- package/dist/rocket-chat-scope.js.map +1 -0
- package/dist/scanner.d.ts +16 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +228 -0
- package/dist/scanner.js.map +1 -0
- package/dist/skeletonizer.d.ts +5 -0
- package/dist/skeletonizer.d.ts.map +1 -0
- package/dist/skeletonizer.js +52 -0
- package/dist/skeletonizer.js.map +1 -0
- package/dist/tokenizer.d.ts +9 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +21 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/gemini-extension/GEMINI.md +26 -0
- package/gemini-extension/gemini-extension.json +12 -0
- package/gemini-extension/package.json +14 -0
- package/gemini-extension/src/server.ts +63 -0
- package/gemini-extension/tsconfig.json +14 -0
- package/jest.config.js +5 -0
- package/package.json +46 -0
- package/src/agent-cli.ts +383 -0
- package/src/agent.ts +344 -0
- package/src/benchmark.ts +389 -0
- package/src/cache.ts +317 -0
- package/src/cli.ts +223 -0
- package/src/config.ts +22 -0
- package/src/index.ts +215 -0
- package/src/languages/GenericAdapter.ts +44 -0
- package/src/languages/LanguageAdapter.ts +14 -0
- package/src/languages/PythonAdapter.ts +74 -0
- package/src/languages/TypeScriptAdapter.ts +338 -0
- package/src/languages/registry.ts +49 -0
- package/src/mapper.ts +448 -0
- package/src/ranker-enhanced.ts +460 -0
- package/src/ranker.ts +92 -0
- package/src/scanner.ts +201 -0
- package/src/skeletonizer.ts +16 -0
- package/src/tokenizer.ts +20 -0
- package/src/types.ts +71 -0
- package/tests/agent.tools.test.ts +81 -0
- package/tests/benchmark.test.ts +31 -0
- package/tests/fixtures/sample.py +17 -0
- package/tests/fixtures/sample.ts +13 -0
- package/tests/fixtures/src/api/routes.ts +1 -0
- package/tests/fixtures/src/auth/permission.ts +3 -0
- package/tests/ranker-enhanced.test.ts +68 -0
- package/tests/ranker.test.ts +75 -0
- package/tests/scanner.scope.test.ts +41 -0
- package/tests/setup-fixtures.js +29 -0
- package/tests/skeletonizer.test.ts +142 -0
- package/tsconfig.json +21 -0
- package/uca-landing/index.html +17 -0
- package/uca-landing/package.json +23 -0
- package/uca-landing/postcss.config.js +6 -0
- package/uca-landing/src/App.jsx +43 -0
- package/uca-landing/src/components/AgentMode.jsx +45 -0
- package/uca-landing/src/components/CliReference.jsx +49 -0
- package/uca-landing/src/components/Features.jsx +63 -0
- package/uca-landing/src/components/Footer.jsx +35 -0
- package/uca-landing/src/components/Hero.jsx +124 -0
- package/uca-landing/src/components/HowItWorks.jsx +60 -0
- package/uca-landing/src/components/Install.jsx +90 -0
- package/uca-landing/src/components/LanguageSupport.jsx +63 -0
- package/uca-landing/src/components/Navbar.jsx +86 -0
- package/uca-landing/src/components/Problem.jsx +51 -0
- package/uca-landing/src/components/Reveal.jsx +40 -0
- package/uca-landing/src/components/WorksWith.jsx +59 -0
- package/uca-landing/src/hooks/useScrollNav.js +13 -0
- package/uca-landing/src/hooks/useTypewriter.js +41 -0
- package/uca-landing/src/index.css +13 -0
- package/uca-landing/src/main.jsx +10 -0
- package/uca-landing/tailwind.config.js +68 -0
- package/uca-landing/vite.config.js +6 -0
package/.eslintrc.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
parser: '@typescript-eslint/parser',
|
|
3
|
+
extends: [
|
|
4
|
+
'eslint:recommended',
|
|
5
|
+
'plugin:@typescript-eslint/recommended',
|
|
6
|
+
],
|
|
7
|
+
parserOptions: {
|
|
8
|
+
ecmaVersion: 2022,
|
|
9
|
+
sourceType: 'module',
|
|
10
|
+
},
|
|
11
|
+
env: {
|
|
12
|
+
node: true,
|
|
13
|
+
es6: true,
|
|
14
|
+
jest: true,
|
|
15
|
+
},
|
|
16
|
+
rules: {
|
|
17
|
+
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
18
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
19
|
+
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
20
|
+
'no-console': 'off',
|
|
21
|
+
},
|
|
22
|
+
};
|
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Skannr
|
|
2
|
+
|
|
3
|
+
A CLI tool and MCP server that helps AI agents understand **any codebase**.
|
|
4
|
+
It scans files, generates compressed structural "skeletons", and ranks results
|
|
5
|
+
using hybrid retrieval — reducing token usage by ~96% vs full file scans.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
1. You point it at any repo with `--root /path/to/repo`
|
|
10
|
+
2. It auto-detects the language (TypeScript, JavaScript, Python, or generic fallback)
|
|
11
|
+
3. It auto-discovers your project's modules from the folder structure
|
|
12
|
+
4. For your question, it ranks the most relevant files using lexical + structural + dependency-graph analysis
|
|
13
|
+
5. It strips function bodies from files (keeping types, signatures, imports)
|
|
14
|
+
6. Returns compact skeletons an AI can reason over without blowing the context window
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g skannr
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
### CLI
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Basic
|
|
28
|
+
skannr --question "how does authentication work?" --root /path/to/any/repo
|
|
29
|
+
|
|
30
|
+
# Limit results
|
|
31
|
+
skannr --question "database connection setup" --root . --limit 5
|
|
32
|
+
|
|
33
|
+
# Focus on specific modules (auto-discovered if not specified)
|
|
34
|
+
skannr --question "permission checks" --root . --modules auth,middleware
|
|
35
|
+
|
|
36
|
+
# Force language
|
|
37
|
+
skannr --question "class structure" --root /path/to/python/project --lang python
|
|
38
|
+
|
|
39
|
+
# Interactive agent mode
|
|
40
|
+
skannr-agent --root /path/to/repo
|
|
41
|
+
|
|
42
|
+
# Cache management
|
|
43
|
+
skannr --cache-stats
|
|
44
|
+
skannr --cache-clear
|
|
45
|
+
skannr --question "..." --skip-cache
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### MCP Server (use with Gemini CLI, Claude Code, Cursor, etc.)
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"mcpServers": {
|
|
53
|
+
"skannr": {
|
|
54
|
+
"command": "npx",
|
|
55
|
+
"args": ["skannr"]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Config File (optional)
|
|
62
|
+
|
|
63
|
+
Drop a `code-analyzer.config.json` in your repo root:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"modules": {
|
|
68
|
+
"auth": ["src/auth", "lib/auth"],
|
|
69
|
+
"api": ["src/api", "src/routes"]
|
|
70
|
+
},
|
|
71
|
+
"exclude": ["**/generated/**", "**/migrations/**"],
|
|
72
|
+
"extensions": [".ts", ".js"],
|
|
73
|
+
"defaultLimit": 10
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Supported Languages
|
|
78
|
+
|
|
79
|
+
| Language | Skeleton Support |
|
|
80
|
+
|---|---|
|
|
81
|
+
| TypeScript / TSX | Full AST (ts-morph) |
|
|
82
|
+
| JavaScript / JSX | Full AST (ts-morph) |
|
|
83
|
+
| Python | Regex-based (signatures + types) |
|
|
84
|
+
| Others | First 50 lines (generic fallback) |
|
|
85
|
+
|
|
86
|
+
## Performance
|
|
87
|
+
|
|
88
|
+
Benchmarked on large TypeScript monorepo:
|
|
89
|
+
|
|
90
|
+
| Metric | Result |
|
|
91
|
+
|---|---|
|
|
92
|
+
| Token Reduction vs Full Scan | ~96.5% |
|
|
93
|
+
| Token Reduction vs Top-N | ~78.2% |
|
|
94
|
+
| Avg keyword coverage | ~75% |
|
|
95
|
+
| Directory diversity (top-5) | ~80% |
|
|
96
|
+
| Average execution time | ~1.2s |
|
|
97
|
+
|
|
98
|
+
## Interactive Agent Commands
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
/help Show all commands
|
|
102
|
+
/files List retrieved files
|
|
103
|
+
/symbols <query> Search for symbols
|
|
104
|
+
/symbol <id> Get full implementation
|
|
105
|
+
/deps <file> Show imports for a file
|
|
106
|
+
/refresh Re-analyze with new context
|
|
107
|
+
/stats Show mapping statistics
|
|
108
|
+
/exit Quit
|
|
109
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-cli.d.ts","sourceRoot":"","sources":["../src/agent-cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Agent CLI - Interactive code analysis with Gemini AI
|
|
5
|
+
* This demonstrates the agentic code analysis workflow
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
const agent_1 = require("./agent");
|
|
42
|
+
const index_1 = require("./index");
|
|
43
|
+
const readline = __importStar(require("readline"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
function buildSkeletonContext(result, includeScores) {
|
|
46
|
+
return result.files
|
|
47
|
+
.map((file) => {
|
|
48
|
+
if (includeScores) {
|
|
49
|
+
return `=== ${file.path} (score: ${file.score.toFixed(2)}) ===\n${file.skeleton}`;
|
|
50
|
+
}
|
|
51
|
+
return `=== ${file.path} ===\n${file.skeleton}`;
|
|
52
|
+
})
|
|
53
|
+
.join('\n\n');
|
|
54
|
+
}
|
|
55
|
+
function printEvidence(result) {
|
|
56
|
+
console.log('📚 Retrieval Evidence:');
|
|
57
|
+
for (const file of result.files.slice(0, 10)) {
|
|
58
|
+
console.log(`- ${file.path} (score: ${file.score.toFixed(2)})`);
|
|
59
|
+
}
|
|
60
|
+
console.log('');
|
|
61
|
+
}
|
|
62
|
+
function printInteractiveHelp() {
|
|
63
|
+
console.log('Commands:');
|
|
64
|
+
console.log(' /help Show this help');
|
|
65
|
+
console.log(' /files List currently retrieved files');
|
|
66
|
+
console.log(' /symbols <query> Search symbols in loaded mapping');
|
|
67
|
+
console.log(' /symbol <symbolId> Show full implementation for a symbol');
|
|
68
|
+
console.log(' /deps <filePath> Show imports and symbols for a file');
|
|
69
|
+
console.log(' /refresh Re-analyze project and refresh context');
|
|
70
|
+
console.log(' /stats Show mapping statistics');
|
|
71
|
+
console.log(' /exit Quit interactive mode');
|
|
72
|
+
console.log('');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parse command line arguments
|
|
76
|
+
*/
|
|
77
|
+
function parseArgs() {
|
|
78
|
+
const args = process.argv.slice(2);
|
|
79
|
+
let root = process.cwd();
|
|
80
|
+
let question = '';
|
|
81
|
+
let limit = 10;
|
|
82
|
+
let apiKey = process.env.GEMINI_API_KEY;
|
|
83
|
+
let model = 'gemini-2.0-flash-exp';
|
|
84
|
+
let interactive = false;
|
|
85
|
+
for (let i = 0; i < args.length; i++) {
|
|
86
|
+
const arg = args[i];
|
|
87
|
+
if (arg === '--root' && i + 1 < args.length) {
|
|
88
|
+
root = args[i + 1];
|
|
89
|
+
i++;
|
|
90
|
+
}
|
|
91
|
+
else if (arg === '--question' && i + 1 < args.length) {
|
|
92
|
+
question = args[i + 1];
|
|
93
|
+
i++;
|
|
94
|
+
}
|
|
95
|
+
else if (arg === '--limit' && i + 1 < args.length) {
|
|
96
|
+
limit = parseInt(args[i + 1], 10);
|
|
97
|
+
if (isNaN(limit) || limit < 1) {
|
|
98
|
+
console.error('Error: --limit must be a positive number');
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
i++;
|
|
102
|
+
}
|
|
103
|
+
else if (arg === '--api-key' && i + 1 < args.length) {
|
|
104
|
+
apiKey = args[i + 1];
|
|
105
|
+
i++;
|
|
106
|
+
}
|
|
107
|
+
else if (arg === '--model' && i + 1 < args.length) {
|
|
108
|
+
model = args[i + 1];
|
|
109
|
+
i++;
|
|
110
|
+
}
|
|
111
|
+
else if (arg === '--interactive' || arg === '-i') {
|
|
112
|
+
interactive = true;
|
|
113
|
+
}
|
|
114
|
+
else if (arg === '--help' || arg === '-h') {
|
|
115
|
+
printHelp();
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.error(`Unknown argument: ${arg}`);
|
|
120
|
+
printHelp();
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!apiKey) {
|
|
125
|
+
console.error('Error: GEMINI_API_KEY environment variable or --api-key is required\n');
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
if (!question && !interactive) {
|
|
129
|
+
console.error('Error: --question is required (or use --interactive for chat mode)\n');
|
|
130
|
+
printHelp();
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
return { root, question, limit, apiKey, model, interactive };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Print help message
|
|
137
|
+
*/
|
|
138
|
+
function printHelp() {
|
|
139
|
+
console.log(`
|
|
140
|
+
uca-agent - AI-Powered Code Analysis Agent
|
|
141
|
+
|
|
142
|
+
Usage:
|
|
143
|
+
uca-agent --question "<text>" [options]
|
|
144
|
+
uca-agent --interactive [options]
|
|
145
|
+
|
|
146
|
+
Options:
|
|
147
|
+
--root <path> Project root directory (default: current directory)
|
|
148
|
+
--question "<text>" Question to analyze (required unless --interactive)
|
|
149
|
+
--limit <number> Number of top files to analyze (default: 10)
|
|
150
|
+
--api-key <key> Gemini API key (or set GEMINI_API_KEY env var)
|
|
151
|
+
--model <name> Gemini model name (default: gemini-2.0-flash-exp)
|
|
152
|
+
--interactive, -i Start interactive chat mode
|
|
153
|
+
--help, -h Show this help message
|
|
154
|
+
|
|
155
|
+
Example:
|
|
156
|
+
uca-agent --question "How does authentication work?"
|
|
157
|
+
uca-agent --interactive --root ./my-project
|
|
158
|
+
uca-agent --question "Find all API endpoints" --limit 15
|
|
159
|
+
|
|
160
|
+
Environment Variables:
|
|
161
|
+
GEMINI_API_KEY Gemini API key (alternative to --api-key)
|
|
162
|
+
`);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Run single question mode
|
|
166
|
+
*/
|
|
167
|
+
async function runSingleQuestion(args) {
|
|
168
|
+
console.log('🔍 Analyzing codebase...\n');
|
|
169
|
+
// Step 1: Generate skeletons with mapping
|
|
170
|
+
const result = await (0, index_1.analyzeProject)({
|
|
171
|
+
root: args.root,
|
|
172
|
+
question: args.question,
|
|
173
|
+
limit: args.limit,
|
|
174
|
+
generateMapping: true,
|
|
175
|
+
});
|
|
176
|
+
if (result.files.length === 0) {
|
|
177
|
+
console.log('No files found for analysis.');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
console.log(`📊 Found ${result.files.length} relevant files\n`);
|
|
181
|
+
// Prepare skeleton context
|
|
182
|
+
const skeletonContext = buildSkeletonContext(result, true);
|
|
183
|
+
// Step 2: Create agent and load mapping
|
|
184
|
+
const agent = (0, agent_1.createCodeAnalysisAgent)(args.apiKey, args.model);
|
|
185
|
+
const mappingPath = path.join(result.root, 'code-analyzer.mapping.json');
|
|
186
|
+
agent.loadMapping(mappingPath);
|
|
187
|
+
const stats = agent.getStats();
|
|
188
|
+
console.log(`📝 Loaded mapping: ${stats.totalFiles} files, ${stats.totalSymbols} symbols\n`);
|
|
189
|
+
console.log(`🤖 Agent is analyzing...\n`);
|
|
190
|
+
// Step 3: Send to agent
|
|
191
|
+
const response = await agent.chat(args.question, skeletonContext);
|
|
192
|
+
console.log('📋 Agent Response:\n');
|
|
193
|
+
console.log(response);
|
|
194
|
+
console.log('\n');
|
|
195
|
+
printEvidence(result);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Run interactive mode
|
|
199
|
+
*/
|
|
200
|
+
async function runInteractive(args) {
|
|
201
|
+
console.log('🚀 Starting interactive code analysis agent...\n');
|
|
202
|
+
console.log('First, let me analyze your codebase.\n');
|
|
203
|
+
const buildState = async () => {
|
|
204
|
+
const result = await (0, index_1.analyzeProject)({
|
|
205
|
+
root: args.root,
|
|
206
|
+
question: 'code structure and organization',
|
|
207
|
+
limit: args.limit,
|
|
208
|
+
generateMapping: true,
|
|
209
|
+
});
|
|
210
|
+
if (result.files.length === 0) {
|
|
211
|
+
return {
|
|
212
|
+
result,
|
|
213
|
+
skeletonContext: '',
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
result,
|
|
218
|
+
skeletonContext: buildSkeletonContext(result, false),
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
// Step 1: Generate skeletons with mapping
|
|
222
|
+
let state = await buildState();
|
|
223
|
+
if (state.result.files.length === 0) {
|
|
224
|
+
console.log('No files found for analysis.');
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
console.log(`📊 Analyzed ${state.result.files.length} files\n`);
|
|
228
|
+
// Step 2: Create agent and load mapping
|
|
229
|
+
const agent = (0, agent_1.createCodeAnalysisAgent)(args.apiKey, args.model);
|
|
230
|
+
const mappingPath = path.join(state.result.root, 'code-analyzer.mapping.json');
|
|
231
|
+
agent.loadMapping(mappingPath);
|
|
232
|
+
const stats = agent.getStats();
|
|
233
|
+
console.log(`📝 Mapping: ${stats.totalFiles} files, ${stats.totalSymbols} symbols\n`);
|
|
234
|
+
console.log('💬 Ready for questions! Type /help for commands.\n');
|
|
235
|
+
// Step 3: Interactive loop
|
|
236
|
+
const rl = readline.createInterface({
|
|
237
|
+
input: process.stdin,
|
|
238
|
+
output: process.stdout,
|
|
239
|
+
});
|
|
240
|
+
const askQuestion = () => {
|
|
241
|
+
rl.question('You: ', async (input) => {
|
|
242
|
+
const question = input.trim();
|
|
243
|
+
if (question.toLowerCase() === 'exit' || question.toLowerCase() === '/exit') {
|
|
244
|
+
console.log('\n👋 Goodbye!');
|
|
245
|
+
rl.close();
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (question.toLowerCase() === 'stats' || question.toLowerCase() === '/stats') {
|
|
249
|
+
console.log('\n📊 Statistics:');
|
|
250
|
+
console.log(JSON.stringify(agent.getStats(), null, 2));
|
|
251
|
+
console.log('');
|
|
252
|
+
askQuestion();
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (question.toLowerCase() === '/help') {
|
|
256
|
+
console.log('');
|
|
257
|
+
printInteractiveHelp();
|
|
258
|
+
askQuestion();
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (question.toLowerCase() === '/files') {
|
|
262
|
+
console.log('');
|
|
263
|
+
printEvidence(state.result);
|
|
264
|
+
askQuestion();
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (question.toLowerCase() === '/refresh') {
|
|
268
|
+
console.log('\n🔄 Refreshing project analysis...');
|
|
269
|
+
state = await buildState();
|
|
270
|
+
const refreshedMappingPath = path.join(state.result.root, 'code-analyzer.mapping.json');
|
|
271
|
+
agent.loadMapping(refreshedMappingPath);
|
|
272
|
+
console.log(`✅ Refreshed ${state.result.files.length} files\n`);
|
|
273
|
+
askQuestion();
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
if (question.startsWith('/symbols ')) {
|
|
277
|
+
const query = question.slice('/symbols '.length).trim();
|
|
278
|
+
if (!query) {
|
|
279
|
+
console.log('\nUsage: /symbols <query>\n');
|
|
280
|
+
askQuestion();
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const symbols = agent.searchSymbols(query);
|
|
284
|
+
console.log('\n🔎 Symbol Search Result:');
|
|
285
|
+
console.log(JSON.stringify(symbols, null, 2));
|
|
286
|
+
console.log('');
|
|
287
|
+
askQuestion();
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (question.startsWith('/symbol ')) {
|
|
291
|
+
const symbolId = question.slice('/symbol '.length).trim();
|
|
292
|
+
if (!symbolId) {
|
|
293
|
+
console.log('\nUsage: /symbol <symbolId>\n');
|
|
294
|
+
askQuestion();
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const symbol = agent.getSymbolDetails(symbolId);
|
|
298
|
+
console.log('\n🧩 Symbol Details:');
|
|
299
|
+
console.log(JSON.stringify(symbol, null, 2));
|
|
300
|
+
console.log('');
|
|
301
|
+
askQuestion();
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (question.startsWith('/deps ')) {
|
|
305
|
+
const filePath = question.slice('/deps '.length).trim();
|
|
306
|
+
if (!filePath) {
|
|
307
|
+
console.log('\nUsage: /deps <filePath>\n');
|
|
308
|
+
askQuestion();
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const deps = agent.analyzeFileDependencies(filePath);
|
|
312
|
+
console.log('\n🕸️ File Dependencies:');
|
|
313
|
+
console.log(JSON.stringify(deps, null, 2));
|
|
314
|
+
console.log('');
|
|
315
|
+
askQuestion();
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (!question) {
|
|
319
|
+
askQuestion();
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
console.log('\n🤖 Agent: ');
|
|
323
|
+
try {
|
|
324
|
+
const response = await agent.chat(question, state.skeletonContext);
|
|
325
|
+
console.log(response);
|
|
326
|
+
console.log('');
|
|
327
|
+
printEvidence(state.result);
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
331
|
+
}
|
|
332
|
+
console.log('');
|
|
333
|
+
askQuestion();
|
|
334
|
+
});
|
|
335
|
+
};
|
|
336
|
+
askQuestion();
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Main CLI function
|
|
340
|
+
*/
|
|
341
|
+
async function main() {
|
|
342
|
+
const args = parseArgs();
|
|
343
|
+
if (!args) {
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
try {
|
|
347
|
+
if (args.interactive) {
|
|
348
|
+
await runInteractive(args);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
await runSingleQuestion(args);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Run CLI
|
|
360
|
+
main().catch((error) => {
|
|
361
|
+
console.error('Unexpected error:', error);
|
|
362
|
+
process.exit(1);
|
|
363
|
+
});
|
|
364
|
+
//# sourceMappingURL=agent-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-cli.js","sourceRoot":"","sources":["../src/agent-cli.ts"],"names":[],"mappings":";;AAEA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,mCAAkD;AAClD,mCAAyC;AAEzC,mDAAqC;AACrC,2CAA6B;AAgB7B,SAAS,oBAAoB,CAAC,MAAsB,EAAE,aAAsB;IAC1E,OAAO,MAAM,CAAC,KAAK;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,OAAO,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpF,CAAC;QACD,OAAO,OAAO,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,MAAsB;IAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACxC,IAAI,KAAK,GAAG,sBAAsB,CAAC;IACnC,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvD,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACtD,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,eAAe,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACnD,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,SAAS,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAC1C,SAAS,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACtF,SAAS,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;GAuBX,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,IAAkB;IACjD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,0CAA0C;IAC1C,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC;QAClC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAEhE,2BAA2B;IAC3B,MAAM,eAAe,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE3D,wCAAwC;IACxC,MAAM,KAAK,GAAG,IAAA,+BAAuB,EAAC,IAAI,CAAC,MAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;IACzE,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,UAAU,WAAW,KAAK,CAAC,YAAY,YAAY,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,wBAAwB;IACxB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,aAAa,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,IAAkB;IAC9C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,KAAK,IAA+B,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,iCAAiC;YAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,MAAM;gBACN,eAAe,EAAE,EAAE;aACpB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM;YACN,eAAe,EAAE,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC;SACrD,CAAC;IACJ,CAAC,CAAC;IAEF,0CAA0C;IAC1C,IAAI,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;IAE/B,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC;IAEhE,wCAAwC;IACxC,MAAM,KAAK,GAAG,IAAA,+BAAuB,EAAC,IAAI,CAAC,MAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;IAC/E,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,UAAU,WAAW,KAAK,CAAC,YAAY,YAAY,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAElE,2BAA2B;IAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAE9B,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;gBAC5E,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC9E,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,oBAAoB,EAAE,CAAC;gBACvB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC5B,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,UAAU,EAAE,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;gBAC3B,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBACxF,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC;gBAChE,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;oBAC3C,WAAW,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;oBAC7C,WAAW,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;oBAC3C,WAAW,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,GAAG,KAAK,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAE5B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,WAAW,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,UAAU;AACV,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini AI Agent Integration for Code Analysis
|
|
3
|
+
* This module provides tool definitions and agent setup for agentic code analysis
|
|
4
|
+
*/
|
|
5
|
+
import { SchemaType } from '@google/generative-ai';
|
|
6
|
+
/**
|
|
7
|
+
* Tool definition for getting symbol details
|
|
8
|
+
*/
|
|
9
|
+
export declare const getSymbolDetailsTool: {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
parameters: {
|
|
13
|
+
type: SchemaType;
|
|
14
|
+
properties: {
|
|
15
|
+
symbolId: {
|
|
16
|
+
type: SchemaType;
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
required: string[];
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Tool definition for searching code symbols
|
|
25
|
+
*/
|
|
26
|
+
export declare const searchSymbolsTool: {
|
|
27
|
+
name: string;
|
|
28
|
+
description: string;
|
|
29
|
+
parameters: {
|
|
30
|
+
type: SchemaType;
|
|
31
|
+
properties: {
|
|
32
|
+
query: {
|
|
33
|
+
type: SchemaType;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
symbolType: {
|
|
37
|
+
type: SchemaType;
|
|
38
|
+
description: string;
|
|
39
|
+
enum: string[];
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
required: string[];
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Tool definition for analyzing file dependencies
|
|
47
|
+
*/
|
|
48
|
+
export declare const analyzeFileDependenciesTool: {
|
|
49
|
+
name: string;
|
|
50
|
+
description: string;
|
|
51
|
+
parameters: {
|
|
52
|
+
type: SchemaType;
|
|
53
|
+
properties: {
|
|
54
|
+
filePath: {
|
|
55
|
+
type: SchemaType;
|
|
56
|
+
description: string;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
required: string[];
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Code Analysis Agent
|
|
64
|
+
*/
|
|
65
|
+
export declare class CodeAnalysisAgent {
|
|
66
|
+
private genAI;
|
|
67
|
+
private mapping;
|
|
68
|
+
private model;
|
|
69
|
+
constructor(apiKey: string, modelName?: string);
|
|
70
|
+
/**
|
|
71
|
+
* Load symbol mapping
|
|
72
|
+
*/
|
|
73
|
+
loadMapping(mappingPath: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Handle tool calls from the model
|
|
76
|
+
*/
|
|
77
|
+
private handleToolCall;
|
|
78
|
+
/**
|
|
79
|
+
* Get symbol details
|
|
80
|
+
*/
|
|
81
|
+
private handleGetSymbolDetails;
|
|
82
|
+
/**
|
|
83
|
+
* Search symbols
|
|
84
|
+
*/
|
|
85
|
+
private handleSearchSymbols;
|
|
86
|
+
/**
|
|
87
|
+
* Analyze file dependencies
|
|
88
|
+
*/
|
|
89
|
+
private handleAnalyzeFileDependencies;
|
|
90
|
+
/**
|
|
91
|
+
* Start a conversation with the agent
|
|
92
|
+
*/
|
|
93
|
+
chat(userMessage: string, skeletonContext?: string): Promise<string>;
|
|
94
|
+
/**
|
|
95
|
+
* Local wrapper for symbol search without model invocation.
|
|
96
|
+
*/
|
|
97
|
+
searchSymbols(query: string, symbolType?: string): any;
|
|
98
|
+
/**
|
|
99
|
+
* Local wrapper for fetching symbol implementation by ID.
|
|
100
|
+
*/
|
|
101
|
+
getSymbolDetails(symbolId: string): any;
|
|
102
|
+
/**
|
|
103
|
+
* Local wrapper for file dependency analysis.
|
|
104
|
+
*/
|
|
105
|
+
analyzeFileDependencies(filePath: string): any;
|
|
106
|
+
/**
|
|
107
|
+
* Get statistics about the loaded mapping
|
|
108
|
+
*/
|
|
109
|
+
getStats(): any;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Helper function to create an agent instance
|
|
113
|
+
*/
|
|
114
|
+
export declare function createCodeAnalysisAgent(apiKey: string, modelName?: string): CodeAnalysisAgent;
|
|
115
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAsB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAKvE;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;CAehC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;CAmB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;CAcvC,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,KAAK,CAAM;gBAEP,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAA+B;IAgBtE;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQtC;;OAEG;YACW,cAAc;IAkB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwC3B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAqCrC;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiD1E;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,GAAG;IAItD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG;IAIvC;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG;IAI9C;;OAEG;IACH,QAAQ,IAAI,GAAG;CAuBhB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAE7F"}
|