@kairoaisec/cli 0.1.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/CHANGELOG.md +47 -0
- package/LICENSE +21 -0
- package/README.md +161 -0
- package/dist/api/client.d.ts +128 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +153 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +42 -0
- package/dist/api/index.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +72 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +13 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +3 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +174 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +3 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +56 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/whoami.d.ts +3 -0
- package/dist/commands/auth/whoami.d.ts.map +1 -0
- package/dist/commands/auth/whoami.js +110 -0
- package/dist/commands/auth/whoami.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 +102 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/project/create.d.ts +3 -0
- package/dist/commands/project/create.d.ts.map +1 -0
- package/dist/commands/project/create.js +146 -0
- package/dist/commands/project/create.js.map +1 -0
- package/dist/commands/project/index.d.ts +3 -0
- package/dist/commands/project/index.d.ts.map +1 -0
- package/dist/commands/project/index.js +14 -0
- package/dist/commands/project/index.js.map +1 -0
- package/dist/commands/project/list.d.ts +3 -0
- package/dist/commands/project/list.d.ts.map +1 -0
- package/dist/commands/project/list.js +116 -0
- package/dist/commands/project/list.js.map +1 -0
- package/dist/commands/project/select.d.ts +3 -0
- package/dist/commands/project/select.d.ts.map +1 -0
- package/dist/commands/project/select.js +147 -0
- package/dist/commands/project/select.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 +401 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/config/index.d.ts +44 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +237 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/file-discovery.d.ts +17 -0
- package/dist/lib/file-discovery.d.ts.map +1 -0
- package/dist/lib/file-discovery.js +218 -0
- package/dist/lib/file-discovery.js.map +1 -0
- package/dist/lib/patterns.d.ts +18 -0
- package/dist/lib/patterns.d.ts.map +1 -0
- package/dist/lib/patterns.js +187 -0
- package/dist/lib/patterns.js.map +1 -0
- package/dist/lib/sarif.d.ts +61 -0
- package/dist/lib/sarif.d.ts.map +1 -0
- package/dist/lib/sarif.js +169 -0
- package/dist/lib/sarif.js.map +1 -0
- package/dist/lib/scanner.d.ts +43 -0
- package/dist/lib/scanner.d.ts.map +1 -0
- package/dist/lib/scanner.js +163 -0
- package/dist/lib/scanner.js.map +1 -0
- package/dist/lib/slither.d.ts +112 -0
- package/dist/lib/slither.d.ts.map +1 -0
- package/dist/lib/slither.js +463 -0
- package/dist/lib/slither.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +44 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/spinner.d.ts +15 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +55 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/validation.d.ts +12 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +79 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.configManager = exports.ConfigManager = void 0;
|
|
7
|
+
const keytar_1 = __importDefault(require("keytar"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
// Configuration defaults
|
|
12
|
+
const defaults = {
|
|
13
|
+
apiUrl: 'https://kairoaisec.com',
|
|
14
|
+
};
|
|
15
|
+
// Configuration store
|
|
16
|
+
let configData = { ...defaults };
|
|
17
|
+
// Keytar service name for secure token storage
|
|
18
|
+
const KEYTAR_SERVICE = 'kairo-cli';
|
|
19
|
+
const TOKEN_KEY = 'auth-token';
|
|
20
|
+
const API_KEY_KEY = 'api-key';
|
|
21
|
+
class ConfigManager {
|
|
22
|
+
static instance;
|
|
23
|
+
constructor() {
|
|
24
|
+
this.loadConfig();
|
|
25
|
+
}
|
|
26
|
+
static getInstance() {
|
|
27
|
+
if (!ConfigManager.instance) {
|
|
28
|
+
ConfigManager.instance = new ConfigManager();
|
|
29
|
+
}
|
|
30
|
+
return ConfigManager.instance;
|
|
31
|
+
}
|
|
32
|
+
// Configuration management
|
|
33
|
+
get(key) {
|
|
34
|
+
return configData[key];
|
|
35
|
+
}
|
|
36
|
+
set(key, value) {
|
|
37
|
+
configData[key] = value;
|
|
38
|
+
this.saveConfig();
|
|
39
|
+
}
|
|
40
|
+
getAll() {
|
|
41
|
+
return { ...configData };
|
|
42
|
+
}
|
|
43
|
+
clear() {
|
|
44
|
+
configData = { ...defaults };
|
|
45
|
+
this.saveConfig();
|
|
46
|
+
}
|
|
47
|
+
saveConfig() {
|
|
48
|
+
try {
|
|
49
|
+
const configPath = this.getConfigPath();
|
|
50
|
+
const configDir = path_1.default.dirname(configPath);
|
|
51
|
+
if (!(0, fs_1.existsSync)(configDir)) {
|
|
52
|
+
(0, fs_1.mkdirSync)(configDir, { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify(configData, null, 2));
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error('Failed to save config:', error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
loadConfig() {
|
|
61
|
+
try {
|
|
62
|
+
const configPath = this.getConfigPath();
|
|
63
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
64
|
+
const data = (0, fs_1.readFileSync)(configPath, 'utf8');
|
|
65
|
+
configData = { ...defaults, ...JSON.parse(data) };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error('Failed to load config:', error);
|
|
70
|
+
configData = { ...defaults };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Secure token management with JSON fallback
|
|
74
|
+
async getAuthToken() {
|
|
75
|
+
try {
|
|
76
|
+
const username = this.get('email') || os_1.default.userInfo().username;
|
|
77
|
+
return await keytar_1.default.getPassword(KEYTAR_SERVICE, `${username}-${TOKEN_KEY}`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// Fall back to file storage in CI environments
|
|
81
|
+
return this.getTokenFromFile(TOKEN_KEY);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async setAuthToken(token) {
|
|
85
|
+
try {
|
|
86
|
+
const username = this.get('email') || os_1.default.userInfo().username;
|
|
87
|
+
await keytar_1.default.setPassword(KEYTAR_SERVICE, `${username}-${TOKEN_KEY}`, token);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// Fall back to file storage in CI environments
|
|
92
|
+
return this.setTokenToFile(TOKEN_KEY, token);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async clearAuthToken() {
|
|
96
|
+
try {
|
|
97
|
+
const username = this.get('email') || os_1.default.userInfo().username;
|
|
98
|
+
const result = await keytar_1.default.deletePassword(KEYTAR_SERVICE, `${username}-${TOKEN_KEY}`);
|
|
99
|
+
// Also clear file fallback
|
|
100
|
+
this.clearTokenFromFile(TOKEN_KEY);
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// Fall back to file storage cleanup
|
|
105
|
+
return this.clearTokenFromFile(TOKEN_KEY);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// API Key management (for programmatic access)
|
|
109
|
+
async getApiKey() {
|
|
110
|
+
try {
|
|
111
|
+
const username = this.get('email') || os_1.default.userInfo().username;
|
|
112
|
+
return await keytar_1.default.getPassword(KEYTAR_SERVICE, `${username}-${API_KEY_KEY}`);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
// Fall back to file storage in CI environments
|
|
116
|
+
return this.getTokenFromFile(API_KEY_KEY);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async setApiKey(apiKey) {
|
|
120
|
+
try {
|
|
121
|
+
const username = this.get('email') || os_1.default.userInfo().username;
|
|
122
|
+
await keytar_1.default.setPassword(KEYTAR_SERVICE, `${username}-${API_KEY_KEY}`, apiKey);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
// Fall back to file storage in CI environments
|
|
127
|
+
return this.setTokenToFile(API_KEY_KEY, apiKey);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async clearApiKey() {
|
|
131
|
+
try {
|
|
132
|
+
const username = this.get('email') || os_1.default.userInfo().username;
|
|
133
|
+
const result = await keytar_1.default.deletePassword(KEYTAR_SERVICE, `${username}-${API_KEY_KEY}`);
|
|
134
|
+
// Also clear file fallback
|
|
135
|
+
this.clearTokenFromFile(API_KEY_KEY);
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
// Fall back to file storage cleanup
|
|
140
|
+
return this.clearTokenFromFile(API_KEY_KEY);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// File-based fallback for CI environments
|
|
144
|
+
getTokenFromFile(key) {
|
|
145
|
+
try {
|
|
146
|
+
const tokensPath = this.getTokensPath();
|
|
147
|
+
if (!(0, fs_1.existsSync)(tokensPath))
|
|
148
|
+
return null;
|
|
149
|
+
const tokens = JSON.parse((0, fs_1.readFileSync)(tokensPath, 'utf8'));
|
|
150
|
+
return tokens[key] || null;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
setTokenToFile(key, value) {
|
|
157
|
+
try {
|
|
158
|
+
const tokensPath = this.getTokensPath();
|
|
159
|
+
const tokensDir = path_1.default.dirname(tokensPath);
|
|
160
|
+
if (!(0, fs_1.existsSync)(tokensDir)) {
|
|
161
|
+
(0, fs_1.mkdirSync)(tokensDir, { recursive: true });
|
|
162
|
+
}
|
|
163
|
+
let tokens = {};
|
|
164
|
+
if ((0, fs_1.existsSync)(tokensPath)) {
|
|
165
|
+
tokens = JSON.parse((0, fs_1.readFileSync)(tokensPath, 'utf8'));
|
|
166
|
+
}
|
|
167
|
+
tokens = { ...tokens, [key]: value };
|
|
168
|
+
(0, fs_1.writeFileSync)(tokensPath, JSON.stringify(tokens), { mode: 0o600 }); // Secure permissions
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error('Failed to store token to file:', error);
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
clearTokenFromFile(key) {
|
|
177
|
+
try {
|
|
178
|
+
const tokensPath = this.getTokensPath();
|
|
179
|
+
if (!(0, fs_1.existsSync)(tokensPath))
|
|
180
|
+
return true;
|
|
181
|
+
const tokens = JSON.parse((0, fs_1.readFileSync)(tokensPath, 'utf8'));
|
|
182
|
+
delete tokens[key];
|
|
183
|
+
if (Object.keys(tokens).length === 0) {
|
|
184
|
+
// Remove file if empty
|
|
185
|
+
require('fs').unlinkSync(tokensPath);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
(0, fs_1.writeFileSync)(tokensPath, JSON.stringify(tokens), { mode: 0o600 });
|
|
189
|
+
}
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error('Failed to clear token from file:', error);
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
getTokensPath() {
|
|
198
|
+
return path_1.default.join(os_1.default.homedir(), '.kairo', 'tokens.json');
|
|
199
|
+
}
|
|
200
|
+
// Project management
|
|
201
|
+
getProjects() {
|
|
202
|
+
return configData.projects || [];
|
|
203
|
+
}
|
|
204
|
+
setProjects(projects) {
|
|
205
|
+
configData.projects = projects;
|
|
206
|
+
this.saveConfig();
|
|
207
|
+
}
|
|
208
|
+
addProject(project) {
|
|
209
|
+
const projects = this.getProjects();
|
|
210
|
+
projects.push(project);
|
|
211
|
+
this.setProjects(projects);
|
|
212
|
+
}
|
|
213
|
+
removeProject(projectId) {
|
|
214
|
+
const projects = this.getProjects().filter((p) => p.id !== projectId);
|
|
215
|
+
this.setProjects(projects);
|
|
216
|
+
}
|
|
217
|
+
getCurrentProject() {
|
|
218
|
+
const currentProjectId = this.get('currentProject');
|
|
219
|
+
if (!currentProjectId)
|
|
220
|
+
return null;
|
|
221
|
+
const projects = this.getProjects();
|
|
222
|
+
return projects.find((p) => p.id === currentProjectId) || null;
|
|
223
|
+
}
|
|
224
|
+
setCurrentProject(projectId) {
|
|
225
|
+
this.set('currentProject', projectId);
|
|
226
|
+
}
|
|
227
|
+
// Helper methods
|
|
228
|
+
isAuthenticated() {
|
|
229
|
+
return this.getAuthToken().then((token) => !!token);
|
|
230
|
+
}
|
|
231
|
+
getConfigPath() {
|
|
232
|
+
return path_1.default.join(os_1.default.homedir(), '.kairo', 'config.json');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
exports.ConfigManager = ConfigManager;
|
|
236
|
+
exports.configManager = ConfigManager.getInstance();
|
|
237
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ConfigManager, configManager, type KairoConfig, type Project } from './config';
|
|
2
|
+
export { getApiClient, createApiClient, resetApiClient, KairoApiClient, type ApiProject } from './api';
|
|
3
|
+
export { Logger } from './utils/logger';
|
|
4
|
+
export { Spinner, createSpinner } from './utils/spinner';
|
|
5
|
+
export * from './utils/validation';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzD,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.createSpinner = exports.Spinner = exports.Logger = exports.KairoApiClient = exports.resetApiClient = exports.createApiClient = exports.getApiClient = exports.configManager = exports.ConfigManager = void 0;
|
|
18
|
+
// Main CLI exports
|
|
19
|
+
var config_1 = require("./config");
|
|
20
|
+
Object.defineProperty(exports, "ConfigManager", { enumerable: true, get: function () { return config_1.ConfigManager; } });
|
|
21
|
+
Object.defineProperty(exports, "configManager", { enumerable: true, get: function () { return config_1.configManager; } });
|
|
22
|
+
var api_1 = require("./api");
|
|
23
|
+
Object.defineProperty(exports, "getApiClient", { enumerable: true, get: function () { return api_1.getApiClient; } });
|
|
24
|
+
Object.defineProperty(exports, "createApiClient", { enumerable: true, get: function () { return api_1.createApiClient; } });
|
|
25
|
+
Object.defineProperty(exports, "resetApiClient", { enumerable: true, get: function () { return api_1.resetApiClient; } });
|
|
26
|
+
Object.defineProperty(exports, "KairoApiClient", { enumerable: true, get: function () { return api_1.KairoApiClient; } });
|
|
27
|
+
var logger_1 = require("./utils/logger");
|
|
28
|
+
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
|
|
29
|
+
var spinner_1 = require("./utils/spinner");
|
|
30
|
+
Object.defineProperty(exports, "Spinner", { enumerable: true, get: function () { return spinner_1.Spinner; } });
|
|
31
|
+
Object.defineProperty(exports, "createSpinner", { enumerable: true, get: function () { return spinner_1.createSpinner; } });
|
|
32
|
+
__exportStar(require("./utils/validation"), exports);
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mBAAmB;AACnB,mCAAwF;AAA/E,uGAAA,aAAa,OAAA;AAAE,uGAAA,aAAa,OAAA;AACrC,6BAAuG;AAA9F,mGAAA,YAAY,OAAA;AAAE,sGAAA,eAAe,OAAA;AAAE,qGAAA,cAAc,OAAA;AAAE,qGAAA,cAAc,OAAA;AACtE,yCAAwC;AAA/B,gGAAA,MAAM,OAAA;AACf,2CAAyD;AAAhD,kGAAA,OAAO,OAAA;AAAE,wGAAA,aAAa,OAAA;AAC/B,qDAAmC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively find all Solidity files in a directory
|
|
3
|
+
*/
|
|
4
|
+
export declare function findSolidityFiles(targetPath: string): Promise<string[]>;
|
|
5
|
+
/**
|
|
6
|
+
* Check if a path is a single Solidity file
|
|
7
|
+
*/
|
|
8
|
+
export declare function isSolidityFile(filePath: string): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Validate that the target path exists and is accessible
|
|
11
|
+
*/
|
|
12
|
+
export declare function validatePath(targetPath: string): Promise<{
|
|
13
|
+
exists: boolean;
|
|
14
|
+
isDirectory: boolean;
|
|
15
|
+
isFile: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=file-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-discovery.d.ts","sourceRoot":"","sources":["../../src/lib/file-discovery.ts"],"names":[],"mappings":"AAyIA;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAc7E;AAkDD;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9D,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC,CAeD"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findSolidityFiles = findSolidityFiles;
|
|
4
|
+
exports.isSolidityFile = isSolidityFile;
|
|
5
|
+
exports.validatePath = validatePath;
|
|
6
|
+
const promises_1 = require("fs/promises");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
/**
|
|
9
|
+
* Directories to skip during file discovery
|
|
10
|
+
*/
|
|
11
|
+
const SKIP_DIRECTORIES = new Set([
|
|
12
|
+
'node_modules',
|
|
13
|
+
'.git',
|
|
14
|
+
'dist',
|
|
15
|
+
'build',
|
|
16
|
+
'cache',
|
|
17
|
+
'out',
|
|
18
|
+
'.next',
|
|
19
|
+
'coverage',
|
|
20
|
+
'lib',
|
|
21
|
+
'.github',
|
|
22
|
+
'.vscode',
|
|
23
|
+
'artifacts',
|
|
24
|
+
'typechain',
|
|
25
|
+
'deployments',
|
|
26
|
+
'forge-std',
|
|
27
|
+
'test',
|
|
28
|
+
'tests',
|
|
29
|
+
'script',
|
|
30
|
+
'scripts',
|
|
31
|
+
]);
|
|
32
|
+
/**
|
|
33
|
+
* Default ignore patterns
|
|
34
|
+
*/
|
|
35
|
+
const DEFAULT_IGNORE_PATTERNS = [
|
|
36
|
+
'**/.git/**',
|
|
37
|
+
'**/node_modules/**',
|
|
38
|
+
'**/dist/**',
|
|
39
|
+
'**/build/**',
|
|
40
|
+
'**/cache/**',
|
|
41
|
+
'**/out/**',
|
|
42
|
+
'**/.next/**',
|
|
43
|
+
'**/coverage/**',
|
|
44
|
+
'**/lib/**',
|
|
45
|
+
'**/artifacts/**',
|
|
46
|
+
'**/typechain/**',
|
|
47
|
+
'**/forge-std/**',
|
|
48
|
+
'**/*.test.sol',
|
|
49
|
+
'**/*.t.sol',
|
|
50
|
+
'**/test/**',
|
|
51
|
+
'**/tests/**',
|
|
52
|
+
'**/script/**',
|
|
53
|
+
'**/scripts/**',
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Parse gitignore patterns from a file
|
|
57
|
+
*/
|
|
58
|
+
async function parseIgnoreFile(ignoreFilePath) {
|
|
59
|
+
try {
|
|
60
|
+
const content = await (0, promises_1.readFile)(ignoreFilePath, 'utf8');
|
|
61
|
+
return content
|
|
62
|
+
.split('\n')
|
|
63
|
+
.map((line) => line.trim())
|
|
64
|
+
.filter((line) => line && !line.startsWith('#'))
|
|
65
|
+
.map((pattern) => {
|
|
66
|
+
// Convert gitignore patterns to glob patterns
|
|
67
|
+
if (pattern.endsWith('/')) {
|
|
68
|
+
return pattern + '**';
|
|
69
|
+
}
|
|
70
|
+
if (!pattern.includes('/')) {
|
|
71
|
+
return '**/' + pattern;
|
|
72
|
+
}
|
|
73
|
+
if (!pattern.startsWith('/')) {
|
|
74
|
+
return '**/' + pattern;
|
|
75
|
+
}
|
|
76
|
+
return pattern.substring(1); // Remove leading slash
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Load ignore patterns from gitignore and kairoignore files
|
|
85
|
+
*/
|
|
86
|
+
async function loadIgnorePatterns(startPath) {
|
|
87
|
+
const patterns = [...DEFAULT_IGNORE_PATTERNS];
|
|
88
|
+
let currentPath = (0, path_1.resolve)(startPath);
|
|
89
|
+
// Walk up the directory tree looking for ignore files
|
|
90
|
+
while (currentPath !== (0, path_1.dirname)(currentPath)) {
|
|
91
|
+
const gitignorePath = (0, path_1.join)(currentPath, '.gitignore');
|
|
92
|
+
const kairoignorePath = (0, path_1.join)(currentPath, '.kairoignore');
|
|
93
|
+
// Parse .gitignore
|
|
94
|
+
const gitignorePatterns = await parseIgnoreFile(gitignorePath);
|
|
95
|
+
patterns.push(...gitignorePatterns);
|
|
96
|
+
// Parse .kairoignore (Kairo-specific ignores)
|
|
97
|
+
const kairoignorePatterns = await parseIgnoreFile(kairoignorePath);
|
|
98
|
+
patterns.push(...kairoignorePatterns);
|
|
99
|
+
// Move up one directory
|
|
100
|
+
currentPath = (0, path_1.dirname)(currentPath);
|
|
101
|
+
}
|
|
102
|
+
return patterns;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if a file path matches any ignore pattern
|
|
106
|
+
*/
|
|
107
|
+
function isIgnored(filePath, basePath, patterns) {
|
|
108
|
+
const relativePath = (0, path_1.relative)(basePath, filePath);
|
|
109
|
+
for (const pattern of patterns) {
|
|
110
|
+
if (minimatch(relativePath, pattern) || minimatch(filePath, pattern)) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Simple glob matching implementation
|
|
118
|
+
*/
|
|
119
|
+
function minimatch(filePath, pattern) {
|
|
120
|
+
// Convert glob pattern to regex
|
|
121
|
+
const regexPattern = pattern
|
|
122
|
+
.replace(/\./g, '\\.')
|
|
123
|
+
.replace(/\*\*/g, '.*')
|
|
124
|
+
.replace(/\*/g, '[^/]*')
|
|
125
|
+
.replace(/\?/g, '.');
|
|
126
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
127
|
+
return regex.test(filePath) || regex.test(filePath.replace(/\\/g, '/'));
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Recursively find all Solidity files in a directory
|
|
131
|
+
*/
|
|
132
|
+
async function findSolidityFiles(targetPath) {
|
|
133
|
+
const files = [];
|
|
134
|
+
const basePath = (0, path_1.resolve)(targetPath);
|
|
135
|
+
try {
|
|
136
|
+
// Load ignore patterns
|
|
137
|
+
const ignorePatterns = await loadIgnorePatterns(basePath);
|
|
138
|
+
await discoverFiles(basePath, basePath, files, ignorePatterns);
|
|
139
|
+
return files.sort(); // Return sorted for consistent ordering
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.error(`Error discovering files in ${targetPath}:`, error);
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Recursively discover files, respecting ignore patterns
|
|
148
|
+
*/
|
|
149
|
+
async function discoverFiles(currentPath, basePath, files, ignorePatterns) {
|
|
150
|
+
try {
|
|
151
|
+
const entries = await (0, promises_1.readdir)(currentPath);
|
|
152
|
+
for (const entry of entries) {
|
|
153
|
+
const fullPath = (0, path_1.join)(currentPath, entry);
|
|
154
|
+
// Skip if path matches ignore patterns
|
|
155
|
+
if (isIgnored(fullPath, basePath, ignorePatterns)) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const stats = await (0, promises_1.stat)(fullPath);
|
|
160
|
+
if (stats.isDirectory()) {
|
|
161
|
+
// Skip well-known ignored directories
|
|
162
|
+
if (SKIP_DIRECTORIES.has(entry)) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
// Recursively process subdirectory
|
|
166
|
+
await discoverFiles(fullPath, basePath, files, ignorePatterns);
|
|
167
|
+
}
|
|
168
|
+
else if (stats.isFile()) {
|
|
169
|
+
// Check if it's a Solidity file
|
|
170
|
+
if ((0, path_1.extname)(entry).toLowerCase() === '.sol') {
|
|
171
|
+
files.push(fullPath);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (statError) {
|
|
176
|
+
// Skip files/directories we can't stat
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
// Skip directories we can't read (permissions, etc.)
|
|
183
|
+
console.warn(`Warning: Cannot read directory ${currentPath}:`, error.message);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check if a path is a single Solidity file
|
|
188
|
+
*/
|
|
189
|
+
async function isSolidityFile(filePath) {
|
|
190
|
+
try {
|
|
191
|
+
const stats = await (0, promises_1.stat)(filePath);
|
|
192
|
+
return stats.isFile() && (0, path_1.extname)(filePath).toLowerCase() === '.sol';
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Validate that the target path exists and is accessible
|
|
200
|
+
*/
|
|
201
|
+
async function validatePath(targetPath) {
|
|
202
|
+
try {
|
|
203
|
+
const stats = await (0, promises_1.stat)(targetPath);
|
|
204
|
+
return {
|
|
205
|
+
exists: true,
|
|
206
|
+
isDirectory: stats.isDirectory(),
|
|
207
|
+
isFile: stats.isFile(),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return {
|
|
212
|
+
exists: false,
|
|
213
|
+
isDirectory: false,
|
|
214
|
+
isFile: false,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=file-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-discovery.js","sourceRoot":"","sources":["../../src/lib/file-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface VulnerabilityPattern {
|
|
2
|
+
id: string;
|
|
3
|
+
pattern: RegExp;
|
|
4
|
+
severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
|
|
5
|
+
title: string;
|
|
6
|
+
description: string;
|
|
7
|
+
recommendation: string;
|
|
8
|
+
category: string;
|
|
9
|
+
cwe?: string;
|
|
10
|
+
confidenceBase: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Comprehensive vulnerability patterns ported from lib/scan-utils.ts
|
|
14
|
+
* These patterns detect common smart contract security issues
|
|
15
|
+
* Exactly 16 patterns from the main app scanner
|
|
16
|
+
*/
|
|
17
|
+
export declare const VULNERABILITY_PATTERNS: VulnerabilityPattern[];
|
|
18
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/lib/patterns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,oBAAoB,EA0LxD,CAAC"}
|