ownkey 0.7.0 → 1.0.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 +38 -249
- package/dist/ai/factory.d.ts.map +1 -1
- package/dist/ai/factory.js +5 -1
- package/dist/ai/factory.js.map +1 -1
- package/dist/ai/ollama.d.ts +30 -0
- package/dist/ai/ollama.d.ts.map +1 -0
- package/dist/ai/ollama.js +175 -0
- package/dist/ai/ollama.js.map +1 -0
- package/dist/commands/suggest.d.ts.map +1 -1
- package/dist/commands/suggest.js +48 -16
- package/dist/commands/suggest.js.map +1 -1
- package/dist/core/apply/engine.d.ts +1 -1
- package/dist/core/apply/engine.d.ts.map +1 -1
- package/dist/core/apply/engine.js +29 -12
- package/dist/core/apply/engine.js.map +1 -1
- package/dist/db/client.d.ts +1 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +15 -5
- package/dist/db/client.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/storage/local.d.ts +71 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +170 -0
- package/dist/storage/local.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,276 +1,72 @@
|
|
|
1
|
-
|
|
1
|
+
# OwnKey CLI
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> AI-powered code analysis that works with or without a database
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/ownkey)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
7
|
|
|
7
|
-
**
|
|
8
|
+
**OwnKey** is a local-first AI coding agent that analyzes your codebase and provides intelligent suggestions for bugs, security issues, performance improvements, and code quality.
|
|
8
9
|
|
|
9
|
-
[
|
|
10
|
-
[](https://opensource.org/licenses/MIT)
|
|
11
|
-
[](https://www.npmjs.com/package/ownkey)
|
|
12
|
-
|
|
13
|
-
*Intelligent code analysis powered by OpenAI, Anthropic Claude 4.5, and Google Gemini • Your code never leaves your machine*
|
|
14
|
-
|
|
15
|
-
[Quick Start](#-quick-start) • [Features](#-features) • [Installation](#-installation) • [Documentation](#-commands)
|
|
16
|
-
|
|
17
|
-
</div>
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
> ✨ **v0.7.0** - Apply System! Auto-fix code with AI suggestions, automatic backups, and rollback support.
|
|
22
|
-
|
|
23
|
-
## 🚀 Quick Start
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# Install globally
|
|
27
|
-
npm install -g ownkey
|
|
28
|
-
|
|
29
|
-
# Configure with your preferred AI provider
|
|
30
|
-
ownkey config --provider gemini --api-key YOUR_GEMINI_KEY
|
|
31
|
-
# OR
|
|
32
|
-
ownkey config --provider openai --api-key YOUR_OPENAI_KEY
|
|
33
|
-
# OR
|
|
34
|
-
ownkey config --provider anthropic --api-key YOUR_ANTHROPIC_KEY
|
|
35
|
-
|
|
36
|
-
# Analyze your codebase
|
|
37
|
-
ownkey suggest .
|
|
38
|
-
|
|
39
|
-
# Apply AI suggestions to fix code
|
|
40
|
-
ownkey apply <suggestion-id>
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
**Get API Keys:**
|
|
44
|
-
- **Gemini:** [Google AI Studio](https://aistudio.google.com/app/apikey) (Free tier available)
|
|
45
|
-
- **OpenAI:** [OpenAI Platform](https://platform.openai.com/api-keys)
|
|
46
|
-
- **Anthropic:** [Anthropic Console](https://console.anthropic.com/)
|
|
10
|
+
🌐 **[Full Documentation](https://ownkey.qzz.io)**
|
|
47
11
|
|
|
48
12
|
## ✨ Features
|
|
49
13
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
### 🔒 Privacy-First
|
|
58
|
-
Your code never leaves your machine - all analysis is local
|
|
59
|
-
|
|
60
|
-
### 💾 Optional Cloud Sync
|
|
61
|
-
Store history in your own Supabase database
|
|
62
|
-
|
|
63
|
-
### 🔧 Auto-Fix Code
|
|
64
|
-
Apply AI suggestions with automatic backups
|
|
65
|
-
|
|
66
|
-
</td>
|
|
67
|
-
<td width="50%">
|
|
14
|
+
- 🤖 **Multi-Provider AI** - Supports Google Gemini, OpenAI, Anthropic Claude, and Ollama
|
|
15
|
+
- 🔒 **Privacy-First** - Works completely offline with local-only mode
|
|
16
|
+
- 💾 **Optional Database** - Supabase integration for persistent history (optional)
|
|
17
|
+
- 🚀 **Auto-Model Detection** - Instantly supports new AI models without CLI updates
|
|
18
|
+
- 🎯 **Smart Suggestions** - Identifies bugs, security issues, performance problems, and more
|
|
19
|
+
- ⚡ **Apply & Undo** - Safely apply suggestions with automatic backups
|
|
68
20
|
|
|
69
|
-
|
|
70
|
-
API keys stored in OS keychain or encrypted
|
|
71
|
-
|
|
72
|
-
### 📂 Smart Scanning
|
|
73
|
-
Respects .gitignore and custom patterns
|
|
74
|
-
|
|
75
|
-
### 🎯 15+ AI Models
|
|
76
|
-
GPT-4, Claude Opus 4.5, Gemini 2.5, and more
|
|
77
|
-
|
|
78
|
-
### ↩️ Rollback Support
|
|
79
|
-
Undo any applied changes instantly
|
|
80
|
-
|
|
81
|
-
</td>
|
|
82
|
-
</tr>
|
|
83
|
-
</table>
|
|
84
|
-
|
|
85
|
-
## ⚡ AI Provider Support
|
|
86
|
-
|
|
87
|
-
<div align="center">
|
|
88
|
-
|
|
89
|
-
| Provider | Status | Models | Get API Key |
|
|
90
|
-
|:--------:|:------:|:------:|:-----------:|
|
|
91
|
-
| **🟢 Google Gemini** | ✅ **Available** | Gemini 2.5 Pro, Flash, 2.0 | [Get Key](https://aistudio.google.com/app/apikey) |
|
|
92
|
-
| **🔵 OpenAI** | ✅ **Available** | GPT-4 Turbo, GPT-4, GPT-3.5 | [Get Key](https://platform.openai.com/api-keys) |
|
|
93
|
-
| **🟣 Anthropic** | ✅ **Available** | Claude Opus 4.5, Sonnet 4.5, Haiku 4.5 | [Get Key](https://console.anthropic.com/) |
|
|
94
|
-
| **🟠 Ollama** | 🔜 Coming Soon | Any local model | v0.8.0 |
|
|
95
|
-
|
|
96
|
-
**New in v0.7.0:** Apply System with automatic backups and rollback!
|
|
97
|
-
|
|
98
|
-
</div>
|
|
99
|
-
|
|
100
|
-
## 🛠 Installation
|
|
21
|
+
## 🚀 Quick Start
|
|
101
22
|
|
|
102
|
-
###
|
|
23
|
+
### Installation
|
|
103
24
|
|
|
104
25
|
```bash
|
|
105
26
|
npm install -g ownkey
|
|
106
27
|
```
|
|
107
28
|
|
|
108
|
-
###
|
|
29
|
+
### Basic Usage
|
|
109
30
|
|
|
110
31
|
```bash
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
npm install
|
|
114
|
-
npm run build
|
|
115
|
-
npm link
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## ⚙️ Configuration
|
|
119
|
-
|
|
120
|
-
### Interactive Setup
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
ownkey config
|
|
124
|
-
```
|
|
32
|
+
# Configure with your AI provider
|
|
33
|
+
ownkey config --provider gemini --api-key YOUR_API_KEY
|
|
125
34
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
# Configure Gemini
|
|
130
|
-
ownkey config --provider gemini --api-key YOUR_GEMINI_API_KEY
|
|
131
|
-
|
|
132
|
-
# Optional: Configure Supabase for history tracking
|
|
133
|
-
ownkey config --supabase-url https://xxx.supabase.co --supabase-key YOUR_KEY
|
|
134
|
-
|
|
135
|
-
# Use different Gemini model
|
|
136
|
-
ownkey config --provider gemini --model gemini-2.5-flash
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### Getting a Gemini API Key
|
|
140
|
-
|
|
141
|
-
1. Visit [Google AI Studio](https://aistudio.google.com/app/apikey)
|
|
142
|
-
2. Create a new API key
|
|
143
|
-
3. Run `ownkey config --provider gemini --api-key YOUR_KEY`
|
|
144
|
-
|
|
145
|
-
## 📖 Commands
|
|
146
|
-
|
|
147
|
-
### `ownkey config`
|
|
148
|
-
|
|
149
|
-
Configure Supabase database and AI providers.
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
ownkey config # Interactive wizard
|
|
153
|
-
ownkey config --reset # Reset to defaults
|
|
154
|
-
ownkey config --provider gemini --api-key YOUR_KEY
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### `ownkey scan [path]`
|
|
158
|
-
|
|
159
|
-
Scan a project directory.
|
|
160
|
-
|
|
161
|
-
```bash
|
|
162
|
-
ownkey scan . # Scan current directory
|
|
163
|
-
ownkey scan ./src # Scan specific folder
|
|
164
|
-
ownkey scan --max-file-size 1mb # Custom file size limit
|
|
165
|
-
ownkey scan --ignore "*.test.js" # Additional ignore patterns
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### `ownkey suggest [path]`
|
|
169
|
-
|
|
170
|
-
Generate AI-powered code suggestions.
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
ownkey suggest . # Analyze current directory
|
|
174
|
-
ownkey suggest ./src # Analyze specific folder
|
|
175
|
-
ownkey suggest --max-files 20 # Limit files analyzed
|
|
176
|
-
ownkey suggest --local-only # Skip database storage
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
**Output:**
|
|
180
|
-
```
|
|
181
|
-
🔍 Analyzing code...
|
|
182
|
-
|
|
183
|
-
[1] bug (high) in src/auth.ts
|
|
184
|
-
Potential null pointer dereference
|
|
185
|
-
|
|
186
|
-
[2] security (critical) in db/query.ts
|
|
187
|
-
SQL injection vulnerability detected
|
|
188
|
-
|
|
189
|
-
✨ Analysis Complete!
|
|
190
|
-
Total suggestions: 12
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### `ownkey apply <suggestion-id>` *(New in v0.7.0)*
|
|
35
|
+
# Analyze your code
|
|
36
|
+
ownkey suggest .
|
|
194
37
|
|
|
195
|
-
Apply
|
|
38
|
+
# Apply a suggestion
|
|
39
|
+
ownkey apply local-123456789-0
|
|
196
40
|
|
|
197
|
-
|
|
198
|
-
ownkey
|
|
199
|
-
ownkey apply abc123 --auto # Auto-apply without confirmation
|
|
200
|
-
ownkey apply abc123 --dry-run # Preview changes without applying
|
|
201
|
-
ownkey apply abc123 --force # Apply even if validation fails
|
|
202
|
-
ownkey apply abc123 --no-backup # Skip backup (not recommended)
|
|
41
|
+
# Undo if needed
|
|
42
|
+
ownkey undo
|
|
203
43
|
```
|
|
204
44
|
|
|
205
|
-
|
|
206
|
-
- ✅ Automatic backups before applying
|
|
207
|
-
- ✅ Interactive confirmation with diff preview
|
|
208
|
-
- ✅ Validation to prevent conflicts
|
|
209
|
-
- ✅ Automatic rollback on failure
|
|
210
|
-
|
|
211
|
-
### `ownkey undo [backup-id]` *(New in v0.7.0)*
|
|
45
|
+
### Local-Only Mode
|
|
212
46
|
|
|
213
|
-
|
|
47
|
+
No database required! OwnKey automatically stores suggestions in `~/.ownkey/storage/`:
|
|
214
48
|
|
|
215
49
|
```bash
|
|
216
|
-
ownkey
|
|
217
|
-
ownkey undo abc123 # Undo specific backup
|
|
218
|
-
ownkey undo --list # List recent applies
|
|
219
|
-
ownkey undo --all # Undo all applies from today
|
|
50
|
+
ownkey suggest . --local-only
|
|
220
51
|
```
|
|
221
52
|
|
|
222
|
-
###
|
|
53
|
+
### With Database (Optional)
|
|
223
54
|
|
|
224
|
-
|
|
55
|
+
For persistent history across devices:
|
|
225
56
|
|
|
226
57
|
```bash
|
|
227
|
-
ownkey
|
|
228
|
-
ownkey
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
## 🔒 Security
|
|
232
|
-
|
|
233
|
-
- **API Keys**: Stored in OS keychain (macOS Keychain, Windows Credential Manager, Linux Secret Service)
|
|
234
|
-
- **Fallback**: Encrypted local storage if keychain unavailable
|
|
235
|
-
- **No Remote Storage**: Your source code is never uploaded to any server
|
|
236
|
-
- **Supabase**: Optional, user-controlled database for history only
|
|
237
|
-
|
|
238
|
-
## 🗂 Project Structure
|
|
239
|
-
|
|
240
|
-
```
|
|
241
|
-
~/.ownkey/
|
|
242
|
-
├── config.json # Configuration file
|
|
243
|
-
├── keys.enc # Encrypted API keys (fallback)
|
|
244
|
-
└── logs/ # Log files
|
|
58
|
+
ownkey config --supabase-url YOUR_URL --supabase-key YOUR_KEY
|
|
59
|
+
ownkey suggest .
|
|
245
60
|
```
|
|
246
61
|
|
|
247
|
-
##
|
|
248
|
-
|
|
249
|
-
```bash
|
|
250
|
-
# Install dependencies
|
|
251
|
-
npm install
|
|
252
|
-
|
|
253
|
-
# Run in development mode
|
|
254
|
-
npm run dev
|
|
62
|
+
## 📚 Documentation
|
|
255
63
|
|
|
256
|
-
|
|
257
|
-
npm run build
|
|
64
|
+
Visit **[ownkey.qzz.io](https://ownkey.qzz.io)** for complete documentation:
|
|
258
65
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
## 📝 Roadmap
|
|
264
|
-
|
|
265
|
-
- [x] v0.2.0 - CLI skeleton & configuration
|
|
266
|
-
- [x] v0.3.0 - Config system with keychain
|
|
267
|
-
- [x] v0.4.0 - File scanner
|
|
268
|
-
- [x] **v0.5.0 - Gemini AI integration** ← Current
|
|
269
|
-
- [ ] v0.6.0 - OpenAI & Anthropic providers
|
|
270
|
-
- [ ] v0.7.0 - Apply/diff system
|
|
271
|
-
- [ ] v0.8.0 - Ollama (local LLM) support
|
|
272
|
-
- [ ] v0.9.0 - Testing & polish
|
|
273
|
-
- [ ] v1.0.0 - Stable release
|
|
66
|
+
- [Getting Started](https://ownkey.qzz.io/docs/getting-started)
|
|
67
|
+
- [AI Providers Setup](https://ownkey.qzz.io/docs/providers)
|
|
68
|
+
- [Commands Reference](https://ownkey.qzz.io/docs/commands)
|
|
69
|
+
- [Database Setup](https://ownkey.qzz.io/docs/database)
|
|
274
70
|
|
|
275
71
|
## 🤝 Contributing
|
|
276
72
|
|
|
@@ -278,15 +74,8 @@ Contributions are welcome! Please feel free to submit a Pull Request.
|
|
|
278
74
|
|
|
279
75
|
## 📄 License
|
|
280
76
|
|
|
281
|
-
MIT ©
|
|
282
|
-
|
|
283
|
-
## 🔗 Links
|
|
284
|
-
|
|
285
|
-
- [GitHub Repository](https://github.com/ArpitK24/OwnKey)
|
|
286
|
-
- [Issue Tracker](https://github.com/ArpitK24/OwnKey/issues)
|
|
287
|
-
- [npm Package](https://www.npmjs.com/package/ownkey)
|
|
288
|
-
- [Get Gemini API Key](https://aistudio.google.com/app/apikey)
|
|
77
|
+
MIT © [OwnKey](https://ownkey.qzz.io)
|
|
289
78
|
|
|
290
79
|
---
|
|
291
80
|
|
|
292
|
-
**
|
|
81
|
+
**[Website](https://ownkey.qzz.io)** • **[Documentation](https://ownkey.qzz.io/docs)** • **[GitHub](https://github.com/ArpitK24/ownkey-cli)**
|
package/dist/ai/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAS3C;;GAEG;AACH,qBAAa,iBAAiB;IAC1B;;OAEG;WACU,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;IA6ClD;;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;WACU,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAmBvF"}
|
package/dist/ai/factory.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GeminiProvider } from './gemini.js';
|
|
2
2
|
import { OpenAIProvider } from './openai.js';
|
|
3
3
|
import { AnthropicProvider } from './anthropic.js';
|
|
4
|
+
import { OllamaProvider } from './ollama.js';
|
|
4
5
|
import { ConfigError } from '../types/index.js';
|
|
5
6
|
import { configManager } from '../config/manager.js';
|
|
6
7
|
import { logger } from '../utils/logger.js';
|
|
@@ -39,7 +40,10 @@ export class AIProviderFactory {
|
|
|
39
40
|
const anthropicModel = config.providers.anthropic?.model || 'claude-opus-4-5-20251101';
|
|
40
41
|
return new AnthropicProvider(apiKey, anthropicModel);
|
|
41
42
|
case 'ollama':
|
|
42
|
-
|
|
43
|
+
// Ollama doesn't require API key - runs locally
|
|
44
|
+
const ollamaModel = config.providers.ollama?.model || 'deepseek-coder:latest';
|
|
45
|
+
const ollamaBaseUrl = config.providers.ollama?.endpoint || 'http://localhost:11434';
|
|
46
|
+
return new OllamaProvider(undefined, ollamaModel, ollamaBaseUrl);
|
|
43
47
|
default:
|
|
44
48
|
throw new ConfigError(`Unknown provider: ${provider}`);
|
|
45
49
|
}
|
package/dist/ai/factory.js.map
CHANGED
|
@@ -1 +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,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,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,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,aAAa,CAAC;gBACpE,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAEnD,KAAK,WAAW;gBACZ,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,IAAI,WAAW,CAAC,iDAAiD,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,IAAI,0BAA0B,CAAC;gBACvF,OAAO,IAAI,iBAAiB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAEzD,KAAK,QAAQ;gBACT,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AIProvider } from './provider.js';
|
|
2
|
+
import type { CodeContext, Suggestion } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Ollama AI Provider
|
|
5
|
+
* Supports local LLMs via Ollama (DeepSeek Coder, CodeLlama, etc.)
|
|
6
|
+
* No API key required - runs completely offline
|
|
7
|
+
*/
|
|
8
|
+
export declare class OllamaProvider extends AIProvider {
|
|
9
|
+
private baseUrl;
|
|
10
|
+
constructor(apiKey?: string, model?: string, baseUrl?: string);
|
|
11
|
+
getDefaultModel(): string;
|
|
12
|
+
testConnection(): Promise<boolean>;
|
|
13
|
+
analyze(context: CodeContext): AsyncGenerator<Suggestion>;
|
|
14
|
+
private buildPrompt;
|
|
15
|
+
private parseResponse;
|
|
16
|
+
/**
|
|
17
|
+
* Get available Ollama models
|
|
18
|
+
* Lists models installed on the local Ollama instance
|
|
19
|
+
*/
|
|
20
|
+
static getAvailableModels(baseUrl?: string): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Check if Ollama is running
|
|
23
|
+
*/
|
|
24
|
+
static isOllamaRunning(baseUrl?: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a specific model is installed
|
|
27
|
+
*/
|
|
28
|
+
static isModelInstalled(model: string, baseUrl?: string): Promise<boolean>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/ai/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGjE;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC1C,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAK7D,eAAe,IAAI,MAAM;IAInB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAYjC,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC;IAsChE,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,aAAa;IAyCrB;;;OAGG;WACU,kBAAkB,CAAC,OAAO,GAAE,MAAiC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAe9F;;OAEG;WACU,eAAe,CAAC,OAAO,GAAE,MAAiC,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1F;;OAEG;WACU,gBAAgB,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAiC,GAC3C,OAAO,CAAC,OAAO,CAAC;CAItB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { AIProvider } from './provider.js';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Ollama AI Provider
|
|
5
|
+
* Supports local LLMs via Ollama (DeepSeek Coder, CodeLlama, etc.)
|
|
6
|
+
* No API key required - runs completely offline
|
|
7
|
+
*/
|
|
8
|
+
export class OllamaProvider extends AIProvider {
|
|
9
|
+
baseUrl;
|
|
10
|
+
constructor(apiKey, model, baseUrl) {
|
|
11
|
+
super(apiKey, model);
|
|
12
|
+
this.baseUrl = baseUrl || 'http://localhost:11434';
|
|
13
|
+
}
|
|
14
|
+
getDefaultModel() {
|
|
15
|
+
return 'deepseek-coder:latest';
|
|
16
|
+
}
|
|
17
|
+
async testConnection() {
|
|
18
|
+
try {
|
|
19
|
+
const response = await fetch(`${this.baseUrl}/api/tags`, {
|
|
20
|
+
method: 'GET',
|
|
21
|
+
});
|
|
22
|
+
return response.ok;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
logger.verbose(`Ollama connection test failed: ${error.message}`);
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async *analyze(context) {
|
|
30
|
+
const prompt = this.buildPrompt(context);
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(`${this.baseUrl}/api/generate`, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify({
|
|
38
|
+
model: this.model,
|
|
39
|
+
prompt: prompt,
|
|
40
|
+
stream: false,
|
|
41
|
+
}),
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
throw new Error(`Ollama API error: ${response.status} ${response.statusText}`);
|
|
45
|
+
}
|
|
46
|
+
const data = await response.json();
|
|
47
|
+
const suggestions = this.parseResponse(data.response, context);
|
|
48
|
+
for (const suggestion of suggestions) {
|
|
49
|
+
yield suggestion;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error.code === 'ECONNREFUSED') {
|
|
54
|
+
throw new Error('Cannot connect to Ollama. Please ensure Ollama is running:\n' +
|
|
55
|
+
' Start Ollama: ollama serve\n' +
|
|
56
|
+
' Or check if Ollama is installed: https://ollama.ai');
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
buildPrompt(context) {
|
|
62
|
+
const fileContents = context.files
|
|
63
|
+
.map((file) => `File: ${file.path}\n\`\`\`\n${file.content}\n\`\`\``)
|
|
64
|
+
.join('\n\n');
|
|
65
|
+
return `You are a code analysis expert. Analyze the following code and identify issues.
|
|
66
|
+
|
|
67
|
+
Project: ${context.projectInfo.name}
|
|
68
|
+
Files to analyze: ${context.projectInfo.fileCount}
|
|
69
|
+
|
|
70
|
+
${fileContents}
|
|
71
|
+
|
|
72
|
+
Please analyze this code and provide suggestions for:
|
|
73
|
+
- Bugs and potential errors
|
|
74
|
+
- Security vulnerabilities
|
|
75
|
+
- Performance issues
|
|
76
|
+
- Code quality improvements
|
|
77
|
+
- Missing tests
|
|
78
|
+
- Documentation gaps
|
|
79
|
+
|
|
80
|
+
For each issue found, provide:
|
|
81
|
+
1. Type (bug, security, performance, test, documentation, style)
|
|
82
|
+
2. Severity (critical, high, medium, low, info)
|
|
83
|
+
3. File path
|
|
84
|
+
4. Description of the issue
|
|
85
|
+
5. Suggested fix
|
|
86
|
+
|
|
87
|
+
Format your response as a JSON array of suggestions:
|
|
88
|
+
[
|
|
89
|
+
{
|
|
90
|
+
"type": "bug",
|
|
91
|
+
"severity": "high",
|
|
92
|
+
"filePath": "path/to/file.js",
|
|
93
|
+
"content": "Description of the issue and suggested fix"
|
|
94
|
+
}
|
|
95
|
+
]`;
|
|
96
|
+
}
|
|
97
|
+
parseResponse(response, context) {
|
|
98
|
+
try {
|
|
99
|
+
// Try to extract JSON from response
|
|
100
|
+
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
101
|
+
if (!jsonMatch) {
|
|
102
|
+
// Fallback: create generic suggestion
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
type: 'style',
|
|
106
|
+
severity: 'info',
|
|
107
|
+
filePath: context.files[0]?.path || 'unknown',
|
|
108
|
+
content: response.substring(0, 200),
|
|
109
|
+
diff: '',
|
|
110
|
+
rationale: 'AI response could not be parsed',
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
const suggestions = JSON.parse(jsonMatch[0]);
|
|
115
|
+
return suggestions.map((s) => ({
|
|
116
|
+
type: s.type || 'info',
|
|
117
|
+
severity: s.severity || 'info',
|
|
118
|
+
filePath: s.filePath || context.files[0]?.path || 'unknown',
|
|
119
|
+
content: s.content || s.description || 'No description provided',
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
logger.verbose(`Failed to parse Ollama response: ${error.message}`);
|
|
124
|
+
// Return generic suggestion if parsing fails
|
|
125
|
+
return [
|
|
126
|
+
{
|
|
127
|
+
type: 'style',
|
|
128
|
+
severity: 'info',
|
|
129
|
+
filePath: context.files[0]?.path || 'unknown',
|
|
130
|
+
content: response.substring(0, 200),
|
|
131
|
+
diff: '',
|
|
132
|
+
rationale: 'AI response parsing failed',
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get available Ollama models
|
|
139
|
+
* Lists models installed on the local Ollama instance
|
|
140
|
+
*/
|
|
141
|
+
static async getAvailableModels(baseUrl = 'http://localhost:11434') {
|
|
142
|
+
try {
|
|
143
|
+
const response = await fetch(`${baseUrl}/api/tags`);
|
|
144
|
+
if (!response.ok) {
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
const data = await response.json();
|
|
148
|
+
return data.models?.map((m) => m.name) || [];
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
logger.verbose(`Failed to get Ollama models: ${error.message}`);
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if Ollama is running
|
|
157
|
+
*/
|
|
158
|
+
static async isOllamaRunning(baseUrl = 'http://localhost:11434') {
|
|
159
|
+
try {
|
|
160
|
+
const response = await fetch(`${baseUrl}/api/tags`);
|
|
161
|
+
return response.ok;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Check if a specific model is installed
|
|
169
|
+
*/
|
|
170
|
+
static async isModelInstalled(model, baseUrl = 'http://localhost:11434') {
|
|
171
|
+
const models = await this.getAvailableModels(baseUrl);
|
|
172
|
+
return models.includes(model);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/ai/ollama.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;AAYpC,eAAO,MAAM,cAAc,SAmLrB,CAAC"}
|
package/dist/commands/suggest.js
CHANGED
|
@@ -7,6 +7,7 @@ import { AIProviderFactory } from '../ai/factory.js';
|
|
|
7
7
|
import { dbOps } from '../db/operations.js';
|
|
8
8
|
import { dbClient } from '../db/client.js';
|
|
9
9
|
import chalk from 'chalk';
|
|
10
|
+
import { localStorage } from '../storage/local.js';
|
|
10
11
|
export const suggestCommand = new Command('suggest')
|
|
11
12
|
.description('Generate AI-powered suggestions for your code')
|
|
12
13
|
.argument('[path]', 'Path to analyze', '.')
|
|
@@ -75,26 +76,57 @@ export const suggestCommand = new Command('suggest')
|
|
|
75
76
|
console.log(` ${suggestion.content}`);
|
|
76
77
|
console.log();
|
|
77
78
|
}
|
|
78
|
-
// Step 6: Store
|
|
79
|
+
// Step 6: Store suggestions (hybrid: database + local file)
|
|
80
|
+
let storedIds = [];
|
|
81
|
+
// Try database first (if connected)
|
|
79
82
|
if (dbClient.isConnected()) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (project) {
|
|
86
|
-
const run = await dbOps.createRun(project.id, `suggest ${path}`);
|
|
87
|
-
for (const suggestion of suggestions) {
|
|
88
|
-
const stored = await dbOps.createSuggestion(project.id, suggestion);
|
|
89
|
-
if (stored && run) {
|
|
90
|
-
await dbOps.linkRunSuggestion(run.id, stored.id);
|
|
91
|
-
}
|
|
83
|
+
try {
|
|
84
|
+
logger.verbose('Storing suggestions in database...');
|
|
85
|
+
let project = await dbOps.getProjectByPath(targetPath);
|
|
86
|
+
if (!project) {
|
|
87
|
+
project = await dbOps.createProject(projectName, targetPath);
|
|
92
88
|
}
|
|
93
|
-
if (
|
|
94
|
-
await dbOps.
|
|
89
|
+
if (project) {
|
|
90
|
+
const run = await dbOps.createRun(project.id, `suggest ${path}`);
|
|
91
|
+
for (const suggestion of suggestions) {
|
|
92
|
+
try {
|
|
93
|
+
const stored = await dbOps.createSuggestion(project.id, suggestion);
|
|
94
|
+
if (stored && run) {
|
|
95
|
+
await dbOps.linkRunSuggestion(run.id, stored.id);
|
|
96
|
+
storedIds.push(stored.id);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
logger.warn(`Failed to store suggestion: ${err.message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (run) {
|
|
104
|
+
await dbOps.updateRunStatus(run.id, 'completed', `Generated ${suggestions.length} suggestions`);
|
|
105
|
+
}
|
|
95
106
|
}
|
|
107
|
+
logger.success('Saved to database');
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger.warn('Database save failed, using local storage only');
|
|
111
|
+
logger.debug(`Database error: ${error.message}`);
|
|
96
112
|
}
|
|
97
113
|
}
|
|
114
|
+
// Always save to local file (cache or primary storage)
|
|
115
|
+
try {
|
|
116
|
+
const localStored = await localStorage.saveSuggestions(targetPath, projectName, suggestions);
|
|
117
|
+
if (!dbClient.isConnected()) {
|
|
118
|
+
// Local-only mode: show IDs to user
|
|
119
|
+
storedIds = localStored.map(s => s.id);
|
|
120
|
+
logger.success('Saved locally');
|
|
121
|
+
console.log(chalk.gray(`\n 💾 Suggestion IDs: ${storedIds.slice(0, 3).join(', ')}${storedIds.length > 3 ? '...' : ''}`));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
logger.verbose('Also cached locally for quick access');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
logger.warn(`Failed to save locally: ${error.message}`);
|
|
129
|
+
}
|
|
98
130
|
// Summary
|
|
99
131
|
console.log(chalk.bold('\n✨ Analysis Complete!\n'));
|
|
100
132
|
console.log(` Total suggestions: ${chalk.green(suggestions.length)}`);
|
|
@@ -123,7 +155,7 @@ export const suggestCommand = new Command('suggest')
|
|
|
123
155
|
process.exit(1);
|
|
124
156
|
}
|
|
125
157
|
finally {
|
|
126
|
-
//
|
|
158
|
+
// Only disconnect if database was connected
|
|
127
159
|
if (dbClient.isConnected()) {
|
|
128
160
|
await dbClient.disconnect();
|
|
129
161
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/commands/suggest.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ export declare class ApplyEngine {
|
|
|
21
21
|
*/
|
|
22
22
|
applySuggestion(suggestionId: string, options?: ApplyOptions): Promise<ApplyEngineResult>;
|
|
23
23
|
/**
|
|
24
|
-
* Load suggestion from database
|
|
24
|
+
* Load suggestion from database OR local storage
|
|
25
25
|
*/
|
|
26
26
|
private loadSuggestion;
|
|
27
27
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/core/apply/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,aAAa,CAAgB;;IAMrC;;OAEG;IACG,eAAe,CACjB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,YAAiB,GAC3B,OAAO,CAAC,iBAAiB,CAAC;IAuI7B;;OAEG;YACW,cAAc;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/core/apply/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,aAAa,CAAgB;;IAMrC;;OAEG;IACG,eAAe,CACjB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,YAAiB,GAC3B,OAAO,CAAC,iBAAiB,CAAC;IAuI7B;;OAEG;YACW,cAAc;IAoC5B;;OAEG;YACW,WAAW;IA6BzB;;OAEG;IACH,gBAAgB,IAAI,aAAa;CAGpC"}
|
|
@@ -125,23 +125,40 @@ export class ApplyEngine {
|
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
|
-
* Load suggestion from database
|
|
128
|
+
* Load suggestion from database OR local storage
|
|
129
129
|
*/
|
|
130
130
|
async loadSuggestion(suggestionId) {
|
|
131
|
-
if
|
|
132
|
-
|
|
131
|
+
// Try database first (if connected)
|
|
132
|
+
if (dbClient.isConnected()) {
|
|
133
|
+
try {
|
|
134
|
+
const sql = dbClient.getClient();
|
|
135
|
+
if (sql) {
|
|
136
|
+
const results = await sql `
|
|
137
|
+
SELECT diff FROM suggestions WHERE id = ${suggestionId}
|
|
138
|
+
`;
|
|
139
|
+
if (results.length > 0) {
|
|
140
|
+
logger.verbose('Loaded suggestion from database');
|
|
141
|
+
return results[0];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
logger.warn(`Failed to load from database: ${error.message}`);
|
|
147
|
+
}
|
|
133
148
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
149
|
+
// Fall back to local storage
|
|
150
|
+
try {
|
|
151
|
+
const { localStorage } = await import('../../storage/local.js');
|
|
152
|
+
const stored = await localStorage.loadSuggestion(suggestionId);
|
|
153
|
+
if (stored && stored.diff) {
|
|
154
|
+
logger.verbose('Loaded suggestion from local storage');
|
|
155
|
+
return { diff: stored.diff };
|
|
156
|
+
}
|
|
137
157
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
`;
|
|
141
|
-
if (results.length === 0) {
|
|
142
|
-
return null;
|
|
158
|
+
catch (error) {
|
|
159
|
+
logger.warn(`Failed to load from local storage: ${error.message}`);
|
|
143
160
|
}
|
|
144
|
-
return
|
|
161
|
+
return null;
|
|
145
162
|
}
|
|
146
163
|
/**
|
|
147
164
|
* Record apply operation in database
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/core/apply/engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/core/apply/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/db/client.d.ts
CHANGED
package/dist/db/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAYlD,qBAAa,cAAc;IACvB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,EAAE,CAA2C;IACrD,OAAO,CAAC,WAAW,CAAkB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAYlD,qBAAa,cAAc;IACvB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,EAAE,CAA2C;IACrD,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,eAAe,CAAkB;IAEnC,OAAO,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDlD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,KAAK,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC;IAUnC,WAAW,IAAI,OAAO;IAItB,eAAe,IAAI,OAAO;IAI1B,SAAS,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,GAAG,IAAI;YAIjC,aAAa;YAuDb,YAAY;CAsB7B;AAED,eAAO,MAAM,QAAQ,gBAAuB,CAAC"}
|
package/dist/db/client.js
CHANGED
|
@@ -13,6 +13,7 @@ export class DatabaseClient {
|
|
|
13
13
|
sql = null;
|
|
14
14
|
db = null;
|
|
15
15
|
isLocalOnly = false;
|
|
16
|
+
isDisconnecting = false;
|
|
16
17
|
async connect(localOnly = false) {
|
|
17
18
|
if (localOnly) {
|
|
18
19
|
this.isLocalOnly = true;
|
|
@@ -59,11 +60,20 @@ export class DatabaseClient {
|
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
async disconnect() {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
try {
|
|
64
|
+
if (this.sql && !this.isDisconnecting) {
|
|
65
|
+
this.isDisconnecting = true;
|
|
66
|
+
await this.sql.end();
|
|
67
|
+
this.sql = null;
|
|
68
|
+
this.db = null;
|
|
69
|
+
this.isDisconnecting = false;
|
|
70
|
+
logger.verbose('Database connection closed');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// Ignore errors during disconnect
|
|
75
|
+
this.isDisconnecting = false;
|
|
76
|
+
logger.verbose(`Error during disconnect: ${error.message}`);
|
|
67
77
|
}
|
|
68
78
|
}
|
|
69
79
|
getDb() {
|
package/dist/db/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,OAAO,cAAc;IACf,GAAG,GAAwB,IAAI,CAAC;IAChC,EAAE,GAAsC,IAAI,CAAC;IAC7C,WAAW,GAAY,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ const program = new Command();
|
|
|
14
14
|
program
|
|
15
15
|
.name('ownkey')
|
|
16
16
|
.description('Local-first AI coding agent for intelligent codebase analysis')
|
|
17
|
-
.version('0.
|
|
17
|
+
.version('1.0.0');
|
|
18
18
|
// Global options
|
|
19
19
|
program.option('--local-only', 'Run without database persistence');
|
|
20
20
|
program.option('--verbose', 'Enable verbose logging');
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Suggestion } from '../types/index.js';
|
|
2
|
+
export interface StoredSuggestion extends Suggestion {
|
|
3
|
+
id: string;
|
|
4
|
+
projectPath: string;
|
|
5
|
+
projectName: string;
|
|
6
|
+
createdAt: string;
|
|
7
|
+
}
|
|
8
|
+
export interface BackupInfo {
|
|
9
|
+
id: string;
|
|
10
|
+
filePath: string;
|
|
11
|
+
originalContent: string;
|
|
12
|
+
modifiedContent: string;
|
|
13
|
+
suggestionId: string;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Local file storage for suggestions and backups
|
|
18
|
+
* Automatically creates ~/.ownkey/storage/ directory
|
|
19
|
+
* Works as primary storage in local-only mode or cache when database is available
|
|
20
|
+
*/
|
|
21
|
+
export declare class LocalStorage {
|
|
22
|
+
private storageDir;
|
|
23
|
+
private suggestionsFile;
|
|
24
|
+
private backupsDir;
|
|
25
|
+
constructor();
|
|
26
|
+
/**
|
|
27
|
+
* Initialize storage directories
|
|
28
|
+
* Creates ~/.ownkey/storage/ if it doesn't exist
|
|
29
|
+
*/
|
|
30
|
+
init(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Save suggestions to local file
|
|
33
|
+
* Automatically cleans up old suggestions (7 days, max 100 per project)
|
|
34
|
+
*/
|
|
35
|
+
saveSuggestions(projectPath: string, projectName: string, suggestions: Suggestion[]): Promise<StoredSuggestion[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Load a single suggestion by ID
|
|
38
|
+
*/
|
|
39
|
+
loadSuggestion(id: string): Promise<StoredSuggestion | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Load all suggestions for a specific project
|
|
42
|
+
*/
|
|
43
|
+
loadSuggestionsForProject(projectPath: string): Promise<StoredSuggestion[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Load all suggestions from local file
|
|
46
|
+
*/
|
|
47
|
+
private loadAllSuggestions;
|
|
48
|
+
/**
|
|
49
|
+
* Save a backup for undo functionality
|
|
50
|
+
*/
|
|
51
|
+
saveBackup(backup: Omit<BackupInfo, 'id' | 'createdAt'>): Promise<BackupInfo>;
|
|
52
|
+
/**
|
|
53
|
+
* Load a backup by ID
|
|
54
|
+
*/
|
|
55
|
+
loadBackup(id: string): Promise<BackupInfo | null>;
|
|
56
|
+
/**
|
|
57
|
+
* Clear all local suggestions
|
|
58
|
+
*/
|
|
59
|
+
clear(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Get storage statistics
|
|
62
|
+
*/
|
|
63
|
+
getStats(): Promise<{
|
|
64
|
+
totalSuggestions: number;
|
|
65
|
+
projectCount: number;
|
|
66
|
+
oldestSuggestion: string | null;
|
|
67
|
+
newestSuggestion: string | null;
|
|
68
|
+
}>;
|
|
69
|
+
}
|
|
70
|
+
export declare const localStorage: LocalStorage;
|
|
71
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAS;;IAS3B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB3B;;;OAGG;IACG,eAAe,CACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,UAAU,EAAE,GAC1B,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgD9B;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAKlE;;OAEG;IACG,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKjF;;OAEG;YACW,kBAAkB;IAUhC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBnF;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAaxD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,CAAC;CAaL;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { writeFile, readFile, mkdir } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Local file storage for suggestions and backups
|
|
8
|
+
* Automatically creates ~/.ownkey/storage/ directory
|
|
9
|
+
* Works as primary storage in local-only mode or cache when database is available
|
|
10
|
+
*/
|
|
11
|
+
export class LocalStorage {
|
|
12
|
+
storageDir;
|
|
13
|
+
suggestionsFile;
|
|
14
|
+
backupsDir;
|
|
15
|
+
constructor() {
|
|
16
|
+
// Automatically use user's home directory
|
|
17
|
+
this.storageDir = join(homedir(), '.ownkey', 'storage');
|
|
18
|
+
this.suggestionsFile = join(this.storageDir, 'suggestions.json');
|
|
19
|
+
this.backupsDir = join(this.storageDir, 'backups');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Initialize storage directories
|
|
23
|
+
* Creates ~/.ownkey/storage/ if it doesn't exist
|
|
24
|
+
*/
|
|
25
|
+
async init() {
|
|
26
|
+
try {
|
|
27
|
+
// Create storage directory
|
|
28
|
+
if (!existsSync(this.storageDir)) {
|
|
29
|
+
await mkdir(this.storageDir, { recursive: true });
|
|
30
|
+
logger.verbose(`Created storage directory: ${this.storageDir}`);
|
|
31
|
+
}
|
|
32
|
+
// Create backups directory
|
|
33
|
+
if (!existsSync(this.backupsDir)) {
|
|
34
|
+
await mkdir(this.backupsDir, { recursive: true });
|
|
35
|
+
logger.verbose(`Created backups directory: ${this.backupsDir}`);
|
|
36
|
+
}
|
|
37
|
+
// Create suggestions file
|
|
38
|
+
if (!existsSync(this.suggestionsFile)) {
|
|
39
|
+
await writeFile(this.suggestionsFile, JSON.stringify([], null, 2));
|
|
40
|
+
logger.verbose(`Created suggestions file: ${this.suggestionsFile}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
logger.error(`Failed to initialize storage: ${error.message}`);
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Save suggestions to local file
|
|
50
|
+
* Automatically cleans up old suggestions (7 days, max 100 per project)
|
|
51
|
+
*/
|
|
52
|
+
async saveSuggestions(projectPath, projectName, suggestions) {
|
|
53
|
+
await this.init();
|
|
54
|
+
const timestamp = Date.now();
|
|
55
|
+
const stored = suggestions.map((s, index) => ({
|
|
56
|
+
...s,
|
|
57
|
+
id: `local-${timestamp}-${index}`,
|
|
58
|
+
projectPath,
|
|
59
|
+
projectName,
|
|
60
|
+
createdAt: new Date().toISOString(),
|
|
61
|
+
}));
|
|
62
|
+
// Read existing suggestions
|
|
63
|
+
const existing = await this.loadAllSuggestions();
|
|
64
|
+
// Filter: keep only recent suggestions (7 days) and limit per project (100)
|
|
65
|
+
const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
|
|
66
|
+
const filtered = existing.filter(s => new Date(s.createdAt).getTime() > sevenDaysAgo);
|
|
67
|
+
// Group by project and limit to 100 per project
|
|
68
|
+
const byProject = new Map();
|
|
69
|
+
for (const s of filtered) {
|
|
70
|
+
const list = byProject.get(s.projectPath) || [];
|
|
71
|
+
list.push(s);
|
|
72
|
+
byProject.set(s.projectPath, list);
|
|
73
|
+
}
|
|
74
|
+
// Keep only last 100 per project
|
|
75
|
+
const limited = [];
|
|
76
|
+
for (const [, list] of byProject.entries()) {
|
|
77
|
+
const sorted = list.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
78
|
+
limited.push(...sorted.slice(0, 100));
|
|
79
|
+
}
|
|
80
|
+
// Add new suggestions
|
|
81
|
+
const updated = [...limited, ...stored];
|
|
82
|
+
// Save to file
|
|
83
|
+
await writeFile(this.suggestionsFile, JSON.stringify(updated, null, 2));
|
|
84
|
+
logger.verbose(`Saved ${stored.length} suggestions locally`);
|
|
85
|
+
return stored;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Load a single suggestion by ID
|
|
89
|
+
*/
|
|
90
|
+
async loadSuggestion(id) {
|
|
91
|
+
const all = await this.loadAllSuggestions();
|
|
92
|
+
return all.find(s => s.id === id) || null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Load all suggestions for a specific project
|
|
96
|
+
*/
|
|
97
|
+
async loadSuggestionsForProject(projectPath) {
|
|
98
|
+
const all = await this.loadAllSuggestions();
|
|
99
|
+
return all.filter(s => s.projectPath === projectPath);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Load all suggestions from local file
|
|
103
|
+
*/
|
|
104
|
+
async loadAllSuggestions() {
|
|
105
|
+
try {
|
|
106
|
+
await this.init();
|
|
107
|
+
const content = await readFile(this.suggestionsFile, 'utf-8');
|
|
108
|
+
return JSON.parse(content);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Save a backup for undo functionality
|
|
116
|
+
*/
|
|
117
|
+
async saveBackup(backup) {
|
|
118
|
+
await this.init();
|
|
119
|
+
const backupInfo = {
|
|
120
|
+
...backup,
|
|
121
|
+
id: `backup-${Date.now()}`,
|
|
122
|
+
createdAt: new Date().toISOString(),
|
|
123
|
+
};
|
|
124
|
+
const backupFile = join(this.backupsDir, `${backupInfo.id}.json`);
|
|
125
|
+
await writeFile(backupFile, JSON.stringify(backupInfo, null, 2));
|
|
126
|
+
logger.verbose(`Saved backup: ${backupInfo.id}`);
|
|
127
|
+
return backupInfo;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Load a backup by ID
|
|
131
|
+
*/
|
|
132
|
+
async loadBackup(id) {
|
|
133
|
+
try {
|
|
134
|
+
const backupFile = join(this.backupsDir, `${id}.json`);
|
|
135
|
+
if (!existsSync(backupFile)) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const content = await readFile(backupFile, 'utf-8');
|
|
139
|
+
return JSON.parse(content);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Clear all local suggestions
|
|
147
|
+
*/
|
|
148
|
+
async clear() {
|
|
149
|
+
await this.init();
|
|
150
|
+
await writeFile(this.suggestionsFile, JSON.stringify([], null, 2));
|
|
151
|
+
logger.info('Cleared all local suggestions');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get storage statistics
|
|
155
|
+
*/
|
|
156
|
+
async getStats() {
|
|
157
|
+
const all = await this.loadAllSuggestions();
|
|
158
|
+
const projects = new Set(all.map(s => s.projectPath));
|
|
159
|
+
const dates = all.map(s => new Date(s.createdAt).getTime()).sort();
|
|
160
|
+
return {
|
|
161
|
+
totalSuggestions: all.length,
|
|
162
|
+
projectCount: projects.size,
|
|
163
|
+
oldestSuggestion: dates.length > 0 ? new Date(dates[0]).toISOString() : null,
|
|
164
|
+
newestSuggestion: dates.length > 0 ? new Date(dates[dates.length - 1]).toISOString() : null,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Singleton instance
|
|
169
|
+
export const localStorage = new LocalStorage();
|
|
170
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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"}
|