@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.
Files changed (109) hide show
  1. package/.claude/settings.local.json +5 -0
  2. package/.github/workflows/ci.yml +65 -0
  3. package/.github/workflows/release.yml +85 -0
  4. package/PROGRESS.md +192 -0
  5. package/README.md +183 -0
  6. package/dist/api/license.d.ts +13 -0
  7. package/dist/api/license.d.ts.map +1 -0
  8. package/dist/api/license.js +138 -0
  9. package/dist/api/license.js.map +1 -0
  10. package/dist/api/rules.d.ts +13 -0
  11. package/dist/api/rules.d.ts.map +1 -0
  12. package/dist/api/rules.js +57 -0
  13. package/dist/api/rules.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +3 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -0
  16. package/dist/cli/commands/init.js +145 -0
  17. package/dist/cli/commands/init.js.map +1 -0
  18. package/dist/cli/commands/login.d.ts +4 -0
  19. package/dist/cli/commands/login.d.ts.map +1 -0
  20. package/dist/cli/commands/login.js +121 -0
  21. package/dist/cli/commands/login.js.map +1 -0
  22. package/dist/cli/commands/mcp.d.ts +3 -0
  23. package/dist/cli/commands/mcp.d.ts.map +1 -0
  24. package/dist/cli/commands/mcp.js +14 -0
  25. package/dist/cli/commands/mcp.js.map +1 -0
  26. package/dist/cli/commands/rules.d.ts +3 -0
  27. package/dist/cli/commands/rules.d.ts.map +1 -0
  28. package/dist/cli/commands/rules.js +52 -0
  29. package/dist/cli/commands/rules.js.map +1 -0
  30. package/dist/cli/commands/scan.d.ts +3 -0
  31. package/dist/cli/commands/scan.d.ts.map +1 -0
  32. package/dist/cli/commands/scan.js +114 -0
  33. package/dist/cli/commands/scan.js.map +1 -0
  34. package/dist/cli/config.d.ts +4 -0
  35. package/dist/cli/config.d.ts.map +1 -0
  36. package/dist/cli/config.js +88 -0
  37. package/dist/cli/config.js.map +1 -0
  38. package/dist/cli/index.d.ts +3 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +25 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/cli/output.d.ts +15 -0
  43. package/dist/cli/output.d.ts.map +1 -0
  44. package/dist/cli/output.js +152 -0
  45. package/dist/cli/output.js.map +1 -0
  46. package/dist/mcp/server.d.ts +2 -0
  47. package/dist/mcp/server.d.ts.map +1 -0
  48. package/dist/mcp/server.js +188 -0
  49. package/dist/mcp/server.js.map +1 -0
  50. package/dist/scanner/index.d.ts +15 -0
  51. package/dist/scanner/index.d.ts.map +1 -0
  52. package/dist/scanner/index.js +207 -0
  53. package/dist/scanner/index.js.map +1 -0
  54. package/dist/scanner/parsers/javascript.d.ts +12 -0
  55. package/dist/scanner/parsers/javascript.d.ts.map +1 -0
  56. package/dist/scanner/parsers/javascript.js +266 -0
  57. package/dist/scanner/parsers/javascript.js.map +1 -0
  58. package/dist/scanner/parsers/python.d.ts +3 -0
  59. package/dist/scanner/parsers/python.d.ts.map +1 -0
  60. package/dist/scanner/parsers/python.js +108 -0
  61. package/dist/scanner/parsers/python.js.map +1 -0
  62. package/dist/scanner/rules/definitions.d.ts +5 -0
  63. package/dist/scanner/rules/definitions.d.ts.map +1 -0
  64. package/dist/scanner/rules/definitions.js +584 -0
  65. package/dist/scanner/rules/definitions.js.map +1 -0
  66. package/dist/scanner/rules/loader.d.ts +8 -0
  67. package/dist/scanner/rules/loader.d.ts.map +1 -0
  68. package/dist/scanner/rules/loader.js +45 -0
  69. package/dist/scanner/rules/loader.js.map +1 -0
  70. package/dist/scanner/rules/matcher.d.ts +11 -0
  71. package/dist/scanner/rules/matcher.d.ts.map +1 -0
  72. package/dist/scanner/rules/matcher.js +53 -0
  73. package/dist/scanner/rules/matcher.js.map +1 -0
  74. package/dist/types.d.ts +33 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +3 -0
  77. package/dist/types.js.map +1 -0
  78. package/package.json +48 -0
  79. package/src/api/license.ts +120 -0
  80. package/src/api/rules.ts +70 -0
  81. package/src/cli/commands/init.ts +123 -0
  82. package/src/cli/commands/login.ts +92 -0
  83. package/src/cli/commands/mcp.ts +12 -0
  84. package/src/cli/commands/rules.ts +58 -0
  85. package/src/cli/commands/scan.ts +94 -0
  86. package/src/cli/config.ts +54 -0
  87. package/src/cli/index.ts +28 -0
  88. package/src/cli/output.ts +159 -0
  89. package/src/mcp/server.ts +195 -0
  90. package/src/scanner/index.ts +195 -0
  91. package/src/scanner/parsers/javascript.ts +285 -0
  92. package/src/scanner/parsers/python.ts +126 -0
  93. package/src/scanner/rules/definitions.ts +592 -0
  94. package/src/scanner/rules/loader.ts +59 -0
  95. package/src/scanner/rules/matcher.ts +68 -0
  96. package/src/types.ts +36 -0
  97. package/test-samples/secure.js +52 -0
  98. package/test-samples/vulnerable.js +56 -0
  99. package/test-samples/vulnerable.py +39 -0
  100. package/tests/helpers.ts +43 -0
  101. package/tests/rules/critical.test.ts +186 -0
  102. package/tests/rules/definitions.test.ts +167 -0
  103. package/tests/rules/high.test.ts +377 -0
  104. package/tests/rules/low.test.ts +172 -0
  105. package/tests/rules/medium.test.ts +224 -0
  106. package/tests/scanner/scanner.test.ts +161 -0
  107. package/tsconfig.json +19 -0
  108. package/vibe-coding-security-checklist.md +245 -0
  109. 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createInitCommand(): Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -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,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function createLoginCommand(): Command;
3
+ export declare function createLogoutCommand(): Command;
4
+ //# sourceMappingURL=login.d.ts.map
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,gDAkDC;AAED,kDAoBC;AA3FD,yCAAoC;AACpC,mDAAqC;AACrC,+CAAoF;AACpF,sCAAmE;AAEnE,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,kBAAkB;IAChC,MAAM,KAAK,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;SAC/B,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,aAAa,EAAE,sCAAsC,CAAC;SAC7D,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,WAAW,GAAG,IAAA,uBAAa,GAAE,CAAC;YACpC,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,4BAA4B,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,0CAA0C,CAAC,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YAED,kBAAkB;YAClB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;YACtB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACjD,CAAC;YAED,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,IAAA,oBAAW,EAAC,yBAAyB,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,YAAY;YACZ,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;YACxD,CAAC;YAED,mBAAmB;YACnB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAe,EAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;YAEvD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,IAAA,sBAAa,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,qDAAqD,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAA,oBAAW,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,IAAA,oBAAW,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,mBAAmB;IACjC,MAAM,MAAM,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;SACjC,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,GAAG,EAAE;QACX,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,uBAAa,GAAE,CAAC;YACpC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,wBAAwB,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,IAAA,yBAAe,GAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,IAAA,sBAAa,EAAC,0BAA0B,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,IAAA,oBAAW,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createMcpCommand(): Command;
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createRulesCommand(): Command;
3
+ //# sourceMappingURL=rules.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createScanCommand(): Command;
3
+ //# sourceMappingURL=scan.d.ts.map
@@ -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,4 @@
1
+ import { Config } from '../types';
2
+ export declare function loadConfig(cwd?: string): Config;
3
+ export declare function createDefaultConfig(): Config;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -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"}