@@ -145,8 +145,64 @@ jobs:
145145 - name : Install dependencies
146146 run : npm ci --legacy-peer-deps
147147
148- - name : Run npm audit
149- run : npm run audit:high
148+ - name : Run npm audit (fail on high/critical)
149+ id : audit
150+ run : |
151+ # Capture full JSON report for summary output
152+ npm audit --audit-level=high --json > audit-report.json || true
153+
154+ # Parse severity counts
155+ CRITICAL=$(jq '.metadata.vulnerabilities.critical // 0' audit-report.json)
156+ HIGH=$(jq '.metadata.vulnerabilities.high // 0' audit-report.json)
157+ MODERATE=$(jq '.metadata.vulnerabilities.moderate // 0' audit-report.json)
158+ LOW=$(jq '.metadata.vulnerabilities.low // 0' audit-report.json)
159+
160+ # Print summary to CI output
161+ echo ""
162+ echo "══════════════════════════════════════════"
163+ echo " npm audit — Vulnerability Summary "
164+ echo "══════════════════════════════════════════"
165+ echo " 🔴 Critical : $CRITICAL"
166+ echo " 🟠 High : $HIGH"
167+ echo " 🟡 Moderate : $MODERATE"
168+ echo " 🔵 Low : $LOW"
169+ echo "══════════════════════════════════════════"
170+
171+ # Write to GitHub Actions step summary
172+ echo "## 🔒 npm audit Results" >> $GITHUB_STEP_SUMMARY
173+ echo "| Severity | Count |" >> $GITHUB_STEP_SUMMARY
174+ echo "|----------|-------|" >> $GITHUB_STEP_SUMMARY
175+ echo "| 🔴 Critical | $CRITICAL |" >> $GITHUB_STEP_SUMMARY
176+ echo "| 🟠 High | $HIGH |" >> $GITHUB_STEP_SUMMARY
177+ echo "| 🟡 Moderate | $MODERATE |" >> $GITHUB_STEP_SUMMARY
178+ echo "| 🔵 Low | $LOW |" >> $GITHUB_STEP_SUMMARY
179+
180+ # Fail the build if high or critical vulnerabilities are found
181+ if [ "$CRITICAL" -gt 0 ] || [ "$HIGH" -gt 0 ]; then
182+ echo ""
183+ echo "❌ Build failed: $CRITICAL critical and $HIGH high severity vulnerabilities detected."
184+ echo " Run 'npm audit fix' locally to resolve them."
185+ exit 1
186+ fi
187+
188+ echo "✅ No high or critical vulnerabilities found."
189+
190+ - name : Upload audit report
191+ if : always()
192+ uses : actions/upload-artifact@v4
193+ with :
194+ name : npm-audit-report
195+ path : audit-report.json
196+ retention-days : 30
197+
198+ - name : Snyk scan (optional)
199+ if : env.SNYK_TOKEN != ''
200+ uses : snyk/actions/node@master
201+ continue-on-error : true
202+ env :
203+ SNYK_TOKEN : ${{ secrets.SNYK_TOKEN }}
204+ with :
205+ args : --severity-threshold=high
150206
151207 # ─── Storybook build validation ───────────────────────────────────────────
152208 storybook :
0 commit comments