@hatem427/code-guard-ci 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 (107) hide show
  1. package/.husky/pre-commit +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +646 -0
  4. package/config/angular.config.ts +223 -0
  5. package/config/guidelines.config.ts +229 -0
  6. package/config/nextjs.config.ts +160 -0
  7. package/config/react.config.ts +330 -0
  8. package/dist/config/angular.config.d.ts +15 -0
  9. package/dist/config/angular.config.d.ts.map +1 -0
  10. package/dist/config/angular.config.js +187 -0
  11. package/dist/config/angular.config.js.map +1 -0
  12. package/dist/config/guidelines.config.d.ts +63 -0
  13. package/dist/config/guidelines.config.d.ts.map +1 -0
  14. package/dist/config/guidelines.config.js +167 -0
  15. package/dist/config/guidelines.config.js.map +1 -0
  16. package/dist/config/nextjs.config.d.ts +18 -0
  17. package/dist/config/nextjs.config.d.ts.map +1 -0
  18. package/dist/config/nextjs.config.js +133 -0
  19. package/dist/config/nextjs.config.js.map +1 -0
  20. package/dist/config/react.config.d.ts +15 -0
  21. package/dist/config/react.config.d.ts.map +1 -0
  22. package/dist/config/react.config.js +287 -0
  23. package/dist/config/react.config.js.map +1 -0
  24. package/dist/scripts/auto-fix.d.ts +16 -0
  25. package/dist/scripts/auto-fix.d.ts.map +1 -0
  26. package/dist/scripts/auto-fix.js +130 -0
  27. package/dist/scripts/auto-fix.js.map +1 -0
  28. package/dist/scripts/cli.d.ts +17 -0
  29. package/dist/scripts/cli.d.ts.map +1 -0
  30. package/dist/scripts/cli.js +255 -0
  31. package/dist/scripts/cli.js.map +1 -0
  32. package/dist/scripts/delete-bypass-logs.d.ts +17 -0
  33. package/dist/scripts/delete-bypass-logs.d.ts.map +1 -0
  34. package/dist/scripts/delete-bypass-logs.js +242 -0
  35. package/dist/scripts/delete-bypass-logs.js.map +1 -0
  36. package/dist/scripts/generate-doc.d.ts +18 -0
  37. package/dist/scripts/generate-doc.d.ts.map +1 -0
  38. package/dist/scripts/generate-doc.js +300 -0
  39. package/dist/scripts/generate-doc.js.map +1 -0
  40. package/dist/scripts/generate-pr-checklist.d.ts +20 -0
  41. package/dist/scripts/generate-pr-checklist.d.ts.map +1 -0
  42. package/dist/scripts/generate-pr-checklist.js +276 -0
  43. package/dist/scripts/generate-pr-checklist.js.map +1 -0
  44. package/dist/scripts/precommit-check.d.ts +23 -0
  45. package/dist/scripts/precommit-check.d.ts.map +1 -0
  46. package/dist/scripts/precommit-check.js +331 -0
  47. package/dist/scripts/precommit-check.js.map +1 -0
  48. package/dist/scripts/set-admin-password.d.ts +14 -0
  49. package/dist/scripts/set-admin-password.d.ts.map +1 -0
  50. package/dist/scripts/set-admin-password.js +116 -0
  51. package/dist/scripts/set-admin-password.js.map +1 -0
  52. package/dist/scripts/set-bypass-password.d.ts +11 -0
  53. package/dist/scripts/set-bypass-password.d.ts.map +1 -0
  54. package/dist/scripts/set-bypass-password.js +106 -0
  55. package/dist/scripts/set-bypass-password.js.map +1 -0
  56. package/dist/scripts/utils/auto-fixer.d.ts +28 -0
  57. package/dist/scripts/utils/auto-fixer.d.ts.map +1 -0
  58. package/dist/scripts/utils/auto-fixer.js +177 -0
  59. package/dist/scripts/utils/auto-fixer.js.map +1 -0
  60. package/dist/scripts/utils/bypass-manager.d.ts +101 -0
  61. package/dist/scripts/utils/bypass-manager.d.ts.map +1 -0
  62. package/dist/scripts/utils/bypass-manager.js +496 -0
  63. package/dist/scripts/utils/bypass-manager.js.map +1 -0
  64. package/dist/scripts/utils/code-analyzer.d.ts +34 -0
  65. package/dist/scripts/utils/code-analyzer.d.ts.map +1 -0
  66. package/dist/scripts/utils/code-analyzer.js +323 -0
  67. package/dist/scripts/utils/code-analyzer.js.map +1 -0
  68. package/dist/scripts/utils/file-checker.d.ts +93 -0
  69. package/dist/scripts/utils/file-checker.d.ts.map +1 -0
  70. package/dist/scripts/utils/file-checker.js +248 -0
  71. package/dist/scripts/utils/file-checker.js.map +1 -0
  72. package/dist/scripts/utils/logger.d.ts +26 -0
  73. package/dist/scripts/utils/logger.d.ts.map +1 -0
  74. package/dist/scripts/utils/logger.js +86 -0
  75. package/dist/scripts/utils/logger.js.map +1 -0
  76. package/dist/scripts/utils/project-detector.d.ts +34 -0
  77. package/dist/scripts/utils/project-detector.d.ts.map +1 -0
  78. package/dist/scripts/utils/project-detector.js +124 -0
  79. package/dist/scripts/utils/project-detector.js.map +1 -0
  80. package/dist/scripts/utils/rule-engine.d.ts +57 -0
  81. package/dist/scripts/utils/rule-engine.d.ts.map +1 -0
  82. package/dist/scripts/utils/rule-engine.js +158 -0
  83. package/dist/scripts/utils/rule-engine.js.map +1 -0
  84. package/dist/scripts/view-bypass-log.d.ts +13 -0
  85. package/dist/scripts/view-bypass-log.d.ts.map +1 -0
  86. package/dist/scripts/view-bypass-log.js +117 -0
  87. package/dist/scripts/view-bypass-log.js.map +1 -0
  88. package/package.json +74 -0
  89. package/scripts/auto-fix.ts +115 -0
  90. package/scripts/cli.ts +246 -0
  91. package/scripts/delete-bypass-logs.ts +253 -0
  92. package/scripts/generate-doc.ts +317 -0
  93. package/scripts/generate-pr-checklist.ts +285 -0
  94. package/scripts/precommit-check.ts +349 -0
  95. package/scripts/set-admin-password.ts +90 -0
  96. package/scripts/set-bypass-password.ts +80 -0
  97. package/scripts/utils/auto-fixer.ts +181 -0
  98. package/scripts/utils/bypass-manager.ts +566 -0
  99. package/scripts/utils/code-analyzer.ts +341 -0
  100. package/scripts/utils/file-checker.ts +253 -0
  101. package/scripts/utils/logger.ts +88 -0
  102. package/scripts/utils/project-detector.ts +115 -0
  103. package/scripts/utils/rule-engine.ts +186 -0
  104. package/scripts/view-bypass-log.ts +92 -0
  105. package/templates/feature-doc-api.md +101 -0
  106. package/templates/feature-doc-service.md +113 -0
  107. package/templates/feature-doc-ui.md +91 -0
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ts-node
2
+ /**
3
+ * ============================================================================
4
+ * set-admin-password.ts — CLI tool to set admin password
5
+ * ============================================================================
6
+ *
7
+ * Admin password is required to delete bypass log entries.
8
+ * This provides a higher level of security for log management.
9
+ *
10
+ * Usage:
11
+ * npm run set-admin-password
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=set-admin-password.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-admin-password.d.ts","sourceRoot":"","sources":["../../scripts/set-admin-password.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ /**
4
+ * ============================================================================
5
+ * set-admin-password.ts — CLI tool to set admin password
6
+ * ============================================================================
7
+ *
8
+ * Admin password is required to delete bypass log entries.
9
+ * This provides a higher level of security for log management.
10
+ *
11
+ * Usage:
12
+ * npm run set-admin-password
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ const bypass_manager_1 = require("./utils/bypass-manager");
49
+ const readline = __importStar(require("readline"));
50
+ function promptPassword(question) {
51
+ return new Promise((resolve) => {
52
+ const rl = readline.createInterface({
53
+ input: process.stdin,
54
+ output: process.stdout,
55
+ });
56
+ const stdin = process.stdin;
57
+ stdin.setRawMode(true);
58
+ let password = '';
59
+ process.stdout.write(question);
60
+ stdin.on('data', (char) => {
61
+ const str = char.toString('utf-8');
62
+ if (str === '\n' || str === '\r' || str === '\u0004') {
63
+ stdin.setRawMode(false);
64
+ process.stdout.write('\n');
65
+ rl.close();
66
+ resolve(password);
67
+ }
68
+ else if (str === '\u0003') {
69
+ // Ctrl+C
70
+ process.exit(1);
71
+ }
72
+ else if (str === '\u007f' || str === '\b') {
73
+ // Backspace
74
+ if (password.length > 0) {
75
+ password = password.slice(0, -1);
76
+ process.stdout.write('\b \b');
77
+ }
78
+ }
79
+ else {
80
+ password += str;
81
+ process.stdout.write('*');
82
+ }
83
+ });
84
+ });
85
+ }
86
+ async function main() {
87
+ console.log('🔐 Code Guardian — Set Admin Password\n');
88
+ console.log('⚠️ ADMIN PRIVILEGES:');
89
+ console.log(' • View all bypass logs');
90
+ console.log(' • Delete bypass log entries');
91
+ console.log(' • Access archived logs\n');
92
+ console.log('🔒 This password should be highly restricted and secure.\n');
93
+ const password = await promptPassword('Enter new admin password: ');
94
+ if (!password || password.length < 8) {
95
+ console.error('\n❌ Admin password must be at least 8 characters long.');
96
+ process.exit(1);
97
+ }
98
+ const confirm = await promptPassword('Confirm password: ');
99
+ if (password !== confirm) {
100
+ console.error('\n❌ Passwords do not match.');
101
+ process.exit(1);
102
+ }
103
+ (0, bypass_manager_1.setAdminPassword)(password);
104
+ console.log('\n✅ Admin password set successfully!');
105
+ console.log('📁 Stored in: .code-guardian/admin-credentials.hash');
106
+ console.log('\n⚠️ IMPORTANT SECURITY NOTES:');
107
+ console.log(' 1. Add .code-guardian/ to .gitignore (if not already done)');
108
+ console.log(' 2. Share this password only with authorized administrators');
109
+ console.log(' 3. Change default password immediately in production');
110
+ console.log(' 4. Store password securely (password manager recommended)');
111
+ }
112
+ main().catch((err) => {
113
+ console.error(`Error: ${err.message}`);
114
+ process.exit(1);
115
+ });
116
+ //# sourceMappingURL=set-admin-password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-admin-password.js","sourceRoot":"","sources":["../../scripts/set-admin-password.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ts-node
2
+ /**
3
+ * ============================================================================
4
+ * set-bypass-password.ts — CLI tool to set bypass password
5
+ * ============================================================================
6
+ *
7
+ * Usage:
8
+ * npm run set-bypass-password
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=set-bypass-password.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-bypass-password.d.ts","sourceRoot":"","sources":["../../scripts/set-bypass-password.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ /**
4
+ * ============================================================================
5
+ * set-bypass-password.ts — CLI tool to set bypass password
6
+ * ============================================================================
7
+ *
8
+ * Usage:
9
+ * npm run set-bypass-password
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const bypass_manager_1 = require("./utils/bypass-manager");
46
+ const readline = __importStar(require("readline"));
47
+ function promptPassword(question) {
48
+ return new Promise((resolve) => {
49
+ const rl = readline.createInterface({
50
+ input: process.stdin,
51
+ output: process.stdout,
52
+ });
53
+ const stdin = process.stdin;
54
+ stdin.setRawMode(true);
55
+ let password = '';
56
+ process.stdout.write(question);
57
+ stdin.on('data', (char) => {
58
+ const str = char.toString('utf-8');
59
+ if (str === '\n' || str === '\r' || str === '\u0004') {
60
+ stdin.setRawMode(false);
61
+ process.stdout.write('\n');
62
+ rl.close();
63
+ resolve(password);
64
+ }
65
+ else if (str === '\u0003') {
66
+ // Ctrl+C
67
+ process.exit(1);
68
+ }
69
+ else if (str === '\u007f' || str === '\b') {
70
+ // Backspace
71
+ if (password.length > 0) {
72
+ password = password.slice(0, -1);
73
+ process.stdout.write('\b \b');
74
+ }
75
+ }
76
+ else {
77
+ password += str;
78
+ process.stdout.write('*');
79
+ }
80
+ });
81
+ });
82
+ }
83
+ async function main() {
84
+ console.log('🔐 Code Guardian — Set Bypass Password\n');
85
+ console.log('This password will be required to bypass pre-commit checks.');
86
+ console.log('Share it only with authorized team members.\n');
87
+ const password = await promptPassword('Enter new bypass password: ');
88
+ if (!password || password.length < 6) {
89
+ console.error('\n❌ Password must be at least 6 characters long.');
90
+ process.exit(1);
91
+ }
92
+ const confirm = await promptPassword('Confirm password: ');
93
+ if (password !== confirm) {
94
+ console.error('\n❌ Passwords do not match.');
95
+ process.exit(1);
96
+ }
97
+ (0, bypass_manager_1.setBypassPassword)(password);
98
+ console.log('\n✅ Password set successfully!');
99
+ console.log('📁 Stored in: .code-guardian/bypass-password.hash');
100
+ console.log('\n⚠️ Remember to add .code-guardian/ to .gitignore if not already done.');
101
+ }
102
+ main().catch((err) => {
103
+ console.error(`Error: ${err.message}`);
104
+ process.exit(1);
105
+ });
106
+ //# sourceMappingURL=set-bypass-password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-bypass-password.js","sourceRoot":"","sources":["../../scripts/set-bypass-password.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ============================================================================
3
+ * auto-fixer.ts — Automatic code fixes for common violations
4
+ * ============================================================================
5
+ *
6
+ * Provides auto-fix capabilities for rules that can be safely automated.
7
+ */
8
+ import { Violation } from './rule-engine';
9
+ export interface FixResult {
10
+ fixed: boolean;
11
+ message: string;
12
+ }
13
+ /**
14
+ * Attempt to auto-fix a violation
15
+ */
16
+ export declare function autoFixViolation(violation: Violation, filePath: string): FixResult;
17
+ /**
18
+ * Auto-fix all fixable violations in a list
19
+ */
20
+ export declare function autoFixAll(violations: Violation[], rootDir: string): {
21
+ fixed: number;
22
+ failed: number;
23
+ results: Array<{
24
+ violation: Violation;
25
+ result: FixResult;
26
+ }>;
27
+ };
28
+ //# sourceMappingURL=auto-fixer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fixer.d.ts","sourceRoot":"","sources":["../../../scripts/utils/auto-fixer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAuBlF;AAsGD;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;CAC7D,CA6BA"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ /**
3
+ * ============================================================================
4
+ * auto-fixer.ts — Automatic code fixes for common violations
5
+ * ============================================================================
6
+ *
7
+ * Provides auto-fix capabilities for rules that can be safely automated.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.autoFixViolation = autoFixViolation;
44
+ exports.autoFixAll = autoFixAll;
45
+ const fs = __importStar(require("fs"));
46
+ /**
47
+ * Attempt to auto-fix a violation
48
+ */
49
+ function autoFixViolation(violation, filePath) {
50
+ const content = fs.readFileSync(filePath, 'utf-8');
51
+ const lines = content.split('\n');
52
+ switch (violation.ruleId) {
53
+ case 'no-console-log':
54
+ return fixConsoleLog(lines, violation, filePath);
55
+ case 'no-any-type':
56
+ return fixAnyType(lines, violation, filePath);
57
+ case 'react-no-inline-styles':
58
+ return { fixed: false, message: 'Manual fix required - convert to Tailwind classes' };
59
+ case 'require-alt-text':
60
+ return fixMissingAlt(lines, violation, filePath);
61
+ case 'require-button-type':
62
+ return fixButtonType(lines, violation, filePath);
63
+ default:
64
+ return { fixed: false, message: 'No auto-fix available for this rule' };
65
+ }
66
+ }
67
+ /**
68
+ * Remove console.log statements
69
+ */
70
+ function fixConsoleLog(lines, violation, filePath) {
71
+ if (!violation.line) {
72
+ return { fixed: false, message: 'Cannot determine line number' };
73
+ }
74
+ const lineIndex = violation.line - 1;
75
+ const line = lines[lineIndex];
76
+ // Remove entire line if it only contains console.log
77
+ if (line.trim().match(/^console\.log\(.+\);?\s*$/)) {
78
+ lines.splice(lineIndex, 1);
79
+ fs.writeFileSync(filePath, lines.join('\n'), 'utf-8');
80
+ return { fixed: true, message: 'Removed console.log statement' };
81
+ }
82
+ return { fixed: false, message: 'Console.log is part of larger expression - manual fix required' };
83
+ }
84
+ /**
85
+ * Convert 'any' to 'unknown' (safer)
86
+ */
87
+ function fixAnyType(lines, violation, filePath) {
88
+ if (!violation.line) {
89
+ return { fixed: false, message: 'Cannot determine line number' };
90
+ }
91
+ const lineIndex = violation.line - 1;
92
+ let line = lines[lineIndex];
93
+ // Replace : any with : unknown
94
+ if (line.includes(': any')) {
95
+ line = line.replace(/:\s*any\b/g, ': unknown');
96
+ lines[lineIndex] = line;
97
+ fs.writeFileSync(filePath, lines.join('\n'), 'utf-8');
98
+ return { fixed: true, message: 'Changed any → unknown' };
99
+ }
100
+ // Replace any[] with unknown[]
101
+ if (line.includes('any[]')) {
102
+ line = line.replace(/\bany\[\]/g, 'unknown[]');
103
+ lines[lineIndex] = line;
104
+ fs.writeFileSync(filePath, lines.join('\n'), 'utf-8');
105
+ return { fixed: true, message: 'Changed any[] → unknown[]' };
106
+ }
107
+ return { fixed: false, message: 'Complex any usage - manual fix required' };
108
+ }
109
+ /**
110
+ * Add alt="" to images
111
+ */
112
+ function fixMissingAlt(lines, violation, filePath) {
113
+ if (!violation.line) {
114
+ return { fixed: false, message: 'Cannot determine line number' };
115
+ }
116
+ const lineIndex = violation.line - 1;
117
+ let line = lines[lineIndex];
118
+ // Add alt="" before the closing />
119
+ if (/<img\b/.test(line) && !/alt\s*=/.test(line)) {
120
+ // Add alt before />
121
+ line = line.replace(/\/>/, ' alt="" />');
122
+ // Or before >
123
+ line = line.replace(/([^/])>/, '$1 alt="">');
124
+ lines[lineIndex] = line;
125
+ fs.writeFileSync(filePath, lines.join('\n'), 'utf-8');
126
+ return { fixed: true, message: 'Added alt="" attribute' };
127
+ }
128
+ return { fixed: false, message: 'Could not add alt attribute' };
129
+ }
130
+ /**
131
+ * Add type="button" to buttons
132
+ */
133
+ function fixButtonType(lines, violation, filePath) {
134
+ if (!violation.line) {
135
+ return { fixed: false, message: 'Cannot determine line number' };
136
+ }
137
+ const lineIndex = violation.line - 1;
138
+ let line = lines[lineIndex];
139
+ // Add type="button" to <button>
140
+ if (/<button\b/.test(line) && !/type\s*=/.test(line)) {
141
+ line = line.replace(/<button/, '<button type="button"');
142
+ lines[lineIndex] = line;
143
+ fs.writeFileSync(filePath, lines.join('\n'), 'utf-8');
144
+ return { fixed: true, message: 'Added type="button" attribute' };
145
+ }
146
+ return { fixed: false, message: 'Could not add type attribute' };
147
+ }
148
+ /**
149
+ * Auto-fix all fixable violations in a list
150
+ */
151
+ function autoFixAll(violations, rootDir) {
152
+ const results = [];
153
+ let fixed = 0;
154
+ let failed = 0;
155
+ // Group by file to avoid multiple reads/writes
156
+ const byFile = new Map();
157
+ for (const v of violations) {
158
+ const existing = byFile.get(v.file) || [];
159
+ existing.push(v);
160
+ byFile.set(v.file, existing);
161
+ }
162
+ for (const [file, fileViolations] of byFile) {
163
+ const fullPath = `${rootDir}/${file}`;
164
+ for (const violation of fileViolations) {
165
+ const result = autoFixViolation(violation, fullPath);
166
+ results.push({ violation, result });
167
+ if (result.fixed) {
168
+ fixed++;
169
+ }
170
+ else {
171
+ failed++;
172
+ }
173
+ }
174
+ }
175
+ return { fixed, failed, results };
176
+ }
177
+ //# sourceMappingURL=auto-fixer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fixer.js","sourceRoot":"","sources":["../../../scripts/utils/auto-fixer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * ============================================================================
3
+ * bypass-manager.ts — Bypass audit logging with authentication
4
+ * ============================================================================
5
+ *
6
+ * Tracks all bypass attempts with:
7
+ * - Author name (from git config)
8
+ * - Timestamp
9
+ * - Reason
10
+ * - Password verification
11
+ * - Commit hash
12
+ *
13
+ * Bypass log saved to: .code-guardian/bypass-log.json
14
+ */
15
+ export interface BypassEntry {
16
+ /** Unique ID for this bypass */
17
+ id: string;
18
+ /** Git author name */
19
+ author: string;
20
+ /** Git author email */
21
+ email: string;
22
+ /** When the bypass occurred */
23
+ timestamp: string;
24
+ /** Reason for bypass */
25
+ reason: string;
26
+ /** Commit message */
27
+ commitMessage: string;
28
+ /** Commit hash (after commit) */
29
+ commitHash?: string;
30
+ /** Branch name */
31
+ branch: string;
32
+ /** Files that were bypassed */
33
+ files: string[];
34
+ /** How bypass was triggered (message flag or env var) */
35
+ method: 'commit-message' | 'env-variable' | 'password';
36
+ }
37
+ export interface BypassLog {
38
+ /** All bypass entries */
39
+ entries: BypassEntry[];
40
+ /** Last updated timestamp */
41
+ lastUpdated: string;
42
+ /** Integrity checksum to detect tampering */
43
+ checksum?: string;
44
+ /** Flag indicating if log is immutable (cannot be deleted) */
45
+ immutable: boolean;
46
+ }
47
+ /**
48
+ * Verify a password against the stored hash
49
+ */
50
+ export declare function verifyBypassPassword(password: string): boolean;
51
+ /**
52
+ * Set a new bypass password
53
+ */
54
+ export declare function setBypassPassword(newPassword: string): void;
55
+ /**
56
+ * Verify admin password
57
+ */
58
+ export declare function verifyAdminPassword(password: string): boolean;
59
+ /**
60
+ * Set a new admin password
61
+ */
62
+ export declare function setAdminPassword(newPassword: string): void;
63
+ /**
64
+ * Record a bypass attempt in the audit log
65
+ */
66
+ export declare function recordBypass(reason: string, commitMessage: string, method: 'commit-message' | 'env-variable' | 'password'): void;
67
+ /**
68
+ * Update a bypass entry with the commit hash after commit succeeds
69
+ */
70
+ export declare function updateBypassWithCommitHash(entryId: string, commitHash: string): void;
71
+ /**
72
+ * Get all bypass entries for a specific author
73
+ */
74
+ export declare function getBypassesByAuthor(authorEmail: string): BypassEntry[];
75
+ /**
76
+ * Get recent bypass entries (last N days)
77
+ */
78
+ export declare function getRecentBypasses(days?: number): BypassEntry[];
79
+ /**
80
+ * Delete bypass entries (ADMIN ONLY)
81
+ * @param entryIds - Array of entry IDs to delete
82
+ * @param adminPassword - Admin password for verification
83
+ * @returns Success status and message
84
+ */
85
+ export declare function deleteBypassEntries(entryIds: string[], adminPassword: string): {
86
+ success: boolean;
87
+ message: string;
88
+ deletedCount: number;
89
+ };
90
+ /**
91
+ * Get all archived logs (deleted and tampered)
92
+ */
93
+ export declare function getArchivedLogs(): {
94
+ deleted: string[];
95
+ tampered: string[];
96
+ };
97
+ /**
98
+ * Generate a bypass audit report
99
+ */
100
+ export declare function generateBypassReport(): string;
101
+ //# sourceMappingURL=bypass-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bypass-manager.d.ts","sourceRoot":"","sources":["../../../scripts/utils/bypass-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,MAAM,EAAE,gBAAgB,GAAG,cAAc,GAAG,UAAU,CAAC;CACxD;AAED,MAAM,WAAW,SAAS;IACxB,yBAAyB;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,SAAS,EAAE,OAAO,CAAC;CACpB;AA8CD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAY3D;AA0BD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAa1D;AAgLD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,gBAAgB,GAAG,cAAc,GAAG,UAAU,GACrD,IAAI,CA4BN;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAQpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAGtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAW,GAAG,WAAW,EAAE,CAMlE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,aAAa,EAAE,MAAM,GACpB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAgD7D;AA6BD;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAa3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAsC7C"}