@neurcode-ai/cli 0.1.1 → 0.1.3

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 (39) hide show
  1. package/README.md +33 -0
  2. package/dist/api-client.d.ts +169 -2
  3. package/dist/api-client.d.ts.map +1 -1
  4. package/dist/api-client.js +271 -15
  5. package/dist/api-client.js.map +1 -1
  6. package/dist/commands/apply.d.ts +9 -0
  7. package/dist/commands/apply.d.ts.map +1 -0
  8. package/dist/commands/apply.js +186 -0
  9. package/dist/commands/apply.js.map +1 -0
  10. package/dist/commands/check.d.ts.map +1 -1
  11. package/dist/commands/check.js +87 -4
  12. package/dist/commands/check.js.map +1 -1
  13. package/dist/commands/config.d.ts +16 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +134 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/plan.d.ts +6 -0
  18. package/dist/commands/plan.d.ts.map +1 -0
  19. package/dist/commands/plan.js +204 -0
  20. package/dist/commands/plan.js.map +1 -0
  21. package/dist/commands/refactor.d.ts +3 -0
  22. package/dist/commands/refactor.d.ts.map +1 -0
  23. package/dist/commands/refactor.js +166 -0
  24. package/dist/commands/refactor.js.map +1 -0
  25. package/dist/commands/revert.d.ts +23 -0
  26. package/dist/commands/revert.d.ts.map +1 -0
  27. package/dist/commands/revert.js +234 -0
  28. package/dist/commands/revert.js.map +1 -0
  29. package/dist/commands/security.d.ts +3 -0
  30. package/dist/commands/security.d.ts.map +1 -0
  31. package/dist/commands/security.js +167 -0
  32. package/dist/commands/security.js.map +1 -0
  33. package/dist/config.d.ts +17 -1
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +88 -21
  36. package/dist/config.js.map +1 -1
  37. package/dist/index.js +96 -1
  38. package/dist/index.js.map +1 -1
  39. package/package.json +2 -1
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ /**
3
+ * Revert Command
4
+ *
5
+ * Reverts a file to a specific version from Neurcode's version history.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.revertCommand = revertCommand;
9
+ exports.listVersionsCommand = listVersionsCommand;
10
+ const fs_1 = require("fs");
11
+ const path_1 = require("path");
12
+ const fs_2 = require("fs");
13
+ const api_client_1 = require("../api-client");
14
+ const config_1 = require("../config");
15
+ async function revertCommand(filePath, options) {
16
+ try {
17
+ // Validate file path
18
+ if (!filePath || filePath.trim() === '') {
19
+ console.error('❌ Error: filePath is required');
20
+ console.log('\nUsage: neurcode revert <filePath> --to-version <version>');
21
+ process.exit(1);
22
+ }
23
+ // Validate version
24
+ if (!options.toVersion || options.toVersion < 1) {
25
+ console.error('❌ Error: --to-version must be >= 1');
26
+ process.exit(1);
27
+ }
28
+ // Load config
29
+ const config = (0, config_1.loadConfig)();
30
+ // API URL is automatically set to production - no need to check
31
+ if (!config.apiKey) {
32
+ console.error('❌ Error: API Key not configured');
33
+ console.log('Set NEURCODE_API_KEY environment variable or add to neurcode.config.json');
34
+ process.exit(1);
35
+ }
36
+ // Resolve file path (support relative and absolute paths)
37
+ const resolvedPath = (0, path_1.resolve)(process.cwd(), filePath);
38
+ // Check if file exists (unless it's a new file being reverted)
39
+ if (!(0, fs_2.existsSync)(resolvedPath) && !options.force) {
40
+ console.error(`❌ Error: File not found: ${resolvedPath}`);
41
+ console.log('Use --force to revert even if file does not exist locally');
42
+ process.exit(1);
43
+ }
44
+ // Initialize API client
45
+ const client = new api_client_1.ApiClient(config);
46
+ const projectId = options.projectId || config.projectId;
47
+ console.log(`\n🔄 Reverting ${filePath} to version ${options.toVersion}...`);
48
+ if (options.dryRun) {
49
+ console.log('⚠️ DRY RUN MODE - No files will be modified\n');
50
+ }
51
+ // Fetch version from API
52
+ let versionData;
53
+ try {
54
+ versionData = await client.getFileVersion(filePath, options.toVersion, projectId);
55
+ }
56
+ catch (error) {
57
+ if (error instanceof Error) {
58
+ if (error.message.includes('404') || error.message.includes('not found')) {
59
+ console.error(`❌ Error: Version ${options.toVersion} not found for file ${filePath}`);
60
+ console.log('Use "neurcode revert versions <filePath>" to see available versions');
61
+ }
62
+ else {
63
+ console.error(`❌ Error fetching version: ${error.message}`);
64
+ }
65
+ }
66
+ else {
67
+ console.error('❌ Error fetching version:', error);
68
+ }
69
+ process.exit(1);
70
+ }
71
+ const { version, fileContent, lineInfo } = versionData;
72
+ // For getFileVersion, we don't have revertInstructions, so we'll create a simple one
73
+ const revertInstructions = {
74
+ method: 'full_replace',
75
+ filePath: filePath,
76
+ fromVersion: 0, // Will be determined when actually reverting
77
+ toVersion: options.toVersion,
78
+ };
79
+ // Display version info
80
+ console.log(`\n📋 Version Information:`);
81
+ console.log(` Version: ${version.versionNumber}`);
82
+ console.log(` Created: ${new Date(version.createdAt).toLocaleString()}`);
83
+ console.log(` Lines: ${lineInfo.totalLines}`);
84
+ console.log(` Change Type: ${version.changeType || 'N/A'}`);
85
+ if (version.sessionId) {
86
+ console.log(` Session: ${version.sessionId}`);
87
+ }
88
+ // Show what will be reverted
89
+ if ((0, fs_2.existsSync)(resolvedPath)) {
90
+ const currentContent = await fs_1.promises.readFile(resolvedPath, 'utf-8');
91
+ const currentLines = currentContent.split('\n').length;
92
+ const diff = lineInfo.totalLines - currentLines;
93
+ console.log(`\n📊 Current State:`);
94
+ console.log(` Current Lines: ${currentLines}`);
95
+ console.log(` Target Lines: ${lineInfo.totalLines}`);
96
+ if (diff !== 0) {
97
+ console.log(` Difference: ${diff > 0 ? '+' : ''}${diff} lines`);
98
+ }
99
+ else {
100
+ console.log(` Difference: No line count change`);
101
+ }
102
+ }
103
+ else {
104
+ console.log(`\n📊 Current State:`);
105
+ console.log(` File does not exist locally (will be created)`);
106
+ }
107
+ // Dry run - just show what would happen
108
+ if (options.dryRun) {
109
+ console.log(`\n📝 File Content Preview (first 50 lines):`);
110
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
111
+ const previewLines = fileContent.split('\n').slice(0, 50);
112
+ previewLines.forEach((line, idx) => {
113
+ console.log(`${(idx + 1).toString().padStart(4, ' ')} | ${line}`);
114
+ });
115
+ if (fileContent.split('\n').length > 50) {
116
+ console.log(` ... (${fileContent.split('\n').length - 50} more lines)`);
117
+ }
118
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
119
+ console.log('\n✅ Dry run complete - no files were modified');
120
+ console.log('Remove --dry-run to actually revert the file');
121
+ process.exit(0);
122
+ }
123
+ // Create backup if requested
124
+ let backupPath = null;
125
+ if (options.backup && (0, fs_2.existsSync)(resolvedPath)) {
126
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
127
+ backupPath = `${resolvedPath}.backup.${timestamp}`;
128
+ const currentContent = await fs_1.promises.readFile(resolvedPath, 'utf-8');
129
+ await fs_1.promises.writeFile(backupPath, currentContent, 'utf-8');
130
+ console.log(`\n💾 Backup created: ${backupPath}`);
131
+ }
132
+ // Confirm before proceeding (unless --force)
133
+ if (!options.force) {
134
+ console.log(`\n⚠️ This will overwrite the current file: ${resolvedPath}`);
135
+ console.log('Press Ctrl+C to cancel, or wait 3 seconds to continue...');
136
+ await new Promise(resolve => setTimeout(resolve, 3000));
137
+ }
138
+ // Ensure directory exists
139
+ const fileDir = (0, path_1.dirname)(resolvedPath);
140
+ if (!(0, fs_2.existsSync)(fileDir)) {
141
+ await fs_1.promises.mkdir(fileDir, { recursive: true });
142
+ console.log(`📁 Created directory: ${fileDir}`);
143
+ }
144
+ // Write reverted content to file
145
+ try {
146
+ await fs_1.promises.writeFile(resolvedPath, fileContent, 'utf-8');
147
+ console.log(`\n✅ Successfully reverted ${filePath} to version ${options.toVersion}`);
148
+ if (backupPath) {
149
+ console.log(`💾 Original file backed up to: ${backupPath}`);
150
+ }
151
+ // Call revert API to record the revert in database
152
+ try {
153
+ await client.revertFile(filePath, options.toVersion, projectId, options.reason);
154
+ console.log(`📝 Revert recorded in Neurcode database`);
155
+ }
156
+ catch (apiError) {
157
+ console.warn(`⚠️ Warning: File reverted locally but failed to record in database:`);
158
+ if (apiError instanceof Error) {
159
+ console.warn(` ${apiError.message}`);
160
+ }
161
+ // Don't fail the command if API call fails - file is already reverted
162
+ }
163
+ console.log(`\n📊 Summary:`);
164
+ console.log(` File: ${resolvedPath}`);
165
+ console.log(` Version: ${options.toVersion}`);
166
+ console.log(` Lines: ${lineInfo.totalLines}`);
167
+ console.log(` Method: ${revertInstructions.method}`);
168
+ }
169
+ catch (writeError) {
170
+ console.error(`\n❌ Error writing file: ${writeError instanceof Error ? writeError.message : writeError}`);
171
+ // Restore backup if write failed and backup exists
172
+ if (backupPath && (0, fs_2.existsSync)(backupPath)) {
173
+ try {
174
+ const backupContent = await fs_1.promises.readFile(backupPath, 'utf-8');
175
+ await fs_1.promises.writeFile(resolvedPath, backupContent, 'utf-8');
176
+ console.log(`✅ Restored from backup: ${backupPath}`);
177
+ }
178
+ catch (restoreError) {
179
+ console.error(`❌ Failed to restore from backup: ${restoreError instanceof Error ? restoreError.message : restoreError}`);
180
+ }
181
+ }
182
+ process.exit(1);
183
+ }
184
+ }
185
+ catch (error) {
186
+ console.error('\n❌ Unexpected error:', error instanceof Error ? error.message : error);
187
+ if (error instanceof Error && error.stack) {
188
+ console.error('\nStack trace:', error.stack);
189
+ }
190
+ process.exit(1);
191
+ }
192
+ }
193
+ /**
194
+ * List available versions for a file
195
+ */
196
+ async function listVersionsCommand(filePath, options) {
197
+ try {
198
+ if (!filePath || filePath.trim() === '') {
199
+ console.error('❌ Error: filePath is required');
200
+ console.log('\nUsage: neurcode revert versions <filePath>');
201
+ process.exit(1);
202
+ }
203
+ const config = (0, config_1.loadConfig)();
204
+ // API URL is automatically set to production - no need to check
205
+ if (!config.apiKey) {
206
+ console.error('❌ Error: API Key must be configured');
207
+ process.exit(1);
208
+ }
209
+ const client = new api_client_1.ApiClient(config);
210
+ const projectId = options.projectId || config.projectId;
211
+ const limit = options.limit || 50;
212
+ console.log(`\n📋 Fetching versions for: ${filePath}\n`);
213
+ const versions = await client.getFileVersions(filePath, projectId, limit);
214
+ if (versions.length === 0) {
215
+ console.log('No versions found for this file.');
216
+ process.exit(0);
217
+ }
218
+ console.log(`Found ${versions.length} version(s):\n`);
219
+ console.log('Version | Lines | Type | Created');
220
+ console.log('────────┼───────┼───────────┼─────────────────────');
221
+ versions.forEach(version => {
222
+ const lines = version.fileContent.split('\n').length;
223
+ const type = (version.changeType || 'N/A').padEnd(9);
224
+ const date = new Date(version.createdAt).toLocaleString();
225
+ console.log(`${version.versionNumber.toString().padStart(7)} | ${lines.toString().padStart(5)} | ${type} | ${date}`);
226
+ });
227
+ console.log(`\n💡 Use "neurcode revert ${filePath} --to-version <version>" to revert to a specific version`);
228
+ }
229
+ catch (error) {
230
+ console.error('\n❌ Error:', error instanceof Error ? error.message : error);
231
+ process.exit(1);
232
+ }
233
+ }
234
+ //# sourceMappingURL=revert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revert.js","sourceRoot":"","sources":["../../src/commands/revert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function securityCommand(program: Command): void;
3
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/commands/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqItD"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.securityCommand = securityCommand;
37
+ const api_client_1 = require("../api-client");
38
+ const config_1 = require("../config");
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ function securityCommand(program) {
42
+ program
43
+ .command('security')
44
+ .description('Analyze code for security vulnerabilities')
45
+ .option('--diff <diff>', 'Git diff string to analyze')
46
+ .option('--diff-file <file>', 'Path to file containing git diff')
47
+ .option('--staged', 'Analyze staged changes (uses git diff --cached)')
48
+ .option('--project-type <type>', 'Project type (e.g., "web", "api", "mobile")')
49
+ .option('--json', 'Output results as JSON')
50
+ .action(async (options) => {
51
+ try {
52
+ let diffText = '';
53
+ // Get diff from various sources
54
+ if (options.diff) {
55
+ diffText = options.diff;
56
+ }
57
+ else if (options.diffFile) {
58
+ const diffPath = path.resolve(options.diffFile);
59
+ if (!fs.existsSync(diffPath)) {
60
+ console.error(`❌ Error: Diff file not found: ${diffPath}`);
61
+ process.exit(1);
62
+ }
63
+ diffText = fs.readFileSync(diffPath, 'utf-8');
64
+ }
65
+ else if (options.staged) {
66
+ const { execSync } = require('child_process');
67
+ try {
68
+ diffText = execSync('git diff --cached', { encoding: 'utf-8' });
69
+ }
70
+ catch (error) {
71
+ console.error('❌ Error: Not a git repository or no staged changes');
72
+ process.exit(1);
73
+ }
74
+ }
75
+ else {
76
+ // Try to get diff from git
77
+ const { execSync } = require('child_process');
78
+ try {
79
+ diffText = execSync('git diff HEAD', { encoding: 'utf-8' });
80
+ if (!diffText.trim()) {
81
+ console.error('❌ Error: No changes found. Use --staged for staged changes or provide --diff');
82
+ process.exit(1);
83
+ }
84
+ }
85
+ catch (error) {
86
+ console.error('❌ Error: Not a git repository. Please provide --diff or --diff-file');
87
+ process.exit(1);
88
+ }
89
+ }
90
+ if (!diffText.trim()) {
91
+ console.error('❌ Error: No diff content to analyze');
92
+ process.exit(1);
93
+ }
94
+ // Initialize API client
95
+ const config = (0, config_1.loadConfig)();
96
+ const client = new api_client_1.ApiClient(config);
97
+ if (!options.json) {
98
+ console.log('\n🔒 Analyzing code for security vulnerabilities...');
99
+ }
100
+ // Call security analysis API
101
+ const response = await client.analyzeSecurity(diffText, options.projectType);
102
+ const { analysis } = response;
103
+ if (options.json) {
104
+ console.log(JSON.stringify(response, null, 2));
105
+ process.exit(0);
106
+ }
107
+ // Display results
108
+ console.log('\n🔒 Security Analysis Results:');
109
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
110
+ // Summary
111
+ console.log(`\n📊 Summary:`);
112
+ const severityColors = {
113
+ CRITICAL: '🔴',
114
+ HIGH: '🟠',
115
+ MEDIUM: '🟡',
116
+ LOW: '🟢',
117
+ };
118
+ console.log(` ${severityColors.CRITICAL} Critical: ${analysis.summary.critical}`);
119
+ console.log(` ${severityColors.HIGH} High: ${analysis.summary.high}`);
120
+ console.log(` ${severityColors.MEDIUM} Medium: ${analysis.summary.medium}`);
121
+ console.log(` ${severityColors.LOW} Low: ${analysis.summary.low}`);
122
+ console.log(` Total Issues: ${analysis.summary.total}`);
123
+ console.log(`\n⚠️ Overall Risk: ${severityColors[analysis.overallRisk] || '⚠️'} ${analysis.overallRisk}`);
124
+ console.log(` Recommendation: ${analysis.recommendation.toUpperCase()}`);
125
+ // Issues
126
+ if (analysis.issues.length > 0) {
127
+ console.log(`\n🚨 Security Issues:`);
128
+ analysis.issues.forEach((issue, i) => {
129
+ console.log(`\n ${i + 1}. ${severityColors[issue.severity] || '⚠️'} ${issue.severity} - ${issue.type}`);
130
+ console.log(` File: ${issue.file}`);
131
+ console.log(` Lines: ${issue.lines[0]}-${issue.lines[1]}`);
132
+ console.log(` Description: ${issue.description}`);
133
+ if (issue.exploitation) {
134
+ console.log(` Exploitation: ${issue.exploitation}`);
135
+ }
136
+ if (issue.fix) {
137
+ console.log(` Fix: ${issue.fix}`);
138
+ }
139
+ if (issue.cwe) {
140
+ console.log(` CWE: ${issue.cwe}`);
141
+ }
142
+ console.log(` Code:`);
143
+ const codeLines = (issue.code || '').split('\n');
144
+ console.log(` ${codeLines.map((line) => ` ${line}`).join('\n')}`);
145
+ });
146
+ }
147
+ else {
148
+ console.log(`\n✅ No security issues found!`);
149
+ }
150
+ // Exit code based on recommendation
151
+ if (analysis.recommendation === 'block') {
152
+ process.exit(2);
153
+ }
154
+ else if (analysis.recommendation === 'warn') {
155
+ process.exit(1);
156
+ }
157
+ else {
158
+ process.exit(0);
159
+ }
160
+ }
161
+ catch (error) {
162
+ console.error('\n❌ Error:', error instanceof Error ? error.message : error);
163
+ process.exit(1);
164
+ }
165
+ });
166
+ }
167
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/commands/security.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,10 +1,26 @@
1
+ /**
2
+ * Default production API URL
3
+ * Users don't need to configure this - it's automatic
4
+ */
5
+ export declare const DEFAULT_API_URL = "https://api.neurcode.com";
1
6
  export interface NeurcodeConfig {
2
7
  apiUrl?: string;
3
8
  apiKey?: string;
4
9
  projectId?: string;
5
10
  }
6
11
  /**
7
- * Load configuration from neurcode.config.json or environment variables
12
+ * Load configuration with priority:
13
+ * 1. Environment variables (highest priority - best for CI/CD)
14
+ * 2. Local config file (./neurcode.config.json)
15
+ * 3. Global config file (~/neurcode.config.json)
8
16
  */
9
17
  export declare function loadConfig(): NeurcodeConfig;
18
+ /**
19
+ * Get API key with helpful error message if not found
20
+ */
21
+ export declare function getApiKey(): string | null;
22
+ /**
23
+ * Require API key - throws helpful error if not found
24
+ */
25
+ export declare function requireApiKey(): string;
10
26
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAmC3C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAmE3C;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAQzC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAYtC"}
package/dist/config.js CHANGED
@@ -1,33 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_API_URL = void 0;
3
4
  exports.loadConfig = loadConfig;
5
+ exports.getApiKey = getApiKey;
6
+ exports.requireApiKey = requireApiKey;
4
7
  const fs_1 = require("fs");
5
8
  const path_1 = require("path");
6
9
  /**
7
- * Load configuration from neurcode.config.json or environment variables
10
+ * Default production API URL
11
+ * Users don't need to configure this - it's automatic
12
+ */
13
+ exports.DEFAULT_API_URL = 'https://api.neurcode.com';
14
+ /**
15
+ * Load configuration with priority:
16
+ * 1. Environment variables (highest priority - best for CI/CD)
17
+ * 2. Local config file (./neurcode.config.json)
18
+ * 3. Global config file (~/neurcode.config.json)
8
19
  */
9
20
  function loadConfig() {
10
21
  const config = {};
11
- // Try to load from config file
12
- const configPaths = [
13
- (0, path_1.join)(process.cwd(), 'neurcode.config.json'),
14
- (0, path_1.join)(process.cwd(), '.neurcode.json'),
15
- (0, path_1.join)(process.env.HOME || '', '.neurcode.json')
16
- ];
17
- for (const configPath of configPaths) {
18
- if ((0, fs_1.existsSync)(configPath)) {
19
- try {
20
- const fileContent = (0, fs_1.readFileSync)(configPath, 'utf-8');
21
- const fileConfig = JSON.parse(fileContent);
22
- Object.assign(config, fileConfig);
23
- break;
24
- }
25
- catch (error) {
26
- // Ignore parse errors, fall through to env vars
27
- }
28
- }
29
- }
30
- // Override with environment variables
22
+ // Priority 1: Environment variables (highest priority)
23
+ // These override everything - perfect for CI/CD and tests
31
24
  if (process.env.NEURCODE_API_URL) {
32
25
  config.apiUrl = process.env.NEURCODE_API_URL;
33
26
  }
@@ -37,6 +30,80 @@ function loadConfig() {
37
30
  if (process.env.NEURCODE_PROJECT_ID) {
38
31
  config.projectId = process.env.NEURCODE_PROJECT_ID;
39
32
  }
33
+ // Priority 2: Local config file (project-specific)
34
+ const localConfigPath = (0, path_1.join)(process.cwd(), 'neurcode.config.json');
35
+ if ((0, fs_1.existsSync)(localConfigPath)) {
36
+ try {
37
+ const fileContent = (0, fs_1.readFileSync)(localConfigPath, 'utf-8');
38
+ const fileConfig = JSON.parse(fileContent);
39
+ // Only use file config if not already set by env vars
40
+ if (!config.apiUrl && fileConfig.apiUrl) {
41
+ config.apiUrl = fileConfig.apiUrl;
42
+ }
43
+ if (!config.apiKey && fileConfig.apiKey) {
44
+ config.apiKey = fileConfig.apiKey;
45
+ }
46
+ if (!config.projectId && fileConfig.projectId) {
47
+ config.projectId = fileConfig.projectId;
48
+ }
49
+ }
50
+ catch (error) {
51
+ // Ignore parse errors, continue to global config
52
+ }
53
+ }
54
+ // Priority 3: Global config file (user home directory)
55
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
56
+ if (homeDir) {
57
+ const globalConfigPath = (0, path_1.join)(homeDir, 'neurcode.config.json');
58
+ if ((0, fs_1.existsSync)(globalConfigPath)) {
59
+ try {
60
+ const fileContent = (0, fs_1.readFileSync)(globalConfigPath, 'utf-8');
61
+ const fileConfig = JSON.parse(fileContent);
62
+ // Only use file config if not already set by env vars or local config
63
+ if (!config.apiUrl && fileConfig.apiUrl) {
64
+ config.apiUrl = fileConfig.apiUrl;
65
+ }
66
+ if (!config.apiKey && fileConfig.apiKey) {
67
+ config.apiKey = fileConfig.apiKey;
68
+ }
69
+ if (!config.projectId && fileConfig.projectId) {
70
+ config.projectId = fileConfig.projectId;
71
+ }
72
+ }
73
+ catch (error) {
74
+ // Ignore parse errors
75
+ }
76
+ }
77
+ }
78
+ // Set default API URL if not specified
79
+ // Priority: Env Var (for devs) > Config JSON (for enterprise) > Default (for everyone)
80
+ if (!config.apiUrl) {
81
+ config.apiUrl = exports.DEFAULT_API_URL;
82
+ }
40
83
  return config;
41
84
  }
85
+ /**
86
+ * Get API key with helpful error message if not found
87
+ */
88
+ function getApiKey() {
89
+ const config = loadConfig();
90
+ if (!config.apiKey) {
91
+ return null;
92
+ }
93
+ return config.apiKey;
94
+ }
95
+ /**
96
+ * Require API key - throws helpful error if not found
97
+ */
98
+ function requireApiKey() {
99
+ const apiKey = getApiKey();
100
+ if (!apiKey) {
101
+ console.error('\n❌ No API Key found.');
102
+ console.log('\n📝 To set up your API key, run:');
103
+ console.log(' neurcode config --key <your_api_key>');
104
+ console.log('\n💡 Get your API key from: https://dashboard.neurcode.com/api-keys\n');
105
+ process.exit(1);
106
+ }
107
+ return apiKey;
108
+ }
42
109
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAYA,gCAmCC;AA/CD,2BAA8C;AAC9C,+BAA4B;AAQ5B;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,+BAA+B;IAC/B,MAAM,WAAW,GAAG;QAClB,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC;QAC3C,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;QACrC,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,gBAAgB,CAAC;KAC/C,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,IAAA,iBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAClC,MAAM;YACR,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,gDAAgD;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}