update config setup

This commit is contained in:
Stanislav Ponomarev
2026-09-10 14:16:03 +02:00
parent 3fae7e084e
commit fb3ad11f3a
3 changed files with 97 additions and 13 deletions
+60 -4
View File
@@ -18,6 +18,7 @@ import { fileURLToPath } from "node:url";
const installer = fileURLToPath(new URL("../install.sh", import.meta.url));
const directories: string[] = [];
const configContents = '{\n // Keep user settings and comments.\n "theme": "dark"\n}\n';
const jsonConfig = { permissions: { shell: "ask" }, plugins: [{ package: "existing-plugin" }] };
const previousPlugin = 'export default { id: "previous", setup() { return "preserved"; } };\n';
const previousTarget = "../stanp-opencode/install.previous";
@@ -43,7 +44,7 @@ async function run(command: string[], cwd: string, env: NodeJS.ProcessEnv) {
return { exitCode, stdout, stderr };
}
async function install(mode: "native" | "checksum" | "legacy") {
async function install(mode: "native" | "checksum" | "legacy", configured = false) {
const directory = await mkdtemp(join(tmpdir(), "stanp-install-"));
directories.push(directory);
const config =
@@ -60,6 +61,27 @@ async function install(mode: "native" | "checksum" | "legacy") {
]);
await Promise.all([
writeFile(join(config, "opencode.jsonc"), configContents),
writeFile(
join(config, "opencode.json"),
JSON.stringify(
configured
? {
...jsonConfig,
plugins: [
...jsonConfig.plugins,
{
package: "./plugins/stanp-opencode",
options: {
mode: "gpt",
provider: "existing-provider",
lunaPriority: false,
},
},
],
}
: jsonConfig,
),
),
symlink(previousTarget, join(config, "plugins", "stanp-opencode")),
writeFile(join(config, "stanp-opencode", "install.previous", "index.js"), previousPlugin),
writeFile(
@@ -165,7 +187,7 @@ exec sha256sum "$@"
return { directory, config, env, result };
}
test("installs an importable native plugin under XDG without changing user configuration or running scripts", async () => {
test("installs an importable native plugin and default config under XDG without running scripts", async () => {
const { directory, config, env, result } = await install("native");
expect(result, result.stderr).toMatchObject({ exitCode: 0 });
// The generated package path is only known at runtime; exercise its module-loading boundary.
@@ -174,7 +196,7 @@ test("installs an importable native plugin under XDG without changing user confi
process.execPath,
"-e",
"const { default: plugin } = await import(process.argv[1]); console.log(JSON.stringify([plugin.id, plugin.setup()]));",
join(config, "plugins", "stanp-opencode.js"),
join(config, "plugins", "stanp-opencode"),
],
directory,
env,
@@ -184,19 +206,53 @@ test("installs an importable native plugin under XDG without changing user confi
stdout: '["stanp-opencode","native-ready"]\n',
});
expect(await readFile(join(config, "opencode.jsonc"), "utf8")).toBe(configContents);
expect(await Bun.file(join(config, "plugins", "stanp-opencode")).exists()).toBe(false);
expect(JSON.parse(await readFile(join(config, "opencode.json"), "utf8"))).toEqual({
$schema: "https://opencode.ai/config.json",
plugins: [
{ package: "existing-plugin" },
{
package: "./plugins/stanp-opencode",
options: { mode: "gpt", provider: "openai", lunaPriority: true },
},
],
permissions: { shell: "ask" },
});
expect(await Bun.file(join(config, "plugins", "stanp-opencode", "package.json")).exists()).toBe(
true,
);
expect(
await readFile(join(config, "stanp-opencode", "install.previous", "index.js"), "utf8"),
).toBe(previousPlugin);
expect(await Bun.file(env.POSTINSTALL_MARKER).exists()).toBe(false);
}, 60_000);
test("preserves an existing stanp-opencode configuration", async () => {
const { config, result } = await install("native", true);
expect(result, result.stderr).toMatchObject({ exitCode: 0 });
const installed = JSON.parse(await readFile(join(config, "opencode.json"), "utf8"));
expect(installed.plugins).toEqual([
{ package: "existing-plugin" },
{
package: "./plugins/stanp-opencode",
options: {
mode: "gpt",
provider: "existing-provider",
lunaPriority: false,
},
},
]);
expect(installed.permissions).toEqual(jsonConfig.permissions);
}, 60_000);
for (const mode of ["checksum", "legacy"] as const) {
test(`${mode} failure preserves the installed plugin in a custom path containing spaces`, async () => {
const { directory, config, env, result } = await install(mode);
expect(result.exitCode, result.stderr).not.toBe(0);
expect(await readlink(join(config, "plugins", "stanp-opencode"))).toBe(previousTarget);
expect(await readFile(join(config, "opencode.jsonc"), "utf8")).toBe(configContents);
expect(JSON.parse(await readFile(join(config, "opencode.json"), "utf8"))).toEqual(
jsonConfig,
);
expect(
await readFile(join(config, "stanp-opencode", "install.previous", "index.js"), "utf8"),
).toBe(previousPlugin);