@vigilbase/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/LICENSE +21 -0
- package/README.md +138 -0
- package/dist/auth/device-auth.d.ts +58 -0
- package/dist/auth/device-auth.d.ts.map +1 -0
- package/dist/auth/device-auth.js +229 -0
- package/dist/auth/device-auth.js.map +1 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/store.d.ts +12 -0
- package/dist/auth/store.d.ts.map +1 -0
- package/dist/auth/store.js +85 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/auth/types.d.ts +46 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +8 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +5 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +510 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/banner.d.ts +29 -0
- package/dist/lib/banner.d.ts.map +1 -0
- package/dist/lib/banner.js +68 -0
- package/dist/lib/banner.js.map +1 -0
- package/dist/lib/client.d.ts +27 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +146 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +31 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +57 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/format.d.ts +14 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +289 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/help.d.ts +4 -0
- package/dist/lib/help.d.ts.map +1 -0
- package/dist/lib/help.js +58 -0
- package/dist/lib/help.js.map +1 -0
- package/dist/lib/one-client.d.ts +43 -0
- package/dist/lib/one-client.d.ts.map +1 -0
- package/dist/lib/one-client.js +147 -0
- package/dist/lib/one-client.js.map +1 -0
- package/dist/lib/open-url.d.ts +25 -0
- package/dist/lib/open-url.d.ts.map +1 -0
- package/dist/lib/open-url.js +112 -0
- package/dist/lib/open-url.js.map +1 -0
- package/dist/lib/progress.d.ts +20 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +78 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Detect environments where opening a GUI browser is impossible/undesirable.
|
|
4
|
+
*/
|
|
5
|
+
export function isHeadlessEnvironment(env = process.env) {
|
|
6
|
+
if (env.VIGILBASE_CLI_NO_OPEN === '1')
|
|
7
|
+
return true;
|
|
8
|
+
if (env.CI === '1' || env.CI === 'true')
|
|
9
|
+
return true;
|
|
10
|
+
if (env.GITHUB_ACTIONS === 'true')
|
|
11
|
+
return true;
|
|
12
|
+
if (process.platform === 'linux' && !env.DISPLAY && !env.WAYLAND_DISPLAY) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
function commandExists(command) {
|
|
18
|
+
if (process.platform === 'win32') {
|
|
19
|
+
const result = spawnSync('where', [command], { encoding: 'utf8' });
|
|
20
|
+
return result.status === 0;
|
|
21
|
+
}
|
|
22
|
+
const result = spawnSync('sh', ['-c', `command -v ${JSON.stringify(command)}`], {
|
|
23
|
+
encoding: 'utf8',
|
|
24
|
+
});
|
|
25
|
+
return result.status === 0;
|
|
26
|
+
}
|
|
27
|
+
function launch(command, args) {
|
|
28
|
+
if (!commandExists(command))
|
|
29
|
+
return false;
|
|
30
|
+
try {
|
|
31
|
+
const child = spawn(command, args, { detached: true, stdio: 'ignore' });
|
|
32
|
+
child.on('error', () => undefined);
|
|
33
|
+
child.unref();
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Best-effort open of a URL in the user's default browser.
|
|
42
|
+
*/
|
|
43
|
+
export function openUrlInBrowser(url, env = process.env) {
|
|
44
|
+
if (env.VIGILBASE_CLI_NO_OPEN === '1') {
|
|
45
|
+
return { isOpened: false, reason: 'disabled' };
|
|
46
|
+
}
|
|
47
|
+
if (isHeadlessEnvironment(env)) {
|
|
48
|
+
return { isOpened: false, reason: 'headless' };
|
|
49
|
+
}
|
|
50
|
+
const platform = process.platform;
|
|
51
|
+
if (platform === 'darwin') {
|
|
52
|
+
return launch('open', [url])
|
|
53
|
+
? { isOpened: true }
|
|
54
|
+
: { isOpened: false, reason: 'failed' };
|
|
55
|
+
}
|
|
56
|
+
if (platform === 'win32') {
|
|
57
|
+
return launch('cmd', ['/c', 'start', '', url])
|
|
58
|
+
? { isOpened: true }
|
|
59
|
+
: { isOpened: false, reason: 'failed' };
|
|
60
|
+
}
|
|
61
|
+
if (platform === 'linux') {
|
|
62
|
+
for (const [cmd, args] of [
|
|
63
|
+
['xdg-open', [url]],
|
|
64
|
+
['gio', ['open', url]],
|
|
65
|
+
['sensible-browser', [url]],
|
|
66
|
+
['wslview', [url]],
|
|
67
|
+
]) {
|
|
68
|
+
if (launch(cmd, [...args]))
|
|
69
|
+
return { isOpened: true };
|
|
70
|
+
}
|
|
71
|
+
return { isOpened: false, reason: 'failed' };
|
|
72
|
+
}
|
|
73
|
+
return { isOpened: false, reason: 'unsupported' };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build the device-auth verification URL on the configured One origin.
|
|
77
|
+
* Ignores a mis-reported host so `vigilbase login` always opens Vigilbase One.
|
|
78
|
+
*/
|
|
79
|
+
/** Format user codes like ABCD-EFGH for easier reading aloud. */
|
|
80
|
+
export function formatUserCode(code) {
|
|
81
|
+
const compact = code.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();
|
|
82
|
+
if (compact.length === 8) {
|
|
83
|
+
return `${compact.slice(0, 4)}-${compact.slice(4)}`;
|
|
84
|
+
}
|
|
85
|
+
return compact || code;
|
|
86
|
+
}
|
|
87
|
+
export function resolveDeviceVerificationUrl(oneBaseUrl, device) {
|
|
88
|
+
const base = oneBaseUrl.replace(/\/+$/, '');
|
|
89
|
+
// Always pass the hyphenated code so the One UI can show ABCD-EFGH.
|
|
90
|
+
const prettyCode = formatUserCode(device.user_code);
|
|
91
|
+
const fallback = `${base}/device?user_code=${encodeURIComponent(prettyCode)}`;
|
|
92
|
+
const oneOrigin = new URL(base).origin;
|
|
93
|
+
const candidates = [
|
|
94
|
+
device.verification_uri_complete,
|
|
95
|
+
device.verification_uri,
|
|
96
|
+
].filter((value) => Boolean(value));
|
|
97
|
+
for (const candidate of candidates) {
|
|
98
|
+
try {
|
|
99
|
+
const parsed = new URL(candidate, `${base}/`);
|
|
100
|
+
if (parsed.origin !== oneOrigin)
|
|
101
|
+
continue;
|
|
102
|
+
// Force hyphenated form even if the server omitted the divider.
|
|
103
|
+
parsed.searchParams.set('user_code', prettyCode);
|
|
104
|
+
return parsed.toString();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// try next
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return fallback;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=open-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.js","sourceRoot":"","sources":["../../src/lib/open-url.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Writer } from './format.js';
|
|
2
|
+
export type ProgressHandle = {
|
|
3
|
+
stop: (finalMessage?: string) => void;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Live indeterminate progress on stderr while a scan/request is in flight.
|
|
7
|
+
* Disabled for --json, non-TTY, CI, and NO_COLOR-style quiet environments.
|
|
8
|
+
*/
|
|
9
|
+
export declare function startProgress(label: string, options: {
|
|
10
|
+
isEnabled: boolean;
|
|
11
|
+
stderr?: NodeJS.WritableStream;
|
|
12
|
+
/** Soft expected duration used to fill the bar (ms). */
|
|
13
|
+
expectedMs?: number;
|
|
14
|
+
}): ProgressHandle;
|
|
15
|
+
export declare function shouldShowProgress(mode: 'text' | 'json', env?: NodeJS.ProcessEnv, stderr?: {
|
|
16
|
+
isTTY?: boolean;
|
|
17
|
+
}): boolean;
|
|
18
|
+
/** Tiny helper so call sites stay readable. */
|
|
19
|
+
export declare function withProgress<T>(label: string, mode: 'text' | 'json', work: () => Promise<T>, writer?: Writer): Promise<T>;
|
|
20
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAKzC,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACtC,CAAA;AASD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IAC9B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GACA,cAAc,CAyChB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,MAAM,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAmB,GAC3C,OAAO,CAKT;AAED,+CAA+C;AAC/C,wBAAsB,YAAY,CAAC,CAAC,EAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAaZ"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
2
|
+
const BAR_WIDTH = 24;
|
|
3
|
+
function renderBar(ratio) {
|
|
4
|
+
const clamped = Math.max(0, Math.min(1, ratio));
|
|
5
|
+
const filled = Math.round(clamped * BAR_WIDTH);
|
|
6
|
+
const empty = BAR_WIDTH - filled;
|
|
7
|
+
return `${'█'.repeat(filled)}${'░'.repeat(empty)}`;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Live indeterminate progress on stderr while a scan/request is in flight.
|
|
11
|
+
* Disabled for --json, non-TTY, CI, and NO_COLOR-style quiet environments.
|
|
12
|
+
*/
|
|
13
|
+
export function startProgress(label, options) {
|
|
14
|
+
const stream = options.stderr ?? process.stderr;
|
|
15
|
+
if (!options.isEnabled) {
|
|
16
|
+
return { stop: () => undefined };
|
|
17
|
+
}
|
|
18
|
+
const expectedMs = options.expectedMs ?? 8_000;
|
|
19
|
+
const started = Date.now();
|
|
20
|
+
let frame = 0;
|
|
21
|
+
let closed = false;
|
|
22
|
+
const draw = () => {
|
|
23
|
+
if (closed)
|
|
24
|
+
return;
|
|
25
|
+
const elapsedMs = Date.now() - started;
|
|
26
|
+
const elapsedSec = (elapsedMs / 1000).toFixed(1);
|
|
27
|
+
// Ease toward ~90% at expectedMs, then creep slowly so we never hit 100% early.
|
|
28
|
+
const ratio = 1 - Math.exp(-elapsedMs / expectedMs);
|
|
29
|
+
const soft = Math.min(0.92, ratio);
|
|
30
|
+
const spin = SPINNER[frame % SPINNER.length];
|
|
31
|
+
frame += 1;
|
|
32
|
+
const line = `\r${spin} ${label} ${renderBar(soft)} ${elapsedSec}s`;
|
|
33
|
+
stream.write(line);
|
|
34
|
+
};
|
|
35
|
+
draw();
|
|
36
|
+
const timer = setInterval(draw, 80);
|
|
37
|
+
timer.unref?.();
|
|
38
|
+
return {
|
|
39
|
+
stop: (finalMessage) => {
|
|
40
|
+
if (closed)
|
|
41
|
+
return;
|
|
42
|
+
closed = true;
|
|
43
|
+
clearInterval(timer);
|
|
44
|
+
const elapsedSec = ((Date.now() - started) / 1000).toFixed(1);
|
|
45
|
+
const clear = `\r${' '.repeat(Math.max(60, label.length + BAR_WIDTH + 20))}\r`;
|
|
46
|
+
stream.write(clear);
|
|
47
|
+
if (finalMessage) {
|
|
48
|
+
stream.write(`${finalMessage} (${elapsedSec}s)\n`);
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function shouldShowProgress(mode, env = process.env, stderr = process.stderr) {
|
|
54
|
+
if (mode === 'json')
|
|
55
|
+
return false;
|
|
56
|
+
if (env.CI === '1' || env.CI === 'true')
|
|
57
|
+
return false;
|
|
58
|
+
if (env.VIGILBASE_CLI_NO_PROGRESS === '1')
|
|
59
|
+
return false;
|
|
60
|
+
return Boolean(stderr.isTTY);
|
|
61
|
+
}
|
|
62
|
+
/** Tiny helper so call sites stay readable. */
|
|
63
|
+
export async function withProgress(label, mode, work, writer) {
|
|
64
|
+
const progress = startProgress(label, {
|
|
65
|
+
isEnabled: shouldShowProgress(mode),
|
|
66
|
+
stderr: writer ? undefined : process.stderr,
|
|
67
|
+
});
|
|
68
|
+
try {
|
|
69
|
+
const result = await work();
|
|
70
|
+
progress.stop(`✓ ${label}`);
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
progress.stop(`✗ ${label}`);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type AgentToolDefinition = {
|
|
2
|
+
toolName: string;
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
targetDescription: string;
|
|
6
|
+
uiUrl: string;
|
|
7
|
+
skillUrl: string;
|
|
8
|
+
executeUrl: string;
|
|
9
|
+
};
|
|
10
|
+
export type AgentToolsCatalogResponse = {
|
|
11
|
+
success: boolean;
|
|
12
|
+
description?: string;
|
|
13
|
+
openapi?: string;
|
|
14
|
+
skillsIndex?: string;
|
|
15
|
+
tools: AgentToolDefinition[];
|
|
16
|
+
rateLimit?: {
|
|
17
|
+
windowSeconds: number;
|
|
18
|
+
maxRequests: number;
|
|
19
|
+
scope: string;
|
|
20
|
+
};
|
|
21
|
+
error?: string;
|
|
22
|
+
};
|
|
23
|
+
export type AgentToolExecuteResponse = {
|
|
24
|
+
success: boolean;
|
|
25
|
+
toolName?: string;
|
|
26
|
+
target?: string;
|
|
27
|
+
grade?: string | null;
|
|
28
|
+
gradeScore?: number | null;
|
|
29
|
+
result?: Record<string, unknown> | null;
|
|
30
|
+
error?: string | null;
|
|
31
|
+
uiUrl?: string;
|
|
32
|
+
skillUrl?: string;
|
|
33
|
+
retryAfterSec?: number;
|
|
34
|
+
toolsUrl?: string;
|
|
35
|
+
skillsIndex?: string;
|
|
36
|
+
};
|
|
37
|
+
export type CliOutputMode = 'text' | 'json';
|
|
38
|
+
export type ExitCode = 0 | 1 | 2;
|
|
39
|
+
/** Exit codes used by the CLI. Documented for agents. */
|
|
40
|
+
export declare const EXIT: {
|
|
41
|
+
OK: 0;
|
|
42
|
+
ERROR: 1;
|
|
43
|
+
RATE_LIMITED: 2;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IAEtC,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,mBAAmB,EAAE,CAAA;IAC5B,SAAS,CAAC,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,MAAM,CAAA;QACnB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IAErC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;AAE3C,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAEhC,yDAAyD;AACzD,eAAO,MAAM,IAAI;;;;CAIhB,CAAA"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA6CA,yDAAyD;AACzD,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAU;IACd,KAAK,EAAE,CAAU;IACjB,YAAY,EAAE,CAAU;CACzB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vigilbase/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Vigilbase CLI — security scanners, agent tools, and Vigilbase One from the terminal.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"vigilbase",
|
|
7
|
+
"cli",
|
|
8
|
+
"agent",
|
|
9
|
+
"security-headers",
|
|
10
|
+
"email-security",
|
|
11
|
+
"vigilbase-one",
|
|
12
|
+
"device-authorization"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://vigilbase.com",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/vigilbase/vigilbase/issues"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/vigilbase/vigilbase.git",
|
|
21
|
+
"directory": "packages/cli"
|
|
22
|
+
},
|
|
23
|
+
"author": "Vigilbase",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"bin": {
|
|
27
|
+
"vigilbase": "./dist/bin.js"
|
|
28
|
+
},
|
|
29
|
+
"main": "./dist/index.js",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md",
|
|
40
|
+
"LICENSE"
|
|
41
|
+
],
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public",
|
|
44
|
+
"registry": "https://registry.npmjs.org/"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=20"
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsc -p tsconfig.build.json",
|
|
52
|
+
"clean": "rm -rf dist",
|
|
53
|
+
"dev": "tsx src/bin.ts",
|
|
54
|
+
"link:global": "pnpm run build && node ./scripts/link-global.mjs",
|
|
55
|
+
"unlink:global": "node ./scripts/unlink-global.mjs",
|
|
56
|
+
"lint": "tsc --noEmit -p tsconfig.json",
|
|
57
|
+
"prepublishOnly": "pnpm run build",
|
|
58
|
+
"start": "node dist/bin.js",
|
|
59
|
+
"test": "vitest run",
|
|
60
|
+
"smoke:e2e": "pnpm run build && node ./scripts/smoke-e2e.mjs",
|
|
61
|
+
"vigilbase": "tsx src/bin.ts"
|
|
62
|
+
},
|
|
63
|
+
"preferGlobal": true,
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@types/node": "^22.15.21",
|
|
66
|
+
"tsx": "^4.20.3",
|
|
67
|
+
"typescript": "^5.9.3",
|
|
68
|
+
"vitest": "^4.1.9"
|
|
69
|
+
}
|
|
70
|
+
}
|