@vaultcompass/vault-guard 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/dist/__tests__/integration/proxy-test-helpers.d.ts +47 -0
- package/dist/__tests__/integration/proxy-test-helpers.d.ts.map +1 -0
- package/dist/__tests__/integration/proxy-test-helpers.js +146 -0
- package/dist/__tests__/integration/proxy-test-helpers.js.map +1 -0
- package/dist/cli-entry.d.ts +3 -0
- package/dist/cli-entry.d.ts.map +1 -0
- package/dist/cli-entry.js +15 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +241 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/check.d.ts +2 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +40 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +57 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/data.d.ts +67 -0
- package/dist/commands/data.d.ts.map +1 -0
- package/dist/commands/data.js +294 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/fix.d.ts +2 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +80 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/index.d.ts +11 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +26 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install-hook.d.ts +3 -0
- package/dist/commands/install-hook.d.ts.map +1 -0
- package/dist/commands/install-hook.js +31 -0
- package/dist/commands/install-hook.js.map +1 -0
- package/dist/commands/monitor.d.ts +2 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +23 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/commands/proxy.d.ts +68 -0
- package/dist/commands/proxy.d.ts.map +1 -0
- package/dist/commands/proxy.js +445 -0
- package/dist/commands/proxy.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 +156 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/statusline.d.ts +2 -0
- package/dist/commands/statusline.d.ts.map +1 -0
- package/dist/commands/statusline.js +34 -0
- package/dist/commands/statusline.js.map +1 -0
- package/dist/commands/suggest-model.d.ts +6 -0
- package/dist/commands/suggest-model.d.ts.map +1 -0
- package/dist/commands/suggest-model.js +38 -0
- package/dist/commands/suggest-model.js.map +1 -0
- package/dist/commands/tokens.d.ts +2 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +22 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/scan-utils.d.ts +65 -0
- package/dist/utils/scan-utils.d.ts.map +1 -0
- package/dist/utils/scan-utils.js +333 -0
- package/dist/utils/scan-utils.js.map +1 -0
- package/package.json +56 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Vault & Compass LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for proxy integration tests.
|
|
3
|
+
*
|
|
4
|
+
* Each test file that uses these helpers must call `jest.mock('https')`
|
|
5
|
+
* at the module level (Jest hoists it before imports, ensuring proxy.ts
|
|
6
|
+
* gets the mocked version when it requires 'https').
|
|
7
|
+
*
|
|
8
|
+
* Usage in a test file:
|
|
9
|
+
* jest.mock('https');
|
|
10
|
+
* import * as https from 'https';
|
|
11
|
+
* // Then call setupUpstreamMock(https, { ... }) inside each test.
|
|
12
|
+
*/
|
|
13
|
+
import * as http from 'http';
|
|
14
|
+
export interface MockUpstreamOptions {
|
|
15
|
+
statusCode?: number;
|
|
16
|
+
contentType?: string;
|
|
17
|
+
body?: Buffer | string;
|
|
18
|
+
/** Milliseconds before the response body is emitted (simulate slow upstream). */
|
|
19
|
+
delayMs?: number;
|
|
20
|
+
/** If true, never emit 'end' โ simulate a hung upstream. */
|
|
21
|
+
hang?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Configure the already-mocked `https` module to behave as a specific upstream.
|
|
25
|
+
*
|
|
26
|
+
* @param mockHttps The `https` module, which must have been replaced by
|
|
27
|
+
* `jest.mock('https')` before this file was imported.
|
|
28
|
+
* @param opts Upstream response options.
|
|
29
|
+
* @returns Arrays of captured request options and headers, populated
|
|
30
|
+
* on each upstream call.
|
|
31
|
+
*/
|
|
32
|
+
export declare function setupUpstreamMock(mockHttps: {
|
|
33
|
+
request: jest.Mock;
|
|
34
|
+
}, opts?: MockUpstreamOptions): {
|
|
35
|
+
capturedOpts: http.RequestOptions[];
|
|
36
|
+
capturedHeaders: Record<string, string | string[] | undefined>[];
|
|
37
|
+
};
|
|
38
|
+
export interface RequestResult {
|
|
39
|
+
status: number;
|
|
40
|
+
body: string;
|
|
41
|
+
headers: http.IncomingHttpHeaders;
|
|
42
|
+
}
|
|
43
|
+
/** Make a POST request to the local proxy (not the upstream). */
|
|
44
|
+
export declare function postToProxy(port: number, urlPath: string, body: string | object, extraHeaders?: Record<string, string>): Promise<RequestResult>;
|
|
45
|
+
/** Create a fresh temp dir and return a sqlite path inside it. */
|
|
46
|
+
export declare function makeTmpDbPath(): string;
|
|
47
|
+
//# sourceMappingURL=proxy-test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-test-helpers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/proxy-test-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAW7B,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAOD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE;IAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAA;CAAE,EACjC,IAAI,GAAE,mBAAwB,GAC7B;IACD,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;CAClE,CAuDA;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC;CACnC;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACxC,OAAO,CAAC,aAAa,CAAC,CAkCxB;AAMD,kEAAkE;AAClE,wBAAgB,aAAa,IAAI,MAAM,CAGtC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.setupUpstreamMock = setupUpstreamMock;
|
|
40
|
+
exports.postToProxy = postToProxy;
|
|
41
|
+
exports.makeTmpDbPath = makeTmpDbPath;
|
|
42
|
+
/**
|
|
43
|
+
* Shared helpers for proxy integration tests.
|
|
44
|
+
*
|
|
45
|
+
* Each test file that uses these helpers must call `jest.mock('https')`
|
|
46
|
+
* at the module level (Jest hoists it before imports, ensuring proxy.ts
|
|
47
|
+
* gets the mocked version when it requires 'https').
|
|
48
|
+
*
|
|
49
|
+
* Usage in a test file:
|
|
50
|
+
* jest.mock('https');
|
|
51
|
+
* import * as https from 'https';
|
|
52
|
+
* // Then call setupUpstreamMock(https, { ... }) inside each test.
|
|
53
|
+
*/
|
|
54
|
+
const http = __importStar(require("http"));
|
|
55
|
+
const events_1 = require("events");
|
|
56
|
+
const stream_1 = require("stream");
|
|
57
|
+
const os_1 = __importDefault(require("os"));
|
|
58
|
+
const path_1 = __importDefault(require("path"));
|
|
59
|
+
const fs_1 = __importDefault(require("fs"));
|
|
60
|
+
/**
|
|
61
|
+
* Configure the already-mocked `https` module to behave as a specific upstream.
|
|
62
|
+
*
|
|
63
|
+
* @param mockHttps The `https` module, which must have been replaced by
|
|
64
|
+
* `jest.mock('https')` before this file was imported.
|
|
65
|
+
* @param opts Upstream response options.
|
|
66
|
+
* @returns Arrays of captured request options and headers, populated
|
|
67
|
+
* on each upstream call.
|
|
68
|
+
*/
|
|
69
|
+
function setupUpstreamMock(mockHttps, opts = {}) {
|
|
70
|
+
const capturedOpts = [];
|
|
71
|
+
const capturedHeaders = [];
|
|
72
|
+
const { statusCode = 200, contentType = 'application/json', body = Buffer.from('{}'), delayMs = 0, hang = false, } = opts;
|
|
73
|
+
const bodyBuf = typeof body === 'string' ? Buffer.from(body) : body;
|
|
74
|
+
mockHttps.request.mockImplementation((reqOpts, callback) => {
|
|
75
|
+
capturedOpts.push(reqOpts);
|
|
76
|
+
capturedHeaders.push((reqOpts.headers ?? {}));
|
|
77
|
+
const mockReq = new events_1.EventEmitter();
|
|
78
|
+
mockReq.write = jest.fn(() => true);
|
|
79
|
+
mockReq.end = jest.fn(() => {
|
|
80
|
+
if (!callback)
|
|
81
|
+
return;
|
|
82
|
+
const res = Object.assign(new stream_1.Readable({ read() { } }), {
|
|
83
|
+
statusCode,
|
|
84
|
+
headers: { 'content-type': contentType },
|
|
85
|
+
});
|
|
86
|
+
if (hang) {
|
|
87
|
+
callback(res);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
callback(res);
|
|
91
|
+
const emit = () => {
|
|
92
|
+
res.push(bodyBuf);
|
|
93
|
+
res.push(null);
|
|
94
|
+
};
|
|
95
|
+
if (delayMs > 0) {
|
|
96
|
+
setTimeout(emit, delayMs);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
process.nextTick(emit);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return mockReq;
|
|
103
|
+
});
|
|
104
|
+
return { capturedOpts, capturedHeaders };
|
|
105
|
+
}
|
|
106
|
+
/** Make a POST request to the local proxy (not the upstream). */
|
|
107
|
+
function postToProxy(port, urlPath, body, extraHeaders = {}) {
|
|
108
|
+
const bodyStr = typeof body === 'string' ? body : JSON.stringify(body);
|
|
109
|
+
const bodyBuf = Buffer.from(bodyStr);
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
const req = http.request({
|
|
112
|
+
hostname: '127.0.0.1',
|
|
113
|
+
port,
|
|
114
|
+
path: urlPath,
|
|
115
|
+
method: 'POST',
|
|
116
|
+
headers: {
|
|
117
|
+
'content-type': 'application/json',
|
|
118
|
+
'content-length': String(bodyBuf.length),
|
|
119
|
+
...extraHeaders,
|
|
120
|
+
},
|
|
121
|
+
}, res => {
|
|
122
|
+
const chunks = [];
|
|
123
|
+
res.on('data', (c) => chunks.push(c));
|
|
124
|
+
res.on('end', () => {
|
|
125
|
+
resolve({
|
|
126
|
+
status: res.statusCode ?? 0,
|
|
127
|
+
body: Buffer.concat(chunks).toString('utf8'),
|
|
128
|
+
headers: res.headers,
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
res.on('error', reject);
|
|
132
|
+
});
|
|
133
|
+
req.on('error', reject);
|
|
134
|
+
req.write(bodyBuf);
|
|
135
|
+
req.end();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// Temp DB helpers โ each test suite gets a fresh isolated DB path
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
/** Create a fresh temp dir and return a sqlite path inside it. */
|
|
142
|
+
function makeTmpDbPath() {
|
|
143
|
+
const dir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'vg-proxy-test-'));
|
|
144
|
+
return path_1.default.join(dir, 'test.sqlite');
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=proxy-test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-test-helpers.js","sourceRoot":"","sources":["../../../src/__tests__/integration/proxy-test-helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,8CA6DC;AAaD,kCAuCC;AAOD,sCAGC;AA1KD;;;;;;;;;;;GAWG;AACH,2CAA6B;AAC7B,mCAAsC;AACtC,mCAAkC;AAClC,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAqBpB;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAC/B,SAAiC,EACjC,OAA4B,EAAE;IAK9B,MAAM,YAAY,GAA0B,EAAE,CAAC;IAC/C,MAAM,eAAe,GAAoD,EAAE,CAAC;IAE5E,MAAM,EACJ,UAAU,GAAG,GAAG,EAChB,WAAW,GAAG,kBAAkB,EAChC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EACxB,OAAO,GAAG,CAAC,EACX,IAAI,GAAG,KAAK,GACb,GAAG,IAAI,CAAC;IAET,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpE,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAClC,CAAC,OAA4B,EAAE,QAA8C,EAAE,EAAE;QAC/E,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,eAAe,CAAC,IAAI,CAClB,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAkD,CACzE,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,qBAAY,EAAuB,CAAC;QACxD,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACzB,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAEtB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,iBAAQ,CAAC,EAAE,IAAI,KAAI,CAAC,EAAE,CAAC,EAAE;gBACrD,UAAU;gBACV,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAA4B;aACnE,CAAyB,CAAC;YAE3B,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEd,MAAM,IAAI,GAAG,GAAG,EAAE;gBAChB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAClB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC,CAAC;YAEF,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC,CACF,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;AAC3C,CAAC;AAYD,iEAAiE;AACjE,SAAgB,WAAW,CACzB,IAAY,EACZ,OAAe,EACf,IAAqB,EACrB,eAAuC,EAAE;IAEzC,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB;YACE,QAAQ,EAAE,WAAW;YACrB,IAAI;YACJ,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBACxC,GAAG,YAAY;aAChB;SACF,EACD,GAAG,CAAC,EAAE;YACJ,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,OAAO,CAAC;oBACN,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;oBAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC5C,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,kEAAkE;AAClE,SAAgB,aAAa;IAC3B,MAAM,GAAG,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACrE,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-entry.d.ts","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const cli_1 = require("./cli");
|
|
5
|
+
const program = (0, cli_1.buildCli)();
|
|
6
|
+
// Parse arguments and execute command
|
|
7
|
+
program.parseAsync().then(() => {
|
|
8
|
+
// Successful completion
|
|
9
|
+
process.exit(0);
|
|
10
|
+
}).catch((error) => {
|
|
11
|
+
// Handle errors
|
|
12
|
+
console.error(error);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=cli-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":";;;AAEA,+BAAiC;AAEjC,MAAM,OAAO,GAAG,IAAA,cAAQ,GAAE,CAAC;AAE3B,sCAAsC;AACtC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IAC7B,wBAAwB;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACjB,gBAAgB;IAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,QAAQ,IAAI,OAAO,CAkOlC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.buildCli = buildCli;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const commander_1 = require("commander");
|
|
40
|
+
const scan_1 = require("./commands/scan");
|
|
41
|
+
const install_hook_1 = require("./commands/install-hook");
|
|
42
|
+
const tokens_1 = require("./commands/tokens");
|
|
43
|
+
const fix_1 = require("./commands/fix");
|
|
44
|
+
const check_1 = require("./commands/check");
|
|
45
|
+
const statusline_1 = require("./commands/statusline");
|
|
46
|
+
const suggest_model_1 = require("./commands/suggest-model");
|
|
47
|
+
const proxy_1 = require("./commands/proxy");
|
|
48
|
+
const data_1 = require("./commands/data");
|
|
49
|
+
const config_1 = require("./commands/config");
|
|
50
|
+
function readCliVersion() {
|
|
51
|
+
const pkgPath = path.join(__dirname, '..', 'package.json');
|
|
52
|
+
const raw = fs.readFileSync(pkgPath, 'utf-8');
|
|
53
|
+
return JSON.parse(raw).version;
|
|
54
|
+
}
|
|
55
|
+
function buildCli() {
|
|
56
|
+
const program = new commander_1.Command();
|
|
57
|
+
program
|
|
58
|
+
.name('vault-guard')
|
|
59
|
+
.description('Security and optimization layer for AI-native coding')
|
|
60
|
+
.version(readCliVersion());
|
|
61
|
+
const configCmd = program.command('config').description('Inspect and validate Vault Guard configuration');
|
|
62
|
+
configCmd
|
|
63
|
+
.command('validate')
|
|
64
|
+
.description('Validate the nearest .vault-guard.json (structure + scanner load)')
|
|
65
|
+
.action(async () => {
|
|
66
|
+
const exitCode = await (0, config_1.configValidateCommand)(process.cwd());
|
|
67
|
+
if (exitCode !== 0)
|
|
68
|
+
process.exit(exitCode);
|
|
69
|
+
});
|
|
70
|
+
// Scan command
|
|
71
|
+
program
|
|
72
|
+
.command('scan')
|
|
73
|
+
.description('Scan files for secrets')
|
|
74
|
+
.argument('[path]', 'Path to scan', '.')
|
|
75
|
+
.option('-f, --format <format>', 'Output format: text | json | sarif', 'text')
|
|
76
|
+
.option('--staged', 'Scan git staged files only (uses index vs HEAD)', false)
|
|
77
|
+
.action(async (path, options) => {
|
|
78
|
+
const format = options.format ?? 'text';
|
|
79
|
+
const exitCode = await (0, scan_1.scanCommand)(path, format, Boolean(options.staged));
|
|
80
|
+
if (exitCode !== 0) {
|
|
81
|
+
process.exit(exitCode);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// Install-hook command
|
|
85
|
+
program
|
|
86
|
+
.command('install-hook')
|
|
87
|
+
.description('Install pre-commit hook (runs vault-guard scan --staged)')
|
|
88
|
+
.option('-m, --manager <manager>', 'Hook integration: native | husky | lefthook | precommit', 'native')
|
|
89
|
+
.action(async (options) => {
|
|
90
|
+
const m = (options.manager ?? 'native').toLowerCase();
|
|
91
|
+
if (!['native', 'husky', 'lefthook', 'precommit'].includes(m)) {
|
|
92
|
+
console.error(`Unknown manager: ${options.manager}`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
await (0, install_hook_1.installHookCommand)(m);
|
|
96
|
+
});
|
|
97
|
+
// Tokens command
|
|
98
|
+
program
|
|
99
|
+
.command('tokens')
|
|
100
|
+
.description('Show token usage')
|
|
101
|
+
.action(async () => {
|
|
102
|
+
await (0, tokens_1.tokensCommand)();
|
|
103
|
+
});
|
|
104
|
+
// Fix command
|
|
105
|
+
program
|
|
106
|
+
.command('fix')
|
|
107
|
+
.description('Show remediation steps for secrets')
|
|
108
|
+
.argument('[files...]', 'Files to check')
|
|
109
|
+
.action(async (files) => {
|
|
110
|
+
const exitCode = await (0, fix_1.fixCommand)(files);
|
|
111
|
+
if (exitCode !== 0) {
|
|
112
|
+
process.exit(exitCode);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
// Check command
|
|
116
|
+
program
|
|
117
|
+
.command('check')
|
|
118
|
+
.description('Quick check')
|
|
119
|
+
.argument('[files...]', 'Files to check')
|
|
120
|
+
.action(async (files) => {
|
|
121
|
+
const exitCode = await (0, check_1.checkCommand)(files);
|
|
122
|
+
if (exitCode !== 0) {
|
|
123
|
+
process.exit(exitCode);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
program
|
|
127
|
+
.command('statusline')
|
|
128
|
+
.description('Emit status fields for editor statuslines (JSON)')
|
|
129
|
+
.option('--json', 'Print machine-readable JSON (default)', true)
|
|
130
|
+
.option('--human', 'Print human-readable summary instead of JSON')
|
|
131
|
+
.action((options) => {
|
|
132
|
+
const asJson = options.human ? false : options.json !== false;
|
|
133
|
+
(0, statusline_1.statuslineCommand)(asJson);
|
|
134
|
+
});
|
|
135
|
+
program
|
|
136
|
+
.command('suggest-model')
|
|
137
|
+
.description('Heuristic model hint from local telemetry (opt-in)')
|
|
138
|
+
.option('--json', 'Print JSON', false)
|
|
139
|
+
.option('--cwd <dir>', 'Optional cwd context label')
|
|
140
|
+
.option('--language <lang>', 'Optional language label (e.g. tsx)')
|
|
141
|
+
.action((options) => {
|
|
142
|
+
(0, suggest_model_1.suggestModelCommand)({
|
|
143
|
+
json: Boolean(options.json),
|
|
144
|
+
cwd: options.cwd,
|
|
145
|
+
language: options.language,
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
program
|
|
149
|
+
.command('proxy')
|
|
150
|
+
.description('Opt-in local Anthropic HTTP forwarder with usage logging (MVP)')
|
|
151
|
+
.requiredOption('--listen <host:port>', 'Bind address, e.g. 127.0.0.1:8765')
|
|
152
|
+
.option('--allow-env-fallback', 'Permit fallback to ANTHROPIC_API_KEY when caller omits x-api-key. ' +
|
|
153
|
+
'Off by default โ see SECURITY.md before enabling.', false)
|
|
154
|
+
.option('--allow-public', 'Permit binding a non-loopback address. Off by default โ exposing this ' +
|
|
155
|
+
'proxy on the network combined with --allow-env-fallback is a credit-card ' +
|
|
156
|
+
'draining footgun.', false)
|
|
157
|
+
.option('--max-rpm <n>', 'Optional cap on forwarded POST /v1/messages requests per rolling 60s window (per process)')
|
|
158
|
+
.action(async (options) => {
|
|
159
|
+
try {
|
|
160
|
+
let maxRpm;
|
|
161
|
+
if (options.maxRpm !== undefined && options.maxRpm !== '') {
|
|
162
|
+
const n = Number(options.maxRpm);
|
|
163
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
164
|
+
console.error('--max-rpm must be a positive number');
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
maxRpm = Math.floor(n);
|
|
168
|
+
}
|
|
169
|
+
const handle = await (0, proxy_1.proxyCommand)({
|
|
170
|
+
listen: options.listen,
|
|
171
|
+
allowEnvFallback: Boolean(options.allowEnvFallback),
|
|
172
|
+
allowPublic: Boolean(options.allowPublic),
|
|
173
|
+
maxRpm,
|
|
174
|
+
});
|
|
175
|
+
let signalled = false;
|
|
176
|
+
const onSignal = (signal) => {
|
|
177
|
+
if (signalled)
|
|
178
|
+
return;
|
|
179
|
+
signalled = true;
|
|
180
|
+
void handle
|
|
181
|
+
.shutdown(signal)
|
|
182
|
+
.catch(() => {
|
|
183
|
+
/* shutdown is best-effort */
|
|
184
|
+
})
|
|
185
|
+
.finally(() => process.exit(0));
|
|
186
|
+
};
|
|
187
|
+
process.on('SIGINT', onSignal);
|
|
188
|
+
process.on('SIGTERM', onSignal);
|
|
189
|
+
await new Promise(() => {
|
|
190
|
+
/* keep process alive until a signal triggers shutdown */
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
console.error(String(e));
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
// `data` parent command โ inspects, exports, and resets the local
|
|
199
|
+
// telemetry database at `~/.vault-guard/usage.sqlite`. No subcommand
|
|
200
|
+
// shows help; this avoids an empty command landing.
|
|
201
|
+
const dataCmd = program
|
|
202
|
+
.command('data')
|
|
203
|
+
.description('Inspect, export, or reset local telemetry (~/.vault-guard/usage.sqlite)');
|
|
204
|
+
dataCmd
|
|
205
|
+
.command('status')
|
|
206
|
+
.description('Show a privacy-respecting summary of the local telemetry database')
|
|
207
|
+
.option('--json', 'Print JSON', false)
|
|
208
|
+
.action(async (options) => {
|
|
209
|
+
const exitCode = await (0, data_1.dataStatusCommand)({ json: Boolean(options.json) });
|
|
210
|
+
if (exitCode !== 0)
|
|
211
|
+
process.exit(exitCode);
|
|
212
|
+
});
|
|
213
|
+
dataCmd
|
|
214
|
+
.command('reset')
|
|
215
|
+
.description('Delete the local telemetry database and its WAL/SHM sidecars')
|
|
216
|
+
.option('-y, --yes', 'Skip the interactive confirmation prompt', false)
|
|
217
|
+
.option('--dry-run', 'Print what would be deleted without touching the filesystem', false)
|
|
218
|
+
.option('--json', 'Print JSON', false)
|
|
219
|
+
.action(async (options) => {
|
|
220
|
+
const exitCode = await (0, data_1.dataResetCommand)({
|
|
221
|
+
yes: Boolean(options.yes),
|
|
222
|
+
dryRun: Boolean(options.dryRun),
|
|
223
|
+
json: Boolean(options.json),
|
|
224
|
+
});
|
|
225
|
+
if (exitCode !== 0)
|
|
226
|
+
process.exit(exitCode);
|
|
227
|
+
});
|
|
228
|
+
dataCmd
|
|
229
|
+
.command('export')
|
|
230
|
+
.description('Dump usage_events and session_events to a local file')
|
|
231
|
+
.requiredOption('-o, --output <file>', 'Output file path (will be created with mode 0600)')
|
|
232
|
+
.option('--format <format>', 'Output format: json | jsonl', 'json')
|
|
233
|
+
.action(async (options) => {
|
|
234
|
+
const fmt = options.format === 'jsonl' ? 'jsonl' : 'json';
|
|
235
|
+
const exitCode = await (0, data_1.dataExportCommand)({ output: options.output, format: fmt });
|
|
236
|
+
if (exitCode !== 0)
|
|
237
|
+
process.exit(exitCode);
|
|
238
|
+
});
|
|
239
|
+
return program;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BnE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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.checkCommand = checkCommand;
|
|
7
|
+
const vault_guard_core_1 = require("@vaultcompass/vault-guard-core");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const scan_utils_1 = require("../utils/scan-utils");
|
|
11
|
+
async function checkCommand(files) {
|
|
12
|
+
const scanner = new vault_guard_core_1.SecretScanner();
|
|
13
|
+
const filesToCheck = files.length > 0 ? files : ['.'];
|
|
14
|
+
console.log(chalk_1.default.blue('โ
Quick check\n'));
|
|
15
|
+
// Use async scanning logic with same safeguards as scan command
|
|
16
|
+
const results = await (0, scan_utils_1.scanFilesAsync)(filesToCheck, scanner, {
|
|
17
|
+
verbose: false,
|
|
18
|
+
skipBinary: true,
|
|
19
|
+
progress: false
|
|
20
|
+
});
|
|
21
|
+
if (results.length === 0) {
|
|
22
|
+
console.log(chalk_1.default.green.bold('โ
Clean:'), chalk_1.default.white('No secrets found\n'));
|
|
23
|
+
return 0; // Success exit code
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const totalSecrets = results.reduce((sum, r) => sum + r.matches.length, 0);
|
|
27
|
+
console.log(chalk_1.default.red.bold('๐ด BLOCKED:'), chalk_1.default.white(`Found ${totalSecrets} secret${totalSecrets > 1 ? 's' : ''}\n`));
|
|
28
|
+
// Display simplified results
|
|
29
|
+
for (const { file, matches } of results) {
|
|
30
|
+
const relativePath = relativePathCwd(file);
|
|
31
|
+
console.log(chalk_1.default.red('๐ด'), chalk_1.default.white(`${relativePath}: ${matches.length} secret${matches.length > 1 ? 's' : ''}`));
|
|
32
|
+
}
|
|
33
|
+
console.log('');
|
|
34
|
+
return 1; // Error exit code (secrets found)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function relativePathCwd(filePath) {
|
|
38
|
+
return path_1.default.relative(process.cwd(), filePath);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":";;;;;AAKA,oCA6BC;AAlCD,qEAA+D;AAC/D,kDAA0B;AAC1B,gDAAwB;AACxB,oDAAqD;AAE9C,KAAK,UAAU,YAAY,CAAC,KAAe;IAChD,MAAM,OAAO,GAAG,IAAI,gCAAa,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAE3C,gEAAgE;IAChE,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAc,EAAC,YAAY,EAAE,OAAO,EAAE;QAC1D,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC,CAAC,oBAAoB;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,SAAS,YAAY,UAAU,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAExH,6BAA6B;QAC7B,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,CAAC;YACxC,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACzH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,CAAC,CAAC,kCAAkC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate the nearest `.vault-guard.json` / `.vault-guard.local.json`.
|
|
3
|
+
* Exits 0 when missing (nothing to validate) or when structurally valid.
|
|
4
|
+
*/
|
|
5
|
+
export declare function configValidateCommand(cwd?: string): Promise<number>;
|
|
6
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CxF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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.configValidateCommand = configValidateCommand;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const vault_guard_core_1 = require("@vaultcompass/vault-guard-core");
|
|
10
|
+
/**
|
|
11
|
+
* Validate the nearest `.vault-guard.json` / `.vault-guard.local.json`.
|
|
12
|
+
* Exits 0 when missing (nothing to validate) or when structurally valid.
|
|
13
|
+
*/
|
|
14
|
+
async function configValidateCommand(cwd = process.cwd()) {
|
|
15
|
+
const configPath = (0, vault_guard_core_1.findVaultGuardConfigPath)(cwd);
|
|
16
|
+
if (!configPath) {
|
|
17
|
+
console.log(chalk_1.default.green('โ'), chalk_1.default.white('No Vault Guard config file in search path โ nothing to validate.'));
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
let raw;
|
|
21
|
+
try {
|
|
22
|
+
raw = fs_1.default.readFileSync(configPath, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
const detail = e instanceof Error ? e.message : String(e);
|
|
26
|
+
console.error(chalk_1.default.red('โ'), chalk_1.default.white(`Failed to read ${configPath}: ${detail}`));
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
let parsed;
|
|
30
|
+
try {
|
|
31
|
+
parsed = JSON.parse(raw);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
const detail = e instanceof Error ? e.message : String(e);
|
|
35
|
+
console.error(chalk_1.default.red('โ'), chalk_1.default.white(`Invalid JSON in ${configPath}: ${detail}`));
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
const v = (0, vault_guard_core_1.validateVaultGuardConfig)(parsed);
|
|
39
|
+
if (!v.ok) {
|
|
40
|
+
console.error(chalk_1.default.red('โ'), chalk_1.default.white(configPath));
|
|
41
|
+
for (const err of v.errors) {
|
|
42
|
+
console.error(chalk_1.default.gray(' ยท'), chalk_1.default.white(err));
|
|
43
|
+
}
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
const scanner = new vault_guard_core_1.SecretScanner(v.config);
|
|
47
|
+
if (scanner.extraPatternRejections.length > 0) {
|
|
48
|
+
console.error(chalk_1.default.yellow('โ '), chalk_1.default.white('Some extra_patterns were rejected and are not active:'));
|
|
49
|
+
for (const r of scanner.extraPatternRejections) {
|
|
50
|
+
console.error(chalk_1.default.gray(' ยท'), chalk_1.default.white(`${r.id}: ${r.reason} โ ${r.detail}`));
|
|
51
|
+
}
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
console.log(chalk_1.default.green('โ'), chalk_1.default.white(`${configPath} is valid.`));
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;;;;AAYA,sDA6CC;AAzDD,4CAAoB;AACpB,kDAA0B;AAC1B,qEAIwC;AAExC;;;GAGG;AACI,KAAK,UAAU,qBAAqB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACrE,MAAM,UAAU,GAAG,IAAA,2CAAwB,EAAC,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC,CAAC;QAC/G,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,kBAAkB,UAAU,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,mBAAmB,UAAU,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,GAAG,IAAA,2CAAwB,EAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,gCAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACvG,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,GAAG,UAAU,YAAY,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,CAAC;AACX,CAAC"}
|