@hatem427/code-guard-ci 1.0.5 → 1.1.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 (37) hide show
  1. package/README.md +37 -8
  2. package/dist/scripts/cli.js +15 -4
  3. package/dist/scripts/cli.js.map +1 -1
  4. package/dist/scripts/precommit-check.d.ts.map +1 -1
  5. package/dist/scripts/precommit-check.js +32 -15
  6. package/dist/scripts/precommit-check.js.map +1 -1
  7. package/dist/scripts/setup-supabase.d.ts +8 -0
  8. package/dist/scripts/setup-supabase.d.ts.map +1 -0
  9. package/dist/scripts/setup-supabase.js +172 -0
  10. package/dist/scripts/setup-supabase.js.map +1 -0
  11. package/dist/scripts/test-remote-db.d.ts +8 -0
  12. package/dist/scripts/test-remote-db.d.ts.map +1 -0
  13. package/dist/scripts/test-remote-db.js +15 -0
  14. package/dist/scripts/test-remote-db.js.map +1 -0
  15. package/dist/scripts/utils/bypass-manager.d.ts +1 -1
  16. package/dist/scripts/utils/bypass-manager.d.ts.map +1 -1
  17. package/dist/scripts/utils/bypass-manager.js +29 -1
  18. package/dist/scripts/utils/bypass-manager.js.map +1 -1
  19. package/dist/scripts/utils/remote-logger.d.ts +49 -0
  20. package/dist/scripts/utils/remote-logger.d.ts.map +1 -0
  21. package/dist/scripts/utils/remote-logger.js +251 -0
  22. package/dist/scripts/utils/remote-logger.js.map +1 -0
  23. package/dist/scripts/utils/security-check.d.ts +12 -0
  24. package/dist/scripts/utils/security-check.d.ts.map +1 -0
  25. package/dist/scripts/utils/security-check.js +126 -0
  26. package/dist/scripts/utils/security-check.js.map +1 -0
  27. package/dist/scripts/view-bypass-log.js +35 -2
  28. package/dist/scripts/view-bypass-log.js.map +1 -1
  29. package/package.json +5 -1
  30. package/scripts/cli.ts +16 -4
  31. package/scripts/precommit-check.ts +38 -14
  32. package/scripts/setup-supabase.ts +158 -0
  33. package/scripts/test-remote-db.ts +14 -0
  34. package/scripts/utils/bypass-manager.ts +30 -2
  35. package/scripts/utils/remote-logger.ts +256 -0
  36. package/scripts/utils/security-check.ts +108 -0
  37. package/scripts/view-bypass-log.ts +37 -2
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ============================================================================
4
+ * first-run-check.ts — Force password change on first use
5
+ * ============================================================================
6
+ */
7
+
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+
11
+ const BYPASS_DIR = '.code-guardian';
12
+ const PASSWORD_FILE = 'bypass-password.hash';
13
+ const ADMIN_FILE = 'admin-credentials.hash';
14
+ const SETUP_COMPLETE_FILE = 'setup-complete';
15
+
16
+ const DEFAULT_PASSWORD_HASH = '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92';
17
+ const DEFAULT_ADMIN_PASSWORD_HASH = '240be518fabd2724ddb6f04eeb1da5967448d7e831c08c8fa822809f74c720a9';
18
+
19
+ function checkSecurity(): boolean {
20
+ const dir = path.join(process.cwd(), BYPASS_DIR);
21
+ const setupFile = path.join(dir, SETUP_COMPLETE_FILE);
22
+
23
+ // If setup already complete, skip
24
+ if (fs.existsSync(setupFile)) {
25
+ return true;
26
+ }
27
+
28
+ const passwordPath = path.join(dir, PASSWORD_FILE);
29
+ const adminPath = path.join(dir, ADMIN_FILE);
30
+
31
+ // Check if still using default passwords
32
+ const usingDefaultBypass = !fs.existsSync(passwordPath) ||
33
+ fs.readFileSync(passwordPath, 'utf-8').trim() === DEFAULT_PASSWORD_HASH;
34
+
35
+ const usingDefaultAdmin = !fs.existsSync(adminPath) ||
36
+ fs.readFileSync(adminPath, 'utf-8').trim() === DEFAULT_ADMIN_PASSWORD_HASH;
37
+
38
+ if (usingDefaultBypass || usingDefaultAdmin) {
39
+ console.error(`
40
+ ╔═══════════════════════════════════════════════════════════╗
41
+ ║ 🔒 CRITICAL SECURITY WARNING 🔒 ║
42
+ ╚═══════════════════════════════════════════════════════════╝
43
+
44
+ ⚠️ You are using DEFAULT PASSWORDS! This is a SECURITY RISK!
45
+
46
+ Default passwords are publicly known and published in the source code:
47
+ - Bypass password: "bypass123"
48
+ - Admin password: "admin123"
49
+
50
+ Anyone who can see your repository can bypass ALL security checks!
51
+
52
+ 📋 REQUIRED ACTIONS (Run both commands):
53
+
54
+ 1. Set bypass password:
55
+ npm run set-bypass-password
56
+
57
+ 2. Set admin password:
58
+ npm run set-admin-password
59
+
60
+ ❌ ALL COMMITS ARE BLOCKED until you change these passwords.
61
+
62
+ 💡 To skip this check temporarily (NOT RECOMMENDED):
63
+ SKIP_SECURITY_CHECK=true git commit -m "message"
64
+
65
+ `);
66
+ return false;
67
+ }
68
+
69
+ // Mark setup as complete
70
+ if (!fs.existsSync(dir)) {
71
+ fs.mkdirSync(dir, { recursive: true });
72
+ }
73
+ fs.writeFileSync(setupFile, new Date().toISOString());
74
+
75
+ console.log('✅ Security check passed - passwords have been changed from defaults.\n');
76
+
77
+ return true;
78
+ }
79
+
80
+ /**
81
+ * Allow skipping security check with env var (for emergencies)
82
+ */
83
+ function shouldSkipSecurityCheck(): boolean {
84
+ return process.env.SKIP_SECURITY_CHECK === 'true';
85
+ }
86
+
87
+ /**
88
+ * Main security check with skip option
89
+ */
90
+ function performSecurityCheck(): boolean {
91
+ // Allow skip in CI/CD or emergencies
92
+ if (shouldSkipSecurityCheck()) {
93
+ console.warn('⚠️ Security check skipped via SKIP_SECURITY_CHECK env var');
94
+ return true;
95
+ }
96
+
97
+ return checkSecurity();
98
+ }
99
+
100
+ // Export for use in precommit-check
101
+ export { performSecurityCheck as checkSecurity };
102
+
103
+ // Run if called directly
104
+ if (require.main === module) {
105
+ if (!performSecurityCheck()) {
106
+ process.exit(1);
107
+ }
108
+ }
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import { generateBypassReport, getBypassesByAuthor, getRecentBypasses } from './utils/bypass-manager';
14
+ import { fetchBypassLogs, isRemoteLoggingEnabled } from './utils/remote-logger';
14
15
  import * as logger from './utils/logger';
15
16
 
16
17
  function parseArgs(): { author?: string; days?: number } {
@@ -34,10 +35,41 @@ function parseArgs(): { author?: string; days?: number } {
34
35
  return opts;
35
36
  }
36
37
 
37
- function main() {
38
+ async function main() {
38
39
  logger.header('📊 Code Guardian — Bypass Audit Log');
39
40
 
40
41
  const opts = parseArgs();
42
+ const remoteEnabled = isRemoteLoggingEnabled();
43
+
44
+ // Try remote logs first
45
+ if (remoteEnabled) {
46
+ try {
47
+ console.log('📡 Fetching from remote database...\n');
48
+ const remoteLogs = await fetchBypassLogs();
49
+
50
+ if (remoteLogs.length === 0) {
51
+ console.log('✅ No bypasses recorded.\n');
52
+ return;
53
+ }
54
+
55
+ console.log(`Found ${remoteLogs.length} bypass(es):\n`);
56
+ remoteLogs.forEach((entry: any, idx: number) => {
57
+ const date = new Date(entry.timestamp).toLocaleString();
58
+ console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
59
+ console.log(`${idx + 1}. ${entry.author.name} <${entry.author.email}>`);
60
+ console.log(` 📅 ${date}`);
61
+ console.log(` 📝 ${entry.reason}`);
62
+ console.log(` 🌿 ${entry.branch}`);
63
+ console.log(` 🔑 ${entry.method}`);
64
+ console.log(` 📁 ${entry.files.length} file(s)`);
65
+ console.log('');
66
+ });
67
+ return;
68
+ } catch (error: any) {
69
+ console.warn('⚠️ Failed to fetch remote logs:', error.message);
70
+ console.log('Falling back to local logs...\n');
71
+ }
72
+ }
41
73
 
42
74
  if (opts.author) {
43
75
  logger.info(`Filtering by author: ${opts.author}`);
@@ -89,4 +121,7 @@ function main() {
89
121
  }
90
122
  }
91
123
 
92
- main();
124
+ main().catch((err) => {
125
+ console.error('❌ Error:', err.message);
126
+ process.exit(1);
127
+ });