Skip to content

fix(deps): raise audit floors and isolate hook-run tests from git - #403

Open
elkaix wants to merge 5 commits into
mainfrom
fix/deps-audit-2026-11-09
Open

elkaix wants to merge 5 commits into
mainfrom
fix/deps-audit-2026-11-09

Conversation

@elkaix

@elkaix elkaix commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

Requirement or Bug

Security audit fails on main and every open PR: new advisories were published on 2026-11-09 (dompurify critical; undici, zod, electron, vue-i18n/@intlify, body-parser, follow-redirects, systeminformation, @azure/msal-node high; others moderate/low).

Bug Reproduction Steps

pnpm audit on main reports the advisories above.

Root Cause

New upstream advisories against locked versions. Separately, the pre-push hook ran the test suite with GIT_DIR/GIT_INDEX_FILE exported, and tests that spawn git in temp dirs (tower, nix-hash) wrote commits and config into the real repository. Fundamental fix for both.

Code Changes

  • Root pnpm.overrides: raise floors, each capped to its current major line (dompurify, undici, vue-i18n, @intlify/*, systeminformation, @azure/msal-node, body-parser, follow-redirects, fastify, fast-uri 3 and 4, serialize-javascript, qs, ip-address, vitest/@vitest/mocker ~4.1.12, @hono/node-server ^2.1.3).
  • Forced majors where no fixed release exists on the old line: glob@>=9 <14.0.2 to ^14.0.2, minimatch@>=7 <11.0.1 to ^11.0.1 (build and dev tooling only), and zod@3 to ^4.6.6 for jimp (smoke-tested: blit, resize, crop, PNG encode).
  • electron 43.5.0 to 43.8.7 (desktop); zod catalog 4.4.3 to 4.6.7.
  • auditConfig.ignoreGhsas gains GHSA-gcqx-w48m-w2h4 (deepmerge, no patched release; reached only via shadcn in the VS Code app).
  • Root vitest.config.ts deletes the repo-locating GIT_* variables before workers fork, so hook-run tests cannot touch the real repository. Proved both ways with GIT_DIR pointed at a scratch repo: without the guard the scratch repo gets a moved HEAD and user.name = Tower Test; with it, nothing changes.
  • Manifest generators read zod 4.6's array-form type: ["string","null"]; without this the manifests would degrade to any. Regenerated manifests are byte-identical to the committed ones.
  • flake.nix pnpmDeps hash refreshed; web bundle rebuilt (lockfile is a bundle input).

Behavior Changes and Affected Users

Behavior Before After Who relies on the old behavior Escape hatch
Runtime dependency versions Vulnerable patch levels Patched levels within the same major, except @hono/node-server 2.x (MCP SDK HTTP transport) Nobody n/a
Tests run from git hooks Inherited GIT_DIR and could write into the repo Isolated Nobody n/a

No user-facing behavior change; no changeset. [skip changeset]

Coverage: pnpm audit 0 (one ignored low with no fix); typecheck, lint, sherif, vscode typecheck, nix build .#pythinker-code all exit 0; full suite 18,619 passed, 3 failed: the stale wire manifest (fixed in this PR) and two known load-only timeouts that pass in isolation (148/148).

Checklist

  • I have read the CONTRIBUTING document.
  • I have linked a related issue (external PRs: issue must have a maintainer's /approve).
  • I have added tests that prove my feature works.
  • The behavior-change table above is complete, and every removed behavior or flipped default is named in the changeset and either has an escape hatch or was explicitly approved by a maintainer in this PR.
  • Ran gen-changesets skill, or this PR needs no changeset.
  • Ran gen-docs skill, or this PR needs no doc update.

@coderabbitai

coderabbitai Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 173 files, which is 73 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Check out review usage here.

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 21e9d44 and ca988e8.

Files ignored due to path filters: 3

  • apps/pythinker-code/dist-web/assets/index-D2T2qIL4.js is excluded by !**/assets/index-[0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-].js
  • apps/pythinker-code/dist-web/assets/index-Ud6NtwuQ.js is excluded by !**/assets/index-[0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-][0-9a-z_-].js
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml, !**/pnpm-lock.yaml
Files selected for processing: 173

  • .coderabbit.yaml
  • apps/desktop/package.json
  • apps/pythinker-code/dist-web/.web-bundle-manifest.json
  • apps/pythinker-code/dist-web/assets/CodeBlockNode-Co5i49j9.js
  • apps/pythinker-code/dist-web/assets/DesignSystemView-BWkuEQxk.js
  • apps/pythinker-code/dist-web/assets/Tooltip-dp3u7EXl.js
  • apps/pythinker-code/dist-web/assets/abnfDiagram-VCTEODGH-CYPfvcau.js
  • apps/pythinker-code/dist-web/assets/abnfDiagram-VCTEODGH-CyvhvqBm.js
  • apps/pythinker-code/dist-web/assets/architectureDiagram-5GKGNRK7-ByhOqyRW.js
  • apps/pythinker-code/dist-web/assets/architectureDiagram-5GKGNRK7-Dd5rSJdW.js
  • apps/pythinker-code/dist-web/assets/blockDiagram-I7D4REHJ-B4PjLmTs.js
  • apps/pythinker-code/dist-web/assets/blockDiagram-I7D4REHJ-BWxKfOYv.js
  • apps/pythinker-code/dist-web/assets/c4Diagram-7LVT6UL2-CRwC9_1F.js
  • apps/pythinker-code/dist-web/assets/c4Diagram-7LVT6UL2-wqcCqBPC.js
  • apps/pythinker-code/dist-web/assets/channel-BJXpDwDe.js
  • apps/pythinker-code/dist-web/assets/channel-C2_hsdVy.js
  • apps/pythinker-code/dist-web/assets/channel-D-wIZ5c8.js
  • apps/pythinker-code/dist-web/assets/channel-eoGJUmIG.js
  • apps/pythinker-code/dist-web/assets/chunk-2E4U76K2-BVuDik5n.js
  • apps/pythinker-code/dist-web/assets/chunk-4HAMMTFA-BmjTEVek.js
  • apps/pythinker-code/dist-web/assets/chunk-4HAMMTFA-CnJK9h0o.js
  • apps/pythinker-code/dist-web/assets/chunk-75Z2AOVW-EXiuaSRt.js
  • apps/pythinker-code/dist-web/assets/chunk-75Z2AOVW-aPUhPqhM.js
  • apps/pythinker-code/dist-web/assets/chunk-CLGD4ZFX-B-3J8ddY.js
  • apps/pythinker-code/dist-web/assets/chunk-DU6HZSFF-Bg4S0O-l.js
  • apps/pythinker-code/dist-web/assets/chunk-DU6HZSFF-CQluFUCe.js
  • apps/pythinker-code/dist-web/assets/chunk-DU6HZSFF-Ctgd9nuP.js
  • apps/pythinker-code/dist-web/assets/chunk-F27PBJKO-B9DlvfDf.js
  • apps/pythinker-code/dist-web/assets/chunk-F27PBJKO-BU3HB8iQ.js
  • apps/pythinker-code/dist-web/assets/chunk-GMAD6QVW-C7VSHxXE.js
  • apps/pythinker-code/dist-web/assets/chunk-GMAD6QVW-CIZViqnr.js
  • apps/pythinker-code/dist-web/assets/chunk-GVQU2GXP-BYEd-JWy.js
  • apps/pythinker-code/dist-web/assets/chunk-GVQU2GXP-MKU0K5SZ.js
  • apps/pythinker-code/dist-web/assets/chunk-IMKFNOWR-BJTNBKri.js
  • apps/pythinker-code/dist-web/assets/chunk-IMKFNOWR-CiZQw9CN.js
  • apps/pythinker-code/dist-web/assets/chunk-L3NEJ4N5-BJxLS1H8.js
  • apps/pythinker-code/dist-web/assets/chunk-OSK3NFVY-Cd1TV_Ey.js
  • apps/pythinker-code/dist-web/assets/chunk-P2QGCYS3-BnPyLdlO.js
  • apps/pythinker-code/dist-web/assets/chunk-P2QGCYS3-Dcn0ge8f.js
  • apps/pythinker-code/dist-web/assets/chunk-POPQ4Y6H-BuSG6Omw.js
  • apps/pythinker-code/dist-web/assets/chunk-POPQ4Y6H-Df1EoPiZ.js
  • apps/pythinker-code/dist-web/assets/chunk-PWAF6VOD-C6kk9UiE.js
  • apps/pythinker-code/dist-web/assets/chunk-PWAF6VOD-D1LlNygI.js
  • apps/pythinker-code/dist-web/assets/chunk-SHT3W25Y-CXOuMqCl.js
  • apps/pythinker-code/dist-web/assets/chunk-SHT3W25Y-vqOKDiXw.js
  • apps/pythinker-code/dist-web/assets/chunk-SVP7TREG-BETxyAqw.js
  • apps/pythinker-code/dist-web/assets/chunk-SVP7TREG-C-YZRsBW.js
  • apps/pythinker-code/dist-web/assets/chunk-TICWLB2K-CQOJpdVQ.js
  • apps/pythinker-code/dist-web/assets/chunk-TICWLB2K-ZWLRlz5v.js
  • apps/pythinker-code/dist-web/assets/chunk-TLUHSLCS-rPYd0m32.js
  • apps/pythinker-code/dist-web/assets/classDiagram-ZZMXUADV-CIluyY6x.js
  • apps/pythinker-code/dist-web/assets/classDiagram-ZZMXUADV-DWf-n-Lo.js
  • apps/pythinker-code/dist-web/assets/classDiagram-ZZMXUADV-XUlixY1w.js
  • apps/pythinker-code/dist-web/assets/classDiagram-ZZMXUADV-lpXjUISh.js
  • apps/pythinker-code/dist-web/assets/classDiagram-v2-VYDZK3BY-CIluyY6x.js
  • apps/pythinker-code/dist-web/assets/classDiagram-v2-VYDZK3BY-DWf-n-Lo.js
  • apps/pythinker-code/dist-web/assets/classDiagram-v2-VYDZK3BY-XUlixY1w.js
  • apps/pythinker-code/dist-web/assets/classDiagram-v2-VYDZK3BY-lpXjUISh.js
  • apps/pythinker-code/dist-web/assets/cssMode-D4yWi18p.js
  • apps/pythinker-code/dist-web/assets/cynefinDiagram-5FMLGOSQ-BTME46Df.js
  • apps/pythinker-code/dist-web/assets/cynefinDiagram-5FMLGOSQ-Bpx_SqsC.js
  • apps/pythinker-code/dist-web/assets/dagre-DCGYhTpf.js
  • apps/pythinker-code/dist-web/assets/dagre-GXQ25YYZ-DWSi8vdH.js
  • apps/pythinker-code/dist-web/assets/dagre-GXQ25YYZ-x5uDisGN.js
  • apps/pythinker-code/dist-web/assets/diagram-S7CK7UJ4-3bU7ondJ.js
  • apps/pythinker-code/dist-web/assets/diagram-S7CK7UJ4-BJyEJVt8.js
  • apps/pythinker-code/dist-web/assets/diagram-UQ7AKVKN-DWMcMSWq.js
  • apps/pythinker-code/dist-web/assets/diagram-UQ7AKVKN-DoqRCDb0.js
  • apps/pythinker-code/dist-web/assets/diagram-VSXAHHWV-5xNuBrHa.js
  • apps/pythinker-code/dist-web/assets/diagram-VSXAHHWV-H_xWZjHw.js
  • apps/pythinker-code/dist-web/assets/diagram-VX7I27RA-CJwugQLo.js
  • apps/pythinker-code/dist-web/assets/diagram-VX7I27RA-Dq4ZJT7s.js
  • apps/pythinker-code/dist-web/assets/diagram-Z3DM3KII-CTFTZwt1.js
  • apps/pythinker-code/dist-web/assets/diagram-Z3DM3KII-DCo3AfEI.js
  • apps/pythinker-code/dist-web/assets/ebnfDiagram-PWID7BFC-Bw46YI9u.js
  • apps/pythinker-code/dist-web/assets/ebnfDiagram-PWID7BFC-P0EfioLP.js
  • apps/pythinker-code/dist-web/assets/editor.api2-CyNv-7XP.js
  • apps/pythinker-code/dist-web/assets/editor.main-Cedn7eNd.js
  • apps/pythinker-code/dist-web/assets/erDiagram-RLTQ6QDP-CBd8myNE.js
  • apps/pythinker-code/dist-web/assets/erDiagram-RLTQ6QDP-TLWKdmDd.js
  • apps/pythinker-code/dist-web/assets/flowDiagram-HODETNUW-BxiEqzv-.js
  • apps/pythinker-code/dist-web/assets/flowDiagram-HODETNUW-CcGH0iUu.js
  • apps/pythinker-code/dist-web/assets/flowDiagram-HODETNUW-DMKIW_Ji.js
  • apps/pythinker-code/dist-web/assets/flowDiagram-HODETNUW-DkFwUHEm.js
  • apps/pythinker-code/dist-web/assets/freemarker2-mFVVgg6K.js
  • apps/pythinker-code/dist-web/assets/ganttDiagram-EL5Y4UJY-C9sMQ_aQ.js
  • apps/pythinker-code/dist-web/assets/ganttDiagram-EL5Y4UJY-YNJ0YGYI.js
  • apps/pythinker-code/dist-web/assets/gitGraphDiagram-WWUBYQGX-CEwktCFu.js
  • apps/pythinker-code/dist-web/assets/gitGraphDiagram-WWUBYQGX-Na-MOF-T.js
  • apps/pythinker-code/dist-web/assets/handlebars-CZ5-19C3.js
  • apps/pythinker-code/dist-web/assets/html-h99EheP_.js
  • apps/pythinker-code/dist-web/assets/htmlMode-DhLbScad.js
  • apps/pythinker-code/dist-web/assets/index10-PXe8e4eX.js
  • apps/pythinker-code/dist-web/assets/index11-DZ_xPLDZ.js
  • apps/pythinker-code/dist-web/assets/index3-CAz6iROe.js
  • apps/pythinker-code/dist-web/assets/index3-CB2yWI7V.js
  • apps/pythinker-code/dist-web/assets/index4-Ccfc1fAl.js
  • apps/pythinker-code/dist-web/assets/index4-a1ugmBbs.js
  • apps/pythinker-code/dist-web/assets/index5-BgHYCtAO.js
  • apps/pythinker-code/dist-web/assets/index6-Dvu2ZzLw.js
  • apps/pythinker-code/dist-web/assets/index7-CAoFr9q9.js
  • apps/pythinker-code/dist-web/assets/index8-BchRHUA8.js
  • apps/pythinker-code/dist-web/assets/index9-CVD1IebG.js
  • apps/pythinker-code/dist-web/assets/infoDiagram-27XIBGKW-BK9c_wC2.js
  • apps/pythinker-code/dist-web/assets/infoDiagram-27XIBGKW-CbqAYQZO.js
  • apps/pythinker-code/dist-web/assets/ishikawaDiagram-5VMMS53U-BLtjIBiI.js
  • apps/pythinker-code/dist-web/assets/ishikawaDiagram-5VMMS53U-CXTVOatS.js
  • apps/pythinker-code/dist-web/assets/javascript-CGeygOK9.js
  • apps/pythinker-code/dist-web/assets/journeyDiagram-3NMN7TZE-CaaPnShc.js
  • apps/pythinker-code/dist-web/assets/journeyDiagram-3NMN7TZE-iYa_ijZ4.js
  • apps/pythinker-code/dist-web/assets/jsonMode-D5VnYMaA.js
  • apps/pythinker-code/dist-web/assets/kanban-definition-UXKFOSKX-CLiBje7V.js
  • apps/pythinker-code/dist-web/assets/kanban-definition-UXKFOSKX-Di8a1LN6.js
  • apps/pythinker-code/dist-web/assets/line-CY2PuMPZ.js
  • apps/pythinker-code/dist-web/assets/line-DXUO3K1p.js
  • apps/pythinker-code/dist-web/assets/liquid-Cqa3Pqcw.js
  • apps/pythinker-code/dist-web/assets/lspLanguageFeatures-CAZW9hgO.js
  • apps/pythinker-code/dist-web/assets/mdx-BOVk0N48.js
  • apps/pythinker-code/dist-web/assets/mermaid.core-ByU2fgaT.js
  • apps/pythinker-code/dist-web/assets/mermaidParser.worker-B20-SnBp.js
  • apps/pythinker-code/dist-web/assets/mindmap-definition-YA3MSWOX-CE4J4xlK.js
  • apps/pythinker-code/dist-web/assets/mindmap-definition-YA3MSWOX-p4UXt80W.js
  • apps/pythinker-code/dist-web/assets/monaco.contribution-SGGBFzzv.js
  • apps/pythinker-code/dist-web/assets/pegDiagram-XKGWAZYB-DxRk8XEF.js
  • apps/pythinker-code/dist-web/assets/pegDiagram-XKGWAZYB-Dzwn1lYT.js
  • apps/pythinker-code/dist-web/assets/pieDiagram-E7YTZNPT-Bs7jrRnt.js
  • apps/pythinker-code/dist-web/assets/pieDiagram-E7YTZNPT-Pw0MthbS.js
  • apps/pythinker-code/dist-web/assets/purify.es-B0g7npkC.js
  • apps/pythinker-code/dist-web/assets/purify.es-DaBa283-.js
  • apps/pythinker-code/dist-web/assets/python-BWKd7h3d.js
  • apps/pythinker-code/dist-web/assets/quadrantDiagram-AXDQQJYC-BnQgkmKP.js
  • apps/pythinker-code/dist-web/assets/quadrantDiagram-AXDQQJYC-CxcWou4D.js
  • apps/pythinker-code/dist-web/assets/railroadDiagram-O6MQD6OU-CF3AqC_t.js
  • apps/pythinker-code/dist-web/assets/railroadDiagram-O6MQD6OU-C_CjT8cC.js
  • apps/pythinker-code/dist-web/assets/razor-BF0ODKzw.js
  • apps/pythinker-code/dist-web/assets/requirementDiagram-BXWQKSXE-CtC0yEr9.js
  • apps/pythinker-code/dist-web/assets/requirementDiagram-BXWQKSXE-Djs0TODG.js
  • apps/pythinker-code/dist-web/assets/sankeyDiagram-P5KCCOFB-C4jUCYNO.js
  • apps/pythinker-code/dist-web/assets/sankeyDiagram-P5KCCOFB-DrPpppsM.js
  • apps/pythinker-code/dist-web/assets/sequenceDiagram-WJ2MYXX4-CZP_ZfbA.js
  • apps/pythinker-code/dist-web/assets/sequenceDiagram-WJ2MYXX4-m8jBsdvl.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-D77RDMKH-B7RfL1sy.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-D77RDMKH-BvDEGHE7.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-v2-MP3YSRHH-5C6UQfao.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-v2-MP3YSRHH-9OwRjTs6.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-v2-MP3YSRHH-Cog7182z.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-v2-MP3YSRHH-Dbnn7PgT.js
  • apps/pythinker-code/dist-web/assets/swimlanes-42K2YHIH-CI6sKvjO.js
  • apps/pythinker-code/dist-web/assets/swimlanes-42K2YHIH-SX6d6dqW.js
  • apps/pythinker-code/dist-web/assets/swimlanesDiagram-VR7AAH4N-B-P7N0xY.js
  • apps/pythinker-code/dist-web/assets/swimlanesDiagram-VR7AAH4N-BAz9o-B8.js
  • apps/pythinker-code/dist-web/assets/swimlanesDiagram-VR7AAH4N-BvfqySnz.js
  • apps/pythinker-code/dist-web/assets/swimlanesDiagram-VR7AAH4N-CWf4g8kx.js
  • apps/pythinker-code/dist-web/assets/timeline-definition-24CTP7MA-6vS6AeCo.js
  • apps/pythinker-code/dist-web/assets/timeline-definition-24CTP7MA-UmDQXtaF.js
  • apps/pythinker-code/dist-web/assets/tsMode-CwSid_vG.js
  • apps/pythinker-code/dist-web/assets/typescript-D3gtHzcY.js
  • apps/pythinker-code/dist-web/assets/vennDiagram-4TSXK5OY-B62LR6IF.js
  • apps/pythinker-code/dist-web/assets/vennDiagram-4TSXK5OY-CpYBbCTH.js
  • apps/pythinker-code/dist-web/assets/wardleyDiagram-VM6X3IG4-DepMqHt-.js
  • apps/pythinker-code/dist-web/assets/wardleyDiagram-VM6X3IG4-Dp2LNYVS.js
  • apps/pythinker-code/dist-web/assets/workers-fy5mK1Te.js
  • apps/pythinker-code/dist-web/assets/xml-DjVXDXKT.js
  • apps/pythinker-code/dist-web/assets/xychartDiagram-S5SC5T6Z-BkopjroO.js
  • apps/pythinker-code/dist-web/assets/xychartDiagram-S5SC5T6Z-rk3-IhdN.js
  • apps/pythinker-code/dist-web/assets/yaml-DcDDO_xW.js
  • apps/pythinker-code/dist-web/index.html
  • flake.nix
  • package.json
  • packages/agent-core-v2/scripts/lib/jsonSchema.mts
  • pnpm-workspace.yaml
  • scripts/security/check-artifacts.mjs
  • vitest.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Review on demand using usage pricing
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@pkg-pr-new

pkg-pr-new Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
pnpm dlx https://pkg.pr.new/@pymodel/pythinker-code@ca988e8
npx https://pkg.pr.new/@pymodel/pythinker-code@ca988e8

commit: ca988e8

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant