@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 @@
1
+ {"version":3,"file":"file-checker.js","sourceRoot":"","sources":["../../../scripts/utils/file-checker.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCH,wCAWC;AAMD,4CAcC;AAKD,4CAMC;AAOD,oCAoBC;AAKD,0CAiBC;AAQD,kCA0BC;AAKD,0CAEC;AAMD,sDAcC;AAMD,0DAGC;AAMD,oDAkBC;AAKD,8BAEC;AAKD,gDAEC;AAKD,kCAEC;AAlPD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAyC;AA4BzC,+EAA+E;AAE/E;;;GAGG;AACH,SAAgB,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,+CAA+C,EAAE;YACvE,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB;IAC9B,IAAI,CAAC;QACH,+DAA+D;QAC/D,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACnE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;QAED,uEAAuE;QACvE,OAAO,IAAA,wBAAQ,EAAC,oCAAoC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB;IAC9B,IAAI,CAAC;QACH,OAAO,IAAA,wBAAQ,EAAC,iCAAiC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E;;GAEG;AACH,SAAgB,YAAY,CAAC,YAAoB;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,OAAO;YACL,YAAY;YACZ,YAAY;YACZ,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO;YACP,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,MAAM;SACxB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,UAAqB;IACnD,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEjD,qDAAqD;QACrD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrE,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,SAAgB,WAAW,CAAC,IAAc,EAAE,OAAe;IACzD,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,+BAA+B;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpF,SAAS;QACX,CAAC;QAED,qCAAqC;QACrC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QAEtB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU;gBACvB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,KAAK,CAAC,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,IAAc,EAAE,QAAgB;IAC9D,OAAO,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,IAAc;IAClD,MAAM,aAAa,GAAG,6BAA6B,CAAC;IACpD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,iDAAiD;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAE5C,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACjB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,IAAc;IACpD,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,IAAc,EAAE,MAAc,EAAE,UAAkB;IACrF,wBAAwB;IACxB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,yBAAyB,MAAM,EAAE,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB;IACvB,IAAI,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,yBAAyB,MAAM,EAAE,CAAC,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sDAAsD;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,8BAA8B,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,IAAc;IACtC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,IAAc;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAc;IACxC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ============================================================================
3
+ * logger.ts — Colored, structured console output for the Code Guardian toolkit
4
+ * ============================================================================
5
+ *
6
+ * Provides severity-based logging with ANSI color codes.
7
+ * No external dependency required (chalk is optional — we use raw ANSI here
8
+ * for zero-dep portability).
9
+ */
10
+ /** Informational message — cyan prefix */
11
+ export declare function info(msg: string): void;
12
+ /** Success message — green prefix */
13
+ export declare function success(msg: string): void;
14
+ /** Warning message — yellow prefix */
15
+ export declare function warn(msg: string): void;
16
+ /** Error message — red prefix */
17
+ export declare function error(msg: string): void;
18
+ /** Section header — bold magenta divider */
19
+ export declare function header(title: string): void;
20
+ /** Dim helper text */
21
+ export declare function dim(msg: string): void;
22
+ /** Print a violation detail line */
23
+ export declare function violation(file: string, line: number | null, rule: string, message: string): void;
24
+ /** Print a summary banner */
25
+ export declare function summary(errors: number, warnings: number): void;
26
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../scripts/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2BH,0CAA0C;AAC1C,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,qCAAqC;AACrC,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,sCAAsC;AACtC,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,iCAAiC;AACjC,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,4CAA4C;AAC5C,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAK1C;AAED,sBAAsB;AACtB,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErC;AAED,oCAAoC;AACpC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKhG;AAED,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAU9D"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /**
3
+ * ============================================================================
4
+ * logger.ts — Colored, structured console output for the Code Guardian toolkit
5
+ * ============================================================================
6
+ *
7
+ * Provides severity-based logging with ANSI color codes.
8
+ * No external dependency required (chalk is optional — we use raw ANSI here
9
+ * for zero-dep portability).
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.info = info;
13
+ exports.success = success;
14
+ exports.warn = warn;
15
+ exports.error = error;
16
+ exports.header = header;
17
+ exports.dim = dim;
18
+ exports.violation = violation;
19
+ exports.summary = summary;
20
+ // ── ANSI escape helpers ─────────────────────────────────────────────────────
21
+ const RESET = '\x1b[0m';
22
+ const BOLD = '\x1b[1m';
23
+ const DIM = '\x1b[2m';
24
+ const FG = {
25
+ red: '\x1b[31m',
26
+ green: '\x1b[32m',
27
+ yellow: '\x1b[33m',
28
+ blue: '\x1b[34m',
29
+ magenta: '\x1b[35m',
30
+ cyan: '\x1b[36m',
31
+ white: '\x1b[37m',
32
+ gray: '\x1b[90m',
33
+ };
34
+ const BG = {
35
+ red: '\x1b[41m',
36
+ green: '\x1b[42m',
37
+ yellow: '\x1b[43m',
38
+ };
39
+ // ── Public API ──────────────────────────────────────────────────────────────
40
+ /** Informational message — cyan prefix */
41
+ function info(msg) {
42
+ console.log(`${FG.cyan}ℹ ${BOLD}[INFO]${RESET}${FG.cyan} ${msg}${RESET}`);
43
+ }
44
+ /** Success message — green prefix */
45
+ function success(msg) {
46
+ console.log(`${FG.green}✔ ${BOLD}[PASS]${RESET}${FG.green} ${msg}${RESET}`);
47
+ }
48
+ /** Warning message — yellow prefix */
49
+ function warn(msg) {
50
+ console.log(`${FG.yellow}⚠ ${BOLD}[WARN]${RESET}${FG.yellow} ${msg}${RESET}`);
51
+ }
52
+ /** Error message — red prefix */
53
+ function error(msg) {
54
+ console.error(`${FG.red}✖ ${BOLD}[FAIL]${RESET}${FG.red} ${msg}${RESET}`);
55
+ }
56
+ /** Section header — bold magenta divider */
57
+ function header(title) {
58
+ const line = '─'.repeat(60);
59
+ console.log(`\n${FG.magenta}${BOLD}${line}${RESET}`);
60
+ console.log(`${FG.magenta}${BOLD} ${title}${RESET}`);
61
+ console.log(`${FG.magenta}${BOLD}${line}${RESET}\n`);
62
+ }
63
+ /** Dim helper text */
64
+ function dim(msg) {
65
+ console.log(`${DIM} ${msg}${RESET}`);
66
+ }
67
+ /** Print a violation detail line */
68
+ function violation(file, line, rule, message) {
69
+ const loc = line !== null ? `:${line}` : '';
70
+ console.log(` ${FG.red}✖${RESET} ${FG.white}${file}${loc}${RESET} ${DIM}[${rule}]${RESET} ${FG.yellow}${message}${RESET}`);
71
+ }
72
+ /** Print a summary banner */
73
+ function summary(errors, warnings) {
74
+ console.log('');
75
+ if (errors === 0 && warnings === 0) {
76
+ console.log(`${BG.green}${FG.white}${BOLD} ✔ ALL CHECKS PASSED ${RESET}`);
77
+ }
78
+ else if (errors === 0) {
79
+ console.log(`${BG.yellow}${FG.white}${BOLD} ⚠ ${warnings} WARNING(S) — COMMIT ALLOWED ${RESET}`);
80
+ }
81
+ else {
82
+ console.log(`${BG.red}${FG.white}${BOLD} ✖ ${errors} ERROR(S), ${warnings} WARNING(S) — COMMIT BLOCKED ${RESET}`);
83
+ }
84
+ console.log('');
85
+ }
86
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../scripts/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * ============================================================================
3
+ * project-detector.ts — Automatically detect the frontend framework in use
4
+ * ============================================================================
5
+ *
6
+ * Inspects the project's package.json and file system to determine whether the
7
+ * current repository uses Angular, React, NextJS, or an unknown framework.
8
+ * This drives which set of coding rules should be enforced.
9
+ */
10
+ export type ProjectType = 'angular' | 'react' | 'nextjs' | 'unknown';
11
+ export interface DetectionResult {
12
+ /** Which framework was detected */
13
+ type: ProjectType;
14
+ /** Human-readable label for logging */
15
+ label: string;
16
+ /** Root directory of the project */
17
+ rootDir: string;
18
+ /** package.json contents (parsed) */
19
+ packageJson: Record<string, any>;
20
+ }
21
+ /**
22
+ * Detect the project type based on the nearest package.json.
23
+ *
24
+ * Priority order (first match wins):
25
+ * 1. NextJS — has `next` as a dependency
26
+ * 2. Angular — has `@angular/core` as a dependency
27
+ * 3. React — has `react` as a dependency
28
+ * 4. Unknown — none of the above
29
+ *
30
+ * NextJS is checked first because it also pulls in React, so we want
31
+ * the more specific framework to win.
32
+ */
33
+ export declare function detectProject(startDir?: string): DetectionResult;
34
+ //# sourceMappingURL=project-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../../scripts/utils/project-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,IAAI,EAAE,WAAW,CAAC;IAClB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAsCD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,QAAQ,GAAE,MAAsB,GAAG,eAAe,CAsC/E"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ /**
3
+ * ============================================================================
4
+ * project-detector.ts — Automatically detect the frontend framework in use
5
+ * ============================================================================
6
+ *
7
+ * Inspects the project's package.json and file system to determine whether the
8
+ * current repository uses Angular, React, NextJS, or an unknown framework.
9
+ * This drives which set of coding rules should be enforced.
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
+ exports.detectProject = detectProject;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ // ── Detection logic ─────────────────────────────────────────────────────────
49
+ /**
50
+ * Read the nearest package.json starting from `startDir` and walking up.
51
+ * Returns the parsed contents and the directory that contained it.
52
+ */
53
+ function findPackageJson(startDir) {
54
+ let current = path.resolve(startDir);
55
+ while (true) {
56
+ const candidate = path.join(current, 'package.json');
57
+ if (fs.existsSync(candidate)) {
58
+ try {
59
+ const content = fs.readFileSync(candidate, 'utf-8');
60
+ return { dir: current, pkg: JSON.parse(content) };
61
+ }
62
+ catch {
63
+ // Malformed JSON — keep walking
64
+ }
65
+ }
66
+ const parent = path.dirname(current);
67
+ if (parent === current)
68
+ break; // reached filesystem root
69
+ current = parent;
70
+ }
71
+ return null;
72
+ }
73
+ /**
74
+ * Check whether a dependency name exists in `dependencies` or
75
+ * `devDependencies` of the given package.json object.
76
+ */
77
+ function hasDep(pkg, name) {
78
+ return !!(pkg.dependencies?.[name] || pkg.devDependencies?.[name]);
79
+ }
80
+ /**
81
+ * Detect the project type based on the nearest package.json.
82
+ *
83
+ * Priority order (first match wins):
84
+ * 1. NextJS — has `next` as a dependency
85
+ * 2. Angular — has `@angular/core` as a dependency
86
+ * 3. React — has `react` as a dependency
87
+ * 4. Unknown — none of the above
88
+ *
89
+ * NextJS is checked first because it also pulls in React, so we want
90
+ * the more specific framework to win.
91
+ */
92
+ function detectProject(startDir = process.cwd()) {
93
+ const result = findPackageJson(startDir);
94
+ if (!result) {
95
+ return {
96
+ type: 'unknown',
97
+ label: 'Unknown Project',
98
+ rootDir: startDir,
99
+ packageJson: {},
100
+ };
101
+ }
102
+ const { dir, pkg } = result;
103
+ // NextJS check (must come before React — NextJS depends on React)
104
+ if (hasDep(pkg, 'next')) {
105
+ return { type: 'nextjs', label: 'Next.js', rootDir: dir, packageJson: pkg };
106
+ }
107
+ // Angular check
108
+ if (hasDep(pkg, '@angular/core')) {
109
+ return { type: 'angular', label: 'Angular', rootDir: dir, packageJson: pkg };
110
+ }
111
+ // React check
112
+ if (hasDep(pkg, 'react')) {
113
+ return { type: 'react', label: 'React', rootDir: dir, packageJson: pkg };
114
+ }
115
+ // Fallback — additional heuristics
116
+ if (fs.existsSync(path.join(dir, 'angular.json'))) {
117
+ return { type: 'angular', label: 'Angular (heuristic)', rootDir: dir, packageJson: pkg };
118
+ }
119
+ if (fs.existsSync(path.join(dir, 'next.config.js')) || fs.existsSync(path.join(dir, 'next.config.mjs'))) {
120
+ return { type: 'nextjs', label: 'Next.js (heuristic)', rootDir: dir, packageJson: pkg };
121
+ }
122
+ return { type: 'unknown', label: 'Unknown Project', rootDir: dir, packageJson: pkg };
123
+ }
124
+ //# sourceMappingURL=project-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../../scripts/utils/project-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ============================================================================
3
+ * rule-engine.ts — Orchestrates rule execution against a set of files
4
+ * ============================================================================
5
+ *
6
+ * The rule engine is the core processor. It takes a list of files and a list
7
+ * of rules, then runs each rule against each applicable file. Results are
8
+ * collected into a structured report.
9
+ */
10
+ import { Rule, Severity } from '../../config/guidelines.config';
11
+ import { FileInfo } from './file-checker';
12
+ export interface Violation {
13
+ /** The file where the violation was found */
14
+ file: string;
15
+ /** 1-based line number (null for file-level violations) */
16
+ line: number | null;
17
+ /** The rule that was violated */
18
+ ruleId: string;
19
+ /** Human-readable label */
20
+ ruleLabel: string;
21
+ /** Description of the violation */
22
+ message: string;
23
+ /** How severe is this? */
24
+ severity: Severity;
25
+ /** Category for grouping */
26
+ category: string;
27
+ }
28
+ export interface RuleEngineReport {
29
+ /** All violations found */
30
+ violations: Violation[];
31
+ /** Total number of error-severity violations */
32
+ errorCount: number;
33
+ /** Total number of warning-severity violations */
34
+ warningCount: number;
35
+ /** Total number of info-severity violations */
36
+ infoCount: number;
37
+ /** How many files were checked */
38
+ filesChecked: number;
39
+ /** How many rules were executed */
40
+ rulesExecuted: number;
41
+ /** Was the check bypassed? */
42
+ bypassed: boolean;
43
+ }
44
+ /**
45
+ * Run all `rules` against all `files` and collect a report.
46
+ *
47
+ * @param files - The list of files to check (usually staged files).
48
+ * @param rules - The list of rules to apply.
49
+ * @param verbose - If true, logs each rule as it runs.
50
+ * @returns A structured report of all findings.
51
+ */
52
+ export declare function executeRules(files: FileInfo[], rules: Rule[], verbose?: boolean): RuleEngineReport;
53
+ /**
54
+ * Display a pretty-printed report in the terminal.
55
+ */
56
+ export declare function printReport(report: RuleEngineReport): void;
57
+ //# sourceMappingURL=rule-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../../../scripts/utils/rule-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAqC,MAAM,gBAAgB,CAAC;AAK7E,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,GAAE,OAAe,GACvB,gBAAgB,CAiFlB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAmC1D"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * ============================================================================
4
+ * rule-engine.ts — Orchestrates rule execution against a set of files
5
+ * ============================================================================
6
+ *
7
+ * The rule engine is the core processor. It takes a list of files and a list
8
+ * of rules, then runs each rule against each applicable file. Results are
9
+ * collected into a structured report.
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
+ exports.executeRules = executeRules;
46
+ exports.printReport = printReport;
47
+ const file_checker_1 = require("./file-checker");
48
+ const logger = __importStar(require("./logger"));
49
+ // ── Engine ──────────────────────────────────────────────────────────────────
50
+ /**
51
+ * Run all `rules` against all `files` and collect a report.
52
+ *
53
+ * @param files - The list of files to check (usually staged files).
54
+ * @param rules - The list of rules to apply.
55
+ * @param verbose - If true, logs each rule as it runs.
56
+ * @returns A structured report of all findings.
57
+ */
58
+ function executeRules(files, rules, verbose = false) {
59
+ const violations = [];
60
+ let rulesExecuted = 0;
61
+ for (const rule of rules) {
62
+ rulesExecuted++;
63
+ if (verbose) {
64
+ logger.dim(`Running rule: ${rule.id} — ${rule.label}`);
65
+ }
66
+ for (const file of files) {
67
+ // ── Extension filter ──────────────────────────────────────────────
68
+ if (rule.fileExtensions.length > 0 &&
69
+ !rule.fileExtensions.includes(file.extension)) {
70
+ continue;
71
+ }
72
+ // ── Regex-based check ─────────────────────────────────────────────
73
+ if (rule.pattern) {
74
+ const matches = (0, file_checker_1.findMatches)(file, rule.pattern);
75
+ for (const match of matches) {
76
+ // Check for inline suppression
77
+ if ((0, file_checker_1.hasInlineSuppression)(file, rule.id, match.line)) {
78
+ continue;
79
+ }
80
+ violations.push({
81
+ file: file.relativePath,
82
+ line: match.line,
83
+ ruleId: rule.id,
84
+ ruleLabel: rule.label,
85
+ message: `${rule.description} (found: "${match.text.substring(0, 80)}")`,
86
+ severity: rule.severity,
87
+ category: rule.category,
88
+ });
89
+ }
90
+ }
91
+ // ── Custom check ──────────────────────────────────────────────────
92
+ if (rule.customCheck) {
93
+ const customViolations = rule.customCheck(file);
94
+ for (const cv of customViolations) {
95
+ // Check for inline suppression (if there's a line number)
96
+ if (cv.line && (0, file_checker_1.hasInlineSuppression)(file, rule.id, cv.line)) {
97
+ continue;
98
+ }
99
+ violations.push({
100
+ file: file.relativePath,
101
+ line: cv.line,
102
+ ruleId: rule.id,
103
+ ruleLabel: rule.label,
104
+ message: cv.message,
105
+ severity: rule.severity,
106
+ category: rule.category,
107
+ });
108
+ }
109
+ }
110
+ }
111
+ }
112
+ // ── Count by severity ─────────────────────────────────────────────────
113
+ const errorCount = violations.filter((v) => v.severity === 'error').length;
114
+ const warningCount = violations.filter((v) => v.severity === 'warning').length;
115
+ const infoCount = violations.filter((v) => v.severity === 'info').length;
116
+ return {
117
+ violations,
118
+ errorCount,
119
+ warningCount,
120
+ infoCount,
121
+ filesChecked: files.length,
122
+ rulesExecuted,
123
+ bypassed: false,
124
+ };
125
+ }
126
+ /**
127
+ * Display a pretty-printed report in the terminal.
128
+ */
129
+ function printReport(report) {
130
+ if (report.bypassed) {
131
+ logger.warn('Rules bypassed — skipping checks.');
132
+ return;
133
+ }
134
+ logger.header(`Code Guardian Report — ${report.filesChecked} file(s), ${report.rulesExecuted} rule(s)`);
135
+ if (report.violations.length === 0) {
136
+ logger.success('No violations found!');
137
+ logger.summary(0, 0);
138
+ return;
139
+ }
140
+ // Group violations by category
141
+ const byCategory = new Map();
142
+ for (const v of report.violations) {
143
+ const existing = byCategory.get(v.category) || [];
144
+ existing.push(v);
145
+ byCategory.set(v.category, existing);
146
+ }
147
+ for (const [category, items] of byCategory) {
148
+ console.log(`\n 📂 ${category}`);
149
+ for (const v of items) {
150
+ logger.violation(v.file, v.line, v.ruleId, v.message);
151
+ }
152
+ }
153
+ logger.summary(report.errorCount, report.warningCount);
154
+ if (report.infoCount > 0) {
155
+ logger.info(`${report.infoCount} informational notice(s) — consider addressing them.`);
156
+ }
157
+ }
158
+ //# sourceMappingURL=rule-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../../../scripts/utils/rule-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ts-node
2
+ /**
3
+ * ============================================================================
4
+ * view-bypass-log.ts — View bypass audit log
5
+ * ============================================================================
6
+ *
7
+ * Usage:
8
+ * npm run view-bypass-log
9
+ * npm run view-bypass-log -- --author="john@example.com"
10
+ * npm run view-bypass-log -- --days=7
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=view-bypass-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-bypass-log.d.ts","sourceRoot":"","sources":["../../scripts/view-bypass-log.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}