@oculum/cli 1.0.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/LICENSE +21 -0
- package/README.md +425 -0
- package/dist/commands/auth.d.ts +11 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +156 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/scan.d.ts +23 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +323 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/watch.d.ts +10 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +231 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47624 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/api.d.ts +42 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +120 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/config.d.ts +50 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +91 -0
- package/dist/utils/config.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAmC;AACnC,gDAAgD;AAChD,gDAAgD;AAChD,kDAAkD;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,gFAAgF,CAAC;KAC7F,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,uBAAY,CAAC,CAAA;AAEhC,2BAA2B;AAC3B,OAAO;KACJ,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,CAAC;KACvC,MAAM,CAAC,qBAAqB,EAAE,qCAAqC,EAAE,OAAO,CAAC;KAC7E,MAAM,CAAC,uBAAuB,EAAE,iDAAiD,EAAE,UAAU,CAAC;KAC9F,MAAM,CAAC,sBAAsB,EAAE,kDAAkD,EAAE,MAAM,CAAC;KAC1F,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,6BAA6B;IAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;IACtD,MAAM,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AAC9B,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend API Client
|
|
3
|
+
* Handles communication with Oculum backend for authenticated scans
|
|
4
|
+
*/
|
|
5
|
+
import type { ScanFile, ScanResult, ScanDepth } from '@oculum/scanner';
|
|
6
|
+
/**
|
|
7
|
+
* API Error
|
|
8
|
+
*/
|
|
9
|
+
export declare class APIError extends Error {
|
|
10
|
+
statusCode: number;
|
|
11
|
+
code?: string | undefined;
|
|
12
|
+
constructor(message: string, statusCode: number, code?: string | undefined);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Call backend API for validated/deep scans
|
|
16
|
+
*/
|
|
17
|
+
export declare function callBackendAPI(files: ScanFile[], depth: ScanDepth, apiKey: string): Promise<ScanResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Verify API key and get user info
|
|
20
|
+
*/
|
|
21
|
+
export declare function verifyApiKey(apiKey: string): Promise<{
|
|
22
|
+
valid: boolean;
|
|
23
|
+
email?: string;
|
|
24
|
+
tier?: 'free' | 'pro' | 'enterprise';
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Login via GitHub OAuth (opens browser)
|
|
28
|
+
*/
|
|
29
|
+
export declare function initiateLogin(): Promise<{
|
|
30
|
+
authUrl: string;
|
|
31
|
+
deviceCode: string;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Poll for login completion
|
|
35
|
+
*/
|
|
36
|
+
export declare function pollForLogin(deviceCode: string): Promise<{
|
|
37
|
+
complete: boolean;
|
|
38
|
+
apiKey?: string;
|
|
39
|
+
email?: string;
|
|
40
|
+
tier?: 'free' | 'pro' | 'enterprise';
|
|
41
|
+
}>;
|
|
42
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAWtE;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAGxB,UAAU,EAAE,MAAM;IAClB,IAAI,CAAC,EAAE,MAAM;gBAFpB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,YAAA;CAKvB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CA2BrB;AAUD;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1D,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAAA;CACrC,CAAC,CAsBD;AAUD;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC,CAiBD;AAWD;;GAEG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9D,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAAA;CACrC,CAAC,CA2BD"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Backend API Client
|
|
4
|
+
* Handles communication with Oculum backend for authenticated scans
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.APIError = void 0;
|
|
8
|
+
exports.callBackendAPI = callBackendAPI;
|
|
9
|
+
exports.verifyApiKey = verifyApiKey;
|
|
10
|
+
exports.initiateLogin = initiateLogin;
|
|
11
|
+
exports.pollForLogin = pollForLogin;
|
|
12
|
+
const config_js_1 = require("./config.js");
|
|
13
|
+
/**
|
|
14
|
+
* API Error
|
|
15
|
+
*/
|
|
16
|
+
class APIError extends Error {
|
|
17
|
+
statusCode;
|
|
18
|
+
code;
|
|
19
|
+
constructor(message, statusCode, code) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.statusCode = statusCode;
|
|
22
|
+
this.code = code;
|
|
23
|
+
this.name = 'APIError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.APIError = APIError;
|
|
27
|
+
/**
|
|
28
|
+
* Call backend API for validated/deep scans
|
|
29
|
+
*/
|
|
30
|
+
async function callBackendAPI(files, depth, apiKey) {
|
|
31
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
32
|
+
const url = `${baseUrl}/v1/scan`;
|
|
33
|
+
const response = await fetch(url, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: {
|
|
36
|
+
'Content-Type': 'application/json',
|
|
37
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({
|
|
40
|
+
files,
|
|
41
|
+
depth,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
const error = await response.json().catch(() => ({ message: 'Unknown error' }));
|
|
46
|
+
throw new APIError(error.message || `API error: ${response.status}`, response.status, error.code);
|
|
47
|
+
}
|
|
48
|
+
const result = await response.json();
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Verify API key and get user info
|
|
53
|
+
*/
|
|
54
|
+
async function verifyApiKey(apiKey) {
|
|
55
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
56
|
+
const url = `${baseUrl}/v1/verify-key`;
|
|
57
|
+
const response = await fetch(url, {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: {
|
|
60
|
+
'Content-Type': 'application/json',
|
|
61
|
+
},
|
|
62
|
+
body: JSON.stringify({ apiKey }),
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
return { valid: false };
|
|
66
|
+
}
|
|
67
|
+
const result = await response.json();
|
|
68
|
+
return {
|
|
69
|
+
valid: true,
|
|
70
|
+
email: result.email,
|
|
71
|
+
tier: result.tier,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Login via GitHub OAuth (opens browser)
|
|
76
|
+
*/
|
|
77
|
+
async function initiateLogin() {
|
|
78
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
79
|
+
const url = `${baseUrl}/v1/auth/device`;
|
|
80
|
+
const response = await fetch(url, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
headers: {
|
|
83
|
+
'Content-Type': 'application/json',
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
throw new APIError('Failed to initiate login', response.status);
|
|
88
|
+
}
|
|
89
|
+
const result = await response.json();
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Poll for login completion
|
|
94
|
+
*/
|
|
95
|
+
async function pollForLogin(deviceCode) {
|
|
96
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
97
|
+
const url = `${baseUrl}/v1/auth/device/poll`;
|
|
98
|
+
const response = await fetch(url, {
|
|
99
|
+
method: 'POST',
|
|
100
|
+
headers: {
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
},
|
|
103
|
+
body: JSON.stringify({ deviceCode }),
|
|
104
|
+
});
|
|
105
|
+
if (!response.ok) {
|
|
106
|
+
if (response.status === 428) {
|
|
107
|
+
// Precondition Required - still waiting
|
|
108
|
+
return { complete: false };
|
|
109
|
+
}
|
|
110
|
+
throw new APIError('Login failed', response.status);
|
|
111
|
+
}
|
|
112
|
+
const result = await response.json();
|
|
113
|
+
return {
|
|
114
|
+
complete: true,
|
|
115
|
+
apiKey: result.apiKey,
|
|
116
|
+
email: result.email,
|
|
117
|
+
tier: result.tier,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Configuration Management
|
|
3
|
+
* Handles user config, auth tokens, and settings
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* CLI Configuration
|
|
7
|
+
*/
|
|
8
|
+
export interface CLIConfig {
|
|
9
|
+
/** API key for authenticated scans */
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
/** User email (from login) */
|
|
12
|
+
email?: string;
|
|
13
|
+
/** Subscription tier */
|
|
14
|
+
tier?: 'free' | 'pro' | 'enterprise';
|
|
15
|
+
/** Default scan depth */
|
|
16
|
+
defaultDepth?: 'cheap' | 'validated' | 'deep';
|
|
17
|
+
/** Default output format */
|
|
18
|
+
defaultFormat?: 'terminal' | 'json' | 'sarif' | 'markdown';
|
|
19
|
+
/** API base URL (for development) */
|
|
20
|
+
apiBaseUrl?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get current configuration
|
|
24
|
+
*/
|
|
25
|
+
export declare function getConfig(): CLIConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Save configuration
|
|
28
|
+
*/
|
|
29
|
+
export declare function saveConfig(config: CLIConfig): void;
|
|
30
|
+
/**
|
|
31
|
+
* Update specific config values
|
|
32
|
+
*/
|
|
33
|
+
export declare function updateConfig(updates: Partial<CLIConfig>): void;
|
|
34
|
+
/**
|
|
35
|
+
* Clear authentication
|
|
36
|
+
*/
|
|
37
|
+
export declare function clearAuth(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Check if user is authenticated
|
|
40
|
+
*/
|
|
41
|
+
export declare function isAuthenticated(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get API base URL
|
|
44
|
+
*/
|
|
45
|
+
export declare function getApiBaseUrl(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Store API key and user info after login
|
|
48
|
+
*/
|
|
49
|
+
export declare function setAuthCredentials(apiKey: string, email?: string, tier?: CLIConfig['tier']): void;
|
|
50
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAAA;IACpC,yBAAyB;IACzB,YAAY,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAA;IAC7C,4BAA4B;IAC5B,aAAa,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;IAC1D,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAeD;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAerC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAG9D;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAMhC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAEjG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI Configuration Management
|
|
4
|
+
* Handles user config, auth tokens, and settings
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getConfig = getConfig;
|
|
8
|
+
exports.saveConfig = saveConfig;
|
|
9
|
+
exports.updateConfig = updateConfig;
|
|
10
|
+
exports.clearAuth = clearAuth;
|
|
11
|
+
exports.isAuthenticated = isAuthenticated;
|
|
12
|
+
exports.getApiBaseUrl = getApiBaseUrl;
|
|
13
|
+
exports.setAuthCredentials = setAuthCredentials;
|
|
14
|
+
const fs_1 = require("fs");
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
const os_1 = require("os");
|
|
17
|
+
const CONFIG_DIR = (0, path_1.join)((0, os_1.homedir)(), '.oculum');
|
|
18
|
+
const CONFIG_FILE = (0, path_1.join)(CONFIG_DIR, 'config.json');
|
|
19
|
+
const DEFAULT_API_URL = 'https://oculum.dev/api';
|
|
20
|
+
/**
|
|
21
|
+
* Ensure config directory exists
|
|
22
|
+
*/
|
|
23
|
+
function ensureConfigDir() {
|
|
24
|
+
if (!(0, fs_1.existsSync)(CONFIG_DIR)) {
|
|
25
|
+
(0, fs_1.mkdirSync)(CONFIG_DIR, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get current configuration
|
|
30
|
+
*/
|
|
31
|
+
function getConfig() {
|
|
32
|
+
try {
|
|
33
|
+
if ((0, fs_1.existsSync)(CONFIG_FILE)) {
|
|
34
|
+
const content = (0, fs_1.readFileSync)(CONFIG_FILE, 'utf-8');
|
|
35
|
+
return JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Return defaults if config is corrupted
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
apiBaseUrl: process.env.OCULUM_API_URL || DEFAULT_API_URL,
|
|
43
|
+
defaultDepth: 'cheap',
|
|
44
|
+
defaultFormat: 'terminal',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Save configuration
|
|
49
|
+
*/
|
|
50
|
+
function saveConfig(config) {
|
|
51
|
+
ensureConfigDir();
|
|
52
|
+
(0, fs_1.writeFileSync)(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Update specific config values
|
|
56
|
+
*/
|
|
57
|
+
function updateConfig(updates) {
|
|
58
|
+
const current = getConfig();
|
|
59
|
+
saveConfig({ ...current, ...updates });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Clear authentication
|
|
63
|
+
*/
|
|
64
|
+
function clearAuth() {
|
|
65
|
+
const config = getConfig();
|
|
66
|
+
delete config.apiKey;
|
|
67
|
+
delete config.email;
|
|
68
|
+
delete config.tier;
|
|
69
|
+
saveConfig(config);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if user is authenticated
|
|
73
|
+
*/
|
|
74
|
+
function isAuthenticated() {
|
|
75
|
+
const config = getConfig();
|
|
76
|
+
return !!config.apiKey;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get API base URL
|
|
80
|
+
*/
|
|
81
|
+
function getApiBaseUrl() {
|
|
82
|
+
const config = getConfig();
|
|
83
|
+
return config.apiBaseUrl || process.env.OCULUM_API_URL || DEFAULT_API_URL;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Store API key and user info after login
|
|
87
|
+
*/
|
|
88
|
+
function setAuthCredentials(apiKey, email, tier) {
|
|
89
|
+
updateConfig({ apiKey, email, tier });
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAwCH,8BAeC;AAKD,gCAGC;AAKD,oCAGC;AAKD,8BAMC;AAKD,0CAGC;AAKD,sCAGC;AAKD,gDAEC;AAvGD,2BAAuE;AACvE,+BAA2B;AAC3B,2BAA4B;AAoB5B,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,CAAC,CAAA;AAC7C,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AACnD,MAAM,eAAe,GAAG,wBAAwB,CAAA;AAEhD;;GAEG;AACH,SAAS,eAAe;IACtB,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,IAAA,cAAS,EAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS;IACvB,IAAI,CAAC;QACH,IAAI,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAA;YAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,eAAe;QACzD,YAAY,EAAE,OAAO;QACrB,aAAa,EAAE,UAAU;KAC1B,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,MAAiB;IAC1C,eAAe,EAAE,CAAA;IACjB,IAAA,kBAAa,EAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAA2B;IACtD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAA;IAC3B,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS;IACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,OAAO,MAAM,CAAC,MAAM,CAAA;IACpB,OAAO,MAAM,CAAC,KAAK,CAAA;IACnB,OAAO,MAAM,CAAC,IAAI,CAAA;IAClB,UAAU,CAAC,MAAM,CAAC,CAAA;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe;IAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,OAAO,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,eAAe,CAAA;AAC3E,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,MAAc,EAAE,KAAc,EAAE,IAAwB;IACzF,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACvC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oculum/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI-native security scanner CLI for detecting vulnerabilities in AI-generated code, BYOK patterns, and modern web applications",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"oculum": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"author": "Felix Westin <felix.lwestin@gmail.com>",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/flexipie/oculum.git",
|
|
14
|
+
"directory": "packages/cli"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://oculum-api.vercel.app",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/flexipie/oculum/issues"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "esbuild src/index.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --banner:js=\"#!/usr/bin/env node\" --define:process.env.OCULUM_API_URL='undefined'",
|
|
22
|
+
"dev": "npm run build -- --watch",
|
|
23
|
+
"test": "echo \"No tests configured yet\"",
|
|
24
|
+
"lint": "eslint src/"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@oculum/scanner": "^1.0.0",
|
|
28
|
+
"@oculum/shared": "^1.0.0",
|
|
29
|
+
"commander": "^12.1.0",
|
|
30
|
+
"chalk": "^5.3.0",
|
|
31
|
+
"ora": "^8.1.1",
|
|
32
|
+
"chokidar": "^4.0.1",
|
|
33
|
+
"glob": "^11.0.0",
|
|
34
|
+
"@clack/prompts": "^0.11.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^20",
|
|
38
|
+
"esbuild": "^0.24.0",
|
|
39
|
+
"typescript": "^5"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist",
|
|
43
|
+
"README.md",
|
|
44
|
+
"LICENSE"
|
|
45
|
+
],
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=18"
|
|
48
|
+
},
|
|
49
|
+
"keywords": [
|
|
50
|
+
"security",
|
|
51
|
+
"scanner",
|
|
52
|
+
"ai",
|
|
53
|
+
"cli",
|
|
54
|
+
"llm",
|
|
55
|
+
"vulnerability",
|
|
56
|
+
"sast",
|
|
57
|
+
"code-analysis",
|
|
58
|
+
"ai-security",
|
|
59
|
+
"byok",
|
|
60
|
+
"agent-tools",
|
|
61
|
+
"ai-generated-code",
|
|
62
|
+
"typescript",
|
|
63
|
+
"javascript",
|
|
64
|
+
"security-scanner",
|
|
65
|
+
"static-analysis"
|
|
66
|
+
]
|
|
67
|
+
}
|