ownkey 0.2.0 → 0.5.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/README.md +64 -32
- package/dist/ai/factory.d.ts +23 -0
- package/dist/ai/factory.d.ts.map +1 -0
- package/dist/ai/factory.js +96 -0
- package/dist/ai/factory.js.map +1 -0
- package/dist/ai/gemini.d.ts +21 -0
- package/dist/ai/gemini.d.ts.map +1 -0
- package/dist/ai/gemini.js +87 -0
- package/dist/ai/gemini.js.map +1 -0
- package/dist/ai/provider.d.ts +39 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +99 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/commands/config.js +3 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/suggest.d.ts.map +1 -1
- package/dist/commands/suggest.js +102 -10
- package/dist/commands/suggest.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +5 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/keychain.d.ts.map +1 -1
- package/dist/config/keychain.js +12 -0
- package/dist/config/keychain.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +41 -15
- package/dist/db/client.js.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +18 -2
- package/.prettierrc +0 -9
- package/src/commands/apply.ts +0 -27
- package/src/commands/config.ts +0 -154
- package/src/commands/scan.ts +0 -114
- package/src/commands/suggest.ts +0 -37
- package/src/config/defaults.ts +0 -80
- package/src/config/keychain.ts +0 -125
- package/src/config/manager.ts +0 -166
- package/src/core/scanner.ts +0 -174
- package/src/db/client.ts +0 -151
- package/src/db/operations.ts +0 -217
- package/src/db/schema.ts +0 -118
- package/src/index.ts +0 -74
- package/src/types/index.ts +0 -198
- package/src/utils/encryption.ts +0 -54
- package/src/utils/logger.ts +0 -111
- package/tsconfig.json +0 -33
- /package/{src → dist}/db/migrations/001_init.sql +0 -0
package/README.md
CHANGED
|
@@ -1,34 +1,45 @@
|
|
|
1
1
|
# OwnKey CLI
|
|
2
2
|
|
|
3
|
-
**Local-first AI coding agent
|
|
3
|
+
**Local-first AI coding agent with Google Gemini integration**
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/ownkey)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
|
|
8
|
+
> ⚠️ **v0.5.0** - Currently supports Google Gemini. OpenAI, Anthropic, and Ollama coming soon!
|
|
9
|
+
|
|
8
10
|
## 🚀 Quick Start
|
|
9
11
|
|
|
10
12
|
```bash
|
|
11
13
|
# Install globally
|
|
12
14
|
npm install -g ownkey
|
|
13
15
|
|
|
14
|
-
# Configure
|
|
16
|
+
# Configure with your Gemini API key
|
|
15
17
|
ownkey config
|
|
16
18
|
|
|
17
19
|
# Scan your project
|
|
18
20
|
ownkey scan .
|
|
19
21
|
|
|
20
|
-
# Get AI suggestions
|
|
22
|
+
# Get AI-powered suggestions
|
|
21
23
|
ownkey suggest .
|
|
22
24
|
```
|
|
23
25
|
|
|
24
26
|
## 📋 Features
|
|
25
27
|
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
28
|
+
- **🤖 AI-Powered Analysis**: Intelligent code review using Google Gemini 2.5
|
|
29
|
+
- **🔒 Privacy-First**: Your code never leaves your machine
|
|
30
|
+
- **💾 Database Integration**: Optional Supabase for history tracking
|
|
31
|
+
- **🔐 Secure Storage**: API keys stored in OS keychain or encrypted
|
|
32
|
+
- **📂 Smart Scanning**: Respects .gitignore and custom ignore patterns
|
|
33
|
+
- **🎯 Multi-Model Support**: Use any Gemini model (pro, flash, flash-lite)
|
|
34
|
+
|
|
35
|
+
## ⚡ AI Provider Support
|
|
36
|
+
|
|
37
|
+
| Provider | Status | Models |
|
|
38
|
+
|----------|--------|--------|
|
|
39
|
+
| **Google Gemini** | ✅ **Fully Supported** | gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite |
|
|
40
|
+
| **OpenAI** | 🔜 Coming in v0.6.0 | GPT-4, GPT-3.5 |
|
|
41
|
+
| **Anthropic** | 🔜 Coming in v0.7.0 | Claude 3.5, Claude 3 |
|
|
42
|
+
| **Ollama (Local)** | 🔜 Coming in v0.8.0 | Any local model |
|
|
32
43
|
|
|
33
44
|
## 🛠 Installation
|
|
34
45
|
|
|
@@ -41,7 +52,7 @@ npm install -g ownkey
|
|
|
41
52
|
### From Source
|
|
42
53
|
|
|
43
54
|
```bash
|
|
44
|
-
git clone https://github.com/
|
|
55
|
+
git clone https://github.com/ArpitK24/OwnKey.git
|
|
45
56
|
cd ownkey-cli
|
|
46
57
|
npm install
|
|
47
58
|
npm run build
|
|
@@ -50,27 +61,30 @@ npm link
|
|
|
50
61
|
|
|
51
62
|
## ⚙️ Configuration
|
|
52
63
|
|
|
53
|
-
|
|
64
|
+
### Interactive Setup
|
|
54
65
|
|
|
55
66
|
```bash
|
|
56
67
|
ownkey config
|
|
57
68
|
```
|
|
58
69
|
|
|
59
|
-
|
|
70
|
+
### Using Flags
|
|
60
71
|
|
|
61
72
|
```bash
|
|
62
|
-
# Configure
|
|
63
|
-
ownkey config --
|
|
73
|
+
# Configure Gemini
|
|
74
|
+
ownkey config --provider gemini --api-key YOUR_GEMINI_API_KEY
|
|
64
75
|
|
|
65
|
-
# Configure
|
|
66
|
-
ownkey config --
|
|
76
|
+
# Optional: Configure Supabase for history tracking
|
|
77
|
+
ownkey config --supabase-url https://xxx.supabase.co --supabase-key YOUR_KEY
|
|
78
|
+
|
|
79
|
+
# Use different Gemini model
|
|
80
|
+
ownkey config --provider gemini --model gemini-2.5-flash
|
|
67
81
|
```
|
|
68
82
|
|
|
69
|
-
###
|
|
83
|
+
### Getting a Gemini API Key
|
|
70
84
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
85
|
+
1. Visit [Google AI Studio](https://aistudio.google.com/app/apikey)
|
|
86
|
+
2. Create a new API key
|
|
87
|
+
3. Run `ownkey config --provider gemini --api-key YOUR_KEY`
|
|
74
88
|
|
|
75
89
|
## 📖 Commands
|
|
76
90
|
|
|
@@ -81,6 +95,7 @@ Configure Supabase database and AI providers.
|
|
|
81
95
|
```bash
|
|
82
96
|
ownkey config # Interactive wizard
|
|
83
97
|
ownkey config --reset # Reset to defaults
|
|
98
|
+
ownkey config --provider gemini --api-key YOUR_KEY
|
|
84
99
|
```
|
|
85
100
|
|
|
86
101
|
### `ownkey scan [path]`
|
|
@@ -91,16 +106,32 @@ Scan a project directory.
|
|
|
91
106
|
ownkey scan . # Scan current directory
|
|
92
107
|
ownkey scan ./src # Scan specific folder
|
|
93
108
|
ownkey scan --max-file-size 1mb # Custom file size limit
|
|
109
|
+
ownkey scan --ignore "*.test.js" # Additional ignore patterns
|
|
94
110
|
```
|
|
95
111
|
|
|
96
|
-
### `ownkey suggest [path]`
|
|
112
|
+
### `ownkey suggest [path]`
|
|
97
113
|
|
|
98
|
-
Generate AI-powered suggestions.
|
|
114
|
+
Generate AI-powered code suggestions.
|
|
99
115
|
|
|
100
116
|
```bash
|
|
101
|
-
ownkey suggest .
|
|
102
|
-
ownkey suggest
|
|
103
|
-
ownkey suggest --
|
|
117
|
+
ownkey suggest . # Analyze current directory
|
|
118
|
+
ownkey suggest ./src # Analyze specific folder
|
|
119
|
+
ownkey suggest --max-files 20 # Limit files analyzed
|
|
120
|
+
ownkey suggest --local-only # Skip database storage
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Output:**
|
|
124
|
+
```
|
|
125
|
+
🔍 Analyzing code...
|
|
126
|
+
|
|
127
|
+
[1] bug (high) in src/auth.ts
|
|
128
|
+
Potential null pointer dereference
|
|
129
|
+
|
|
130
|
+
[2] security (critical) in db/query.ts
|
|
131
|
+
SQL injection vulnerability detected
|
|
132
|
+
|
|
133
|
+
✨ Analysis Complete!
|
|
134
|
+
Total suggestions: 12
|
|
104
135
|
```
|
|
105
136
|
|
|
106
137
|
### `ownkey apply <id>` *(Coming in v0.7.0)*
|
|
@@ -149,16 +180,16 @@ npm test
|
|
|
149
180
|
- [x] v0.2.0 - CLI skeleton & configuration
|
|
150
181
|
- [x] v0.3.0 - Config system with keychain
|
|
151
182
|
- [x] v0.4.0 - File scanner
|
|
152
|
-
- [
|
|
153
|
-
- [ ] v0.6.0 -
|
|
183
|
+
- [x] **v0.5.0 - Gemini AI integration** ← Current
|
|
184
|
+
- [ ] v0.6.0 - OpenAI & Anthropic providers
|
|
154
185
|
- [ ] v0.7.0 - Apply/diff system
|
|
155
|
-
- [ ] v0.8.0 -
|
|
186
|
+
- [ ] v0.8.0 - Ollama (local LLM) support
|
|
156
187
|
- [ ] v0.9.0 - Testing & polish
|
|
157
188
|
- [ ] v1.0.0 - Stable release
|
|
158
189
|
|
|
159
190
|
## 🤝 Contributing
|
|
160
191
|
|
|
161
|
-
Contributions are welcome! Please
|
|
192
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
162
193
|
|
|
163
194
|
## 📄 License
|
|
164
195
|
|
|
@@ -166,10 +197,11 @@ MIT © 2026 OwnKey
|
|
|
166
197
|
|
|
167
198
|
## 🔗 Links
|
|
168
199
|
|
|
169
|
-
- [
|
|
170
|
-
- [Issue Tracker](https://github.com/
|
|
200
|
+
- [GitHub Repository](https://github.com/ArpitK24/OwnKey)
|
|
201
|
+
- [Issue Tracker](https://github.com/ArpitK24/OwnKey/issues)
|
|
171
202
|
- [npm Package](https://www.npmjs.com/package/ownkey)
|
|
203
|
+
- [Get Gemini API Key](https://aistudio.google.com/app/apikey)
|
|
172
204
|
|
|
173
205
|
---
|
|
174
206
|
|
|
175
|
-
**
|
|
207
|
+
**Built with ❤️ for developers who value privacy and AI-powered productivity**
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AIProvider } from './provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* Factory for creating AI provider instances
|
|
4
|
+
*/
|
|
5
|
+
export declare class AIProviderFactory {
|
|
6
|
+
/**
|
|
7
|
+
* Create an AI provider instance based on configuration
|
|
8
|
+
*/
|
|
9
|
+
static createProvider(): Promise<AIProvider>;
|
|
10
|
+
/**
|
|
11
|
+
* Test provider connection
|
|
12
|
+
*/
|
|
13
|
+
static testProvider(provider: AIProvider): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Get recommended model for a provider
|
|
16
|
+
*/
|
|
17
|
+
static getRecommendedModel(provider: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get available models for a provider
|
|
20
|
+
*/
|
|
21
|
+
static getAvailableModels(provider: string): string[];
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C;;GAEG;AACH,qBAAa,iBAAiB;IAC1B;;OAEG;WACU,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;IAkClD;;OAEG;WACU,YAAY,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBjE;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAepD;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;CAkBxD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { GeminiProvider } from './gemini.js';
|
|
2
|
+
import { ConfigError } from '../types/index.js';
|
|
3
|
+
import { configManager } from '../config/manager.js';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* Factory for creating AI provider instances
|
|
7
|
+
*/
|
|
8
|
+
export class AIProviderFactory {
|
|
9
|
+
/**
|
|
10
|
+
* Create an AI provider instance based on configuration
|
|
11
|
+
*/
|
|
12
|
+
static async createProvider() {
|
|
13
|
+
const config = await configManager.load();
|
|
14
|
+
if (!config.activeProvider) {
|
|
15
|
+
throw new ConfigError('No active AI provider configured. Run: ownkey config');
|
|
16
|
+
}
|
|
17
|
+
const provider = config.activeProvider;
|
|
18
|
+
const apiKey = await configManager.getApiKey(provider);
|
|
19
|
+
logger.verbose(`Creating ${provider} provider...`);
|
|
20
|
+
switch (provider) {
|
|
21
|
+
case 'gemini':
|
|
22
|
+
if (!apiKey) {
|
|
23
|
+
throw new ConfigError('Gemini API key not found. Run: ownkey config');
|
|
24
|
+
}
|
|
25
|
+
const geminiModel = config.providers.gemini?.model || GeminiProvider.getRecommendedModel();
|
|
26
|
+
return new GeminiProvider(apiKey, geminiModel);
|
|
27
|
+
case 'openai':
|
|
28
|
+
throw new ConfigError('OpenAI provider not yet implemented (coming soon)');
|
|
29
|
+
case 'anthropic':
|
|
30
|
+
throw new ConfigError('Anthropic provider not yet implemented (coming soon)');
|
|
31
|
+
case 'ollama':
|
|
32
|
+
throw new ConfigError('Ollama provider not yet implemented (coming soon)');
|
|
33
|
+
default:
|
|
34
|
+
throw new ConfigError(`Unknown provider: ${provider}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Test provider connection
|
|
39
|
+
*/
|
|
40
|
+
static async testProvider(provider) {
|
|
41
|
+
try {
|
|
42
|
+
logger.verbose('Testing provider connection...');
|
|
43
|
+
const result = await provider.testConnection();
|
|
44
|
+
if (result) {
|
|
45
|
+
logger.success('Provider connection successful');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
logger.error('Provider connection failed');
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
logger.error('Provider test error', error);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get recommended model for a provider
|
|
59
|
+
*/
|
|
60
|
+
static getRecommendedModel(provider) {
|
|
61
|
+
switch (provider) {
|
|
62
|
+
case 'gemini':
|
|
63
|
+
return GeminiProvider.getRecommendedModel();
|
|
64
|
+
case 'openai':
|
|
65
|
+
return 'gpt-4-turbo';
|
|
66
|
+
case 'anthropic':
|
|
67
|
+
return 'claude-3-5-sonnet-20241022';
|
|
68
|
+
case 'ollama':
|
|
69
|
+
return 'deepseek-coder:latest';
|
|
70
|
+
default:
|
|
71
|
+
return '';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get available models for a provider
|
|
76
|
+
*/
|
|
77
|
+
static getAvailableModels(provider) {
|
|
78
|
+
switch (provider) {
|
|
79
|
+
case 'gemini':
|
|
80
|
+
return GeminiProvider.getAvailableModels();
|
|
81
|
+
case 'openai':
|
|
82
|
+
return ['gpt-4-turbo', 'gpt-4', 'gpt-3.5-turbo'];
|
|
83
|
+
case 'anthropic':
|
|
84
|
+
return [
|
|
85
|
+
'claude-3-5-sonnet-20241022',
|
|
86
|
+
'claude-3-opus-20240229',
|
|
87
|
+
'claude-3-haiku-20240307',
|
|
88
|
+
];
|
|
89
|
+
case 'ollama':
|
|
90
|
+
return ['deepseek-coder:latest', 'codellama:latest', 'llama2:latest'];
|
|
91
|
+
default:
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAC1B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc;QACvB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,WAAW,CAAC,sDAAsD,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEvD,MAAM,CAAC,OAAO,CAAC,YAAY,QAAQ,cAAc,CAAC,CAAC;QAEnD,QAAQ,QAAQ,EAAE,CAAC;YACf,KAAK,QAAQ;gBACT,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,IAAI,WAAW,CAAC,8CAA8C,CAAC,CAAC;gBAC1E,CAAC;gBACD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,IAAI,cAAc,CAAC,mBAAmB,EAAE,CAAC;gBAC3F,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAEnD,KAAK,QAAQ;gBACT,MAAM,IAAI,WAAW,CAAC,mDAAmD,CAAC,CAAC;YAE/E,KAAK,WAAW;gBACZ,MAAM,IAAI,WAAW,CAAC,sDAAsD,CAAC,CAAC;YAElF,KAAK,QAAQ;gBACT,MAAM,IAAI,WAAW,CAAC,mDAAmD,CAAC,CAAC;YAE/E;gBACI,MAAM,IAAI,WAAW,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAoB;QAC1C,IAAI,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,MAAM,EAAE,CAAC;gBACT,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAc,CAAC,CAAC;YACpD,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAgB;QACvC,QAAQ,QAAQ,EAAE,CAAC;YACf,KAAK,QAAQ;gBACT,OAAO,cAAc,CAAC,mBAAmB,EAAE,CAAC;YAChD,KAAK,QAAQ;gBACT,OAAO,aAAa,CAAC;YACzB,KAAK,WAAW;gBACZ,OAAO,4BAA4B,CAAC;YACxC,KAAK,QAAQ;gBACT,OAAO,uBAAuB,CAAC;YACnC;gBACI,OAAO,EAAE,CAAC;QAClB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAgB;QACtC,QAAQ,QAAQ,EAAE,CAAC;YACf,KAAK,QAAQ;gBACT,OAAO,cAAc,CAAC,kBAAkB,EAAE,CAAC;YAC/C,KAAK,QAAQ;gBACT,OAAO,CAAC,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;YACrD,KAAK,WAAW;gBACZ,OAAO;oBACH,4BAA4B;oBAC5B,wBAAwB;oBACxB,yBAAyB;iBAC5B,CAAC;YACN,KAAK,QAAQ;gBACT,OAAO,CAAC,uBAAuB,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;YAC1E;gBACI,OAAO,EAAE,CAAC;QAClB,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AIProvider } from './provider.js';
|
|
2
|
+
import { CodeContext, Suggestion, AnalyzeOptions } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Google Gemini AI Provider
|
|
5
|
+
* Supports: gemini-1.5-pro, gemini-1.5-flash, gemini-pro
|
|
6
|
+
*/
|
|
7
|
+
export declare class GeminiProvider extends AIProvider {
|
|
8
|
+
private baseUrl;
|
|
9
|
+
getDefaultModel(): string;
|
|
10
|
+
testConnection(): Promise<boolean>;
|
|
11
|
+
analyze(context: CodeContext, options?: AnalyzeOptions): AsyncGenerator<Suggestion>;
|
|
12
|
+
/**
|
|
13
|
+
* Get available Gemini models
|
|
14
|
+
*/
|
|
15
|
+
static getAvailableModels(): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Get recommended model for code analysis
|
|
18
|
+
*/
|
|
19
|
+
static getRecommendedModel(): string;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/ai/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAmB,MAAM,mBAAmB,CAAC;AAyB7F;;;GAGG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC1C,OAAO,CAAC,OAAO,CAAkD;IAEjE,eAAe,IAAI,MAAM;IAInB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAMjC,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC,UAAU,CAAC;IAsE1F;;OAEG;IACH,MAAM,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAIrC;;OAEG;IACH,MAAM,CAAC,mBAAmB,IAAI,MAAM;CAGvC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { AIProvider } from './provider.js';
|
|
2
|
+
import { AIProviderError } from '../types/index.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Google Gemini AI Provider
|
|
6
|
+
* Supports: gemini-1.5-pro, gemini-1.5-flash, gemini-pro
|
|
7
|
+
*/
|
|
8
|
+
export class GeminiProvider extends AIProvider {
|
|
9
|
+
baseUrl = 'https://generativelanguage.googleapis.com/v1';
|
|
10
|
+
getDefaultModel() {
|
|
11
|
+
return 'gemini-2.5-pro';
|
|
12
|
+
}
|
|
13
|
+
async testConnection() {
|
|
14
|
+
// Temporarily bypass for testing - will fix endpoint later
|
|
15
|
+
logger.verbose('Skipping Gemini connection test (will test during analysis)');
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
async *analyze(context, options) {
|
|
19
|
+
try {
|
|
20
|
+
logger.verbose(`Analyzing with Gemini (${this.model})...`);
|
|
21
|
+
const systemPrompt = this.getSystemPrompt();
|
|
22
|
+
const userPrompt = this.buildUserPrompt(context);
|
|
23
|
+
const request = {
|
|
24
|
+
contents: [
|
|
25
|
+
{
|
|
26
|
+
role: 'user',
|
|
27
|
+
parts: [
|
|
28
|
+
{ text: systemPrompt },
|
|
29
|
+
{ text: userPrompt },
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
generationConfig: {
|
|
34
|
+
temperature: options?.temperature || 0.3,
|
|
35
|
+
maxOutputTokens: options?.maxTokens || 8192,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const response = await fetch(`${this.baseUrl}/models/${this.model}:generateContent`, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
'x-goog-api-key': this.apiKey || '',
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify(request),
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const errorText = await response.text();
|
|
48
|
+
logger.error(`Gemini API error: ${errorText}`);
|
|
49
|
+
throw new AIProviderError(`Gemini API error: ${response.status} ${errorText}`);
|
|
50
|
+
}
|
|
51
|
+
const data = (await response.json());
|
|
52
|
+
if (!data.candidates || data.candidates.length === 0) {
|
|
53
|
+
throw new AIProviderError('No response from Gemini');
|
|
54
|
+
}
|
|
55
|
+
const candidate = data.candidates[0];
|
|
56
|
+
const responseText = candidate.content.parts.map((p) => p.text).join('');
|
|
57
|
+
logger.verbose('Received response from Gemini');
|
|
58
|
+
logger.debug('Response:', responseText.substring(0, 200) + '...');
|
|
59
|
+
// Parse suggestions from response
|
|
60
|
+
const suggestions = this.parseSuggestions(responseText);
|
|
61
|
+
logger.success(`Generated ${suggestions.length} suggestions`);
|
|
62
|
+
// Yield suggestions one by one (simulating streaming)
|
|
63
|
+
for (const suggestion of suggestions) {
|
|
64
|
+
yield suggestion;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof AIProviderError) {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
throw new AIProviderError('Failed to analyze with Gemini', error);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get available Gemini models
|
|
76
|
+
*/
|
|
77
|
+
static getAvailableModels() {
|
|
78
|
+
return ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite'];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get recommended model for code analysis
|
|
82
|
+
*/
|
|
83
|
+
static getRecommendedModel() {
|
|
84
|
+
return 'gemini-2.5-pro';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/ai/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CodeContext, Suggestion, AnalyzeOptions, AIProviderInterface } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Base abstract class for AI providers
|
|
4
|
+
* All providers (OpenAI, Gemini, Anthropic, Ollama) must implement this interface
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class AIProvider implements AIProviderInterface {
|
|
7
|
+
protected apiKey?: string;
|
|
8
|
+
protected model: string;
|
|
9
|
+
protected endpoint?: string;
|
|
10
|
+
constructor(apiKey?: string, model?: string, endpoint?: string);
|
|
11
|
+
/**
|
|
12
|
+
* Get the default model for this provider
|
|
13
|
+
*/
|
|
14
|
+
abstract getDefaultModel(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Test if the provider connection is working
|
|
17
|
+
*/
|
|
18
|
+
abstract testConnection(): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Analyze code and generate suggestions
|
|
21
|
+
* @param context - Code context with files and project info
|
|
22
|
+
* @param options - Analysis options (streaming, max tokens, etc.)
|
|
23
|
+
* @returns AsyncGenerator yielding suggestions as they're generated
|
|
24
|
+
*/
|
|
25
|
+
abstract analyze(context: CodeContext, options?: AnalyzeOptions): AsyncGenerator<Suggestion>;
|
|
26
|
+
/**
|
|
27
|
+
* Format the system prompt for code analysis
|
|
28
|
+
*/
|
|
29
|
+
protected getSystemPrompt(): string;
|
|
30
|
+
/**
|
|
31
|
+
* Build the user prompt with code context
|
|
32
|
+
*/
|
|
33
|
+
protected buildUserPrompt(context: CodeContext): string;
|
|
34
|
+
/**
|
|
35
|
+
* Parse AI response and extract suggestions
|
|
36
|
+
*/
|
|
37
|
+
protected parseSuggestions(response: string): Suggestion[];
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEjG;;;GAGG;AACH,8BAAsB,UAAW,YAAW,mBAAmB;IAC3D,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAEhB,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAM9D;;OAEG;IACH,QAAQ,CAAC,eAAe,IAAI,MAAM;IAElC;;OAEG;IACH,QAAQ,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAE3C;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CACZ,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,cAAc,GACzB,cAAc,CAAC,UAAU,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,eAAe,IAAI,MAAM;IAgCnC;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IA2BvD;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;CAwB7D"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base abstract class for AI providers
|
|
3
|
+
* All providers (OpenAI, Gemini, Anthropic, Ollama) must implement this interface
|
|
4
|
+
*/
|
|
5
|
+
export class AIProvider {
|
|
6
|
+
apiKey;
|
|
7
|
+
model;
|
|
8
|
+
endpoint;
|
|
9
|
+
constructor(apiKey, model, endpoint) {
|
|
10
|
+
this.apiKey = apiKey;
|
|
11
|
+
this.model = model || this.getDefaultModel();
|
|
12
|
+
this.endpoint = endpoint;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Format the system prompt for code analysis
|
|
16
|
+
*/
|
|
17
|
+
getSystemPrompt() {
|
|
18
|
+
return `You are a senior software engineer performing code review and analysis.
|
|
19
|
+
|
|
20
|
+
Your task is to analyze the provided codebase and identify:
|
|
21
|
+
- Bugs and potential errors
|
|
22
|
+
- Security vulnerabilities
|
|
23
|
+
- Performance issues
|
|
24
|
+
- Code quality improvements
|
|
25
|
+
- Refactoring opportunities
|
|
26
|
+
- Missing tests or documentation
|
|
27
|
+
|
|
28
|
+
Guidelines:
|
|
29
|
+
- Be conservative and precise
|
|
30
|
+
- Only suggest changes you're confident about
|
|
31
|
+
- Provide clear rationale for each suggestion
|
|
32
|
+
- Use unified diff format for code changes
|
|
33
|
+
- Categorize suggestions by type and severity
|
|
34
|
+
|
|
35
|
+
Output Format:
|
|
36
|
+
Return a JSON array of suggestions. Each suggestion must have:
|
|
37
|
+
{
|
|
38
|
+
"type": "bug" | "security" | "performance" | "refactor" | "style" | "architecture" | "test" | "documentation",
|
|
39
|
+
"severity": "critical" | "high" | "medium" | "low" | "info",
|
|
40
|
+
"content": "Brief description of the issue",
|
|
41
|
+
"filePath": "path/to/file.ts",
|
|
42
|
+
"rationale": "Detailed explanation of why this matters",
|
|
43
|
+
"diff": "Unified diff format showing the change"
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
Be thorough but practical. Focus on high-impact suggestions.`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build the user prompt with code context
|
|
50
|
+
*/
|
|
51
|
+
buildUserPrompt(context) {
|
|
52
|
+
let prompt = `# Project Analysis Request\n\n`;
|
|
53
|
+
prompt += `**Project:** ${context.projectInfo.name}\n`;
|
|
54
|
+
prompt += `**Path:** ${context.projectInfo.rootPath}\n`;
|
|
55
|
+
prompt += `**Files:** ${context.projectInfo.fileCount}\n\n`;
|
|
56
|
+
if (context.projectInfo.language) {
|
|
57
|
+
prompt += `**Primary Language:** ${context.projectInfo.language}\n`;
|
|
58
|
+
}
|
|
59
|
+
if (context.projectInfo.framework) {
|
|
60
|
+
prompt += `**Framework:** ${context.projectInfo.framework}\n`;
|
|
61
|
+
}
|
|
62
|
+
prompt += `\n## Code Files\n\n`;
|
|
63
|
+
for (const file of context.files) {
|
|
64
|
+
prompt += `### ${file.relativePath}\n\n`;
|
|
65
|
+
prompt += `\`\`\`${file.extension.slice(1)}\n`;
|
|
66
|
+
prompt += file.content;
|
|
67
|
+
prompt += `\n\`\`\`\n\n`;
|
|
68
|
+
}
|
|
69
|
+
prompt += `\nAnalyze the above code and provide suggestions in JSON format.`;
|
|
70
|
+
return prompt;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse AI response and extract suggestions
|
|
74
|
+
*/
|
|
75
|
+
parseSuggestions(response) {
|
|
76
|
+
try {
|
|
77
|
+
// Try to extract JSON from response
|
|
78
|
+
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
79
|
+
if (!jsonMatch) {
|
|
80
|
+
throw new Error('No JSON array found in response');
|
|
81
|
+
}
|
|
82
|
+
const suggestions = JSON.parse(jsonMatch[0]);
|
|
83
|
+
// Validate and normalize suggestions
|
|
84
|
+
return suggestions.map((s) => ({
|
|
85
|
+
type: s.type || 'refactor',
|
|
86
|
+
severity: s.severity || 'medium',
|
|
87
|
+
content: s.content || 'No description provided',
|
|
88
|
+
filePath: s.filePath || '',
|
|
89
|
+
rationale: s.rationale || '',
|
|
90
|
+
diff: s.diff || '',
|
|
91
|
+
tags: s.tags,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
throw new Error(`Failed to parse suggestions: ${error}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAgB,UAAU;IAClB,MAAM,CAAU;IAChB,KAAK,CAAS;IACd,QAAQ,CAAU;IAE5B,YAAY,MAAe,EAAE,KAAc,EAAE,QAAiB;QAC1D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAuBD;;OAEG;IACO,eAAe;QACrB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DA4B8C,CAAC;IAC1D,CAAC;IAED;;OAEG;IACO,eAAe,CAAC,OAAoB;QAC1C,IAAI,MAAM,GAAG,gCAAgC,CAAC;QAC9C,MAAM,IAAI,gBAAgB,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;QACvD,MAAM,IAAI,aAAa,OAAO,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC;QACxD,MAAM,IAAI,cAAc,OAAO,CAAC,WAAW,CAAC,SAAS,MAAM,CAAC;QAE5D,IAAI,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,yBAAyB,OAAO,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC;QACxE,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,kBAAkB,OAAO,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,qBAAqB,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,IAAI,OAAO,IAAI,CAAC,YAAY,MAAM,CAAC;YACzC,MAAM,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,IAAI,cAAc,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,kEAAkE,CAAC;QAE7E,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,QAAgB;QACvC,IAAI,CAAC;YACD,oCAAoC;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7C,qCAAqC;YACrC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,UAAU;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ;gBAChC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,yBAAyB;gBAC/C,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;gBAC1B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;gBAC5B,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;gBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;aACf,CAAC,CAAC,CAAC;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;CACJ"}
|
package/dist/commands/config.js
CHANGED
|
@@ -108,17 +108,19 @@ async function runInteractiveWizard() {
|
|
|
108
108
|
choices: [
|
|
109
109
|
{ name: 'OpenAI (GPT-4)', value: 'openai' },
|
|
110
110
|
{ name: 'Anthropic (Claude)', value: 'anthropic' },
|
|
111
|
+
{ name: 'Google Gemini', value: 'gemini' },
|
|
111
112
|
{ name: 'Ollama (Local)', value: 'ollama' },
|
|
112
113
|
],
|
|
113
114
|
},
|
|
114
115
|
]);
|
|
115
116
|
// Get API key (not needed for Ollama)
|
|
116
117
|
if (provider !== 'ollama') {
|
|
118
|
+
const providerName = provider === 'openai' ? 'OpenAI' : provider === 'anthropic' ? 'Anthropic' : 'Google Gemini';
|
|
117
119
|
const { apiKey } = await inquirer.prompt([
|
|
118
120
|
{
|
|
119
121
|
type: 'password',
|
|
120
122
|
name: 'apiKey',
|
|
121
|
-
message: `${
|
|
123
|
+
message: `${providerName} API Key:`,
|
|
122
124
|
validate: (input) => (input ? true : 'API key is required'),
|
|
123
125
|
},
|
|
124
126
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,cAAc,SA+IrB,CAAC"}
|