ownkey 0.1.1 → 0.2.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/.prettierrc +9 -0
- package/LICENSE +21 -0
- package/README.md +175 -0
- package/dist/commands/apply.d.ts +3 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +26 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +142 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +97 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/suggest.d.ts +3 -0
- package/dist/commands/suggest.d.ts.map +1 -0
- package/dist/commands/suggest.js +34 -0
- package/dist/commands/suggest.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +74 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/keychain.d.ts +14 -0
- package/dist/config/keychain.d.ts.map +1 -0
- package/dist/config/keychain.js +112 -0
- package/dist/config/keychain.js.map +1 -0
- package/dist/config/manager.d.ts +21 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +144 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/core/scanner.d.ts +17 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +150 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/db/client.d.ts +15 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +130 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/operations.d.ts +14 -0
- package/dist/db/operations.d.ts.map +1 -0
- package/dist/db/operations.js +175 -0
- package/dist/db/operations.js.map +1 -0
- package/dist/db/schema.d.ts +683 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +107 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -2
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +138 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/encryption.d.ts +6 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +39 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/logger.d.ts +25 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +97 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +56 -29
- package/src/commands/apply.ts +27 -0
- package/src/commands/config.ts +154 -0
- package/src/commands/scan.ts +114 -0
- package/src/commands/suggest.ts +37 -0
- package/src/config/defaults.ts +80 -0
- package/src/config/keychain.ts +125 -0
- package/src/config/manager.ts +166 -0
- package/src/core/scanner.ts +174 -0
- package/src/db/client.ts +151 -0
- package/src/db/migrations/001_init.sql +80 -0
- package/src/db/operations.ts +217 -0
- package/src/db/schema.ts +118 -0
- package/src/index.ts +74 -0
- package/src/types/index.ts +198 -0
- package/src/utils/encryption.ts +54 -0
- package/src/utils/logger.ts +111 -0
- package/tsconfig.json +33 -0
package/.prettierrc
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 OwnKey
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# OwnKey CLI
|
|
2
|
+
|
|
3
|
+
**Local-first AI coding agent for intelligent codebase analysis**
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/ownkey)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
## 🚀 Quick Start
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# Install globally
|
|
12
|
+
npm install -g ownkey
|
|
13
|
+
|
|
14
|
+
# Configure OwnKey
|
|
15
|
+
ownkey config
|
|
16
|
+
|
|
17
|
+
# Scan your project
|
|
18
|
+
ownkey scan .
|
|
19
|
+
|
|
20
|
+
# Get AI suggestions (coming in v0.5.0)
|
|
21
|
+
ownkey suggest .
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 📋 Features
|
|
25
|
+
|
|
26
|
+
- **Local-First**: Your code never leaves your machine
|
|
27
|
+
- **AI-Powered**: Intelligent analysis using OpenAI, Anthropic, or local LLMs
|
|
28
|
+
- **Privacy-First**: API keys stored securely in OS keychain
|
|
29
|
+
- **Database Integration**: Optional Supabase for history tracking
|
|
30
|
+
- **Smart Scanning**: Respects .gitignore and custom ignore patterns
|
|
31
|
+
- **Safe Changes**: Backup files before applying suggestions
|
|
32
|
+
|
|
33
|
+
## 🛠 Installation
|
|
34
|
+
|
|
35
|
+
### Via npm (Recommended)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm install -g ownkey
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### From Source
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/yourusername/ownkey-cli.git
|
|
45
|
+
cd ownkey-cli
|
|
46
|
+
npm install
|
|
47
|
+
npm run build
|
|
48
|
+
npm link
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## ⚙️ Configuration
|
|
52
|
+
|
|
53
|
+
Run the interactive configuration wizard:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
ownkey config
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Or use flags:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Configure Supabase
|
|
63
|
+
ownkey config --supabase-url postgresql://... --supabase-key your-key
|
|
64
|
+
|
|
65
|
+
# Configure AI provider
|
|
66
|
+
ownkey config --provider openai --api-key sk-...
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Supported AI Providers
|
|
70
|
+
|
|
71
|
+
- **OpenAI** (GPT-4)
|
|
72
|
+
- **Anthropic** (Claude)
|
|
73
|
+
- **Ollama** (Local LLMs)
|
|
74
|
+
|
|
75
|
+
## 📖 Commands
|
|
76
|
+
|
|
77
|
+
### `ownkey config`
|
|
78
|
+
|
|
79
|
+
Configure Supabase database and AI providers.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
ownkey config # Interactive wizard
|
|
83
|
+
ownkey config --reset # Reset to defaults
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### `ownkey scan [path]`
|
|
87
|
+
|
|
88
|
+
Scan a project directory.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
ownkey scan . # Scan current directory
|
|
92
|
+
ownkey scan ./src # Scan specific folder
|
|
93
|
+
ownkey scan --max-file-size 1mb # Custom file size limit
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### `ownkey suggest [path]` *(Coming in v0.5.0)*
|
|
97
|
+
|
|
98
|
+
Generate AI-powered suggestions.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
ownkey suggest .
|
|
102
|
+
ownkey suggest --type security
|
|
103
|
+
ownkey suggest --severity high
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### `ownkey apply <id>` *(Coming in v0.7.0)*
|
|
107
|
+
|
|
108
|
+
Apply a suggestion to your code.
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
ownkey apply abc123
|
|
112
|
+
ownkey apply abc123 --no-backup
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 🔒 Security
|
|
116
|
+
|
|
117
|
+
- **API Keys**: Stored in OS keychain (macOS Keychain, Windows Credential Manager, Linux Secret Service)
|
|
118
|
+
- **Fallback**: Encrypted local storage if keychain unavailable
|
|
119
|
+
- **No Remote Storage**: Your source code is never uploaded to any server
|
|
120
|
+
- **Supabase**: Optional, user-controlled database for history only
|
|
121
|
+
|
|
122
|
+
## 🗂 Project Structure
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
~/.ownkey/
|
|
126
|
+
├── config.json # Configuration file
|
|
127
|
+
├── keys.enc # Encrypted API keys (fallback)
|
|
128
|
+
└── logs/ # Log files
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 🧪 Development
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Install dependencies
|
|
135
|
+
npm install
|
|
136
|
+
|
|
137
|
+
# Run in development mode
|
|
138
|
+
npm run dev
|
|
139
|
+
|
|
140
|
+
# Build
|
|
141
|
+
npm run build
|
|
142
|
+
|
|
143
|
+
# Run tests
|
|
144
|
+
npm test
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## 📝 Roadmap
|
|
148
|
+
|
|
149
|
+
- [x] v0.2.0 - CLI skeleton & configuration
|
|
150
|
+
- [x] v0.3.0 - Config system with keychain
|
|
151
|
+
- [x] v0.4.0 - File scanner
|
|
152
|
+
- [ ] v0.5.0 - AI provider integration
|
|
153
|
+
- [ ] v0.6.0 - Suggestion engine
|
|
154
|
+
- [ ] v0.7.0 - Apply/diff system
|
|
155
|
+
- [ ] v0.8.0 - Additional commands
|
|
156
|
+
- [ ] v0.9.0 - Testing & polish
|
|
157
|
+
- [ ] v1.0.0 - Stable release
|
|
158
|
+
|
|
159
|
+
## 🤝 Contributing
|
|
160
|
+
|
|
161
|
+
Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) first.
|
|
162
|
+
|
|
163
|
+
## 📄 License
|
|
164
|
+
|
|
165
|
+
MIT © 2026 OwnKey
|
|
166
|
+
|
|
167
|
+
## 🔗 Links
|
|
168
|
+
|
|
169
|
+
- [Documentation](https://github.com/yourusername/ownkey-cli/wiki)
|
|
170
|
+
- [Issue Tracker](https://github.com/yourusername/ownkey-cli/issues)
|
|
171
|
+
- [npm Package](https://www.npmjs.com/package/ownkey)
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
**Note**: OwnKey is currently in active development. Features marked as "coming soon" are planned for upcoming releases.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,YAAY,SAsBnB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
export const applyCommand = new Command('apply')
|
|
5
|
+
.description('Apply a suggestion to your code')
|
|
6
|
+
.argument('<id>', 'Suggestion ID to apply')
|
|
7
|
+
.option('--no-backup', 'Skip creating backup file')
|
|
8
|
+
.action(async (id) => {
|
|
9
|
+
try {
|
|
10
|
+
logger.info(`Applying suggestion: ${chalk.cyan(id)}`);
|
|
11
|
+
// TODO: Implement apply logic
|
|
12
|
+
console.log(chalk.yellow('\n⚠️ Apply functionality coming in v0.7.0\n'));
|
|
13
|
+
console.log('This command will:');
|
|
14
|
+
console.log(chalk.gray(' 1. Load suggestion from database'));
|
|
15
|
+
console.log(chalk.gray(' 2. Preview diff'));
|
|
16
|
+
console.log(chalk.gray(' 3. Create backup'));
|
|
17
|
+
console.log(chalk.gray(' 4. Apply patch'));
|
|
18
|
+
console.log(chalk.gray(' 5. Record action in history\n'));
|
|
19
|
+
logger.info('Apply command placeholder - full implementation coming soon');
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
logger.error('Apply failed', error);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC3C,WAAW,CAAC,iCAAiC,CAAC;KAC9C,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;KAC1C,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;IACzB,IAAI,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAEtD,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAE3D,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,KAAc,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,aAAa,SAwCpB,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { configManager } from '../config/manager.js';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
export const configCommand = new Command('config')
|
|
7
|
+
.description('Configure OwnKey CLI (Supabase, AI providers)')
|
|
8
|
+
.option('--supabase-url <url>', 'Supabase project URL')
|
|
9
|
+
.option('--supabase-key <key>', 'Supabase service role key')
|
|
10
|
+
.option('--provider <provider>', 'AI provider (openai, anthropic, ollama)')
|
|
11
|
+
.option('--api-key <key>', 'API key for the provider')
|
|
12
|
+
.option('--model <model>', 'Model name to use')
|
|
13
|
+
.option('--reset', 'Reset configuration to defaults')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
try {
|
|
16
|
+
// Handle reset
|
|
17
|
+
if (options.reset) {
|
|
18
|
+
const { confirm } = await inquirer.prompt([
|
|
19
|
+
{
|
|
20
|
+
type: 'confirm',
|
|
21
|
+
name: 'confirm',
|
|
22
|
+
message: 'Are you sure you want to reset configuration?',
|
|
23
|
+
default: false,
|
|
24
|
+
},
|
|
25
|
+
]);
|
|
26
|
+
if (confirm) {
|
|
27
|
+
await configManager.reset();
|
|
28
|
+
logger.success('Configuration reset successfully');
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// If flags provided, use them
|
|
33
|
+
if (options.supabaseUrl || options.provider) {
|
|
34
|
+
await handleFlagBasedConfig(options);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Otherwise, run interactive wizard
|
|
38
|
+
await runInteractiveWizard();
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
logger.error('Configuration failed', error);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
async function handleFlagBasedConfig(options) {
|
|
46
|
+
// Configure Supabase
|
|
47
|
+
if (options.supabaseUrl && options.supabaseKey) {
|
|
48
|
+
await configManager.setSupabase(options.supabaseUrl, options.supabaseKey);
|
|
49
|
+
logger.success('Supabase configured');
|
|
50
|
+
}
|
|
51
|
+
// Configure AI provider
|
|
52
|
+
if (options.provider && options.apiKey) {
|
|
53
|
+
const provider = options.provider;
|
|
54
|
+
await configManager.setProvider(provider, options.apiKey, options.model);
|
|
55
|
+
logger.success(`${provider} provider configured`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function runInteractiveWizard() {
|
|
59
|
+
console.log(chalk.cyan('\n🔧 OwnKey Configuration Wizard\n'));
|
|
60
|
+
// Step 1: Supabase configuration
|
|
61
|
+
console.log(chalk.bold('Step 1: Supabase Database (Optional)'));
|
|
62
|
+
console.log(chalk.gray('Supabase stores your analysis history and suggestions.'));
|
|
63
|
+
console.log(chalk.gray('You can skip this and run in local-only mode.\n'));
|
|
64
|
+
const { configureSupabase } = await inquirer.prompt([
|
|
65
|
+
{
|
|
66
|
+
type: 'confirm',
|
|
67
|
+
name: 'configureSupabase',
|
|
68
|
+
message: 'Configure Supabase database?',
|
|
69
|
+
default: true,
|
|
70
|
+
},
|
|
71
|
+
]);
|
|
72
|
+
if (configureSupabase) {
|
|
73
|
+
const supabaseAnswers = await inquirer.prompt([
|
|
74
|
+
{
|
|
75
|
+
type: 'input',
|
|
76
|
+
name: 'url',
|
|
77
|
+
message: 'Supabase URL:',
|
|
78
|
+
validate: (input) => {
|
|
79
|
+
if (!input)
|
|
80
|
+
return 'URL is required';
|
|
81
|
+
if (!input.startsWith('postgresql://')) {
|
|
82
|
+
return 'URL should start with postgresql://';
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
type: 'password',
|
|
89
|
+
name: 'key',
|
|
90
|
+
message: 'Supabase Service Role Key:',
|
|
91
|
+
validate: (input) => (input ? true : 'Service role key is required'),
|
|
92
|
+
},
|
|
93
|
+
]);
|
|
94
|
+
await configManager.setSupabase(supabaseAnswers.url, supabaseAnswers.key);
|
|
95
|
+
logger.success('Supabase configured');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
logger.info('Skipping Supabase. You can configure it later.');
|
|
99
|
+
}
|
|
100
|
+
// Step 2: AI Provider configuration
|
|
101
|
+
console.log(chalk.bold('\nStep 2: AI Provider'));
|
|
102
|
+
console.log(chalk.gray('Choose your AI provider for code analysis.\n'));
|
|
103
|
+
const { provider } = await inquirer.prompt([
|
|
104
|
+
{
|
|
105
|
+
type: 'list',
|
|
106
|
+
name: 'provider',
|
|
107
|
+
message: 'Choose AI provider:',
|
|
108
|
+
choices: [
|
|
109
|
+
{ name: 'OpenAI (GPT-4)', value: 'openai' },
|
|
110
|
+
{ name: 'Anthropic (Claude)', value: 'anthropic' },
|
|
111
|
+
{ name: 'Ollama (Local)', value: 'ollama' },
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
]);
|
|
115
|
+
// Get API key (not needed for Ollama)
|
|
116
|
+
if (provider !== 'ollama') {
|
|
117
|
+
const { apiKey } = await inquirer.prompt([
|
|
118
|
+
{
|
|
119
|
+
type: 'password',
|
|
120
|
+
name: 'apiKey',
|
|
121
|
+
message: `${provider === 'openai' ? 'OpenAI' : 'Anthropic'} API Key:`,
|
|
122
|
+
validate: (input) => (input ? true : 'API key is required'),
|
|
123
|
+
},
|
|
124
|
+
]);
|
|
125
|
+
await configManager.setProvider(provider, apiKey);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// For Ollama, just set it as active provider
|
|
129
|
+
const config = await configManager.load();
|
|
130
|
+
config.activeProvider = 'ollama';
|
|
131
|
+
await configManager.save(config);
|
|
132
|
+
logger.success('Ollama configured (using local endpoint)');
|
|
133
|
+
}
|
|
134
|
+
// Step 3: Test connection (optional)
|
|
135
|
+
console.log(chalk.bold('\n✓ Configuration Complete!\n'));
|
|
136
|
+
console.log(chalk.green('You can now use OwnKey to analyze your codebase.\n'));
|
|
137
|
+
console.log(chalk.cyan('Next steps:'));
|
|
138
|
+
console.log(chalk.gray(' 1. ownkey scan <path> - Scan your project'));
|
|
139
|
+
console.log(chalk.gray(' 2. ownkey suggest <path> - Get AI suggestions'));
|
|
140
|
+
console.log(chalk.gray(' 3. ownkey apply <id> - Apply a suggestion\n'));
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,WAAW,SA2ElB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { FileScanner } from '../core/scanner.js';
|
|
6
|
+
import { dbOps } from '../db/operations.js';
|
|
7
|
+
import { dbClient } from '../db/client.js';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
export const scanCommand = new Command('scan')
|
|
10
|
+
.description('Scan a project directory')
|
|
11
|
+
.argument('[path]', 'Path to scan', '.')
|
|
12
|
+
.option('--max-file-size <size>', 'Maximum file size (e.g., 500kb, 1mb)', '500kb')
|
|
13
|
+
.option('--ignore <patterns...>', 'Additional ignore patterns')
|
|
14
|
+
.action(async (path, options) => {
|
|
15
|
+
try {
|
|
16
|
+
const targetPath = resolve(path);
|
|
17
|
+
// Validate path
|
|
18
|
+
if (!existsSync(targetPath)) {
|
|
19
|
+
logger.error(`Path does not exist: ${targetPath}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
logger.info(`Scanning: ${chalk.cyan(targetPath)}`);
|
|
23
|
+
// Parse max file size
|
|
24
|
+
const maxFileSize = parseFileSize(options.maxFileSize);
|
|
25
|
+
// Create scanner
|
|
26
|
+
const scanner = new FileScanner(targetPath, maxFileSize);
|
|
27
|
+
// Scan
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
const result = await scanner.scan();
|
|
30
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
31
|
+
// Display results
|
|
32
|
+
console.log(chalk.bold('\n📊 Scan Results:\n'));
|
|
33
|
+
console.log(` Files found: ${chalk.green(result.files.length)}`);
|
|
34
|
+
console.log(` Total size: ${formatBytes(result.totalSize)}`);
|
|
35
|
+
console.log(` Skipped files: ${result.skippedFiles.length}`);
|
|
36
|
+
console.log(` Duration: ${duration}s\n`);
|
|
37
|
+
if (result.warnings.length > 0) {
|
|
38
|
+
console.log(chalk.yellow(`⚠️ ${result.warnings.length} warnings:`));
|
|
39
|
+
result.warnings.slice(0, 5).forEach((w) => console.log(chalk.gray(` - ${w}`)));
|
|
40
|
+
if (result.warnings.length > 5) {
|
|
41
|
+
console.log(chalk.gray(` ... and ${result.warnings.length - 5} more`));
|
|
42
|
+
}
|
|
43
|
+
console.log();
|
|
44
|
+
}
|
|
45
|
+
// Store in database if connected
|
|
46
|
+
if (dbClient.isConnected()) {
|
|
47
|
+
const projectName = targetPath.split(/[/\\]/).pop() || 'unknown';
|
|
48
|
+
let project = await dbOps.getProjectByPath(targetPath);
|
|
49
|
+
if (!project) {
|
|
50
|
+
project = await dbOps.createProject(projectName, targetPath);
|
|
51
|
+
logger.verbose('Created project record in database');
|
|
52
|
+
}
|
|
53
|
+
if (project) {
|
|
54
|
+
const run = await dbOps.createRun(project.id, `scan ${path}`);
|
|
55
|
+
if (run) {
|
|
56
|
+
await dbOps.updateRunStatus(run.id, 'completed', `Scanned ${result.files.length} files`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
logger.success('Scan complete');
|
|
61
|
+
// Show next steps
|
|
62
|
+
console.log(chalk.cyan('Next step:'));
|
|
63
|
+
console.log(chalk.gray(` ownkey suggest ${path}\n`));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
logger.error('Scan failed', error);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
function parseFileSize(sizeStr) {
|
|
71
|
+
const match = sizeStr.match(/^(\d+(?:\.\d+)?)(kb|mb|gb)?$/i);
|
|
72
|
+
if (!match) {
|
|
73
|
+
throw new Error(`Invalid file size format: ${sizeStr}`);
|
|
74
|
+
}
|
|
75
|
+
const value = parseFloat(match[1]);
|
|
76
|
+
const unit = (match[2] || 'b').toLowerCase();
|
|
77
|
+
switch (unit) {
|
|
78
|
+
case 'b':
|
|
79
|
+
return value;
|
|
80
|
+
case 'kb':
|
|
81
|
+
return value * 1024;
|
|
82
|
+
case 'mb':
|
|
83
|
+
return value * 1024 * 1024;
|
|
84
|
+
case 'gb':
|
|
85
|
+
return value * 1024 * 1024 * 1024;
|
|
86
|
+
default:
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function formatBytes(bytes) {
|
|
91
|
+
if (bytes < 1024)
|
|
92
|
+
return `${bytes} B`;
|
|
93
|
+
if (bytes < 1024 * 1024)
|
|
94
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
95
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,cAAc,SA8BrB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
export const suggestCommand = new Command('suggest')
|
|
7
|
+
.description('Generate AI-powered suggestions for your code')
|
|
8
|
+
.argument('[path]', 'Path to analyze', '.')
|
|
9
|
+
.option('--type <type>', 'Filter by suggestion type (bug, security, performance, etc.)')
|
|
10
|
+
.option('--severity <severity>', 'Minimum severity (critical, high, medium, low, info)')
|
|
11
|
+
.action(async (path) => {
|
|
12
|
+
try {
|
|
13
|
+
const targetPath = resolve(path);
|
|
14
|
+
if (!existsSync(targetPath)) {
|
|
15
|
+
logger.error(`Path does not exist: ${targetPath}`);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
logger.info(`Analyzing: ${chalk.cyan(targetPath)}`);
|
|
19
|
+
// TODO: Implement AI analysis
|
|
20
|
+
// For now, show a placeholder message
|
|
21
|
+
console.log(chalk.yellow('\n⚠️ AI provider integration coming in v0.5.0\n'));
|
|
22
|
+
console.log('This command will:');
|
|
23
|
+
console.log(chalk.gray(' 1. Load project context'));
|
|
24
|
+
console.log(chalk.gray(' 2. Send to AI provider for analysis'));
|
|
25
|
+
console.log(chalk.gray(' 3. Display suggestions'));
|
|
26
|
+
console.log(chalk.gray(' 4. Store in database\n'));
|
|
27
|
+
logger.info('Suggest command placeholder - full implementation coming soon');
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logger.error('Suggest failed', error);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=suggest.js.map
|
|
@@ -0,0 +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,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KAC/C,WAAW,CAAC,+CAA+C,CAAC;KAC5D,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,CAAC;KAC1C,MAAM,CAAC,eAAe,EAAE,8DAA8D,CAAC;KACvF,MAAM,CAAC,uBAAuB,EAAE,sDAAsD,CAAC;KACvF,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC3B,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEpD,8BAA8B;QAC9B,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAEpD,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAc,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Config } from '../types/index.js';
|
|
2
|
+
export declare const DEFAULT_CONFIG: Config;
|
|
3
|
+
export declare const CONFIG_DIR = ".ownkey";
|
|
4
|
+
export declare const CONFIG_FILE = "config.json";
|
|
5
|
+
export declare const KEYS_FILE = "keys.enc";
|
|
6
|
+
export declare const LOGS_DIR = "logs";
|
|
7
|
+
export declare const DEFAULT_EXCLUDES: string[];
|
|
8
|
+
export declare const BINARY_EXTENSIONS: string[];
|
|
9
|
+
export declare const MAX_FILE_SIZE_BYTES: number;
|
|
10
|
+
export declare const BACKUP_EXTENSION = ".ownkey.bak";
|
|
11
|
+
export declare const MAX_BACKUPS_PER_FILE = 3;
|
|
12
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,MAiB5B,CAAC;AAEF,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,QAAQ,SAAS,CAAC;AAE/B,eAAO,MAAM,gBAAgB,UAgB5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,UA8B7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAE9C,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,oBAAoB,IAAI,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export const DEFAULT_CONFIG = {
|
|
2
|
+
providers: {
|
|
3
|
+
openai: {
|
|
4
|
+
model: 'gpt-4-turbo',
|
|
5
|
+
},
|
|
6
|
+
anthropic: {
|
|
7
|
+
model: 'claude-3-sonnet-20240229',
|
|
8
|
+
},
|
|
9
|
+
ollama: {
|
|
10
|
+
endpoint: 'http://localhost:11434',
|
|
11
|
+
model: 'codellama',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
defaults: {
|
|
15
|
+
maxFileSize: '500kb',
|
|
16
|
+
logLevel: 'normal',
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
export const CONFIG_DIR = '.ownkey';
|
|
20
|
+
export const CONFIG_FILE = 'config.json';
|
|
21
|
+
export const KEYS_FILE = 'keys.enc';
|
|
22
|
+
export const LOGS_DIR = 'logs';
|
|
23
|
+
export const DEFAULT_EXCLUDES = [
|
|
24
|
+
'.git',
|
|
25
|
+
'node_modules',
|
|
26
|
+
'dist',
|
|
27
|
+
'build',
|
|
28
|
+
'target',
|
|
29
|
+
'out',
|
|
30
|
+
'vendor',
|
|
31
|
+
'.cache',
|
|
32
|
+
'.next',
|
|
33
|
+
'.nuxt',
|
|
34
|
+
'coverage',
|
|
35
|
+
'.env',
|
|
36
|
+
'*.lock',
|
|
37
|
+
'*.min.js',
|
|
38
|
+
'*.min.css',
|
|
39
|
+
];
|
|
40
|
+
export const BINARY_EXTENSIONS = [
|
|
41
|
+
'.jpg',
|
|
42
|
+
'.jpeg',
|
|
43
|
+
'.png',
|
|
44
|
+
'.gif',
|
|
45
|
+
'.bmp',
|
|
46
|
+
'.ico',
|
|
47
|
+
'.svg',
|
|
48
|
+
'.webp',
|
|
49
|
+
'.mp4',
|
|
50
|
+
'.avi',
|
|
51
|
+
'.mov',
|
|
52
|
+
'.mp3',
|
|
53
|
+
'.wav',
|
|
54
|
+
'.zip',
|
|
55
|
+
'.tar',
|
|
56
|
+
'.gz',
|
|
57
|
+
'.rar',
|
|
58
|
+
'.7z',
|
|
59
|
+
'.exe',
|
|
60
|
+
'.dll',
|
|
61
|
+
'.so',
|
|
62
|
+
'.dylib',
|
|
63
|
+
'.pdf',
|
|
64
|
+
'.doc',
|
|
65
|
+
'.docx',
|
|
66
|
+
'.xls',
|
|
67
|
+
'.xlsx',
|
|
68
|
+
'.ppt',
|
|
69
|
+
'.pptx',
|
|
70
|
+
];
|
|
71
|
+
export const MAX_FILE_SIZE_BYTES = 500 * 1024; // 500KB
|
|
72
|
+
export const BACKUP_EXTENSION = '.ownkey.bak';
|
|
73
|
+
export const MAX_BACKUPS_PER_FILE = 3;
|
|
74
|
+
//# sourceMappingURL=defaults.js.map
|