Skip to content

Commit 271a3cf

Browse files
committed
fix(claude): detect plugin redirects in managed drop-ins
Made with GPT-6.1 Sol via Codex in T3 Code.
1 parent 5b1190e commit 271a3cf

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

‎apps/server/src/provider/ClaudeCapabilitiesProbe.test.ts‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ClaudeSettings, type ServerProvider } from "@t3tools/contracts";
44
import { vi } from "vite-plus/test";
55
import { assert, it } from "@effect/vitest";
66
import * as Effect from "effect/Effect";
7+
import * as HostProcess from "@t3tools/shared/HostProcess";
78
import * as FileSystem from "effect/FileSystem";
89
import * as Path from "effect/Path";
910
import * as Schema from "effect/Schema";
@@ -228,6 +229,27 @@ it.effect("always starts the CLI when its sources cannot be vouched for", () =>
228229
yield* write(settingsPath, "{}");
229230
}
230231

232+
yield* Effect.gen(function* () {
233+
const managedCommands = yield* makeCommands({ PROGRAMDATA: root });
234+
const dropIn = path.join(root, "ClaudeCode", "managed-settings.d", "plugins.json");
235+
yield* write(dropIn, "{}");
236+
const beforeManaged = probes();
237+
yield* managedCommands.get(machine, cwd);
238+
yield* managedCommands.get(machine, cwd);
239+
assert.strictEqual(probes(), beforeManaged + 1);
240+
241+
yield* write(
242+
dropIn,
243+
JSON.stringify({ env: { CLAUDE_CODE_PLUGIN_CACHE_DIR: redirectedPlugins } }),
244+
);
245+
yield* probesTwice(managedCommands);
246+
const beforeManagedEdit = probes();
247+
yield* write(redirectedCommand, "edited command under managed redirect");
248+
yield* managedCommands.get(machine, cwd);
249+
assert.strictEqual(probes(), beforeManagedEdit + 1);
250+
yield* write(dropIn, "{}");
251+
}).pipe(Effect.provideService(HostProcess.Platform, "win32"));
252+
231253
const installed = path.join(config, "plugins", "installed_plugins.json");
232254
yield* write(
233255
installed,

‎apps/server/src/provider/Drivers/ClaudeSkills.ts‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,16 @@ export const fingerprintClaudeCommandSources = Effect.fn("fingerprintClaudeComma
766766

767767
for (const directory of claudeManagedDirectories(path, platform, environment)) {
768768
yield* addSettings(path.join(directory, "managed-settings.json"));
769-
yield* addStat(path.join(directory, "managed-settings.d"));
769+
const managedSettingsDirectory = path.join(directory, "managed-settings.d");
770+
yield* addStat(managedSettingsDirectory);
771+
const managedSettingsFiles = yield* fileSystem
772+
.readDirectory(managedSettingsDirectory)
773+
.pipe(Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed([])));
774+
for (const file of managedSettingsFiles
775+
.filter((file) => file.endsWith(".json") && !file.startsWith("."))
776+
.sort()) {
777+
yield* addSettings(path.join(managedSettingsDirectory, file));
778+
}
770779
for (const subdirectory of CLAUDE_COMMAND_SUBDIRECTORIES) {
771780
yield* addStat(path.join(directory, ".claude", subdirectory));
772781
}

0 commit comments

Comments
 (0)