@indicated/vibeguard 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/.claude/settings.local.json +5 -0
- package/.github/workflows/ci.yml +65 -0
- package/.github/workflows/release.yml +85 -0
- package/PROGRESS.md +192 -0
- package/README.md +183 -0
- package/dist/api/license.d.ts +13 -0
- package/dist/api/license.d.ts.map +1 -0
- package/dist/api/license.js +138 -0
- package/dist/api/license.js.map +1 -0
- package/dist/api/rules.d.ts +13 -0
- package/dist/api/rules.d.ts.map +1 -0
- package/dist/api/rules.js +57 -0
- package/dist/api/rules.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +145 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +4 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +121 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +3 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +14 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +3 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +52 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +114 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/config.d.ts +4 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +88 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +25 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +15 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +152 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +188 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/scanner/index.d.ts +15 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +207 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/parsers/javascript.d.ts +12 -0
- package/dist/scanner/parsers/javascript.d.ts.map +1 -0
- package/dist/scanner/parsers/javascript.js +266 -0
- package/dist/scanner/parsers/javascript.js.map +1 -0
- package/dist/scanner/parsers/python.d.ts +3 -0
- package/dist/scanner/parsers/python.d.ts.map +1 -0
- package/dist/scanner/parsers/python.js +108 -0
- package/dist/scanner/parsers/python.js.map +1 -0
- package/dist/scanner/rules/definitions.d.ts +5 -0
- package/dist/scanner/rules/definitions.d.ts.map +1 -0
- package/dist/scanner/rules/definitions.js +584 -0
- package/dist/scanner/rules/definitions.js.map +1 -0
- package/dist/scanner/rules/loader.d.ts +8 -0
- package/dist/scanner/rules/loader.d.ts.map +1 -0
- package/dist/scanner/rules/loader.js +45 -0
- package/dist/scanner/rules/loader.js.map +1 -0
- package/dist/scanner/rules/matcher.d.ts +11 -0
- package/dist/scanner/rules/matcher.d.ts.map +1 -0
- package/dist/scanner/rules/matcher.js +53 -0
- package/dist/scanner/rules/matcher.js.map +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
- package/src/api/license.ts +120 -0
- package/src/api/rules.ts +70 -0
- package/src/cli/commands/init.ts +123 -0
- package/src/cli/commands/login.ts +92 -0
- package/src/cli/commands/mcp.ts +12 -0
- package/src/cli/commands/rules.ts +58 -0
- package/src/cli/commands/scan.ts +94 -0
- package/src/cli/config.ts +54 -0
- package/src/cli/index.ts +28 -0
- package/src/cli/output.ts +159 -0
- package/src/mcp/server.ts +195 -0
- package/src/scanner/index.ts +195 -0
- package/src/scanner/parsers/javascript.ts +285 -0
- package/src/scanner/parsers/python.ts +126 -0
- package/src/scanner/rules/definitions.ts +592 -0
- package/src/scanner/rules/loader.ts +59 -0
- package/src/scanner/rules/matcher.ts +68 -0
- package/src/types.ts +36 -0
- package/test-samples/secure.js +52 -0
- package/test-samples/vulnerable.js +56 -0
- package/test-samples/vulnerable.py +39 -0
- package/tests/helpers.ts +43 -0
- package/tests/rules/critical.test.ts +186 -0
- package/tests/rules/definitions.test.ts +167 -0
- package/tests/rules/high.test.ts +377 -0
- package/tests/rules/low.test.ts +172 -0
- package/tests/rules/medium.test.ts +224 -0
- package/tests/scanner/scanner.test.ts +161 -0
- package/tsconfig.json +19 -0
- package/vibe-coding-security-checklist.md +245 -0
- package/vitest.config.ts +15 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SecurityRule } from '../types';
|
|
2
|
+
interface RulesResponse {
|
|
3
|
+
version: string;
|
|
4
|
+
rules: SecurityRule[];
|
|
5
|
+
}
|
|
6
|
+
export declare function fetchLatestRules(licenseKey?: string): Promise<RulesResponse>;
|
|
7
|
+
export declare function reportScanMetrics(licenseKey: string, metrics: {
|
|
8
|
+
filesScanned: number;
|
|
9
|
+
findingsCount: number;
|
|
10
|
+
duration: number;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/api/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,wBAAsB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiClF;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchLatestRules = fetchLatestRules;
|
|
4
|
+
exports.reportScanMetrics = reportScanMetrics;
|
|
5
|
+
const definitions_1 = require("../scanner/rules/definitions");
|
|
6
|
+
const API_BASE_URL = process.env.VIBEGUARD_API_URL || 'https://api.vibeguard.dev';
|
|
7
|
+
async function fetchLatestRules(licenseKey) {
|
|
8
|
+
// For offline mode or no license, use bundled rules
|
|
9
|
+
if (process.env.VIBEGUARD_OFFLINE === 'true' || !licenseKey) {
|
|
10
|
+
return {
|
|
11
|
+
version: 'local',
|
|
12
|
+
rules: definitions_1.securityRules,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const response = await fetch(`${API_BASE_URL}/v1/rules`, {
|
|
17
|
+
headers: {
|
|
18
|
+
'Authorization': `Bearer ${licenseKey}`,
|
|
19
|
+
'Accept': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
if (response.ok) {
|
|
23
|
+
return (await response.json());
|
|
24
|
+
}
|
|
25
|
+
// Fall back to local rules
|
|
26
|
+
return {
|
|
27
|
+
version: 'local',
|
|
28
|
+
rules: definitions_1.securityRules,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Network error, use local rules
|
|
33
|
+
return {
|
|
34
|
+
version: 'local',
|
|
35
|
+
rules: definitions_1.securityRules,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function reportScanMetrics(licenseKey, metrics) {
|
|
40
|
+
if (process.env.VIBEGUARD_OFFLINE === 'true') {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
await fetch(`${API_BASE_URL}/v1/metrics`, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: {
|
|
47
|
+
'Authorization': `Bearer ${licenseKey}`,
|
|
48
|
+
'Content-Type': 'application/json',
|
|
49
|
+
},
|
|
50
|
+
body: JSON.stringify(metrics),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Silently ignore metrics errors
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/api/rules.ts"],"names":[],"mappings":";;AAUA,4CAiCC;AAED,8CAwBC;AApED,8DAA6D;AAE7D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;AAO3E,KAAK,UAAU,gBAAgB,CAAC,UAAmB;IACxD,oDAAoD;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5D,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,2BAAa;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,WAAW,EAAE;YACvD,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,UAAU,EAAE;gBACvC,QAAQ,EAAE,kBAAkB;aAC7B;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAC;QAClD,CAAC;QAED,2BAA2B;QAC3B,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,2BAAa;SACrB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;QACjC,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,2BAAa;SACrB,CAAC;IACJ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,OAIC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,YAAY,aAAa,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,UAAU,EAAE;gBACvC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,iBAAiB,IAAI,OAAO,CA0G3C"}
|
|
@@ -0,0 +1,145 @@
|
|
|
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.createInitCommand = createInitCommand;
|
|
37
|
+
const commander_1 = require("commander");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const output_1 = require("../output");
|
|
41
|
+
const HUSKY_HOOK = `#!/usr/bin/env sh
|
|
42
|
+
. "$(dirname -- "$0")/_/husky.sh"
|
|
43
|
+
|
|
44
|
+
npx vibeguard scan --staged
|
|
45
|
+
`;
|
|
46
|
+
const SIMPLE_HOOK = `#!/bin/sh
|
|
47
|
+
npx vibeguard scan --staged
|
|
48
|
+
`;
|
|
49
|
+
function createInitCommand() {
|
|
50
|
+
const init = new commander_1.Command('init')
|
|
51
|
+
.description('Set up pre-commit hook for automatic scanning')
|
|
52
|
+
.option('--force', 'Overwrite existing hooks')
|
|
53
|
+
.action(async (options) => {
|
|
54
|
+
const cwd = process.cwd();
|
|
55
|
+
try {
|
|
56
|
+
// Check if we're in a git repo
|
|
57
|
+
if (!fs.existsSync(path.join(cwd, '.git'))) {
|
|
58
|
+
console.log((0, output_1.formatError)('Not a git repository. Run "git init" first.'));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
// Check for husky
|
|
62
|
+
const packageJsonPath = path.join(cwd, 'package.json');
|
|
63
|
+
let hasHusky = false;
|
|
64
|
+
let huskyDir = '';
|
|
65
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
66
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
67
|
+
hasHusky = !!(pkg.devDependencies?.husky ||
|
|
68
|
+
pkg.dependencies?.husky);
|
|
69
|
+
}
|
|
70
|
+
// Check for .husky directory
|
|
71
|
+
const huskyPath = path.join(cwd, '.husky');
|
|
72
|
+
if (fs.existsSync(huskyPath)) {
|
|
73
|
+
hasHusky = true;
|
|
74
|
+
huskyDir = huskyPath;
|
|
75
|
+
}
|
|
76
|
+
if (hasHusky && huskyDir) {
|
|
77
|
+
// Add husky hook
|
|
78
|
+
const hookPath = path.join(huskyDir, 'pre-commit');
|
|
79
|
+
if (fs.existsSync(hookPath) && !options.force) {
|
|
80
|
+
// Check if vibeguard is already in the hook
|
|
81
|
+
const existingHook = fs.readFileSync(hookPath, 'utf-8');
|
|
82
|
+
if (existingHook.includes('vibeguard')) {
|
|
83
|
+
console.log((0, output_1.formatInfo)('VibeGuard hook already installed.'));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Append to existing hook
|
|
87
|
+
const updatedHook = existingHook.trimEnd() + '\n\nnpx vibeguard scan --staged\n';
|
|
88
|
+
fs.writeFileSync(hookPath, updatedHook);
|
|
89
|
+
console.log((0, output_1.formatSuccess)('Added VibeGuard to existing pre-commit hook.'));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
fs.writeFileSync(hookPath, HUSKY_HOOK);
|
|
93
|
+
fs.chmodSync(hookPath, '755');
|
|
94
|
+
console.log((0, output_1.formatSuccess)('Created pre-commit hook with VibeGuard.'));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// No husky, use simple git hook
|
|
99
|
+
const hooksDir = path.join(cwd, '.git', 'hooks');
|
|
100
|
+
const hookPath = path.join(hooksDir, 'pre-commit');
|
|
101
|
+
if (fs.existsSync(hookPath) && !options.force) {
|
|
102
|
+
const existingHook = fs.readFileSync(hookPath, 'utf-8');
|
|
103
|
+
if (existingHook.includes('vibeguard')) {
|
|
104
|
+
console.log((0, output_1.formatInfo)('VibeGuard hook already installed.'));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Append to existing hook
|
|
108
|
+
const updatedHook = existingHook.trimEnd() + '\n\nnpx vibeguard scan --staged\n';
|
|
109
|
+
fs.writeFileSync(hookPath, updatedHook);
|
|
110
|
+
fs.chmodSync(hookPath, '755');
|
|
111
|
+
console.log((0, output_1.formatSuccess)('Added VibeGuard to existing pre-commit hook.'));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
fs.writeFileSync(hookPath, SIMPLE_HOOK);
|
|
115
|
+
fs.chmodSync(hookPath, '755');
|
|
116
|
+
console.log((0, output_1.formatSuccess)('Created pre-commit hook.'));
|
|
117
|
+
}
|
|
118
|
+
console.log((0, output_1.formatInfo)('Tip: Consider using Husky for better hook management.'));
|
|
119
|
+
console.log((0, output_1.formatInfo)(' npm install husky --save-dev'));
|
|
120
|
+
console.log((0, output_1.formatInfo)(' npx husky init'));
|
|
121
|
+
}
|
|
122
|
+
// Create .vibeguardrc.json if it doesn't exist
|
|
123
|
+
const configPath = path.join(cwd, '.vibeguardrc.json');
|
|
124
|
+
if (!fs.existsSync(configPath)) {
|
|
125
|
+
const defaultConfig = {
|
|
126
|
+
exclude: ['node_modules', 'dist', 'build'],
|
|
127
|
+
rules: {
|
|
128
|
+
disabled: [],
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
|
|
132
|
+
console.log((0, output_1.formatSuccess)('Created .vibeguardrc.json config file.'));
|
|
133
|
+
}
|
|
134
|
+
console.log('\n' + (0, output_1.formatSuccess)('VibeGuard initialized successfully!'));
|
|
135
|
+
console.log((0, output_1.formatInfo)('Your code will be scanned before each commit.'));
|
|
136
|
+
console.log((0, output_1.formatInfo)('Use "git commit --no-verify" to skip the check if needed.'));
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error((0, output_1.formatError)(error instanceof Error ? error.message : 'Init failed'));
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return init;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,wBAAgB,kBAAkB,IAAI,OAAO,CAkD5C;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAoB7C"}
|
|
@@ -0,0 +1,121 @@
|
|
|
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.createLoginCommand = createLoginCommand;
|
|
37
|
+
exports.createLogoutCommand = createLogoutCommand;
|
|
38
|
+
const commander_1 = require("commander");
|
|
39
|
+
const readline = __importStar(require("readline"));
|
|
40
|
+
const license_1 = require("../../api/license");
|
|
41
|
+
const output_1 = require("../output");
|
|
42
|
+
function prompt(question) {
|
|
43
|
+
const rl = readline.createInterface({
|
|
44
|
+
input: process.stdin,
|
|
45
|
+
output: process.stdout,
|
|
46
|
+
});
|
|
47
|
+
return new Promise(resolve => {
|
|
48
|
+
rl.question(question, answer => {
|
|
49
|
+
rl.close();
|
|
50
|
+
resolve(answer.trim());
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function createLoginCommand() {
|
|
55
|
+
const login = new commander_1.Command('login')
|
|
56
|
+
.description('Authenticate with your VibeGuard license key')
|
|
57
|
+
.option('--key <key>', 'License key (or enter interactively)')
|
|
58
|
+
.option('--email <email>', 'Email address associated with license')
|
|
59
|
+
.action(async (options) => {
|
|
60
|
+
try {
|
|
61
|
+
// Check if already logged in
|
|
62
|
+
const existingKey = (0, license_1.getLicenseKey)();
|
|
63
|
+
if (existingKey) {
|
|
64
|
+
console.log((0, output_1.formatInfo)('You are already logged in.'));
|
|
65
|
+
console.log((0, output_1.formatInfo)('Use "vibeguard logout" to log out first.'));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Get license key
|
|
69
|
+
let key = options.key;
|
|
70
|
+
if (!key) {
|
|
71
|
+
key = await prompt('Enter your license key: ');
|
|
72
|
+
}
|
|
73
|
+
if (!key) {
|
|
74
|
+
console.log((0, output_1.formatError)('License key is required'));
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
// Get email
|
|
78
|
+
let email = options.email;
|
|
79
|
+
if (!email) {
|
|
80
|
+
email = await prompt('Enter your email (optional): ');
|
|
81
|
+
}
|
|
82
|
+
// Activate license
|
|
83
|
+
console.log('\nActivating license...');
|
|
84
|
+
const result = await (0, license_1.activateLicense)(email || '', key);
|
|
85
|
+
if (result.success) {
|
|
86
|
+
console.log((0, output_1.formatSuccess)(result.message));
|
|
87
|
+
console.log((0, output_1.formatInfo)('You can now run "vibeguard scan" to scan your code.'));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log((0, output_1.formatError)(result.message));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error((0, output_1.formatError)(error instanceof Error ? error.message : 'Login failed'));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
return login;
|
|
100
|
+
}
|
|
101
|
+
function createLogoutCommand() {
|
|
102
|
+
const logout = new commander_1.Command('logout')
|
|
103
|
+
.description('Remove stored license key')
|
|
104
|
+
.action(() => {
|
|
105
|
+
try {
|
|
106
|
+
const existingKey = (0, license_1.getLicenseKey)();
|
|
107
|
+
if (!existingKey) {
|
|
108
|
+
console.log((0, output_1.formatInfo)('You are not logged in.'));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
(0, license_1.clearLicenseKey)();
|
|
112
|
+
console.log((0, output_1.formatSuccess)('Logged out successfully.'));
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error((0, output_1.formatError)(error instanceof Error ? error.message : 'Logout failed'));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return logout;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,gBAAgB,IAAI,OAAO,CAQ1C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMcpCommand = createMcpCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const server_1 = require("../../mcp/server");
|
|
6
|
+
function createMcpCommand() {
|
|
7
|
+
const mcp = new commander_1.Command('mcp')
|
|
8
|
+
.description('Start VibeGuard as an MCP server for AI assistant integration')
|
|
9
|
+
.action(async () => {
|
|
10
|
+
await (0, server_1.startMcpServer)();
|
|
11
|
+
});
|
|
12
|
+
return mcp;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":";;AAGA,4CAQC;AAXD,yCAAoC;AACpC,6CAAkD;AAElD,SAAgB,gBAAgB;IAC9B,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,KAAK,CAAC;SAC3B,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAA,uBAAc,GAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,kBAAkB,IAAI,OAAO,CAkD5C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRulesCommand = createRulesCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const loader_1 = require("../../scanner/rules/loader");
|
|
6
|
+
const license_1 = require("../../api/license");
|
|
7
|
+
const output_1 = require("../output");
|
|
8
|
+
const packageJson = require('../../../package.json');
|
|
9
|
+
function createRulesCommand() {
|
|
10
|
+
const rules = new commander_1.Command('rules')
|
|
11
|
+
.description('List all available security rules')
|
|
12
|
+
.option('--severity <level>', 'Filter by severity (critical, high, medium, low)')
|
|
13
|
+
.option('--language <lang>', 'Filter by language (javascript, typescript, python)')
|
|
14
|
+
.option('--json', 'Output as JSON')
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
try {
|
|
17
|
+
const licenseKey = (0, license_1.getLicenseKey)();
|
|
18
|
+
let allRules = await (0, loader_1.loadRules)(licenseKey || undefined);
|
|
19
|
+
// Apply filters
|
|
20
|
+
if (options.severity) {
|
|
21
|
+
allRules = allRules.filter(r => r.severity === options.severity);
|
|
22
|
+
}
|
|
23
|
+
if (options.language) {
|
|
24
|
+
allRules = allRules.filter(r => r.languages.includes(options.language));
|
|
25
|
+
}
|
|
26
|
+
if (options.json) {
|
|
27
|
+
console.log(JSON.stringify(allRules, null, 2));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
console.log((0, output_1.formatHeader)(packageJson.version));
|
|
31
|
+
console.log((0, output_1.formatInfo)(`${allRules.length} security rules available\n`));
|
|
32
|
+
// Group by severity
|
|
33
|
+
const severities = ['critical', 'high', 'medium', 'low'];
|
|
34
|
+
for (const severity of severities) {
|
|
35
|
+
const rulesInSeverity = allRules.filter(r => r.severity === severity);
|
|
36
|
+
if (rulesInSeverity.length > 0) {
|
|
37
|
+
console.log(`\n${severity.toUpperCase()} (${rulesInSeverity.length})`);
|
|
38
|
+
console.log('─'.repeat(40));
|
|
39
|
+
for (const rule of rulesInSeverity) {
|
|
40
|
+
console.log((0, output_1.formatRule)(rule));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error('Failed to load rules:', error instanceof Error ? error.message : error);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
return rules;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/cli/commands/rules.ts"],"names":[],"mappings":";;AAOA,gDAkDC;AAzDD,yCAAoC;AACpC,uDAAuD;AACvD,+CAAkD;AAClD,sCAAiE;AAEjE,MAAM,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAErD,SAAgB,kBAAkB;IAChC,MAAM,KAAK,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;SAC/B,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,oBAAoB,EAAE,kDAAkD,CAAC;SAChF,MAAM,CAAC,mBAAmB,EAAE,qDAAqD,CAAC;SAClF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAA,uBAAa,GAAE,CAAC;YACnC,IAAI,QAAQ,GAAG,MAAM,IAAA,kBAAS,EAAC,UAAU,IAAI,SAAS,CAAC,CAAC;YAExD,gBAAgB;YAChB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC7B,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAkD,CAAC,CACjF,CAAC;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,IAAA,qBAAY,EAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,GAAG,QAAQ,CAAC,MAAM,6BAA6B,CAAC,CAAC,CAAC;YAEzE,oBAAoB;YACpB,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAC;YAElE,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAClC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;gBACtE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;oBACvE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC5B,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;wBACnC,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,iBAAiB,IAAI,OAAO,CA2E3C"}
|
|
@@ -0,0 +1,114 @@
|
|
|
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.createScanCommand = createScanCommand;
|
|
37
|
+
const commander_1 = require("commander");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const scanner_1 = require("../../scanner");
|
|
40
|
+
const license_1 = require("../../api/license");
|
|
41
|
+
const config_1 = require("../config");
|
|
42
|
+
const output_1 = require("../output");
|
|
43
|
+
const packageJson = require('../../../package.json');
|
|
44
|
+
function createScanCommand() {
|
|
45
|
+
const scan = new commander_1.Command('scan')
|
|
46
|
+
.description('Scan files or directories for security vulnerabilities')
|
|
47
|
+
.argument('[targets...]', 'Files or directories to scan', ['.'])
|
|
48
|
+
.option('--staged', 'Scan only git staged files')
|
|
49
|
+
.option('--force', 'Continue even if critical/high issues found')
|
|
50
|
+
.option('--json', 'Output results as JSON')
|
|
51
|
+
.option('--quiet', 'Minimal output (exit code only)')
|
|
52
|
+
.action(async (targets, options) => {
|
|
53
|
+
try {
|
|
54
|
+
const config = (0, config_1.loadConfig)();
|
|
55
|
+
const licenseKey = (0, license_1.getLicenseKey)();
|
|
56
|
+
const cwd = process.cwd();
|
|
57
|
+
const scanner = new scanner_1.Scanner(config);
|
|
58
|
+
await scanner.initialize(licenseKey || undefined);
|
|
59
|
+
if (!options.quiet && !options.json) {
|
|
60
|
+
console.log((0, output_1.formatHeader)(packageJson.version));
|
|
61
|
+
}
|
|
62
|
+
// Perform scan
|
|
63
|
+
const result = options.staged
|
|
64
|
+
? await scanner.scanStaged()
|
|
65
|
+
: await scanner.scan(targets.length > 0 ? targets : ['.']);
|
|
66
|
+
if (!options.quiet && !options.json) {
|
|
67
|
+
console.log((0, output_1.formatScanning)(result.files));
|
|
68
|
+
}
|
|
69
|
+
// Output results
|
|
70
|
+
if (options.json) {
|
|
71
|
+
console.log(JSON.stringify({
|
|
72
|
+
version: packageJson.version,
|
|
73
|
+
files: result.files,
|
|
74
|
+
findings: result.findings.map(f => ({
|
|
75
|
+
rule: f.rule.id,
|
|
76
|
+
severity: f.rule.severity,
|
|
77
|
+
file: path.relative(cwd, f.file),
|
|
78
|
+
line: f.line,
|
|
79
|
+
column: f.column,
|
|
80
|
+
message: f.rule.name,
|
|
81
|
+
fix: f.rule.fix,
|
|
82
|
+
})),
|
|
83
|
+
duration: result.duration,
|
|
84
|
+
}, null, 2));
|
|
85
|
+
}
|
|
86
|
+
else if (!options.quiet) {
|
|
87
|
+
if (result.findings.length === 0) {
|
|
88
|
+
console.log((0, output_1.formatCleanResult)());
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
for (const finding of result.findings) {
|
|
92
|
+
console.log((0, output_1.formatFinding)(finding, cwd));
|
|
93
|
+
}
|
|
94
|
+
console.log((0, output_1.formatSummary)(result));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Determine exit code
|
|
98
|
+
const hasBlockingIssues = (0, output_1.shouldBlockCommit)(result);
|
|
99
|
+
if (hasBlockingIssues && !options.force) {
|
|
100
|
+
if (!options.quiet && !options.json) {
|
|
101
|
+
console.log((0, output_1.formatBlockedCommit)());
|
|
102
|
+
}
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
process.exit(0);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.error((0, output_1.formatError)(error instanceof Error ? error.message : 'Scan failed'));
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
return scan;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAQlC,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CA4B9D;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAa5C"}
|