Skip to content

install: stop bun add -g from walking above the global install dir#30659

Open
robobun wants to merge 8 commits into
mainfrom
farm/2aa053de/fix-global-install-walkup
Open

install: stop bun add -g from walking above the global install dir#30659
robobun wants to merge 8 commits into
mainfrom
farm/2aa053de/fix-global-install-walkup

Conversation

@robobun

@robobun robobun commented May 14, 2026

Copy link
Copy Markdown
Collaborator

Repro

# put a stray npm v1 lockfile in $HOME (very common on Windows)
echo '{"name":"x","version":"1.0.0"}' > ~/package.json
echo '{"name":"x","version":"1.0.0","lockfileVersion":1}' > ~/package-lock.json

bun add -g chalk
# error: Please upgrade package-lock.json to lockfileVersion 2 or 3
# Run 'npm i --lockfile-version 3 --frozen-lockfile' to upgrade your lockfile...

Cause

PackageManager.init chdirs to <BUN_INSTALL>/install/global for global installs and then walks up the filesystem looking for a package.json. If one is found in $HOME (or any ancestor), fs.top_level_dir gets pinned there, the process chdirs to that directory, and Lockfile.loadFromCwd ends up trying to migrate the stray package-lock.json next to it. npm v1 lockfiles fail migration with the user-facing error.

On Windows, <BUN_INSTALL> defaults to %USERPROFILE%\.bun, so the walk always passes through %USERPROFILE% — that's why the bug is so consistent on Windows.

The same walk-up is also why bun update -g / bun upgrade -g --latest fail with Workspace dependency "<name>" not found on setups where $HOME/package.json has a workspaces field (#28247): once the walk hops onto that parent, the global install inherits its workspace definitions and then can't resolve the workspace-scoped deps.

Fix

Global installs are self-contained. src/install/PackageManager.zig:

  • When cli.global is set and FileNotFound is returned for package.json in the current dir, break out of the walk-up loop instead of ascending into the parent. bun add <pkg> then falls through to the existing attemptToCreatePackageJSONAndOpen path that creates <global>/package.json on demand.
  • Skip the subsequent workspace-root hop entirely when cli.global is set — a parent directory package.json with workspaces shouldn't capture the global install either.

Verification

Added ````bun add -gignores package.json/package-lock.json above the global dir``` totest/cli/install/bun-add.test.ts`. It sets `BUN_INSTALL` to a sandbox dir containing stray `package.json` + npm v1 `package-lock.json` at the sandbox root, runs `bun add -g chalk --registry=http://127.0.0.1:1/`, and asserts stderr never contains the migration error. The test fails on current main and passes with this change.

Manually verified the workspace-root hop case locally: a $HOME/package.json with workspaces and a workspace:* dependency makes bun update -g / bun add -g / bun upgrade -g --latest fail on main with Workspace dependency "…" not found, and succeed after this change.

Fixes #30658.
Fixes #28247.

@robobun

robobun commented May 14, 2026

Copy link
Copy Markdown
Collaborator Author

@github-actions

Copy link
Copy Markdown
Contributor

Found 1 issue this PR may fix:

  1. bun upgrade -g --latest crashes with assertion failure #28247 - bun upgrade -g --latest crashes with "Workspace dependency not found" errors, caused by global install walking up directories and finding a parent package.json with workspace definitions — the workspace-root hop guard in this PR directly addresses this

If this is helpful, copy the block below into the PR description to auto-close this issue on merge.

Fixes #28247

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

PackageManager.init no longer climbs past the current directory for package.json or workspace/root discovery when performing global installs (cli.global). Two regression tests verify bun add -g ignores parent package.json/v1 package-lock.json and workspace workspace:* metadata.

Changes

Global Install Package Discovery Isolation

Layer / File(s) Summary
Global install package discovery logic
src/install/PackageManager.zig
PackageManager.init stops walking upward for package.json when cli.global is true, and the workspace/root upward-chdir step is gated with !cli.global so subcommand.shouldChdirToRoot() does not apply to global installs.
Regression tests for global install isolation
test/cli/install/bun-add.test.ts
Adds two integration tests: one ensuring bun add -g does not treat a parent stray package.json/npm v1 package-lock.json as the root for lockfile migration messaging or modification, and another ensuring bun add -g ignores parent workspaces/workspace:* entries and does not report workspace resolution failures.
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely describes the main change: preventing global installs from walking up the filesystem to parent directories.
Description check ✅ Passed The description comprehensively covers the issue, root cause, fix, and verification steps, exceeding the basic template requirements.
Linked Issues check ✅ Passed Changes directly address both linked issues: #30658 (preventing walkup to stray package.json/package-lock.json) and #28247 (preventing workspace inheritance from parent directories).
Out of Scope Changes check ✅ Passed All changes are scoped to the stated objectives: core logic changes in PackageManager.zig and regression tests in bun-add.test.ts address the global install walkup issues.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/cli/install/bun-add.test.ts`:
- Around line 2509-2513: The test currently awaits the spawned process via the
awaited variable exited but never asserts its exit code, letting a regression
slip by; after the existing stdout/stderr assertions add an explicit check that
the process exit code (from the promise/variable exited) is non-zero (e.g.,
assert/expect that exited.code or the resolved exit value is !== 0) so the test
fails if the process succeeds; keep the stdout/stderr checks first to preserve
useful failure messages and then assert non-zero exit using the exited result.
- Line 2475: The test creates a temp directory with tmpdirSync (const home =
tmpdirSync()) which bypasses the test harness cleanup; replace this by using the
test harness tempDir fixture instead (call tempDir(...) / await tempDir() per
harness API) and assign its returned path to the same variable (home), making
the test async if needed so you can await the fixture; this ensures automatic
cleanup/disposal and follows the coding guideline to avoid tmpdirSync or
fs.mkdtempSync.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: f47a7b01-eaf3-4524-a1a2-730acd2413ca

📥 Commits

Reviewing files that changed from the base of the PR and between b8ecc78 and 3121103.

📒 Files selected for processing (2)
  • src/install/PackageManager.zig
  • test/cli/install/bun-add.test.ts

Comment thread test/cli/install/bun-add.test.ts Outdated
Comment thread test/cli/install/bun-add.test.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
test/cli/install/bun-add.test.ts (1)

2475-2475: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Replace tmpdirSync() with the tempDir harness fixture.

Line 2475 is using tmpdirSync(), which bypasses the test harness cleanup contract in this repo.

Suggested patch
-import { bunExe, bunEnv as env, readdirSorted, tmpdirSync, toBeValidBin, toBeWorkspaceLink, toHaveBins } from "harness";
+import { bunExe, bunEnv as env, readdirSorted, tempDir, tmpdirSync, toBeValidBin, toBeWorkspaceLink, toHaveBins } from "harness";
@@
-  const home = tmpdirSync();
+  using home = tempDir("bun-add-global-parent-lockfile", {});

As per coding guidelines: Use tempDir from harness to create temporary directories; do not use tmpdirSync or fs.mkdtempSync.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/cli/install/bun-add.test.ts` at line 2475, The test is creating a
temporary directory with tmpdirSync() which bypasses the test harness cleanup;
replace the tmpdirSync() call with the harness-provided tempDir fixture and
assign its result to the same variable (home) so the test uses tempDir(...) (or
the harness's tempDir helper) instead of tmpdirSync(); this ensures the harness
manages cleanup and the rest of the test that references home continues to work
unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@test/cli/install/bun-add.test.ts`:
- Line 2475: The test is creating a temporary directory with tmpdirSync() which
bypasses the test harness cleanup; replace the tmpdirSync() call with the
harness-provided tempDir fixture and assign its result to the same variable
(home) so the test uses tempDir(...) (or the harness's tempDir helper) instead
of tmpdirSync(); this ensures the harness manages cleanup and the rest of the
test that references home continues to work unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: ce22ab13-8319-4c2d-8194-9354bfc220ec

📥 Commits

Reviewing files that changed from the base of the PR and between 3121103 and c272105.

📒 Files selected for processing (1)
  • test/cli/install/bun-add.test.ts

@robobun

robobun commented May 14, 2026

Copy link
Copy Markdown
Collaborator Author

Good catch — the workspace-root hop guard does fix #28247 too. Verified locally (parent package.json with workspaces + a workspace:* dep → bun update -g / bun add -g fail with Workspace dependency not found on main, succeed here). PR body + added test coverage for that case too.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (2)
test/cli/install/bun-add.test.ts (2)

2475-2475: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use tempDir(...) instead of tmpdirSync() for these new test homes.

These new tests bypass harness-managed disposal by using tmpdirSync(). Switch to using home = tempDir(name, {}) for automatic cleanup.

Suggested patch
-import { bunExe, bunEnv as env, readdirSorted, tmpdirSync, toBeValidBin, toBeWorkspaceLink, toHaveBins } from "harness";
+import { bunExe, bunEnv as env, readdirSorted, tempDir, tmpdirSync, toBeValidBin, toBeWorkspaceLink, toHaveBins } from "harness";
@@
-  const home = tmpdirSync();
+  using home = tempDir("bun-add-global-parent-lockfile", {});
@@
-  const home = tmpdirSync();
+  using home = tempDir("bun-add-global-parent-workspaces", {});

As per coding guidelines: Use tempDir from harness to create temporary directories; do not use tmpdirSync or fs.mkdtempSync. Based on learnings: TempDir must be invoked with two arguments in test harness code.

Also applies to: 2523-2523

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/cli/install/bun-add.test.ts` at line 2475, The test creates temporary
directories using tmpdirSync() (const home = tmpdirSync()) which bypasses
harness-managed cleanup; replace these with the harness helper by declaring a
managed temp dir using the tempDir helper (e.g., using home = tempDir(name, {}))
so the directory is auto-disposed by the test harness; update each occurrence
(including the one at the symbol 'home' in this file and the similar occurrence
around line ~2523) to call tempDir with two arguments (a name and an options
object) instead of tmpdirSync().

2506-2510: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Assert a non-zero exit code so these regressions can’t pass vacuously.

Both tests intentionally use an unreachable registry; assert that the process fails after the stderr checks.

Suggested patch
-  await exited;
+  expect(await exited).not.toBe(0);
@@
-  await exited;
+  expect(await exited).not.toBe(0);

As per coding guidelines: When spawning processes in tests, check stdout expectations before exit code expectations to provide more useful error messages on test failure.

Also applies to: 2550-2552

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/cli/install/bun-add.test.ts` around lines 2506 - 2510, The tests
currently await the child-process completion via the exited promise but don't
assert a non-zero exit code, so add an assertion that the exit code is non-zero
after the existing stderr/stdout expectations: after awaiting exited, check
exited.code (or the process result object you receive) !== 0. Ensure you keep
stdout/stderr checks before the exit-code assertion to follow the guideline;
apply the same change for the second occurrence referenced near the other test
(the other exited usage around the nearby block). Use the existing variable name
exited to locate where to add the assertion.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@test/cli/install/bun-add.test.ts`:
- Line 2475: The test creates temporary directories using tmpdirSync() (const
home = tmpdirSync()) which bypasses harness-managed cleanup; replace these with
the harness helper by declaring a managed temp dir using the tempDir helper
(e.g., using home = tempDir(name, {})) so the directory is auto-disposed by the
test harness; update each occurrence (including the one at the symbol 'home' in
this file and the similar occurrence around line ~2523) to call tempDir with two
arguments (a name and an options object) instead of tmpdirSync().
- Around line 2506-2510: The tests currently await the child-process completion
via the exited promise but don't assert a non-zero exit code, so add an
assertion that the exit code is non-zero after the existing stderr/stdout
expectations: after awaiting exited, check exited.code (or the process result
object you receive) !== 0. Ensure you keep stdout/stderr checks before the
exit-code assertion to follow the guideline; apply the same change for the
second occurrence referenced near the other test (the other exited usage around
the nearby block). Use the existing variable name exited to locate where to add
the assertion.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3e85ca97-45d2-48be-9a02-a829ea372555

📥 Commits

Reviewing files that changed from the base of the PR and between c272105 and 37babda.

📒 Files selected for processing (1)
  • test/cli/install/bun-add.test.ts

robobun added a commit that referenced this pull request May 14, 2026
Addresses coderabbit review feedback on PR #30659: tempDir gives us the
Symbol.dispose cleanup contract, and asserting exit != 0 keeps the test
from passing vacuously if the spawn fails to run at all.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/cli/install/bun-add.test.ts`:
- Around line 2553-2555: The negative stderr assertion
expect(err).not.toContain("failed to resolve") is too broad; update the test
assertions around expect(err).not.toContain("Workspace dependency") and
expect(err).not.toContain("workspace:*") to instead narrowly assert against
workspace-specific messaging (e.g., replace the generic
expect(err).not.toContain("failed to resolve") with a check such as
expect(err).not.toContain("failed to resolve workspace") or
expect(err).not.toMatch(/failed to resolve.*workspace/) so only
workspace-related "failed to resolve" text is disallowed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 27b44422-9bbe-49f2-8551-e0314d72c963

📥 Commits

Reviewing files that changed from the base of the PR and between b266c64 and 834cd02.

📒 Files selected for processing (1)
  • test/cli/install/bun-add.test.ts

Comment thread test/cli/install/bun-add.test.ts Outdated
@robobun

robobun commented May 14, 2026

Copy link
Copy Markdown
Collaborator Author

CI is green on everything I changed. The one red lane (windows-2019-x64-baseline-test-bun) failed on 1 of 8 shards, on a completely unrelated flaky test: test/js/bun/test/parallel/test-http-should-emit-close-when-connection-is-aborted.ts — an HTTP connection-abort test that timed out 4 times in a row. My diff touches src/install/PackageManager.zig (two if (cli.global) guards) and test/cli/install/bun-add.test.ts (new tests); neither is exercised by this lane.

Prior run hit a Zig ICE in std/array_hash_map.zig during the compile — also flake. That was my one allowed re-roll.

Needs a maintainer to merge.

Comment on lines +2531 to +2541
using home = tempDir("bun-add-global-parent-workspaces", {
// parent package.json declares workspaces + a workspace-protocol dep
// that doesn't actually exist on disk — same shape as the reports.
"package.json": JSON.stringify({
name: "stray-root",
version: "1.0.0",
workspaces: ["packages/*"],
dependencies: { "@scope/nonexistent": "workspace:*" },
}),
".bun": { install: { global: {} } },
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 nit: as written, this test would still pass if only the and !cli.global guard (PackageManager.zig:696) were reverted — <global>/package.json is not pre-created so the line-638 if (cli.global) break; handles the first pass, and on the retry pass workspaces: ["packages/*"] cannot match .bun/install/global so the hop never happens regardless. It is still a valid #28247 regression test (fails on main), so fine to leave as-is; but if you want it to independently pin the second guard, pre-create ".bun/install/global/package.json" in the fixture and use a glob that captures the global dir (e.g. [".bun/install/*"]).

Extended reasoning...

What this is

This is a test-coverage observation, not a correctness bug. The PR adds two Zig guards and two regression tests; the commit test: cover workspace-root hop case too (#28247) and the author's comment "added test coverage for that case too" suggest this second test is meant to pin the second guard (subcommand.shouldChdirToRoot() and !cli.global at PackageManager.zig:696). Tracing the fixture shows it does not isolate that guard — reverting only and !cli.global while keeping the line-638 if (cli.global) break; still lets this test pass.

Step-by-step trace (with only and !cli.global reverted)

  1. First init() (subcommand = .add, cli.global = true): chdirs to <home>/.bun/install/global, tries to open package.jsonFileNotFound. The fixture only creates ".bun": { install: { global: {} } } — an empty dir — so the first guard if (cli.global) break; fires. Since subcommand != .install, the function returns error.MissingPackageJSON.
  2. updatePackageJSONAndInstall.zig:528-530 catches it, calls attemptToCreatePackageJSON() (which writes package.json into the current cwd, i.e. the global dir, since init() already chdir'd there), then calls init() again.
  3. Second init(): opens the freshly-created <global>/package.json on the first iteration. created_package_json = false (it's a fresh init() call). The workspace-hop block now runs (since we reverted !cli.global). It walks up to <home>, opens <home>/package.json, finds workspaces: ["packages/*"].
  4. processNamesArray globs packages/* relative to <home>. The fixture creates no <home>/packages/ directory, so workspace_names is empty. The for (workspace_names.keys(), …) loop iterates zero times and falls through to break;. found stays false.
  5. fs.top_level_dir is set to child_cwd (the global dir). <home>/package.json is never used as the root, @scope/nonexistent never enters resolution, and the assertions expect(err).not.toContain("Workspace dependency") / not.toContain("@scope/nonexistent") pass.

Even if a <home>/packages/ dir existed, .bun/install/global would not match the packages/* glob, so the for-loop would still never set found = true.

Why this still has value as-is

To be clear — and addressing the counter-argument directly — this test does fail on main (where neither guard exists): on main the first walk-up loop ascends from the empty global dir to <home>/package.json, pins fs.top_level_dir there, loads its workspace:* dep, and emits Workspace dependency "@scope/nonexistent" not found. So it is a perfectly valid black-box regression test for #28247-as-reported, and the two tests do cover two distinct user-visible symptoms (lockfile-migration error vs. workspace-dep error) of the same walk-up bug. That is reasonable regression-test practice and I am not suggesting the test is wrong.

Why it's still worth mentioning

The PR makes two separate code changes and the second one (and !cli.global) currently has no test that would fail if it alone were removed. Given the commit message explicitly frames this test as covering "the workspace-root hop case", it seems worth flagging that the fixture as written never actually reaches a state where that guard is the deciding factor. If a future refactor accidentally drops !cli.global, this test will not catch it.

How to make it independently exercise the second guard (optional)

Two small fixture tweaks, both needed:

  • Pre-create the global package.json so the first init() succeeds without relying on the line-638 break + retry path:
    ".bun": { install: { global: { "package.json": JSON.stringify({ name: "g" }) } } },
  • Use a workspace glob that actually captures the global dir, e.g. workspaces: [".bun/install/*"] (or ["**"]), so that without !cli.global the for-loop matches child_cwd, sets found = true, hops to <home> as root, and surfaces @scope/nonexistent in stderr.

The second tweak is admittedly not a "realistic" workspace glob, which is why this is filed as a nit rather than a blocker — the !cli.global guard is largely defensive belt-and-suspenders on top of the first fix, and it's reasonable to decide that contrived white-box coverage isn't worth it. Either choice (tighten the fixture, or leave it and accept the second guard is covered only by code review) is fine.

robobun and others added 8 commits May 14, 2026 16:17
`bun add -g` chdirs to <BUN_INSTALL>/install/global then walks up looking
for a package.json. If one exists in a parent directory (typically $HOME
on Windows) with an old npm v1 package-lock.json next to it, bun treated
that as the root project and aborted with 'Please upgrade package-lock.json
to lockfileVersion 2 or 3'.

Global installs are self-contained. Stop the walk — and the workspace-root
hop that follows it — at the global install dir when `cli.global` is set.

Fixes #30658.
Addresses coderabbit review feedback on PR #30659: tempDir gives us the
Symbol.dispose cleanup contract, and asserting exit != 0 keeps the test
from passing vacuously if the spawn fails to run at all.
'failed to resolve' is generic enough that a registry/network error could
trip it; checking the workspace dep name is the strong signal that bun
touched the parent workspace at all.
windows-x64-baseline-build-zig hit a Zig ICE in std/array_hash_map.zig
(unrelated to this diff — the other *-build-zig lanes all compile fine).
@robobun robobun force-pushed the farm/2aa053de/fix-global-install-walkup branch from 0f4a180 to 11aece1 Compare May 14, 2026 16:21
@robobun

robobun commented May 14, 2026

Copy link
Copy Markdown
Collaborator Author

Rebased onto main (post-Rust-rewrite) and ported both hunks to src/install/PackageManager.rs::init:

  • ENOENT arm of the walk-up loop now breaks when cli.global is set
  • should_chdir_to_root() gated on && !cli.global

Gate verified: without the .rs change the test fails with Please upgrade package-lock.json to lockfileVersion 2 or 3; with it, the test passes. .zig kept as reference.

@robobun

robobun commented May 14, 2026

Copy link
Copy Markdown
Collaborator Author

New CI failure on build 54323 is also flake: linux-x64-asan-debian-13-test-bun shard fails on test/js/web/fetch/fetch-tcp-keepalive.test.ts (expected TCP keepalive timer "02", got "00" — Linux-kernel-state-reading test, recently added in #30627/#30640, race-prone under ASAN). My diff only touches PackageManager.{zig,rs} + install tests; nothing in the fetch/HTTP/socket path.

Still green on everything my diff touches. Needs a maintainer to merge.

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bun add -g throws errors about package-lock.json bun upgrade -g --latest crashes with assertion failure

1 participant