@neurcode-ai/cli 0.1.0 → 0.1.2
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 +33 -0
- package/dist/api-client.d.ts +169 -2
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +271 -15
- package/dist/api-client.js.map +1 -1
- package/dist/commands/apply.d.ts +9 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +186 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +87 -4
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/config.d.ts +16 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +134 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/plan.d.ts +6 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +204 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/refactor.d.ts +3 -0
- package/dist/commands/refactor.d.ts.map +1 -0
- package/dist/commands/refactor.js +166 -0
- package/dist/commands/refactor.js.map +1 -0
- package/dist/commands/revert.d.ts +23 -0
- package/dist/commands/revert.d.ts.map +1 -0
- package/dist/commands/revert.js +234 -0
- package/dist/commands/revert.js.map +1 -0
- package/dist/commands/security.d.ts +3 -0
- package/dist/commands/security.d.ts.map +1 -0
- package/dist/commands/security.js +167 -0
- package/dist/commands/security.js.map +1 -0
- package/dist/config.d.ts +17 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +88 -21
- package/dist/config.js.map +1 -1
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
|
@@ -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 @@
|
|
|
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
|
|
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
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
-
*
|
|
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
|
-
//
|
|
12
|
-
|
|
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
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|