Skip to content

Commit 7c648a9

Browse files
fix(cli): remove orphaned resolveOpencodeConfigDir re-export (base-red #9985) (#10396)
`check:dead-code` reports 410 dead symbols against a 409 baseline on the pristine `release/v3.8.50` tip, so every PR on the branch is born red on that gate (#10386, #10393, #10390, #10388, #10382 all fail it). Isolated the +1 by diffing knip 6.32 reports between the rebaseline commit 97aac6a (409) and the tip (410): `resolveOpencodeConfigDir` in `src/shared/services/cliRuntime.ts`. #10246 moved the canonical resolvers into `opencodeConfigPath.ts` and left this wrapper behind; the same commit removed its last consumer. The wrapper was not just unused, it was divergent: it returned `path.dirname()` of the canonical value — `~/.config` rather than `~/.config/opencode` — so any future caller reaching for it by name would have written the OpenCode config one directory too high. Removed the wrapper and its now-unused import. A new test pins the canonical resolver's contract and asserts the divergent re-export stays gone; the guard was mutation-validated (re-adding the wrapper fails it). check:dead-code: 409 = baseline, PASS. cliRuntime/opencode suites: 51 pass, 0 fail. New guard: 3 pass, 0 fail. lint / typecheck:core / file-size / complexity-ratchets / test-discovery: green. Co-authored-by: Xiangzhe <bakryun0718@proton.me>
1 parent 562c502 commit 7c648a9

3 files changed

Lines changed: 59 additions & 17 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- fix(cli): drop the orphaned `resolveOpencodeConfigDir` re-export from `cliRuntime` — it lost its last consumer in #10246 and diverged from the canonical resolver by one directory level (#9985)

src/shared/services/cliRuntime.ts

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ import { withSettingsFallback } from "./cliInstallFallback";
99
import { GROK_BUILD_RUNTIME_ENTRY, AMP_RUNTIME_ENTRY } from "./cliRuntimeGrokBuild";
1010
import { isLocationTrusted, findKnownPathMatch } from "./cliRuntimeKnownPath";
1111
import { buildHealthcheckPath } from "./cliRuntimeHealthcheckPath";
12-
import {
13-
resolveOpencodeConfigDir as resolveOpenCodeConfigDir,
14-
resolveOpencodeConfigPath as resolveOpenCodeConfigPath,
15-
} from "./opencodeConfigPath";
12+
import { resolveOpencodeConfigPath as resolveOpenCodeConfigPath } from "./opencodeConfigPath";
1613
const VALID_RUNTIME_MODES = new Set(["auto", "host", "container"]);
1714
const FALSE_VALUES = new Set(["0", "false", "no", "off"]);
1815

@@ -973,19 +970,6 @@ export const getCliConfigHome = () => {
973970
return normalized;
974971
};
975972

976-
export const resolveOpencodeConfigDir = (
977-
_platform = process.platform,
978-
env: NodeJS.ProcessEnv = process.env,
979-
homeDir = os.homedir()
980-
) => {
981-
// #3330: OpenCode reads its config from XDG `~/.config/opencode/` on ALL
982-
// platforms — including Windows, where it uses `%USERPROFILE%\.config`, NOT
983-
// `%APPDATA%`. Writing to %APPDATA% on Windows put the file where OpenCode
984-
// never looks, so dashboard-saved config silently had no effect. `_platform`
985-
// is kept in the signature for call-site/test compatibility.
986-
return path.dirname(resolveOpenCodeConfigDir(env, homeDir));
987-
};
988-
989973
export const resolveOpencodeConfigPath = (
990974
_platform = process.platform,
991975
env: NodeJS.ProcessEnv = process.env,
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Regression guard for the #10246 follow-up: `resolveOpencodeConfigDir` has exactly ONE
2+
// implementation, in `src/shared/services/opencodeConfigPath.ts`.
3+
//
4+
// #10246 moved the canonical resolvers into `opencodeConfigPath.ts` and left a thin wrapper
5+
// `resolveOpencodeConfigDir` behind in `cliRuntime.ts`. That wrapper lost its last consumer in
6+
// the same commit and became a dead export — which is what pushed the `check:dead-code` ratchet
7+
// to 410 (baseline 409) and made every PR on `release/v3.8.50` born red on that gate.
8+
//
9+
// Worse than the ratchet: the wrapper returned `path.dirname()` of the canonical value, i.e.
10+
// `~/.config` instead of `~/.config/opencode`. Two same-named exports with DIFFERENT return
11+
// values is a live foot-gun — a future caller importing from `cliRuntime` instead of
12+
// `opencodeConfigPath` would silently write the OpenCode config one directory too high.
13+
//
14+
// This test pins both halves: the canonical resolver's contract, and the absence of the
15+
// divergent re-export.
16+
17+
import test from "node:test";
18+
import assert from "node:assert/strict";
19+
import path from "node:path";
20+
21+
import { resolveOpencodeConfigDir } from "@/shared/services/opencodeConfigPath";
22+
import * as cliRuntime from "@/shared/services/cliRuntime";
23+
24+
test("#10246 canonical resolveOpencodeConfigDir returns the XDG opencode directory", () => {
25+
assert.equal(
26+
resolveOpencodeConfigDir({ XDG_CONFIG_HOME: "/xdg" }, "/home/u"),
27+
path.join("/xdg", "opencode")
28+
);
29+
// No XDG_CONFIG_HOME → `<home>/.config/opencode` on every platform (#3330: OpenCode reads
30+
// XDG even on Windows, where it uses %USERPROFILE%\.config and never %APPDATA%).
31+
assert.equal(
32+
resolveOpencodeConfigDir({}, "/home/u"),
33+
path.join("/home/u", ".config", "opencode")
34+
);
35+
// A blank/whitespace XDG_CONFIG_HOME must fall back, not produce a relative path.
36+
assert.equal(
37+
resolveOpencodeConfigDir({ XDG_CONFIG_HOME: " " }, "/home/u"),
38+
path.join("/home/u", ".config", "opencode")
39+
);
40+
});
41+
42+
test("#10246 cliRuntime does NOT re-export a divergent resolveOpencodeConfigDir", () => {
43+
assert.equal(
44+
(cliRuntime as Record<string, unknown>).resolveOpencodeConfigDir,
45+
undefined,
46+
"cliRuntime must not re-export resolveOpencodeConfigDir — the wrapper returned the PARENT " +
47+
"directory (path.dirname of the canonical value), so importing it by name would write the " +
48+
"OpenCode config one level too high. Import it from opencodeConfigPath instead."
49+
);
50+
});
51+
52+
test("#10246 cliRuntime still exposes the config PATH helpers it owns", () => {
53+
// The path helpers legitimately stay on cliRuntime (they have live consumers) — this guard
54+
// must not be read as "cliRuntime should stop exporting OpenCode helpers entirely".
55+
assert.equal(typeof cliRuntime.resolveOpencodeConfigPath, "function");
56+
assert.equal(typeof cliRuntime.getOpenCodeConfigPath, "function");
57+
});

0 commit comments

Comments
 (0)