oh-my-codex 0.21.37 → 0.21.39
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/Cargo.lock +6 -6
- package/Cargo.toml +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +53 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +2 -2
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +55 -4
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/session-search-help.test.js +2 -2
- package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +122 -0
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +2 -2
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +17 -12
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/__tests__/models.test.js +2 -1
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +25 -4
- package/dist/config/generator.js.map +1 -1
- package/dist/config/models.d.ts +1 -1
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +1 -1
- package/dist/config/models.js.map +1 -1
- package/dist/scripts/__tests__/run-test-files.test.js +192 -2
- package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
- package/dist/scripts/run-test-files.js +33 -14
- package/dist/scripts/run-test-files.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +32 -4
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/state-root.test.js +5 -5
- package/dist/team/__tests__/state-root.test.js.map +1 -1
- package/dist/vscode/__tests__/index.test.js +82 -20
- package/dist/vscode/__tests__/index.test.js.map +1 -1
- package/dist/vscode/index.d.ts +2 -0
- package/dist/vscode/index.d.ts.map +1 -1
- package/dist/vscode/index.js +3 -3
- package/dist/vscode/index.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/src/scripts/__tests__/run-test-files.test.ts +193 -2
- package/src/scripts/run-test-files.ts +31 -14
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { chmod, mkdir, mkdtemp, readFile, realpath, rm, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
5
|
import { tmpdir } from 'node:os';
|
|
6
6
|
import { spawnSync } from 'node:child_process';
|
|
@@ -64,7 +64,7 @@ describe('omx session help', () => {
|
|
|
64
64
|
}
|
|
65
65
|
});
|
|
66
66
|
it('recovers a verified-dead pointer with deterministic JSON and human output', async () => {
|
|
67
|
-
const cwd = await mkdtemp(join(tmpdir(), 'omx-session-pointer-cli-'));
|
|
67
|
+
const cwd = await realpath(await mkdtemp(join(tmpdir(), 'omx-session-pointer-cli-')));
|
|
68
68
|
try {
|
|
69
69
|
const stateRoot = join(cwd, '.omx', 'state');
|
|
70
70
|
const pointerPath = join(stateRoot, 'session.json');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-search-help.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/session-search-help.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-search-help.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/session-search-help.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5317,4 +5317,126 @@ describe("persisted merge policy lifecycle", () => {
|
|
|
5317
5317
|
}
|
|
5318
5318
|
});
|
|
5319
5319
|
});
|
|
5320
|
+
describe("issue 3918 plugin hook trust self-heal", () => {
|
|
5321
|
+
it("repairs stale and removes obsolete OMX plugin hook trust entries after cache rebuild", async () => {
|
|
5322
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-setup-plugin-hook-trust-3918-"));
|
|
5323
|
+
try {
|
|
5324
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
5325
|
+
await withTempCwd(wd, async () => {
|
|
5326
|
+
await setup({ scope: "user", installMode: "plugin" });
|
|
5327
|
+
const configPath = join(codexHomeDir, "config.toml");
|
|
5328
|
+
const packagedMarketplace = await resolvePackagedOmxMarketplace(packageRoot);
|
|
5329
|
+
assert.ok(packagedMarketplace);
|
|
5330
|
+
const cache = await materializePackagedOmxPluginCache(codexHomeDir, packagedMarketplace);
|
|
5331
|
+
assert.ok(cache.cacheDir);
|
|
5332
|
+
const pluginHooksPath = join(cache.cacheDir, "hooks", "hooks.json");
|
|
5333
|
+
const initialPluginHooks = await readFile(pluginHooksPath, "utf-8");
|
|
5334
|
+
const staleKey = "oh-my-codex@oh-my-codex-local:hooks/hooks.json:post_compact:0:0";
|
|
5335
|
+
const obsoleteKey = "oh-my-codex@oh-my-codex-local:hooks/hooks.json:removed_event:0:0";
|
|
5336
|
+
const previousTrustedHash = `sha256:${createHash("sha256").update(initialPluginHooks).digest("hex")}`;
|
|
5337
|
+
await writeFile(configPath, [
|
|
5338
|
+
(await readFile(configPath, "utf-8")).trimEnd(),
|
|
5339
|
+
"",
|
|
5340
|
+
"# OMX-owned Codex hook trust state",
|
|
5341
|
+
`[hooks.state.${JSON.stringify(staleKey)}]`,
|
|
5342
|
+
`trusted_hash = ${JSON.stringify(previousTrustedHash)}`,
|
|
5343
|
+
"# End OMX-owned Codex hook trust state",
|
|
5344
|
+
"",
|
|
5345
|
+
`[hooks.state.${JSON.stringify(obsoleteKey)}]`,
|
|
5346
|
+
`trusted_hash = ${JSON.stringify(previousTrustedHash)}`,
|
|
5347
|
+
"",
|
|
5348
|
+
].join("\n"));
|
|
5349
|
+
const mutatedHooks = JSON.parse(initialPluginHooks);
|
|
5350
|
+
mutatedHooks.hooks.PostCompact[0].hooks[0].command += " --cache-rebuild-probe";
|
|
5351
|
+
await writeFile(pluginHooksPath, `${JSON.stringify(mutatedHooks, null, 2)}\n`);
|
|
5352
|
+
await setup({
|
|
5353
|
+
scope: "user",
|
|
5354
|
+
installMode: "plugin",
|
|
5355
|
+
repairPluginCache: true,
|
|
5356
|
+
pluginAgentsMdPrompt: async () => false,
|
|
5357
|
+
});
|
|
5358
|
+
const repairedConfig = await readFile(configPath, "utf-8");
|
|
5359
|
+
assert.doesNotMatch(repairedConfig, /oh-my-codex@oh-my-codex-local:hooks\/hooks\.json:/);
|
|
5360
|
+
assert.equal(await readFile(pluginHooksPath, "utf-8"), initialPluginHooks);
|
|
5361
|
+
});
|
|
5362
|
+
});
|
|
5363
|
+
}
|
|
5364
|
+
finally {
|
|
5365
|
+
await rm(wd, { recursive: true, force: true });
|
|
5366
|
+
}
|
|
5367
|
+
});
|
|
5368
|
+
it("keeps third-party and noncanonical plugin hook trust fail-closed", async () => {
|
|
5369
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-setup-foreign-plugin-hook-trust-3918-"));
|
|
5370
|
+
try {
|
|
5371
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
5372
|
+
await withTempCwd(wd, async () => {
|
|
5373
|
+
await setup({ scope: "user", installMode: "plugin" });
|
|
5374
|
+
const configPath = join(codexHomeDir, "config.toml");
|
|
5375
|
+
const config = [
|
|
5376
|
+
(await readFile(configPath, "utf-8")).trimEnd(),
|
|
5377
|
+
"",
|
|
5378
|
+
"# OMX-owned Codex hook trust state",
|
|
5379
|
+
'[hooks.state."third-party@marketplace:hooks/hooks.json:post_compact:0:0"]',
|
|
5380
|
+
'trusted_hash = "sha256:third-party"',
|
|
5381
|
+
"# End OMX-owned Codex hook trust state",
|
|
5382
|
+
"",
|
|
5383
|
+
].join("\n");
|
|
5384
|
+
await writeFile(configPath, config);
|
|
5385
|
+
await assert.rejects(setup({ scope: "user", installMode: "plugin" }), (error) => typeof error === "object" &&
|
|
5386
|
+
error !== null &&
|
|
5387
|
+
"code" in error &&
|
|
5388
|
+
error.code === "managed_trust_key_conflict");
|
|
5389
|
+
assert.equal(await readFile(configPath, "utf-8"), config);
|
|
5390
|
+
const malformedOmxConfig = (await readFile(configPath, "utf-8")).replace('[hooks.state."third-party@marketplace:hooks/hooks.json:post_compact:0:0"]\ntrusted_hash = "sha256:third-party"', [
|
|
5391
|
+
'[hooks.state."oh-my-codex@oh-my-codex-local:hooks/hooks.json:post_compact:0:0"]',
|
|
5392
|
+
`trusted_hash = ${JSON.stringify(`sha256:${"2".repeat(64)}`)}`,
|
|
5393
|
+
"enabled = false",
|
|
5394
|
+
].join("\n"));
|
|
5395
|
+
assert.doesNotMatch(malformedOmxConfig, /third-party@marketplace/);
|
|
5396
|
+
assert.match(malformedOmxConfig, /enabled = false/);
|
|
5397
|
+
await writeFile(configPath, malformedOmxConfig);
|
|
5398
|
+
await assert.rejects(setup({ scope: "user", installMode: "plugin" }), (error) => typeof error === "object" &&
|
|
5399
|
+
error !== null &&
|
|
5400
|
+
"code" in error &&
|
|
5401
|
+
error.code === "managed_trust_key_conflict");
|
|
5402
|
+
assert.equal(await readFile(configPath, "utf-8"), malformedOmxConfig);
|
|
5403
|
+
});
|
|
5404
|
+
});
|
|
5405
|
+
}
|
|
5406
|
+
finally {
|
|
5407
|
+
await rm(wd, { recursive: true, force: true });
|
|
5408
|
+
}
|
|
5409
|
+
});
|
|
5410
|
+
it("switches between plugin and legacy setup with stale plugin trust present", async () => {
|
|
5411
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-setup-plugin-hook-trust-switch-3918-"));
|
|
5412
|
+
try {
|
|
5413
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
5414
|
+
await withTempCwd(wd, async () => {
|
|
5415
|
+
await setup({ scope: "user", installMode: "plugin" });
|
|
5416
|
+
const configPath = join(codexHomeDir, "config.toml");
|
|
5417
|
+
const key = "oh-my-codex@oh-my-codex-local:hooks/hooks.json:post_compact:0:0";
|
|
5418
|
+
const staleHash = `sha256:${"1".repeat(64)}`;
|
|
5419
|
+
await writeFile(configPath, [
|
|
5420
|
+
(await readFile(configPath, "utf-8")).trimEnd(),
|
|
5421
|
+
"",
|
|
5422
|
+
"# OMX-owned Codex hook trust state",
|
|
5423
|
+
`[hooks.state.${JSON.stringify(key)}]`,
|
|
5424
|
+
`trusted_hash = ${JSON.stringify(staleHash)}`,
|
|
5425
|
+
"# End OMX-owned Codex hook trust state",
|
|
5426
|
+
"",
|
|
5427
|
+
].join("\n"));
|
|
5428
|
+
await setup({ scope: "user", installMode: "legacy" });
|
|
5429
|
+
assert.doesNotMatch(await readFile(configPath, "utf-8"), /oh-my-codex@oh-my-codex-local:hooks\/hooks\.json:/);
|
|
5430
|
+
assert.equal(existsSync(join(codexHomeDir, "hooks.json")), true);
|
|
5431
|
+
await setup({ scope: "user", installMode: "plugin" });
|
|
5432
|
+
assert.doesNotMatch(await readFile(configPath, "utf-8"), /oh-my-codex@oh-my-codex-local:hooks\/hooks\.json:/);
|
|
5433
|
+
assert.equal(existsSync(join(codexHomeDir, "hooks.json")), false);
|
|
5434
|
+
});
|
|
5435
|
+
});
|
|
5436
|
+
}
|
|
5437
|
+
finally {
|
|
5438
|
+
await rm(wd, { recursive: true, force: true });
|
|
5439
|
+
}
|
|
5440
|
+
});
|
|
5441
|
+
});
|
|
5320
5442
|
//# sourceMappingURL=setup-install-mode.test.js.map
|