opencode2-direnv 2026.904.1 → 2026.907.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/dist/index.d.ts.map +1 -1
- package/dist/index.js +117 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +128 -2
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;;AAmL5C,wBAgSE"}
|
package/dist/index.js
CHANGED
|
@@ -20,12 +20,114 @@ import { promisify } from "node:util";
|
|
|
20
20
|
* *removes* dropped keys so removed variables don't linger
|
|
21
21
|
* - Logs outcomes with a `direnv:` prefix (blocked .envrc is always reported)
|
|
22
22
|
* - Silently skips if direnv is not installed or .envrc is missing
|
|
23
|
+
*
|
|
24
|
+
* Environment hygiene (self-healing):
|
|
25
|
+
*
|
|
26
|
+
* `nix print-dev-env` exports a `shellHook` variable whose value is the raw
|
|
27
|
+
* shell *script* of the devShell hook, typically ending with a line like
|
|
28
|
+
* `export PATH=/nix/store/…:$PATH`. OpenCode 2 parses that text naively and
|
|
29
|
+
* can end up with a bogus env entry literally named `export PATH`, and a PATH
|
|
30
|
+
* value containing a literal `$PATH` breaks every spawned subprocess (local
|
|
31
|
+
* MCP servers die with `MCP error -32000: Connection closed`). Once PATH is
|
|
32
|
+
* corrupted, `execFile("direnv")` fails with ENOENT, so without the repair
|
|
33
|
+
* below the devShell environment can never load again — a permanent breakage
|
|
34
|
+
* loop.
|
|
35
|
+
*
|
|
36
|
+
* Therefore, on every load: strip the poison, repair PATH before invoking
|
|
37
|
+
* direnv, resolve direnv by absolute path as a fallback, and never apply
|
|
38
|
+
* variables that are env-name-invalid or whose value is a shell script.
|
|
23
39
|
*/
|
|
24
40
|
const run = promisify(execFile);
|
|
25
41
|
/** devshell files whose modification should trigger a reload */
|
|
26
42
|
const RELEVANT_FILES = new Set([".envrc", "flake.nix", "flake.lock"]);
|
|
27
43
|
/** debounce window for background reloads (ms) */
|
|
28
44
|
const RELOAD_DEBOUNCE_MS = 1500;
|
|
45
|
+
/** variables whose values are shell scripts, not environment data */
|
|
46
|
+
const SCRIPT_VARS = new Set(["shellHook", "buildPhase", "phases", "prePhases", "postPhases"]);
|
|
47
|
+
/** known-broken env entries to remove from process.env */
|
|
48
|
+
const POISON_VARS = ["shellHook", ...SCRIPT_VARS, "export PATH"];
|
|
49
|
+
/** valid POSIX environment variable names */
|
|
50
|
+
const VALID_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
51
|
+
/** fallback PATHs used when repairing a corrupted PATH */
|
|
52
|
+
const sanePath = () => {
|
|
53
|
+
const parts = [];
|
|
54
|
+
if (process.env.HOST_PATH)
|
|
55
|
+
parts.push(process.env.HOST_PATH);
|
|
56
|
+
if (process.env.HOME)
|
|
57
|
+
parts.push(`${process.env.HOME}/.nix-profile/bin`);
|
|
58
|
+
if (process.env.USER)
|
|
59
|
+
parts.push(`/etc/profiles/per-user/${process.env.USER}/bin`);
|
|
60
|
+
parts.push("/nix/var/nix/profiles/default/bin", "/run/current-system/sw/bin", "/opt/homebrew/bin", "/usr/local/bin", "/usr/bin:/bin:/usr/sbin:/sbin");
|
|
61
|
+
return parts.join(":");
|
|
62
|
+
};
|
|
63
|
+
/** candidate locations for direnv, absolute paths first so that a PATH
|
|
64
|
+
* corruption after setup cannot break the cached resolution */
|
|
65
|
+
const direnvCandidates = () => [
|
|
66
|
+
`/etc/profiles/per-user/${process.env.USER ?? ""}/bin/direnv`,
|
|
67
|
+
`${process.env.HOME ?? ""}/.nix-profile/bin/direnv`,
|
|
68
|
+
"/run/current-system/sw/bin/direnv",
|
|
69
|
+
"/opt/homebrew/bin/direnv",
|
|
70
|
+
"/usr/local/bin/direnv",
|
|
71
|
+
]
|
|
72
|
+
.filter((candidate) => !candidate.includes("//"))
|
|
73
|
+
.concat("direnv");
|
|
74
|
+
/** Strip known poison from process.env; returns the removed keys. */
|
|
75
|
+
const stripPoison = () => {
|
|
76
|
+
const removed = [];
|
|
77
|
+
for (const key of POISON_VARS) {
|
|
78
|
+
if (key in process.env) {
|
|
79
|
+
delete process.env[key];
|
|
80
|
+
removed.push(key);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return removed;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Repair process.env.PATH if it is corrupted (contains a literal `$`),
|
|
87
|
+
* returning the usable PATH. A corrupted PATH otherwise makes direnv (and
|
|
88
|
+
* every other subprocess this plugin could help) unlaunchable.
|
|
89
|
+
*/
|
|
90
|
+
const repairPath = () => {
|
|
91
|
+
const current = process.env.PATH;
|
|
92
|
+
if (current && !current.includes("$"))
|
|
93
|
+
return current;
|
|
94
|
+
const fallback = sanePath();
|
|
95
|
+
process.env.PATH = fallback;
|
|
96
|
+
console.warn(`direnv: repaired corrupted PATH (was ${JSON.stringify(current)})`);
|
|
97
|
+
return fallback;
|
|
98
|
+
};
|
|
99
|
+
/** Resolve direnv once; prefers absolute locations, falls back to PATH. */
|
|
100
|
+
let direnvPath;
|
|
101
|
+
const findDirenv = async () => {
|
|
102
|
+
if (direnvPath !== undefined)
|
|
103
|
+
return direnvPath;
|
|
104
|
+
for (const candidate of direnvCandidates()) {
|
|
105
|
+
try {
|
|
106
|
+
await run(candidate, ["version"], { encoding: "utf8" });
|
|
107
|
+
direnvPath = candidate;
|
|
108
|
+
return direnvPath;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// try next candidate
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
direnvPath = null;
|
|
115
|
+
return direnvPath;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Strip poison and repair PATH. Runs before every direnv invocation so a
|
|
119
|
+
* daemon that gets corrupted mid-flight heals itself on the next reload.
|
|
120
|
+
* Returns true if anything was repaired.
|
|
121
|
+
*/
|
|
122
|
+
const sanitize = () => {
|
|
123
|
+
const stripped = stripPoison();
|
|
124
|
+
if (stripped.length > 0) {
|
|
125
|
+
console.warn(`direnv: stripped poison vars from process.env: ${stripped.join(", ")}`);
|
|
126
|
+
}
|
|
127
|
+
const before = process.env.PATH;
|
|
128
|
+
repairPath();
|
|
129
|
+
return stripped.length > 0 || process.env.PATH !== before;
|
|
130
|
+
};
|
|
29
131
|
const runText = async (file, args, cwd) => {
|
|
30
132
|
const { stdout } = await run(file, args, {
|
|
31
133
|
cwd,
|
|
@@ -101,7 +203,7 @@ export default Plugin.define({
|
|
|
101
203
|
if (envrcPath) {
|
|
102
204
|
envrcDir = dirname(envrcPath);
|
|
103
205
|
}
|
|
104
|
-
discovered =
|
|
206
|
+
discovered = envrcPath !== null;
|
|
105
207
|
return envrcDir;
|
|
106
208
|
};
|
|
107
209
|
const newOutcome = () => ({
|
|
@@ -125,14 +227,22 @@ export default Plugin.define({
|
|
|
125
227
|
return outcome;
|
|
126
228
|
reloading = true;
|
|
127
229
|
try {
|
|
230
|
+
// Self-heal before touching direnv: a corrupted PATH would make the
|
|
231
|
+
// direnv lookup below fail with ENOENT forever.
|
|
232
|
+
sanitize();
|
|
128
233
|
const dir = await resolveEnvrcDir();
|
|
129
234
|
if (!dir) {
|
|
130
235
|
outcome.unavailable = true;
|
|
131
236
|
return outcome;
|
|
132
237
|
}
|
|
238
|
+
const direnv = await findDirenv();
|
|
239
|
+
if (!direnv) {
|
|
240
|
+
outcome.unavailable = true;
|
|
241
|
+
return outcome;
|
|
242
|
+
}
|
|
133
243
|
let jsonText;
|
|
134
244
|
try {
|
|
135
|
-
jsonText = await runText(
|
|
245
|
+
jsonText = await runText(direnv, ["export", "json"], dir);
|
|
136
246
|
}
|
|
137
247
|
catch (error) {
|
|
138
248
|
const stderr = error && typeof error === "object" && "stderr" in error
|
|
@@ -158,10 +268,15 @@ export default Plugin.define({
|
|
|
158
268
|
}
|
|
159
269
|
}
|
|
160
270
|
// 2. Apply current vars, counting additions and value changes.
|
|
271
|
+
// Skip invalid names (e.g. a phantom `export PATH` entry) and
|
|
272
|
+
// script-valued vars (e.g. nix's `shellHook`) — they corrupt
|
|
273
|
+
// subprocess environments instead of configuring them.
|
|
161
274
|
const nextApplied = new Set();
|
|
162
275
|
for (const [key, value] of Object.entries(newVars)) {
|
|
163
276
|
if (value == null)
|
|
164
277
|
continue;
|
|
278
|
+
if (!VALID_NAME.test(key) || SCRIPT_VARS.has(key))
|
|
279
|
+
continue;
|
|
165
280
|
const current = process.env[key];
|
|
166
281
|
if (current === undefined)
|
|
167
282
|
outcome.added++;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -21,6 +21,22 @@ import { promisify } from "node:util"
|
|
|
21
21
|
* *removes* dropped keys so removed variables don't linger
|
|
22
22
|
* - Logs outcomes with a `direnv:` prefix (blocked .envrc is always reported)
|
|
23
23
|
* - Silently skips if direnv is not installed or .envrc is missing
|
|
24
|
+
*
|
|
25
|
+
* Environment hygiene (self-healing):
|
|
26
|
+
*
|
|
27
|
+
* `nix print-dev-env` exports a `shellHook` variable whose value is the raw
|
|
28
|
+
* shell *script* of the devShell hook, typically ending with a line like
|
|
29
|
+
* `export PATH=/nix/store/…:$PATH`. OpenCode 2 parses that text naively and
|
|
30
|
+
* can end up with a bogus env entry literally named `export PATH`, and a PATH
|
|
31
|
+
* value containing a literal `$PATH` breaks every spawned subprocess (local
|
|
32
|
+
* MCP servers die with `MCP error -32000: Connection closed`). Once PATH is
|
|
33
|
+
* corrupted, `execFile("direnv")` fails with ENOENT, so without the repair
|
|
34
|
+
* below the devShell environment can never load again — a permanent breakage
|
|
35
|
+
* loop.
|
|
36
|
+
*
|
|
37
|
+
* Therefore, on every load: strip the poison, repair PATH before invoking
|
|
38
|
+
* direnv, resolve direnv by absolute path as a fallback, and never apply
|
|
39
|
+
* variables that are env-name-invalid or whose value is a shell script.
|
|
24
40
|
*/
|
|
25
41
|
|
|
26
42
|
const run = promisify(execFile)
|
|
@@ -56,6 +72,102 @@ const RELEVANT_FILES = new Set([".envrc", "flake.nix", "flake.lock"])
|
|
|
56
72
|
/** debounce window for background reloads (ms) */
|
|
57
73
|
const RELOAD_DEBOUNCE_MS = 1500
|
|
58
74
|
|
|
75
|
+
/** variables whose values are shell scripts, not environment data */
|
|
76
|
+
const SCRIPT_VARS = new Set(["shellHook", "buildPhase", "phases", "prePhases", "postPhases"])
|
|
77
|
+
|
|
78
|
+
/** known-broken env entries to remove from process.env */
|
|
79
|
+
const POISON_VARS = ["shellHook", ...SCRIPT_VARS, "export PATH"]
|
|
80
|
+
|
|
81
|
+
/** valid POSIX environment variable names */
|
|
82
|
+
const VALID_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/
|
|
83
|
+
|
|
84
|
+
/** fallback PATHs used when repairing a corrupted PATH */
|
|
85
|
+
const sanePath = () => {
|
|
86
|
+
const parts: string[] = []
|
|
87
|
+
if (process.env.HOST_PATH) parts.push(process.env.HOST_PATH)
|
|
88
|
+
if (process.env.HOME) parts.push(`${process.env.HOME}/.nix-profile/bin`)
|
|
89
|
+
if (process.env.USER) parts.push(`/etc/profiles/per-user/${process.env.USER}/bin`)
|
|
90
|
+
parts.push(
|
|
91
|
+
"/nix/var/nix/profiles/default/bin",
|
|
92
|
+
"/run/current-system/sw/bin",
|
|
93
|
+
"/opt/homebrew/bin",
|
|
94
|
+
"/usr/local/bin",
|
|
95
|
+
"/usr/bin:/bin:/usr/sbin:/sbin",
|
|
96
|
+
)
|
|
97
|
+
return parts.join(":")
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** candidate locations for direnv, absolute paths first so that a PATH
|
|
101
|
+
* corruption after setup cannot break the cached resolution */
|
|
102
|
+
const direnvCandidates = () =>
|
|
103
|
+
[
|
|
104
|
+
`/etc/profiles/per-user/${process.env.USER ?? ""}/bin/direnv`,
|
|
105
|
+
`${process.env.HOME ?? ""}/.nix-profile/bin/direnv`,
|
|
106
|
+
"/run/current-system/sw/bin/direnv",
|
|
107
|
+
"/opt/homebrew/bin/direnv",
|
|
108
|
+
"/usr/local/bin/direnv",
|
|
109
|
+
]
|
|
110
|
+
.filter((candidate) => !candidate.includes("//"))
|
|
111
|
+
.concat("direnv")
|
|
112
|
+
|
|
113
|
+
/** Strip known poison from process.env; returns the removed keys. */
|
|
114
|
+
const stripPoison = (): string[] => {
|
|
115
|
+
const removed: string[] = []
|
|
116
|
+
for (const key of POISON_VARS) {
|
|
117
|
+
if (key in process.env) {
|
|
118
|
+
delete process.env[key]
|
|
119
|
+
removed.push(key)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return removed
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Repair process.env.PATH if it is corrupted (contains a literal `$`),
|
|
127
|
+
* returning the usable PATH. A corrupted PATH otherwise makes direnv (and
|
|
128
|
+
* every other subprocess this plugin could help) unlaunchable.
|
|
129
|
+
*/
|
|
130
|
+
const repairPath = (): string => {
|
|
131
|
+
const current = process.env.PATH
|
|
132
|
+
if (current && !current.includes("$")) return current
|
|
133
|
+
const fallback = sanePath()
|
|
134
|
+
process.env.PATH = fallback
|
|
135
|
+
console.warn(`direnv: repaired corrupted PATH (was ${JSON.stringify(current)})`)
|
|
136
|
+
return fallback
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Resolve direnv once; prefers absolute locations, falls back to PATH. */
|
|
140
|
+
let direnvPath: string | null | undefined
|
|
141
|
+
const findDirenv = async (): Promise<string | null> => {
|
|
142
|
+
if (direnvPath !== undefined) return direnvPath
|
|
143
|
+
for (const candidate of direnvCandidates()) {
|
|
144
|
+
try {
|
|
145
|
+
await run(candidate, ["version"], { encoding: "utf8" })
|
|
146
|
+
direnvPath = candidate
|
|
147
|
+
return direnvPath
|
|
148
|
+
} catch {
|
|
149
|
+
// try next candidate
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
direnvPath = null
|
|
153
|
+
return direnvPath
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Strip poison and repair PATH. Runs before every direnv invocation so a
|
|
158
|
+
* daemon that gets corrupted mid-flight heals itself on the next reload.
|
|
159
|
+
* Returns true if anything was repaired.
|
|
160
|
+
*/
|
|
161
|
+
const sanitize = (): boolean => {
|
|
162
|
+
const stripped = stripPoison()
|
|
163
|
+
if (stripped.length > 0) {
|
|
164
|
+
console.warn(`direnv: stripped poison vars from process.env: ${stripped.join(", ")}`)
|
|
165
|
+
}
|
|
166
|
+
const before = process.env.PATH
|
|
167
|
+
repairPath()
|
|
168
|
+
return stripped.length > 0 || process.env.PATH !== before
|
|
169
|
+
}
|
|
170
|
+
|
|
59
171
|
const runText = async (file: string, args: string[], cwd: string) => {
|
|
60
172
|
const { stdout } = await run(file, args, {
|
|
61
173
|
cwd,
|
|
@@ -148,7 +260,7 @@ export default Plugin.define({
|
|
|
148
260
|
if (envrcPath) {
|
|
149
261
|
envrcDir = dirname(envrcPath)
|
|
150
262
|
}
|
|
151
|
-
discovered =
|
|
263
|
+
discovered = envrcPath !== null
|
|
152
264
|
return envrcDir
|
|
153
265
|
}
|
|
154
266
|
|
|
@@ -174,15 +286,25 @@ export default Plugin.define({
|
|
|
174
286
|
reloading = true
|
|
175
287
|
|
|
176
288
|
try {
|
|
289
|
+
// Self-heal before touching direnv: a corrupted PATH would make the
|
|
290
|
+
// direnv lookup below fail with ENOENT forever.
|
|
291
|
+
sanitize()
|
|
292
|
+
|
|
177
293
|
const dir = await resolveEnvrcDir()
|
|
178
294
|
if (!dir) {
|
|
179
295
|
outcome.unavailable = true
|
|
180
296
|
return outcome
|
|
181
297
|
}
|
|
182
298
|
|
|
299
|
+
const direnv = await findDirenv()
|
|
300
|
+
if (!direnv) {
|
|
301
|
+
outcome.unavailable = true
|
|
302
|
+
return outcome
|
|
303
|
+
}
|
|
304
|
+
|
|
183
305
|
let jsonText: string
|
|
184
306
|
try {
|
|
185
|
-
jsonText = await runText(
|
|
307
|
+
jsonText = await runText(direnv, ["export", "json"], dir)
|
|
186
308
|
} catch (error: unknown) {
|
|
187
309
|
const stderr =
|
|
188
310
|
error && typeof error === "object" && "stderr" in error
|
|
@@ -211,9 +333,13 @@ export default Plugin.define({
|
|
|
211
333
|
}
|
|
212
334
|
|
|
213
335
|
// 2. Apply current vars, counting additions and value changes.
|
|
336
|
+
// Skip invalid names (e.g. a phantom `export PATH` entry) and
|
|
337
|
+
// script-valued vars (e.g. nix's `shellHook`) — they corrupt
|
|
338
|
+
// subprocess environments instead of configuring them.
|
|
214
339
|
const nextApplied = new Set<string>()
|
|
215
340
|
for (const [key, value] of Object.entries(newVars)) {
|
|
216
341
|
if (value == null) continue
|
|
342
|
+
if (!VALID_NAME.test(key) || SCRIPT_VARS.has(key)) continue
|
|
217
343
|
const current = process.env[key]
|
|
218
344
|
if (current === undefined) outcome.added++
|
|
219
345
|
else if (current !== value) outcome.changed++
|