@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.
Files changed (41) hide show
  1. package/all/copy-overwrite/.claude/hooks/enforce-plan-rules.sh +15 -0
  2. package/all/copy-overwrite/.claude/hooks/track-plan-sessions.sh +155 -0
  3. package/all/copy-overwrite/.claude/rules/plan.md +29 -0
  4. package/all/copy-overwrite/.claude/settings.json +30 -0
  5. package/all/copy-overwrite/CLAUDE.md +2 -9
  6. package/cdk/copy-overwrite/tsconfig.eslint.json +2 -1
  7. package/cdk/create-only/cdk.json +23 -0
  8. package/expo/copy-overwrite/.claude/skills/owasp-zap/SKILL.md +56 -0
  9. package/expo/copy-overwrite/.claude/skills/testing-library/SKILL.md +5 -10
  10. package/expo/copy-overwrite/.github/workflows/zap-baseline.yml +107 -0
  11. package/expo/copy-overwrite/.zap/baseline.conf +36 -0
  12. package/expo/copy-overwrite/jest.expo.ts +59 -13
  13. package/expo/copy-overwrite/knip.json +1 -1
  14. package/expo/copy-overwrite/scripts/zap-baseline.sh +92 -0
  15. package/expo/copy-overwrite/tsconfig.eslint.json +2 -1
  16. package/expo/copy-overwrite/tsconfig.expo.json +7 -0
  17. package/expo/copy-overwrite/tsconfig.json +3 -1
  18. package/expo/create-only/.github/workflows/ci.yml +8 -0
  19. package/expo/create-only/babel.config.js +27 -0
  20. package/expo/create-only/jest.config.local.ts +34 -0
  21. package/expo/create-only/jest.config.react-native-mock.js +88 -0
  22. package/expo/create-only/jest.setup.pre.js +106 -0
  23. package/expo/create-only/jest.setup.ts +118 -0
  24. package/expo/create-only/tsconfig.local.json +1 -7
  25. package/expo/package-lisa/package.lisa.json +4 -2
  26. package/nestjs/copy-overwrite/.github/workflows/zap-baseline.yml +123 -0
  27. package/nestjs/copy-overwrite/.zap/baseline.conf +39 -0
  28. package/nestjs/copy-overwrite/scripts/zap-baseline.sh +99 -0
  29. package/nestjs/copy-overwrite/tsconfig.eslint.json +10 -0
  30. package/nestjs/copy-overwrite/tsconfig.nestjs.json +4 -1
  31. package/nestjs/create-only/.github/workflows/ci.yml +8 -0
  32. package/nestjs/package-lisa/package.lisa.json +2 -1
  33. package/package.json +1 -1
  34. package/typescript/copy-contents/.husky/pre-push +5 -1
  35. package/typescript/copy-overwrite/.claude/commands/security/zap-scan.md +12 -0
  36. package/typescript/copy-overwrite/.claude/settings.json +10 -0
  37. package/typescript/copy-overwrite/.github/workflows/quality.yml +100 -5
  38. package/typescript/copy-overwrite/eslint.base.ts +1 -1
  39. package/typescript/copy-overwrite/eslint.ignore.config.json +1 -0
  40. package/typescript/copy-overwrite/jest.base.ts +1 -0
  41. 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
+ }
@@ -8,6 +8,9 @@
8
8
  "declaration": true,
9
9
  "sourceMap": true,
10
10
  "outDir": ".build",
11
- "baseUrl": "./"
11
+ "baseUrl": "./",
12
+ "paths": {
13
+ "@/*": ["./src/*"]
14
+ }
12
15
  }
13
16
  }
@@ -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.14.0",
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
- if ! bun audit --audit-level=high --ignore GHSA-5j98-mcp5-4vw2 --ignore GHSA-8qq5-rm4j-mr97; then
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
@@ -11,6 +11,16 @@
11
11
  }
12
12
  ]
13
13
  },
14
+ {
15
+ "matcher": "",
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/enforce-plan-rules.sh",
20
+ "timeout": 5
21
+ }
22
+ ]
23
+ },
14
24
  {
15
25
  "matcher": "",
16
26
  "hooks": [
@@ -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
- echo "- **Active Security Tools**: $ACTIVE_TOOLS / 4" >> $GITHUB_STEP_SUMMARY
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,
@@ -31,6 +31,7 @@
31
31
 
32
32
  ".lisabak/**",
33
33
  ".claude-active-project/**",
34
+ ".claude-active-plan/**",
34
35
  "coverage/**",
35
36
  "**/*spec.ts",
36
37
  "resolver-test.setup.ts",
@@ -44,6 +44,7 @@ export const defaultCoverageExclusions: readonly string[] = [
44
44
  "!**/tests/**",
45
45
  "!**/__tests__/**",
46
46
  "!**/__mocks__/**",
47
+ "!**/components/ui/**",
47
48
  ];
48
49
 
49
50
  /**
@@ -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
  }