@codyswann/lisa 1.14.0 → 1.16.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.
- package/all/copy-overwrite/.claude/hooks/enforce-plan-rules.sh +15 -0
- package/all/copy-overwrite/.claude/hooks/track-plan-sessions.sh +155 -0
- package/all/copy-overwrite/.claude/rules/plan.md +29 -0
- package/all/copy-overwrite/.claude/settings.json +30 -0
- package/all/copy-overwrite/CLAUDE.md +2 -9
- package/cdk/copy-overwrite/tsconfig.eslint.json +2 -1
- package/cdk/create-only/cdk.json +23 -0
- package/expo/copy-overwrite/.claude/skills/owasp-zap/SKILL.md +56 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/SKILL.md +5 -10
- package/expo/copy-overwrite/.github/workflows/zap-baseline.yml +107 -0
- package/expo/copy-overwrite/.zap/baseline.conf +36 -0
- package/expo/copy-overwrite/jest.expo.ts +59 -13
- package/expo/copy-overwrite/knip.json +1 -1
- package/expo/copy-overwrite/scripts/zap-baseline.sh +92 -0
- package/expo/copy-overwrite/tsconfig.eslint.json +2 -1
- package/expo/copy-overwrite/tsconfig.expo.json +7 -0
- package/expo/copy-overwrite/tsconfig.json +3 -1
- package/expo/create-only/.github/workflows/ci.yml +8 -0
- package/expo/create-only/babel.config.js +27 -0
- package/expo/create-only/jest.config.local.ts +34 -0
- package/expo/create-only/jest.config.react-native-mock.js +88 -0
- package/expo/create-only/jest.setup.pre.js +106 -0
- package/expo/create-only/jest.setup.ts +118 -0
- package/expo/create-only/tsconfig.local.json +1 -7
- package/expo/package-lisa/package.lisa.json +4 -2
- package/nestjs/copy-overwrite/.github/workflows/zap-baseline.yml +123 -0
- package/nestjs/copy-overwrite/.zap/baseline.conf +39 -0
- package/nestjs/copy-overwrite/scripts/zap-baseline.sh +99 -0
- package/nestjs/copy-overwrite/tsconfig.eslint.json +10 -0
- package/nestjs/copy-overwrite/tsconfig.nestjs.json +4 -1
- package/nestjs/create-only/.github/workflows/ci.yml +8 -0
- package/nestjs/package-lisa/package.lisa.json +2 -1
- package/package.json +1 -1
- package/typescript/copy-contents/.husky/pre-push +5 -1
- package/typescript/copy-overwrite/.claude/commands/security/zap-scan.md +12 -0
- package/typescript/copy-overwrite/.claude/settings.json +10 -0
- package/typescript/copy-overwrite/.github/workflows/quality.yml +100 -5
- package/typescript/copy-overwrite/eslint.base.ts +1 -1
- package/typescript/copy-overwrite/eslint.ignore.config.json +1 -0
- package/typescript/copy-overwrite/jest.base.ts +1 -0
- package/typescript/copy-overwrite/tsconfig.eslint.json +3 -2
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# OWASP ZAP Baseline Scan Configuration — NestJS GraphQL APIs
|
|
2
|
+
# Format: <rule_id> <action> <description>
|
|
3
|
+
# Actions: IGNORE (skip rule), WARN (report but don't fail), FAIL (fail on finding)
|
|
4
|
+
#
|
|
5
|
+
# Tuned for NestJS APIs behind API Gateway/load balancer in production.
|
|
6
|
+
# Transport-level headers are enforced at infrastructure layer.
|
|
7
|
+
|
|
8
|
+
# CSP header — API responses don't serve HTML; CSP is a browser concern
|
|
9
|
+
10038 WARN (Content Security Policy (CSP) Header Not Set)
|
|
10
|
+
|
|
11
|
+
# X-Content-Type-Options — should be set but is infrastructure-level
|
|
12
|
+
10021 WARN (X-Content-Type-Options Header Missing)
|
|
13
|
+
|
|
14
|
+
# Strict-Transport-Security — enforced at API Gateway/load balancer
|
|
15
|
+
10035 WARN (Strict-Transport-Security Header Not Set)
|
|
16
|
+
|
|
17
|
+
# X-Frame-Options — API responses are not rendered in browsers
|
|
18
|
+
10020 IGNORE (X-Frame-Options Header Not Set)
|
|
19
|
+
|
|
20
|
+
# Permissions-Policy — not applicable to API responses
|
|
21
|
+
10063 IGNORE (Permissions Policy Header Not Set)
|
|
22
|
+
|
|
23
|
+
# Server header disclosure — NestJS/Express may leak version info;
|
|
24
|
+
# should be suppressed in production via Helmet middleware
|
|
25
|
+
10036 WARN (Server Leaks Version Information via "Server" HTTP Response Header Field)
|
|
26
|
+
|
|
27
|
+
# Cookie flags — GraphQL APIs may use session cookies for auth
|
|
28
|
+
10010 FAIL (Cookie No HttpOnly Flag)
|
|
29
|
+
10011 FAIL (Cookie Without Secure Flag)
|
|
30
|
+
10054 WARN (Cookie without SameSite Attribute)
|
|
31
|
+
|
|
32
|
+
# Information disclosure in URL — GraphQL uses POST body, not URL params
|
|
33
|
+
10024 IGNORE (Information Disclosure - Sensitive Information in URL)
|
|
34
|
+
|
|
35
|
+
# Cross-domain JavaScript source — not applicable to API
|
|
36
|
+
10017 IGNORE (Cross-Domain JavaScript Source File Inclusion)
|
|
37
|
+
|
|
38
|
+
# Application error disclosure — NestJS should not leak stack traces
|
|
39
|
+
10023 FAIL (Information Disclosure - Debug Error Messages)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# OWASP ZAP Baseline Scan — NestJS GraphQL API
|
|
3
|
+
# Builds and starts the NestJS server, then runs a ZAP baseline scan via Docker.
|
|
4
|
+
# Outputs an HTML report to zap-report.html in the project root.
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
9
|
+
TARGET_URL="${ZAP_TARGET_URL:-http://host.docker.internal:3000/graphql}"
|
|
10
|
+
ZAP_RULES_FILE="${ZAP_RULES_FILE:-.zap/baseline.conf}"
|
|
11
|
+
REPORT_FILE="zap-report.html"
|
|
12
|
+
|
|
13
|
+
cd "$PROJECT_ROOT"
|
|
14
|
+
|
|
15
|
+
# Verify Docker is available
|
|
16
|
+
if ! command -v docker &> /dev/null; then
|
|
17
|
+
echo "Error: Docker is required but not installed."
|
|
18
|
+
echo "Install Docker from https://docs.docker.com/get-docker/"
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
if ! docker info &> /dev/null 2>&1; then
|
|
23
|
+
echo "Error: Docker daemon is not running."
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Detect package manager
|
|
28
|
+
if [ -f "bun.lockb" ]; then
|
|
29
|
+
PKG_MGR="bun"
|
|
30
|
+
elif [ -f "yarn.lock" ]; then
|
|
31
|
+
PKG_MGR="yarn"
|
|
32
|
+
elif [ -f "pnpm-lock.yaml" ]; then
|
|
33
|
+
PKG_MGR="pnpm"
|
|
34
|
+
else
|
|
35
|
+
PKG_MGR="npm"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
echo "==> Building NestJS project..."
|
|
39
|
+
$PKG_MGR run build
|
|
40
|
+
|
|
41
|
+
echo "==> Starting NestJS server..."
|
|
42
|
+
NODE_ENV=test PORT=3000 $PKG_MGR run start &
|
|
43
|
+
SERVER_PID=$!
|
|
44
|
+
|
|
45
|
+
cleanup() {
|
|
46
|
+
echo "==> Cleaning up..."
|
|
47
|
+
if [ -n "${SERVER_PID:-}" ]; then
|
|
48
|
+
kill "$SERVER_PID" 2>/dev/null || true
|
|
49
|
+
fi
|
|
50
|
+
}
|
|
51
|
+
trap cleanup EXIT
|
|
52
|
+
|
|
53
|
+
echo "==> Waiting for server to be ready..."
|
|
54
|
+
RETRIES=30
|
|
55
|
+
until curl -sf http://localhost:3000/health > /dev/null 2>&1 || [ $RETRIES -eq 0 ]; do
|
|
56
|
+
RETRIES=$((RETRIES - 1))
|
|
57
|
+
sleep 2
|
|
58
|
+
done
|
|
59
|
+
|
|
60
|
+
if [ $RETRIES -eq 0 ]; then
|
|
61
|
+
echo "Error: Server failed to start within timeout"
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
echo " Server is ready"
|
|
65
|
+
|
|
66
|
+
echo "==> Running OWASP ZAP baseline scan..."
|
|
67
|
+
ZAP_ARGS="-t $TARGET_URL"
|
|
68
|
+
|
|
69
|
+
if [ -f "$ZAP_RULES_FILE" ]; then
|
|
70
|
+
echo " Using rules file: $ZAP_RULES_FILE"
|
|
71
|
+
ZAP_ARGS="$ZAP_ARGS -c /zap/wrk/$(basename "$ZAP_RULES_FILE")"
|
|
72
|
+
MOUNT_RULES="-v $(dirname "$(realpath "$ZAP_RULES_FILE")"):/zap/wrk:ro"
|
|
73
|
+
else
|
|
74
|
+
MOUNT_RULES=""
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
docker run --rm \
|
|
78
|
+
--add-host=host.docker.internal:host-gateway \
|
|
79
|
+
-v "$(pwd)":/zap/wrk/:rw \
|
|
80
|
+
$MOUNT_RULES \
|
|
81
|
+
ghcr.io/zaproxy/zaproxy:stable \
|
|
82
|
+
zap-baseline.py $ZAP_ARGS \
|
|
83
|
+
-r "$REPORT_FILE" \
|
|
84
|
+
-J zap-report.json \
|
|
85
|
+
-w zap-report.md \
|
|
86
|
+
-l WARN || ZAP_EXIT=$?
|
|
87
|
+
|
|
88
|
+
echo ""
|
|
89
|
+
if [ -f "$REPORT_FILE" ]; then
|
|
90
|
+
echo "ZAP report saved to: $REPORT_FILE"
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
if [ "${ZAP_EXIT:-0}" -ne 0 ]; then
|
|
94
|
+
echo "ZAP found medium+ severity findings (exit code: $ZAP_EXIT)"
|
|
95
|
+
echo "Review $REPORT_FILE for details."
|
|
96
|
+
exit "$ZAP_EXIT"
|
|
97
|
+
else
|
|
98
|
+
echo "ZAP baseline scan passed — no medium+ severity findings."
|
|
99
|
+
fi
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"rootDir": ".",
|
|
5
|
+
"noEmit": true,
|
|
6
|
+
"allowImportingTsExtensions": true
|
|
7
|
+
},
|
|
8
|
+
"include": ["src/**/*", "test/**/*", "*.config.ts", "eslint.*.ts", "jest.*.ts"],
|
|
9
|
+
"exclude": ["node_modules", ".build"]
|
|
10
|
+
}
|
|
@@ -18,6 +18,14 @@ jobs:
|
|
|
18
18
|
skip_jobs: 'test,test:integration,test:e2e'
|
|
19
19
|
secrets: inherit
|
|
20
20
|
|
|
21
|
+
zap:
|
|
22
|
+
name: 🕷️ ZAP Baseline Scan
|
|
23
|
+
needs: [quality]
|
|
24
|
+
uses: ./.github/workflows/zap-baseline.yml
|
|
25
|
+
with:
|
|
26
|
+
node_version: '22.21.1'
|
|
27
|
+
package_manager: 'bun'
|
|
28
|
+
|
|
21
29
|
create_issue_on_failure:
|
|
22
30
|
name: 📌 Create Issue on Failure
|
|
23
31
|
needs: [quality]
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"fetch:graphql:schema:production": "./scripts/fetch-graphql-schema.sh production",
|
|
27
27
|
"deploy:dev": "sls deploy --stage dev",
|
|
28
28
|
"deploy:staging": "sls deploy --stage staging",
|
|
29
|
-
"deploy:production": "sls deploy --stage production"
|
|
29
|
+
"deploy:production": "sls deploy --stage production",
|
|
30
|
+
"security:zap": "bash scripts/zap-baseline.sh"
|
|
30
31
|
},
|
|
31
32
|
"dependencies": {
|
|
32
33
|
"@apollo/server": "^5.2.0",
|
package/package.json
CHANGED
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
},
|
|
86
86
|
"resolutions": {},
|
|
87
87
|
"name": "@codyswann/lisa",
|
|
88
|
-
"version": "1.
|
|
88
|
+
"version": "1.16.0",
|
|
89
89
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
90
90
|
"main": "dist/index.js",
|
|
91
91
|
"bin": {
|
|
@@ -79,7 +79,11 @@ elif [ "$PACKAGE_MANAGER" = "bun" ]; then
|
|
|
79
79
|
# Excluding GHSA-8qq5-rm4j-mr97: node-tar path sanitization vulnerability
|
|
80
80
|
# Nested dependency in @expo/cli - bun resolves to patched version but audit still flags it
|
|
81
81
|
# Risk: Low - only affects tar extraction with malicious filenames, not our use case
|
|
82
|
-
|
|
82
|
+
|
|
83
|
+
# Excluding GHSA-37qj-frw5-hhjh: fast-xml-parser RangeError DoS with numeric entities
|
|
84
|
+
# Transitive dependency via @react-native-community/cli (Android/iOS build tooling)
|
|
85
|
+
# Risk: None - CLI build tool, not a production runtime dependency
|
|
86
|
+
if ! bun audit --audit-level=high --ignore GHSA-5j98-mcp5-4vw2 --ignore GHSA-8qq5-rm4j-mr97 --ignore GHSA-37qj-frw5-hhjh; then
|
|
83
87
|
echo "⚠️ Security audit failed. Please fix high/critical vulnerabilities before pushing."
|
|
84
88
|
exit 1
|
|
85
89
|
fi
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Run an OWASP ZAP baseline security scan locally using Docker.
|
|
2
|
+
|
|
3
|
+
Steps:
|
|
4
|
+
1. Check if Docker is installed and running: `docker info`
|
|
5
|
+
2. Check if `scripts/zap-baseline.sh` exists in the project
|
|
6
|
+
3. If it exists, run: `bash scripts/zap-baseline.sh`
|
|
7
|
+
4. If it does not exist, inform the user that this project does not have a ZAP baseline scan configured
|
|
8
|
+
5. After the scan completes, read `zap-report.html` (or `zap-report.md` for text) and summarize:
|
|
9
|
+
- Total number of alerts by risk level (High, Medium, Low, Informational)
|
|
10
|
+
- List each Medium+ finding with its rule ID, name, and recommended fix
|
|
11
|
+
- Categorize findings as "infrastructure-level" (fix at CDN/proxy) vs "application-level" (fix in code)
|
|
12
|
+
6. If the scan failed, explain what failed and suggest concrete remediation steps
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
# - Snyk dependency vulnerability scanning
|
|
19
19
|
# - GitGuardian secret detection
|
|
20
20
|
# - FOSSA license compliance checking
|
|
21
|
+
# - OWASP ZAP DAST baseline scanning
|
|
21
22
|
# - E2E testing:
|
|
22
23
|
# - Playwright web E2E tests (auto-detects playwright.config.ts)
|
|
23
24
|
# - Maestro Cloud mobile E2E tests (requires MAESTRO_API_KEY, project ID, and app binary)
|
|
@@ -54,10 +55,20 @@ on:
|
|
|
54
55
|
default: 'npm'
|
|
55
56
|
type: string
|
|
56
57
|
skip_jobs:
|
|
57
|
-
description: 'Jobs to skip (comma-separated: lint,lint_slow,typecheck,test,test:unit,test:integration,test:e2e,maestro_e2e,playwright_e2e,format,build,dead_code,sg_scan,npm_security_scan,github_issue)'
|
|
58
|
+
description: 'Jobs to skip (comma-separated: lint,lint_slow,typecheck,test,test:unit,test:integration,test:e2e,maestro_e2e,playwright_e2e,format,build,dead_code,sg_scan,npm_security_scan,zap_baseline,github_issue)'
|
|
58
59
|
required: false
|
|
59
60
|
default: ''
|
|
60
61
|
type: string
|
|
62
|
+
zap_target_url:
|
|
63
|
+
description: 'Target URL for OWASP ZAP baseline scan (leave empty to skip ZAP)'
|
|
64
|
+
required: false
|
|
65
|
+
default: ''
|
|
66
|
+
type: string
|
|
67
|
+
zap_rules_file:
|
|
68
|
+
description: 'Path to ZAP rules configuration file'
|
|
69
|
+
required: false
|
|
70
|
+
default: '.zap/baseline.conf'
|
|
71
|
+
type: string
|
|
61
72
|
working_directory:
|
|
62
73
|
description: 'Directory to run commands in (if not root)'
|
|
63
74
|
required: false
|
|
@@ -1242,12 +1253,74 @@ jobs:
|
|
|
1242
1253
|
echo "::warning::FOSSA license compliance check skipped - FOSSA_API_KEY not configured"
|
|
1243
1254
|
echo "To enable license compliance checking, add FOSSA_API_KEY to your repository secrets"
|
|
1244
1255
|
|
|
1256
|
+
zap_baseline:
|
|
1257
|
+
name: 🕷️ OWASP ZAP Baseline
|
|
1258
|
+
runs-on: ubuntu-latest
|
|
1259
|
+
timeout-minutes: 20
|
|
1260
|
+
if: ${{ !contains(inputs.skip_jobs, 'zap_baseline') && inputs.zap_target_url != '' }}
|
|
1261
|
+
steps:
|
|
1262
|
+
- name: 📥 Checkout repository
|
|
1263
|
+
uses: actions/checkout@v4
|
|
1264
|
+
|
|
1265
|
+
- name: 🔧 Setup Node.js
|
|
1266
|
+
uses: actions/setup-node@v4
|
|
1267
|
+
with:
|
|
1268
|
+
node-version: ${{ inputs.node_version }}
|
|
1269
|
+
cache: ${{ inputs.package_manager != 'bun' && inputs.package_manager || '' }}
|
|
1270
|
+
|
|
1271
|
+
- name: 🍞 Setup Bun
|
|
1272
|
+
if: inputs.package_manager == 'bun'
|
|
1273
|
+
uses: oven-sh/setup-bun@v2
|
|
1274
|
+
with:
|
|
1275
|
+
bun-version: '1.3.8'
|
|
1276
|
+
|
|
1277
|
+
- name: 📦 Install dependencies
|
|
1278
|
+
run: |
|
|
1279
|
+
if [ "${{ inputs.package_manager }}" = "npm" ]; then
|
|
1280
|
+
npm ci
|
|
1281
|
+
elif [ "${{ inputs.package_manager }}" = "yarn" ]; then
|
|
1282
|
+
yarn install --frozen-lockfile
|
|
1283
|
+
elif [ "${{ inputs.package_manager }}" = "bun" ]; then
|
|
1284
|
+
bun install --frozen-lockfile
|
|
1285
|
+
fi
|
|
1286
|
+
working-directory: ${{ inputs.working_directory || '.' }}
|
|
1287
|
+
|
|
1288
|
+
- name: 🔍 Check for ZAP rules file
|
|
1289
|
+
id: check_rules
|
|
1290
|
+
run: |
|
|
1291
|
+
if [ -f "${{ inputs.zap_rules_file }}" ]; then
|
|
1292
|
+
echo "has_rules=true" >> $GITHUB_OUTPUT
|
|
1293
|
+
else
|
|
1294
|
+
echo "has_rules=false" >> $GITHUB_OUTPUT
|
|
1295
|
+
fi
|
|
1296
|
+
working-directory: ${{ inputs.working_directory || '.' }}
|
|
1297
|
+
|
|
1298
|
+
- name: 🕷️ Run ZAP baseline scan
|
|
1299
|
+
uses: zaproxy/action-baseline@v0.14.0
|
|
1300
|
+
with:
|
|
1301
|
+
target: ${{ inputs.zap_target_url }}
|
|
1302
|
+
rules_file_name: ${{ steps.check_rules.outputs.has_rules == 'true' && inputs.zap_rules_file || '' }}
|
|
1303
|
+
fail_action: true
|
|
1304
|
+
allow_issue_writing: false
|
|
1305
|
+
artifact_name: 'zap-report'
|
|
1306
|
+
|
|
1307
|
+
- name: 📤 Upload ZAP report
|
|
1308
|
+
if: always()
|
|
1309
|
+
uses: actions/upload-artifact@v4
|
|
1310
|
+
with:
|
|
1311
|
+
name: zap-baseline-report-${{ github.run_id }}
|
|
1312
|
+
path: |
|
|
1313
|
+
zap-report.html
|
|
1314
|
+
zap-report.json
|
|
1315
|
+
zap-report.md
|
|
1316
|
+
retention-days: 14
|
|
1317
|
+
|
|
1245
1318
|
# Enterprise security tools summary
|
|
1246
1319
|
security_tools_summary:
|
|
1247
1320
|
name: 🔒 Security Tools Summary
|
|
1248
1321
|
runs-on: ubuntu-latest
|
|
1249
|
-
if: always() && (needs.sonarcloud.result != 'skipped' || needs.snyk.result != 'skipped' || needs.secret_scanning.result != 'skipped' || needs.license_compliance.result != 'skipped')
|
|
1250
|
-
needs: [sonarcloud, snyk, secret_scanning, license_compliance]
|
|
1322
|
+
if: always() && (needs.sonarcloud.result != 'skipped' || needs.snyk.result != 'skipped' || needs.secret_scanning.result != 'skipped' || needs.license_compliance.result != 'skipped' || needs.zap_baseline.result != 'skipped')
|
|
1323
|
+
needs: [sonarcloud, snyk, secret_scanning, license_compliance, zap_baseline]
|
|
1251
1324
|
steps:
|
|
1252
1325
|
- name: 📝 Generate security tools summary
|
|
1253
1326
|
run: |
|
|
@@ -1292,6 +1365,15 @@ jobs:
|
|
|
1292
1365
|
echo "- 📜 **FOSSA License Compliance**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
|
|
1293
1366
|
fi
|
|
1294
1367
|
|
|
1368
|
+
# OWASP ZAP Baseline status
|
|
1369
|
+
if [ "${{ needs.zap_baseline.result }}" == "skipped" ]; then
|
|
1370
|
+
echo "- 🕷️ **OWASP ZAP Baseline**: ⏭️ Skipped (no target URL)" >> $GITHUB_STEP_SUMMARY
|
|
1371
|
+
elif [ "${{ needs.zap_baseline.result }}" == "success" ]; then
|
|
1372
|
+
echo "- 🕷️ **OWASP ZAP Baseline**: ✅ Passed" >> $GITHUB_STEP_SUMMARY
|
|
1373
|
+
else
|
|
1374
|
+
echo "- 🕷️ **OWASP ZAP Baseline**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
|
|
1375
|
+
fi
|
|
1376
|
+
|
|
1295
1377
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
1296
1378
|
echo "## 📊 Security Posture" >> $GITHUB_STEP_SUMMARY
|
|
1297
1379
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
@@ -1328,7 +1410,14 @@ jobs:
|
|
|
1328
1410
|
fi
|
|
1329
1411
|
fi
|
|
1330
1412
|
|
|
1331
|
-
|
|
1413
|
+
if [ "${{ needs.zap_baseline.result }}" != "skipped" ]; then
|
|
1414
|
+
ACTIVE_TOOLS=$((ACTIVE_TOOLS + 1))
|
|
1415
|
+
if [ "${{ needs.zap_baseline.result }}" == "success" ]; then
|
|
1416
|
+
PASSED_TOOLS=$((PASSED_TOOLS + 1))
|
|
1417
|
+
fi
|
|
1418
|
+
fi
|
|
1419
|
+
|
|
1420
|
+
echo "- **Active Security Tools**: $ACTIVE_TOOLS / 5" >> $GITHUB_STEP_SUMMARY
|
|
1332
1421
|
echo "- **Passed Checks**: $PASSED_TOOLS / $ACTIVE_TOOLS" >> $GITHUB_STEP_SUMMARY
|
|
1333
1422
|
|
|
1334
1423
|
if [ $ACTIVE_TOOLS -gt 0 ]; then
|
|
@@ -1382,6 +1471,7 @@ jobs:
|
|
|
1382
1471
|
snyk,
|
|
1383
1472
|
secret_scanning,
|
|
1384
1473
|
license_compliance,
|
|
1474
|
+
zap_baseline,
|
|
1385
1475
|
]
|
|
1386
1476
|
steps:
|
|
1387
1477
|
- name: 📋 Validate compliance framework
|
|
@@ -1594,6 +1684,7 @@ jobs:
|
|
|
1594
1684
|
snyk,
|
|
1595
1685
|
secret_scanning,
|
|
1596
1686
|
license_compliance,
|
|
1687
|
+
zap_baseline,
|
|
1597
1688
|
compliance_validation,
|
|
1598
1689
|
]
|
|
1599
1690
|
steps:
|
|
@@ -1648,7 +1739,8 @@ jobs:
|
|
|
1648
1739
|
sonarcloud: '${{ needs.sonarcloud.result }}',
|
|
1649
1740
|
snyk: '${{ needs.snyk.result }}',
|
|
1650
1741
|
secret_scan: '${{ needs.secret_scanning.result }}',
|
|
1651
|
-
license_check: '${{ needs.license_compliance.result }}'
|
|
1742
|
+
license_check: '${{ needs.license_compliance.result }}',
|
|
1743
|
+
zap_baseline: '${{ needs.zap_baseline.result }}'
|
|
1652
1744
|
},
|
|
1653
1745
|
compliance: '${{ needs.compliance_validation.result }}'
|
|
1654
1746
|
},
|
|
@@ -1806,6 +1898,7 @@ jobs:
|
|
|
1806
1898
|
snyk,
|
|
1807
1899
|
secret_scanning,
|
|
1808
1900
|
license_compliance,
|
|
1901
|
+
zap_baseline,
|
|
1809
1902
|
]
|
|
1810
1903
|
steps:
|
|
1811
1904
|
- name: 📊 Generate performance report
|
|
@@ -1856,6 +1949,7 @@ jobs:
|
|
|
1856
1949
|
echo "| Snyk | ${{ needs.snyk.result }} | Security |" >> $GITHUB_STEP_SUMMARY
|
|
1857
1950
|
echo "| Secret Scan | ${{ needs.secret_scanning.result }} | Security |" >> $GITHUB_STEP_SUMMARY
|
|
1858
1951
|
echo "| License Check | ${{ needs.license_compliance.result }} | Security |" >> $GITHUB_STEP_SUMMARY
|
|
1952
|
+
echo "| ZAP Baseline | ${{ needs.zap_baseline.result }} | Security |" >> $GITHUB_STEP_SUMMARY
|
|
1859
1953
|
|
|
1860
1954
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
1861
1955
|
echo "## 💡 Performance Tips" >> $GITHUB_STEP_SUMMARY
|
|
@@ -1885,6 +1979,7 @@ jobs:
|
|
|
1885
1979
|
[ "${{ needs.snyk.result }}" != "skipped" ] && SECURITY_JOBS=$((SECURITY_JOBS + 1))
|
|
1886
1980
|
[ "${{ needs.secret_scanning.result }}" != "skipped" ] && SECURITY_JOBS=$((SECURITY_JOBS + 1))
|
|
1887
1981
|
[ "${{ needs.license_compliance.result }}" != "skipped" ] && SECURITY_JOBS=$((SECURITY_JOBS + 1))
|
|
1982
|
+
[ "${{ needs.zap_baseline.result }}" != "skipped" ] && SECURITY_JOBS=$((SECURITY_JOBS + 1))
|
|
1888
1983
|
|
|
1889
1984
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
1890
1985
|
echo "## 🚀 Optimization Metrics" >> $GITHUB_STEP_SUMMARY
|
|
@@ -109,7 +109,7 @@ export const getBaseConfigs = () => [
|
|
|
109
109
|
},
|
|
110
110
|
|
|
111
111
|
// Code quality
|
|
112
|
-
sonarjs.configs.recommended,
|
|
112
|
+
...(sonarjs.configs?.recommended ? [sonarjs.configs.recommended] : []),
|
|
113
113
|
{
|
|
114
114
|
plugins: {
|
|
115
115
|
"@eslint-community/eslint-comments": eslintComments,
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
"extends": "./tsconfig.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"rootDir": ".",
|
|
5
|
-
"noEmit": true
|
|
5
|
+
"noEmit": true,
|
|
6
|
+
"allowImportingTsExtensions": true
|
|
6
7
|
},
|
|
7
|
-
"include": ["src/**/*", "tests/**/*", "test/**/*", "*.config.ts", "eslint.*.ts"],
|
|
8
|
+
"include": ["src/**/*", "tests/**/*", "test/**/*", "*.config.ts", "eslint.*.ts", "jest.*.ts"],
|
|
8
9
|
"exclude": ["node_modules", "dist", "build"]
|
|
9
10
|
}
|