@codyswann/lisa 4.73.8 → 4.74.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/README.md +52 -3
- package/all/copy-overwrite/scripts/lib/github-attestation-recovery.mjs +48 -35
- package/all/copy-overwrite/scripts/lib/npm-update-hosted-gate.mjs +15 -1
- package/all/copy-overwrite/scripts/lib/npm-update-hosted-hook.mjs +56 -27
- package/all/copy-overwrite/scripts/lib/npm-update-invariants.mjs +78 -1
- package/all/copy-overwrite/scripts/lib/npm-update-native-process.mjs +29 -10
- package/all/copy-overwrite/scripts/lisa-automation-provenance.mjs +86 -37
- package/all/copy-overwrite/scripts/npm-updater-helper-graph.json +11 -8
- package/all/create-only/.github/workflows/continuous-gates.yml +2 -2
- package/all/create-only/.github/workflows/workflow-load-failure-sweep.yml +1 -1
- package/cdk/create-only/.github/workflows/ci.yml +2 -2
- package/cdk/create-only/.github/workflows/deploy.yml +3 -3
- package/cdk/package-lisa/package.lisa.json +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +26 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/lisa-owned-templates.d.ts +9 -2
- package/dist/core/lisa-owned-templates.d.ts.map +1 -1
- package/dist/core/lisa-owned-templates.js +13 -3
- package/dist/core/lisa-owned-templates.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +59 -37
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/expo/copy-overwrite/jest.setup.pre.js +15 -1
- package/expo/create-only/.github/workflows/ci.yml +3 -3
- package/expo/create-only/.github/workflows/deploy.yml +4 -4
- package/expo/create-only/.github/workflows/nightly-e2e-bypass-reaper.yml +1 -1
- package/expo/create-only/.github/workflows/playwright-e2e.yml +1 -1
- package/expo/create-only/eas.json +1 -1
- package/harper-fabric/copy-overwrite/.github/workflows/ci.yml +1 -1
- package/harper-fabric/create-only/.github/workflows/deploy.yml +3 -3
- package/harper-fabric/create-only/.github/workflows/zap-baseline.yml +1 -1
- package/harper-fabric/package-lisa/package.lisa.json +2 -2
- package/nestjs/create-only/.github/workflows/ci.yml +2 -2
- package/nestjs/create-only/.github/workflows/deploy.yml +5 -5
- package/package.json +6 -6
- package/phaser/copy-overwrite/.github/workflows/ci.yml +1 -1
- package/phaser/package-lisa/package.lisa.json +2 -2
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-sdk-setup/SKILL.md +104 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -1
- package/plugins/lisa/skills/lisa-parity-sentry-sdk-setup/SKILL.md +104 -0
- package/plugins/lisa/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-parity-sentry-sdk-setup/SKILL.md +104 -0
- package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/skills/lisa-parity-sentry-sdk-setup/SKILL.md +104 -0
- package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-parity-sentry-sdk-setup/SKILL.md +104 -0
- package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/skills/lisa-parity-sentry-sdk-setup/SKILL.md +104 -0
- package/plugins/src/base/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -1
- package/scripts/check-shell-guard-refusal-coverage.mjs +65 -7
- package/scripts/generate-lisa-owned-hash-ledger.mjs +3 -0
- package/scripts/lib/shell-guard-shard-runner.mjs +381 -0
- package/scripts/lib/shell-guard-shards.mjs +383 -0
- package/scripts/lib/shell-guard-terminal-reporter.mjs +89 -0
- package/scripts/two-channel-couplings.json +1 -1
- package/scripts/update-node-version.ts +52 -6
- package/typescript/copy-overwrite/.nvmrc +1 -1
- package/typescript/create-only/.github/workflows/ci.yml +1 -1
- package/typescript/create-only/.github/workflows/review-evidence.yml +1 -1
- package/typescript/create-only/.github/workflows/third-party-review-evidence.yml +1 -1
- package/typescript/package-lisa/package.lisa.json +1 -1
|
@@ -66,8 +66,22 @@ global.nativeFabricUIManager = {};
|
|
|
66
66
|
// Mock TurboModuleRegistry using external mock configuration
|
|
67
67
|
const mockModules = require("./jest.config.react-native-mock");
|
|
68
68
|
|
|
69
|
+
// Baseline native modules needed to load real View/Text under Jest. These
|
|
70
|
+
// fallbacks also support older project-owned registries without editing them.
|
|
71
|
+
// SourceCode matches @react-native/jest-preset's null scriptURL unit seam;
|
|
72
|
+
// PaperUIManager reads getConstants during initialization, with no native views.
|
|
73
|
+
const defaultMockModules = {
|
|
74
|
+
SourceCode: { getConstants: () => ({ scriptURL: null }) },
|
|
75
|
+
UIManager: { getConstants: () => ({}) },
|
|
76
|
+
};
|
|
77
|
+
|
|
69
78
|
global.__turboModuleProxy = function (moduleName) {
|
|
70
|
-
return
|
|
79
|
+
return (
|
|
80
|
+
mockModules[moduleName] ??
|
|
81
|
+
(Object.hasOwn(defaultMockModules, moduleName)
|
|
82
|
+
? defaultMockModules[moduleName]
|
|
83
|
+
: null)
|
|
84
|
+
);
|
|
71
85
|
};
|
|
72
86
|
|
|
73
87
|
// Ensure global timers are available (required by @testing-library/react-native)
|
|
@@ -47,7 +47,7 @@ jobs:
|
|
|
47
47
|
# declared a break, and says NOT DETERMINED if this line goes missing
|
|
48
48
|
# (CodySwannGT/lisa#3698).
|
|
49
49
|
expected_workflow_contract_major: '1'
|
|
50
|
-
node_version: '
|
|
50
|
+
node_version: '24.21.0'
|
|
51
51
|
package_manager: 'bun'
|
|
52
52
|
skip_jobs: 'test:e2e,playwright_e2e'
|
|
53
53
|
# Forward SE-4551 / SE-4552 inputs. `|| fromJSON('...')` falls back to
|
|
@@ -82,7 +82,7 @@ jobs:
|
|
|
82
82
|
# declared a break, and says NOT DETERMINED if this line goes missing
|
|
83
83
|
# (CodySwannGT/lisa#3698).
|
|
84
84
|
expected_workflow_contract_major: '1'
|
|
85
|
-
node_version: '
|
|
85
|
+
node_version: '24.21.0'
|
|
86
86
|
package_manager: 'bun'
|
|
87
87
|
|
|
88
88
|
zap:
|
|
@@ -98,5 +98,5 @@ jobs:
|
|
|
98
98
|
# declared a break, and says NOT DETERMINED if this line goes missing
|
|
99
99
|
# (CodySwannGT/lisa#3698).
|
|
100
100
|
expected_workflow_contract_major: '1'
|
|
101
|
-
node_version: '
|
|
101
|
+
node_version: '24.21.0'
|
|
102
102
|
package_manager: 'bun'
|
|
@@ -114,7 +114,7 @@ jobs:
|
|
|
114
114
|
# (CodySwannGT/lisa#3698).
|
|
115
115
|
expected_workflow_contract_major: '1'
|
|
116
116
|
moment: pre-deploy:${{ needs.determine_environment.outputs.environment }}
|
|
117
|
-
node_version: '
|
|
117
|
+
node_version: '24.21.0'
|
|
118
118
|
package_manager: 'bun'
|
|
119
119
|
# No `secrets:` key: gates.yml declares none in its `workflow_call`, so
|
|
120
120
|
# passing any grants everything to a callee that reads nothing (#3065).
|
|
@@ -142,7 +142,7 @@ jobs:
|
|
|
142
142
|
approval_environment: ${{ needs.determine_environment.outputs.approval_environment }}
|
|
143
143
|
require_signatures: false
|
|
144
144
|
generate_sbom: true
|
|
145
|
-
node_version: '
|
|
145
|
+
node_version: '24.21.0'
|
|
146
146
|
package_manager: 'bun'
|
|
147
147
|
override_blackout: true
|
|
148
148
|
emergency_release: false
|
|
@@ -330,7 +330,7 @@ jobs:
|
|
|
330
330
|
uses: actions/setup-node@v6
|
|
331
331
|
with:
|
|
332
332
|
package-manager-cache: false
|
|
333
|
-
node-version: '
|
|
333
|
+
node-version: '24.21.0'
|
|
334
334
|
- name: 🍞 Setup Bun
|
|
335
335
|
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
|
|
336
336
|
with:
|
|
@@ -424,7 +424,7 @@ jobs:
|
|
|
424
424
|
# (CodySwannGT/lisa#3698).
|
|
425
425
|
expected_workflow_contract_major: '1'
|
|
426
426
|
moment: post-deploy:${{ needs.determine_environment.outputs.environment }}
|
|
427
|
-
node_version: '
|
|
427
|
+
node_version: '24.21.0'
|
|
428
428
|
package_manager: 'bun'
|
|
429
429
|
# No `secrets:` key: gates.yml declares none in its `workflow_call`, so
|
|
430
430
|
# passing any grants everything to a callee that reads nothing (#3065).
|
|
@@ -137,7 +137,7 @@ jobs:
|
|
|
137
137
|
# declared a break, and says NOT DETERMINED if this line goes missing
|
|
138
138
|
# (CodySwannGT/lisa#3698).
|
|
139
139
|
expected_workflow_contract_major: '1'
|
|
140
|
-
node_version: '
|
|
140
|
+
node_version: '24.21.0'
|
|
141
141
|
package_manager: 'bun'
|
|
142
142
|
# The moment this workflow's cadence corresponds to. It is what makes the
|
|
143
143
|
# `.lisa.config.json` declaration above readable from here — a gate
|
|
@@ -41,7 +41,7 @@ jobs:
|
|
|
41
41
|
# (CodySwannGT/lisa#3698).
|
|
42
42
|
expected_workflow_contract_major: '1'
|
|
43
43
|
moment: pre-deploy:${{ github.ref_name }}
|
|
44
|
-
node_version: '
|
|
44
|
+
node_version: '24.21.0'
|
|
45
45
|
package_manager: 'bun'
|
|
46
46
|
# No `secrets:` key: gates.yml declares none in its `workflow_call`, so
|
|
47
47
|
# passing any grants everything to a callee that reads nothing (#3065).
|
|
@@ -64,7 +64,7 @@ jobs:
|
|
|
64
64
|
- name: Setup Node.js
|
|
65
65
|
uses: actions/setup-node@v6
|
|
66
66
|
with:
|
|
67
|
-
node-version: '
|
|
67
|
+
node-version: '24.21.0'
|
|
68
68
|
package-manager-cache: false
|
|
69
69
|
|
|
70
70
|
- name: Setup Bun
|
|
@@ -132,7 +132,7 @@ jobs:
|
|
|
132
132
|
# (CodySwannGT/lisa#3698).
|
|
133
133
|
expected_workflow_contract_major: '1'
|
|
134
134
|
moment: post-deploy:${{ github.ref_name }}
|
|
135
|
-
node_version: '
|
|
135
|
+
node_version: '24.21.0'
|
|
136
136
|
package_manager: 'bun'
|
|
137
137
|
# No `secrets:` key: gates.yml declares none in its `workflow_call`, so
|
|
138
138
|
# passing any grants everything to a callee that reads nothing (#3065).
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
|
|
38
38
|
"@eslint/eslintrc": "^3.3.7",
|
|
39
39
|
"@eslint/js": "^9.39.5",
|
|
40
|
-
"@types/node": "^
|
|
40
|
+
"@types/node": "^24.0.0",
|
|
41
41
|
"@vitest/coverage-v8": "^4.1.11",
|
|
42
42
|
"eslint": "^9.39.5",
|
|
43
43
|
"eslint-config-prettier": "^10.0.0",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"yarn": "please-use-bun",
|
|
66
66
|
"pnpm": "please-use-bun",
|
|
67
67
|
"bun": ">= 1.3.11",
|
|
68
|
-
"node": ">=
|
|
68
|
+
"node": ">= 24.21.0"
|
|
69
69
|
},
|
|
70
70
|
"packageManager": "bun@1.3.11",
|
|
71
71
|
"private": true
|
|
@@ -28,7 +28,7 @@ jobs:
|
|
|
28
28
|
# declared a break, and says NOT DETERMINED if this line goes missing
|
|
29
29
|
# (CodySwannGT/lisa#3698).
|
|
30
30
|
expected_workflow_contract_major: '1'
|
|
31
|
-
node_version: '
|
|
31
|
+
node_version: '24.21.0'
|
|
32
32
|
package_manager: 'bun'
|
|
33
33
|
skip_jobs: 'test:e2e,playwright_e2e'
|
|
34
34
|
secrets:
|
|
@@ -56,5 +56,5 @@ jobs:
|
|
|
56
56
|
# declared a break, and says NOT DETERMINED if this line goes missing
|
|
57
57
|
# (CodySwannGT/lisa#3698).
|
|
58
58
|
expected_workflow_contract_major: '1'
|
|
59
|
-
node_version: '
|
|
59
|
+
node_version: '24.21.0'
|
|
60
60
|
package_manager: 'bun'
|
|
@@ -110,7 +110,7 @@ jobs:
|
|
|
110
110
|
# (CodySwannGT/lisa#3698).
|
|
111
111
|
expected_workflow_contract_major: '1'
|
|
112
112
|
moment: pre-deploy:${{ needs.determine_environment.outputs.environment }}
|
|
113
|
-
node_version: '
|
|
113
|
+
node_version: '24.21.0'
|
|
114
114
|
package_manager: 'bun'
|
|
115
115
|
# No `secrets:` key: gates.yml declares none in its `workflow_call`, so
|
|
116
116
|
# passing any grants everything to a callee that reads nothing (#3065).
|
|
@@ -139,7 +139,7 @@ jobs:
|
|
|
139
139
|
require_approval: ${{ needs.determine_environment.outputs.require_approval == 'true' }}
|
|
140
140
|
approval_environment: ${{ needs.determine_environment.outputs.approval_environment }}
|
|
141
141
|
require_signatures: false
|
|
142
|
-
node_version: '
|
|
142
|
+
node_version: '24.21.0'
|
|
143
143
|
package_manager: 'bun'
|
|
144
144
|
secrets:
|
|
145
145
|
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
|
|
@@ -306,10 +306,10 @@ jobs:
|
|
|
306
306
|
contents: read
|
|
307
307
|
steps:
|
|
308
308
|
- uses: actions/checkout@v6
|
|
309
|
-
- name: Use Node.js
|
|
309
|
+
- name: Use Node.js 24.21.0
|
|
310
310
|
uses: actions/setup-node@v6
|
|
311
311
|
with:
|
|
312
|
-
node-version:
|
|
312
|
+
node-version: 24.21.0
|
|
313
313
|
package-manager-cache: false
|
|
314
314
|
- uses: noliran/branch-based-secrets@ef9182f16f118c7c3d05c36973546ebc990b8c69 # v1 (2020-10-09, no semver tag)
|
|
315
315
|
with:
|
|
@@ -462,7 +462,7 @@ jobs:
|
|
|
462
462
|
# (CodySwannGT/lisa#3698).
|
|
463
463
|
expected_workflow_contract_major: '1'
|
|
464
464
|
moment: post-deploy:${{ needs.determine_environment.outputs.environment }}
|
|
465
|
-
node_version: '
|
|
465
|
+
node_version: '24.21.0'
|
|
466
466
|
package_manager: 'bun'
|
|
467
467
|
# No `secrets:` key: gates.yml declares none in its `workflow_call`, so
|
|
468
468
|
# passing any grants everything to a callee that reads nothing (#3065).
|
package/package.json
CHANGED
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
"yarn": "please-use-bun",
|
|
110
110
|
"pnpm": "please-use-bun",
|
|
111
111
|
"bun": "1.3.8",
|
|
112
|
-
"node": "
|
|
112
|
+
"node": "24.21.0"
|
|
113
113
|
},
|
|
114
114
|
"workspaces": [
|
|
115
115
|
"eslint-plugin-code-organization",
|
|
@@ -189,7 +189,7 @@
|
|
|
189
189
|
"qs": "^6.16.0"
|
|
190
190
|
},
|
|
191
191
|
"name": "@codyswann/lisa",
|
|
192
|
-
"version": "4.
|
|
192
|
+
"version": "4.74.0",
|
|
193
193
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
194
194
|
"main": "dist/index.js",
|
|
195
195
|
"exports": {
|
|
@@ -272,7 +272,7 @@
|
|
|
272
272
|
"@types/fs-extra": "^11.0.0",
|
|
273
273
|
"@types/jest": "^30.0.0",
|
|
274
274
|
"@types/lodash.merge": "^4.6.0",
|
|
275
|
-
"@types/node": "^
|
|
275
|
+
"@types/node": "^24.0.0",
|
|
276
276
|
"@vitest/coverage-v8": "^4.1.11",
|
|
277
277
|
"commander": "^12.0.0",
|
|
278
278
|
"esbuild-register": "^3.6.0",
|
|
@@ -345,7 +345,7 @@
|
|
|
345
345
|
"test": "tests"
|
|
346
346
|
},
|
|
347
347
|
"types": "./dist/index.d.ts",
|
|
348
|
-
"lisaReleaseCommit": "
|
|
349
|
-
"gitHead": "
|
|
350
|
-
"lisaReleaseTag": "v4.
|
|
348
|
+
"lisaReleaseCommit": "fb7ed7c4d51c760b1855d4a68321a96ec0daf050",
|
|
349
|
+
"gitHead": "fb7ed7c4d51c760b1855d4a68321a96ec0daf050",
|
|
350
|
+
"lisaReleaseTag": "v4.74.0"
|
|
351
351
|
}
|
|
@@ -29,7 +29,7 @@ jobs:
|
|
|
29
29
|
# declared a break, and says NOT DETERMINED if this line goes missing
|
|
30
30
|
# (CodySwannGT/lisa#3698).
|
|
31
31
|
expected_workflow_contract_major: '1'
|
|
32
|
-
node_version: '
|
|
32
|
+
node_version: '24.21.0'
|
|
33
33
|
package_manager: 'bun'
|
|
34
34
|
skip_jobs: ''
|
|
35
35
|
# Verification IS UAT: a feat/fix must ship a tests/e2e verification spec
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
|
|
31
31
|
"@eslint/eslintrc": "^3.3.7",
|
|
32
32
|
"@eslint/js": "^9.39.5",
|
|
33
|
-
"@types/node": "^
|
|
33
|
+
"@types/node": "^24.0.0",
|
|
34
34
|
"@vitest/coverage-v8": "^4.1.11",
|
|
35
35
|
"eslint": "^9.39.5",
|
|
36
36
|
"eslint-config-prettier": "^10.0.0",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"yarn": "please-use-bun",
|
|
58
58
|
"pnpm": "please-use-bun",
|
|
59
59
|
"bun": ">= 1.3.11",
|
|
60
|
-
"node": ">=
|
|
60
|
+
"node": ">= 24.21.0"
|
|
61
61
|
},
|
|
62
62
|
"packageManager": "bun@1.3.11",
|
|
63
63
|
"private": true,
|
|
@@ -86,6 +86,8 @@ Inspect the project before choosing an SDK. Read `package.json`
|
|
|
86
86
|
- `pyproject.toml` / `requirements.txt`; `django`/`flask`/`fastapi` →
|
|
87
87
|
**Python** (and which web framework)
|
|
88
88
|
- A plain Node library/CLI → **Node**
|
|
89
|
+
- AWS Lambda handlers or a Serverless/SAM/CDK function runtime → inspect the
|
|
90
|
+
function's actual runtime and wrapper before choosing **Node/Lambda**.
|
|
89
91
|
|
|
90
92
|
If the runtime is genuinely ambiguous, ask which app to instrument rather than
|
|
91
93
|
guessing. Respect the project's package manager (bun/npm/pnpm/yarn — match the
|
|
@@ -100,6 +102,7 @@ Use the project's package manager. Examples (swap `bun add` for your manager):
|
|
|
100
102
|
| React (browser) | `@sentry/react` |
|
|
101
103
|
| Next.js | `@sentry/nextjs` |
|
|
102
104
|
| Node / Express / Fastify | `@sentry/node` (+ `@sentry/profiling-node` for profiling) |
|
|
105
|
+
| AWS Lambda | `@sentry/aws-serverless` for a compatible Lambda wrapper, or `@sentry/node` for an unwrapped async handler |
|
|
103
106
|
| NestJS | `@sentry/nestjs` (+ `@sentry/node`) |
|
|
104
107
|
| React Native / Expo | `@sentry/react-native` |
|
|
105
108
|
| Vue | `@sentry/vue` |
|
|
@@ -150,6 +153,107 @@ Sentry.init({
|
|
|
150
153
|
|
|
151
154
|
Then, after routes are defined: `Sentry.setupExpressErrorHandler(app);`
|
|
152
155
|
|
|
156
|
+
### Node24 Lambda completion
|
|
157
|
+
|
|
158
|
+
Review the actual function runtime and installed SDK before migrating. Node24
|
|
159
|
+
LTS is Lisa's default for new TypeScript hosts; an existing host's explicit
|
|
160
|
+
engine and create-only workflows remain host-owned. On AWS Lambda `nodejs24.x`,
|
|
161
|
+
callback-style handlers and legacy context completion APIs, including
|
|
162
|
+
`callbackWaitsForEmptyEventLoop`, are removed. Do not assign those properties,
|
|
163
|
+
including to frozen/non-extensible context objects. Supported async handlers,
|
|
164
|
+
synchronous returns and response streaming are distinct forms; follow the
|
|
165
|
+
[AWS handler contract](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html).
|
|
166
|
+
|
|
167
|
+
Earlier non-streaming async handlers already returned without waiting for
|
|
168
|
+
unresolved background promises. Node24 aligns streaming completion with that
|
|
169
|
+
behavior; await work that must finish before returning or ending the stream.
|
|
170
|
+
Do not claim all Node20/22 async handlers drained arbitrary background work.
|
|
171
|
+
For streaming, flush at the appropriate point before `responseStream.end()` or
|
|
172
|
+
inside the awaited streaming pipeline, rather than after the stream is ended.
|
|
173
|
+
[AWS's Node24 migration explanation](https://aws.amazon.com/blogs/compute/node-js-24-runtime-now-available-in-aws-lambda/)
|
|
174
|
+
is the runtime authority; ordinary local Node process behavior is not deployed
|
|
175
|
+
Lambda evidence.
|
|
176
|
+
|
|
177
|
+
For an **unwrapped async** scheduled, queue or Cognito handler, initialize Sentry
|
|
178
|
+
once at module startup with the DSN from the environment. Await a finite positive
|
|
179
|
+
flush budget on both success and original-error paths. A false flush result or
|
|
180
|
+
rejection must not turn successful queue work into a retry or replace its real
|
|
181
|
+
error. Keep diagnostics local and non-throwing, and preserve the client for warm
|
|
182
|
+
invocations: `close()` disables it. The following helper wraps the host's existing
|
|
183
|
+
business operation; it neither mutates context nor adds a Lambda callback.
|
|
184
|
+
|
|
185
|
+
<!-- lisa-node24-unwrapped-example:start -->
|
|
186
|
+
```ts
|
|
187
|
+
import * as Sentry from "@sentry/node";
|
|
188
|
+
|
|
189
|
+
// Initialize early, once outside the handler, with DSN from the environment.
|
|
190
|
+
function reportFlushProblem(message: string): void {
|
|
191
|
+
try {
|
|
192
|
+
console.warn(message);
|
|
193
|
+
} catch {
|
|
194
|
+
// Telemetry diagnostics must preserve the business outcome too.
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export async function withSentryFlush<T>(
|
|
199
|
+
work: () => Promise<T>,
|
|
200
|
+
timeoutMs = 2000
|
|
201
|
+
): Promise<T> {
|
|
202
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
203
|
+
throw new RangeError("Choose a finite positive Sentry flush budget");
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
return await work();
|
|
207
|
+
} catch (originalError) {
|
|
208
|
+
try {
|
|
209
|
+
Sentry.captureException(originalError);
|
|
210
|
+
} catch {
|
|
211
|
+
// Preserve the original handler error even if capture fails.
|
|
212
|
+
}
|
|
213
|
+
throw originalError;
|
|
214
|
+
} finally {
|
|
215
|
+
try {
|
|
216
|
+
if (!(await Sentry.flush(timeoutMs))) {
|
|
217
|
+
reportFlushProblem("Sentry flush did not finish in time");
|
|
218
|
+
}
|
|
219
|
+
} catch {
|
|
220
|
+
reportFlushProblem("Sentry flush rejected");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
<!-- lisa-node24-unwrapped-example:end -->
|
|
226
|
+
|
|
227
|
+
In the existing async handler, return
|
|
228
|
+
`withSentryFlush(() => performBusinessWork(event, context))`; use the host's
|
|
229
|
+
actual business operation and preserve its return/error contract. Select a
|
|
230
|
+
positive budget that fits remaining invocation time with a safety margin.
|
|
231
|
+
Do not omit the timeout or use zero as a finite cap. The SDK's timeout argument
|
|
232
|
+
does not cancel every custom transport or guarantee completion before Lambda's
|
|
233
|
+
hard timeout, and a drained local queue does not prove tenant ingestion.
|
|
234
|
+
[Sentry API semantics](https://docs.sentry.io/platforms/javascript/guides/aws-lambda/configuration/apis.md)
|
|
235
|
+
describe `flush()` and `close()`.
|
|
236
|
+
|
|
237
|
+
For a **compatible `Sentry.wrapHandler`**, its documented default flush is up
|
|
238
|
+
to2000ms, configurable through `flushTimeout`; avoid a redundant manual flush
|
|
239
|
+
when that wrapper already handles completion. Check the installed version's
|
|
240
|
+
context behavior, too: `@sentry/aws-serverless`11.6.0 unconditionally assigns
|
|
241
|
+
`context.callbackWaitsForEmptyEventLoop` before invoking the business handler.
|
|
242
|
+
It throws on a non-extensible context lacking that removed property. Changing
|
|
243
|
+
the option does not remove the assignment. Use the unwrapped form when this
|
|
244
|
+
incompatibility applies; do not clone/unfreeze context or pre-add an obsolete
|
|
245
|
+
property to claim compatibility. See the [wrapper documentation](https://docs.sentry.io/platforms/javascript/guides/aws-lambda/configuration/lambda-wrapper.md)
|
|
246
|
+
and [versioned implementation](https://github.com/getsentry/sentry-javascript/blob/11.6.0/packages/aws-serverless/src/sdk.ts).
|
|
247
|
+
|
|
248
|
+
Treat Node types and optional native profiling as migration checks. Examples
|
|
249
|
+
using `Array.at` need an ES2022-or-later TypeScript `lib`; keep a host's business
|
|
250
|
+
compiler target deliberate. Confirm optional profiling prebuilds against the
|
|
251
|
+
actual Node ABI (Node24 uses137) only when profiling is in use; do not install an
|
|
252
|
+
unused profiling package. Verify the helper with the real installed SDK and
|
|
253
|
+
local transport, including success/error, timeout/false, rejected flush and a
|
|
254
|
+
second warm invocation. Label local observations honestly; actual Lambda
|
|
255
|
+
deployment and Sentry event ingestion require their own provider proof.
|
|
256
|
+
|
|
153
257
|
**NestJS** — import `./instrument` first in `main.ts`, then add Sentry's module:
|
|
154
258
|
|
|
155
259
|
```ts
|
|
@@ -63,7 +63,9 @@ import {
|
|
|
63
63
|
export function locate(name, exec = boundedChildOutput) {
|
|
64
64
|
try {
|
|
65
65
|
return String(
|
|
66
|
-
exec("
|
|
66
|
+
exec("sh", ["-c", 'command -v -- "$1"', "lisa-locate", name], {
|
|
67
|
+
encoding: "utf8",
|
|
68
|
+
})
|
|
67
69
|
).trim();
|
|
68
70
|
} catch {
|
|
69
71
|
// probe-direction: fail-closed — null means "not proven present", and the
|
|
@@ -84,6 +84,8 @@ Inspect the project before choosing an SDK. Read `package.json`
|
|
|
84
84
|
- `pyproject.toml` / `requirements.txt`; `django`/`flask`/`fastapi` →
|
|
85
85
|
**Python** (and which web framework)
|
|
86
86
|
- A plain Node library/CLI → **Node**
|
|
87
|
+
- AWS Lambda handlers or a Serverless/SAM/CDK function runtime → inspect the
|
|
88
|
+
function's actual runtime and wrapper before choosing **Node/Lambda**.
|
|
87
89
|
|
|
88
90
|
If the runtime is genuinely ambiguous, ask which app to instrument rather than
|
|
89
91
|
guessing. Respect the project's package manager (bun/npm/pnpm/yarn — match the
|
|
@@ -98,6 +100,7 @@ Use the project's package manager. Examples (swap `bun add` for your manager):
|
|
|
98
100
|
| React (browser) | `@sentry/react` |
|
|
99
101
|
| Next.js | `@sentry/nextjs` |
|
|
100
102
|
| Node / Express / Fastify | `@sentry/node` (+ `@sentry/profiling-node` for profiling) |
|
|
103
|
+
| AWS Lambda | `@sentry/aws-serverless` for a compatible Lambda wrapper, or `@sentry/node` for an unwrapped async handler |
|
|
101
104
|
| NestJS | `@sentry/nestjs` (+ `@sentry/node`) |
|
|
102
105
|
| React Native / Expo | `@sentry/react-native` |
|
|
103
106
|
| Vue | `@sentry/vue` |
|
|
@@ -148,6 +151,107 @@ Sentry.init({
|
|
|
148
151
|
|
|
149
152
|
Then, after routes are defined: `Sentry.setupExpressErrorHandler(app);`
|
|
150
153
|
|
|
154
|
+
### Node24 Lambda completion
|
|
155
|
+
|
|
156
|
+
Review the actual function runtime and installed SDK before migrating. Node24
|
|
157
|
+
LTS is Lisa's default for new TypeScript hosts; an existing host's explicit
|
|
158
|
+
engine and create-only workflows remain host-owned. On AWS Lambda `nodejs24.x`,
|
|
159
|
+
callback-style handlers and legacy context completion APIs, including
|
|
160
|
+
`callbackWaitsForEmptyEventLoop`, are removed. Do not assign those properties,
|
|
161
|
+
including to frozen/non-extensible context objects. Supported async handlers,
|
|
162
|
+
synchronous returns and response streaming are distinct forms; follow the
|
|
163
|
+
[AWS handler contract](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html).
|
|
164
|
+
|
|
165
|
+
Earlier non-streaming async handlers already returned without waiting for
|
|
166
|
+
unresolved background promises. Node24 aligns streaming completion with that
|
|
167
|
+
behavior; await work that must finish before returning or ending the stream.
|
|
168
|
+
Do not claim all Node20/22 async handlers drained arbitrary background work.
|
|
169
|
+
For streaming, flush at the appropriate point before `responseStream.end()` or
|
|
170
|
+
inside the awaited streaming pipeline, rather than after the stream is ended.
|
|
171
|
+
[AWS's Node24 migration explanation](https://aws.amazon.com/blogs/compute/node-js-24-runtime-now-available-in-aws-lambda/)
|
|
172
|
+
is the runtime authority; ordinary local Node process behavior is not deployed
|
|
173
|
+
Lambda evidence.
|
|
174
|
+
|
|
175
|
+
For an **unwrapped async** scheduled, queue or Cognito handler, initialize Sentry
|
|
176
|
+
once at module startup with the DSN from the environment. Await a finite positive
|
|
177
|
+
flush budget on both success and original-error paths. A false flush result or
|
|
178
|
+
rejection must not turn successful queue work into a retry or replace its real
|
|
179
|
+
error. Keep diagnostics local and non-throwing, and preserve the client for warm
|
|
180
|
+
invocations: `close()` disables it. The following helper wraps the host's existing
|
|
181
|
+
business operation; it neither mutates context nor adds a Lambda callback.
|
|
182
|
+
|
|
183
|
+
<!-- lisa-node24-unwrapped-example:start -->
|
|
184
|
+
```ts
|
|
185
|
+
import * as Sentry from "@sentry/node";
|
|
186
|
+
|
|
187
|
+
// Initialize early, once outside the handler, with DSN from the environment.
|
|
188
|
+
function reportFlushProblem(message: string): void {
|
|
189
|
+
try {
|
|
190
|
+
console.warn(message);
|
|
191
|
+
} catch {
|
|
192
|
+
// Telemetry diagnostics must preserve the business outcome too.
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export async function withSentryFlush<T>(
|
|
197
|
+
work: () => Promise<T>,
|
|
198
|
+
timeoutMs = 2000
|
|
199
|
+
): Promise<T> {
|
|
200
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
201
|
+
throw new RangeError("Choose a finite positive Sentry flush budget");
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
return await work();
|
|
205
|
+
} catch (originalError) {
|
|
206
|
+
try {
|
|
207
|
+
Sentry.captureException(originalError);
|
|
208
|
+
} catch {
|
|
209
|
+
// Preserve the original handler error even if capture fails.
|
|
210
|
+
}
|
|
211
|
+
throw originalError;
|
|
212
|
+
} finally {
|
|
213
|
+
try {
|
|
214
|
+
if (!(await Sentry.flush(timeoutMs))) {
|
|
215
|
+
reportFlushProblem("Sentry flush did not finish in time");
|
|
216
|
+
}
|
|
217
|
+
} catch {
|
|
218
|
+
reportFlushProblem("Sentry flush rejected");
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
<!-- lisa-node24-unwrapped-example:end -->
|
|
224
|
+
|
|
225
|
+
In the existing async handler, return
|
|
226
|
+
`withSentryFlush(() => performBusinessWork(event, context))`; use the host's
|
|
227
|
+
actual business operation and preserve its return/error contract. Select a
|
|
228
|
+
positive budget that fits remaining invocation time with a safety margin.
|
|
229
|
+
Do not omit the timeout or use zero as a finite cap. The SDK's timeout argument
|
|
230
|
+
does not cancel every custom transport or guarantee completion before Lambda's
|
|
231
|
+
hard timeout, and a drained local queue does not prove tenant ingestion.
|
|
232
|
+
[Sentry API semantics](https://docs.sentry.io/platforms/javascript/guides/aws-lambda/configuration/apis.md)
|
|
233
|
+
describe `flush()` and `close()`.
|
|
234
|
+
|
|
235
|
+
For a **compatible `Sentry.wrapHandler`**, its documented default flush is up
|
|
236
|
+
to2000ms, configurable through `flushTimeout`; avoid a redundant manual flush
|
|
237
|
+
when that wrapper already handles completion. Check the installed version's
|
|
238
|
+
context behavior, too: `@sentry/aws-serverless`11.6.0 unconditionally assigns
|
|
239
|
+
`context.callbackWaitsForEmptyEventLoop` before invoking the business handler.
|
|
240
|
+
It throws on a non-extensible context lacking that removed property. Changing
|
|
241
|
+
the option does not remove the assignment. Use the unwrapped form when this
|
|
242
|
+
incompatibility applies; do not clone/unfreeze context or pre-add an obsolete
|
|
243
|
+
property to claim compatibility. See the [wrapper documentation](https://docs.sentry.io/platforms/javascript/guides/aws-lambda/configuration/lambda-wrapper.md)
|
|
244
|
+
and [versioned implementation](https://github.com/getsentry/sentry-javascript/blob/11.6.0/packages/aws-serverless/src/sdk.ts).
|
|
245
|
+
|
|
246
|
+
Treat Node types and optional native profiling as migration checks. Examples
|
|
247
|
+
using `Array.at` need an ES2022-or-later TypeScript `lib`; keep a host's business
|
|
248
|
+
compiler target deliberate. Confirm optional profiling prebuilds against the
|
|
249
|
+
actual Node ABI (Node24 uses137) only when profiling is in use; do not install an
|
|
250
|
+
unused profiling package. Verify the helper with the real installed SDK and
|
|
251
|
+
local transport, including success/error, timeout/false, rejected flush and a
|
|
252
|
+
second warm invocation. Label local observations honestly; actual Lambda
|
|
253
|
+
deployment and Sentry event ingestion require their own provider proof.
|
|
254
|
+
|
|
151
255
|
**NestJS** — import `./instrument` first in `main.ts`, then add Sentry's module:
|
|
152
256
|
|
|
153
257
|
```ts
|
|
@@ -63,7 +63,9 @@ import {
|
|
|
63
63
|
export function locate(name, exec = boundedChildOutput) {
|
|
64
64
|
try {
|
|
65
65
|
return String(
|
|
66
|
-
exec("
|
|
66
|
+
exec("sh", ["-c", 'command -v -- "$1"', "lisa-locate", name], {
|
|
67
|
+
encoding: "utf8",
|
|
68
|
+
})
|
|
67
69
|
).trim();
|
|
68
70
|
} catch {
|
|
69
71
|
// probe-direction: fail-closed — null means "not proven present", and the
|