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.
Files changed (81) hide show
  1. package/.prettierrc +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +175 -0
  4. package/dist/commands/apply.d.ts +3 -0
  5. package/dist/commands/apply.d.ts.map +1 -0
  6. package/dist/commands/apply.js +26 -0
  7. package/dist/commands/apply.js.map +1 -0
  8. package/dist/commands/config.d.ts +3 -0
  9. package/dist/commands/config.d.ts.map +1 -0
  10. package/dist/commands/config.js +142 -0
  11. package/dist/commands/config.js.map +1 -0
  12. package/dist/commands/scan.d.ts +3 -0
  13. package/dist/commands/scan.d.ts.map +1 -0
  14. package/dist/commands/scan.js +97 -0
  15. package/dist/commands/scan.js.map +1 -0
  16. package/dist/commands/suggest.d.ts +3 -0
  17. package/dist/commands/suggest.d.ts.map +1 -0
  18. package/dist/commands/suggest.js +34 -0
  19. package/dist/commands/suggest.js.map +1 -0
  20. package/dist/config/defaults.d.ts +12 -0
  21. package/dist/config/defaults.d.ts.map +1 -0
  22. package/dist/config/defaults.js +74 -0
  23. package/dist/config/defaults.js.map +1 -0
  24. package/dist/config/keychain.d.ts +14 -0
  25. package/dist/config/keychain.d.ts.map +1 -0
  26. package/dist/config/keychain.js +112 -0
  27. package/dist/config/keychain.js.map +1 -0
  28. package/dist/config/manager.d.ts +21 -0
  29. package/dist/config/manager.d.ts.map +1 -0
  30. package/dist/config/manager.js +144 -0
  31. package/dist/config/manager.js.map +1 -0
  32. package/dist/core/scanner.d.ts +17 -0
  33. package/dist/core/scanner.d.ts.map +1 -0
  34. package/dist/core/scanner.js +150 -0
  35. package/dist/core/scanner.js.map +1 -0
  36. package/dist/db/client.d.ts +15 -0
  37. package/dist/db/client.d.ts.map +1 -0
  38. package/dist/db/client.js +130 -0
  39. package/dist/db/client.js.map +1 -0
  40. package/dist/db/operations.d.ts +14 -0
  41. package/dist/db/operations.d.ts.map +1 -0
  42. package/dist/db/operations.js +175 -0
  43. package/dist/db/operations.js.map +1 -0
  44. package/dist/db/schema.d.ts +683 -0
  45. package/dist/db/schema.d.ts.map +1 -0
  46. package/dist/db/schema.js +107 -0
  47. package/dist/db/schema.js.map +1 -0
  48. package/dist/index.d.ts +3 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +61 -2
  51. package/dist/index.js.map +1 -0
  52. package/dist/types/index.d.ts +138 -0
  53. package/dist/types/index.d.ts.map +1 -0
  54. package/dist/types/index.js +37 -0
  55. package/dist/types/index.js.map +1 -0
  56. package/dist/utils/encryption.d.ts +6 -0
  57. package/dist/utils/encryption.d.ts.map +1 -0
  58. package/dist/utils/encryption.js +39 -0
  59. package/dist/utils/encryption.js.map +1 -0
  60. package/dist/utils/logger.d.ts +25 -0
  61. package/dist/utils/logger.d.ts.map +1 -0
  62. package/dist/utils/logger.js +97 -0
  63. package/dist/utils/logger.js.map +1 -0
  64. package/package.json +56 -29
  65. package/src/commands/apply.ts +27 -0
  66. package/src/commands/config.ts +154 -0
  67. package/src/commands/scan.ts +114 -0
  68. package/src/commands/suggest.ts +37 -0
  69. package/src/config/defaults.ts +80 -0
  70. package/src/config/keychain.ts +125 -0
  71. package/src/config/manager.ts +166 -0
  72. package/src/core/scanner.ts +174 -0
  73. package/src/db/client.ts +151 -0
  74. package/src/db/migrations/001_init.sql +80 -0
  75. package/src/db/operations.ts +217 -0
  76. package/src/db/schema.ts +118 -0
  77. package/src/index.ts +74 -0
  78. package/src/types/index.ts +198 -0
  79. package/src/utils/encryption.ts +54 -0
  80. package/src/utils/logger.ts +111 -0
  81. package/tsconfig.json +33 -0
package/.prettierrc ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "semi": true,
3
+ "trailingComma": "es5",
4
+ "singleQuote": true,
5
+ "printWidth": 100,
6
+ "tabWidth": 2,
7
+ "useTabs": false,
8
+ "arrowParens": "always"
9
+ }
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
+ [![npm version](https://badge.fury.io/js/ownkey.svg)](https://www.npmjs.com/package/ownkey)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const applyCommand: Command;
3
+ //# sourceMappingURL=apply.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const configCommand: Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const scanCommand: Command;
3
+ //# sourceMappingURL=scan.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const suggestCommand: Command;
3
+ //# sourceMappingURL=suggest.d.ts.map
@@ -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