@codyswann/lisa 1.46.4 → 1.47.1
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/verify-completion.sh +77 -0
- package/all/copy-overwrite/.claude/rules/lisa.md +2 -1
- package/all/copy-overwrite/.claude/rules/verfication.md +55 -0
- package/all/copy-overwrite/.claude/settings.json +22 -0
- package/package.json +1 -1
- package/typescript/copy-contents/.husky/pre-push +113 -102
- package/typescript/copy-overwrite/.claude/hooks/lint-on-edit.sh +61 -85
- package/typescript/copy-overwrite/.claude/settings.json +22 -0
- package/typescript/copy-overwrite/.github/workflows/auto-update-pr-branches.yml +15 -1
- package/typescript/copy-overwrite/.github/workflows/claude-ci-auto-fix.yml +34 -1
- package/typescript/copy-overwrite/.github/workflows/claude-code-review-response.yml +12 -11
- package/typescript/copy-overwrite/.github/workflows/claude-deploy-auto-fix.yml +143 -0
- package/typescript/copy-overwrite/.github/workflows/claude-nightly-code-complexity.yml +2 -1
- package/typescript/copy-overwrite/.github/workflows/claude-nightly-test-coverage.yml +2 -1
- package/typescript/copy-overwrite/.github/workflows/claude-nightly-test-improvement.yml +4 -2
- package/typescript/copy-overwrite/.github/workflows/claude.yml +2 -1
- package/typescript/copy-overwrite/.github/workflows/create-github-issue-on-failure.yml +115 -0
- package/typescript/copy-overwrite/.github/workflows/create-issue-on-failure.yml +176 -0
- package/typescript/copy-overwrite/.github/workflows/create-jira-issue-on-failure.yml +197 -0
- package/typescript/copy-overwrite/.github/workflows/create-sentry-issue-on-failure.yml +269 -0
- package/typescript/copy-overwrite/.github/workflows/quality.yml +85 -97
- package/typescript/copy-overwrite/audit.ignore.config.json +87 -0
- package/typescript/copy-overwrite/eslint.ignore.config.json +4 -1
- package/typescript/create-only/audit.ignore.local.json +3 -0
|
@@ -964,30 +964,53 @@ jobs:
|
|
|
964
964
|
fi
|
|
965
965
|
working-directory: ${{ inputs.working_directory || '.' }}
|
|
966
966
|
|
|
967
|
-
- name:
|
|
967
|
+
- name: 📋 Load audit exclusions
|
|
968
|
+
id: audit_exclusions
|
|
968
969
|
run: |
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
970
|
+
GHSA_IDS=""
|
|
971
|
+
CVE_IDS=""
|
|
972
|
+
for config_file in audit.ignore.config.json audit.ignore.local.json; do
|
|
973
|
+
if [ -f "$config_file" ]; then
|
|
974
|
+
FILE_IDS=$(jq -r '.exclusions[].id' "$config_file" 2>/dev/null)
|
|
975
|
+
if [ -n "$FILE_IDS" ]; then
|
|
976
|
+
GHSA_IDS="$GHSA_IDS $FILE_IDS"
|
|
977
|
+
fi
|
|
978
|
+
FILE_CVES=$(jq -r '.exclusions[] | select(.cve != null) | .cve' "$config_file" 2>/dev/null)
|
|
979
|
+
if [ -n "$FILE_CVES" ]; then
|
|
980
|
+
CVE_IDS="$CVE_IDS $FILE_CVES"
|
|
981
|
+
fi
|
|
982
|
+
fi
|
|
983
|
+
done
|
|
984
|
+
GHSA_IDS=$(echo "$GHSA_IDS" | tr ' ' '\n' | sort -u | grep -v '^$' | tr '\n' ' ')
|
|
985
|
+
CVE_IDS=$(echo "$CVE_IDS" | tr ' ' '\n' | sort -u | grep -v '^$' | tr '\n' ' ')
|
|
986
|
+
echo "ghsa_ids=$GHSA_IDS" >> $GITHUB_OUTPUT
|
|
987
|
+
echo "cve_ids=$CVE_IDS" >> $GITHUB_OUTPUT
|
|
988
|
+
echo "Loaded GHSA exclusions: $GHSA_IDS"
|
|
989
|
+
echo "Loaded CVE exclusions: $CVE_IDS"
|
|
990
|
+
working-directory: ${{ inputs.working_directory || '.' }}
|
|
980
991
|
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
992
|
+
- name: 🔒 Run security audit
|
|
993
|
+
run: |
|
|
994
|
+
GHSA_IDS="${{ steps.audit_exclusions.outputs.ghsa_ids }}"
|
|
995
|
+
CVE_IDS="${{ steps.audit_exclusions.outputs.cve_ids }}"
|
|
984
996
|
|
|
985
|
-
|
|
986
|
-
#
|
|
987
|
-
|
|
997
|
+
if [ "${{ inputs.package_manager }}" = "npm" ]; then
|
|
998
|
+
# Build jq exclusion filter for npm audit GHSA IDs
|
|
999
|
+
NPM_EXCLUDE_FILTER=""
|
|
1000
|
+
for _id in $GHSA_IDS; do
|
|
1001
|
+
if [ -n "$NPM_EXCLUDE_FILTER" ]; then
|
|
1002
|
+
NPM_EXCLUDE_FILTER="$NPM_EXCLUDE_FILTER or . == \"$_id\""
|
|
1003
|
+
else
|
|
1004
|
+
NPM_EXCLUDE_FILTER=". == \"$_id\""
|
|
1005
|
+
fi
|
|
1006
|
+
done
|
|
988
1007
|
|
|
989
1008
|
AUDIT_JSON=$(npm audit --production --json 2>/dev/null || true)
|
|
990
|
-
|
|
1009
|
+
if [ -n "$NPM_EXCLUDE_FILTER" ]; then
|
|
1010
|
+
UNFIXED_HIGH=$(echo "$AUDIT_JSON" | jq "[.vulnerabilities | to_entries[] | select(.value.severity == \"high\" or .value.severity == \"critical\") | .value.via[] | select(type == \"object\") | .url | ltrimstr(\"https://github.com/advisories/\")] | unique | map(select($NPM_EXCLUDE_FILTER | not)) | length")
|
|
1011
|
+
else
|
|
1012
|
+
UNFIXED_HIGH=$(echo "$AUDIT_JSON" | jq '[.vulnerabilities | to_entries[] | select(.value.severity == "high" or .value.severity == "critical") | .value.via[] | select(type == "object") | .url | ltrimstr("https://github.com/advisories/")] | unique | length')
|
|
1013
|
+
fi
|
|
991
1014
|
if [ "$UNFIXED_HIGH" -gt 0 ]; then
|
|
992
1015
|
echo "::warning::Found high or critical vulnerabilities (after excluding known false positives)"
|
|
993
1016
|
npm audit --production --audit-level=high || true
|
|
@@ -995,26 +1018,42 @@ jobs:
|
|
|
995
1018
|
fi
|
|
996
1019
|
echo "::notice::No high or critical vulnerabilities found (excluding known false positives)"
|
|
997
1020
|
elif [ "${{ inputs.package_manager }}" = "yarn" ]; then
|
|
998
|
-
#
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
#
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1021
|
+
# Build jq filter for GHSA IDs
|
|
1022
|
+
GHSA_FILTER=""
|
|
1023
|
+
for _id in $GHSA_IDS; do
|
|
1024
|
+
if [ -n "$GHSA_FILTER" ]; then
|
|
1025
|
+
GHSA_FILTER="$GHSA_FILTER or .data.advisory.github_advisory_id == \"$_id\""
|
|
1026
|
+
else
|
|
1027
|
+
GHSA_FILTER=".data.advisory.github_advisory_id == \"$_id\""
|
|
1028
|
+
fi
|
|
1029
|
+
done
|
|
1030
|
+
|
|
1031
|
+
# Build jq filter for CVE IDs
|
|
1032
|
+
CVE_FILTER=""
|
|
1033
|
+
for _cve in $CVE_IDS; do
|
|
1034
|
+
if [ -n "$CVE_FILTER" ]; then
|
|
1035
|
+
CVE_FILTER="$CVE_FILTER or . == \"$_cve\""
|
|
1036
|
+
else
|
|
1037
|
+
CVE_FILTER=". == \"$_cve\""
|
|
1038
|
+
fi
|
|
1039
|
+
done
|
|
1040
|
+
|
|
1041
|
+
# Combine GHSA and CVE filters
|
|
1042
|
+
COMBINED_FILTER=""
|
|
1043
|
+
if [ -n "$GHSA_FILTER" ] && [ -n "$CVE_FILTER" ]; then
|
|
1044
|
+
COMBINED_FILTER="($GHSA_FILTER or (.data.advisory.cves | any($CVE_FILTER)))"
|
|
1045
|
+
elif [ -n "$GHSA_FILTER" ]; then
|
|
1046
|
+
COMBINED_FILTER="($GHSA_FILTER)"
|
|
1047
|
+
elif [ -n "$CVE_FILTER" ]; then
|
|
1048
|
+
COMBINED_FILTER="((.data.advisory.cves | any($CVE_FILTER)))"
|
|
1049
|
+
fi
|
|
1050
|
+
|
|
1051
|
+
if [ -n "$COMBINED_FILTER" ]; then
|
|
1052
|
+
yarn audit --groups dependencies --json | jq -r "select(.type == \"auditAdvisory\") | select(.data.advisory.severity == \"high\" or .data.advisory.severity == \"critical\") | select(($COMBINED_FILTER) | not) | .data.advisory" > high_vulns.json
|
|
1053
|
+
else
|
|
1054
|
+
yarn audit --groups dependencies --json | jq -r 'select(.type == "auditAdvisory") | select(.data.advisory.severity == "high" or .data.advisory.severity == "critical") | .data.advisory' > high_vulns.json
|
|
1055
|
+
fi
|
|
1056
|
+
|
|
1018
1057
|
if [ -s high_vulns.json ]; then
|
|
1019
1058
|
echo "::error::Found high or critical vulnerabilities:"
|
|
1020
1059
|
cat high_vulns.json
|
|
@@ -1023,64 +1062,13 @@ jobs:
|
|
|
1023
1062
|
echo "::notice::No high or critical vulnerabilities found (excluding known false positives)"
|
|
1024
1063
|
fi
|
|
1025
1064
|
elif [ "${{ inputs.package_manager }}" = "bun" ]; then
|
|
1026
|
-
#
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
# Excluding GHSA-37qj-frw5-hhjh: fast-xml-parser RangeError DoS with numeric entities
|
|
1035
|
-
# Transitive dependency via @react-native-community/cli (Android/iOS build tooling)
|
|
1036
|
-
# Parent packages pin ^4.4.1; fix requires major version 5.x (incompatible)
|
|
1037
|
-
# Risk: None - CLI build tool, not a production runtime dependency
|
|
1038
|
-
|
|
1039
|
-
# Excluding GHSA-3ppc-4f35-3m26: minimatch ReDoS via repeated wildcards
|
|
1040
|
-
# Transitive dependency in devDependencies (eslint, jest, nodemon, ts-morph, etc.)
|
|
1041
|
-
# Fix requires minimatch v10 which changes export shape (object vs function),
|
|
1042
|
-
# breaking test-exclude (used by Jest coverage). No production code path is affected.
|
|
1043
|
-
# Risk: None - only devDependency tooling, never processes untrusted user input
|
|
1044
|
-
|
|
1045
|
-
# Excluding GHSA-jmr7-xgp7-cmfj: fast-xml-parser DoS through entity expansion in DOCTYPE
|
|
1046
|
-
# Transitive dependency via AWS SDK (@aws-sdk/xml-builder) and snowflake-sdk
|
|
1047
|
-
# Resolution to >=5.3.6 set in package.json but bun audit still flags intermediate ranges
|
|
1048
|
-
# Risk: Low - XML parsing of untrusted DOCTYPE content not in our code paths
|
|
1049
|
-
|
|
1050
|
-
# Excluding GHSA-m7jm-9gc2-mpf2: fast-xml-parser entity encoding bypass via regex injection
|
|
1051
|
-
# Same transitive path as GHSA-jmr7-xgp7-cmfj (AWS SDK, snowflake-sdk)
|
|
1052
|
-
# Resolution to >=5.3.6 set in package.json but bun audit still flags intermediate ranges
|
|
1053
|
-
# Risk: Low - no untrusted XML with DOCTYPE entity names processed
|
|
1054
|
-
|
|
1055
|
-
# Excluding GHSA-r6q2-hw4h-h46w: node-tar race condition via Unicode Ligature Collisions on macOS APFS
|
|
1056
|
-
# Transitive via @nestjs/apollo > @apollo/gateway > make-fetch-happen > cacache > tar
|
|
1057
|
-
# Resolution to ^7.5.8 set in package.json but bun audit still flags intermediate ranges
|
|
1058
|
-
# Risk: None - tar extraction not used in production runtime
|
|
1059
|
-
|
|
1060
|
-
# Excluding GHSA-34x7-hfp2-rc4v: node-tar arbitrary file creation via hardlink path traversal
|
|
1061
|
-
# Same transitive path as GHSA-r6q2-hw4h-h46w
|
|
1062
|
-
# Risk: None - tar extraction not used in production runtime
|
|
1063
|
-
|
|
1064
|
-
# Excluding GHSA-83g3-92jg-28cx: node-tar arbitrary file read/write via hardlink target escape
|
|
1065
|
-
# Same transitive path as GHSA-r6q2-hw4h-h46w
|
|
1066
|
-
# Risk: None - tar extraction not used in production runtime
|
|
1067
|
-
|
|
1068
|
-
# Excluding GHSA-3h5v-q93c-6h6q: ws DoS when handling request with many HTTP headers
|
|
1069
|
-
# Transitive via @nestjs/graphql, graphql-ws, openai, serverless-offline, serverless-esbuild
|
|
1070
|
-
# Resolution to ^8.17.1 set in package.json but bun audit still flags intermediate ranges
|
|
1071
|
-
# Risk: Low - WebSocket servers behind API Gateway which limits headers
|
|
1072
|
-
|
|
1073
|
-
# Excluding GHSA-7r86-cg39-jmmj: minimatch ReDoS via multiple non-adjacent GLOBSTAR segments
|
|
1074
|
-
# Same transitive dependency chain as GHSA-3ppc-4f35-3m26 (eslint, jest, ts-morph, etc.)
|
|
1075
|
-
# Fix requires minimatch >=3.1.3 but bun cannot override transitive dependency version ranges
|
|
1076
|
-
# Risk: None - only devDependency tooling, never processes untrusted user input
|
|
1077
|
-
|
|
1078
|
-
# Excluding GHSA-23c5-xmqv-rm74: minimatch ReDoS via nested *() extglobs
|
|
1079
|
-
# Same transitive dependency chain as GHSA-3ppc-4f35-3m26 (eslint, jest, ts-morph, etc.)
|
|
1080
|
-
# Fix requires minimatch >=3.1.3 but bun cannot override transitive dependency version ranges
|
|
1081
|
-
# Risk: None - only devDependency tooling, never processes untrusted user input
|
|
1082
|
-
|
|
1083
|
-
if ! bun audit --audit-level=high --ignore GHSA-5j98-mcp5-4vw2 --ignore GHSA-8qq5-rm4j-mr97 --ignore GHSA-37qj-frw5-hhjh --ignore GHSA-3ppc-4f35-3m26 --ignore GHSA-jmr7-xgp7-cmfj --ignore GHSA-m7jm-9gc2-mpf2 --ignore GHSA-r6q2-hw4h-h46w --ignore GHSA-34x7-hfp2-rc4v --ignore GHSA-83g3-92jg-28cx --ignore GHSA-3h5v-q93c-6h6q --ignore GHSA-7r86-cg39-jmmj --ignore GHSA-23c5-xmqv-rm74; then
|
|
1065
|
+
# Build --ignore flags dynamically from exclusion list
|
|
1066
|
+
BUN_IGNORE_FLAGS=""
|
|
1067
|
+
for _id in $GHSA_IDS; do
|
|
1068
|
+
BUN_IGNORE_FLAGS="$BUN_IGNORE_FLAGS --ignore $_id"
|
|
1069
|
+
done
|
|
1070
|
+
|
|
1071
|
+
if ! bun audit --audit-level=high $BUN_IGNORE_FLAGS; then
|
|
1084
1072
|
echo "::warning::Found high or critical vulnerabilities"
|
|
1085
1073
|
exit 1
|
|
1086
1074
|
fi
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"exclusions": [
|
|
3
|
+
{
|
|
4
|
+
"id": "GHSA-5j98-mcp5-4vw2",
|
|
5
|
+
"cve": "CVE-2025-64756",
|
|
6
|
+
"package": "glob",
|
|
7
|
+
"reason": "CLI command injection — only affects glob CLI --cmd flag, not library usage"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "GHSA-8qq5-rm4j-mr97",
|
|
11
|
+
"package": "node-tar",
|
|
12
|
+
"reason": "Path sanitization vulnerability — nested in @expo/cli, tar extraction not in our code path"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "GHSA-37qj-frw5-hhjh",
|
|
16
|
+
"package": "fast-xml-parser",
|
|
17
|
+
"reason": "RangeError DoS with numeric entities — transitive via React Native CLI, build tool only"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "GHSA-3ppc-4f35-3m26",
|
|
21
|
+
"package": "minimatch",
|
|
22
|
+
"reason": "ReDoS via repeated wildcards — devDeps only, fix requires breaking minimatch v10"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "GHSA-7r86-cg39-jmmj",
|
|
26
|
+
"package": "minimatch",
|
|
27
|
+
"reason": "ReDoS via multiple non-adjacent GLOBSTAR segments — devDeps only, fix requires minimatch >=3.1.3"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "GHSA-23c5-xmqv-rm74",
|
|
31
|
+
"package": "minimatch",
|
|
32
|
+
"reason": "ReDoS via nested *() extglobs — devDeps only, fix requires minimatch >=3.1.3"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "GHSA-2g4f-4pwh-qvx6",
|
|
36
|
+
"package": "ajv",
|
|
37
|
+
"reason": "ReDoS with $data option — $data option not used, nested in aws-cdk-lib/eslint"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "GHSA-jmr7-xgp7-cmfj",
|
|
41
|
+
"package": "fast-xml-parser",
|
|
42
|
+
"reason": "DoS through entity expansion in DOCTYPE — transitive via AWS SDK, no untrusted XML parsing"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "GHSA-m7jm-9gc2-mpf2",
|
|
46
|
+
"package": "fast-xml-parser",
|
|
47
|
+
"reason": "Entity encoding bypass via regex injection — same path as GHSA-jmr7-xgp7-cmfj"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "GHSA-r6q2-hw4h-h46w",
|
|
51
|
+
"package": "node-tar",
|
|
52
|
+
"reason": "Race condition via Unicode Ligature Collisions on macOS APFS — transitive via NestJS/Apollo, tar not used in production"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "GHSA-34x7-hfp2-rc4v",
|
|
56
|
+
"package": "node-tar",
|
|
57
|
+
"reason": "Arbitrary file creation via hardlink path traversal — same path as GHSA-r6q2-hw4h-h46w"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "GHSA-83g3-92jg-28cx",
|
|
61
|
+
"package": "node-tar",
|
|
62
|
+
"reason": "Arbitrary file read/write via hardlink target escape — same path as GHSA-r6q2-hw4h-h46w"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "GHSA-3h5v-q93c-6h6q",
|
|
66
|
+
"package": "ws",
|
|
67
|
+
"reason": "DoS via many HTTP headers — WebSocket servers behind API Gateway which limits headers"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "GHSA-w532-jxjh-hjhj",
|
|
71
|
+
"cve": "CVE-2025-29907",
|
|
72
|
+
"package": "jsPDF",
|
|
73
|
+
"reason": "ReDoS in addImage — controlled usage only, no user-controlled input to addImage"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "GHSA-8mvj-3j78-4qmw",
|
|
77
|
+
"cve": "CVE-2025-57810",
|
|
78
|
+
"package": "jsPDF",
|
|
79
|
+
"reason": "DoS in addImage — controlled usage only, no user-controlled input to addImage"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": "GHSA-36jr-mh4h-2g58",
|
|
83
|
+
"package": "d3-color",
|
|
84
|
+
"reason": "ReDoS — transitive via react-native-svg-charts, color parsing not user-controlled"
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
}
|