@oculum/cli 1.0.20 → 1.0.21

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oculum/cli",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "description": "AI-native security scanner CLI for detecting vulnerabilities in AI-generated code, BYOK patterns, and modern web applications",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -19,7 +19,7 @@
19
19
  "url": "https://github.com/flexipie/oculum/issues"
20
20
  },
21
21
  "scripts": {
22
- "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' --define:VERSION='\"'$npm_package_version'\"'",
22
+ "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' --define:VERSION='\"'$npm_package_version'\"' --external:tree-sitter --external:tree-sitter-javascript --external:tree-sitter-typescript --external:tree-sitter-python && chmod +x dist/index.js",
23
23
  "dev": "npm run build -- --watch",
24
24
  "test": "echo \"No tests configured yet\"",
25
25
  "lint": "eslint src/"
@@ -33,7 +33,11 @@
33
33
  "commander": "^12.1.0",
34
34
  "glob": "^11.0.0",
35
35
  "minimatch": "^10.1.1",
36
- "ora": "^8.1.1"
36
+ "ora": "^8.1.1",
37
+ "tree-sitter": "^0.21.1",
38
+ "tree-sitter-javascript": "^0.23.1",
39
+ "tree-sitter-python": "^0.21.0",
40
+ "tree-sitter-typescript": "^0.23.2"
37
41
  },
38
42
  "devDependencies": {
39
43
  "@types/node": "^20",
@@ -1,11 +0,0 @@
1
- /**
2
- * Auth Commands
3
- * Handle login, logout, and status
4
- */
5
- import { Command } from 'commander';
6
- /**
7
- * Auth command group
8
- */
9
- export declare const authCommand: Command;
10
- export declare const loginCommand: Command;
11
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiJnC;;GAEG;AACH,eAAO,MAAM,WAAW,SACe,CAAA;AA+BvC,eAAO,MAAM,YAAY,SAGT,CAAA"}
@@ -1,156 +0,0 @@
1
- "use strict";
2
- /**
3
- * Auth Commands
4
- * Handle login, logout, and status
5
- */
6
- var __importDefault = (this && this.__importDefault) || function (mod) {
7
- return (mod && mod.__esModule) ? mod : { "default": mod };
8
- };
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.loginCommand = exports.authCommand = void 0;
11
- const commander_1 = require("commander");
12
- const chalk_1 = __importDefault(require("chalk"));
13
- const ora_1 = __importDefault(require("ora"));
14
- const config_js_1 = require("../utils/config.js");
15
- const api_js_1 = require("../utils/api.js");
16
- /**
17
- * Login command
18
- */
19
- async function login(options) {
20
- const spinner = (0, ora_1.default)();
21
- // If API key provided directly, verify and store it
22
- if (options.apiKey) {
23
- spinner.start('Verifying API key...');
24
- const result = await (0, api_js_1.verifyApiKey)(options.apiKey);
25
- if (!result.valid) {
26
- spinner.fail('Invalid API key');
27
- process.exit(1);
28
- }
29
- (0, config_js_1.setAuthCredentials)(options.apiKey, result.email, result.tier);
30
- spinner.succeed('Logged in successfully!');
31
- console.log(chalk_1.default.dim(` Email: ${result.email}`));
32
- console.log(chalk_1.default.dim(` Tier: ${result.tier}`));
33
- return;
34
- }
35
- // Otherwise, use device flow
36
- try {
37
- spinner.start('Initiating login...');
38
- const { authUrl, deviceCode } = await (0, api_js_1.initiateLogin)();
39
- spinner.stop();
40
- console.log('\nTo complete login:');
41
- console.log(chalk_1.default.cyan(`\n 1. Open this URL in your browser:\n ${authUrl}`));
42
- console.log(chalk_1.default.dim(`\n 2. Enter the code: ${chalk_1.default.bold(deviceCode)}`));
43
- console.log(chalk_1.default.dim('\n Waiting for authorization...'));
44
- // Poll for completion
45
- spinner.start('Waiting for browser authorization...');
46
- const maxAttempts = 60; // 5 minutes with 5s interval
47
- for (let i = 0; i < maxAttempts; i++) {
48
- await new Promise(resolve => setTimeout(resolve, 5000));
49
- const result = await (0, api_js_1.pollForLogin)(deviceCode);
50
- if (result.complete) {
51
- (0, config_js_1.setAuthCredentials)(result.apiKey, result.email, result.tier);
52
- spinner.succeed('Logged in successfully!');
53
- console.log(chalk_1.default.dim(` Email: ${result.email}`));
54
- console.log(chalk_1.default.dim(` Tier: ${result.tier}`));
55
- return;
56
- }
57
- }
58
- spinner.fail('Login timed out. Please try again.');
59
- process.exit(1);
60
- }
61
- catch (err) {
62
- spinner.fail(`Login failed: ${err}`);
63
- process.exit(1);
64
- }
65
- }
66
- /**
67
- * Logout command
68
- */
69
- function logout() {
70
- if (!(0, config_js_1.isAuthenticated)()) {
71
- console.log(chalk_1.default.yellow('Not logged in.'));
72
- return;
73
- }
74
- (0, config_js_1.clearAuth)();
75
- console.log(chalk_1.default.green('Logged out successfully.'));
76
- }
77
- /**
78
- * Status command
79
- */
80
- async function status() {
81
- const config = (0, config_js_1.getConfig)();
82
- console.log('\n' + chalk_1.default.bold('Oculum CLI Status'));
83
- console.log(chalk_1.default.dim('─'.repeat(40)));
84
- if (!(0, config_js_1.isAuthenticated)()) {
85
- console.log(chalk_1.default.yellow('\nNot logged in.'));
86
- console.log(chalk_1.default.dim('\nRun `oculum login` to authenticate.'));
87
- console.log(chalk_1.default.dim('Free tier allows cheap (local) scans only.'));
88
- console.log(chalk_1.default.dim('Paid tiers unlock AI-powered validated and deep scans.\n'));
89
- return;
90
- }
91
- // Verify the stored key is still valid
92
- const spinner = (0, ora_1.default)('Verifying credentials...').start();
93
- const result = await (0, api_js_1.verifyApiKey)(config.apiKey);
94
- if (!result.valid) {
95
- spinner.fail('Stored credentials are invalid or expired.');
96
- console.log(chalk_1.default.dim('Run `oculum login` to re-authenticate.'));
97
- return;
98
- }
99
- spinner.succeed('Authenticated');
100
- console.log(chalk_1.default.dim(` Email: ${result.email || config.email}`));
101
- console.log(chalk_1.default.dim(` Tier: ${result.tier || config.tier}`));
102
- // Show tier capabilities
103
- console.log('\n' + chalk_1.default.bold('Available Scan Depths:'));
104
- const tier = result.tier || config.tier || 'free';
105
- console.log(chalk_1.default.green(' cheap - Fast pattern matching (always available)'));
106
- if (tier === 'pro' || tier === 'enterprise') {
107
- console.log(chalk_1.default.green(' validated - AI-powered validation'));
108
- console.log(chalk_1.default.green(' deep - Full AI semantic analysis'));
109
- }
110
- else {
111
- console.log(chalk_1.default.dim(' validated - AI-powered validation (requires Pro)'));
112
- console.log(chalk_1.default.dim(' deep - Full AI semantic analysis (requires Pro)'));
113
- }
114
- console.log('');
115
- }
116
- /**
117
- * Upgrade command (opens billing portal)
118
- */
119
- function upgrade() {
120
- console.log(chalk_1.default.cyan('\nTo upgrade your subscription, visit:'));
121
- console.log(chalk_1.default.bold(' https://oculum.dev/billing\n'));
122
- }
123
- /**
124
- * Auth command group
125
- */
126
- exports.authCommand = new commander_1.Command('auth')
127
- .description('Manage authentication');
128
- // Login subcommand
129
- exports.authCommand
130
- .command('login')
131
- .description('Log in to Oculum')
132
- .option('-k, --api-key <key>', 'API key (skip browser auth)')
133
- .action(login);
134
- // Logout subcommand
135
- exports.authCommand
136
- .command('logout')
137
- .description('Log out from Oculum')
138
- .action(logout);
139
- // Status subcommand
140
- exports.authCommand
141
- .command('status')
142
- .description('Show current authentication status')
143
- .action(status);
144
- // Upgrade subcommand
145
- exports.authCommand
146
- .command('upgrade')
147
- .description('Upgrade your subscription')
148
- .action(upgrade);
149
- // Default: show status
150
- exports.authCommand.action(status);
151
- // Also export standalone login command for convenience
152
- exports.loginCommand = new commander_1.Command('login')
153
- .description('Log in to Oculum')
154
- .option('-k, --api-key <key>', 'API key (skip browser auth)')
155
- .action(login);
156
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- /**
2
- * Scan Command
3
- * Main scanning functionality for the CLI
4
- */
5
- import { Command } from 'commander';
6
- export interface ScanOptions {
7
- depth: 'cheap' | 'validated' | 'deep';
8
- format: 'terminal' | 'json' | 'sarif' | 'markdown';
9
- failOn: 'critical' | 'high' | 'medium' | 'low' | 'none';
10
- color?: boolean;
11
- incremental?: boolean;
12
- diff?: string;
13
- output?: string;
14
- }
15
- /**
16
- * Main scan function
17
- */
18
- export declare function runScan(targetPath: string, options: ScanOptions): Promise<void>;
19
- /**
20
- * Scan command definition
21
- */
22
- export declare const scanCommand: Command;
23
- //# sourceMappingURL=scan.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwBnC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAA;IACrC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;IAClD,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;IACvD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAuND;;GAEG;AACH,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GrF;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,SAUN,CAAA"}
@@ -1,323 +0,0 @@
1
- "use strict";
2
- /**
3
- * Scan Command
4
- * Main scanning functionality for the CLI
5
- */
6
- var __importDefault = (this && this.__importDefault) || function (mod) {
7
- return (mod && mod.__esModule) ? mod : { "default": mod };
8
- };
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.scanCommand = void 0;
11
- exports.runScan = runScan;
12
- const commander_1 = require("commander");
13
- const path_1 = require("path");
14
- const fs_1 = require("fs");
15
- const glob_1 = require("glob");
16
- const chalk_1 = __importDefault(require("chalk"));
17
- const ora_1 = __importDefault(require("ora"));
18
- const scanner_1 = require("@oculum/scanner");
19
- const formatters_1 = require("@oculum/scanner/formatters");
20
- const config_js_1 = require("../utils/config.js");
21
- const api_js_1 = require("../utils/api.js");
22
- /**
23
- * Check if file should be scanned
24
- */
25
- function isScannableFile(filePath) {
26
- const ext = (0, path_1.extname)(filePath).toLowerCase();
27
- const fileName = (0, path_1.basename)(filePath);
28
- // Check special files first
29
- if (scanner_1.SPECIAL_FILES.includes(fileName)) {
30
- return true;
31
- }
32
- // Check extensions
33
- return scanner_1.SCANNABLE_EXTENSIONS.includes(ext);
34
- }
35
- /**
36
- * Map file extension to language
37
- */
38
- function getLanguage(filePath) {
39
- const ext = (0, path_1.extname)(filePath).toLowerCase();
40
- const langMap = {
41
- '.js': 'javascript',
42
- '.jsx': 'javascript',
43
- '.mjs': 'javascript',
44
- '.cjs': 'javascript',
45
- '.ts': 'typescript',
46
- '.tsx': 'typescript',
47
- '.py': 'python',
48
- '.go': 'go',
49
- '.java': 'java',
50
- '.rb': 'ruby',
51
- '.php': 'php',
52
- '.cs': 'csharp',
53
- '.yaml': 'yaml',
54
- '.yml': 'yaml',
55
- '.json': 'json',
56
- '.toml': 'toml',
57
- '.env': 'dotenv',
58
- '.sh': 'shell',
59
- '.bash': 'shell',
60
- };
61
- return langMap[ext] || 'text';
62
- }
63
- /**
64
- * Collect files to scan from a directory
65
- */
66
- async function collectFiles(targetPath) {
67
- const absolutePath = (0, path_1.resolve)(targetPath);
68
- const stats = (0, fs_1.statSync)(absolutePath);
69
- const files = [];
70
- if (stats.isFile()) {
71
- // Single file scan
72
- if (isScannableFile(absolutePath)) {
73
- const content = (0, fs_1.readFileSync)(absolutePath, 'utf-8');
74
- if (content.length <= scanner_1.MAX_FILE_SIZE) {
75
- files.push({
76
- path: (0, path_1.relative)(process.cwd(), absolutePath),
77
- content,
78
- language: getLanguage(absolutePath),
79
- size: content.length,
80
- });
81
- }
82
- }
83
- }
84
- else if (stats.isDirectory()) {
85
- // Directory scan - use glob to find all files
86
- const patterns = [
87
- '**/*.js',
88
- '**/*.jsx',
89
- '**/*.ts',
90
- '**/*.tsx',
91
- '**/*.py',
92
- '**/*.go',
93
- '**/*.java',
94
- '**/*.rb',
95
- '**/*.php',
96
- '**/*.cs',
97
- '**/*.yaml',
98
- '**/*.yml',
99
- '**/*.json',
100
- '**/*.toml',
101
- '**/*.env*',
102
- '**/Dockerfile*',
103
- '**/docker-compose*.yml',
104
- '**/package.json',
105
- '**/.env*',
106
- ];
107
- const ignorePatterns = [
108
- '**/node_modules/**',
109
- '**/dist/**',
110
- '**/build/**',
111
- '**/.git/**',
112
- '**/vendor/**',
113
- '**/__pycache__/**',
114
- '**/venv/**',
115
- '**/.venv/**',
116
- '**/coverage/**',
117
- '**/.next/**',
118
- '**/.nuxt/**',
119
- ];
120
- const foundFiles = await (0, glob_1.glob)(patterns, {
121
- cwd: absolutePath,
122
- ignore: ignorePatterns,
123
- nodir: true,
124
- absolute: true,
125
- });
126
- for (const filePath of foundFiles) {
127
- try {
128
- const fileStats = (0, fs_1.statSync)(filePath);
129
- if (fileStats.size > scanner_1.MAX_FILE_SIZE)
130
- continue;
131
- const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
132
- files.push({
133
- path: (0, path_1.relative)(process.cwd(), filePath),
134
- content,
135
- language: getLanguage(filePath),
136
- size: content.length,
137
- });
138
- }
139
- catch {
140
- // Skip files that can't be read
141
- }
142
- }
143
- }
144
- return files;
145
- }
146
- /**
147
- * Format result based on output format
148
- */
149
- function formatOutput(result, format, noColor) {
150
- switch (format) {
151
- case 'json':
152
- return (0, formatters_1.formatJSON)(result, true);
153
- case 'sarif':
154
- return JSON.stringify((0, formatters_1.formatSARIF)(result), null, 2);
155
- case 'markdown':
156
- return formatMarkdown(result);
157
- case 'terminal':
158
- default:
159
- return (0, formatters_1.formatTerminalOutput)(result, { noColor });
160
- }
161
- }
162
- /**
163
- * Format as markdown (for docs/reports)
164
- */
165
- function formatMarkdown(result) {
166
- const { vulnerabilities, severityCounts, filesScanned, scanDuration } = result;
167
- let md = `# Oculum Security Scan Report\n\n`;
168
- md += `**Scanned:** ${filesScanned} files in ${(scanDuration / 1000).toFixed(1)}s\n\n`;
169
- // Summary table
170
- md += `## Summary\n\n`;
171
- md += `| Severity | Count |\n`;
172
- md += `|----------|-------|\n`;
173
- md += `| Critical | ${severityCounts.critical} |\n`;
174
- md += `| High | ${severityCounts.high} |\n`;
175
- md += `| Medium | ${severityCounts.medium} |\n`;
176
- md += `| Low | ${severityCounts.low} |\n`;
177
- md += `| Info | ${severityCounts.info} |\n\n`;
178
- if (vulnerabilities.length === 0) {
179
- md += `## Findings\n\n`;
180
- md += `No security issues found.\n`;
181
- return md;
182
- }
183
- // Findings by severity
184
- md += `## Findings\n\n`;
185
- for (const severity of ['critical', 'high', 'medium', 'low', 'info']) {
186
- const findings = vulnerabilities.filter(v => v.severity === severity);
187
- if (findings.length === 0)
188
- continue;
189
- md += `### ${severity.charAt(0).toUpperCase() + severity.slice(1)} (${findings.length})\n\n`;
190
- for (const finding of findings) {
191
- md += `#### ${finding.title}\n\n`;
192
- md += `- **File:** \`${finding.filePath}:${finding.lineNumber}\`\n`;
193
- md += `- **Category:** ${finding.category}\n`;
194
- md += `- **Description:** ${finding.description}\n`;
195
- if (finding.suggestedFix) {
196
- md += `- **Fix:** ${finding.suggestedFix}\n`;
197
- }
198
- md += `\n`;
199
- }
200
- }
201
- return md;
202
- }
203
- /**
204
- * Get severity rank for comparison
205
- */
206
- function severityRank(severity) {
207
- const ranks = {
208
- critical: 5,
209
- high: 4,
210
- medium: 3,
211
- low: 2,
212
- info: 1,
213
- none: 0,
214
- };
215
- return ranks[severity] || 0;
216
- }
217
- /**
218
- * Main scan function
219
- */
220
- async function runScan(targetPath, options) {
221
- const spinner = (0, ora_1.default)();
222
- const config = (0, config_js_1.getConfig)();
223
- const noColor = options.color === false;
224
- // Validate depth against auth
225
- if ((options.depth === 'validated' || options.depth === 'deep') && !(0, config_js_1.isAuthenticated)()) {
226
- console.log(chalk_1.default.yellow('\nNote: validated and deep scans require authentication.'));
227
- console.log(chalk_1.default.dim('Run `oculum login` to authenticate, or use `--depth cheap` for free local scans.\n'));
228
- console.log(chalk_1.default.dim('Falling back to cheap scan...\n'));
229
- options.depth = 'cheap';
230
- }
231
- // Collect files
232
- spinner.start('Collecting files to scan...');
233
- let files;
234
- try {
235
- files = await collectFiles(targetPath);
236
- }
237
- catch (err) {
238
- spinner.fail(`Failed to collect files: ${err}`);
239
- process.exit(1);
240
- }
241
- if (files.length === 0) {
242
- spinner.fail('No scannable files found');
243
- process.exit(1);
244
- }
245
- spinner.succeed(`Found ${files.length} files to scan`);
246
- // Progress callback
247
- const onProgress = (progress) => {
248
- switch (progress.status) {
249
- case 'layer1':
250
- spinner.text = `Layer 1: Pattern matching... (${progress.vulnerabilitiesFound} findings)`;
251
- break;
252
- case 'layer2':
253
- spinner.text = `Layer 2: Structural analysis... (${progress.vulnerabilitiesFound} findings)`;
254
- break;
255
- case 'validating':
256
- spinner.text = `AI validation... (${progress.vulnerabilitiesFound} candidates)`;
257
- break;
258
- case 'layer3':
259
- spinner.text = `Layer 3: AI semantic analysis...`;
260
- break;
261
- case 'complete':
262
- spinner.succeed(`Scan complete: ${progress.vulnerabilitiesFound} issues found`);
263
- break;
264
- case 'failed':
265
- spinner.fail(progress.message);
266
- break;
267
- }
268
- };
269
- // Run scan
270
- let result;
271
- try {
272
- spinner.start('Starting scan...');
273
- // For validated/deep scans, call the backend API
274
- if (options.depth !== 'cheap' && (0, config_js_1.isAuthenticated)()) {
275
- result = await (0, api_js_1.callBackendAPI)(files, options.depth, config.apiKey);
276
- }
277
- else {
278
- // Local scan for cheap depth
279
- result = await (0, scanner_1.runScan)(files, {
280
- name: (0, path_1.basename)((0, path_1.resolve)(targetPath)),
281
- url: '',
282
- branch: 'local',
283
- }, {
284
- enableAI: false, // Cheap mode = no AI
285
- scanDepth: 'cheap',
286
- }, onProgress);
287
- }
288
- }
289
- catch (err) {
290
- spinner.fail(`Scan failed: ${err}`);
291
- process.exit(1);
292
- }
293
- // Output results
294
- const output = formatOutput(result, options.format, noColor);
295
- console.log(output);
296
- // Write to file if specified
297
- if (options.output) {
298
- const { writeFileSync } = await import('fs');
299
- writeFileSync(options.output, output);
300
- console.log(chalk_1.default.dim(`\nResults written to ${options.output}`));
301
- }
302
- // Exit code based on findings
303
- const failThreshold = severityRank(options.failOn);
304
- const highestSeverity = result.vulnerabilities.reduce((max, v) => Math.max(max, severityRank(v.severity)), 0);
305
- if (highestSeverity >= failThreshold) {
306
- process.exit(1);
307
- }
308
- }
309
- /**
310
- * Scan command definition
311
- */
312
- exports.scanCommand = new commander_1.Command('scan')
313
- .description('Scan a directory or file for security vulnerabilities')
314
- .argument('[path]', 'path to scan', '.')
315
- .option('-d, --depth <depth>', 'scan depth: cheap (free), validated, deep', 'cheap')
316
- .option('-f, --format <format>', 'output format: terminal, json, sarif, markdown', 'terminal')
317
- .option('--fail-on <severity>', 'exit with error code if findings at severity', 'high')
318
- .option('--no-color', 'disable colored output')
319
- .option('-o, --output <file>', 'write output to file')
320
- .option('--incremental', 'only scan changed files (requires git)')
321
- .option('--diff <ref>', 'diff against branch/commit for incremental scan')
322
- .action(runScan);
323
- //# sourceMappingURL=scan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Watch Command
3
- * File watcher for continuous scanning during development
4
- */
5
- import { Command } from 'commander';
6
- /**
7
- * Watch command definition
8
- */
9
- export declare const watchCommand: Command;
10
- //# sourceMappingURL=watch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmPnC;;GAEG;AACH,eAAO,MAAM,YAAY,SAYrB,CAAA"}