@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.
@@ -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
+ }