summaryrefslogtreecommitdiffhomepage
path: root/packages/shared/src
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2026-04-16 12:19:43 -0400
committerDax Raad <[email protected]>2026-04-16 12:40:24 -0400
commitbfffc3c2c6349d9199dd1a73260612b5ec2da88d (patch)
treedf80283461023b70f22597fbfe1cc4898d5031a0 /packages/shared/src
parentb28956f0dbc22d786fab24b2a34fd07fba6d27ec (diff)
downloadopencode-bfffc3c2c6349d9199dd1a73260612b5ec2da88d.tar.gz
opencode-bfffc3c2c6349d9199dd1a73260612b5ec2da88d.zip
tui: ensure TUI plugins load with proper project context when multiple directories are open
Fixes potential plugin resolution issues when switching between projects by wrapping plugin loading in Instance.provide(). This ensures each plugin resolves dependencies relative to its correct project directory instead of inheriting context from whatever instance happened to be active. Also reorganizes config loading code into focused modules (command.ts, managed.ts, plugin.ts) to make the codebase easier to maintain and test.
Diffstat (limited to 'packages/shared/src')
-rw-r--r--packages/shared/src/npm.ts47
1 files changed, 25 insertions, 22 deletions
diff --git a/packages/shared/src/npm.ts b/packages/shared/src/npm.ts
index 955cafa19..e4f42227d 100644
--- a/packages/shared/src/npm.ts
+++ b/packages/shared/src/npm.ts
@@ -142,7 +142,7 @@ export namespace Npm {
yield* flock.acquire(`npm-install:${dir}`)
- const reify = Effect.fnUntraced(function* () {
+ const reify = Effect.fn("Npm.reify")(function* () {
const { Arborist } = yield* Effect.promise(() => import("@npmcli/arborist"))
const arb = new Arborist({
path: dir,
@@ -176,28 +176,31 @@ export namespace Npm {
const pkgAny = pkg as any
const lockAny = lock as any
- const declared = new Set([
- ...Object.keys(pkgAny?.dependencies || {}),
- ...Object.keys(pkgAny?.devDependencies || {}),
- ...Object.keys(pkgAny?.peerDependencies || {}),
- ...Object.keys(pkgAny?.optionalDependencies || {}),
- ...(input?.add || []),
- ])
-
- const root = lockAny?.packages?.[""] || {}
- const locked = new Set([
- ...Object.keys(root?.dependencies || {}),
- ...Object.keys(root?.devDependencies || {}),
- ...Object.keys(root?.peerDependencies || {}),
- ...Object.keys(root?.optionalDependencies || {}),
- ])
-
- for (const name of declared) {
- if (!locked.has(name)) {
- yield* reify()
- return
+ yield* Effect.gen(function* () {
+ const declared = new Set([
+ ...Object.keys(pkgAny?.dependencies || {}),
+ ...Object.keys(pkgAny?.devDependencies || {}),
+ ...Object.keys(pkgAny?.peerDependencies || {}),
+ ...Object.keys(pkgAny?.optionalDependencies || {}),
+ ...(input?.add || []),
+ ])
+
+ const root = lockAny?.packages?.[""] || {}
+ const locked = new Set([
+ ...Object.keys(root?.dependencies || {}),
+ ...Object.keys(root?.devDependencies || {}),
+ ...Object.keys(root?.peerDependencies || {}),
+ ...Object.keys(root?.optionalDependencies || {}),
+ ])
+
+ for (const name of declared) {
+ if (!locked.has(name)) {
+ yield* reify()
+ return
+ }
}
- }
+ }).pipe(Effect.withSpan("Npm.checkDirty"))
+ return
}, Effect.scoped)
const which = Effect.fn("Npm.which")(function* (pkg: string) {