@nahisaho/musubix-security 1.8.0 → 1.8.5

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 (186) hide show
  1. package/README.md +27 -0
  2. package/dist/analyzers/ai/index.d.ts +6 -0
  3. package/dist/analyzers/ai/index.d.ts.map +1 -0
  4. package/dist/analyzers/ai/index.js +6 -0
  5. package/dist/analyzers/ai/index.js.map +1 -0
  6. package/dist/analyzers/ai/prompt-injection-detector.d.ts +152 -0
  7. package/dist/analyzers/ai/prompt-injection-detector.d.ts.map +1 -0
  8. package/dist/analyzers/ai/prompt-injection-detector.js +468 -0
  9. package/dist/analyzers/ai/prompt-injection-detector.js.map +1 -0
  10. package/dist/analyzers/api/api-security-analyzer.d.ts +263 -0
  11. package/dist/analyzers/api/api-security-analyzer.d.ts.map +1 -0
  12. package/dist/analyzers/api/api-security-analyzer.js +581 -0
  13. package/dist/analyzers/api/api-security-analyzer.js.map +1 -0
  14. package/dist/analyzers/compliance/compliance-checker.d.ts +201 -0
  15. package/dist/analyzers/compliance/compliance-checker.d.ts.map +1 -0
  16. package/dist/analyzers/compliance/compliance-checker.js +772 -0
  17. package/dist/analyzers/compliance/compliance-checker.js.map +1 -0
  18. package/dist/analyzers/container/image-scanner.d.ts +163 -0
  19. package/dist/analyzers/container/image-scanner.d.ts.map +1 -0
  20. package/dist/analyzers/container/image-scanner.js +459 -0
  21. package/dist/analyzers/container/image-scanner.js.map +1 -0
  22. package/dist/analyzers/container/index.d.ts +6 -0
  23. package/dist/analyzers/container/index.d.ts.map +1 -0
  24. package/dist/analyzers/container/index.js +6 -0
  25. package/dist/analyzers/container/index.js.map +1 -0
  26. package/dist/analyzers/dashboard/security-dashboard.d.ts +286 -0
  27. package/dist/analyzers/dashboard/security-dashboard.d.ts.map +1 -0
  28. package/dist/analyzers/dashboard/security-dashboard.js +796 -0
  29. package/dist/analyzers/dashboard/security-dashboard.js.map +1 -0
  30. package/dist/analyzers/iac/iac-checker.d.ts +124 -0
  31. package/dist/analyzers/iac/iac-checker.d.ts.map +1 -0
  32. package/dist/analyzers/iac/iac-checker.js +755 -0
  33. package/dist/analyzers/iac/iac-checker.js.map +1 -0
  34. package/dist/analyzers/iac/index.d.ts +6 -0
  35. package/dist/analyzers/iac/index.d.ts.map +1 -0
  36. package/dist/analyzers/iac/index.js +6 -0
  37. package/dist/analyzers/iac/index.js.map +1 -0
  38. package/dist/analyzers/index.d.ts +9 -0
  39. package/dist/analyzers/index.d.ts.map +1 -0
  40. package/dist/analyzers/index.js +13 -0
  41. package/dist/analyzers/index.js.map +1 -0
  42. package/dist/analyzers/monitor/realtime-monitor.d.ts +216 -0
  43. package/dist/analyzers/monitor/realtime-monitor.d.ts.map +1 -0
  44. package/dist/analyzers/monitor/realtime-monitor.js +601 -0
  45. package/dist/analyzers/monitor/realtime-monitor.js.map +1 -0
  46. package/dist/analyzers/sast/index.d.ts +7 -0
  47. package/dist/analyzers/sast/index.d.ts.map +1 -0
  48. package/dist/analyzers/sast/index.js +7 -0
  49. package/dist/analyzers/sast/index.js.map +1 -0
  50. package/dist/analyzers/sast/interprocedural-analyzer.d.ts +276 -0
  51. package/dist/analyzers/sast/interprocedural-analyzer.d.ts.map +1 -0
  52. package/dist/analyzers/sast/interprocedural-analyzer.js +635 -0
  53. package/dist/analyzers/sast/interprocedural-analyzer.js.map +1 -0
  54. package/dist/analyzers/sast/zero-day-detector.d.ts +183 -0
  55. package/dist/analyzers/sast/zero-day-detector.d.ts.map +1 -0
  56. package/dist/analyzers/sast/zero-day-detector.js +593 -0
  57. package/dist/analyzers/sast/zero-day-detector.js.map +1 -0
  58. package/dist/analyzers/sca/dependency-scanner.d.ts +275 -0
  59. package/dist/analyzers/sca/dependency-scanner.d.ts.map +1 -0
  60. package/dist/analyzers/sca/dependency-scanner.js +642 -0
  61. package/dist/analyzers/sca/dependency-scanner.js.map +1 -0
  62. package/dist/core/index.d.ts +8 -0
  63. package/dist/core/index.d.ts.map +1 -0
  64. package/dist/core/index.js +10 -0
  65. package/dist/core/index.js.map +1 -0
  66. package/dist/core/pipeline-manager.d.ts +105 -0
  67. package/dist/core/pipeline-manager.d.ts.map +1 -0
  68. package/dist/core/pipeline-manager.js +449 -0
  69. package/dist/core/pipeline-manager.js.map +1 -0
  70. package/dist/core/result-aggregator.d.ts +96 -0
  71. package/dist/core/result-aggregator.d.ts.map +1 -0
  72. package/dist/core/result-aggregator.js +462 -0
  73. package/dist/core/result-aggregator.js.map +1 -0
  74. package/dist/index.d.ts +15 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +68 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/integrations/ci-integration.d.ts +227 -0
  79. package/dist/integrations/ci-integration.d.ts.map +1 -0
  80. package/dist/integrations/ci-integration.js +472 -0
  81. package/dist/integrations/ci-integration.js.map +1 -0
  82. package/dist/integrations/git-hooks.d.ts +155 -0
  83. package/dist/integrations/git-hooks.d.ts.map +1 -0
  84. package/dist/integrations/git-hooks.js +425 -0
  85. package/dist/integrations/git-hooks.js.map +1 -0
  86. package/dist/integrations/index.d.ts +9 -0
  87. package/dist/integrations/index.d.ts.map +1 -0
  88. package/dist/integrations/index.js +9 -0
  89. package/dist/integrations/index.js.map +1 -0
  90. package/dist/integrations/report-aggregator.d.ts +250 -0
  91. package/dist/integrations/report-aggregator.d.ts.map +1 -0
  92. package/dist/integrations/report-aggregator.js +488 -0
  93. package/dist/integrations/report-aggregator.js.map +1 -0
  94. package/dist/integrations/vscode-integration.d.ts +245 -0
  95. package/dist/integrations/vscode-integration.d.ts.map +1 -0
  96. package/dist/integrations/vscode-integration.js +449 -0
  97. package/dist/integrations/vscode-integration.js.map +1 -0
  98. package/dist/intelligence/attack-pattern-matcher.d.ts +217 -0
  99. package/dist/intelligence/attack-pattern-matcher.d.ts.map +1 -0
  100. package/dist/intelligence/attack-pattern-matcher.js +887 -0
  101. package/dist/intelligence/attack-pattern-matcher.js.map +1 -0
  102. package/dist/intelligence/index.d.ts +12 -0
  103. package/dist/intelligence/index.d.ts.map +1 -0
  104. package/dist/intelligence/index.js +18 -0
  105. package/dist/intelligence/index.js.map +1 -0
  106. package/dist/intelligence/neuro-symbolic-core.d.ts +88 -0
  107. package/dist/intelligence/neuro-symbolic-core.d.ts.map +1 -0
  108. package/dist/intelligence/neuro-symbolic-core.js +403 -0
  109. package/dist/intelligence/neuro-symbolic-core.js.map +1 -0
  110. package/dist/intelligence/predictive-analyzer.d.ts +317 -0
  111. package/dist/intelligence/predictive-analyzer.d.ts.map +1 -0
  112. package/dist/intelligence/predictive-analyzer.js +714 -0
  113. package/dist/intelligence/predictive-analyzer.js.map +1 -0
  114. package/dist/intelligence/risk-scorer.d.ts +333 -0
  115. package/dist/intelligence/risk-scorer.d.ts.map +1 -0
  116. package/dist/intelligence/risk-scorer.js +824 -0
  117. package/dist/intelligence/risk-scorer.js.map +1 -0
  118. package/dist/intelligence/security-analytics.d.ts +349 -0
  119. package/dist/intelligence/security-analytics.d.ts.map +1 -0
  120. package/dist/intelligence/security-analytics.js +813 -0
  121. package/dist/intelligence/security-analytics.js.map +1 -0
  122. package/dist/intelligence/threat-intelligence.d.ts +288 -0
  123. package/dist/intelligence/threat-intelligence.d.ts.map +1 -0
  124. package/dist/intelligence/threat-intelligence.js +639 -0
  125. package/dist/intelligence/threat-intelligence.js.map +1 -0
  126. package/dist/policy/index.d.ts +6 -0
  127. package/dist/policy/index.d.ts.map +1 -0
  128. package/dist/policy/index.js +6 -0
  129. package/dist/policy/index.js.map +1 -0
  130. package/dist/policy/policy-engine.d.ts +254 -0
  131. package/dist/policy/policy-engine.d.ts.map +1 -0
  132. package/dist/policy/policy-engine.js +651 -0
  133. package/dist/policy/policy-engine.js.map +1 -0
  134. package/dist/remediation/auto-fixer.d.ts +179 -0
  135. package/dist/remediation/auto-fixer.d.ts.map +1 -0
  136. package/dist/remediation/auto-fixer.js +540 -0
  137. package/dist/remediation/auto-fixer.js.map +1 -0
  138. package/dist/remediation/fix-validator.d.ts +195 -0
  139. package/dist/remediation/fix-validator.d.ts.map +1 -0
  140. package/dist/remediation/fix-validator.js +462 -0
  141. package/dist/remediation/fix-validator.js.map +1 -0
  142. package/dist/remediation/index.d.ts +10 -0
  143. package/dist/remediation/index.d.ts.map +1 -0
  144. package/dist/remediation/index.js +15 -0
  145. package/dist/remediation/index.js.map +1 -0
  146. package/dist/remediation/patch-generator.d.ts +203 -0
  147. package/dist/remediation/patch-generator.d.ts.map +1 -0
  148. package/dist/remediation/patch-generator.js +533 -0
  149. package/dist/remediation/patch-generator.js.map +1 -0
  150. package/dist/remediation/remediation-planner.d.ts +262 -0
  151. package/dist/remediation/remediation-planner.d.ts.map +1 -0
  152. package/dist/remediation/remediation-planner.js +531 -0
  153. package/dist/remediation/remediation-planner.js.map +1 -0
  154. package/dist/remediation/secure-code-transformer.d.ts +222 -0
  155. package/dist/remediation/secure-code-transformer.d.ts.map +1 -0
  156. package/dist/remediation/secure-code-transformer.js +625 -0
  157. package/dist/remediation/secure-code-transformer.js.map +1 -0
  158. package/dist/types/fix.d.ts +3 -1
  159. package/dist/types/fix.d.ts.map +1 -1
  160. package/dist/types/index.d.ts +6 -0
  161. package/dist/types/index.d.ts.map +1 -1
  162. package/dist/types/index.js +1 -0
  163. package/dist/types/index.js.map +1 -1
  164. package/dist/types/interprocedural.d.ts +203 -0
  165. package/dist/types/interprocedural.d.ts.map +1 -0
  166. package/dist/types/interprocedural.js +7 -0
  167. package/dist/types/interprocedural.js.map +1 -0
  168. package/dist/types/neuro-symbolic.d.ts +179 -0
  169. package/dist/types/neuro-symbolic.d.ts.map +1 -0
  170. package/dist/types/neuro-symbolic.js +7 -0
  171. package/dist/types/neuro-symbolic.js.map +1 -0
  172. package/dist/types/pipeline.d.ts +173 -0
  173. package/dist/types/pipeline.d.ts.map +1 -0
  174. package/dist/types/pipeline.js +7 -0
  175. package/dist/types/pipeline.js.map +1 -0
  176. package/dist/types/result.d.ts +134 -0
  177. package/dist/types/result.d.ts.map +1 -0
  178. package/dist/types/result.js +25 -0
  179. package/dist/types/result.js.map +1 -0
  180. package/dist/types/vulnerability.d.ts +2 -2
  181. package/dist/types/vulnerability.d.ts.map +1 -1
  182. package/dist/types/zero-day.d.ts +146 -0
  183. package/dist/types/zero-day.d.ts.map +1 -0
  184. package/dist/types/zero-day.js +7 -0
  185. package/dist/types/zero-day.js.map +1 -0
  186. package/package.json +2 -2
@@ -0,0 +1,472 @@
1
+ /**
2
+ * @fileoverview CI/CD Integration for Security Scanning
3
+ * @module @nahisaho/musubix-security/integrations/ci-integration
4
+ *
5
+ * Provides integration with GitHub Actions, GitLab CI, and other CI/CD platforms
6
+ * for automated security scanning in pipelines.
7
+ */
8
+ // ============================================================================
9
+ // CI Integration Class
10
+ // ============================================================================
11
+ /**
12
+ * CI/CD Integration for automated security scanning
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const ci = createCIIntegration({
17
+ * failOn: ['critical', 'high'],
18
+ * annotations: true,
19
+ * prComment: true,
20
+ * });
21
+ *
22
+ * const env = ci.detectEnvironment();
23
+ * const result = ci.processScanResult(scanResult);
24
+ *
25
+ * if (result.shouldFail) {
26
+ * process.exit(result.exitCode);
27
+ * }
28
+ * ```
29
+ */
30
+ export class CIIntegration {
31
+ options;
32
+ constructor(options = {}) {
33
+ this.options = {
34
+ failOn: options.failOn ?? ['critical', 'high'],
35
+ outputFormat: options.outputFormat ?? 'annotations',
36
+ annotations: options.annotations ?? true,
37
+ prComment: options.prComment ?? false,
38
+ uploadToCodeScanning: options.uploadToCodeScanning ?? false,
39
+ thresholds: options.thresholds ?? {},
40
+ enableCache: options.enableCache ?? true,
41
+ cacheKeyPrefix: options.cacheKeyPrefix ?? 'musubix-security',
42
+ };
43
+ }
44
+ /**
45
+ * Detect CI environment
46
+ */
47
+ detectEnvironment() {
48
+ const env = process.env;
49
+ // GitHub Actions
50
+ if (env.GITHUB_ACTIONS === 'true') {
51
+ return {
52
+ platform: 'github-actions',
53
+ isCI: true,
54
+ metadata: {
55
+ repository: env.GITHUB_REPOSITORY,
56
+ branch: env.GITHUB_REF_NAME ?? env.GITHUB_HEAD_REF,
57
+ commitSha: env.GITHUB_SHA,
58
+ pullRequest: env.GITHUB_EVENT_NAME === 'pull_request'
59
+ ? env.GITHUB_REF?.split('/')[2]
60
+ : undefined,
61
+ buildId: env.GITHUB_RUN_ID,
62
+ actor: env.GITHUB_ACTOR,
63
+ event: env.GITHUB_EVENT_NAME,
64
+ workflow: env.GITHUB_WORKFLOW,
65
+ runnerOS: env.RUNNER_OS,
66
+ },
67
+ };
68
+ }
69
+ // GitLab CI
70
+ if (env.GITLAB_CI === 'true') {
71
+ return {
72
+ platform: 'gitlab-ci',
73
+ isCI: true,
74
+ metadata: {
75
+ repository: env.CI_PROJECT_PATH,
76
+ branch: env.CI_COMMIT_REF_NAME,
77
+ commitSha: env.CI_COMMIT_SHA,
78
+ pullRequest: env.CI_MERGE_REQUEST_IID,
79
+ buildId: env.CI_PIPELINE_ID,
80
+ actor: env.GITLAB_USER_LOGIN,
81
+ event: env.CI_PIPELINE_SOURCE,
82
+ workflow: env.CI_JOB_NAME,
83
+ },
84
+ };
85
+ }
86
+ // Azure Pipelines
87
+ if (env.TF_BUILD === 'True') {
88
+ return {
89
+ platform: 'azure-pipelines',
90
+ isCI: true,
91
+ metadata: {
92
+ repository: env.BUILD_REPOSITORY_NAME,
93
+ branch: env.BUILD_SOURCEBRANCHNAME,
94
+ commitSha: env.BUILD_SOURCEVERSION,
95
+ pullRequest: env.SYSTEM_PULLREQUEST_PULLREQUESTID,
96
+ buildId: env.BUILD_BUILDID,
97
+ actor: env.BUILD_REQUESTEDFOR,
98
+ workflow: env.BUILD_DEFINITIONNAME,
99
+ },
100
+ };
101
+ }
102
+ // Jenkins
103
+ if (env.JENKINS_URL) {
104
+ return {
105
+ platform: 'jenkins',
106
+ isCI: true,
107
+ metadata: {
108
+ branch: env.GIT_BRANCH ?? env.BRANCH_NAME,
109
+ commitSha: env.GIT_COMMIT,
110
+ buildId: env.BUILD_NUMBER,
111
+ workflow: env.JOB_NAME,
112
+ },
113
+ };
114
+ }
115
+ // CircleCI
116
+ if (env.CIRCLECI === 'true') {
117
+ return {
118
+ platform: 'circleci',
119
+ isCI: true,
120
+ metadata: {
121
+ repository: env.CIRCLE_PROJECT_REPONAME,
122
+ branch: env.CIRCLE_BRANCH,
123
+ commitSha: env.CIRCLE_SHA1,
124
+ pullRequest: env.CIRCLE_PULL_REQUEST?.split('/').pop(),
125
+ buildId: env.CIRCLE_BUILD_NUM,
126
+ actor: env.CIRCLE_USERNAME,
127
+ workflow: env.CIRCLE_WORKFLOW_ID,
128
+ },
129
+ };
130
+ }
131
+ // Generic CI detection
132
+ const isCI = env.CI === 'true' || env.CONTINUOUS_INTEGRATION === 'true';
133
+ return {
134
+ platform: 'generic',
135
+ isCI,
136
+ metadata: {},
137
+ };
138
+ }
139
+ /**
140
+ * Process scan result for CI output
141
+ */
142
+ processScanResult(scanResult) {
143
+ const environment = this.detectEnvironment();
144
+ const annotations = this.generateAnnotations(scanResult);
145
+ const summary = this.generateSummary(scanResult);
146
+ const { shouldFail, failureReasons } = this.checkThresholds(scanResult, summary);
147
+ const formattedOutput = this.formatOutput(scanResult, environment, summary);
148
+ const exitCode = shouldFail ? 1 : 0;
149
+ return {
150
+ scanResult,
151
+ environment,
152
+ shouldFail,
153
+ failureReasons,
154
+ annotations,
155
+ formattedOutput,
156
+ exitCode,
157
+ summary,
158
+ };
159
+ }
160
+ /**
161
+ * Generate GitHub-style annotations
162
+ */
163
+ generateAnnotations(scanResult) {
164
+ if (!this.options.annotations) {
165
+ return [];
166
+ }
167
+ return scanResult.vulnerabilities.map((vuln) => ({
168
+ level: this.severityToAnnotationLevel(vuln.severity),
169
+ file: vuln.location.file,
170
+ startLine: vuln.location.startLine,
171
+ endLine: vuln.location.endLine ?? vuln.location.startLine,
172
+ title: `${vuln.severity.toUpperCase()}: ${vuln.ruleId}`,
173
+ message: `${vuln.description}\n\nRule: ${vuln.ruleId}\nOWASP: ${vuln.owasp?.join(', ') ?? 'N/A'}\nCWE: ${vuln.cwes?.join(', ') ?? 'N/A'}`,
174
+ }));
175
+ }
176
+ /**
177
+ * Generate summary for display
178
+ */
179
+ generateSummary(scanResult) {
180
+ const bySeverity = scanResult.summary;
181
+ const total = bySeverity.critical + bySeverity.high + bySeverity.medium + bySeverity.low + bySeverity.info;
182
+ // Calculate security score (100 - weighted penalty)
183
+ const penalty = bySeverity.critical * 25 +
184
+ bySeverity.high * 10 +
185
+ bySeverity.medium * 5 +
186
+ bySeverity.low * 2 +
187
+ bySeverity.info * 0.5;
188
+ const securityScore = Math.max(0, Math.min(100, 100 - penalty));
189
+ const passed = !this.shouldFailOnSeverity(scanResult) && !this.shouldFailOnThresholds(scanResult, { securityScore });
190
+ const statusEmoji = passed ? '✅' : '❌';
191
+ const shortDescription = passed
192
+ ? `${total} issues found (acceptable)`
193
+ : `${total} issues found (policy violation)`;
194
+ return {
195
+ total,
196
+ bySeverity: {
197
+ critical: bySeverity.critical,
198
+ high: bySeverity.high,
199
+ medium: bySeverity.medium,
200
+ low: bySeverity.low,
201
+ info: bySeverity.info,
202
+ },
203
+ securityScore: Math.round(securityScore),
204
+ passed,
205
+ statusEmoji,
206
+ shortDescription,
207
+ };
208
+ }
209
+ /**
210
+ * Check if build should fail based on thresholds
211
+ */
212
+ checkThresholds(scanResult, summary) {
213
+ const failureReasons = [];
214
+ // Check severity-based failure
215
+ if (this.shouldFailOnSeverity(scanResult)) {
216
+ const violations = this.options.failOn
217
+ .filter(severity => scanResult.summary[severity] > 0)
218
+ .map(severity => `${scanResult.summary[severity]} ${severity} vulnerability(s)`);
219
+ failureReasons.push(...violations);
220
+ }
221
+ // Check threshold-based failure
222
+ const thresholds = this.options.thresholds;
223
+ if (thresholds.maxCritical !== undefined && summary.bySeverity.critical > thresholds.maxCritical) {
224
+ failureReasons.push(`Critical vulnerabilities (${summary.bySeverity.critical}) exceed threshold (${thresholds.maxCritical})`);
225
+ }
226
+ if (thresholds.maxHigh !== undefined && summary.bySeverity.high > thresholds.maxHigh) {
227
+ failureReasons.push(`High vulnerabilities (${summary.bySeverity.high}) exceed threshold (${thresholds.maxHigh})`);
228
+ }
229
+ if (thresholds.maxMedium !== undefined && summary.bySeverity.medium > thresholds.maxMedium) {
230
+ failureReasons.push(`Medium vulnerabilities (${summary.bySeverity.medium}) exceed threshold (${thresholds.maxMedium})`);
231
+ }
232
+ if (thresholds.maxTotal !== undefined && summary.total > thresholds.maxTotal) {
233
+ failureReasons.push(`Total vulnerabilities (${summary.total}) exceed threshold (${thresholds.maxTotal})`);
234
+ }
235
+ if (thresholds.minSecurityScore !== undefined && summary.securityScore < thresholds.minSecurityScore) {
236
+ failureReasons.push(`Security score (${summary.securityScore}) below threshold (${thresholds.minSecurityScore})`);
237
+ }
238
+ return {
239
+ shouldFail: failureReasons.length > 0,
240
+ failureReasons,
241
+ };
242
+ }
243
+ /**
244
+ * Format output for CI logs
245
+ */
246
+ formatOutput(scanResult, environment, summary) {
247
+ const lines = [];
248
+ // Header
249
+ lines.push('');
250
+ lines.push('═══════════════════════════════════════════════════════════════');
251
+ lines.push(' MUSUBIX Security Scan Results');
252
+ lines.push('═══════════════════════════════════════════════════════════════');
253
+ lines.push('');
254
+ // Environment info
255
+ if (environment.isCI) {
256
+ lines.push(`Platform: ${environment.platform}`);
257
+ if (environment.metadata.repository)
258
+ lines.push(`Repository: ${environment.metadata.repository}`);
259
+ if (environment.metadata.branch)
260
+ lines.push(`Branch: ${environment.metadata.branch}`);
261
+ if (environment.metadata.commitSha)
262
+ lines.push(`Commit: ${environment.metadata.commitSha.substring(0, 7)}`);
263
+ lines.push('');
264
+ }
265
+ // Summary
266
+ lines.push(`${summary.statusEmoji} Status: ${summary.passed ? 'PASSED' : 'FAILED'}`);
267
+ lines.push(`📊 Security Score: ${summary.securityScore}/100`);
268
+ lines.push('');
269
+ lines.push('Vulnerability Summary:');
270
+ lines.push(` 🔴 Critical: ${summary.bySeverity.critical}`);
271
+ lines.push(` 🟠 High: ${summary.bySeverity.high}`);
272
+ lines.push(` 🟡 Medium: ${summary.bySeverity.medium}`);
273
+ lines.push(` 🔵 Low: ${summary.bySeverity.low}`);
274
+ lines.push(` ⚪ Info: ${summary.bySeverity.info}`);
275
+ lines.push(` ─────────────`);
276
+ lines.push(` Total: ${summary.total}`);
277
+ lines.push('');
278
+ // GitHub Actions specific: output annotations
279
+ if (environment.platform === 'github-actions' && this.options.annotations) {
280
+ for (const vuln of scanResult.vulnerabilities) {
281
+ const level = this.severityToAnnotationLevel(vuln.severity);
282
+ lines.push(`::${level} file=${vuln.location.file},line=${vuln.location.startLine},title=${vuln.ruleId}::${vuln.description}`);
283
+ }
284
+ }
285
+ lines.push('═══════════════════════════════════════════════════════════════');
286
+ lines.push('');
287
+ return lines.join('\n');
288
+ }
289
+ /**
290
+ * Generate workflow file content
291
+ */
292
+ generateWorkflowFile(platform) {
293
+ switch (platform) {
294
+ case 'github-actions':
295
+ return this.generateGitHubActionsWorkflow();
296
+ case 'gitlab-ci':
297
+ return this.generateGitLabCIConfig();
298
+ case 'azure-pipelines':
299
+ return this.generateAzurePipelinesConfig();
300
+ default:
301
+ return this.generateGenericScript();
302
+ }
303
+ }
304
+ /**
305
+ * Generate GitHub Actions workflow
306
+ */
307
+ generateGitHubActionsWorkflow() {
308
+ return `name: Security Scan
309
+
310
+ on:
311
+ push:
312
+ branches: [main, develop]
313
+ pull_request:
314
+ branches: [main]
315
+
316
+ jobs:
317
+ security-scan:
318
+ runs-on: ubuntu-latest
319
+
320
+ steps:
321
+ - uses: actions/checkout@v4
322
+
323
+ - name: Setup Node.js
324
+ uses: actions/setup-node@v4
325
+ with:
326
+ node-version: '20'
327
+ cache: 'npm'
328
+
329
+ - name: Install dependencies
330
+ run: npm ci
331
+
332
+ - name: Run MUSUBIX Security Scan
333
+ run: npx @nahisaho/musubix-security scan ./src --ci --format sarif --output results.sarif
334
+ continue-on-error: true
335
+
336
+ - name: Upload SARIF to GitHub
337
+ uses: github/codeql-action/upload-sarif@v3
338
+ with:
339
+ sarif_file: results.sarif
340
+
341
+ - name: Check scan results
342
+ run: npx @nahisaho/musubix-security check --fail-on critical,high
343
+ `;
344
+ }
345
+ /**
346
+ * Generate GitLab CI config
347
+ */
348
+ generateGitLabCIConfig() {
349
+ return `security-scan:
350
+ stage: test
351
+ image: node:20
352
+ script:
353
+ - npm ci
354
+ - npx @nahisaho/musubix-security scan ./src --ci --format json --output gl-sast-report.json
355
+ artifacts:
356
+ reports:
357
+ sast: gl-sast-report.json
358
+ paths:
359
+ - gl-sast-report.json
360
+ rules:
361
+ - if: $CI_MERGE_REQUEST_IID
362
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
363
+ `;
364
+ }
365
+ /**
366
+ * Generate Azure Pipelines config
367
+ */
368
+ generateAzurePipelinesConfig() {
369
+ return `trigger:
370
+ - main
371
+ - develop
372
+
373
+ pool:
374
+ vmImage: 'ubuntu-latest'
375
+
376
+ steps:
377
+ - task: NodeTool@0
378
+ inputs:
379
+ versionSpec: '20.x'
380
+ displayName: 'Install Node.js'
381
+
382
+ - script: npm ci
383
+ displayName: 'Install dependencies'
384
+
385
+ - script: npx @nahisaho/musubix-security scan ./src --ci --format sarif --output $(Build.ArtifactStagingDirectory)/results.sarif
386
+ displayName: 'Run Security Scan'
387
+ continueOnError: true
388
+
389
+ - task: PublishBuildArtifacts@1
390
+ inputs:
391
+ pathToPublish: '$(Build.ArtifactStagingDirectory)/results.sarif'
392
+ artifactName: 'SecurityScanResults'
393
+ `;
394
+ }
395
+ /**
396
+ * Generate generic shell script
397
+ */
398
+ generateGenericScript() {
399
+ return `#!/bin/bash
400
+ set -e
401
+
402
+ # Install dependencies
403
+ npm ci
404
+
405
+ # Run security scan
406
+ npx @nahisaho/musubix-security scan ./src --ci --format json --output security-report.json
407
+
408
+ # Check results and fail if critical/high vulnerabilities found
409
+ npx @nahisaho/musubix-security check --fail-on critical,high
410
+
411
+ echo "Security scan completed successfully"
412
+ `;
413
+ }
414
+ /**
415
+ * Generate cache key for CI
416
+ */
417
+ generateCacheKey(files) {
418
+ const hash = files.sort().join('|');
419
+ return `${this.options.cacheKeyPrefix}-${Buffer.from(hash).toString('base64').substring(0, 16)}`;
420
+ }
421
+ // ============================================================================
422
+ // Private helpers
423
+ // ============================================================================
424
+ severityToAnnotationLevel(severity) {
425
+ switch (severity) {
426
+ case 'critical':
427
+ case 'high':
428
+ return 'error';
429
+ case 'medium':
430
+ return 'warning';
431
+ default:
432
+ return 'notice';
433
+ }
434
+ }
435
+ shouldFailOnSeverity(scanResult) {
436
+ return this.options.failOn.some(severity => scanResult.summary[severity] > 0);
437
+ }
438
+ shouldFailOnThresholds(scanResult, extra) {
439
+ const t = this.options.thresholds;
440
+ const s = scanResult.summary;
441
+ const total = s.critical + s.high + s.medium + s.low + s.info;
442
+ return ((t.maxCritical !== undefined && s.critical > t.maxCritical) ||
443
+ (t.maxHigh !== undefined && s.high > t.maxHigh) ||
444
+ (t.maxMedium !== undefined && s.medium > t.maxMedium) ||
445
+ (t.maxTotal !== undefined && total > t.maxTotal) ||
446
+ (t.minSecurityScore !== undefined && extra.securityScore < t.minSecurityScore));
447
+ }
448
+ }
449
+ // ============================================================================
450
+ // Factory Functions
451
+ // ============================================================================
452
+ /**
453
+ * Create a CI integration instance
454
+ */
455
+ export function createCIIntegration(options) {
456
+ return new CIIntegration(options);
457
+ }
458
+ /**
459
+ * Quick check if running in CI environment
460
+ */
461
+ export function isCI() {
462
+ const ci = createCIIntegration();
463
+ return ci.detectEnvironment().isCI;
464
+ }
465
+ /**
466
+ * Detect CI platform
467
+ */
468
+ export function detectCIPlatform() {
469
+ const ci = createCIIntegration();
470
+ return ci.detectEnvironment().platform;
471
+ }
472
+ //# sourceMappingURL=ci-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-integration.js","sourceRoot":"","sources":["../../src/integrations/ci-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * @fileoverview Git Hooks Integration for Security Scanning
3
+ * @module @nahisaho/musubix-security/integrations/git-hooks
4
+ *
5
+ * Provides pre-commit and pre-push hooks for automated security checks.
6
+ */
7
+ import type { ScanResult, Severity } from '../types/index.js';
8
+ /**
9
+ * Hook type
10
+ */
11
+ export type HookType = 'pre-commit' | 'pre-push' | 'commit-msg' | 'post-commit';
12
+ /**
13
+ * Git hooks configuration
14
+ */
15
+ export interface GitHooksConfig {
16
+ /** Hooks to install */
17
+ hooks: HookType[];
18
+ /** Fail on specific severities */
19
+ failOn?: Severity[];
20
+ /** Scan staged files only (for pre-commit) */
21
+ stagedOnly?: boolean;
22
+ /** File patterns to include */
23
+ includePatterns?: string[];
24
+ /** File patterns to exclude */
25
+ excludePatterns?: string[];
26
+ /** Enable secret detection */
27
+ detectSecrets?: boolean;
28
+ /** Enable vulnerability scanning */
29
+ detectVulnerabilities?: boolean;
30
+ /** Skip hooks in CI environment */
31
+ skipInCI?: boolean;
32
+ /** Timeout in seconds */
33
+ timeout?: number;
34
+ /** Custom hook scripts */
35
+ customScripts?: Partial<Record<HookType, string>>;
36
+ }
37
+ /**
38
+ * Hook execution result
39
+ */
40
+ export interface HookResult {
41
+ /** Hook type */
42
+ hook: HookType;
43
+ /** Whether hook passed */
44
+ passed: boolean;
45
+ /** Execution time in ms */
46
+ executionTime: number;
47
+ /** Files scanned */
48
+ filesScanned: string[];
49
+ /** Scan result (if performed) */
50
+ scanResult?: ScanResult;
51
+ /** Error message (if failed) */
52
+ error?: string;
53
+ /** Skipped reason */
54
+ skippedReason?: string;
55
+ }
56
+ /**
57
+ * Hook installation result
58
+ */
59
+ export interface InstallResult {
60
+ /** Hooks installed */
61
+ installed: HookType[];
62
+ /** Hooks that failed to install */
63
+ failed: {
64
+ hook: HookType;
65
+ error: string;
66
+ }[];
67
+ /** Git directory path */
68
+ gitDir: string;
69
+ /** Whether backup was created */
70
+ backupCreated: boolean;
71
+ }
72
+ /**
73
+ * Staged file info
74
+ */
75
+ export interface StagedFile {
76
+ /** File path */
77
+ path: string;
78
+ /** Git status */
79
+ status: 'A' | 'M' | 'D' | 'R' | 'C';
80
+ /** Old path (for renames) */
81
+ oldPath?: string;
82
+ }
83
+ /**
84
+ * Manages Git hooks for security scanning
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * const hooks = createGitHooks({
89
+ * hooks: ['pre-commit', 'pre-push'],
90
+ * failOn: ['critical', 'high'],
91
+ * detectSecrets: true,
92
+ * });
93
+ *
94
+ * // Install hooks
95
+ * const result = await hooks.install();
96
+ *
97
+ * // Run pre-commit manually
98
+ * const hookResult = await hooks.runHook('pre-commit');
99
+ * ```
100
+ */
101
+ export declare class GitHooksManager {
102
+ private config;
103
+ constructor(config: GitHooksConfig);
104
+ /**
105
+ * Install git hooks
106
+ */
107
+ install(workDir?: string): Promise<InstallResult>;
108
+ /**
109
+ * Uninstall git hooks
110
+ */
111
+ uninstall(workDir?: string): Promise<{
112
+ removed: HookType[];
113
+ restored: HookType[];
114
+ }>;
115
+ /**
116
+ * Run a specific hook
117
+ */
118
+ runHook(hook: HookType, workDir?: string): Promise<HookResult>;
119
+ /**
120
+ * Get staged files
121
+ */
122
+ getStagedFiles(workDir?: string): Promise<StagedFile[]>;
123
+ /**
124
+ * Generate hook script content
125
+ */
126
+ generateHookScript(hook: HookType): string;
127
+ /**
128
+ * Check if hooks should be skipped
129
+ */
130
+ shouldSkip(): boolean;
131
+ /**
132
+ * Get hook status
133
+ */
134
+ getStatus(workDir?: string): Promise<Record<HookType, 'installed' | 'not-installed' | 'other'>>;
135
+ private findGitDir;
136
+ private getAllFiles;
137
+ private shouldIncludeFile;
138
+ private matchPattern;
139
+ private runSecurityScan;
140
+ private checkResult;
141
+ private formatError;
142
+ }
143
+ /**
144
+ * Create a git hooks manager
145
+ */
146
+ export declare function createGitHooks(config: GitHooksConfig): GitHooksManager;
147
+ /**
148
+ * Quick install pre-commit hook
149
+ */
150
+ export declare function installPreCommitHook(workDir?: string): Promise<InstallResult>;
151
+ /**
152
+ * Quick install all recommended hooks
153
+ */
154
+ export declare function installRecommendedHooks(workDir?: string): Promise<InstallResult>;
155
+ //# sourceMappingURL=git-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-hooks.d.ts","sourceRoot":"","sources":["../../src/integrations/git-hooks.ts"],"names":[],"mappings":"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"}